Re: [ATTEND] many topics

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

 



On Thu, Jan 19, 2017 at 12:33:17PM +0100, Michal Hocko wrote:
> On Thu 19-01-17 03:05:13, willy@xxxxxxxxxxxxx wrote:
> > Let me rephrase the topic ... Under what conditions should somebody use
> > the GFP_TEMPORARY gfp_t?
> 
> Most users of slab (kmalloc) do not really have to care. Slab will add
> __GFP_RECLAIMABLE to all reclaimable caches automagically AFAIR. The
> remaining would have to implement some kind of shrinker to allow the
> reclaim.

I seem to be not making myself clear.  Picture me writing a device driver.
When should I use GFP_TEMPORARY?

> > Example usages that I have questions about:
> > 
> > 1. Is it permissible to call kmalloc(GFP_TEMPORARY), or is it only
> > for alloc_pages?
> 
> kmalloc will use it internally as mentioned above.  I am not even sure
> whether direct using of kmalloc(GFP_TEMPORARY) is ok.  I would have to
> check the code but I guess it would be just wrong unless you know your
> cache is reclaimable.

You're not using words that have any meaning to a device driver writer.
Here's my code:

int foo_ioctl(..)
{
	struct foo *foo = kmalloc(sizeof(*foo), GFP_TEMPORARY);
}

Does this work?  If not, should it?  Or should slab be checking for
this and calling WARN()?

> > I ask because if the slab allocator is unaware of
> > GFP_TEMPORARY, then a non-GFP_TEMPORARY allocation may be placed in a
> > page allocated with GFP_TEMPORARY and we've just made it meaningless.
> > 
> > 2. Is it permissible to sleep while holding a GFP_TEMPORARY allocation?
> > eg, take a mutex, or wait_for_completion()?
> 
> Yes, GFP_TEMPORARY has ___GFP_DIRECT_RECLAIM set so this is by
> definition sleepable allocation request.

Again, we're talking past each other.  Can foo_ioctl() sleep before
releasing its GFP_TEMPORARY allocation, or will that make the memory
allocator unhappy?

> > 3. Can I make one GFP_TEMPORARY allocation, and then another one?
> 
> Not sure I understand. WHy would be a problem?

As you say above, GFP_TEMPORARY may sleep, so this is a variation on the "can I sleep while holding a GFP_TEMPORARY allocation" question.

> > 4. Should I disable preemption while holding a GFP_TEMPORARY allocation,
> > or are we OK with a task being preempted?
> 
> no, it can sleep.
> 
> > 5. What about something even longer duration like allocating a kiocb?
> > That might take an arbitrary length of time to be freed, but eventually
> > the command will be timed out (eg 30 seconds for something that ends up
> > going through SCSI).
> 
> I do not understand. The reclaimability of the object is in hands of the
> respective shrinker...

There is no shrinker here.  This is about the object being "temporary",
for some value of temporary.  I want to nail down what the MM is willing
to tolerate in terms of length of time an object is allocated for.

> > 6. Or shorter duration like doing a GFP_TEMPORARY allocation, then taking
> > a spinlock, which *probably* isn't contended, but you never know.
> > 
> > 7. I can see it includes __GFP_WAIT so it's not suitable for using from
> > interrupt context, but interrupt context might be the place which can
> > benefit from it the most.  Or does GFP_ATOMIC's __GFP_HIGH also allow for
> > allocation from the movable zone?  Should we have a GFP_TEMPORARY_ATOMIC?
> 
> This is where __GFP_RECLAIMABLE should be used as this is the core of
> the functionality.

This response also doesn't make sense to me.
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux