On (22/11/22 12:30), Sergey Senozhatsky wrote: > zswap_frontswap_load() should be called from preemptible > context (we even call mutex_lock() there) and it does not > look like we need to do GFP_ATOMIC allocaion for temp > buffer. The same applies to zswap_writeback_entry(). > > Use GFP_KERNEL for temporary buffer allocation in both > cases. > > Signed-off-by: Johannes Weiner <hannes@xxxxxxxxxxx> > Signed-off-by: Nhat Pham <nphamcs@xxxxxxxxx> > Signed-off-by: Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> > --- Folks, how do we want to proceed with this? One of the hunks here conflicts with https://lore.kernel.org/lkml/20221119001536.2086599-2-nphamcs@xxxxxxxxx/ Do we want to remove conflicting hunk from "[PATCH 1/6] zswap: fix writeback lock ordering for zsmalloc" and pick this patch up? > diff --git a/mm/zpool.c b/mm/zpool.c > index 68facc193496..f46c0d5e766c 100644 > --- a/mm/zpool.c > +++ b/mm/zpool.c > @@ -387,6 +387,13 @@ bool zpool_evictable(struct zpool *zpool) > * zpool_can_sleep_mapped - Test if zpool can sleep when do mapped. > * @zpool: The zpool to test > * > + * Some allocators enter non-preemptible context in ->map() callback (e.g. > + * disable pagefaults) and exit that context in ->unmap(), which limits what > + * we can do with the mapped object. For instance, we cannot wait for > + * asynchronous crypto API to decompress such an object or take mutexes > + * since those will call into the scheduler. This function tells us whether > + * we use such an allocator. > + * > * Returns: true if zpool can sleep; false otherwise. > */ > bool zpool_can_sleep_mapped(struct zpool *zpool) > diff --git a/mm/zswap.c b/mm/zswap.c > index 2d48fd59cc7a..3019f0bde194 100644 > --- a/mm/zswap.c > +++ b/mm/zswap.c > @@ -958,7 +958,7 @@ static int zswap_writeback_entry(struct zpool *pool, unsigned long handle) > }; > > if (!zpool_can_sleep_mapped(pool)) { > - tmp = kmalloc(PAGE_SIZE, GFP_ATOMIC); > + tmp = kmalloc(PAGE_SIZE, GFP_KERNEL); > if (!tmp) > return -ENOMEM; > } > @@ -1311,7 +1311,7 @@ static int zswap_frontswap_load(unsigned type, pgoff_t offset, > } > > if (!zpool_can_sleep_mapped(entry->pool->zpool)) { > - tmp = kmalloc(entry->length, GFP_ATOMIC); > + tmp = kmalloc(entry->length, GFP_KERNEL); > if (!tmp) { > ret = -ENOMEM; > goto freeentry; > -- > 2.38.1.584.g0f3c55d4c2-goog >