lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 23 Sep 2021 12:10:09 +0300 From: Ilias Apalodimas <ilias.apalodimas@...aro.org> To: Yunsheng Lin <linyunsheng@...wei.com> Cc: "David S. Miller" <davem@...emloft.net>, Jakub Kicinski <kuba@...nel.org>, Networking <netdev@...r.kernel.org>, open list <linux-kernel@...r.kernel.org>, linuxarm@...neuler.org, Jesper Dangaard Brouer <hawk@...nel.org>, Jonathan Lemon <jonathan.lemon@...il.com>, Alexander Lobakin <alobakin@...me>, Willem de Bruijn <willemb@...gle.com>, Cong Wang <cong.wang@...edance.com>, Paolo Abeni <pabeni@...hat.com>, Kevin Hao <haokexin@...il.com>, Aleksandr Nogikh <nogikh@...gle.com>, Marco Elver <elver@...gle.com>, memxor@...il.com, Eric Dumazet <edumazet@...gle.com>, Alexander Duyck <alexander.duyck@...il.com>, David Ahern <dsahern@...il.com>, Matthew Wilcox <willy@...radead.org> Subject: Re: [PATCH net-next 1/7] page_pool: disable dma mapping support for 32-bit arch with 64-bit DMA (+cc Matthew) but this looks safe to me. On Wed, 22 Sept 2021 at 12:43, Yunsheng Lin <linyunsheng@...wei.com> wrote: > > As the 32-bit arch with 64-bit DMA seems to rare those days, > and page pool is carrying a lot of code and complexity for > systems that possibly don't exist. > > So disable dma mapping support for such systems, if drivers > really want to work on such systems, they have to implement > their own DMA-mapping fallback tracking outside page_pool. > > Signed-off-by: Yunsheng Lin <linyunsheng@...wei.com> > --- > include/linux/mm_types.h | 13 +------------ > include/net/page_pool.h | 12 +----------- > net/core/page_pool.c | 10 ++++++---- > 3 files changed, 8 insertions(+), 27 deletions(-) > > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h > index 7f8ee09c711f..436e0946d691 100644 > --- a/include/linux/mm_types.h > +++ b/include/linux/mm_types.h > @@ -104,18 +104,7 @@ struct page { > struct page_pool *pp; > unsigned long _pp_mapping_pad; > unsigned long dma_addr; > - union { > - /** > - * dma_addr_upper: might require a 64-bit > - * value on 32-bit architectures. > - */ > - unsigned long dma_addr_upper; > - /** > - * For frag page support, not supported in > - * 32-bit architectures with 64-bit DMA. > - */ > - atomic_long_t pp_frag_count; > - }; > + atomic_long_t pp_frag_count; > }; > struct { /* slab, slob and slub */ > union { > diff --git a/include/net/page_pool.h b/include/net/page_pool.h > index a4082406a003..3855f069627f 100644 > --- a/include/net/page_pool.h > +++ b/include/net/page_pool.h > @@ -216,24 +216,14 @@ static inline void page_pool_recycle_direct(struct page_pool *pool, > page_pool_put_full_page(pool, page, true); > } > > -#define PAGE_POOL_DMA_USE_PP_FRAG_COUNT \ > - (sizeof(dma_addr_t) > sizeof(unsigned long)) > - > static inline dma_addr_t page_pool_get_dma_addr(struct page *page) > { > - dma_addr_t ret = page->dma_addr; > - > - if (PAGE_POOL_DMA_USE_PP_FRAG_COUNT) > - ret |= (dma_addr_t)page->dma_addr_upper << 16 << 16; > - > - return ret; > + return page->dma_addr; > } > > static inline void page_pool_set_dma_addr(struct page *page, dma_addr_t addr) > { > page->dma_addr = addr; > - if (PAGE_POOL_DMA_USE_PP_FRAG_COUNT) > - page->dma_addr_upper = upper_32_bits(addr); > } > > static inline void page_pool_set_frag_count(struct page *page, long nr) > diff --git a/net/core/page_pool.c b/net/core/page_pool.c > index 1a6978427d6c..a65bd7972e37 100644 > --- a/net/core/page_pool.c > +++ b/net/core/page_pool.c > @@ -49,6 +49,12 @@ static int page_pool_init(struct page_pool *pool, > * which is the XDP_TX use-case. > */ > if (pool->p.flags & PP_FLAG_DMA_MAP) { > + /* DMA-mapping is not supported on 32-bit systems with > + * 64-bit DMA mapping. > + */ > + if (sizeof(dma_addr_t) > sizeof(unsigned long)) > + return -EINVAL; > + > if ((pool->p.dma_dir != DMA_FROM_DEVICE) && > (pool->p.dma_dir != DMA_BIDIRECTIONAL)) > return -EINVAL; > @@ -69,10 +75,6 @@ static int page_pool_init(struct page_pool *pool, > */ > } > > - if (PAGE_POOL_DMA_USE_PP_FRAG_COUNT && > - pool->p.flags & PP_FLAG_PAGE_FRAG) > - return -EINVAL; > - > if (ptr_ring_init(&pool->ring, ring_qsize, GFP_KERNEL) < 0) > return -ENOMEM; > > -- > 2.33.0 > Reviewed-by: Ilias Apalodimas <ilias.apalodimas@...aro.org>
Powered by blists - more mailing lists