Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23542618 authored by KOVACS Krisztian's avatar KOVACS Krisztian Committed by David S. Miller
Browse files

inet: Don't lookup the socket if there's a socket attached to the skb



Use the socket cached in the skb if it's present.

Signed-off-by: default avatarKOVACS Krisztian <hidden@sch.bme.hu>
Acked-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 607c4aaf
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -96,7 +96,11 @@ static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo,
					      const __be16 sport,
					      const __be16 dport)
{
	return __inet6_lookup(dev_net(skb->dst->dev), hashinfo,
	struct sock *sk;

	if (unlikely(sk = skb_steal_sock(skb)))
		return sk;
	else return __inet6_lookup(dev_net(skb->dst->dev), hashinfo,
				   &ipv6_hdr(skb)->saddr, sport,
				   &ipv6_hdr(skb)->daddr, ntohs(dport),
				   inet6_iif(skb));
+7 −3
Original line number Diff line number Diff line
@@ -378,8 +378,12 @@ static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo,
					     const __be16 sport,
					     const __be16 dport)
{
	struct sock *sk;
	const struct iphdr *iph = ip_hdr(skb);

	if (unlikely(sk = skb_steal_sock(skb)))
		return sk;
	else
		return __inet_lookup(dev_net(skb->dst->dev), hashinfo,
				     iph->saddr, sport,
				     iph->daddr, dport, inet_iif(skb));
+12 −0
Original line number Diff line number Diff line
@@ -1324,6 +1324,18 @@ static inline void sk_change_net(struct sock *sk, struct net *net)
	sock_net_set(sk, hold_net(net));
}

static inline struct sock *skb_steal_sock(struct sk_buff *skb)
{
	if (unlikely(skb->sk)) {
		struct sock *sk = skb->sk;

		skb->destructor = NULL;
		skb->sk = NULL;
		return sk;
	}
	return NULL;
}

extern void sock_enable_timestamp(struct sock *sk);
extern int sock_get_timestamp(struct sock *, struct timeval __user *);
extern int sock_get_timestampns(struct sock *, struct timespec __user *);
+7 −3
Original line number Diff line number Diff line
@@ -306,8 +306,12 @@ static inline struct sock *__udp4_lib_lookup_skb(struct sk_buff *skb,
						 __be16 sport, __be16 dport,
						 struct hlist_head udptable[])
{
	struct sock *sk;
	const struct iphdr *iph = ip_hdr(skb);

	if (unlikely(sk = skb_steal_sock(skb)))
		return sk;
	else
		return __udp4_lib_lookup(dev_net(skb->dst->dev), iph->saddr, sport,
					 iph->daddr, dport, inet_iif(skb),
					 udptable);
+7 −3
Original line number Diff line number Diff line
@@ -111,8 +111,12 @@ static struct sock *__udp6_lib_lookup_skb(struct sk_buff *skb,
					  __be16 sport, __be16 dport,
					  struct hlist_head udptable[])
{
	struct sock *sk;
	struct ipv6hdr *iph = ipv6_hdr(skb);

	if (unlikely(sk = skb_steal_sock(skb)))
		return sk;
	else
		return __udp6_lib_lookup(dev_net(skb->dst->dev), &iph->saddr, sport,
					 &iph->daddr, dport, inet6_iif(skb),
					 udptable);