Thread (32 messages) 32 messages, 4 authors, 2023-08-29

Re: [PATCH net-next v7 1/6] page_pool: frag API support for 32-bit arch with 64-bit DMA

From: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Date: 2023-08-18 06:13:39
Also in: lkml

On Fri, 18 Aug 2023 at 02:57, Jakub Kicinski [off-list ref] wrote:
On Thu, 17 Aug 2023 19:59:37 +0300 Ilias Apalodimas wrote:
quoted
quoted
Can we assume the DMA mapping of page pool is page aligned? We should
be, right?
Yes
quoted
That means we're storing 12 bits of 0 at the lower end.
So even with 32b of space we can easily store addresses for 32b+12b =>
16TB of memory. "Ought to be enough" to paraphrase Bill G, and the
problem is only in our heads?
Do you mean moving the pp_frag_count there?
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;
};

So, on 32bit platforms with 64bit dma we can't support a frag count at all.
We could either use the lower 12 bits (and have support for 4096 frags
'only') or do what you suggest.
TBH I don't love any of these and since those platforms are rare (or
at least that's what I think), I prefer not supporting them at all.
quoted
I was questioning the need to have PP_FLAG_PAGE_SPLIT_IN_DRIVER
overall.  With Yunshengs patches such a platform would allocate a
page, so why should we prevent it from splitting it internally?
Splitting it is fine, the problem is that the refcount AKA
page->pp_frag_count** counts outstanding PP-aware references
and page->refcount counts PP-unaware references.

If we want to use page->refcount directly we'd need to unmap
the page whenever drivers calls page_pool_defrag_page().
But the driver may assume the page is still mapped afterwards.
What I am suggesting here is to not add the new
PP_FLAG_PAGE_SPLIT_IN_DRIVER flag.  If a driver wants to split pages
internally it should create a pool without
PP_FLAG_DMA_SYNC_DEV to begin with.  The only responsibility the
driver would have is to elevate the page refcnt so page pool would not
try to free/recycle it.  Since it won't be able to allocate fragments
we don't have to worry about the rest.
We can change the API to make this behavior explicit. Although
IMHO that's putting the burden of rare platforms on non-rare
platforms which we should avoid.
Yep, agree here.
** I said it before and I will keep saying this until someone gets
   angry at me - I really think we should rename this field because
   the association with frags is a coincidence.
I had similar confusions everytime I had to re-read our code hence git
show 4d4266e3fd32
Any suggestions?

Thanks
/Ilias
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help