| From 238345c78c64846c24daa9aca738cc618f64ea72 Mon Sep 17 00:00:00 2001 |
| From: Alex Estrin <alex.estrin@intel.com> |
| Date: Tue, 26 Sep 2017 06:06:22 -0700 |
| Subject: Revert "IB/ipoib: Update broadcast object if PKey value was changed |
| in index 0" |
| |
| [ Upstream commit 612601d0013f03de9dc134809f242ba6da9ca252 ] |
| |
| commit 9a9b8112699d will cause core to fail UD QP from being destroyed |
| on ipoib unload, therefore cause resources leakage. |
| On pkey change event above patch modifies mgid before calling underlying |
| driver to detach it from QP. Drivers' detach_mcast() will fail to find |
| modified mgid it was never given to attach in a first place. |
| Core qp->usecnt will never go down, so ib_destroy_qp() will fail. |
| |
| IPoIB driver actually does take care of new broadcast mgid based on new |
| pkey by destroying an old mcast object in ipoib_mcast_dev_flush()) |
| .... |
| if (priv->broadcast) { |
| rb_erase(&priv->broadcast->rb_node, &priv->multicast_tree); |
| list_add_tail(&priv->broadcast->list, &remove_list); |
| priv->broadcast = NULL; |
| } |
| ... |
| |
| then in restarted ipoib_macst_join_task() creating a new broadcast mcast |
| object, sending join request and on completion tells the driver to attach |
| to reinitialized QP: |
| ... |
| if (!priv->broadcast) { |
| ... |
| broadcast = ipoib_mcast_alloc(dev, 0); |
| ... |
| memcpy(broadcast->mcmember.mgid.raw, priv->dev->broadcast + 4, |
| sizeof (union ib_gid)); |
| priv->broadcast = broadcast; |
| ... |
| |
| Fixes: 9a9b8112699d ("IB/ipoib: Update broadcast object if PKey value was changed in index 0") |
| Cc: stable@vger.kernel.org |
| Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> |
| Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> |
| Signed-off-by: Alex Estrin <alex.estrin@intel.com> |
| Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> |
| Reviewed-by: Feras Daoud <ferasda@mellanox.com> |
| Signed-off-by: Doug Ledford <dledford@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/infiniband/ulp/ipoib/ipoib_ib.c | 13 ------------- |
| 1 file changed, 13 deletions(-) |
| |
| diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c |
| index 3dd5bf6c6c7a..ad3089c23e18 100644 |
| --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c |
| +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c |
| @@ -974,19 +974,6 @@ static inline int update_parent_pkey(struct ipoib_dev_priv *priv) |
| */ |
| priv->dev->broadcast[8] = priv->pkey >> 8; |
| priv->dev->broadcast[9] = priv->pkey & 0xff; |
| - |
| - /* |
| - * Update the broadcast address in the priv->broadcast object, |
| - * in case it already exists, otherwise no one will do that. |
| - */ |
| - if (priv->broadcast) { |
| - spin_lock_irq(&priv->lock); |
| - memcpy(priv->broadcast->mcmember.mgid.raw, |
| - priv->dev->broadcast + 4, |
| - sizeof(union ib_gid)); |
| - spin_unlock_irq(&priv->lock); |
| - } |
| - |
| return 0; |
| } |
| |
| -- |
| 2.17.1 |
| |