Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Jul 2013 08:37:22 +0200
From:      Hans Petter Selasky <hps@bitfrost.no>
To:        =?ISO-8859-1?Q?Bernhard_Fr=F6hlich?= <decke@bluelife.at>,  freebsd-multimedia@freebsd.org, Juergen Lock <nox@jelal.kn-bremen.de>
Subject:   Re: kqueue(2) vs. cuse4bsd?
Message-ID:  <51E8DEA2.4020506@bitfrost.no>
In-Reply-To: <20130719051247.GF26412@funkthat.com>
References:  <201307181834.r6IIY35e055755@triton8.kn-bremen.de> <51E844C9.4060106@bitfrost.no> <CAE-m3X2_QdQPf6_0mF8cn3fdmMvmagBdXhq6SCqWON3NF8NANQ@mail.gmail.com> <51E85CFC.3060305@bitfrost.no> <20130719051247.GF26412@funkthat.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------030801080702000107040305
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

On 07/19/13 07:12, John-Mark Gurney wrote:
> Hans Petter Selasky wrote this message on Thu, Jul 18, 2013 at 23:24 +0200:
>> Hi,
>>

>
> Again, the 0 arg to knlist_add says that the cuse_mtx lock has already
> been locked..  either change the arg to 1, or drop the _lock/_unlock()...
>

New patch attached! Thank you!

--HPS

--------------030801080702000107040305
Content-Type: text/x-patch;
 name="kqfilter2.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="kqfilter2.diff"

Index: cuse4bsd_kmod.c
===================================================================
--- cuse4bsd_kmod.c	(revision 2614)
+++ cuse4bsd_kmod.c	(working copy)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2010-2012 Hans Petter Selasky. All rights reserved.
+ * Copyright (c) 2010-2013 Hans Petter Selasky. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -134,6 +134,15 @@
 static int cuse_alloc_unit_id[CUSE_DEVICES_MAX];
 static struct cuse_memory cuse_mem[CUSE_ALLOC_UNIT_MAX];
 
+static void cuse_client_kqfilter_detach(struct knote *kn);
+static int cuse_client_kqfilter_event(struct knote *kn, long hint);
+
+static struct filterops cuse_client_kqfilter_ops = {
+	.f_isfd = 1,
+	.f_detach = cuse_client_kqfilter_detach,
+	.f_event = cuse_client_kqfilter_event,
+};
+
 static d_open_t cuse_client_open;
 static d_close_t cuse_client_close;
 static d_ioctl_t cuse_client_ioctl;
@@ -141,6 +150,7 @@
 static d_write_t cuse_client_write;
 static d_poll_t cuse_client_poll;
 static d_mmap_t cuse_client_mmap;
+static d_kqfilter_t cuse_client_kqfilter;
 
 static struct cdevsw cuse_client_devsw = {
 	.d_version = D_VERSION,
@@ -153,6 +163,7 @@
 	.d_write = cuse_client_write,
 	.d_poll = cuse_client_poll,
 	.d_mmap = cuse_client_mmap,
+	.d_kqfilter = cuse_client_kqfilter,
 };
 
 static d_open_t cuse_server_open;
@@ -635,8 +646,12 @@
 
 	cuse_server_free_memory(pcs);
 
+	knlist_destroy(&pcs->selinfo.si_note);
+
 	cuse_unlock();
 
+	seldrain(&pcs->selinfo);
+
 	cv_destroy(&pcs->cv);
 
 	free(pcs, M_CUSE4BSD);
@@ -662,6 +677,8 @@
 
 	cv_init(&pcs->cv, "cuse-server-cv");
 
+	knlist_init_mtx(&pcs->selinfo.si_note, &cuse_mtx);
+
 	cuse_lock();
 	pcs->refs++;
 	TAILQ_INSERT_TAIL(&cuse_server_head, pcs, entry);
@@ -1698,3 +1715,46 @@
 
 	return (0);
 }
+
+static void
+cuse_client_kqfilter_detach(struct knote *kn)
+{
+	struct cuse_server *pcs;
+
+	cuse_lock();
+	pcs = kn->kn_hook;
+	knlist_remove(&pcs->selinfo.si_note, kn, 0);
+	cuse_unlock();
+}
+
+static int
+cuse_client_kqfilter_event(struct knote *kn, long hint)
+{
+	return (1);
+}
+
+static int
+cuse_client_kqfilter(struct cdev *dev, struct knote *kn)
+{
+	struct cuse_client *pcc;
+	int error;
+
+	error = cuse_client_get(&pcc);
+	if (error != 0)
+		return (error);
+
+	switch (kn->kn_filter) {
+	case EVFILT_READ:
+	case EVFILT_WRITE:
+		break;
+	default:
+		return (EINVAL);
+	}
+
+	cuse_lock();
+	kn->kn_hook = pcc->server;
+	kn->kn_fop = &cuse_client_kqfilter_ops;
+	knlist_add(&pcc->server->selinfo.si_note, kn, 1);
+	cuse_unlock();
+	return (0);
+}

--------------030801080702000107040305--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?51E8DEA2.4020506>