[openib-general] [PATCH] ib_sync_cq ( was Re: RFC: ib_set_comp_handler)

Michael S. Tsirkin mst at mellanox.co.il
Mon Sep 12 01:07:55 PDT 2005


Roland, Sean,
With the following patch, it becomes legal for clients to modify comp_handler
or cq_context fields in ib_cq structure of an existing cq.

To avoid races, and to make it possible for hw layer to cache
these values, I added a new API ib_sync_cq which must be called
after one of comp_handler and cq_context is changed.

I plan to use this capability in sdp, to disable cq events while a connection
is destroyed. I expect this to be useful in other scenarious (IPoIB NAPI?).

Comments?

---

Make it possible to flush completion events for a specific cq.

Signed-off-by: Michael S. Tsirkin <mst at mellanox.co.il>

Index: linux-2.6.13/drivers/infiniband/hw/mthca/mthca_cq.c
===================================================================
--- linux-2.6.13.orig/drivers/infiniband/hw/mthca/mthca_cq.c	2005-09-11 17:52:37.000000000 +0300
+++ linux-2.6.13/drivers/infiniband/hw/mthca/mthca_cq.c	2005-09-12 10:33:13.000000000 +0300
@@ -789,6 +789,15 @@ err_out:
 	return err;
 }
 
+void mthca_sync_cq(struct ib_cq *ibcq)
+{
+	struct mthca_dev *dev = to_mdev(ibcq->device);
+	if (dev->mthca_flags & MTHCA_FLAG_MSI_X)
+		synchronize_irq(dev->eq_table.eq[MTHCA_EQ_COMP].msi_x_vector);
+	else
+		synchronize_irq(dev->pdev->irq);
+}
+
 void mthca_free_cq(struct mthca_dev *dev,
 		   struct mthca_cq *cq)
 {
Index: linux-2.6.13/drivers/infiniband/include/rdma/ib_verbs.h
===================================================================
--- linux-2.6.13.orig/drivers/infiniband/include/rdma/ib_verbs.h	2005-09-11 10:24:36.000000000 +0300
+++ linux-2.6.13/drivers/infiniband/include/rdma/ib_verbs.h	2005-09-12 10:40:33.000000000 +0300
@@ -884,6 +884,7 @@ struct ib_device {
 	struct ib_cq *             (*create_cq)(struct ib_device *device, int cqe,
 						struct ib_ucontext *context,
 						struct ib_udata *udata);
+	void                       (*sync_cq)(struct ib_cq *cq);
 	int                        (*destroy_cq)(struct ib_cq *cq);
 	int                        (*resize_cq)(struct ib_cq *cq, int *cqe);
 	int                        (*poll_cq)(struct ib_cq *cq, int num_entries,
@@ -1227,6 +1228,16 @@ struct ib_cq *ib_create_cq(struct ib_dev
 			   void *cq_context, int cqe);
 
 /**
+ * ib_sync_cq - flush CQ completion event handler.
+ *              This must be used after modifying comp_handler or cq_context.
+ * @cq: The CQ to flush events for.
+ */
+static inline void ib_sync_cq(struct ib_cq *cq)
+{
+	return cq->device->sync_cq(cq);
+}
+
+/**
  * ib_resize_cq - Modifies the capacity of the CQ.
  * @cq: The CQ to resize.
  * @cqe: The minimum size of the CQ.
Index: linux-2.6.13/drivers/infiniband/hw/mthca/mthca_provider.c
===================================================================
--- linux-2.6.13.orig/drivers/infiniband/hw/mthca/mthca_provider.c	2005-09-11 10:24:37.000000000 +0300
+++ linux-2.6.13/drivers/infiniband/hw/mthca/mthca_provider.c	2005-09-12 10:34:00.000000000 +0300
@@ -1090,6 +1090,7 @@ int mthca_register_device(struct mthca_d
 	dev->ib_dev.destroy_qp           = mthca_destroy_qp;
 	dev->ib_dev.create_cq            = mthca_create_cq;
 	dev->ib_dev.destroy_cq           = mthca_destroy_cq;
+	dev->ib_dev.sync_cq              = mthca_sync_cq;
 	dev->ib_dev.poll_cq              = mthca_poll_cq;
 	dev->ib_dev.get_dma_mr           = mthca_get_dma_mr;
 	dev->ib_dev.reg_phys_mr          = mthca_reg_phys_mr;

-- 
MST



More information about the general mailing list