IB/ehca: Generate async event when SRQ limit reached

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by Hoang-Nam Nguyen and committed by Roland Dreier 633a5aed 5bb7d929

+28 -14
+28 -14
drivers/infiniband/hw/ehca/ehca_irq.c
··· 175 175 176 176 } 177 177 178 - static void qp_event_callback(struct ehca_shca *shca, 179 - u64 eqe, 180 - enum ib_event_type event_type) 178 + static void qp_event_callback(struct ehca_shca *shca, u64 eqe, 179 + enum ib_event_type event_type, int fatal) 181 180 { 182 181 struct ib_event event; 183 182 struct ehca_qp *qp; ··· 190 191 if (!qp) 191 192 return; 192 193 193 - ehca_error_data(shca, qp, qp->ipz_qp_handle.handle); 194 + if (fatal) 195 + ehca_error_data(shca, qp, qp->ipz_qp_handle.handle); 194 196 195 - if (!qp->ib_qp.event_handler) 196 - return; 197 + event.device = &shca->ib_device; 197 198 198 - event.device = &shca->ib_device; 199 - event.event = event_type; 200 - event.element.qp = &qp->ib_qp; 199 + if (qp->ext_type == EQPT_SRQ) { 200 + if (!qp->ib_srq.event_handler) 201 + return; 201 202 202 - qp->ib_qp.event_handler(&event, qp->ib_qp.qp_context); 203 + event.event = fatal ? IB_EVENT_SRQ_ERR : event_type; 204 + event.element.srq = &qp->ib_srq; 205 + qp->ib_srq.event_handler(&event, qp->ib_srq.srq_context); 206 + } else { 207 + if (!qp->ib_qp.event_handler) 208 + return; 209 + 210 + event.event = event_type; 211 + event.element.qp = &qp->ib_qp; 212 + qp->ib_qp.event_handler(&event, qp->ib_qp.qp_context); 213 + } 203 214 204 215 return; 205 216 } ··· 243 234 244 235 switch (identifier) { 245 236 case 0x02: /* path migrated */ 246 - qp_event_callback(shca, eqe, IB_EVENT_PATH_MIG); 237 + qp_event_callback(shca, eqe, IB_EVENT_PATH_MIG, 0); 247 238 break; 248 239 case 0x03: /* communication established */ 249 - qp_event_callback(shca, eqe, IB_EVENT_COMM_EST); 240 + qp_event_callback(shca, eqe, IB_EVENT_COMM_EST, 0); 250 241 break; 251 242 case 0x04: /* send queue drained */ 252 - qp_event_callback(shca, eqe, IB_EVENT_SQ_DRAINED); 243 + qp_event_callback(shca, eqe, IB_EVENT_SQ_DRAINED, 0); 253 244 break; 254 245 case 0x05: /* QP error */ 255 246 case 0x06: /* QP error */ 256 - qp_event_callback(shca, eqe, IB_EVENT_QP_FATAL); 247 + qp_event_callback(shca, eqe, IB_EVENT_QP_FATAL, 1); 257 248 break; 258 249 case 0x07: /* CQ error */ 259 250 case 0x08: /* CQ error */ ··· 287 278 ehca_err(&shca->ib_device, "Interface trace stopped."); 288 279 break; 289 280 case 0x14: /* first error capture info available */ 281 + ehca_info(&shca->ib_device, "First error capture available"); 282 + break; 283 + case 0x15: /* SRQ limit reached */ 284 + qp_event_callback(shca, eqe, IB_EVENT_SRQ_LIMIT_REACHED, 0); 285 + break; 290 286 default: 291 287 ehca_err(&shca->ib_device, "Unknown identifier: %x on %s.", 292 288 identifier, shca->ib_device.name);