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

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

 



On 5/23/2018 7:57 AM, Evgenii Smirnov wrote:
> 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?

That was an oversight on my part.  I fixed it before I pushed out my
wip/dl-ipoib branch, so the fixed version of the patch is there.

> 
> 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);
>>   }
>>  
> 


Attachment: signature.asc
Description: OpenPGP digital signature


[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