Re: [PATCH] kvmalloc: always use vmalloc if CONFIG_DEBUG_VM
From: "Michael S. Tsirkin" <mst@redhat.com>
Date: 2018-04-19 16:43:44
Also in:
dm-devel, linux-mm, lkml
On Thu, Apr 19, 2018 at 12:12:38PM -0400, Mikulas Patocka wrote:
On Wed, 18 Apr 2018, Mikulas Patocka wrote:quoted
On Wed, 18 Apr 2018, David Miller wrote:quoted
From: Mikulas Patocka <mpatocka@redhat.com> Date: Wed, 18 Apr 2018 12:44:25 -0400 (EDT)quoted
The structure net_device is followed by arbitrary driver-specific data (accessible with the function netdev_priv). And for virtio-net, these driver-specific data must be in DMA memory.And we are saying that this assumption is wrong and needs to be corrected.So, try to find all the networking drivers that to DMA to the private area. The problem here is that kvzalloc usually returns DMA-able area, but it may return non-DMA area rarely, if the memory is too fragmented. So, we are in a situation, where some networking drivers will randomly fail. Go and find them. MikulasHer I submit a patch that makes kvmalloc always use vmalloc if CONFIG_DEBUG_VM is defined. From: Mikulas Patocka <mpatocka@redhat.com> Subject: [PATCH] kvmalloc: always use vmalloc if CONFIG_DEBUG_VM The kvmalloc function tries to use kmalloc and falls back to vmalloc if kmalloc fails. Unfortunatelly, some kernel code has bugs - it uses kvmalloc and then uses DMA-API on the returned memory or frees it with kfree. Such bugs were found in the virtio-net driver, dm-integrity or RHEL7 powerpc-specific code. These bugs are hard to reproduce because vmalloc falls back to kmalloc only if memory is fragmented. In order to detect these bugs reliably I submit this patch that changes kvmalloc to always use vmalloc if CONFIG_DEBUG_VM is turned on. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Maybe make it conditional on CONFIG_DEBUG_SG too? Otherwise I think you just trigger a hard to debug memory corruption.
quoted hunk ↗ jump to hunk
--- mm/util.c | 2 ++ 1 file changed, 2 insertions(+) Index: linux-2.6/mm/util.c ===================================================================--- linux-2.6.orig/mm/util.c 2018-04-18 15:46:23.000000000 +0200 +++ linux-2.6/mm/util.c 2018-04-18 16:00:43.000000000 +0200@@ -395,6 +395,7 @@ EXPORT_SYMBOL(vm_mmap); */ void *kvmalloc_node(size_t size, gfp_t flags, int node) { +#ifndef CONFIG_DEBUG_VM gfp_t kmalloc_flags = flags; void *ret;@@ -426,6 +427,7 @@ void *kvmalloc_node(size_t size, gfp_t f */ if (ret || size <= PAGE_SIZE) return ret; +#endif return __vmalloc_node_flags_caller(size, node, flags, __builtin_return_address(0));