Date: Thu, 14 Sep 2000 13:22:09 -0400 From: Charles Richmond <cmr@sitaranetworks.com> To: 'mark tinguely' <tinguely@hookie.cs.ndsu.NoDak.edu>, bmilekic@dsuper.net, wollman@khavrinen.lcs.mit.edu Cc: freebsd-net@FreeBSD.ORG Subject: RE: Clusters larger than PAGE_SIZE and contigmalloc() Message-ID: <31269226357BD211979E00A0C9866DABE411F5@rios.sitaranetworks.com>
next in thread | raw e-mail | index | archive | help
So maybe I am being blind on this, but... It seems to me if the mbuf clusters cross page boundaries in an unaligned fashion as the earlier suggestion of 8 X 1.5k would do or if the size is privately configurable and thus not guaranteed to align, then the DMA code is forced into a scatter gather mode, even if the actual pages are contiguous. Can someone clear up my blindness? Charlie > -----Original Message----- > From: mark tinguely [mailto:tinguely@hookie.cs.ndsu.NoDak.edu] > Sent: Thursday, September 14, 2000 11:19 AM > To: bmilekic@dsuper.net; wollman@khavrinen.lcs.mit.edu > Cc: freebsd-net@FreeBSD.ORG > Subject: Re: Clusters larger than PAGE_SIZE and contigmalloc() > > > > my IDT NICStAR ATM card driver allocates contiguous memory for > mbuf external buffers. the card can use buffers larger than a physical > page, but I don't use it that way. there were a couple problems that > helped manually allocating buffers contiguously; one is in a couple > occasions, such as raw cell processing, I had the physical address of > the external buffer from the card but I need to use the kernel virtual > address. > > The ATM card needs to have external buffers programed into a queue to > be used when the data arrives. Instead allocating and > deallocating mbufs > as packets came in and were processed, as an experiment, I am > mucked up > the MBUF even more by making the mbuf structure and the > external buffer > permanent connected: > > #define M_PERM 0x8000 /* permanently allocated */ > > /* > * MFREE(struct mbuf *m, struct mbuf *n) > * Free a single mbuf and associated external storage. > * Place the successor, if any, in n. > */ > #define MFREE(m, n) MBUFLOCK( > \ > struct mbuf *_mm = (m); > \ > > \ > KASSERT(_mm->m_type != MT_FREE, ("freeing free mbuf")); > \ > mbstat.m_mtypes[_mm->m_type]--; > \ > if (_mm->m_flags & M_EXT) > \ > MEXTFREE1(m); > \ > (n) = _mm->m_next; > \ > if (_mm->m_flags & M_PERM) { > \ > _mm->m_next = (struct mbuf *) 0; > \ > } else { > \ > _mm->m_type = MT_FREE; > \ > mbstat.m_mtypes[MT_FREE]++; > \ > _mm->m_next = mmbfree; > \ > mmbfree = _mm; > \ > MMBWAKEUP(); > \ > } > \ > ) > > when the packet fills a buffer, I can have it return the > kernel virtual > address of the mbuf holding the external buffer, and link up the new > mbuf to the chain that was come in so far. I haven't actually counted > how much this really saves vs. the extra space required for > the permanently > allocated mbufs. > > the downside with having your own pool of mbuf is that you are at the > mercy of other code that may overwrite your ext_free() routine and you > never get your buffers back. I suspect this is happening to one person > using my driver. > > --mark tinguely. > > > To Unsubscribe: send mail to majordomo@FreeBSD.org > with "unsubscribe freebsd-net" in the body of the message > To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?31269226357BD211979E00A0C9866DABE411F5>