lkml.org 
[lkml]   [2019]   [Mar]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 024/135] xen-netback: dont populate the hash cache on XenBus disconnect
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Igor Druzhinin <igor.druzhinin@citrix.com>

    [ Upstream commit a2288d4e355992d369c50c45d017a85f6061ff71 ]

    Occasionally, during the disconnection procedure on XenBus which
    includes hash cache deinitialization there might be some packets
    still in-flight on other processors. Handling of these packets includes
    hashing and hash cache population that finally results in hash cache
    data structure corruption.

    In order to avoid this we prevent hashing of those packets if there
    are no queues initialized. In that case RCU protection of queues guards
    the hash cache as well.

    Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
    Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/xen-netback/hash.c | 2 ++
    drivers/net/xen-netback/interface.c | 7 +++++++
    2 files changed, 9 insertions(+)

    --- a/drivers/net/xen-netback/hash.c
    +++ b/drivers/net/xen-netback/hash.c
    @@ -435,6 +435,8 @@ void xenvif_init_hash(struct xenvif *vif
    if (xenvif_hash_cache_size == 0)
    return;

    + BUG_ON(vif->hash.cache.count);
    +
    spin_lock_init(&vif->hash.cache.lock);
    INIT_LIST_HEAD(&vif->hash.cache.list);
    }
    --- a/drivers/net/xen-netback/interface.c
    +++ b/drivers/net/xen-netback/interface.c
    @@ -153,6 +153,13 @@ static u16 xenvif_select_queue(struct ne
    {
    struct xenvif *vif = netdev_priv(dev);
    unsigned int size = vif->hash.size;
    + unsigned int num_queues;
    +
    + /* If queues are not set up internally - always return 0
    + * as the packet going to be dropped anyway */
    + num_queues = READ_ONCE(vif->num_queues);
    + if (num_queues < 1)
    + return 0;

    if (vif->hash.alg == XEN_NETIF_CTRL_HASH_ALGORITHM_NONE)
    return fallback(dev, skb) % dev->real_num_tx_queues;

    \
     
     \ /
      Last update: 2019-03-12 18:43    [W:4.315 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site