Re: [PATCH 3.4 47/88] mm: add kmap_to_page()

From: Ben Hutchings
Date: Mon Jun 09 2014 - 21:22:03 EST


On Mon, 2014-06-09 at 18:15 -0700, Hugh Dickins wrote:
> On Mon, 9 Jun 2014, Greg Kroah-Hartman wrote:
>
> > 3.4-stable review patch. If anyone has any objections, please let me know.
> >
> > ------------------
> >
> > From: Ben Hutchings <ben@xxxxxxxxxxxxxxx>
> >
> > commit fcb8996728fb59eddf84678df7cb213b2c9a2e26 upstream.
> >
> > This is extracted from Mel Gorman's commit 5a178119b0fb ('mm: add
> > support for direct_IO to highmem pages') upstream.
> >
> > Required to backport commit b9cdc88df8e6 ('virtio: 9p: correctly pass
> > physical address to userspace for high pages').
> >
> > Cc: Mel Gorman <mgorman@xxxxxxx>
> > Cc: Rik van Riel <riel@xxxxxxxxxx>
> > Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
> > Signed-off-by: Ben Hutchings <ben@xxxxxxxxxxxxxxx>
> > Cc: Yijing Wang <wangyijing@xxxxxxxxxx>
> > Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
> >
> > ---
> > include/linux/highmem.h | 7 +++++++
> > mm/highmem.c | 12 ++++++++++++
> > 2 files changed, 19 insertions(+)
> >
> > --- a/include/linux/highmem.h
> > +++ b/include/linux/highmem.h
> > @@ -39,10 +39,17 @@ extern unsigned long totalhigh_pages;
> >
> > void kmap_flush_unused(void);
> >
> > +struct page *kmap_to_page(void *addr);
> > +
> > #else /* CONFIG_HIGHMEM */
> >
> > static inline unsigned int nr_free_highpages(void) { return 0; }
> >
> > +static inline struct page *kmap_to_page(void *addr)
> > +{
> > + return virt_to_page(addr);
> > +}
> > +
> > #define totalhigh_pages 0UL
> >
> > #ifndef ARCH_HAS_KMAP
> > --- a/mm/highmem.c
> > +++ b/mm/highmem.c
> > @@ -94,6 +94,18 @@ static DECLARE_WAIT_QUEUE_HEAD(pkmap_map
> > do { spin_unlock(&kmap_lock); (void)(flags); } while (0)
> > #endif
> >
> > +struct page *kmap_to_page(void *vaddr)
> > +{
> > + unsigned long addr = (unsigned long)vaddr;
> > +
> > + if (addr >= PKMAP_ADDR(0) && addr <= PKMAP_ADDR(LAST_PKMAP)) {
> > + int i = (addr - PKMAP_ADDR(0)) >> PAGE_SHIFT;
> > + return pte_page(pkmap_page_table[i]);
> > + }
> > +
> > + return virt_to_page(addr);
> > +}
> > +
> > static void flush_all_zero_pkmaps(void)
> > {
> > int i;
>
> I think this needs the following on top:
>
> commit 498c2280212327858e521e9d21345d4cc2637f54
> Author: Will Deacon <will.deacon@xxxxxxx>
> Date: Fri Nov 16 14:15:00 2012 -0800
>
> mm: highmem: don't treat PKMAP_ADDR(LAST_PKMAP) as a highmem address
[...]

Thanks Hugh, I've queued this up for 3.2 (where I previously added
kmap_to_page()).

Ben.

--
Ben Hutchings

Attachment: signature.asc
Description: This is a digitally signed message part