On Mon, 24 Jun 2024, Usama Arif wrote: > On 24/06/2024 18:26, Hugh Dickins wrote: > > On Mon, 24 Jun 2024, Usama Arif wrote: > >> On 24/06/2024 15:05, Yosry Ahmed wrote: > >>> On Mon, Jun 24, 2024 at 1:49 AM kernel test robot <oliver.sang@xxxxxxxxx> > >>> wrote: > >>>> > >>>> Hello, > >>>> > >>>> kernel test robot noticed > >>>> "WARNING:at_mm/page_alloc.c:#__alloc_pages_noprof" on: > >>>> > >>>> commit: 0fa2857d23aa170e5e28d13c467b303b0065aad8 ("mm: store zero pages > >>>> to > >>>> be swapped out in a bitmap") > >>>> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git master > >>> This is coming from WARN_ON_ONCE_GFP(order > MAX_PAGE_ORDER, gfp), and > >>> is triggered by the new bitmap_zalloc() call in the swapon path. For a > >>> sufficiently large swapfile, bitmap_zalloc() (which uses kmalloc() > >>> under the hood) cannot be used to allocate the bitmap. > >>> > >>> Usama, I think we want to use a variant of kvmalloc() here. > > Yes, I hit the same problem with swapon in my testing, > > and had been intending to send a patch. > > > >> Yes, just testing with below diff now. The patch is not in mm-stable yet, > >> so > >> will just send another revision with below diff included. Thanks! > >> > >> > >> diff --git a/mm/swapfile.c b/mm/swapfile.c > >> index 0b8270359bcf..2263f71baa31 100644 > >> --- a/mm/swapfile.c > >> +++ b/mm/swapfile.c > >> @@ -2643,7 +2643,7 @@ SYSCALL_DEFINE1(swapoff, const char __user *, > >> specialfile) > >> free_percpu(p->cluster_next_cpu); > >> p->cluster_next_cpu = NULL; > >> vfree(swap_map); > >> - bitmap_free(p->zeromap); > >> + kvfree(p->zeromap); > > Yes. > > > >> kvfree(cluster_info); > >> /* Destroy swap account information */ > >> swap_cgroup_swapoff(p->type); > >> @@ -3170,7 +3170,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, > >> specialfile, int, swap_flags) > >> goto bad_swap_unlock_inode; > >> } > >> > >> - p->zeromap = bitmap_zalloc(maxpages, GFP_KERNEL); > >> + p->zeromap = kvzalloc(DIV_ROUND_UP(maxpages, 8), GFP_KERNEL); > > No, 8 is not right for 32-bit kernels. I think you want > > p->zeromap = kvzalloc(BITS_TO_LONGS(maxpages), GFP_KERNEL); > > but please check it carefully, I'm easily confused by such conversions. > > > > Hugh > > Ah yes, didnt take into account 32-bit kernel. I think its supposed to be > > p->zeromap = kvzalloc(BITS_TO_LONGS(maxpages) * sizeof(unsigned long), > GFP_KERNEL); > > if using BITS_TO_LONGS. No doubt you're right (I'm glad I already admitted to being confused). Personally, I'd just say sizeof(long), but whatever you prefer. Hugh > > Will wait sometime incase there are more comments and will send out another > version. > > Thanks! > > >> if (!p->zeromap) { > >> error = -ENOMEM; > >> goto bad_swap_unlock_inode;