IB: Return qp pointer as part of ib_wc

struct ib_wc currently only includes the local QP number: this matches
the IB spec, but seems mostly useless. The following patch replaces
this with the pointer to qp itself, and updates all low level drivers
and all users.

This has the following advantages:
- Ability to get a per-qp context through wc->qp->qp_context
- Existing drivers already have the qp pointer ready in poll cq, so
  this change actually saves a tiny bit (extra memory read) on data path
  (for ehca it would actually be expensive to find the QP pointer when
  polling a CQ, but ehca does not support SRQ so we can leave wc->qp as
  NULL for ehca)
- Users that need the QP number can still get it through wc->qp->qp_num

Use case:

In IPoIB connected mode code, I have a common CQ shared by multiple
QPs.  To track connection usage, I need a way to get at some per-QP
context upon the completion, and I would like to avoid allocating
context object per work request just to stick a QP pointer into it.
With this code, I can just use wc->qp->qp_context.

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
Michael S. Tsirkin 2006-12-31 21:09:42 +02:00 committed by Roland Dreier
parent 459d6e2a54
commit 062dbb69f3
12 changed files with 28 additions and 25 deletions

View File

@ -642,7 +642,8 @@ static void snoop_recv(struct ib_mad_qp_info *qp_info,
spin_unlock_irqrestore(&qp_info->snoop_lock, flags); spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
} }
static void build_smp_wc(u64 wr_id, u16 slid, u16 pkey_index, u8 port_num, static void build_smp_wc(struct ib_qp *qp,
u64 wr_id, u16 slid, u16 pkey_index, u8 port_num,
struct ib_wc *wc) struct ib_wc *wc)
{ {
memset(wc, 0, sizeof *wc); memset(wc, 0, sizeof *wc);
@ -652,7 +653,7 @@ static void build_smp_wc(u64 wr_id, u16 slid, u16 pkey_index, u8 port_num,
wc->pkey_index = pkey_index; wc->pkey_index = pkey_index;
wc->byte_len = sizeof(struct ib_mad) + sizeof(struct ib_grh); wc->byte_len = sizeof(struct ib_mad) + sizeof(struct ib_grh);
wc->src_qp = IB_QP0; wc->src_qp = IB_QP0;
wc->qp_num = IB_QP0; wc->qp = qp;
wc->slid = slid; wc->slid = slid;
wc->sl = 0; wc->sl = 0;
wc->dlid_path_bits = 0; wc->dlid_path_bits = 0;
@ -713,7 +714,8 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
goto out; goto out;
} }
build_smp_wc(send_wr->wr_id, be16_to_cpu(smp->dr_slid), build_smp_wc(mad_agent_priv->agent.qp,
send_wr->wr_id, be16_to_cpu(smp->dr_slid),
send_wr->wr.ud.pkey_index, send_wr->wr.ud.pkey_index,
send_wr->wr.ud.port_num, &mad_wc); send_wr->wr.ud.port_num, &mad_wc);
@ -2355,7 +2357,8 @@ static void local_completions(struct work_struct *work)
* Defined behavior is to complete response * Defined behavior is to complete response
* before request * before request
*/ */
build_smp_wc((unsigned long) local->mad_send_wr, build_smp_wc(recv_mad_agent->agent.qp,
(unsigned long) local->mad_send_wr,
be16_to_cpu(IB_LID_PERMISSIVE), be16_to_cpu(IB_LID_PERMISSIVE),
0, recv_mad_agent->agent.port_num, &wc); 0, recv_mad_agent->agent.port_num, &wc);

View File

@ -933,7 +933,7 @@ ssize_t ib_uverbs_poll_cq(struct ib_uverbs_file *file,
resp->wc[i].vendor_err = wc[i].vendor_err; resp->wc[i].vendor_err = wc[i].vendor_err;
resp->wc[i].byte_len = wc[i].byte_len; resp->wc[i].byte_len = wc[i].byte_len;
resp->wc[i].imm_data = (__u32 __force) wc[i].imm_data; resp->wc[i].imm_data = (__u32 __force) wc[i].imm_data;
resp->wc[i].qp_num = wc[i].qp_num; resp->wc[i].qp_num = wc[i].qp->qp_num;
resp->wc[i].src_qp = wc[i].src_qp; resp->wc[i].src_qp = wc[i].src_qp;
resp->wc[i].wc_flags = wc[i].wc_flags; resp->wc[i].wc_flags = wc[i].wc_flags;
resp->wc[i].pkey_index = wc[i].pkey_index; resp->wc[i].pkey_index = wc[i].pkey_index;

View File

@ -153,7 +153,7 @@ static inline int c2_poll_one(struct c2_dev *c2dev,
entry->status = c2_cqe_status_to_openib(c2_wr_get_result(ce)); entry->status = c2_cqe_status_to_openib(c2_wr_get_result(ce));
entry->wr_id = ce->hdr.context; entry->wr_id = ce->hdr.context;
entry->qp_num = ce->handle; entry->qp = &qp->ibqp;
entry->wc_flags = 0; entry->wc_flags = 0;
entry->slid = 0; entry->slid = 0;
entry->sl = 0; entry->sl = 0;

View File

@ -579,7 +579,7 @@ poll_cq_one_read_cqe:
} else } else
wc->status = IB_WC_SUCCESS; wc->status = IB_WC_SUCCESS;
wc->qp_num = cqe->local_qp_number; wc->qp = NULL;
wc->byte_len = cqe->nr_bytes_transferred; wc->byte_len = cqe->nr_bytes_transferred;
wc->pkey_index = cqe->pkey_index; wc->pkey_index = cqe->pkey_index;
wc->slid = cqe->rlid; wc->slid = cqe->rlid;

View File

@ -379,7 +379,7 @@ void ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err)
wc.vendor_err = 0; wc.vendor_err = 0;
wc.byte_len = 0; wc.byte_len = 0;
wc.imm_data = 0; wc.imm_data = 0;
wc.qp_num = qp->ibqp.qp_num; wc.qp = &qp->ibqp;
wc.src_qp = 0; wc.src_qp = 0;
wc.wc_flags = 0; wc.wc_flags = 0;
wc.pkey_index = 0; wc.pkey_index = 0;

View File

@ -702,7 +702,7 @@ void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc)
wc->opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; wc->opcode = ib_ipath_wc_opcode[wqe->wr.opcode];
wc->vendor_err = 0; wc->vendor_err = 0;
wc->byte_len = 0; wc->byte_len = 0;
wc->qp_num = qp->ibqp.qp_num; wc->qp = &qp->ibqp;
wc->src_qp = qp->remote_qpn; wc->src_qp = qp->remote_qpn;
wc->pkey_index = 0; wc->pkey_index = 0;
wc->slid = qp->remote_ah_attr.dlid; wc->slid = qp->remote_ah_attr.dlid;
@ -836,7 +836,7 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode)
wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode];
wc.vendor_err = 0; wc.vendor_err = 0;
wc.byte_len = wqe->length; wc.byte_len = wqe->length;
wc.qp_num = qp->ibqp.qp_num; wc.qp = &qp->ibqp;
wc.src_qp = qp->remote_qpn; wc.src_qp = qp->remote_qpn;
wc.pkey_index = 0; wc.pkey_index = 0;
wc.slid = qp->remote_ah_attr.dlid; wc.slid = qp->remote_ah_attr.dlid;
@ -951,7 +951,7 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode)
wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode];
wc.vendor_err = 0; wc.vendor_err = 0;
wc.byte_len = 0; wc.byte_len = 0;
wc.qp_num = qp->ibqp.qp_num; wc.qp = &qp->ibqp;
wc.src_qp = qp->remote_qpn; wc.src_qp = qp->remote_qpn;
wc.pkey_index = 0; wc.pkey_index = 0;
wc.slid = qp->remote_ah_attr.dlid; wc.slid = qp->remote_ah_attr.dlid;
@ -1511,7 +1511,7 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
wc.status = IB_WC_SUCCESS; wc.status = IB_WC_SUCCESS;
wc.opcode = IB_WC_RECV; wc.opcode = IB_WC_RECV;
wc.vendor_err = 0; wc.vendor_err = 0;
wc.qp_num = qp->ibqp.qp_num; wc.qp = &qp->ibqp;
wc.src_qp = qp->remote_qpn; wc.src_qp = qp->remote_qpn;
wc.pkey_index = 0; wc.pkey_index = 0;
wc.slid = qp->remote_ah_attr.dlid; wc.slid = qp->remote_ah_attr.dlid;

View File

@ -137,7 +137,7 @@ bad_lkey:
wc.vendor_err = 0; wc.vendor_err = 0;
wc.byte_len = 0; wc.byte_len = 0;
wc.imm_data = 0; wc.imm_data = 0;
wc.qp_num = qp->ibqp.qp_num; wc.qp = &qp->ibqp;
wc.src_qp = 0; wc.src_qp = 0;
wc.wc_flags = 0; wc.wc_flags = 0;
wc.pkey_index = 0; wc.pkey_index = 0;
@ -336,7 +336,7 @@ again:
wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode];
wc.vendor_err = 0; wc.vendor_err = 0;
wc.byte_len = 0; wc.byte_len = 0;
wc.qp_num = sqp->ibqp.qp_num; wc.qp = &sqp->ibqp;
wc.src_qp = sqp->remote_qpn; wc.src_qp = sqp->remote_qpn;
wc.pkey_index = 0; wc.pkey_index = 0;
wc.slid = sqp->remote_ah_attr.dlid; wc.slid = sqp->remote_ah_attr.dlid;
@ -426,7 +426,7 @@ again:
wc.status = IB_WC_SUCCESS; wc.status = IB_WC_SUCCESS;
wc.vendor_err = 0; wc.vendor_err = 0;
wc.byte_len = wqe->length; wc.byte_len = wqe->length;
wc.qp_num = qp->ibqp.qp_num; wc.qp = &qp->ibqp;
wc.src_qp = qp->remote_qpn; wc.src_qp = qp->remote_qpn;
/* XXX do we know which pkey matched? Only needed for GSI. */ /* XXX do we know which pkey matched? Only needed for GSI. */
wc.pkey_index = 0; wc.pkey_index = 0;
@ -447,7 +447,7 @@ send_comp:
wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode];
wc.vendor_err = 0; wc.vendor_err = 0;
wc.byte_len = wqe->length; wc.byte_len = wqe->length;
wc.qp_num = sqp->ibqp.qp_num; wc.qp = &sqp->ibqp;
wc.src_qp = 0; wc.src_qp = 0;
wc.pkey_index = 0; wc.pkey_index = 0;
wc.slid = 0; wc.slid = 0;

View File

@ -49,7 +49,7 @@ static void complete_last_send(struct ipath_qp *qp, struct ipath_swqe *wqe,
wc->opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; wc->opcode = ib_ipath_wc_opcode[wqe->wr.opcode];
wc->vendor_err = 0; wc->vendor_err = 0;
wc->byte_len = wqe->length; wc->byte_len = wqe->length;
wc->qp_num = qp->ibqp.qp_num; wc->qp = &qp->ibqp;
wc->src_qp = qp->remote_qpn; wc->src_qp = qp->remote_qpn;
wc->pkey_index = 0; wc->pkey_index = 0;
wc->slid = qp->remote_ah_attr.dlid; wc->slid = qp->remote_ah_attr.dlid;
@ -411,7 +411,7 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
wc.status = IB_WC_SUCCESS; wc.status = IB_WC_SUCCESS;
wc.opcode = IB_WC_RECV; wc.opcode = IB_WC_RECV;
wc.vendor_err = 0; wc.vendor_err = 0;
wc.qp_num = qp->ibqp.qp_num; wc.qp = &qp->ibqp;
wc.src_qp = qp->remote_qpn; wc.src_qp = qp->remote_qpn;
wc.pkey_index = 0; wc.pkey_index = 0;
wc.slid = qp->remote_ah_attr.dlid; wc.slid = qp->remote_ah_attr.dlid;

View File

@ -66,7 +66,7 @@ bad_lkey:
wc.vendor_err = 0; wc.vendor_err = 0;
wc.byte_len = 0; wc.byte_len = 0;
wc.imm_data = 0; wc.imm_data = 0;
wc.qp_num = qp->ibqp.qp_num; wc.qp = &qp->ibqp;
wc.src_qp = 0; wc.src_qp = 0;
wc.wc_flags = 0; wc.wc_flags = 0;
wc.pkey_index = 0; wc.pkey_index = 0;
@ -255,7 +255,7 @@ static void ipath_ud_loopback(struct ipath_qp *sqp,
wc->status = IB_WC_SUCCESS; wc->status = IB_WC_SUCCESS;
wc->opcode = IB_WC_RECV; wc->opcode = IB_WC_RECV;
wc->vendor_err = 0; wc->vendor_err = 0;
wc->qp_num = qp->ibqp.qp_num; wc->qp = &qp->ibqp;
wc->src_qp = sqp->ibqp.qp_num; wc->src_qp = sqp->ibqp.qp_num;
/* XXX do we know which pkey matched? Only needed for GSI. */ /* XXX do we know which pkey matched? Only needed for GSI. */
wc->pkey_index = 0; wc->pkey_index = 0;
@ -474,7 +474,7 @@ done:
wc.vendor_err = 0; wc.vendor_err = 0;
wc.opcode = IB_WC_SEND; wc.opcode = IB_WC_SEND;
wc.byte_len = len; wc.byte_len = len;
wc.qp_num = qp->ibqp.qp_num; wc.qp = &qp->ibqp;
wc.src_qp = 0; wc.src_qp = 0;
wc.wc_flags = 0; wc.wc_flags = 0;
/* XXX initialize other fields? */ /* XXX initialize other fields? */
@ -651,7 +651,7 @@ void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
wc.status = IB_WC_SUCCESS; wc.status = IB_WC_SUCCESS;
wc.opcode = IB_WC_RECV; wc.opcode = IB_WC_RECV;
wc.vendor_err = 0; wc.vendor_err = 0;
wc.qp_num = qp->ibqp.qp_num; wc.qp = &qp->ibqp;
wc.src_qp = src_qp; wc.src_qp = src_qp;
/* XXX do we know which pkey matched? Only needed for GSI. */ /* XXX do we know which pkey matched? Only needed for GSI. */
wc.pkey_index = 0; wc.pkey_index = 0;

View File

@ -1854,7 +1854,7 @@ int mthca_MAD_IFC(struct mthca_dev *dev, int ignore_mkey, int ignore_bkey,
memset(inbox + 256, 0, 256); memset(inbox + 256, 0, 256);
MTHCA_PUT(inbox, in_wc->qp_num, MAD_IFC_MY_QPN_OFFSET); MTHCA_PUT(inbox, in_wc->qp->qp_num, MAD_IFC_MY_QPN_OFFSET);
MTHCA_PUT(inbox, in_wc->src_qp, MAD_IFC_RQPN_OFFSET); MTHCA_PUT(inbox, in_wc->src_qp, MAD_IFC_RQPN_OFFSET);
val = in_wc->sl << 4; val = in_wc->sl << 4;

View File

@ -534,7 +534,7 @@ static inline int mthca_poll_one(struct mthca_dev *dev,
} }
} }
entry->qp_num = (*cur_qp)->qpn; entry->qp = &(*cur_qp)->ibqp;
if (is_send) { if (is_send) {
wq = &(*cur_qp)->sq; wq = &(*cur_qp)->sq;

View File

@ -420,8 +420,8 @@ struct ib_wc {
enum ib_wc_opcode opcode; enum ib_wc_opcode opcode;
u32 vendor_err; u32 vendor_err;
u32 byte_len; u32 byte_len;
struct ib_qp *qp;
__be32 imm_data; __be32 imm_data;
u32 qp_num;
u32 src_qp; u32 src_qp;
int wc_flags; int wc_flags;
u16 pkey_index; u16 pkey_index;