Commit 627b94f7 authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski
Browse files

gro: remove rcu_read_lock/rcu_read_unlock from gro_complete handlers



All gro_complete() handlers are called from napi_gro_complete()
while rcu_read_lock() has been called.

There is no point stacking more rcu_read_lock()

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent fc1ca334
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -545,13 +545,10 @@ static int geneve_gro_complete(struct sock *sk, struct sk_buff *skb,
	gh_len = geneve_hlen(gh);
	type = gh->proto_type;

	rcu_read_lock();
	ptype = gro_find_complete_by_type(type);
	if (ptype)
		err = ptype->callbacks.gro_complete(skb, nhoff + gh_len);

	rcu_read_unlock();

	skb_set_inner_mac_header(skb, nhoff + gh_len);

	return err;
+0 −2
Original line number Diff line number Diff line
@@ -513,14 +513,12 @@ static int vlan_gro_complete(struct sk_buff *skb, int nhoff)
	struct packet_offload *ptype;
	int err = -ENOENT;

	rcu_read_lock();
	ptype = gro_find_complete_by_type(type);
	if (ptype)
		err = INDIRECT_CALL_INET(ptype->callbacks.gro_complete,
					 ipv6_gro_complete, inet_gro_complete,
					 skb, nhoff + sizeof(*vhdr));

	rcu_read_unlock();
	return err;
}

+0 −2
Original line number Diff line number Diff line
@@ -466,14 +466,12 @@ int eth_gro_complete(struct sk_buff *skb, int nhoff)
	if (skb->encapsulation)
		skb_set_inner_mac_header(skb, nhoff);

	rcu_read_lock();
	ptype = gro_find_complete_by_type(type);
	if (ptype != NULL)
		err = INDIRECT_CALL_INET(ptype->callbacks.gro_complete,
					 ipv6_gro_complete, inet_gro_complete,
					 skb, nhoff + sizeof(*eh));

	rcu_read_unlock();
	return err;
}
EXPORT_SYMBOL(eth_gro_complete);
+2 −5
Original line number Diff line number Diff line
@@ -1612,10 +1612,9 @@ int inet_gro_complete(struct sk_buff *skb, int nhoff)
	csum_replace2(&iph->check, iph->tot_len, newlen);
	iph->tot_len = newlen;

	rcu_read_lock();
	ops = rcu_dereference(inet_offloads[proto]);
	if (WARN_ON(!ops || !ops->callbacks.gro_complete))
		goto out_unlock;
		goto out;

	/* Only need to add sizeof(*iph) to get to the next hdr below
	 * because any hdr with option will have been flushed in
@@ -1625,9 +1624,7 @@ int inet_gro_complete(struct sk_buff *skb, int nhoff)
			      tcp4_gro_complete, udp4_gro_complete,
			      skb, nhoff + sizeof(*iph));

out_unlock:
	rcu_read_unlock();

out:
	return err;
}

+4 −9
Original line number Diff line number Diff line
@@ -266,19 +266,16 @@ static int fou_gro_complete(struct sock *sk, struct sk_buff *skb,
	const struct net_offload *ops;
	int err = -ENOSYS;

	rcu_read_lock();
	offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
	ops = rcu_dereference(offloads[proto]);
	if (WARN_ON(!ops || !ops->callbacks.gro_complete))
		goto out_unlock;
		goto out;

	err = ops->callbacks.gro_complete(skb, nhoff);

	skb_set_inner_mac_header(skb, nhoff);

out_unlock:
	rcu_read_unlock();

out:
	return err;
}

@@ -480,18 +477,16 @@ static int gue_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff)
		return err;
	}

	rcu_read_lock();
	offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
	ops = rcu_dereference(offloads[proto]);
	if (WARN_ON(!ops || !ops->callbacks.gro_complete))
		goto out_unlock;
		goto out;

	err = ops->callbacks.gro_complete(skb, nhoff + guehlen);

	skb_set_inner_mac_header(skb, nhoff + guehlen);

out_unlock:
	rcu_read_unlock();
out:
	return err;
}

Loading