staging/rdma/hfi1: Fix regression in send performance
The clear_ahg call is new in hfi1 vs qib. For small messages the progress routine always builds one and clears out the ahg state when the queue has gone to empty which is the predominant case for small messages. Inline the routine and avoid the call to sdma_ahg_free to mitigate the performance impact. Finally, move the routine to qp.h for scope reasons. Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
daac731ba8
Коммит
13a69f5299
|
@ -52,6 +52,7 @@
|
||||||
|
|
||||||
#include <linux/hash.h>
|
#include <linux/hash.h>
|
||||||
#include "verbs.h"
|
#include "verbs.h"
|
||||||
|
#include "sdma.h"
|
||||||
|
|
||||||
#define QPN_MAX (1 << 24)
|
#define QPN_MAX (1 << 24)
|
||||||
#define QPNMAP_ENTRIES (QPN_MAX / PAGE_SIZE / BITS_PER_BYTE)
|
#define QPNMAP_ENTRIES (QPN_MAX / PAGE_SIZE / BITS_PER_BYTE)
|
||||||
|
@ -116,6 +117,20 @@ static inline struct hfi1_qp *hfi1_lookup_qpn(struct hfi1_ibport *ibp,
|
||||||
return qp;
|
return qp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clear_ahg - reset ahg status in qp
|
||||||
|
* @qp - qp pointer
|
||||||
|
*/
|
||||||
|
static inline void clear_ahg(struct hfi1_qp *qp)
|
||||||
|
{
|
||||||
|
qp->s_hdr->ahgcount = 0;
|
||||||
|
qp->s_flags &= ~(HFI1_S_AHG_VALID | HFI1_S_AHG_CLEAR);
|
||||||
|
if (qp->s_sde && qp->s_ahgidx >= 0)
|
||||||
|
sdma_ahg_free(qp->s_sde, qp->s_ahgidx);
|
||||||
|
qp->s_ahgidx = -1;
|
||||||
|
qp->s_sde = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hfi1_error_qp - put a QP into the error state
|
* hfi1_error_qp - put a QP into the error state
|
||||||
* @qp: the QP to put into the error state
|
* @qp: the QP to put into the error state
|
||||||
|
|
|
@ -695,19 +695,6 @@ u32 hfi1_make_grh(struct hfi1_ibport *ibp, struct ib_grh *hdr,
|
||||||
return sizeof(struct ib_grh) / sizeof(u32);
|
return sizeof(struct ib_grh) / sizeof(u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* free_ahg - clear ahg from QP
|
|
||||||
*/
|
|
||||||
void clear_ahg(struct hfi1_qp *qp)
|
|
||||||
{
|
|
||||||
qp->s_hdr->ahgcount = 0;
|
|
||||||
qp->s_flags &= ~(HFI1_S_AHG_VALID | HFI1_S_AHG_CLEAR);
|
|
||||||
if (qp->s_sde)
|
|
||||||
sdma_ahg_free(qp->s_sde, qp->s_ahgidx);
|
|
||||||
qp->s_ahgidx = -1;
|
|
||||||
qp->s_sde = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define BTH2_OFFSET (offsetof(struct hfi1_pio_header, hdr.u.oth.bth[2]) / 4)
|
#define BTH2_OFFSET (offsetof(struct hfi1_pio_header, hdr.u.oth.bth[2]) / 4)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1078,8 +1078,6 @@ int hfi1_ruc_check_hdr(struct hfi1_ibport *ibp, struct hfi1_ib_header *hdr,
|
||||||
u32 hfi1_make_grh(struct hfi1_ibport *ibp, struct ib_grh *hdr,
|
u32 hfi1_make_grh(struct hfi1_ibport *ibp, struct ib_grh *hdr,
|
||||||
struct ib_global_route *grh, u32 hwords, u32 nwords);
|
struct ib_global_route *grh, u32 hwords, u32 nwords);
|
||||||
|
|
||||||
void clear_ahg(struct hfi1_qp *qp);
|
|
||||||
|
|
||||||
void hfi1_make_ruc_header(struct hfi1_qp *qp, struct hfi1_other_headers *ohdr,
|
void hfi1_make_ruc_header(struct hfi1_qp *qp, struct hfi1_other_headers *ohdr,
|
||||||
u32 bth0, u32 bth2, int middle);
|
u32 bth0, u32 bth2, int middle);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче