> -----Original Message-----
> From: [email protected] 
> [mailto:[email protected]] On
> Behalf Of Or Gerlitz
> Sent: Tuesday, July 08, 2014 5:45 AM
> To: [email protected]
> Cc: [email protected]; [email protected]; Estrin, Alex; Or Gerlitz
> Subject: [PATCH for-3.17 2/3] IB/ipoib: Use pkey change event instead of pkey
> polling mechanism
> 
> From: Erez Shitrit <[email protected]>
> 
> The current code use a dedicated polling logic to determine when the pkey
> assigned to the ipoib device is present in HCA port table and act accordingly.
> 
> Move to use the code which acts upon getting PKEY_CHANGE event to handle this
> task and remove the pkey polling logic/thread as they add extra complexity
> which isn't needed.
> 
> Signed-off-by: Erez Shitrit <[email protected]>
> Signed-off-by: Or Gerlitz <[email protected]>
Acked-by: Alex Estrin <[email protected]>
> ---
>  drivers/infiniband/ulp/ipoib/ipoib.h      |    6 +--
>  drivers/infiniband/ulp/ipoib/ipoib_ib.c   |   73 
> ++++++-----------------------
>  drivers/infiniband/ulp/ipoib/ipoib_main.c |    6 ++-
>  3 files changed, 20 insertions(+), 65 deletions(-)
> 
> diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h
> b/drivers/infiniband/ulp/ipoib/ipoib.h
> index c639f90..683d23a 100644
> --- a/drivers/infiniband/ulp/ipoib/ipoib.h
> +++ b/drivers/infiniband/ulp/ipoib/ipoib.h
> @@ -86,7 +86,6 @@ enum {
>       IPOIB_FLAG_INITIALIZED    = 1,
>       IPOIB_FLAG_ADMIN_UP       = 2,
>       IPOIB_PKEY_ASSIGNED       = 3,
> -     IPOIB_PKEY_STOP           = 4,
>       IPOIB_FLAG_SUBINTERFACE   = 5,
>       IPOIB_MCAST_RUN           = 6,
>       IPOIB_STOP_REAPER         = 7,
> @@ -312,7 +311,6 @@ struct ipoib_dev_priv {
>       struct list_head multicast_list;
>       struct rb_root multicast_tree;
> 
> -     struct delayed_work pkey_poll_task;
>       struct delayed_work mcast_task;
>       struct work_struct carrier_on_task;
>       struct work_struct flush_light;
> @@ -477,6 +475,7 @@ int ipoib_ib_dev_open(struct net_device *dev);
>  int ipoib_ib_dev_up(struct net_device *dev);
>  int ipoib_ib_dev_down(struct net_device *dev, int flush);
>  int ipoib_ib_dev_stop(struct net_device *dev, int flush);
> +void ipoib_pkey_dev_check_presence(struct net_device *dev);
> 
>  int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port);
>  void ipoib_dev_cleanup(struct net_device *dev);
> @@ -532,8 +531,7 @@ int  ipoib_set_mode(struct net_device *dev, const char 
> *buf);
> 
>  void ipoib_setup(struct net_device *dev);
> 
> -void ipoib_pkey_poll(struct work_struct *work);
> -int ipoib_pkey_dev_delay_open(struct net_device *dev);
> +void ipoib_pkey_open(struct ipoib_dev_priv *priv);
>  void ipoib_drain_cq(struct net_device *dev);
> 
>  void ipoib_set_ethtool_ops(struct net_device *dev);
> diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> index 6a7003d..be8f971 100644
> --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> @@ -709,7 +709,7 @@ dev_stop:
>       return -1;
>  }
> 
> -static void ipoib_pkey_dev_check_presence(struct net_device *dev)
> +void ipoib_pkey_dev_check_presence(struct net_device *dev)
>  {
>       struct ipoib_dev_priv *priv = netdev_priv(dev);
>       u16 pkey_index = 0;
> @@ -745,14 +745,6 @@ int ipoib_ib_dev_down(struct net_device *dev, int flush)
>       clear_bit(IPOIB_FLAG_OPER_UP, &priv->flags);
>       netif_carrier_off(dev);
> 
> -     /* Shutdown the P_Key thread if still active */
> -     if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) {
> -             mutex_lock(&pkey_mutex);
> -             set_bit(IPOIB_PKEY_STOP, &priv->flags);
> -             cancel_delayed_work_sync(&priv->pkey_poll_task);
> -             mutex_unlock(&pkey_mutex);
> -     }
> -
>       ipoib_mcast_stop_thread(dev, flush);
>       ipoib_mcast_dev_flush(dev);
> 
> @@ -988,9 +980,12 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv 
> *priv,
> 
>       if (!test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) {
>               /* for non-child devices must check/update the pkey value here 
> */
> -             if (level == IPOIB_FLUSH_HEAVY &&
> -                 !test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags))
> -                     update_parent_pkey(priv);
> +             if (level == IPOIB_FLUSH_HEAVY) {
> +                     if (test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags))
> +                             ipoib_pkey_open(priv);
> +                     else
> +                             update_parent_pkey(priv);
> +             }
>               ipoib_dbg(priv, "Not flushing - IPOIB_FLAG_INITIALIZED not 
> set.\n");
>               return;
>       }
> @@ -1009,8 +1004,7 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv 
> *priv,
>                               clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
>                               ipoib_ib_dev_down(dev, 0);
>                               ipoib_ib_dev_stop(dev, 0);
> -                             if (ipoib_pkey_dev_delay_open(dev))
> -                                     return;
> +                             return;
>                       }
>                       /* restart QP only if P_Key index is changed */
>                       if (test_and_set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags) 
> &&
> @@ -1094,54 +1088,15 @@ void ipoib_ib_dev_cleanup(struct net_device *dev)
>       ipoib_transport_dev_cleanup(dev);
>  }
> 
> -/*
> - * Delayed P_Key Assigment Interim Support
> - *
> - * The following is initial implementation of delayed P_Key assigment
> - * mechanism. It is using the same approach implemented for the multicast
> - * group join. The single goal of this implementation is to quickly address
> - * Bug #2507. This implementation will probably be removed when the P_Key
> - * change async notification is available.
> - */
> -
> -void ipoib_pkey_poll(struct work_struct *work)
> +void ipoib_pkey_open(struct ipoib_dev_priv *priv)
>  {
> -     struct ipoib_dev_priv *priv =
> -             container_of(work, struct ipoib_dev_priv, pkey_poll_task.work);
> -     struct net_device *dev = priv->dev;
> 
> -     ipoib_pkey_dev_check_presence(dev);
> +     if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
> +             return;
> +
> +     ipoib_pkey_dev_check_presence(priv->dev);
> 
>       if (test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags))
> -             ipoib_open(dev);
> -     else {
> -             mutex_lock(&pkey_mutex);
> -             if (!test_bit(IPOIB_PKEY_STOP, &priv->flags))
> -                     queue_delayed_work(ipoib_workqueue,
> -                                        &priv->pkey_poll_task,
> -                                        HZ);
> -             mutex_unlock(&pkey_mutex);
> -     }
> +             ipoib_open(priv->dev);
>  }
> 
> -int ipoib_pkey_dev_delay_open(struct net_device *dev)
> -{
> -     struct ipoib_dev_priv *priv = netdev_priv(dev);
> -
> -     /* Look for the interface pkey value in the IB Port P_Key table and */
> -     /* set the interface pkey assigment flag                            */
> -     ipoib_pkey_dev_check_presence(dev);
> -
> -     /* P_Key value not assigned yet - start polling */
> -     if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) {
> -             mutex_lock(&pkey_mutex);
> -             clear_bit(IPOIB_PKEY_STOP, &priv->flags);
> -             queue_delayed_work(ipoib_workqueue,
> -                                &priv->pkey_poll_task,
> -                                HZ);
> -             mutex_unlock(&pkey_mutex);
> -             return 1;
> -     }
> -
> -     return 0;
> -}
> diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c
> b/drivers/infiniband/ulp/ipoib/ipoib_main.c
> index 5786a78..35acbd4 100644
> --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
> +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
> @@ -108,7 +108,10 @@ int ipoib_open(struct net_device *dev)
> 
>       set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
> 
> -     if (ipoib_pkey_dev_delay_open(dev))
> +
> +     ipoib_pkey_dev_check_presence(dev);
> +
> +     if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags))
>               return 0;
> 
>       if (ipoib_ib_dev_open(dev))
> @@ -1379,7 +1382,6 @@ void ipoib_setup(struct net_device *dev)
>       INIT_LIST_HEAD(&priv->dead_ahs);
>       INIT_LIST_HEAD(&priv->multicast_list);
> 
> -     INIT_DELAYED_WORK(&priv->pkey_poll_task, ipoib_pkey_poll);
>       INIT_DELAYED_WORK(&priv->mcast_task,   ipoib_mcast_join_task);
>       INIT_WORK(&priv->carrier_on_task, ipoib_mcast_carrier_on_task);
>       INIT_WORK(&priv->flush_light,   ipoib_ib_dev_flush_light);
> --
> 1.7.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to