lkml.org 
[lkml]   [2016]   [Aug]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.6 18/56] IB/hfi1: Correct issues with sc5 computation
    Date
    4.6-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Mike Marciniszyn <mike.marciniszyn@intel.com>

    commit 896ce45da2c2f4abc508d443fdecde7de0b3fa7e upstream.

    There are several computatations of the sc in the
    ud receive routine.

    Besides the code duplication, all are wrong when the
    sc is greater than 15. In that case the code incorrectly
    or's a 1 into the computed sc instead of 1 shifted left
    by 4.

    Fix precomputed sc5 by using an already implemented routine
    hdr2sc() and deleting flawed duplicated code.

    Cc: Stable <stable@vger.kernel.org> # 4.6+
    Reviewed-by: Dennis Dalessandro <dennis.dalessandro@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>

    ---
    drivers/staging/rdma/hfi1/ud.c | 23 +++--------------------
    1 file changed, 3 insertions(+), 20 deletions(-)

    --- a/drivers/staging/rdma/hfi1/ud.c
    +++ b/drivers/staging/rdma/hfi1/ud.c
    @@ -678,8 +678,7 @@ void hfi1_ud_rcv(struct hfi1_packet *pac
    u32 tlen = packet->tlen;
    struct rvt_qp *qp = packet->qp;
    bool has_grh = rcv_flags & HFI1_HAS_GRH;
    - bool sc4_bit = has_sc4_bit(packet);
    - u8 sc;
    + u8 sc5 = hdr2sc((struct hfi1_message_header *)hdr, packet->rhf);
    u32 bth1;
    int is_mcast;
    struct ib_grh *grh = NULL;
    @@ -697,10 +696,8 @@ void hfi1_ud_rcv(struct hfi1_packet *pac
    */
    struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
    u32 lqpn = be32_to_cpu(ohdr->bth[1]) & RVT_QPN_MASK;
    - u8 sl, sc5;
    + u8 sl;

    - sc5 = (be16_to_cpu(hdr->lrh[0]) >> 12) & 0xf;
    - sc5 |= sc4_bit;
    sl = ibp->sc_to_sl[sc5];

    process_becn(ppd, sl, 0, lqpn, 0, IB_CC_SVCTYPE_UD);
    @@ -717,10 +714,6 @@ void hfi1_ud_rcv(struct hfi1_packet *pac

    if (!is_mcast && (opcode != IB_OPCODE_CNP) && bth1 & HFI1_FECN_SMASK) {
    u16 slid = be16_to_cpu(hdr->lrh[3]);
    - u8 sc5;
    -
    - sc5 = (be16_to_cpu(hdr->lrh[0]) >> 12) & 0xf;
    - sc5 |= sc4_bit;

    return_cnp(ibp, qp, src_qp, pkey, dlid, slid, sc5, grh);
    }
    @@ -745,10 +738,6 @@ void hfi1_ud_rcv(struct hfi1_packet *pac
    if (qp->ibqp.qp_num > 1) {
    struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
    u16 slid;
    - u8 sc5;
    -
    - sc5 = (be16_to_cpu(hdr->lrh[0]) >> 12) & 0xf;
    - sc5 |= sc4_bit;

    slid = be16_to_cpu(hdr->lrh[3]);
    if (unlikely(rcv_pkey_check(ppd, pkey, sc5, slid))) {
    @@ -790,10 +779,6 @@ void hfi1_ud_rcv(struct hfi1_packet *pac
    /* Received on QP0, and so by definition, this is an SMP */
    struct opa_smp *smp = (struct opa_smp *)data;
    u16 slid = be16_to_cpu(hdr->lrh[3]);
    - u8 sc5;
    -
    - sc5 = (be16_to_cpu(hdr->lrh[0]) >> 12) & 0xf;
    - sc5 |= sc4_bit;

    if (opa_smp_check(ibp, pkey, sc5, qp, slid, smp))
    goto drop;
    @@ -890,9 +875,7 @@ void hfi1_ud_rcv(struct hfi1_packet *pac
    }

    wc.slid = be16_to_cpu(hdr->lrh[3]);
    - sc = (be16_to_cpu(hdr->lrh[0]) >> 12) & 0xf;
    - sc |= sc4_bit;
    - wc.sl = ibp->sc_to_sl[sc];
    + wc.sl = ibp->sc_to_sl[sc5];

    /*
    * Save the LMC lower bits if the destination LID is a unicast LID.

    \
     
     \ /
      Last update: 2016-09-17 09:56    [W:3.280 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site