Commit 62b1a8ab authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

net: remove skb_orphan_try()

Orphaning skb in dev_hard_start_xmit() makes bonding behavior
unfriendly for applications sending big UDP bursts : Once packets
pass the bonding device and come to real device, they might hit a full
qdisc and be dropped. Without orphaning, the sender is automatically
throttled because sk->sk_wmemalloc reaches sk->sk_sndbuf (assuming
sk_sndbuf is not too big)

We could try to defer the orphaning adding another test in
dev_hard_start_xmit(), but all this seems of little gain,
now that BQL tends to make packets more likely to be parked
in Qdisc queues instead of NIC TX ring, in cases where performance
matters.

Reverts commits :
fc6055a5 net: Introduce skb_orphan_try()
87fd308c net: skb_tx_hash() fix relative to skb_orphan_try()
and removes SKBTX_DRV_NEEDS_SK_REF flag
Reported-and-bisected-by: default avatarJean-Michel Hautbois <jhautbois@gmail.com>
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Tested-by: default avatarOliver Hartkopp <socketcan@hartkopp.net>
Acked-by: default avatarOliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bc14786a
...@@ -225,14 +225,11 @@ enum { ...@@ -225,14 +225,11 @@ enum {
/* device driver is going to provide hardware time stamp */ /* device driver is going to provide hardware time stamp */
SKBTX_IN_PROGRESS = 1 << 2, SKBTX_IN_PROGRESS = 1 << 2,
/* ensure the originating sk reference is available on driver level */
SKBTX_DRV_NEEDS_SK_REF = 1 << 3,
/* device driver supports TX zero-copy buffers */ /* device driver supports TX zero-copy buffers */
SKBTX_DEV_ZEROCOPY = 1 << 4, SKBTX_DEV_ZEROCOPY = 1 << 3,
/* generate wifi status information (where possible) */ /* generate wifi status information (where possible) */
SKBTX_WIFI_STATUS = 1 << 5, SKBTX_WIFI_STATUS = 1 << 4,
}; };
/* /*
......
...@@ -681,9 +681,6 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock, ...@@ -681,9 +681,6 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
if (err < 0) if (err < 0)
goto free_skb; goto free_skb;
/* to be able to check the received tx sock reference in raw_rcv() */
skb_shinfo(skb)->tx_flags |= SKBTX_DRV_NEEDS_SK_REF;
skb->dev = dev; skb->dev = dev;
skb->sk = sk; skb->sk = sk;
......
...@@ -2089,25 +2089,6 @@ static int dev_gso_segment(struct sk_buff *skb, netdev_features_t features) ...@@ -2089,25 +2089,6 @@ static int dev_gso_segment(struct sk_buff *skb, netdev_features_t features)
return 0; return 0;
} }
/*
* Try to orphan skb early, right before transmission by the device.
* We cannot orphan skb if tx timestamp is requested or the sk-reference
* is needed on driver level for other reasons, e.g. see net/can/raw.c
*/
static inline void skb_orphan_try(struct sk_buff *skb)
{
struct sock *sk = skb->sk;
if (sk && !skb_shinfo(skb)->tx_flags) {
/* skb_tx_hash() wont be able to get sk.
* We copy sk_hash into skb->rxhash
*/
if (!skb->rxhash)
skb->rxhash = sk->sk_hash;
skb_orphan(skb);
}
}
static bool can_checksum_protocol(netdev_features_t features, __be16 protocol) static bool can_checksum_protocol(netdev_features_t features, __be16 protocol)
{ {
return ((features & NETIF_F_GEN_CSUM) || return ((features & NETIF_F_GEN_CSUM) ||
...@@ -2193,8 +2174,6 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, ...@@ -2193,8 +2174,6 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
if (!list_empty(&ptype_all)) if (!list_empty(&ptype_all))
dev_queue_xmit_nit(skb, dev); dev_queue_xmit_nit(skb, dev);
skb_orphan_try(skb);
features = netif_skb_features(skb); features = netif_skb_features(skb);
if (vlan_tx_tag_present(skb) && if (vlan_tx_tag_present(skb) &&
...@@ -2304,7 +2283,7 @@ u16 __skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb, ...@@ -2304,7 +2283,7 @@ u16 __skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb,
if (skb->sk && skb->sk->sk_hash) if (skb->sk && skb->sk->sk_hash)
hash = skb->sk->sk_hash; hash = skb->sk->sk_hash;
else else
hash = (__force u16) skb->protocol ^ skb->rxhash; hash = (__force u16) skb->protocol;
hash = jhash_1word(hash, hashrnd); hash = jhash_1word(hash, hashrnd);
return (u16) (((u64) hash * qcount) >> 32) + qoffset; return (u16) (((u64) hash * qcount) >> 32) + qoffset;
......
...@@ -372,7 +372,6 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock, ...@@ -372,7 +372,6 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
skb_trim(skb, skb->dev->mtu); skb_trim(skb, skb->dev->mtu);
} }
skb->protocol = ETH_P_AF_IUCV; skb->protocol = ETH_P_AF_IUCV;
skb_shinfo(skb)->tx_flags |= SKBTX_DRV_NEEDS_SK_REF;
nskb = skb_clone(skb, GFP_ATOMIC); nskb = skb_clone(skb, GFP_ATOMIC);
if (!nskb) if (!nskb)
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment