re: mlx4_en: fix endianness with blue frame support

3 messages, 2 authors, 2012-09-24 · open the first message on its own page

re: mlx4_en: fix endianness with blue frame support

From: Dan Carpenter <hidden>
Date: 2012-09-18 07:34:48

Hello Thadeu Lima de Souza Cascardo,

The patch c5d6136e10d6: "mlx4_en: fix endianness with blue frame 
support" from Oct 10, 2011, leads to the following warning:
drivers/net/ethernet/mellanox/mlx4/en_tx.c:720 mlx4_en_xmit()
	 warn: potential memory corrupting cast. 4 vs 2 bytes

That patch introduced a call to cpu_to_be32() and added some endian
notation.

	*(__be32 *) (&tx_desc->ctrl.vlan_tag) |= cpu_to_be32(ring->doorbell_qpn);

But it doesn't make sense because the data type is declared as u16 in
the header and we would be corrupting the next elements in the struct
which are ins_vlan and fence_size.

struct mlx4_wqe_ctrl_seg {
        __be32                  owner_opcode;
        __be16                  vlan_tag;
        u8                      ins_vlan;
        u8                      fence_size;

I guess the reason we get away with it is that the ->doorbell_qpn is
normally less that 65k. But doorbell_qpn is a u32 type so I think there
is a risk here.

regards,
dan carpenter

Re: mlx4_en: fix endianness with blue frame support

From: Or Gerlitz <hidden>
Date: 2012-09-20 13:46:52

On Tue, Sep 18, 2012 at 10:34 AM, Dan Carpenter
[off-list ref] wrote:
Hello Thadeu Lima de Souza Cascardo,

The patch c5d6136e10d6: "mlx4_en: fix endianness with blue frame
support" from Oct 10, 2011, leads to the following warning:
drivers/net/ethernet/mellanox/mlx4/en_tx.c:720 mlx4_en_xmit()
         warn: potential memory corrupting cast. 4 vs 2 bytes

That patch introduced a call to cpu_to_be32() and added some endian notation.
        *(__be32 *) (&tx_desc->ctrl.vlan_tag) |= cpu_to_be32(ring->doorbell_qpn);
But it doesn't make sense because the data type is declared as u16 in
the header and we would be corrupting the next elements in the struct
which are ins_vlan and fence_size.

struct mlx4_wqe_ctrl_seg {
        __be32                  owner_opcode;
        __be16                  vlan_tag;
        u8                      ins_vlan;
        u8                      fence_size;

I guess the reason we get away with it is that the ->doorbell_qpn is
normally less that 65k. But doorbell_qpn is a u32 type so I think there is a risk here.
Dan,

QP numbers are 24 bit in size, under blue-flame setting the QP number
is written
over the "vlan_tag" field and potentially also the "ins_vlan" field of
the control segment,
we can do a little cleanup here with introducing a modified version of
the mlx4_wqe_ctrl_seg
structure over which the cast is made  under the blue-flame flow.

Or.

Re: mlx4_en: fix endianness with blue frame support

From: Dan Carpenter <hidden>
Date: 2012-09-24 19:43:07

On Thu, Sep 20, 2012 at 04:46:51PM +0300, Or Gerlitz wrote:
On Tue, Sep 18, 2012 at 10:34 AM, Dan Carpenter
[off-list ref] wrote:
quoted
Hello Thadeu Lima de Souza Cascardo,

The patch c5d6136e10d6: "mlx4_en: fix endianness with blue frame
support" from Oct 10, 2011, leads to the following warning:
drivers/net/ethernet/mellanox/mlx4/en_tx.c:720 mlx4_en_xmit()
         warn: potential memory corrupting cast. 4 vs 2 bytes

That patch introduced a call to cpu_to_be32() and added some endian notation.
        *(__be32 *) (&tx_desc->ctrl.vlan_tag) |= cpu_to_be32(ring->doorbell_qpn);
But it doesn't make sense because the data type is declared as u16 in
the header and we would be corrupting the next elements in the struct
which are ins_vlan and fence_size.

struct mlx4_wqe_ctrl_seg {
        __be32                  owner_opcode;
        __be16                  vlan_tag;
        u8                      ins_vlan;
        u8                      fence_size;

I guess the reason we get away with it is that the ->doorbell_qpn is
normally less that 65k. But doorbell_qpn is a u32 type so I think there is a risk here.
Dan,

QP numbers are 24 bit in size, under blue-flame setting the QP number
is written
over the "vlan_tag" field and potentially also the "ins_vlan" field of
the control segment,
we can do a little cleanup here with introducing a modified version of
the mlx4_wqe_ctrl_seg
structure over which the cast is made  under the blue-flame flow.

Or.
Actually 24 bit big endian would mean they almost always over-write
the fence_size field.  It's the highest byte of vlan_tag which would
not be modified.

I'm not sure how this ever worked.  Something is confusing here.

regards,
dan carpenter
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help