David reported that following the async cow path refactoring that got into misc-next he started seeing premature OOM kills due to large page allocations (order 4). This was due to now the whole async context (alongisde ancillary structures, describing chunks) being allocated in a single kmalloc call. The first patch of this series aims to fix that by converting the kmalloc call to kvmalloc. This will have virtually no perfromance impact for small writes and for larger ones will fallback to vmalloc.
However, while testing the first patch I observed BUG_ONs in the async csum calculation path to trigger. This is clearly caused by the fact that the first patch introduces a fairly large memory allocation. Nevertheless, having large allocations in the csum path without a fallback to some sort of order 0 page allocation or at least graceful handling of memory errors is gross. Patch 2 aims to rectify this by switching the allocation in btrfs_csum_one_bio to using kvmalloc, giving greated chance for success. Even if patch 1 is ignored nothing prevents the csum calculation to trigger the bug on depending on the memory usage/fragmentation of the server so IMO it's beneficial either ways. Nikolay Borisov (2): btrfs: Use kvmalloc for allocating compressed path context btrfs: Switch memory allocations in async csum calculation path to kvmalloc fs/btrfs/file-item.c | 15 +++++++++++---- fs/btrfs/inode.c | 9 +++++++-- fs/btrfs/ordered-data.c | 3 ++- 3 files changed, 20 insertions(+), 7 deletions(-) -- 2.17.1