]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
IB/iser: Add asynchronous event handler
authorOr Gerlitz <ogerlitz@voltaire.com>
Wed, 5 May 2010 14:30:10 +0000 (17:30 +0300)
committerRoland Dreier <rolandd@cisco.com>
Wed, 12 May 2010 16:30:43 +0000 (09:30 -0700)
Add handler to handle events such as port up and down.  This is useful
when testing high-availability schemes such as multi-pathing.

Signed-off-by: Or Gerlitz <ogerlitz@voltaire.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/ulp/iser/iscsi_iser.h
drivers/infiniband/ulp/iser/iser_verbs.c

index 036934cdcb92bda7d0336a19156703294cadb90a..53da74b45c750f9e06201f9ebd70b6d7f8e43c91 100644 (file)
@@ -232,6 +232,7 @@ struct iser_device {
        struct ib_cq                 *tx_cq;
        struct ib_mr                 *mr;
        struct tasklet_struct        cq_tasklet;
+       struct ib_event_handler      event_handler;
        struct list_head             ig_list; /* entry in ig devices list */
        int                          refcount;
 };
index b89d76b39a131873dc4548bdf57e703c4eb09f5e..b9d6aa102aa55b52b083fa2407fd91751c85bbdd 100644 (file)
@@ -54,6 +54,13 @@ static void iser_qp_event_callback(struct ib_event *cause, void *context)
        iser_err("got qp event %d\n",cause->event);
 }
 
+static void iser_event_handler(struct ib_event_handler *handler,
+                               struct ib_event *event)
+{
+       iser_err("async event %d on device %s port %d\n", event->event,
+               event->device->name, event->element.port_num);
+}
+
 /**
  * iser_create_device_ib_res - creates Protection Domain (PD), Completion
  * Queue (CQ), DMA Memory Region (DMA MR) with the device associated with
@@ -96,8 +103,15 @@ static int iser_create_device_ib_res(struct iser_device *device)
        if (IS_ERR(device->mr))
                goto dma_mr_err;
 
+       INIT_IB_EVENT_HANDLER(&device->event_handler, device->ib_device,
+                               iser_event_handler);
+       if (ib_register_event_handler(&device->event_handler))
+               goto handler_err;
+
        return 0;
 
+handler_err:
+       ib_dereg_mr(device->mr);
 dma_mr_err:
        tasklet_kill(&device->cq_tasklet);
 cq_arm_err:
@@ -120,7 +134,7 @@ static void iser_free_device_ib_res(struct iser_device *device)
        BUG_ON(device->mr == NULL);
 
        tasklet_kill(&device->cq_tasklet);
-
+       (void)ib_unregister_event_handler(&device->event_handler);
        (void)ib_dereg_mr(device->mr);
        (void)ib_destroy_cq(device->tx_cq);
        (void)ib_destroy_cq(device->rx_cq);