IB/hfi1: Fix ECN processing in prescan_rxq
When processing ECN via the prescan_rxq path, some fields in the packet structure are passed uninitialized. This can potentially cause NULL pointer exceptions during ECN handling. Reviewed-by: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Dasaratharaman Chandramouli <dasaratharaman.chandramouli@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
Родитель
505efe3e46
Коммит
f2d8a0b367
|
@ -599,7 +599,6 @@ static void __prescan_rxq(struct hfi1_packet *packet)
|
||||||
dd->rhf_offset;
|
dd->rhf_offset;
|
||||||
struct rvt_qp *qp;
|
struct rvt_qp *qp;
|
||||||
struct ib_header *hdr;
|
struct ib_header *hdr;
|
||||||
struct ib_other_headers *ohdr;
|
|
||||||
struct rvt_dev_info *rdi = &dd->verbs_dev.rdi;
|
struct rvt_dev_info *rdi = &dd->verbs_dev.rdi;
|
||||||
u64 rhf = rhf_to_cpu(rhf_addr);
|
u64 rhf = rhf_to_cpu(rhf_addr);
|
||||||
u32 etype = rhf_rcv_type(rhf), qpn, bth1;
|
u32 etype = rhf_rcv_type(rhf), qpn, bth1;
|
||||||
|
@ -615,18 +614,21 @@ static void __prescan_rxq(struct hfi1_packet *packet)
|
||||||
if (etype != RHF_RCV_TYPE_IB)
|
if (etype != RHF_RCV_TYPE_IB)
|
||||||
goto next;
|
goto next;
|
||||||
|
|
||||||
hdr = hfi1_get_msgheader(dd, rhf_addr);
|
packet->hdr = hfi1_get_msgheader(dd, rhf_addr);
|
||||||
|
hdr = packet->hdr;
|
||||||
|
|
||||||
lnh = be16_to_cpu(hdr->lrh[0]) & 3;
|
lnh = be16_to_cpu(hdr->lrh[0]) & 3;
|
||||||
|
|
||||||
if (lnh == HFI1_LRH_BTH)
|
if (lnh == HFI1_LRH_BTH) {
|
||||||
ohdr = &hdr->u.oth;
|
packet->ohdr = &hdr->u.oth;
|
||||||
else if (lnh == HFI1_LRH_GRH)
|
} else if (lnh == HFI1_LRH_GRH) {
|
||||||
ohdr = &hdr->u.l.oth;
|
packet->ohdr = &hdr->u.l.oth;
|
||||||
else
|
packet->rcv_flags |= HFI1_HAS_GRH;
|
||||||
|
} else {
|
||||||
goto next; /* just in case */
|
goto next; /* just in case */
|
||||||
|
}
|
||||||
|
|
||||||
bth1 = be32_to_cpu(ohdr->bth[1]);
|
bth1 = be32_to_cpu(packet->ohdr->bth[1]);
|
||||||
is_ecn = !!(bth1 & (HFI1_FECN_SMASK | HFI1_BECN_SMASK));
|
is_ecn = !!(bth1 & (HFI1_FECN_SMASK | HFI1_BECN_SMASK));
|
||||||
|
|
||||||
if (!is_ecn)
|
if (!is_ecn)
|
||||||
|
@ -646,7 +648,7 @@ static void __prescan_rxq(struct hfi1_packet *packet)
|
||||||
|
|
||||||
/* turn off BECN, FECN */
|
/* turn off BECN, FECN */
|
||||||
bth1 &= ~(HFI1_FECN_SMASK | HFI1_BECN_SMASK);
|
bth1 &= ~(HFI1_FECN_SMASK | HFI1_BECN_SMASK);
|
||||||
ohdr->bth[1] = cpu_to_be32(bth1);
|
packet->ohdr->bth[1] = cpu_to_be32(bth1);
|
||||||
next:
|
next:
|
||||||
update_ps_mdata(&mdata, rcd);
|
update_ps_mdata(&mdata, rcd);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче