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>
