Re: [PATCH 3/6] hugetlb: introduce alloc_nodemask_of_node

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2009-09-10 at 16:05 -0700, Andrew Morton wrote:
> On Wed, 09 Sep 2009 12:31:46 -0400
> Lee Schermerhorn <lee.schermerhorn@xxxxxx> wrote:
> 
> > [PATCH 3/6] - hugetlb:  introduce alloc_nodemask_of_node()
> > 
> > Against:  2.6.31-rc7-mmotm-090827-1651
> > 
> > New in V5 of series
> > 
> > V6: + rename 'init_nodemask_of_nodes()' to 'init_nodemask_of_node()'
> >     + redefine init_nodemask_of_node() as static inline fcn
> >     + move this patch back 1 in series
> > 
> > Introduce nodemask macro to allocate a nodemask and 
> > initialize it to contain a single node, using the macro
> > init_nodemask_of_node() factored out of the nodemask_of_node()
> > macro.
> > 
> > alloc_nodemask_of_node() coded as a macro to avoid header
> > dependency hell.
> > 
> > This will be used to construct the huge pages "nodes_allowed"
> > nodemask for a single node when basing nodes_allowed on a
> > preferred/local mempolicy or when a persistent huge page
> > pool page count is modified via a per node sysfs attribute.
> > 
> > ...
> >
> > +/*
> > + * returns pointer to kmalloc()'d nodemask initialized to contain the
> > + * specified node.  Caller must free with kfree().
> > + */
> > +#define alloc_nodemask_of_node(node)					\
> > +({									\
> > +	typeof(_unused_nodemask_arg_) *nmp;				\
> > +	nmp = kmalloc(sizeof(*nmp), GFP_KERNEL);			\
> > +	if (nmp)							\
> > +		init_nodemask_of_node(nmp, (node));			\
> > +	nmp;								\
> > +})
> 
> All right, I give up.  What's with this `typeof(_unused_nodemask_arg_)'
> stuff?

You got me.  I would have used a bar nodemask_t, but I was following the
style of the nodemask_of_node() in the same header.

> 
> 
> Was there a reason why this had to be implemented as a macro.

> One
> which evaluates its arg either one or zero times, btw?

Well, one, unless the alloc fails.  

> 
> hm.  "to avoid header dependency hell".  What hell?  Self-inflicted?

Well, I tried to make it a static inline function, but nodemask.h gets
included, indirectly, in various places where, e.g., kmalloc() is not
defined.  I tried including slab.h, but that had problems with other
missing definitions.  I didn't want to end up with the entire
include/linux directory included in nodemask.h.

I would have put it in a .c file, but there is no, e.g., nodemask.c.
Guess I could have created alloc_bitmap_of_bit() in bitmap.c with a
wrapper in nodemask.h.  Would that be preferable?

> 
> alloc_nodemask_of_node() has no callers, so I can think of a good fix
> for these problems.  If it _did_ have a caller then I might ask "can't
> we fix this by moving alloc_nodemask_of_node() into the .c file".  But
> it doesn't so I can't.

This patch was a later addition.  The function is used by the following
patch.   Originally, I had a private function in hugetlb.c that
kmalloc()'d and initialized the nodes_allowed mask.  Mel suggested that
I use the generic nodemask_of_node().  That didn't have the semantics I
wanted, so I created this variant.

> 
> It's a bit rude to assume that the caller wanted to use GFP_KERNEL.

I can add a gfp_t parameter to the macro, but I'll still need to select
value in the caller.  Do you have a suggested alternative to GFP_KERNEL
[for both here and in alloc_nodemask_of_mempolicy()]?  We certainly
don't want to loop forever, killing off tasks, as David mentioned.
Silently failing is OK.  We handle that.

Lee

--
To unsubscribe from this list: send the line "unsubscribe linux-numa" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]     [Devices]

  Powered by Linux