RDMA/nes: Fix incorrect casts on 32-bit architectures
The were some incorrect casts to unsigned long that caused 64-bit values to be truncated on 32-bit architectures and made the driver pass invalid adresses and lengths to the hardware. The problems were primarily seen with kernels with highmem configured but some could show up in non-highmem kernels, too. Signed-off-by: Don Wood <donald.e.wood@intel.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
5d80f8e5a9
commit
7a5efb62f6
|
@ -289,8 +289,8 @@ static inline __le32 get_crc_value(struct nes_v4_quad *nes_quad)
|
|||
static inline void
|
||||
set_wqe_64bit_value(__le32 *wqe_words, u32 index, u64 value)
|
||||
{
|
||||
wqe_words[index] = cpu_to_le32((u32) ((unsigned long)value));
|
||||
wqe_words[index + 1] = cpu_to_le32((u32)(upper_32_bits((unsigned long)value)));
|
||||
wqe_words[index] = cpu_to_le32((u32) value);
|
||||
wqe_words[index + 1] = cpu_to_le32(upper_32_bits(value));
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
|
@ -2690,6 +2690,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|||
struct ib_mr *ibmr = NULL;
|
||||
struct ib_phys_buf ibphysbuf;
|
||||
struct nes_pd *nespd;
|
||||
u64 tagged_offset;
|
||||
|
||||
|
||||
|
||||
|
@ -2755,10 +2756,11 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|||
ibphysbuf.addr = nesqp->ietf_frame_pbase;
|
||||
ibphysbuf.size = conn_param->private_data_len +
|
||||
sizeof(struct ietf_mpa_frame);
|
||||
tagged_offset = (u64)(unsigned long)nesqp->ietf_frame;
|
||||
ibmr = nesibdev->ibdev.reg_phys_mr((struct ib_pd *)nespd,
|
||||
&ibphysbuf, 1,
|
||||
IB_ACCESS_LOCAL_WRITE,
|
||||
(u64 *)&nesqp->ietf_frame);
|
||||
&tagged_offset);
|
||||
if (!ibmr) {
|
||||
nes_debug(NES_DBG_CM, "Unable to register memory region"
|
||||
"for lSMM for cm_node = %p \n",
|
||||
|
@ -2782,7 +2784,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|||
sizeof(struct ietf_mpa_frame));
|
||||
set_wqe_64bit_value(wqe->wqe_words,
|
||||
NES_IWARP_SQ_WQE_FRAG0_LOW_IDX,
|
||||
(u64)nesqp->ietf_frame);
|
||||
(u64)(unsigned long)nesqp->ietf_frame);
|
||||
wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =
|
||||
cpu_to_le32(conn_param->private_data_len +
|
||||
sizeof(struct ietf_mpa_frame));
|
||||
|
|
Loading…
Reference in New Issue