On Fri, 12 Jul 2019, Ming Lei wrote: > On Thu, Jul 11, 2019 at 11:36:56PM -0700, Sultan Alsawaf wrote: > > From: Sultan Alsawaf <sul...@kerneltoast.com> > > > > Typically, drivers allocate sg lists of sizes up to a few MiB in size. > > The current algorithm deals with large sg lists by splitting them into > > several smaller arrays and chaining them together. But if the sg list > > allocation is large, and we know the size ahead of time, sg chaining is > > both inefficient and unnecessary. > > > > Rather than calling kmalloc hundreds of times in a loop for chaining > > tiny arrays, we can simply do it all at once with kvmalloc, which has > > the proper tradeoff on when to stop using kmalloc and instead use > > vmalloc. > > vmalloc() may sleep, so it is impossible to be called in atomic context.
Allocations from atomic context should be avoided wherever possible and you really have to have a very convincing argument why an atomic allocation is absolutely necessary. I cleaned up quite some GFP_ATOMIC users over the last couple of years and all of them were doing it for the very wrong reasons and mostly just to silence the warning which is triggered with GFP_KERNEL when called from a non-sleepable context. So I suggest to audit all call sites first and figure out whether they really must use GFP_ATOMIC and if possible clean them up, remove the GFP argument and then do the vmalloc thing on top. Thanks, tglx