From owner-freebsd-multimedia@FreeBSD.ORG Fri Jul 19 06:35:51 2013 Return-Path: Delivered-To: freebsd-multimedia@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id C5F6D483 for ; Fri, 19 Jul 2013 06:35:51 +0000 (UTC) (envelope-from hps@bitfrost.no) Received: from mta.bitpro.no (mta.bitpro.no [92.42.64.202]) by mx1.freebsd.org (Postfix) with ESMTP id 51CF72C0 for ; Fri, 19 Jul 2013 06:35:50 +0000 (UTC) Received: from mail.lockless.no (mail.lockless.no [46.29.221.38]) by mta.bitpro.no (Postfix) with ESMTP id BB8897A1AD; Fri, 19 Jul 2013 08:35:48 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail.lockless.no (Postfix) with ESMTP id 80DF18EF2A9; Fri, 19 Jul 2013 08:35:51 +0200 (CEST) X-Virus-Scanned: by amavisd-new-2.6.4 (20090625) (Debian) at lockless.no Received: from mail.lockless.no ([127.0.0.1]) by localhost (mail.lockless.no [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id mriBB-YVghFo; Fri, 19 Jul 2013 08:35:50 +0200 (CEST) Received: from laptop015.hselasky.homeunix.org (cm-176.74.213.204.customer.telag.net [176.74.213.204]) by mail.lockless.no (Postfix) with ESMTPSA id 9FEFD8EF2A8; Fri, 19 Jul 2013 08:35:50 +0200 (CEST) Message-ID: <51E8DEA2.4020506@bitfrost.no> Date: Fri, 19 Jul 2013 08:37:22 +0200 From: Hans Petter Selasky Organization: Bitfrost A/S User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:17.0) Gecko/20130522 Thunderbird/17.0.6 MIME-Version: 1.0 To: =?ISO-8859-1?Q?Bernhard_Fr=F6hlich?= , freebsd-multimedia@freebsd.org, Juergen Lock Subject: Re: kqueue(2) vs. cuse4bsd? References: <201307181834.r6IIY35e055755@triton8.kn-bremen.de> <51E844C9.4060106@bitfrost.no> <51E85CFC.3060305@bitfrost.no> <20130719051247.GF26412@funkthat.com> In-Reply-To: <20130719051247.GF26412@funkthat.com> Content-Type: multipart/mixed; boundary="------------030801080702000107040305" X-BeenThere: freebsd-multimedia@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Multimedia discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Jul 2013 06:35:51 -0000 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--