diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2019-08-30 20:44:24 +0200 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2019-09-16 12:06:25 +0200 |
commit | 10c12851a022662bf6085bd4384b4ebed4c447ce (patch) | |
tree | 609a2973a0bbbd33afc073e6a122ddec858efe3f /drivers/scsi/hisi_sas | |
parent | 6fd4e634835208ddb331234bfa51d75396a5c42c (diff) | |
download | linux-next-10c12851a022662bf6085bd4384b4ebed4c447ce.tar.gz |
libceph: avoid a __vmalloc() deadlock in ceph_kvmalloc()
The vmalloc allocator doesn't fully respect the specified gfp mask:
while the actual pages are allocated as requested, the page table pages
are always allocated with GFP_KERNEL. ceph_kvmalloc() may be called
with GFP_NOFS and GFP_NOIO (for ceph and rbd respectively), so this may
result in a deadlock.
There is no real reason for the current PAGE_ALLOC_COSTLY_ORDER logic,
it's just something that seemed sensible at the time (ceph_kvmalloc()
predates kvmalloc()). kvmalloc() is smarter: in an attempt to reduce
long term fragmentation, it first tries to kmalloc non-disruptively.
Switch to kvmalloc() and set the respective PF_MEMALLOC_* flag using
the scope API to avoid the deadlock. Note that kvmalloc() needs to be
passed GFP_KERNEL to enable the fallback.
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Diffstat (limited to 'drivers/scsi/hisi_sas')
0 files changed, 0 insertions, 0 deletions