kqueue(2) vs. cuse4bsd?

Juergen Lock nox at jelal.kn-bremen.de
Fri Jul 19 18:06:18 UTC 2013


On Fri, Jul 19, 2013 at 08:37:22AM +0200, Hans Petter Selasky wrote:
> 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

Hmm this builds on 8.3 but doesn't really work, tvheadend only manages
to scan one mux on startup, and eats too much cpu also:

  PID USERNAME     THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
93912 root          35  52   r8 33756K  7216K ucond   3   1:32 41.89% webcamd
93938 nox           13  70    0 80280K  9460K CPU1    1   0:23 17.29% tvheadend

 For comparison when going back to vdr: (that doesn't use kqueue)

93965 vdr           32  63   19   298M   179M ucond   3   0:02  0.39% vdr
93769 root          28  52   r8 31840K  8284K ucond   2   0:02  0.39% webcamd

 Thanx! :)
	Juergen

> 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,6 +646,10 @@
>  
>  	cuse_server_free_memory(pcs);
>  
> +	seldrain(&pcs->selinfo);
> +
> +	knlist_destroy(&pcs->selinfo.si_note);
> +
>  	cuse_unlock();
>  
>  	cv_destroy(&pcs->cv);
> @@ -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,38 @@
>  
>  	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);
> +
> +	cuse_lock();
> +	kn->kn_hook = pcc->server;
> +	kn->kn_fop = &cuse_client_kqfilter_ops;
> +	knlist_add(&pcc->server->selinfo.si_note, kn, 0);
> +	cuse_unlock();
> +	return (0);
> +}



More information about the freebsd-multimedia mailing list