Re: [PATCH V2 for-next 4/4] RDMA/hns: Add enable judgement for UD vlan

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

 



在 2018/9/18 16:54, Leon Romanovsky 写道:
> On Mon, Sep 17, 2018 at 09:55:15PM +0800, Lijun Ou wrote:
>> According to the hardware modification, the vlan of the UD
>> packet is based on the ud_vlan_en field of ud wqe to
>> determine whether to add a vlan header to the ud
>> packet. The ud_vlan_en field is filled by the driver
>> according to judge the net device.
>>
>> Signed-off-by: Lijun Ou <oulijun@xxxxxxxxxx>
>> ---
>> V1->V2:
>> - Assign the vlan_en for true when the device is vlan device
>> ---
>>  drivers/infiniband/hw/hns/hns_roce_ah.c     | 6 +++++-
>>  drivers/infiniband/hw/hns/hns_roce_device.h | 1 +
>>  drivers/infiniband/hw/hns/hns_roce_hw_v2.c  | 3 +++
>>  drivers/infiniband/hw/hns/hns_roce_hw_v2.h  | 2 ++
>>  4 files changed, 11 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_ah.c b/drivers/infiniband/hw/hns/hns_roce_ah.c
>> index 0d96c5b..9990dc9 100644
>> --- a/drivers/infiniband/hw/hns/hns_roce_ah.c
>> +++ b/drivers/infiniband/hw/hns/hns_roce_ah.c
>> @@ -49,6 +49,7 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd,
>>  	struct hns_roce_ah *ah;
>>  	u16 vlan_tag = 0xffff;
>>  	const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
>> +	bool vlan_en = false;
>>
>>  	ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
>>  	if (!ah)
>> @@ -58,8 +59,10 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd,
>>  	memcpy(ah->av.mac, ah_attr->roce.dmac, ETH_ALEN);
>>
>>  	gid_attr = ah_attr->grh.sgid_attr;
>> -	if (is_vlan_dev(gid_attr->ndev))
>> +	if (is_vlan_dev(gid_attr->ndev)) {
>>  		vlan_tag = vlan_dev_vlan_id(gid_attr->ndev);
>> +		vlan_en = true;
>> +	}
>>
>>  	if (vlan_tag < 0x1000)
>>  		vlan_tag |= (rdma_ah_get_sl(ah_attr) &
>> @@ -71,6 +74,7 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd,
>>  				     HNS_ROCE_PORT_NUM_SHIFT));
>>  	ah->av.gid_index = grh->sgid_index;
>>  	ah->av.vlan = cpu_to_le16(vlan_tag);
>> +	ah->av.vlan_en = vlan_en;
>>  	dev_dbg(dev, "gid_index = 0x%x,vlan = 0x%x\n", ah->av.gid_index,
>>  		ah->av.vlan);
>>
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
>> index 6dadb12..2461804 100644
>> --- a/drivers/infiniband/hw/hns/hns_roce_device.h
>> +++ b/drivers/infiniband/hw/hns/hns_roce_device.h
>> @@ -458,6 +458,7 @@ struct hns_roce_av {
>>  	u8          dgid[HNS_ROCE_GID_SIZE];
>>  	u8          mac[6];
>>  	__le16      vlan;
>> +	bool	    vlan_en;
>>  };
>>
>>  struct hns_roce_ah {
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
>> index 4020584..86f793b 100644
>> --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
>> +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
>> @@ -370,6 +370,9 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp,
>>  				       V2_UD_SEND_WQE_BYTE_40_PORTN_S,
>>  				       qp->port);
>>
>> +			roce_set_bit(ud_sq_wqe->byte_40,
>> +				     V2_UD_SEND_WQE_BYTE_40_UD_VLAN_EN_S,
> 
> According to hns code, all those "bool vlan_en" can be replaced to something like this:
> roce_set_bit(ud_sq_wqe->byte_40, V2_UD_SEND_WQE_BYTE_40_UD_VLAN_EN_S, (ah->av.vlan_tag != cpu_to_le16(0xFFFF)))
> 
Hi, Leon
  Firstly, thank your advice. At the begining, I also consider your suggestion because the 0xffff is out of the range of vlan.
because the hardware will distinguish the device whether the vlan tag is 0xffff. if the vlan tag is 0xffff, the hardware will
distinguish as non-vlan device. Therefore, the old hardware does have this patch.
But the new design have changed. In order to extend the range of vlan and make it more flexible,
the hardware have modified the judgement. The hardware distinguish whether it is vlan device according to the vlan_en field.
In the future, the range of  vlan include 0xffff, the new desgin may be more suitable
Currently, your advice may be the same with this patch and your advice is more concise. is it ok?

thanks
Lijun Ou
>> +				     ah->av.vlan_en ? 1 : 0);
>>  			roce_set_field(ud_sq_wqe->byte_48,
>>  				       V2_UD_SEND_WQE_BYTE_48_SGID_INDX_M,
>>  				       V2_UD_SEND_WQE_BYTE_48_SGID_INDX_S,
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
>> index d04be1c..7ee6ed2 100644
>> --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
>> +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
>> @@ -993,6 +993,8 @@ struct hns_roce_v2_ud_send_wqe {
>>  #define	V2_UD_SEND_WQE_BYTE_40_PORTN_S 24
>>  #define V2_UD_SEND_WQE_BYTE_40_PORTN_M GENMASK(26, 24)
>>
>> +#define V2_UD_SEND_WQE_BYTE_40_UD_VLAN_EN_S 30
>> +
>>  #define	V2_UD_SEND_WQE_BYTE_40_LBI_S 31
>>
>>  #define	V2_UD_SEND_WQE_DMAC_0_S 0
>> --
>> 1.9.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