OpenCloudOS-Kernel/drivers/infiniband/ulp/ipoib
Aaron Knister 816e846c2e IB/ipoib: Avoid a race condition between start_xmit and cm_rep_handler
Inside of start_xmit() the call to check if the connection is up and the
queueing of the packets for later transmission is not atomic which leaves
a window where cm_rep_handler can run, set the connection up, dequeue
pending packets and leave the subsequently queued packets by start_xmit()
sitting on neigh->queue until they're dropped when the connection is torn
down. This only applies to connected mode. These dropped packets can
really upset TCP, for example, and cause multi-minute delays in
transmission for open connections.

Here's the code in start_xmit where we check to see if the connection is
up:

       if (ipoib_cm_get(neigh)) {
               if (ipoib_cm_up(neigh)) {
                       ipoib_cm_send(dev, skb, ipoib_cm_get(neigh));
                       goto unref;
               }
       }

The race occurs if cm_rep_handler execution occurs after the above
connection check (specifically if it gets to the point where it acquires
priv->lock to dequeue pending skb's) but before the below code snippet in
start_xmit where packets are queued.

       if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
               push_pseudo_header(skb, phdr->hwaddr);
               spin_lock_irqsave(&priv->lock, flags);
               __skb_queue_tail(&neigh->queue, skb);
               spin_unlock_irqrestore(&priv->lock, flags);
       } else {
               ++dev->stats.tx_dropped;
               dev_kfree_skb_any(skb);
       }

The patch acquires the netif tx lock in cm_rep_handler for the section
where it sets the connection up and dequeues and retransmits deferred
skb's.

Fixes: 839fcaba35 ("IPoIB: Connected mode experimental support")
Cc: stable@vger.kernel.org
Signed-off-by: Aaron Knister <aaron.s.knister@nasa.gov>
Tested-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
2018-09-05 15:32:06 -06:00
..
Kconfig kconfig: rename CONFIG_EMBEDDED to CONFIG_EXPERT 2011-01-20 17:02:05 -08:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ipoib.h IB/ipoib: Do not remove child devices from within the ndo_uninit 2018-08-02 20:27:43 -06:00
ipoib_cm.c IB/ipoib: Avoid a race condition between start_xmit and cm_rep_handler 2018-09-05 15:32:06 -06:00
ipoib_ethtool.c RDMA: Fix return code check in rdma_set_cq_moderation 2018-07-31 17:03:46 -06:00
ipoib_fs.c RDMA/ipoib: Fix use of sizeof() 2018-07-09 12:02:42 -06:00
ipoib_ib.c IB/IPoIB: Simplify ib_post_(send|recv|srq_recv)() calls 2018-07-24 16:06:36 -06:00
ipoib_main.c IB/ipoib: Maintain the child_intfs list from ndo_init/uninit 2018-08-02 20:27:44 -06:00
ipoib_multicast.c IB/IPoIB: Set ah valid flag in multicast send flow 2018-08-01 15:23:03 -06:00
ipoib_netlink.c IB/ipoib: Consolidate checking of the proposed child interface 2018-08-02 20:27:44 -06:00
ipoib_verbs.c RDMA/ipoib: Fix return code from ipoib_cm_dev_init 2018-07-09 15:19:08 -06:00
ipoib_vlan.c IB/ipoib: Consolidate checking of the proposed child interface 2018-08-02 20:27:44 -06:00