Re: [PATCH net-next v5 2/2] page_pool: Track DMA-mapped pages and unmap them when destroying the pool

Yunsheng Lin
2025-04-01T09:24:46Z

On 2025/4/1 1:27, Zhu Yanjun wrote:
> 在 2025/3/31 18:35, Alexander Lobakin 写道:
>> From: Toke Høiland-Jørgensen <toke@redhat.com>
>> Date: Fri, 28 Mar 2025 13:19:09 +0100
>>
>>> When enabling DMA mapping in page_pool, pages are kept DMA mapped until
>>> they are released from the pool, to avoid the overhead of re-mapping the
>>> pages every time they are used. This causes resource leaks and/or
>>> crashes when there are pages still outstanding while the device is torn
>>> down, because page_pool will attempt an unmap through a non-existent DMA
>>> device on the subsequent page return.
>>
>> [...]
>>
>>> @@ -173,10 +212,10 @@ struct page_pool {
>>>       int cpuid;
>>>       u32 pages_state_hold_cnt;
>>>   -    bool has_init_callback:1;    /* slow::init_callback is set */
>>> +    bool dma_sync;            /* Perform DMA sync for device */
>>
>> Have you seen my comment under v3 (sorry but I missed that there was v4
>> already)? Can't we just test the bit atomically?
>
> Perhaps test_bit series functions can test the bit atomically. Maybe there are more good options about this testing the bit atomically. But test_bit should implement the task that tests the bit atomically.

There are two reading of dma_sync in this patch, the first reading is not
under rcu read lock and doing the reading without READ_ONCE(), the second
reading is under rcu read lock and do the reading with READ_ONCE().

The first one seems an optimization to avoid taking the rcu read lock,
why might need READ_ONCE() to make KCSAN happy if we do care about making
KCSAN happy.

The second one does not seems to need the atomicity by using the READ_ONCE()
as it is always under RCU read lock(implicit or explicit one), and there is
a rcu sync after the clearing of that bit.