Re: vmalloc with GFP_NOFS

From: Mikulas Patocka
Date: Wed Apr 25 2018 - 11:25:18 EST




On Wed, 25 Apr 2018, Michal Hocko wrote:

> On Wed 25-04-18 08:43:32, Mikulas Patocka wrote:
> >
> >
> > On Tue, 24 Apr 2018, Michal Hocko wrote:
> >
> > > On Tue 24-04-18 19:17:12, Mikulas Patocka wrote:
> > > >
> > > >
> > > > On Tue, 24 Apr 2018, Michal Hocko wrote:
> > > >
> > > > > > So in a perfect world a filesystem calls memalloc_nofs_save/restore and
> > > > > > always uses GFP_KERNEL for kmalloc/vmalloc?
> > > > >
> > > > > Exactly! And in a dream world those memalloc_nofs_save act as a
> > > > > documentation of the reclaim recursion documentation ;)
> > > > > --
> > > > > Michal Hocko
> > > > > SUSE Labs
> > > >
> > > > BTW. should memalloc_nofs_save and memalloc_noio_save be merged into just
> > > > one that prevents both I/O and FS recursion?
> > >
> > > Why should FS usage stop IO altogether?
> >
> > Because the IO may reach loop and loop may redirect it to the same
> > filesystem that is running under memalloc_nofs_save and deadlock.
>
> So what is the difference with the current GFP_NOFS?

My point is that filesystems should use GFP_NOIO too. If
alloc_pages(GFP_NOFS) issues some random I/O to some block device, the I/O
may be end up being redirected (via block loop device) to the filesystem
that is calling alloc_pages(GFP_NOFS).

> > > > memalloc_nofs_save allows submitting bios to I/O stack and the bios
> > > > created under memalloc_nofs_save could be sent to the loop device and the
> > > > loop device calls the filesystem...
> > >
> > > Don't those use NOIO context?
> >
> > What do you mean?
>
> That the loop driver should make sure it will not recurse. The scope API
> doesn't add anything new here.

The loop driver doesn't recurse. The loop driver will add the request to a
queue and wake up a thread that processes it. But if the request queue is
full, __get_request will wait until the loop thread finishes processing
some other request.

It doesn't recurse, but it waits until the filesystem makes some progress.

Mikulas