Commit cf1a1e07 authored by Paolo Abeni's avatar Paolo Abeni Committed by David S. Miller

tun: do not compute the rxhash, if not needed

Currently, the tun driver, in absence of an eBPF steering program,
always compute the rxhash in its rx path, even when such value
is later unused due to additional checks (

This changeset moves the all the related checks just before the
__skb_get_hash_symmetric(), so that the latter is no more computed
when unneeded.

Also replace an unneeded RCU section with rcu_access_pointer().
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 49621865
...@@ -525,11 +525,6 @@ static void tun_flow_update(struct tun_struct *tun, u32 rxhash, ...@@ -525,11 +525,6 @@ static void tun_flow_update(struct tun_struct *tun, u32 rxhash,
rcu_read_lock(); rcu_read_lock();
/* We may get a very small possibility of OOO during switching, not
* worth to optimize.*/
if (tun->numqueues == 1 || tfile->detached)
goto unlock;
e = tun_flow_find(head, rxhash); e = tun_flow_find(head, rxhash);
if (likely(e)) { if (likely(e)) {
/* TODO: keep queueing to old queue until it's empty? */ /* TODO: keep queueing to old queue until it's empty? */
...@@ -548,7 +543,6 @@ static void tun_flow_update(struct tun_struct *tun, u32 rxhash, ...@@ -548,7 +543,6 @@ static void tun_flow_update(struct tun_struct *tun, u32 rxhash,
spin_unlock_bh(&tun->lock); spin_unlock_bh(&tun->lock);
} }
unlock:
rcu_read_unlock(); rcu_read_unlock();
} }
...@@ -1937,10 +1931,13 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, ...@@ -1937,10 +1931,13 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
rcu_read_unlock(); rcu_read_unlock();
} }
rcu_read_lock(); /* Compute the costly rx hash only if needed for flow updates.
if (!rcu_dereference(tun->steering_prog)) * We may get a very small possibility of OOO during switching, not
* worth to optimize.
*/
if (!rcu_access_pointer(tun->steering_prog) && tun->numqueues > 1 &&
!tfile->detached)
rxhash = __skb_get_hash_symmetric(skb); rxhash = __skb_get_hash_symmetric(skb);
rcu_read_unlock();
if (frags) { if (frags) {
/* Exercise flow dissector code path. */ /* Exercise flow dissector code path. */
......
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