problems with new the "contigmalloc" routine

Brian Fundakowski Feldman green at FreeBSD.org
Fri May 20 15:16:21 GMT 2005


On Fri, May 20, 2005 at 01:40:35PM +0200, Hans Petter Selasky wrote:
> Hi,
> 
> I just hit some problems with the new "contigmalloc()" routine in 
> FreeBSD-6-current, which is used by "bus_dmamem_alloc()".
> 
> Firstly it locks Giant, which cause locking order reversals when allocating 
> memory from certain contexts. Secondly it sleeps even if flag M_NOWAIT is 
> passed. Thirdly it does not support flag M_ZERO.

Read the documentation.  It supports M_ZERO just fine, and it does _not_
support M_NOWAIT.

> Can someone explain why these changes have been made?

Changes?

> Why doesn't "contigmalloc()" give a warning when an invalid flag is passed?

The kernel would be significantly larger and almost certainly slower
if it were to double-check that everywhere any bit fields are used
that flags that are not defined to have any behavior are unset.

> Are these bugs in "contigmalloc()"? 

No.

> Or does the code using "contigmalloc()" have to be changed?

Yes.  The i386 bus_dmamem_alloc(), for example, calls it with M_NOWAIT
which is not a valid flag.  The contigmalloc(9) page is not entirely
truthful about the fact that it doesn't sleep at all -- it calls those
routines which can.  They can both be documented to require no locks
to be held when being called, except for M_NOWAIT specifically in the
one-page-or-less allocation case.

-- 
Brian Fundakowski Feldman                           \'[ FreeBSD ]''''''''''\
  <> green at FreeBSD.org                               \  The Power to Serve! \
 Opinions expressed are my own.                       \,,,,,,,,,,,,,,,,,,,,,,\


More information about the freebsd-hackers mailing list