On Wed, 10 Jul 2024 00:17:38 +0000 Mina Almasry wrote:
@@ -68,17 +107,103 @@ static inline netmem_ref page_to_netmem(struct page *page) static inline int netmem_ref_count(netmem_ref netmem) {
- /* The non-pp refcount of net_iov is always 1. On net_iov, we only
* support pp refcounting which uses the pp_ref_count field.
*/
- if (netmem_is_net_iov(netmem))
return 1;
- return page_ref_count(netmem_to_page(netmem));
}
How can this work if we had to revert the patch which made all of the networking stack take pp-aware refs? Maybe we should add the refcount, and let it be bumped, but WARN() if the net_iov is released with refcount other than 1? Or we need a very solid explanation why the conversion had to be reverted and this is fine.
static inline unsigned long netmem_to_pfn(netmem_ref netmem) {
- if (netmem_is_net_iov(netmem))
return 0;
- return page_to_pfn(netmem_to_page(netmem));
}
Can we move this out and rename it to netmem_pfn_trace() ? Silently returning 0 is not generally okay, but since it's only for tracing we don't care.
+static inline struct net_iov *__netmem_clear_lsb(netmem_ref netmem) +{
- return (struct net_iov *)((__force unsigned long)netmem & ~NET_IOV);
+}
+static inline unsigned long netmem_get_pp_magic(netmem_ref netmem) +{
- return __netmem_clear_lsb(netmem)->pp_magic;
+}
+static inline void netmem_or_pp_magic(netmem_ref netmem, unsigned long pp_magic) +{
- __netmem_clear_lsb(netmem)->pp_magic |= pp_magic;
+}
+static inline void netmem_clear_pp_magic(netmem_ref netmem) +{
- __netmem_clear_lsb(netmem)->pp_magic = 0;
+}
+static inline struct page_pool *netmem_get_pp(netmem_ref netmem) +{
- return __netmem_clear_lsb(netmem)->pp;
+}
+static inline void netmem_set_pp(netmem_ref netmem, struct page_pool *pool) +{
- __netmem_clear_lsb(netmem)->pp = pool;
+}
Why is all this stuff in the main header? It's really low level. Please put helpers which are only used by the core in a header under net/core/, like net/core/dev.h