Message ID | 20220630084124.691207-4-linus.walleij@linaro.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm: Pass pointers to page accessors | expand |
On Thu, 30 Jun 2022 at 10:43, Linus Walleij <linus.walleij@linaro.org> wrote: > > Functions that work on a pointer to virtual memory such as > virt_to_pfn() and users of that function such as > virt_to_page() are supposed to pass a pointer to virtual > memory, ideally a (void *) or other pointer. However since > many architectures implement virt_to_pfn() as a macro, > this function becomes polymorphic and accepts both a > (unsigned long) and a (void *). > > If we instead implement a proper virt_to_pfn(void *addr) > function the following happens (occurred on arch/arm): > > mm/kfence/core.c:558:30: warning: passing argument 1 > of 'virt_to_pfn' makes pointer from integer without a > cast [-Wint-conversion] > > In one case we can refer to __kfence_pool directly (and > that is a proper (char *) pointer) and in the other call > site we use an explicit cast. > > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: Alexander Potapenko <glider@google.com> > Cc: Marco Elver <elver@google.com> > Cc: Dmitry Vyukov <dvyukov@google.com> > Cc: kasan-dev@googlegroups.com > Cc: linux-mm@kvack.org > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Marco Elver <elver@google.com> > --- > mm/kfence/core.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/mm/kfence/core.c b/mm/kfence/core.c > index 4e7cd4c8e687..153cde62ad72 100644 > --- a/mm/kfence/core.c > +++ b/mm/kfence/core.c > @@ -543,7 +543,7 @@ static unsigned long kfence_init_pool(void) > if (!arch_kfence_init_pool()) > return addr; > > - pages = virt_to_page(addr); > + pages = virt_to_page(__kfence_pool); > > /* > * Set up object pages: they must have PG_slab set, to avoid freeing > @@ -657,7 +657,7 @@ static bool kfence_init_pool_late(void) > /* Same as above. */ > free_size = KFENCE_POOL_SIZE - (addr - (unsigned long)__kfence_pool); > #ifdef CONFIG_CONTIG_ALLOC > - free_contig_range(page_to_pfn(virt_to_page(addr)), free_size / PAGE_SIZE); > + free_contig_range(page_to_pfn(virt_to_page((void *)addr)), free_size / PAGE_SIZE); > #else > free_pages_exact((void *)addr, free_size); > #endif > -- > 2.36.1 >
diff --git a/mm/kfence/core.c b/mm/kfence/core.c index 4e7cd4c8e687..153cde62ad72 100644 --- a/mm/kfence/core.c +++ b/mm/kfence/core.c @@ -543,7 +543,7 @@ static unsigned long kfence_init_pool(void) if (!arch_kfence_init_pool()) return addr; - pages = virt_to_page(addr); + pages = virt_to_page(__kfence_pool); /* * Set up object pages: they must have PG_slab set, to avoid freeing @@ -657,7 +657,7 @@ static bool kfence_init_pool_late(void) /* Same as above. */ free_size = KFENCE_POOL_SIZE - (addr - (unsigned long)__kfence_pool); #ifdef CONFIG_CONTIG_ALLOC - free_contig_range(page_to_pfn(virt_to_page(addr)), free_size / PAGE_SIZE); + free_contig_range(page_to_pfn(virt_to_page((void *)addr)), free_size / PAGE_SIZE); #else free_pages_exact((void *)addr, free_size); #endif
Functions that work on a pointer to virtual memory such as virt_to_pfn() and users of that function such as virt_to_page() are supposed to pass a pointer to virtual memory, ideally a (void *) or other pointer. However since many architectures implement virt_to_pfn() as a macro, this function becomes polymorphic and accepts both a (unsigned long) and a (void *). If we instead implement a proper virt_to_pfn(void *addr) function the following happens (occurred on arch/arm): mm/kfence/core.c:558:30: warning: passing argument 1 of 'virt_to_pfn' makes pointer from integer without a cast [-Wint-conversion] In one case we can refer to __kfence_pool directly (and that is a proper (char *) pointer) and in the other call site we use an explicit cast. Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Alexander Potapenko <glider@google.com> Cc: Marco Elver <elver@google.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: kasan-dev@googlegroups.com Cc: linux-mm@kvack.org Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- mm/kfence/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)