Re: [PATCH] RDMA/ipoib: drop skb on path record lookup failure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Yes, sorry for that, I should have based the patch on wip/dl-for-next.

It looks much better without the new_path variable. But why the else branch with init_path_rec for an existing path is also gone?


On 22/05/18 19:51, Doug Ledford wrote:
On Tue, 2018-05-22 at 16:00 +0200, Evgenii Smirnov wrote:
In unicast_arp_send function there is an inconsistency in error handling
of path_rec_start call. If path_rec_start is called because of an absent
ah field, skb will be dropped. But if it is called on a creation of a new path,
or if the path is invalid, skb will be added to the tail of path queue.
In case of a new path it will be dropped on path_free, but in case
of invalid path it can stay in the queue forever.

This patch unifies the behavior, dropping skb in all cases
of path_rec_start failure.

Signed-off-by: Evgenii Smirnov <evgenii.smirnov@xxxxxxxxxxxxxxxx>

Your patch wouldn't apply (would have needed to be rebased on top of my
final patch).  So, I hand applied your patch, and simplified things even
a little further in the process (if we allocate a new path, just add it
right away and greatly simplify the code path, allowing us to entirely
eliminate the new_path variable and unwind sequences).  Here it is for
review:

commit 5755dd0e647eecaf3c32af858e9ef69db199b0a7 (HEAD -> k.o/wip/dl-for-next)
Author: Evgenii Smirnov <evgenii.smirnov@xxxxxxxxxxxxxxxx>
Date:   Tue May 22 16:00:47 2018 +0200

     RDMA/ipoib: drop skb on path record lookup failure
In unicast_arp_send function there is an inconsistency in error handling
     of path_rec_start call. If path_rec_start is called because of an absent
     ah field, skb will be dropped. But if it is called on a creation of a
     new path, or if the path is invalid, skb will be added to the tail of
     path queue.  In case of a new path it will be dropped on path_free, but
     in case of invalid path it can stay in the queue forever.
This patch unifies the behavior, dropping skb in all cases
     of path_rec_start failure.
Signed-off-by: Evgenii Smirnov <evgenii.smirnov@xxxxxxxxxxxxxxxx>
     Signed-off-by: Doug Ledford <dledford@xxxxxxxxxx>

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 788bb9573f1f..b84f9e8f881d 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -1054,62 +1054,36 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
path = __path_find(dev, phdr->hwaddr + 4);
         if (!path || !path->ah || !path->ah->valid) {
-               int new_path = 0;
-
                 if (!path) {
                         path = path_rec_create(dev, phdr->hwaddr + 4);
-                       new_path = 1;
+                       if (!path)
+                               goto drop_and_unlock;
+                       __path_add(dev, path);
+               }
+               if (!path->query && path_rec_start(dev, path)) {
+                       goto drop_and_unlock;
                 }
-               if (path) {
-                       if (!new_path)
-                               /* make sure there is no changes in the existing path record */
-                               init_path_rec(priv, path, phdr->hwaddr + 4);
-
-                       if (skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
-                               push_pseudo_header(skb, phdr->hwaddr);
-                               __skb_queue_tail(&path->queue, skb);
-                       } else {
-                               ++dev->stats.tx_dropped;
-                               dev_kfree_skb_any(skb);
-                       }
- if (!path->query && path_rec_start(dev, path)) {
-                               spin_unlock_irqrestore(&priv->lock, flags);
-                               if (new_path)
-                                       path_free(dev, path);
-                               return;
-                       } else
-                               __path_add(dev, path);
+               if (skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
+                       push_pseudo_header(skb, phdr->hwaddr);
+                       __skb_queue_tail(&path->queue, skb);
+                       goto unlock;
                 } else {
                         goto drop_and_unlock;
                 }
-
-               spin_unlock_irqrestore(&priv->lock, flags);
-               return;
-       }
-
-       if (path->ah && path->ah->valid) {
-               ipoib_dbg(priv, "Send unicast ARP to %08x\n",
-                         be32_to_cpu(sa_path_get_dlid(&path->pathrec)));
-
-               spin_unlock_irqrestore(&priv->lock, flags);
-               path->ah->last_send = rn->send(dev, skb, path->ah->ah,
-                                              IPOIB_QPN(phdr->hwaddr));
-               return;
-       } else if ((path->query || !path_rec_start(dev, path)) &&
-                  skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
-               push_pseudo_header(skb, phdr->hwaddr);
-               __skb_queue_tail(&path->queue, skb);
-       } else {
-               goto drop_and_unlock;
         }
spin_unlock_irqrestore(&priv->lock, flags);
+       ipoib_dbg(priv, "Send unicast ARP to %08x\n",
+                 be32_to_cpu(sa_path_get_dlid(&path->pathrec)));
+       path->ah->last_send = rn->send(dev, skb, path->ah->ah,
+                                      IPOIB_QPN(phdr->hwaddr));
         return;
drop_and_unlock:
         ++dev->stats.tx_dropped;
         dev_kfree_skb_any(skb);
+unlock:
         spin_unlock_irqrestore(&priv->lock, flags);
  }

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux