Commit 2c8ccb37 authored by Bernard Metzler's avatar Bernard Metzler Committed by Doug Ledford

RDMA/siw: Change CQ flags from 64->32 bits

This patch changes the driver/user shared (mmapped) CQ notification
flags field from unsigned 64-bits size to unsigned 32-bits size. This
enables building siw on 32-bit architectures.

This patch changes the siw-abi, but as siw was only just merged in
this merge window cycle, there are no released kernels with the prior
abi.  We are making no attempt to be binary compatible with siw user
space libraries prior to the merge of siw into the upstream kernel,
only moving forward with upstream kernels and upstream rdma-core
provided siw libraries are we guaranteeing compatibility.
Signed-off-by: default avatarBernard Metzler <bmt@zurich.ibm.com>
Link: https://lore.kernel.org/r/20190809151816.13018-1-bmt@zurich.ibm.comSigned-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 932727c5
config RDMA_SIW config RDMA_SIW
tristate "Software RDMA over TCP/IP (iWARP) driver" tristate "Software RDMA over TCP/IP (iWARP) driver"
depends on INET && INFINIBAND && LIBCRC32C && 64BIT depends on INET && INFINIBAND && LIBCRC32C
select DMA_VIRT_OPS select DMA_VIRT_OPS
help help
This driver implements the iWARP RDMA transport over This driver implements the iWARP RDMA transport over
......
...@@ -214,7 +214,7 @@ struct siw_wqe { ...@@ -214,7 +214,7 @@ struct siw_wqe {
struct siw_cq { struct siw_cq {
struct ib_cq base_cq; struct ib_cq base_cq;
spinlock_t lock; spinlock_t lock;
u64 *notify; struct siw_cq_ctrl *notify;
struct siw_cqe *queue; struct siw_cqe *queue;
u32 cq_put; u32 cq_put;
u32 cq_get; u32 cq_get;
......
...@@ -1013,18 +1013,24 @@ int siw_activate_tx(struct siw_qp *qp) ...@@ -1013,18 +1013,24 @@ int siw_activate_tx(struct siw_qp *qp)
*/ */
static bool siw_cq_notify_now(struct siw_cq *cq, u32 flags) static bool siw_cq_notify_now(struct siw_cq *cq, u32 flags)
{ {
u64 cq_notify; u32 cq_notify;
if (!cq->base_cq.comp_handler) if (!cq->base_cq.comp_handler)
return false; return false;
cq_notify = READ_ONCE(*cq->notify); /* Read application shared notification state */
cq_notify = READ_ONCE(cq->notify->flags);
if ((cq_notify & SIW_NOTIFY_NEXT_COMPLETION) || if ((cq_notify & SIW_NOTIFY_NEXT_COMPLETION) ||
((cq_notify & SIW_NOTIFY_SOLICITED) && ((cq_notify & SIW_NOTIFY_SOLICITED) &&
(flags & SIW_WQE_SOLICITED))) { (flags & SIW_WQE_SOLICITED))) {
/* dis-arm CQ */ /*
smp_store_mb(*cq->notify, SIW_NOTIFY_NOT); * CQ notification is one-shot: Since the
* current CQE causes user notification,
* the CQ gets dis-aremd and must be re-aremd
* by the user for a new notification.
*/
WRITE_ONCE(cq->notify->flags, SIW_NOTIFY_NOT);
return true; return true;
} }
......
...@@ -1049,7 +1049,7 @@ int siw_create_cq(struct ib_cq *base_cq, const struct ib_cq_init_attr *attr, ...@@ -1049,7 +1049,7 @@ int siw_create_cq(struct ib_cq *base_cq, const struct ib_cq_init_attr *attr,
spin_lock_init(&cq->lock); spin_lock_init(&cq->lock);
cq->notify = &((struct siw_cq_ctrl *)&cq->queue[size])->notify; cq->notify = (struct siw_cq_ctrl *)&cq->queue[size];
if (udata) { if (udata) {
struct siw_uresp_create_cq uresp = {}; struct siw_uresp_create_cq uresp = {};
...@@ -1141,11 +1141,17 @@ int siw_req_notify_cq(struct ib_cq *base_cq, enum ib_cq_notify_flags flags) ...@@ -1141,11 +1141,17 @@ int siw_req_notify_cq(struct ib_cq *base_cq, enum ib_cq_notify_flags flags)
siw_dbg_cq(cq, "flags: 0x%02x\n", flags); siw_dbg_cq(cq, "flags: 0x%02x\n", flags);
if ((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED) if ((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED)
/* CQ event for next solicited completion */ /*
smp_store_mb(*cq->notify, SIW_NOTIFY_SOLICITED); * Enable CQ event for next solicited completion.
* and make it visible to all associated producers.
*/
smp_store_mb(cq->notify->flags, SIW_NOTIFY_SOLICITED);
else else
/* CQ event for any signalled completion */ /*
smp_store_mb(*cq->notify, SIW_NOTIFY_ALL); * Enable CQ event for any signalled completion.
* and make it visible to all associated producers.
*/
smp_store_mb(cq->notify->flags, SIW_NOTIFY_ALL);
if (flags & IB_CQ_REPORT_MISSED_EVENTS) if (flags & IB_CQ_REPORT_MISSED_EVENTS)
return cq->cq_put - cq->cq_get; return cq->cq_put - cq->cq_get;
......
...@@ -180,6 +180,7 @@ struct siw_cqe { ...@@ -180,6 +180,7 @@ struct siw_cqe {
* to control CQ arming. * to control CQ arming.
*/ */
struct siw_cq_ctrl { struct siw_cq_ctrl {
__aligned_u64 notify; __u32 flags;
__u32 pad;
}; };
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment