Re: [PATCH for-next] IB/core: Only update PKEY and GID caches on respective events

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

 



On Tue, May 4, 2021 at 7:50 PM Håkon Bugge <haakon.bugge@xxxxxxxxxx> wrote:
>
> Both the PKEY and GID tables in an HCA can hold in the order of
> hundreds entries. Reading them are expensive. Partly because the API
> for retrieving them only returns a single entry at a time. Further, on
> certain implementations, e.g., CX-3, the VFs are paravirtualized in
> this respect and have to rely on the PF driver to perform the
> read. This again demands VF to PF communication.
>
> IB Core's cache is refreshed on all events. Hence, filter the refresh
> of the PKEY and GID caches based on the event received being
> IB_EVENT_PKEY_CHANGE and IB_EVENT_GID_CHANGE respectively.
>

Missing Fixes?

Zhu Yanjun

> Signed-off-by: Håkon Bugge <haakon.bugge@xxxxxxxxxx>
> ---
>  drivers/infiniband/core/cache.c | 25 ++++++++++++++++---------
>  1 file changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
> index 5c9fac7..531ae6b 100644
> --- a/drivers/infiniband/core/cache.c
> +++ b/drivers/infiniband/core/cache.c
> @@ -1472,10 +1472,14 @@ static int config_non_roce_gid_cache(struct ib_device *device,
>  }
>
>  static int
> -ib_cache_update(struct ib_device *device, u8 port, bool enforce_security)
> +ib_cache_update(struct ib_device *device, u8 port, enum ib_event_type event,
> +               bool reg_dev, bool enforce_security)
>  {
>         struct ib_port_attr       *tprops = NULL;
> -       struct ib_pkey_cache      *pkey_cache = NULL, *old_pkey_cache;
> +       struct ib_pkey_cache      *pkey_cache = NULL;
> +       struct ib_pkey_cache      *old_pkey_cache = NULL;
> +       bool                       update_pkey_cache = (reg_dev || event == IB_EVENT_PKEY_CHANGE);
> +       bool                       update_gid_cache = (reg_dev || event == IB_EVENT_GID_CHANGE);
>         int                        i;
>         int                        ret;
>
> @@ -1492,14 +1496,16 @@ static int config_non_roce_gid_cache(struct ib_device *device,
>                 goto err;
>         }
>
> -       if (!rdma_protocol_roce(device, port)) {
> +       if (!rdma_protocol_roce(device, port) && update_gid_cache) {
>                 ret = config_non_roce_gid_cache(device, port,
>                                                 tprops->gid_tbl_len);
>                 if (ret)
>                         goto err;
>         }
>
> -       if (tprops->pkey_tbl_len) {
> +       update_pkey_cache &= !!tprops->pkey_tbl_len;
> +
> +       if (update_pkey_cache) {
>                 pkey_cache = kmalloc(struct_size(pkey_cache, table,
>                                                  tprops->pkey_tbl_len),
>                                      GFP_KERNEL);
> @@ -1524,9 +1530,10 @@ static int config_non_roce_gid_cache(struct ib_device *device,
>
>         write_lock_irq(&device->cache_lock);
>
> -       old_pkey_cache = device->port_data[port].cache.pkey;
> -
> -       device->port_data[port].cache.pkey = pkey_cache;
> +       if (update_pkey_cache) {
> +               old_pkey_cache = device->port_data[port].cache.pkey;
> +               device->port_data[port].cache.pkey = pkey_cache;
> +       }
>         device->port_data[port].cache.lmc = tprops->lmc;
>         device->port_data[port].cache.port_state = tprops->state;
>
> @@ -1558,7 +1565,7 @@ static void ib_cache_event_task(struct work_struct *_work)
>          * the cache.
>          */
>         ret = ib_cache_update(work->event.device, work->event.element.port_num,
> -                             work->enforce_security);
> +                             work->event.event, false, work->enforce_security);
>
>         /* GID event is notified already for individual GID entries by
>          * dispatch_gid_change_event(). Hence, notifiy for rest of the
> @@ -1631,7 +1638,7 @@ int ib_cache_setup_one(struct ib_device *device)
>                 return err;
>
>         rdma_for_each_port (device, p) {
> -               err = ib_cache_update(device, p, true);
> +               err = ib_cache_update(device, p, 0, true, true);
>                 if (err)
>                         return err;
>         }
> --
> 1.8.3.1
>




[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