Matthew Wilcox
2018-Apr-20 11:47 UTC
[PATCH] kvmalloc: always use vmalloc if CONFIG_DEBUG_VM
On Thu, Apr 19, 2018 at 12:12:38PM -0400, Mikulas Patocka wrote:> 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.Maybe it's time to have the SG code handle vmalloced pages? This is becoming more and more common with vmapped stacks (and some of our workarounds are hideous -- allocate 4 bytes with kmalloc because we can't DMA onto the stack any more?). We already have a few places which do handle sgs of vmalloced addresses, such as the nx crypto driver: if (is_vmalloc_addr(start_addr)) sg_addr = page_to_phys(vmalloc_to_page(start_addr)) + offset_in_page(sg_addr); else sg_addr = __pa(sg_addr); and videobuf: pg = vmalloc_to_page(virt); if (NULL == pg) goto err; BUG_ON(page_to_pfn(pg) >= (1 << (32 - PAGE_SHIFT))); sg_set_page(&sglist[i], pg, PAGE_SIZE, 0); Yes, there's the potential that we have to produce two SG entries for a virtually contiguous region if it crosses a page boundary, and our APIs aren't set up right to make it happen. But this is something we should consider fixing ... otherwise we'll end up with dozens of driver hacks. The videobuf implementation was already copy-and-pasted into the saa7146 driver, for example.
Mikulas Patocka
2018-Apr-20 12:20 UTC
[PATCH] kvmalloc: always use vmalloc if CONFIG_DEBUG_VM
On Fri, 20 Apr 2018, Matthew Wilcox wrote:> On Thu, Apr 19, 2018 at 12:12:38PM -0400, Mikulas Patocka wrote: > > 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. > > Maybe it's time to have the SG code handle vmalloced pages? This is > becoming more and more common with vmapped stacks (and some of our > workarounds are hideous -- allocate 4 bytes with kmalloc because we can't > DMA onto the stack any more?). We already have a few places which do > handle sgs of vmalloced addresses, such as the nx crypto driver: > > if (is_vmalloc_addr(start_addr)) > sg_addr = page_to_phys(vmalloc_to_page(start_addr)) > + offset_in_page(sg_addr); > else > sg_addr = __pa(sg_addr); > > and videobuf: > > pg = vmalloc_to_page(virt); > if (NULL == pg) > goto err; > BUG_ON(page_to_pfn(pg) >= (1 << (32 - PAGE_SHIFT))); > sg_set_page(&sglist[i], pg, PAGE_SIZE, 0); > > Yes, there's the potential that we have to produce two SG entries for a > virtually contiguous region if it crosses a page boundary, and our APIs > aren't set up right to make it happen. But this is something we should > consider fixing ... otherwise we'll end up with dozens of driver hacks. > The videobuf implementation was already copy-and-pasted into the saa7146 > driver, for example.What if the device requires physically contiguous area and the vmalloc area crosses a page? Will you use a bounce buffer? Where do you allocate the bounce buffer from? What if you run out of bounce buffers? Mikulkas
Michael S. Tsirkin
2018-Apr-23 15:25 UTC
[PATCH] kvmalloc: always use vmalloc if CONFIG_DEBUG_VM
On Fri, Apr 20, 2018 at 08:20:23AM -0400, Mikulas Patocka wrote:> > > On Fri, 20 Apr 2018, Matthew Wilcox wrote: > > > On Thu, Apr 19, 2018 at 12:12:38PM -0400, Mikulas Patocka wrote: > > > 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. > > > > Maybe it's time to have the SG code handle vmalloced pages? This is > > becoming more and more common with vmapped stacks (and some of our > > workarounds are hideous -- allocate 4 bytes with kmalloc because we can't > > DMA onto the stack any more?). We already have a few places which do > > handle sgs of vmalloced addresses, such as the nx crypto driver: > > > > if (is_vmalloc_addr(start_addr)) > > sg_addr = page_to_phys(vmalloc_to_page(start_addr)) > > + offset_in_page(sg_addr); > > else > > sg_addr = __pa(sg_addr); > > > > and videobuf: > > > > pg = vmalloc_to_page(virt); > > if (NULL == pg) > > goto err; > > BUG_ON(page_to_pfn(pg) >= (1 << (32 - PAGE_SHIFT))); > > sg_set_page(&sglist[i], pg, PAGE_SIZE, 0); > > > > Yes, there's the potential that we have to produce two SG entries for a > > virtually contiguous region if it crosses a page boundary, and our APIs > > aren't set up right to make it happen. But this is something we should > > consider fixing ... otherwise we'll end up with dozens of driver hacks. > > The videobuf implementation was already copy-and-pasted into the saa7146 > > driver, for example. > > What if the device requires physically contiguous area and the vmalloc > area crosses a page? Will you use a bounce buffer? Where do you allocate > the bounce buffer from? What if you run out of bounce buffers? > > MikulkasI agree with Matthew here. 4 byte variables are typically size aligned so won't cross a boundary. That's enough for virtio at least. People using structs can force alignment. We could wrap access in a macro (sizeof(x) >= alignof(x)) to help guarantee that. -- MST
Seemingly Similar Threads
- [PATCH] kvmalloc: always use vmalloc if CONFIG_DEBUG_VM
- [PATCH] kvmalloc: always use vmalloc if CONFIG_DEBUG_VM
- [PATCH] net: don't use kvzalloc for DMA memory
- [PATCH] kvmalloc: always use vmalloc if CONFIG_DEBUG_VM
- [PATCH] kvmalloc: always use vmalloc if CONFIG_DEBUG_VM