Message ID | 20250325134000.575794-1-ptesarik@suse.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v2] usb: core: warn if a GFP zone flag is passed to hcd_buffer_alloc() | expand |
On Tue, 25 Mar 2025 14:40:00 +0100 Petr Tesarik <ptesarik@suse.com> wrote: > Remove a misleading comment and issue a warning if a zone modifier is > specified when allocating a hcd buffer. > > There is no valid use case for a GFP zone modifier in hcd_buffer_alloc(): > - PIO mode can use any kernel-addressable memory > - dma_alloc_coherent() ignores memory zone bits > > This function is called by usb_alloc_coherent() and indirectly by > usb_submit_urb(). Despite the comment, no in-tree users currently pass > GFP_DMA. Let me provide a bit of background on this patch. My actual goal is to remove the DMA zone; I'm now going through core code and removing GFP_DMA references that somehow look incorrect to me. I hope this preparation makes it easier to review the removal of GFP_DMA later. Petr T > Signed-off-by: Petr Tesarik <ptesarik@suse.com> > --- > drivers/usb/core/buffer.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c > index 87230869e1fa..10844cd42e66 100644 > --- a/drivers/usb/core/buffer.c > +++ b/drivers/usb/core/buffer.c > @@ -108,10 +108,6 @@ void hcd_buffer_destroy(struct usb_hcd *hcd) > } > > > -/* sometimes alloc/free could use kmalloc with GFP_DMA, for > - * better sharing and to leverage mm/slab.c intelligence. > - */ > - > void *hcd_buffer_alloc( > struct usb_bus *bus, > size_t size, > @@ -128,6 +124,12 @@ void *hcd_buffer_alloc( > if (hcd->localmem_pool) > return gen_pool_dma_alloc(hcd->localmem_pool, size, dma); > > + /* > + * Zone modifiers are ignored by DMA API, and PIO should always use > + * GFP_KERNEL. > + */ > + WARN_ON_ONCE(mem_flags & GFP_ZONEMASK); > + > /* some USB hosts just use PIO */ > if (!hcd_uses_dma(hcd)) { > *dma = ~(dma_addr_t) 0;
diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c index 87230869e1fa..10844cd42e66 100644 --- a/drivers/usb/core/buffer.c +++ b/drivers/usb/core/buffer.c @@ -108,10 +108,6 @@ void hcd_buffer_destroy(struct usb_hcd *hcd) } -/* sometimes alloc/free could use kmalloc with GFP_DMA, for - * better sharing and to leverage mm/slab.c intelligence. - */ - void *hcd_buffer_alloc( struct usb_bus *bus, size_t size, @@ -128,6 +124,12 @@ void *hcd_buffer_alloc( if (hcd->localmem_pool) return gen_pool_dma_alloc(hcd->localmem_pool, size, dma); + /* + * Zone modifiers are ignored by DMA API, and PIO should always use + * GFP_KERNEL. + */ + WARN_ON_ONCE(mem_flags & GFP_ZONEMASK); + /* some USB hosts just use PIO */ if (!hcd_uses_dma(hcd)) { *dma = ~(dma_addr_t) 0;
Remove a misleading comment and issue a warning if a zone modifier is specified when allocating a hcd buffer. There is no valid use case for a GFP zone modifier in hcd_buffer_alloc(): - PIO mode can use any kernel-addressable memory - dma_alloc_coherent() ignores memory zone bits This function is called by usb_alloc_coherent() and indirectly by usb_submit_urb(). Despite the comment, no in-tree users currently pass GFP_DMA. Signed-off-by: Petr Tesarik <ptesarik@suse.com> --- drivers/usb/core/buffer.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)