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
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to