]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: prepare for non devmem TCP memory providers
authorPavel Begunkov <asml.silence@gmail.com>
Tue, 4 Feb 2025 21:56:19 +0000 (13:56 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 7 Feb 2025 00:27:31 +0000 (16:27 -0800)
There is a good bunch of places in generic paths assuming that the only
page pool memory provider is devmem TCP. As we want to reuse the net_iov
and provider infrastructure, we need to patch it up and explicitly check
the provider type when we branch into devmem TCP code.

Reviewed-by: Mina Almasry <almasrymina@google.com>
Reviewed-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: David Wei <dw@davidwei.uk>
Link: https://patch.msgid.link/20250204215622.695511-9-dw@davidwei.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/devmem.c
net/core/devmem.h
net/ipv4/tcp.c

index cbac6419fcc4402c82e39df4cf5068ba3b037486..7c6e0b5b6acb55f376ec725dfb71d1f70a4320c3 100644 (file)
@@ -30,6 +30,11 @@ static DEFINE_XARRAY_FLAGS(net_devmem_dmabuf_bindings, XA_FLAGS_ALLOC1);
 
 static const struct memory_provider_ops dmabuf_devmem_ops;
 
+bool net_is_devmem_iov(struct net_iov *niov)
+{
+       return niov->pp->mp_ops == &dmabuf_devmem_ops;
+}
+
 static void net_devmem_dmabuf_free_chunk_owner(struct gen_pool *genpool,
                                               struct gen_pool_chunk *chunk,
                                               void *not_used)
index 8e999fe2ae673c007d4cb9f452f574b3b1090fcd..7fc158d527293b42e59755dbbac20cef96bb39ee 100644 (file)
@@ -115,6 +115,8 @@ struct net_iov *
 net_devmem_alloc_dmabuf(struct net_devmem_dmabuf_binding *binding);
 void net_devmem_free_dmabuf(struct net_iov *ppiov);
 
+bool net_is_devmem_iov(struct net_iov *niov);
+
 #else
 struct net_devmem_dmabuf_binding;
 
@@ -163,6 +165,11 @@ static inline u32 net_devmem_iov_binding_id(const struct net_iov *niov)
 {
        return 0;
 }
+
+static inline bool net_is_devmem_iov(struct net_iov *niov)
+{
+       return false;
+}
 #endif
 
 #endif /* _NET_DEVMEM_H */
index b872de9a8271b2ef18bcc2c3db0895898b6ec3f8..7f43d31c9400ef450ad6f2124aeb5babc1085499 100644 (file)
@@ -2476,6 +2476,11 @@ static int tcp_recvmsg_dmabuf(struct sock *sk, const struct sk_buff *skb,
                        }
 
                        niov = skb_frag_net_iov(frag);
+                       if (!net_is_devmem_iov(niov)) {
+                               err = -ENODEV;
+                               goto out;
+                       }
+
                        end = start + skb_frag_size(frag);
                        copy = end - offset;