Re: [patch 1/1] alloc_pages(): permit get_zeroed_page(GFP_ATOMIC) from interrupt context

Andrew Morton
2007-08-27T22:45:58Z

On Mon, 27 Aug 2007 15:12:58 -0700 (PDT)
Christoph Lameter <clameter@sgi.com> wrote:

> On Mon, 27 Aug 2007, Andrew Morton wrote:
>
> > > Nesting (at least allocate a
> > > regular page while highmem page is being mapped) needs to work in order to
> > > be able to allocate a page from an interrupt contexts.
> >
> > yup, but interrupt-level code should use the reserved-for-interrupt kmap
> > slots (KM_IRQ0, etc).
>
> We are not using any kmap slot since we are allocating a non highmem page!

Right. So a get_zeroed_page() from IRQ context happens to be not buggy,
even though it goes BUG.

So what do we do?

a) don't call clear_highpage() for non-highmem pages (my fix)

b) don't do the is-the-pte-zero check in kmap_atomic_prot() if the page
isn't highmem

This is bad because it'll disable the check completely if the machine
doesn't physically have highmem, or if the page happened to be a lowmem
one.

c) don't do the is-the-pte-zero check if __GFP_HIGHMEM wasn't set.

OK, but we don't pass the gfp_t into kmap_atomic. So we need to do
this at the caller site. That's what a) does.