some kernel hacking tasks
Antonio Huete Jiménez
ahuete.devel at gmail.com
Sat Nov 17 12:48:15 PST 2012
Hi Sephe,
I think I've tackled all the points you mentioned:
http://leaf.dragonflybsd.org/~tuxillo/archive/patches/bpf_token03.diff
I've also found a place where bpf_token might be needed. Not sure either
whether we would need to check all the bpf_tap(), bpf_mtap() and
bpf_ptap() calls to see if they're properly protected.
diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c
index e3f6724..a58d943 100644
--- a/sys/net/if_loop.c
+++ b/sys/net/if_loop.c
@@ -199,7 +199,7 @@ if_simloop(struct ifnet *ifp, struct mbuf *m, int af,
int hlen)
}
if (ifp->if_bpf) {
- get_mplock();
+ lwkt_gettoken(&bpf_token);
/* Re-check */
if (ifp->if_bpf == NULL)
@@ -212,7 +212,7 @@ if_simloop(struct ifnet *ifp, struct mbuf *m, int af,
int hlen)
bpf_mtap(ifp->if_bpf, m);
}
rel:
- rel_mplock();
+ lwkt_reltoken(&bpf_token);
}
/* Strip away media header */
Cheers,
Antonio Huete
> I have looked at the patch. I think there are still something missing:
> - bpf code actually assumes that mplock is held on the device node
> interfaces, so you probably need to protect them w/ the bpf token.
> - bpfattach/bpfdetach should probably be protected by bpf token
> - Macros like BPF_TAP() and ETHER_BPF_MTAP() probably will need the
> check-hold_token-recheck sequence, e.g.:
> if (ifp->if_bpf) {
> bpf_gettoken();
> if (ifp->if_bpf)
> bpf_tap(...);
> bpf_reltoken();
> }
>
> Best Regards,
> sephe
More information about the Kernel
mailing list