From: Jakub Kicinski <kuba@kernel.org>
To: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Cc: Mina Almasry <almasrymina@google.com>,
Yunsheng Lin <linyunsheng@huawei.com>,
davem@davemloft.net, pabeni@redhat.com, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org,
Lorenzo Bianconi <lorenzo@kernel.org>,
Alexander Duyck <alexander.duyck@gmail.com>,
Liang Chen <liangchen.linux@gmail.com>,
Alexander Lobakin <aleksander.lobakin@intel.com>,
Saeed Mahameed <saeedm@nvidia.com>,
Leon Romanovsky <leon@kernel.org>,
Eric Dumazet <edumazet@google.com>,
Jesper Dangaard Brouer <hawk@kernel.org>
Subject: Re: [PATCH net-next v7 1/6] page_pool: frag API support for 32-bit arch with 64-bit DMA
Date: Fri, 18 Aug 2023 14:51:45 -0700 [thread overview]
Message-ID: <20230818145145.4b357c89@kernel.org> (raw)
In-Reply-To: <CAC_iWjL4YfCOffAZPUun5wggxrqAanjd+8SgmJQN0yyWsvb3sg@mail.gmail.com>
On Fri, 18 Aug 2023 09:12:09 +0300 Ilias Apalodimas wrote:
> > Right, IIUC we don't have enough space to fit dma_addr_t and the
> > refcount, but if we store the dma addr on a shifted u32 instead
> > of using dma_addr_t explicitly - the refcount should fit?
>
> struct page looks like this:
>
> unsigned long dma_addr;
> union {
> unsigned long dma_addr_upper;
> atomic_long_t pp_frag_count;
> };
I could be completely misunderstanding the problem.
Let me show you the diff of what I was thinking more or less.
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 5e74ce4a28cd..58ffa8dc745f 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -126,11 +126,6 @@ struct page {
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.
diff --git a/include/net/page_pool/helpers.h b/include/net/page_pool/helpers.h
index 94231533a369..6f87a0fa2178 100644
--- a/include/net/page_pool/helpers.h
+++ b/include/net/page_pool/helpers.h
@@ -212,16 +212,24 @@ 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;
+ ret <<= PAGE_SHIFT;
return ret;
}
-static inline void page_pool_set_dma_addr(struct page *page, dma_addr_t addr)
+static inline bool page_pool_set_dma_addr(struct page *page, dma_addr_t addr)
{
+ bool failed = false;
+
page->dma_addr = addr;
- if (PAGE_POOL_DMA_USE_PP_FRAG_COUNT)
- page->dma_addr_upper = upper_32_bits(addr);
+ if (PAGE_POOL_DMA_USE_PP_FRAG_COUNT) {
+ page->dma_addr >>= PAGE_SHIFT;
+ /* We assume page alignment to shave off bottom bits,
+ * if this "compression" doesn't work we need to drop.
+ */
+ failed = addr != page->dma_addr << PAGE_SHIFT;
+ }
+ return failed;
}
static inline bool page_pool_put(struct page_pool *pool)
diff --git a/net/core/page_pool.c b/net/core/page_pool.c
index 77cb75e63aca..9ea42e242a89 100644
--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -211,10 +211,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;
-
#ifdef CONFIG_PAGE_POOL_STATS
pool->recycle_stats = alloc_percpu(struct page_pool_recycle_stats);
if (!pool->recycle_stats)
@@ -359,12 +355,19 @@ static bool page_pool_dma_map(struct page_pool *pool, struct page *page)
if (dma_mapping_error(pool->p.dev, dma))
return false;
- page_pool_set_dma_addr(page, dma);
+ if (page_pool_set_dma_addr(page, dma))
+ goto unmap_failed;
if (pool->p.flags & PP_FLAG_DMA_SYNC_DEV)
page_pool_dma_sync_for_device(pool, page, pool->p.max_len);
return true;
+
+unmap_failed:
+ dma_unmap_page_attrs(pool->p.dev, dma,
+ PAGE_SIZE << pool->p.order, pool->p.dma_dir,
+ DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_WEAK_ORDERING);
+ return false;
}
static void page_pool_set_pp_info(struct page_pool *pool,
next prev parent reply other threads:[~2023-08-18 21:52 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-16 10:01 [PATCH net-next v7 0/6] introduce page_pool_alloc() related API Yunsheng Lin
2023-08-16 10:01 ` [PATCH net-next v7 1/6] page_pool: frag API support for 32-bit arch with 64-bit DMA Yunsheng Lin
2023-08-17 13:57 ` Ilias Apalodimas
2023-08-17 16:15 ` Jakub Kicinski
2023-08-17 16:59 ` Ilias Apalodimas
2023-08-17 23:57 ` Jakub Kicinski
2023-08-18 6:12 ` Ilias Apalodimas
2023-08-18 8:59 ` Yunsheng Lin
2023-08-18 21:51 ` Jakub Kicinski [this message]
2023-08-21 8:38 ` Ilias Apalodimas
2023-08-21 11:15 ` Ilias Apalodimas
2023-08-21 12:18 ` Yunsheng Lin
2023-08-21 18:35 ` Jakub Kicinski
2023-08-22 9:21 ` Yunsheng Lin
2023-08-22 15:38 ` Jakub Kicinski
2023-08-22 18:30 ` Alexander Duyck
2023-08-22 18:58 ` Alexander Duyck
2023-08-23 3:03 ` Yunsheng Lin
2023-08-23 14:25 ` Jakub Kicinski
2023-08-23 18:00 ` Alexander Duyck
2023-08-25 9:40 ` Yunsheng Lin
2023-08-26 0:08 ` Jakub Kicinski
2023-08-28 14:50 ` Alexander Duyck
2023-08-28 15:38 ` Jakub Kicinski
2023-08-29 11:58 ` Yunsheng Lin
2023-08-16 10:01 ` [PATCH net-next v7 2/6] page_pool: unify frag_count handling in page_pool_is_last_frag() Yunsheng Lin
2023-08-16 11:30 ` Ilias Apalodimas
2023-08-16 12:42 ` Yunsheng Lin
2023-08-16 10:01 ` [PATCH net-next v7 3/6] page_pool: remove PP_FLAG_PAGE_FRAG Yunsheng Lin
2023-08-16 10:01 ` [PATCH net-next v7 4/6] page_pool: introduce page_pool[_cache]_alloc() API Yunsheng Lin
2023-08-16 10:01 ` [PATCH net-next v7 5/6] page_pool: update document about frag API Yunsheng Lin
2023-08-16 10:01 ` [PATCH net-next v7 6/6] net: veth: use newly added page pool API for veth with xdp Yunsheng Lin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230818145145.4b357c89@kernel.org \
--to=kuba@kernel.org \
--cc=aleksander.lobakin@intel.com \
--cc=alexander.duyck@gmail.com \
--cc=almasrymina@google.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=hawk@kernel.org \
--cc=ilias.apalodimas@linaro.org \
--cc=leon@kernel.org \
--cc=liangchen.linux@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linyunsheng@huawei.com \
--cc=lorenzo@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=saeedm@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox