[openib-general] [PATCH 1/4] Add cm_event_handler to struct ib_device

Sean Hefty sean.hefty at intel.com
Fri Jul 21 14:45:12 PDT 2006


Provide a mechanism to dispatch CM events to a registered client of each
RDMA device.

To avoid reporting QP events to all registered clients, a new CM event
handler was added to each ib_device.

Signed-off-by: Sean Hefty <sean.hefty at intel.com>
---
Can one of the iWarp vendors see if this event_handling is generic
enough for their use as well?

Index: include/rdma/ib_verbs.h
===================================================================
--- include/rdma/ib_verbs.h	(revision 8626)
+++ include/rdma/ib_verbs.h	(working copy)
@@ -874,6 +874,7 @@ struct ib_device {
 
 	u32                           flags;
 
+	void			   (*cm_handler)(struct ib_event *);
 	int		           (*query_device)(struct ib_device *device,
 						   struct ib_device_attr *device_attr);
 	int		           (*query_port)(struct ib_device *device,
@@ -1069,6 +1070,11 @@ int ib_register_event_handler  (struct i
 int ib_unregister_event_handler(struct ib_event_handler *event_handler);
 void ib_dispatch_event(struct ib_event *event);
 
+int ib_register_cm_handler(struct ib_device *device,
+			   void (*cm_handler)(struct ib_event *));
+void ib_unregister_cm_handler(struct ib_device *device);
+void ib_dispatch_cm_event(struct ib_event *event);
+
 int ib_query_device(struct ib_device *device,
 		    struct ib_device_attr *device_attr);
 
Index: core/device.c
===================================================================
--- core/device.c	(revision 8626)
+++ core/device.c	(working copy)
@@ -478,6 +478,67 @@ void ib_dispatch_event(struct ib_event *
 EXPORT_SYMBOL(ib_dispatch_event);
 
 /**
+ * ib_register_cm_handler - Register a CM event handler
+ * @device:Device to register with
+ * @cm_handler:Handler to register
+ *
+ * ib_register_cm_handler() registers an event handler that will be
+ * called back when asynchronous communication events occurs.
+ * This callback may occur in interrupt context.
+ */
+int ib_register_cm_handler(struct ib_device *device,
+			   void (*cm_handler)(struct ib_event *))
+{
+	unsigned long flags;
+	int ret = 0;
+
+	spin_lock_irqsave(&device->event_handler_lock, flags);
+	if (!device->cm_handler)
+		device->cm_handler = cm_handler;
+	else
+		ret = -EBUSY;
+	spin_unlock_irqrestore(&device->event_handler_lock, flags);
+
+	return ret;
+}
+EXPORT_SYMBOL(ib_register_cm_handler);
+
+/**
+ * ib_unregister_cm_handler - Unregister a CM event handler
+ * @cm_handler:Handler to unregister
+ *
+ * Unregister a CM event handler registered with ib_register_cm_handler().
+ */
+void ib_unregister_cm_handler(struct ib_device *device)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&device->event_handler_lock, flags);
+	device->cm_handler = NULL;
+	spin_unlock_irqrestore(&device->event_handler_lock, flags);
+}
+EXPORT_SYMBOL(ib_unregister_cm_handler);
+
+/**
+ * ib_dispatch_cm_event - Dispatch an asynchronous CM event
+ * @event:Event to dispatch
+ *
+ * Low-level drivers must call ib_dispatch_cm_event() to dispatch the
+ * event to any registered CM event handler when an asynchronous
+ * communication event occurs.
+ */
+void ib_dispatch_cm_event(struct ib_event *event)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&event->device->event_handler_lock, flags);
+	if (event->device->cm_handler)
+		event->device->cm_handler(event);
+	spin_unlock_irqrestore(&event->device->event_handler_lock, flags);
+}
+EXPORT_SYMBOL(ib_dispatch_cm_event);
+
+/**
  * ib_query_device - Query IB device attributes
  * @device:Device to query
  * @device_attr:Device attributes





More information about the general mailing list