Date: Mon, 25 Nov 2002 10:32:19 -0800 From: "Sam Leffler" <sam@errno.com> To: "Robert Watson" <rwatson@FreeBSD.ORG>, "Andrew Gallatin" <gallatin@cs.duke.edu> Cc: "Luigi Rizzo" <rizzo@icir.org>, <current@FreeBSD.ORG> Subject: Re: mbuf header bloat ? Message-ID: <232901c294b0$feda0090$52557f42@errno.com> References: <Pine.NEB.3.96L.1021125111737.36232C-100000@fledge.watson.org>
next in thread | previous in thread | raw e-mail | index | archive | help
> (1) When packet headers are copied using m_copy_pkthdr(), different > consumers have different expectations for what the resulting semantics > are for m_tag data -- some want it duplicated, others want it moved. > In practice, it is only ever moved, so consumers that expect > duplication are in for a surprise. We need to re-implement the packet > header copying code so that it can generate a failure (because it > involves allocation), and separate the duplicate and move abstractions > to get clean semantics. I exchanged some e-mail with Sam Leffler on > the topic, and apparently OpenBSD has already made these changes, or > similar ones, and we should do the same for 5.1. > As I explained to you; the handling of mtags mimics what was there for the aux mbufs. I did this intentionally to avoid changes that might introduce subtle problems. My intent was to cleanup this stuff after 5.0 releases by replacing the pkthdr copy macros with separate DUP+MOVE macros ala openbsd. I did this in my original implemention but discarded it when I did the -current integration. > (2) m_tag's don't have a notion that the data carried in a tag is > multi-dimmensional and may require special destructor behavior. While > it does centralize copying and free'ing of data, it handles this > purely with bcopy, malloc, and free, which is not appropriate for use > with MAC labels, since they may contain a variety of per-policy data > that may require special handling (reference count management, etc). > I tried putting tag-specific release/free/... code in the m_tag > central routines, and it looks like that would work, although it > eventually would lead to a lot of junk in the m_tag code. We might > want to consider m_tag entry free/copy pointers of some sort, but I'm > not sure if we want to go there. Adding the MAC stuff to the > m_tag_{free,copy,...} calls won't break the ABI, whereas adding free > and copy pointers to the tags themselves would. > I don't believe it's necessary to overload the basic mtag structure but instead introduce a specific cookie that enables a more general mechanism that would be suitable for your needs. > (3) Not all code generating packets properly initializes m_tag field. The > one example I've come across so far is the use of m_getcl() to grab > mbufs with an attached cluster -- it never initializes the SLIST > properly, as far as I can tell. Right now that's used in device > drivers, and also in the BPF packet generation code. If the header is > zero'd, this may be OK due to an implicit proper initialization, but > this is concerning. We need to do more work to normalize packet > handling. > I don't see this problem; m_getcl appears to do the right thing. > (4) Code still exists that improperly hand-copies mbuf packet header data. > if_loop.c contains some particular bogus code that also triggers a > panic in the MAC code for the same reason. If m_tag data ever passes > through if_loop and hits the re-alignment case introduced by KAME, the > system will panic when the tag data is free'd. This code all needs to > be normalized, and proper semantics must be enforced. > I don't see this problem; looutput looks to do the right thing. FWIW I've passed mbufs w/ mtags through the loopback interface. <...other stuff omitted...> Please contact me directly about the problems so we can resolve them immediately. Sam To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?232901c294b0$feda0090$52557f42>