gro: avoid checking for a failed search
After searching for a protocol handler in dev_gro_receive, checking for failure is redundant. Skip the failure code after finding the corresponding handler. Suggested-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Richard Gobert <richardbgobert@gmail.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Link: https://lore.kernel.org/r/20221108123320.GA59373@debian Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Родитель
e29edc475f
Коммит
e081ecf084
|
@ -489,45 +489,45 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff
|
|||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(ptype, head, list) {
|
||||
if (ptype->type != type || !ptype->callbacks.gro_receive)
|
||||
continue;
|
||||
|
||||
skb_set_network_header(skb, skb_gro_offset(skb));
|
||||
skb_reset_mac_len(skb);
|
||||
BUILD_BUG_ON(sizeof_field(struct napi_gro_cb, zeroed) != sizeof(u32));
|
||||
BUILD_BUG_ON(!IS_ALIGNED(offsetof(struct napi_gro_cb, zeroed),
|
||||
sizeof(u32))); /* Avoid slow unaligned acc */
|
||||
*(u32 *)&NAPI_GRO_CB(skb)->zeroed = 0;
|
||||
NAPI_GRO_CB(skb)->flush = skb_has_frag_list(skb);
|
||||
NAPI_GRO_CB(skb)->is_atomic = 1;
|
||||
NAPI_GRO_CB(skb)->count = 1;
|
||||
if (unlikely(skb_is_gso(skb))) {
|
||||
NAPI_GRO_CB(skb)->count = skb_shinfo(skb)->gso_segs;
|
||||
/* Only support TCP at the moment. */
|
||||
if (!skb_is_gso_tcp(skb))
|
||||
NAPI_GRO_CB(skb)->flush = 1;
|
||||
}
|
||||
|
||||
/* Setup for GRO checksum validation */
|
||||
switch (skb->ip_summed) {
|
||||
case CHECKSUM_COMPLETE:
|
||||
NAPI_GRO_CB(skb)->csum = skb->csum;
|
||||
NAPI_GRO_CB(skb)->csum_valid = 1;
|
||||
break;
|
||||
case CHECKSUM_UNNECESSARY:
|
||||
NAPI_GRO_CB(skb)->csum_cnt = skb->csum_level + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
pp = INDIRECT_CALL_INET(ptype->callbacks.gro_receive,
|
||||
ipv6_gro_receive, inet_gro_receive,
|
||||
&gro_list->list, skb);
|
||||
break;
|
||||
if (ptype->type == type && ptype->callbacks.gro_receive)
|
||||
goto found_ptype;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
goto normal;
|
||||
|
||||
if (&ptype->list == head)
|
||||
goto normal;
|
||||
found_ptype:
|
||||
skb_set_network_header(skb, skb_gro_offset(skb));
|
||||
skb_reset_mac_len(skb);
|
||||
BUILD_BUG_ON(sizeof_field(struct napi_gro_cb, zeroed) != sizeof(u32));
|
||||
BUILD_BUG_ON(!IS_ALIGNED(offsetof(struct napi_gro_cb, zeroed),
|
||||
sizeof(u32))); /* Avoid slow unaligned acc */
|
||||
*(u32 *)&NAPI_GRO_CB(skb)->zeroed = 0;
|
||||
NAPI_GRO_CB(skb)->flush = skb_has_frag_list(skb);
|
||||
NAPI_GRO_CB(skb)->is_atomic = 1;
|
||||
NAPI_GRO_CB(skb)->count = 1;
|
||||
if (unlikely(skb_is_gso(skb))) {
|
||||
NAPI_GRO_CB(skb)->count = skb_shinfo(skb)->gso_segs;
|
||||
/* Only support TCP at the moment. */
|
||||
if (!skb_is_gso_tcp(skb))
|
||||
NAPI_GRO_CB(skb)->flush = 1;
|
||||
}
|
||||
|
||||
/* Setup for GRO checksum validation */
|
||||
switch (skb->ip_summed) {
|
||||
case CHECKSUM_COMPLETE:
|
||||
NAPI_GRO_CB(skb)->csum = skb->csum;
|
||||
NAPI_GRO_CB(skb)->csum_valid = 1;
|
||||
break;
|
||||
case CHECKSUM_UNNECESSARY:
|
||||
NAPI_GRO_CB(skb)->csum_cnt = skb->csum_level + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
pp = INDIRECT_CALL_INET(ptype->callbacks.gro_receive,
|
||||
ipv6_gro_receive, inet_gro_receive,
|
||||
&gro_list->list, skb);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
if (PTR_ERR(pp) == -EINPROGRESS) {
|
||||
ret = GRO_CONSUMED;
|
||||
|
|
Загрузка…
Ссылка в новой задаче