IB/mthca: Avoid alignment traps when writing doorbells
Architectures such as ia64 see alignment traps when doing a 64-bit read from __be32 doorbell[2] arrays to do doorbell writes in mthca_write64(). Fix this by just passing the two halves of the doorbell value into mthca_write64(). This actually improves the generated code by allowing the compiler to see what's going on better. Signed-off-by: Roland Dreier <rolandd@cisco.com>
このコミットが含まれているのは:
@@ -204,16 +204,11 @@ static void dump_cqe(struct mthca_dev *dev, void *cqe_ptr)
|
||||
static inline void update_cons_index(struct mthca_dev *dev, struct mthca_cq *cq,
|
||||
int incr)
|
||||
{
|
||||
__be32 doorbell[2];
|
||||
|
||||
if (mthca_is_memfree(dev)) {
|
||||
*cq->set_ci_db = cpu_to_be32(cq->cons_index);
|
||||
wmb();
|
||||
} else {
|
||||
doorbell[0] = cpu_to_be32(MTHCA_TAVOR_CQ_DB_INC_CI | cq->cqn);
|
||||
doorbell[1] = cpu_to_be32(incr - 1);
|
||||
|
||||
mthca_write64(doorbell,
|
||||
mthca_write64(MTHCA_TAVOR_CQ_DB_INC_CI | cq->cqn, incr - 1,
|
||||
dev->kar + MTHCA_CQ_DOORBELL,
|
||||
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
|
||||
/*
|
||||
@@ -731,17 +726,12 @@ repoll:
|
||||
|
||||
int mthca_tavor_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags)
|
||||
{
|
||||
__be32 doorbell[2];
|
||||
u32 dbhi = ((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ?
|
||||
MTHCA_TAVOR_CQ_DB_REQ_NOT_SOL :
|
||||
MTHCA_TAVOR_CQ_DB_REQ_NOT) |
|
||||
to_mcq(cq)->cqn;
|
||||
|
||||
doorbell[0] = cpu_to_be32(((flags & IB_CQ_SOLICITED_MASK) ==
|
||||
IB_CQ_SOLICITED ?
|
||||
MTHCA_TAVOR_CQ_DB_REQ_NOT_SOL :
|
||||
MTHCA_TAVOR_CQ_DB_REQ_NOT) |
|
||||
to_mcq(cq)->cqn);
|
||||
doorbell[1] = (__force __be32) 0xffffffff;
|
||||
|
||||
mthca_write64(doorbell,
|
||||
to_mdev(cq->device)->kar + MTHCA_CQ_DOORBELL,
|
||||
mthca_write64(dbhi, 0xffffffff, to_mdev(cq->device)->kar + MTHCA_CQ_DOORBELL,
|
||||
MTHCA_GET_DOORBELL_LOCK(&to_mdev(cq->device)->doorbell_lock));
|
||||
|
||||
return 0;
|
||||
@@ -750,19 +740,16 @@ int mthca_tavor_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags)
|
||||
int mthca_arbel_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
|
||||
{
|
||||
struct mthca_cq *cq = to_mcq(ibcq);
|
||||
__be32 doorbell[2];
|
||||
u32 sn;
|
||||
__be32 ci;
|
||||
__be32 db_rec[2];
|
||||
u32 dbhi;
|
||||
u32 sn = cq->arm_sn & 3;
|
||||
|
||||
sn = cq->arm_sn & 3;
|
||||
ci = cpu_to_be32(cq->cons_index);
|
||||
db_rec[0] = cpu_to_be32(cq->cons_index);
|
||||
db_rec[1] = cpu_to_be32((cq->cqn << 8) | (2 << 5) | (sn << 3) |
|
||||
((flags & IB_CQ_SOLICITED_MASK) ==
|
||||
IB_CQ_SOLICITED ? 1 : 2));
|
||||
|
||||
doorbell[0] = ci;
|
||||
doorbell[1] = cpu_to_be32((cq->cqn << 8) | (2 << 5) | (sn << 3) |
|
||||
((flags & IB_CQ_SOLICITED_MASK) ==
|
||||
IB_CQ_SOLICITED ? 1 : 2));
|
||||
|
||||
mthca_write_db_rec(doorbell, cq->arm_db);
|
||||
mthca_write_db_rec(db_rec, cq->arm_db);
|
||||
|
||||
/*
|
||||
* Make sure that the doorbell record in host memory is
|
||||
@@ -770,14 +757,12 @@ int mthca_arbel_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
|
||||
*/
|
||||
wmb();
|
||||
|
||||
doorbell[0] = cpu_to_be32((sn << 28) |
|
||||
((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ?
|
||||
MTHCA_ARBEL_CQ_DB_REQ_NOT_SOL :
|
||||
MTHCA_ARBEL_CQ_DB_REQ_NOT) |
|
||||
cq->cqn);
|
||||
doorbell[1] = ci;
|
||||
dbhi = (sn << 28) |
|
||||
((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ?
|
||||
MTHCA_ARBEL_CQ_DB_REQ_NOT_SOL :
|
||||
MTHCA_ARBEL_CQ_DB_REQ_NOT) | cq->cqn;
|
||||
|
||||
mthca_write64(doorbell,
|
||||
mthca_write64(dbhi, cq->cons_index,
|
||||
to_mdev(ibcq->device)->kar + MTHCA_CQ_DOORBELL,
|
||||
MTHCA_GET_DOORBELL_LOCK(&to_mdev(ibcq->device)->doorbell_lock));
|
||||
|
||||
|
新しいイシューから参照
ユーザーをブロックする