diff mbox series

[RFC,v2,for-next,1/7] RDMA/core: add inactive attribute of ib_port_cache

Message ID 20200204082408.18728-2-liweihang@huawei.com (mailing list archive)
State Changes Requested
Headers show
Series ib core support to send ib port link event | expand

Commit Message

Weihang Li Feb. 4, 2020, 8:24 a.m. UTC
From: Lang Cheng <chenglang@huawei.com>

Add attribute inactive to mark bonding backup port.

Signed-off-by: Lang Cheng <chenglang@huawei.com>
---
 drivers/infiniband/core/cache.c | 16 +++++++++++++++-
 include/rdma/ib_cache.h         | 10 ++++++++++
 include/rdma/ib_verbs.h         |  2 ++
 3 files changed, 27 insertions(+), 1 deletion(-)

Comments

Jason Gunthorpe Feb. 19, 2020, 9:01 p.m. UTC | #1
On Tue, Feb 04, 2020 at 04:24:02PM +0800, Weihang Li wrote:
> From: Lang Cheng <chenglang@huawei.com>
> 
> Add attribute inactive to mark bonding backup port.
> 
> Signed-off-by: Lang Cheng <chenglang@huawei.com>
>  drivers/infiniband/core/cache.c | 16 +++++++++++++++-
>  include/rdma/ib_cache.h         | 10 ++++++++++
>  include/rdma/ib_verbs.h         |  2 ++
>  3 files changed, 27 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
> index d535995..7a7ef0e 100644
> +++ b/drivers/infiniband/core/cache.c
> @@ -1175,6 +1175,19 @@ int ib_get_cached_port_state(struct ib_device   *device,
>  }
>  EXPORT_SYMBOL(ib_get_cached_port_state);
>  
> +u8 ib_get_cached_port_inactive_status(struct ib_device *device, u8 port_num)
> +{
> +	unsigned long flags;
> +	u8 inactive;
> +
> +	read_lock_irqsave(&device->cache.lock, flags);
> +	inactive = device->port_data[port_num].cache.inactive;
> +	read_unlock_irqrestore(&device->cache.lock, flags);
> +
> +	return inactive;
> +}
> +EXPORT_SYMBOL(ib_get_cached_port_inactive_status);
> +
>  /**
>   * rdma_get_gid_attr - Returns GID attributes for a port of a device
>   * at a requested gid_index, if a valid GID entry exists.
> @@ -1393,7 +1406,7 @@ static void ib_cache_update(struct ib_device *device,
>  	if (!rdma_is_port_valid(device, port))
>  		return;
>  
> -	tprops = kmalloc(sizeof *tprops, GFP_KERNEL);
> +	tprops = kzalloc(sizeof *tprops, GFP_KERNEL);
>  	if (!tprops)
>  		return;
>  
> @@ -1435,6 +1448,7 @@ static void ib_cache_update(struct ib_device *device,
>  	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;
> +	device->port_data[port].cache.inactive = tprops->inactive;
>  
>  	device->port_data[port].cache.subnet_prefix = tprops->subnet_prefix;
>  	write_unlock_irq(&device->cache.lock);
> diff --git a/include/rdma/ib_cache.h b/include/rdma/ib_cache.h
> index 870b5e6..63b2dd6 100644
> +++ b/include/rdma/ib_cache.h
> @@ -131,6 +131,16 @@ int ib_get_cached_port_state(struct ib_device *device,
>  			      u8                port_num,
>  			      enum ib_port_state *port_active);
>  
> +/**
> + * ib_get_cached_port_inactive_status - Returns a cached port inactive status
> + * @device: The device to query.
> + * @port_num: The port number of the device to query.
> + *
> + * ib_get_cached_port_inactive_status() fetches the specified event inactive
> + * status stored in the local software cache.
> + */
> +u8 ib_get_cached_port_inactive_status(struct ib_device *device, u8 port_num);
> +

kdocs belong with the implementation, not in the header file

>  bool rdma_is_zero_gid(const union ib_gid *gid);
>  const struct ib_gid_attr *rdma_get_gid_attr(struct ib_device *device,
>  					    u8 port_num, int index);
> diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
> index 5608e14..e17d846 100644
> +++ b/include/rdma/ib_verbs.h
> @@ -665,6 +665,7 @@ struct ib_port_attr {
>  	u8			active_speed;
>  	u8                      phys_state;
>  	u16			port_cap_flags2;
> +	u8 			inactive;
>  };

Why is a major structure being changed for this? 

If LAG is to be brought up to the core code then the core should know
what leg is active or not, not the driver.

>  enum ib_device_modify_flags {
> @@ -2145,6 +2146,7 @@ struct ib_port_cache {
>  	struct ib_gid_table   *gid;
>  	u8                     lmc;
>  	enum ib_port_state     port_state;
> +	u8                     inactive;
>  };

Please think carefully about structure patcking here, both placements
of u8 seem poor

Jason
Lang Cheng Feb. 20, 2020, 3:19 a.m. UTC | #2
On 2020/2/20 5:01, Jason Gunthorpe wrote:
> On Tue, Feb 04, 2020 at 04:24:02PM +0800, Weihang Li wrote:
>> From: Lang Cheng <chenglang@huawei.com>
>>
>> Add attribute inactive to mark bonding backup port.
>>
>> Signed-off-by: Lang Cheng <chenglang@huawei.com>
>>   drivers/infiniband/core/cache.c | 16 +++++++++++++++-
>>   include/rdma/ib_cache.h         | 10 ++++++++++
>>   include/rdma/ib_verbs.h         |  2 ++
>>   3 files changed, 27 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
>> index d535995..7a7ef0e 100644
>> +++ b/drivers/infiniband/core/cache.c
>> @@ -1175,6 +1175,19 @@ int ib_get_cached_port_state(struct ib_device   *device,
>>   }
>>   EXPORT_SYMBOL(ib_get_cached_port_state);
>>   
>> +u8 ib_get_cached_port_inactive_status(struct ib_device *device, u8 port_num)
>> +{
>> +	unsigned long flags;
>> +	u8 inactive;
>> +
>> +	read_lock_irqsave(&device->cache.lock, flags);
>> +	inactive = device->port_data[port_num].cache.inactive;
>> +	read_unlock_irqrestore(&device->cache.lock, flags);
>> +
>> +	return inactive;
>> +}
>> +EXPORT_SYMBOL(ib_get_cached_port_inactive_status);
>> +
>>   /**
>>    * rdma_get_gid_attr - Returns GID attributes for a port of a device
>>    * at a requested gid_index, if a valid GID entry exists.
>> @@ -1393,7 +1406,7 @@ static void ib_cache_update(struct ib_device *device,
>>   	if (!rdma_is_port_valid(device, port))
>>   		return;
>>   
>> -	tprops = kmalloc(sizeof *tprops, GFP_KERNEL);
>> +	tprops = kzalloc(sizeof *tprops, GFP_KERNEL);
>>   	if (!tprops)
>>   		return;
>>   
>> @@ -1435,6 +1448,7 @@ static void ib_cache_update(struct ib_device *device,
>>   	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;
>> +	device->port_data[port].cache.inactive = tprops->inactive;
>>   
>>   	device->port_data[port].cache.subnet_prefix = tprops->subnet_prefix;
>>   	write_unlock_irq(&device->cache.lock);
>> diff --git a/include/rdma/ib_cache.h b/include/rdma/ib_cache.h
>> index 870b5e6..63b2dd6 100644
>> +++ b/include/rdma/ib_cache.h
>> @@ -131,6 +131,16 @@ int ib_get_cached_port_state(struct ib_device *device,
>>   			      u8                port_num,
>>   			      enum ib_port_state *port_active);
>>   
>> +/**
>> + * ib_get_cached_port_inactive_status - Returns a cached port inactive status
>> + * @device: The device to query.
>> + * @port_num: The port number of the device to query.
>> + *
>> + * ib_get_cached_port_inactive_status() fetches the specified event inactive
>> + * status stored in the local software cache.
>> + */
>> +u8 ib_get_cached_port_inactive_status(struct ib_device *device, u8 port_num);
>> +
> 
> kdocs belong with the implementation, not in the header file

All of ib_get_cached_XXX() should remove rdma_is_port_valid() and move 
kdocs from ib_cache.h to cache.c.
I can send this first, independently.

> 
>>   bool rdma_is_zero_gid(const union ib_gid *gid);
>>   const struct ib_gid_attr *rdma_get_gid_attr(struct ib_device *device,
>>   					    u8 port_num, int index);
>> diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
>> index 5608e14..e17d846 100644
>> +++ b/include/rdma/ib_verbs.h
>> @@ -665,6 +665,7 @@ struct ib_port_attr {
>>   	u8			active_speed;
>>   	u8                      phys_state;
>>   	u16			port_cap_flags2;
>> +	u8 			inactive;
>>   };
> 
> Why is a major structure being changed for this?
> 
> If LAG is to be brought up to the core code then the core should know
> what leg is active or not, not the driver.

"LAG is to be brought up to the core", is this under planning?
The link event report could be after this . Then, there may be a better 
way to ignore inactive port.

> 
>>   enum ib_device_modify_flags {
>> @@ -2145,6 +2146,7 @@ struct ib_port_cache {
>>   	struct ib_gid_table   *gid;
>>   	u8                     lmc;
>>   	enum ib_port_state     port_state;
>> +	u8                     inactive;
>>   };
> 
> Please think carefully about structure patcking here, both placements
> of u8 seem poor
> 
> Jason
> 
> .
>
Leon Romanovsky Feb. 20, 2020, 6:40 a.m. UTC | #3
On Thu, Feb 20, 2020 at 11:19:25AM +0800, Lang Cheng wrote:
>
>
> On 2020/2/20 5:01, Jason Gunthorpe wrote:
> > On Tue, Feb 04, 2020 at 04:24:02PM +0800, Weihang Li wrote:
> > > From: Lang Cheng <chenglang@huawei.com>
> > >
> > > Add attribute inactive to mark bonding backup port.
> > >
> > > Signed-off-by: Lang Cheng <chenglang@huawei.com>
> > >   drivers/infiniband/core/cache.c | 16 +++++++++++++++-
> > >   include/rdma/ib_cache.h         | 10 ++++++++++
> > >   include/rdma/ib_verbs.h         |  2 ++
> > >   3 files changed, 27 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
> > > index d535995..7a7ef0e 100644
> > > +++ b/drivers/infiniband/core/cache.c
> > > @@ -1175,6 +1175,19 @@ int ib_get_cached_port_state(struct ib_device   *device,
> > >   }
> > >   EXPORT_SYMBOL(ib_get_cached_port_state);
> > > +u8 ib_get_cached_port_inactive_status(struct ib_device *device, u8 port_num)
> > > +{
> > > +	unsigned long flags;
> > > +	u8 inactive;
> > > +
> > > +	read_lock_irqsave(&device->cache.lock, flags);
> > > +	inactive = device->port_data[port_num].cache.inactive;
> > > +	read_unlock_irqrestore(&device->cache.lock, flags);
> > > +
> > > +	return inactive;
> > > +}
> > > +EXPORT_SYMBOL(ib_get_cached_port_inactive_status);
> > > +
> > >   /**
> > >    * rdma_get_gid_attr - Returns GID attributes for a port of a device
> > >    * at a requested gid_index, if a valid GID entry exists.
> > > @@ -1393,7 +1406,7 @@ static void ib_cache_update(struct ib_device *device,
> > >   	if (!rdma_is_port_valid(device, port))
> > >   		return;
> > > -	tprops = kmalloc(sizeof *tprops, GFP_KERNEL);
> > > +	tprops = kzalloc(sizeof *tprops, GFP_KERNEL);
> > >   	if (!tprops)
> > >   		return;
> > > @@ -1435,6 +1448,7 @@ static void ib_cache_update(struct ib_device *device,
> > >   	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;
> > > +	device->port_data[port].cache.inactive = tprops->inactive;
> > >   	device->port_data[port].cache.subnet_prefix = tprops->subnet_prefix;
> > >   	write_unlock_irq(&device->cache.lock);
> > > diff --git a/include/rdma/ib_cache.h b/include/rdma/ib_cache.h
> > > index 870b5e6..63b2dd6 100644
> > > +++ b/include/rdma/ib_cache.h
> > > @@ -131,6 +131,16 @@ int ib_get_cached_port_state(struct ib_device *device,
> > >   			      u8                port_num,
> > >   			      enum ib_port_state *port_active);
> > > +/**
> > > + * ib_get_cached_port_inactive_status - Returns a cached port inactive status
> > > + * @device: The device to query.
> > > + * @port_num: The port number of the device to query.
> > > + *
> > > + * ib_get_cached_port_inactive_status() fetches the specified event inactive
> > > + * status stored in the local software cache.
> > > + */
> > > +u8 ib_get_cached_port_inactive_status(struct ib_device *device, u8 port_num);
> > > +
> >
> > kdocs belong with the implementation, not in the header file
>
> All of ib_get_cached_XXX() should remove rdma_is_port_valid() and move kdocs
> from ib_cache.h to cache.c.
> I can send this first, independently.
>
> >
> > >   bool rdma_is_zero_gid(const union ib_gid *gid);
> > >   const struct ib_gid_attr *rdma_get_gid_attr(struct ib_device *device,
> > >   					    u8 port_num, int index);
> > > diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
> > > index 5608e14..e17d846 100644
> > > +++ b/include/rdma/ib_verbs.h
> > > @@ -665,6 +665,7 @@ struct ib_port_attr {
> > >   	u8			active_speed;
> > >   	u8                      phys_state;
> > >   	u16			port_cap_flags2;
> > > +	u8 			inactive;
> > >   };
> >
> > Why is a major structure being changed for this?
> >
> > If LAG is to be brought up to the core code then the core should know
> > what leg is active or not, not the driver.
>
> "LAG is to be brought up to the core", is this under planning?

It is a development direction, sooner or later that will happen.

Thanks
diff mbox series

Patch

diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
index d535995..7a7ef0e 100644
--- a/drivers/infiniband/core/cache.c
+++ b/drivers/infiniband/core/cache.c
@@ -1175,6 +1175,19 @@  int ib_get_cached_port_state(struct ib_device   *device,
 }
 EXPORT_SYMBOL(ib_get_cached_port_state);
 
+u8 ib_get_cached_port_inactive_status(struct ib_device *device, u8 port_num)
+{
+	unsigned long flags;
+	u8 inactive;
+
+	read_lock_irqsave(&device->cache.lock, flags);
+	inactive = device->port_data[port_num].cache.inactive;
+	read_unlock_irqrestore(&device->cache.lock, flags);
+
+	return inactive;
+}
+EXPORT_SYMBOL(ib_get_cached_port_inactive_status);
+
 /**
  * rdma_get_gid_attr - Returns GID attributes for a port of a device
  * at a requested gid_index, if a valid GID entry exists.
@@ -1393,7 +1406,7 @@  static void ib_cache_update(struct ib_device *device,
 	if (!rdma_is_port_valid(device, port))
 		return;
 
-	tprops = kmalloc(sizeof *tprops, GFP_KERNEL);
+	tprops = kzalloc(sizeof *tprops, GFP_KERNEL);
 	if (!tprops)
 		return;
 
@@ -1435,6 +1448,7 @@  static void ib_cache_update(struct ib_device *device,
 	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;
+	device->port_data[port].cache.inactive = tprops->inactive;
 
 	device->port_data[port].cache.subnet_prefix = tprops->subnet_prefix;
 	write_unlock_irq(&device->cache.lock);
diff --git a/include/rdma/ib_cache.h b/include/rdma/ib_cache.h
index 870b5e6..63b2dd6 100644
--- a/include/rdma/ib_cache.h
+++ b/include/rdma/ib_cache.h
@@ -131,6 +131,16 @@  int ib_get_cached_port_state(struct ib_device *device,
 			      u8                port_num,
 			      enum ib_port_state *port_active);
 
+/**
+ * ib_get_cached_port_inactive_status - Returns a cached port inactive status
+ * @device: The device to query.
+ * @port_num: The port number of the device to query.
+ *
+ * ib_get_cached_port_inactive_status() fetches the specified event inactive
+ * status stored in the local software cache.
+ */
+u8 ib_get_cached_port_inactive_status(struct ib_device *device, u8 port_num);
+
 bool rdma_is_zero_gid(const union ib_gid *gid);
 const struct ib_gid_attr *rdma_get_gid_attr(struct ib_device *device,
 					    u8 port_num, int index);
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 5608e14..e17d846 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -665,6 +665,7 @@  struct ib_port_attr {
 	u8			active_speed;
 	u8                      phys_state;
 	u16			port_cap_flags2;
+	u8 			inactive;
 };
 
 enum ib_device_modify_flags {
@@ -2145,6 +2146,7 @@  struct ib_port_cache {
 	struct ib_gid_table   *gid;
 	u8                     lmc;
 	enum ib_port_state     port_state;
+	u8                     inactive;
 };
 
 struct ib_cache {