Re: [PATCH rdma-next 3/7] RDMA/core: Introduce helper functions for cache cleanup, update

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

 



On Tue, Dec 18, 2018 at 02:28:32PM +0200, Leon Romanovsky wrote:
> From: Parav Pandit <parav@xxxxxxxxxxxx>
> 
> Move code to reusable helper functions to reuse in subsequent patch
> in handling net namespace change netlink command for an rdma device.
> 
> Signed-off-by: Parav Pandit <parav@xxxxxxxxxxxx>
> Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx>
>  drivers/infiniband/core/cache.c     | 25 +++++++++++++++----------
>  drivers/infiniband/core/core_priv.h |  3 +++
>  2 files changed, 18 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
> index 7b04590f307f..ae67396af92f 100644
> +++ b/drivers/infiniband/core/cache.c
> @@ -896,7 +896,7 @@ static int _gid_table_setup_one(struct ib_device *ib_dev)
>  	return -ENOMEM;
>  }
>  
> -static void gid_table_cleanup_one(struct ib_device *ib_dev)
> +void ib_gid_table_cleanup_one(struct ib_device *ib_dev)
>  {
>  	struct ib_gid_table *table;
>  	u8 port;
> @@ -906,6 +906,10 @@ static void gid_table_cleanup_one(struct ib_device *ib_dev)
>  		cleanup_gid_table_port(ib_dev, port + rdma_start_port(ib_dev),
>  				       table);
>  	}
> +	/*
> +	 * Flush the wq for any pending GID delete work.
> +	 */
> +	flush_workqueue(ib_wq);
>  }
>  
>  static int gid_table_setup_one(struct ib_device *ib_dev)
> @@ -1426,9 +1430,16 @@ static void ib_cache_event(struct ib_event_handler *handler,
>  	}
>  }
>  
> -int ib_cache_setup_one(struct ib_device *device)
> +void ib_device_cache_update(struct ib_device *device)
>  {
>  	int p;
> +
> +	for (p = rdma_start_port(device); p <= rdma_end_port(device); p++)
> +		ib_cache_update(device, p, true);
> +}
> +
> +int ib_cache_setup_one(struct ib_device *device)
> +{
>  	int err;
>  
>  	rwlock_init(&device->cache.lock);
> @@ -1447,8 +1458,7 @@ int ib_cache_setup_one(struct ib_device *device)
>  		return err;
>  	}
>  
> -	for (p = 0; p <= rdma_end_port(device) - rdma_start_port(device); ++p)
> -		ib_cache_update(device, p + rdma_start_port(device), true);
> +	ib_device_cache_update(device);
>  
>  	INIT_IB_EVENT_HANDLER(&device->cache.event_handler,
>  			      device, ib_cache_event);
> @@ -1484,10 +1494,5 @@ void ib_cache_cleanup_one(struct ib_device *device)
>  	 */
>  	ib_unregister_event_handler(&device->cache.event_handler);
>  	flush_workqueue(ib_wq);
> -	gid_table_cleanup_one(device);
> -
> -	/*
> -	 * Flush the wq second time for any pending GID delete work.
> -	 */
> -	flush_workqueue(ib_wq);
> +	ib_gid_table_cleanup_one(device);
>  }
> diff --git a/drivers/infiniband/core/core_priv.h b/drivers/infiniband/core/core_priv.h
> index f2da31de62c9..7dc6f814f387 100644
> +++ b/drivers/infiniband/core/core_priv.h
> @@ -357,4 +357,7 @@ int ib_setup_port_attrs(struct ib_core_device *coredev,
>  			int (*port_callback)(struct ib_device *,
>  					     u8, struct kobject *),
>  			bool alloc_hw_stats);
> +
> +void ib_device_cache_update(struct ib_device *device);
> +void ib_gid_table_cleanup_one(struct ib_device *device);

This is super goofy, why do we have a 'cleanup' followed by 'update'
API design?

        ib_gid_table_cleanup_one(device);
        free_client_contexts(device);
        device->reg_state = IB_DEV_UNREGISTERED;

        device->netns_shared = 0;
        rdma_coredev_net_set(&device->coredev, net);

        rdma_roce_rescan_device(device);
        ib_device_cache_update(device);

Makes no sense.

Lets just have a ib_gid_cache_restart() API or something?

I don't think this really needs two steps?

Jason



[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