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