bpf hold buffer in-use flag

John Baldwin jhb at freebsd.org
Wed Jan 9 21:13:10 UTC 2013


On Tuesday, November 13, 2012 4:40:57 pm Guy Helmer wrote:
> To try to completely resolve the race in bpfread(), I have put together 
these changes to add a flag to indicate when the hold buffer cannot be 
modified because it is in use. Since it's my first time using mtx_sleep() and 
wakeup(), I wanted to run these past the list to see if I can get any feedback 
on the approach.
> 
> 
> Index: bpf.c
> ===================================================================
> --- bpf.c	(revision 242997)
> +++ bpf.c	(working copy)
> @@ -819,6 +819,7 @@ bpfopen(struct cdev *dev, int flags, int fmt, stru
> 	 * particular buffer method.
> 	 */
> 	bpf_buffer_init(d);
> +	d->bd_hbuf_in_use = 0;
> 	d->bd_bufmode = BPF_BUFMODE_BUFFER;
> 	d->bd_sig = SIGIO;
> 	d->bd_direction = BPF_D_INOUT;
> @@ -872,6 +873,9 @@ bpfread(struct cdev *dev, struct uio *uio, int iof
> 		callout_stop(&d->bd_callout);
> 	timed_out = (d->bd_state == BPF_TIMED_OUT);
> 	d->bd_state = BPF_IDLE;
> +	while (d->bd_hbuf_in_use)
> +		mtx_sleep(&d->bd_hbuf_in_use, &d->bd_lock,
> +		    PRINET|PCATCH, "bd_hbuf", 0);

You need to check the return value here, otherwise the PCATCH is useless (you 
will just go back to sleep instead of failing with an error if this is 
interrupted by a signal). 

-- 
John Baldwin


More information about the freebsd-net mailing list