mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
IB/hfi1: Fix loss of BECN with AHG
commit 0a0bcb046b2f0c15b89f8c1b08ad3de601a83c66 upstream. AHG may be armed to use the stored header, which by design is limited to edits in the PSN/A 32 bit word (bth2). When the code is trying to send a BECN, the use of the stored header will lose the BECN bit. Fix by avoiding AHG when getting ready to send a BECN. This is accomplished by always claiming the packet is not a middle packet which is an AHG precursor. BECNs are not a normal case and this should not hurt AHG optimizations. Cc: <stable@vger.kernel.org> # 4.14.x Reviewed-by: Michael J. Ruhl <michael.j.ruhl@intel.com> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
7f185bc79b
commit
79181a45aa
@ -745,6 +745,20 @@ static inline void hfi1_make_ruc_bth(struct rvt_qp *qp,
|
||||
ohdr->bth[2] = cpu_to_be32(bth2);
|
||||
}
|
||||
|
||||
/**
|
||||
* hfi1_make_ruc_header_16B - build a 16B header
|
||||
* @qp: the queue pair
|
||||
* @ohdr: a pointer to the destination header memory
|
||||
* @bth0: bth0 passed in from the RC/UC builder
|
||||
* @bth2: bth2 passed in from the RC/UC builder
|
||||
* @middle: non zero implies indicates ahg "could" be used
|
||||
* @ps: the current packet state
|
||||
*
|
||||
* This routine may disarm ahg under these situations:
|
||||
* - packet needs a GRH
|
||||
* - BECN needed
|
||||
* - migration state not IB_MIG_MIGRATED
|
||||
*/
|
||||
static inline void hfi1_make_ruc_header_16B(struct rvt_qp *qp,
|
||||
struct ib_other_headers *ohdr,
|
||||
u32 bth0, u32 bth2, int middle,
|
||||
@ -789,6 +803,12 @@ static inline void hfi1_make_ruc_header_16B(struct rvt_qp *qp,
|
||||
else
|
||||
middle = 0;
|
||||
|
||||
if (qp->s_flags & RVT_S_ECN) {
|
||||
qp->s_flags &= ~RVT_S_ECN;
|
||||
/* we recently received a FECN, so return a BECN */
|
||||
becn = true;
|
||||
middle = 0;
|
||||
}
|
||||
if (middle)
|
||||
build_ahg(qp, bth2);
|
||||
else
|
||||
@ -796,11 +816,6 @@ static inline void hfi1_make_ruc_header_16B(struct rvt_qp *qp,
|
||||
|
||||
bth0 |= pkey;
|
||||
bth0 |= extra_bytes << 20;
|
||||
if (qp->s_flags & RVT_S_ECN) {
|
||||
qp->s_flags &= ~RVT_S_ECN;
|
||||
/* we recently received a FECN, so return a BECN */
|
||||
becn = 1;
|
||||
}
|
||||
hfi1_make_ruc_bth(qp, ohdr, bth0, bth1, bth2);
|
||||
|
||||
if (!ppd->lid)
|
||||
@ -818,6 +833,20 @@ static inline void hfi1_make_ruc_header_16B(struct rvt_qp *qp,
|
||||
pkey, becn, 0, l4, priv->s_sc);
|
||||
}
|
||||
|
||||
/**
|
||||
* hfi1_make_ruc_header_9B - build a 9B header
|
||||
* @qp: the queue pair
|
||||
* @ohdr: a pointer to the destination header memory
|
||||
* @bth0: bth0 passed in from the RC/UC builder
|
||||
* @bth2: bth2 passed in from the RC/UC builder
|
||||
* @middle: non zero implies indicates ahg "could" be used
|
||||
* @ps: the current packet state
|
||||
*
|
||||
* This routine may disarm ahg under these situations:
|
||||
* - packet needs a GRH
|
||||
* - BECN needed
|
||||
* - migration state not IB_MIG_MIGRATED
|
||||
*/
|
||||
static inline void hfi1_make_ruc_header_9B(struct rvt_qp *qp,
|
||||
struct ib_other_headers *ohdr,
|
||||
u32 bth0, u32 bth2, int middle,
|
||||
@ -853,6 +882,12 @@ static inline void hfi1_make_ruc_header_9B(struct rvt_qp *qp,
|
||||
else
|
||||
middle = 0;
|
||||
|
||||
if (qp->s_flags & RVT_S_ECN) {
|
||||
qp->s_flags &= ~RVT_S_ECN;
|
||||
/* we recently received a FECN, so return a BECN */
|
||||
bth1 |= (IB_BECN_MASK << IB_BECN_SHIFT);
|
||||
middle = 0;
|
||||
}
|
||||
if (middle)
|
||||
build_ahg(qp, bth2);
|
||||
else
|
||||
@ -860,11 +895,6 @@ static inline void hfi1_make_ruc_header_9B(struct rvt_qp *qp,
|
||||
|
||||
bth0 |= pkey;
|
||||
bth0 |= extra_bytes << 20;
|
||||
if (qp->s_flags & RVT_S_ECN) {
|
||||
qp->s_flags &= ~RVT_S_ECN;
|
||||
/* we recently received a FECN, so return a BECN */
|
||||
bth1 |= (IB_BECN_MASK << IB_BECN_SHIFT);
|
||||
}
|
||||
hfi1_make_ruc_bth(qp, ohdr, bth0, bth1, bth2);
|
||||
|
||||
if (!ppd->lid)
|
||||
|
Loading…
x
Reference in New Issue
Block a user