Remove the mtx_sleep() from the kqueue f_event filter.

The filter is called from the network hot path and must not sleep.

The filter runs with the descriptor lock held and does not manipulates the
buffers, so it is not necessary sleep when the hold buffer is in use.

Just ignore the hold buffer contents when it is being copied to user space
(when hold buffer in use is set).

This fix the "Sleeping thread owns a non-sleepable lock" panic when the
userland thread is too busy reading the packets from bpf(4).

PR:		200323
MFC after:	2 weeks
Sponsored by:	Rubicon Communications (Netgate)
This commit is contained in:
Luiz Otavio O Souza 2015-08-03 22:14:45 +00:00
parent fc6ab77011
commit 9224217213

View File

@ -2035,10 +2035,10 @@ filt_bpfread(struct knote *kn, long hint)
ready = bpf_ready(d); ready = bpf_ready(d);
if (ready) { if (ready) {
kn->kn_data = d->bd_slen; kn->kn_data = d->bd_slen;
while (d->bd_hbuf_in_use) /*
mtx_sleep(&d->bd_hbuf_in_use, &d->bd_lock, * Ignore the hold buffer if it is being copied to user space.
PRINET, "bd_hbuf", 0); */
if (d->bd_hbuf) if (!d->bd_hbuf_in_use && d->bd_hbuf)
kn->kn_data += d->bd_hlen; kn->kn_data += d->bd_hlen;
} else if (d->bd_rtout > 0 && d->bd_state == BPF_IDLE) { } else if (d->bd_rtout > 0 && d->bd_state == BPF_IDLE) {
callout_reset(&d->bd_callout, d->bd_rtout, callout_reset(&d->bd_callout, d->bd_rtout,