On Thu, 30 Jun 2022 at 10:43, Linus Walleij <linus.walleij@xxxxxxxxxx> 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@xxxxxxxxxxxxxxxxxxxx> > Cc: Alexander Potapenko <glider@xxxxxxxxxx> > Cc: Marco Elver <elver@xxxxxxxxxx> > Cc: Dmitry Vyukov <dvyukov@xxxxxxxxxx> > Cc: kasan-dev@xxxxxxxxxxxxxxxx > Cc: linux-mm@xxxxxxxxx > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> Reviewed-by: Marco Elver <elver@xxxxxxxxxx> > --- > 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 >