diff options
author | melifaro <melifaro@FreeBSD.org> | 2012-04-06 06:53:58 +0000 |
---|---|---|
committer | melifaro <melifaro@FreeBSD.org> | 2012-04-06 06:53:58 +0000 |
commit | 8b1d10268c8ffd28f6c4b0da1e3906b139fc94cf (patch) | |
tree | ead0d5369047c56ec667d8a937da41d4682a0ed6 /sys/net/bpf_buffer.c | |
parent | b6974119420223f65336e5d64d2782bff6a82731 (diff) | |
download | FreeBSD-src-8b1d10268c8ffd28f6c4b0da1e3906b139fc94cf.zip FreeBSD-src-8b1d10268c8ffd28f6c4b0da1e3906b139fc94cf.tar.gz |
- Improve BPF locking model.
Interface locks and descriptor locks are converted from mutex(9) to rwlock(9).
This greately improves performance: in most common case we need to acquire 1
reader lock instead of 2 mutexes.
- Remove filter(descriptor) (reader) lock in bpf_mtap[2]
This was suggested by glebius@. We protect filter by requesting interface
writer lock on filter change.
- Cover struct bpf_if under BPF_INTERNAL define. This permits including bpf.h
without including rwlock stuff. However, this is is temporary solution,
struct bpf_if should be made opaque for any external caller.
Found by: Dmitrij Tejblum <tejblum@yandex-team.ru>
Sponsored by: Yandex LLC
Reviewed by: glebius (previous version)
Reviewed by: silence on -net@
Approved by: (mentor)
MFC after: 3 weeks
Diffstat (limited to 'sys/net/bpf_buffer.c')
-rw-r--r-- | sys/net/bpf_buffer.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/net/bpf_buffer.c b/sys/net/bpf_buffer.c index d338fca..869e70b 100644 --- a/sys/net/bpf_buffer.c +++ b/sys/net/bpf_buffer.c @@ -184,9 +184,9 @@ bpf_buffer_ioctl_sblen(struct bpf_d *d, u_int *i) { u_int size; - BPFD_LOCK(d); + BPFD_WLOCK(d); if (d->bd_bif != NULL) { - BPFD_UNLOCK(d); + BPFD_WUNLOCK(d); return (EINVAL); } size = *i; @@ -195,7 +195,7 @@ bpf_buffer_ioctl_sblen(struct bpf_d *d, u_int *i) else if (size < BPF_MINBUFSIZE) *i = size = BPF_MINBUFSIZE; d->bd_bufsize = size; - BPFD_UNLOCK(d); + BPFD_WUNLOCK(d); return (0); } |