diff options
author | Or Gerlitz <ogerlitz@voltaire.com> | 2010-05-05 10:30:10 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2010-05-12 12:30:43 -0400 |
commit | 2110f9bf37511df06220bb7e977f417baecf2950 (patch) | |
tree | 070e67a58d176a9be9ac22462fb2b7919890e797 /drivers/infiniband | |
parent | 0eddb519b9127c73d53db4bf3ec1d45b13f844d1 (diff) |
IB/iser: Add asynchronous event handler
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>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/ulp/iser/iscsi_iser.h | 1 | ||||
-rw-r--r-- | drivers/infiniband/ulp/iser/iser_verbs.c | 16 |
2 files changed, 16 insertions, 1 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h index 036934cdcb92..53da74b45c75 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.h +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h | |||
@@ -232,6 +232,7 @@ struct iser_device { | |||
232 | struct ib_cq *tx_cq; | 232 | struct ib_cq *tx_cq; |
233 | struct ib_mr *mr; | 233 | struct ib_mr *mr; |
234 | struct tasklet_struct cq_tasklet; | 234 | struct tasklet_struct cq_tasklet; |
235 | struct ib_event_handler event_handler; | ||
235 | struct list_head ig_list; /* entry in ig devices list */ | 236 | struct list_head ig_list; /* entry in ig devices list */ |
236 | int refcount; | 237 | int refcount; |
237 | }; | 238 | }; |
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index b89d76b39a13..b9d6aa102aa5 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c | |||
@@ -54,6 +54,13 @@ static void iser_qp_event_callback(struct ib_event *cause, void *context) | |||
54 | iser_err("got qp event %d\n",cause->event); | 54 | iser_err("got qp event %d\n",cause->event); |
55 | } | 55 | } |
56 | 56 | ||
57 | static void iser_event_handler(struct ib_event_handler *handler, | ||
58 | struct ib_event *event) | ||
59 | { | ||
60 | iser_err("async event %d on device %s port %d\n", event->event, | ||
61 | event->device->name, event->element.port_num); | ||
62 | } | ||
63 | |||
57 | /** | 64 | /** |
58 | * iser_create_device_ib_res - creates Protection Domain (PD), Completion | 65 | * iser_create_device_ib_res - creates Protection Domain (PD), Completion |
59 | * Queue (CQ), DMA Memory Region (DMA MR) with the device associated with | 66 | * 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) | |||
96 | if (IS_ERR(device->mr)) | 103 | if (IS_ERR(device->mr)) |
97 | goto dma_mr_err; | 104 | goto dma_mr_err; |
98 | 105 | ||
106 | INIT_IB_EVENT_HANDLER(&device->event_handler, device->ib_device, | ||
107 | iser_event_handler); | ||
108 | if (ib_register_event_handler(&device->event_handler)) | ||
109 | goto handler_err; | ||
110 | |||
99 | return 0; | 111 | return 0; |
100 | 112 | ||
113 | handler_err: | ||
114 | ib_dereg_mr(device->mr); | ||
101 | dma_mr_err: | 115 | dma_mr_err: |
102 | tasklet_kill(&device->cq_tasklet); | 116 | tasklet_kill(&device->cq_tasklet); |
103 | cq_arm_err: | 117 | cq_arm_err: |
@@ -120,7 +134,7 @@ static void iser_free_device_ib_res(struct iser_device *device) | |||
120 | BUG_ON(device->mr == NULL); | 134 | BUG_ON(device->mr == NULL); |
121 | 135 | ||
122 | tasklet_kill(&device->cq_tasklet); | 136 | tasklet_kill(&device->cq_tasklet); |
123 | 137 | (void)ib_unregister_event_handler(&device->event_handler); | |
124 | (void)ib_dereg_mr(device->mr); | 138 | (void)ib_dereg_mr(device->mr); |
125 | (void)ib_destroy_cq(device->tx_cq); | 139 | (void)ib_destroy_cq(device->tx_cq); |
126 | (void)ib_destroy_cq(device->rx_cq); | 140 | (void)ib_destroy_cq(device->rx_cq); |