Message ID | 20221025135958.6242-4-aaptel@nvidia.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | nvme-tcp receive offloads | expand |
Any reason to not just fold netdev_sk_get_lowest_dev into get_netdev_for_sock? diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index eddf8ee270e74..10f47b157c683 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3040,8 +3040,7 @@ int init_dummy_netdev(struct net_device *dev); struct net_device *netdev_get_xmit_slave(struct net_device *dev, struct sk_buff *skb, bool all_slaves); -struct net_device *netdev_sk_get_lowest_dev(struct net_device *dev, - struct sock *sk); +struct net_device *get_netdev_for_sock(struct sock *sk); struct net_device *dev_get_by_index(struct net *net, int ifindex); struct net_device *__dev_get_by_index(struct net *net, int ifindex); struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex); diff --git a/net/core/dev.c b/net/core/dev.c index 3be256051e99b..c180773e3dfd4 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -8165,27 +8165,27 @@ static struct net_device *netdev_sk_get_lower_dev(struct net_device *dev, } /** - * netdev_sk_get_lowest_dev - Get the lowest device in chain given device and socket - * @dev: device + * netdev_sk_get_lowest_dev - Get the lowest device in socket * @sk: the socket * - * %NULL is returned if no lower device is found. + * Assumes that the socket is already connected. + * Returns the lower device or %NULL if no lower device is found. */ - -struct net_device *netdev_sk_get_lowest_dev(struct net_device *dev, - struct sock *sk) +struct net_device *get_netdev_for_sock(struct sock *sk) { - struct net_device *lower; + struct dst_entry *dst = sk_dst_get(sk); + struct net_device *dev, *lower; - lower = netdev_sk_get_lower_dev(dev, sk); - while (lower) { + if (unlikely(!dst)) + return NULL; + dev = dst->dev; + while ((lower = netdev_sk_get_lower_dev(dev, sk))) dev = lower; - lower = netdev_sk_get_lower_dev(dev, sk); - } - + dev_hold(dev); + dst_release(dst); return dev; } -EXPORT_SYMBOL(netdev_sk_get_lowest_dev); +EXPORT_SYMBOL_GPL(get_netdev_for_sock); static void netdev_adjacent_add_links(struct net_device *dev) { diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c index a03d66046ca32..1eb92dab4f34f 100644 --- a/net/tls/tls_device.c +++ b/net/tls/tls_device.c @@ -120,22 +120,6 @@ static void tls_device_queue_ctx_destruction(struct tls_context *ctx) tls_device_free_ctx(ctx); } -/* We assume that the socket is already connected */ -static struct net_device *get_netdev_for_sock(struct sock *sk) -{ - struct dst_entry *dst = sk_dst_get(sk); - struct net_device *netdev = NULL; - - if (likely(dst)) { - netdev = netdev_sk_get_lowest_dev(dst->dev, sk); - dev_hold(netdev); - } - - dst_release(dst); - - return netdev; -} - static void destroy_record(struct tls_record_info *record) { int i;
Hi Christoph, Christoph Hellwig <hch@lst.de> writes: > Any reason to not just fold netdev_sk_get_lowest_dev into > get_netdev_for_sock? Thanks, we will use this. Could I add you as Suggested-by?
On Wed, Oct 26, 2022 at 06:55:24PM +0300, Aurelien Aptel wrote: > Hi Christoph, > > Christoph Hellwig <hch@lst.de> writes: > > Any reason to not just fold netdev_sk_get_lowest_dev into > > get_netdev_for_sock? > > Thanks, we will use this. > Could I add you as Suggested-by? Sure.
diff --git a/include/net/sock.h b/include/net/sock.h index 928bb601fd8f..7928680f4bbd 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -2962,6 +2962,29 @@ int sock_get_timeout(long timeo, void *optval, bool old_timeval); int sock_copy_user_timeval(struct __kernel_sock_timeval *tv, sockptr_t optval, int optlen, bool old_timeval); +/** + * get_netdev_for_sock() - get net_device from a connected socket. + * @sk: Connected socket. + * + * get_netdev_for_sock() is a utility that is used to obtain the net_device + * structure from a connected socket. This function assumes that the socket + * is already connected. This function is used by TLS and ULP DDP offloads. + */ +static inline struct net_device *get_netdev_for_sock(struct sock *sk) +{ + struct dst_entry *dst = sk_dst_get(sk); + struct net_device *netdev = NULL; + + if (likely(dst)) { + netdev = netdev_sk_get_lowest_dev(dst->dev, sk); + dev_hold(netdev); + } + + dst_release(dst); + + return netdev; +} + static inline bool sk_is_readable(struct sock *sk) { if (sk->sk_prot->sock_is_readable) diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c index a03d66046ca3..1eb92dab4f34 100644 --- a/net/tls/tls_device.c +++ b/net/tls/tls_device.c @@ -120,22 +120,6 @@ static void tls_device_queue_ctx_destruction(struct tls_context *ctx) tls_device_free_ctx(ctx); } -/* We assume that the socket is already connected */ -static struct net_device *get_netdev_for_sock(struct sock *sk) -{ - struct dst_entry *dst = sk_dst_get(sk); - struct net_device *netdev = NULL; - - if (likely(dst)) { - netdev = netdev_sk_get_lowest_dev(dst->dev, sk); - dev_hold(netdev); - } - - dst_release(dst); - - return netdev; -} - static void destroy_record(struct tls_record_info *record) { int i;