File prov-verbs-Add-support-of-different-CQ-formats-for-the-verbs-RDM.patch of Package libfabric

commit 6bd4cc3213d4e30087f2d024e6daf7b8b049767c
Author: Dmitry Gladkov <dmitry.gladkov@intel.com>
Date:   Fri Dec 22 17:20:20 2017 +0300

    prov/verbs: Add support of different CQ formats for the verbs/RDM
    
    Signed-off-by: Dmitry Gladkov <dmitry.gladkov@intel.com>

diff --git prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c
index 5b4065fbc1cb..3612851b876b 100644
--- prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c
+++ prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c
@@ -51,7 +51,6 @@ static ssize_t fi_ibv_rdm_tagged_cq_readfrom(struct fid_cq *cq, void *buf,
 {
 	struct fi_ibv_rdm_cq *_cq = 
 		container_of(cq, struct fi_ibv_rdm_cq, cq_fid);
-	struct fi_cq_tagged_entry *entry = buf;
 	struct fi_ibv_rdm_request *cq_entry;
 	size_t ret = 0;
 
@@ -66,13 +65,7 @@ static ssize_t fi_ibv_rdm_tagged_cq_readfrom(struct fid_cq *cq, void *buf,
 
 		src_addr[ret] =
 			_cq->ep->av->conn_to_addr(_cq->ep, cq_entry->minfo.conn);
-		entry[ret].op_context = cq_entry->context;
-		entry[ret].flags = (cq_entry->comp_flags & ~FI_COMPLETION);
-		entry[ret].len = cq_entry->len;
-		entry[ret].buf = (cq_entry->comp_flags & FI_TRANSMIT) ?
-			cq_entry->src_addr : cq_entry->dest_buf;
-		entry[ret].data = cq_entry->imm;
-		entry[ret].tag = cq_entry->minfo.tag;
+		_cq->read_entry(cq_entry, ret, buf);
 
 		if (cq_entry->state.eager == FI_IBV_STATE_EAGER_READY_TO_FREE) {
 			FI_IBV_RDM_DBG_REQUEST("to_pool: ", cq_entry, 
@@ -116,7 +109,6 @@ ssize_t fi_ibv_rdm_cq_sreadfrom(struct fid_cq *cq, void *buf, size_t count,
 		((timeout < 0) ? SIZE_MAX : (fi_gettime_ms() + timeout));
 	size_t counter = 0;
 	ssize_t ret = 0;
-	struct fi_cq_tagged_entry *cqe_buf = buf;
 	struct fi_ibv_rdm_cq *_cq = container_of(cq, struct fi_ibv_rdm_cq,
 						 cq_fid);
 	switch (_cq->wait_cond) {
@@ -130,7 +122,9 @@ ssize_t fi_ibv_rdm_cq_sreadfrom(struct fid_cq *cq, void *buf, size_t count,
 	}
 
 	do {
-		ret = fi_ibv_rdm_tagged_cq_readfrom(cq, &cqe_buf[counter],
+		ret = fi_ibv_rdm_tagged_cq_readfrom(cq,
+						    ((char *)buf +
+							(counter * _cq->entry_size)),
 						    threshold - counter,
 						    src_addr);
 		counter += (ret > 0) ? ret : 0;
@@ -260,6 +254,50 @@ static struct fi_ops fi_ibv_rdm_cq_fi_ops = {
 	.ops_open = fi_no_ops_open,
 };
 
+static void fi_ibv_rdm_cq_read_context_entry(struct fi_ibv_rdm_request *cq_entry,
+					     int i, void *buf)
+{
+	struct fi_cq_entry *entry = buf;
+
+	entry[i].op_context = cq_entry->context;
+ }
+ 
+ static void fi_ibv_rdm_cq_read_msg_entry(struct fi_ibv_rdm_request *cq_entry,
+					  int i, void *buf)
+ {
+	struct fi_cq_msg_entry *entry = buf;
+
+	entry[i].op_context = cq_entry->context;
+	entry[i].flags = (cq_entry->comp_flags & ~FI_COMPLETION);
+	entry[i].len = cq_entry->len;
+ }
+ 
+ static void fi_ibv_rdm_cq_read_data_entry(struct fi_ibv_rdm_request *cq_entry,
+					   int i, void *buf)
+ {
+	struct fi_cq_data_entry *entry = buf;
+
+	entry[i].op_context = cq_entry->context;
+	entry[i].flags = (cq_entry->comp_flags & ~FI_COMPLETION);
+	entry[i].len = cq_entry->len;
+	entry[i].buf = (cq_entry->comp_flags & FI_TRANSMIT) ?
+			cq_entry->src_addr : cq_entry->dest_buf;
+	entry[i].data = cq_entry->imm;
+ }
+ 
+ static void fi_ibv_rdm_cq_read_tagged_entry(struct fi_ibv_rdm_request *cq_entry,
+					     int i, void *buf)
+ {
+	struct fi_cq_tagged_entry *entry = buf;
+
+	entry[i].op_context = cq_entry->context;
+	entry[i].flags = (cq_entry->comp_flags & ~FI_COMPLETION);
+	entry[i].len = cq_entry->len;
+	entry[i].buf = (cq_entry->comp_flags & FI_TRANSMIT) ?
+			cq_entry->src_addr : cq_entry->dest_buf;
+	entry[i].data = cq_entry->imm;
+	entry[i].tag = cq_entry->minfo.tag;
+ }
 
 int fi_ibv_rdm_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 		   struct fid_cq **cq, void *context)
@@ -296,12 +334,22 @@ int fi_ibv_rdm_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 	_cq->cq_fid.ops = &fi_ibv_rdm_cq_ops;
 
 	switch (attr->format) {
-	case FI_CQ_FORMAT_UNSPEC:
 	case FI_CQ_FORMAT_CONTEXT:
+		_cq->entry_size = sizeof(struct fi_cq_entry);
+		_cq->read_entry = fi_ibv_rdm_cq_read_context_entry;
+		break;
 	case FI_CQ_FORMAT_MSG:
+		_cq->entry_size = sizeof(struct fi_cq_msg_entry);
+		_cq->read_entry = fi_ibv_rdm_cq_read_msg_entry;
+		break;
 	case FI_CQ_FORMAT_DATA:
+		_cq->entry_size = sizeof(struct fi_cq_data_entry);
+		_cq->read_entry = fi_ibv_rdm_cq_read_data_entry;
+		break;
+	case FI_CQ_FORMAT_UNSPEC:
 	case FI_CQ_FORMAT_TAGGED:
 		_cq->entry_size = sizeof(struct fi_cq_tagged_entry);
+		_cq->read_entry = fi_ibv_rdm_cq_read_tagged_entry;
 		break;
 	default:
 		ret = -FI_ENOSYS;
diff --git prov/verbs/src/ep_rdm/verbs_rdm.h prov/verbs/src/ep_rdm/verbs_rdm.h
index 6230c975c7bc..71aabea3c0b2 100644
--- prov/verbs/src/ep_rdm/verbs_rdm.h
+++ prov/verbs/src/ep_rdm/verbs_rdm.h
@@ -309,7 +309,6 @@ struct fi_ibv_rdm_ep {
 	int	use_odp;
 	int	scq_depth;
 	int	rcq_depth;
-	int	cqread_bunch_size;
 
 	int	is_closing;
 	int	recv_preposted_threshold;
diff --git prov/verbs/src/fi_verbs.h prov/verbs/src/fi_verbs.h
index 43f112551c69..06becb78079c 100644
--- prov/verbs/src/fi_verbs.h
+++ prov/verbs/src/fi_verbs.h
@@ -257,16 +257,21 @@ struct fi_ibv_cq {
 	struct util_buf_pool	*wce_pool;
 };
 
+struct fi_ibv_rdm_request;
+typedef void (*fi_ibv_rdm_cq_read_entry)(struct fi_ibv_rdm_request *cq_entry,
+					 int index, void *buf);
+
 struct fi_ibv_rdm_cq {
-	struct fid_cq		cq_fid;
-	struct fi_ibv_domain	*domain;
-	struct fi_ibv_rdm_ep	*ep;
-	struct dlist_entry	request_cq;
-	struct dlist_entry	request_errcq;
-	uint64_t		flags;
-	size_t			entry_size;
-	int			read_bunch_size;
-	enum fi_cq_wait_cond	wait_cond;
+	struct fid_cq			cq_fid;
+	struct fi_ibv_domain		*domain;
+	struct fi_ibv_rdm_ep		*ep;
+	struct dlist_entry		request_cq;
+	struct dlist_entry		request_errcq;
+	uint64_t			flags;
+	size_t				entry_size;
+	fi_ibv_rdm_cq_read_entry	read_entry;
+	int				read_bunch_size;
+	enum fi_cq_wait_cond		wait_cond;
 };
 
 int fi_ibv_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
openSUSE Build Service is sponsored by