IB/ehca: remove reference to the QP in case of port activation failure
PATCH 1/1 IB/ehca: remove reference to the QP in case of port activation failure
If the initialization of a special QP (e.g. AQP1) fails due to a software timeout, we have to remove the reference to that special QP struct from the port struct preventing the driver to access the QP, since it will be/has been destroyed by the caller, ie in this case ib_mad.
This patch will apply cleanly on top of 2.6.28 git tree.
Signed-off-by Stefan Roscher <[email protected]>
--- drivers/infiniband/hw/ehca/ehca_irq.c | 7 +++++-- drivers/infiniband/hw/ehca/ehca_qp.c | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-)
drivers/infiniband/hw/ehca/ehca_irq.c +5 -2
@@ -370,6 +370,10 @@ static void parse_ec(struct ehca_shca *shca, u64 eqe)switch (ec) {case 0x30 :/* port availability change */ if (EHCA_BMASK_GET (NEQE_PORT_AVAILABILITY , eqe)) { +/* only for autodetect mode important */ +if (ehca_nr_ports >=0 ) +break ; +int suppress_event;/* replay modify_qp for sqps */ spin_lock_irqsave (&sport->mod_sqp_lock, flags);
@@ -387,8 +391,7 @@ static void parse_ec(struct ehca_shca *shca, u64 eqe) sport->port_state =IB_PORT_ACTIVE ;dispatch_port_event (shca, port,IB_EVENT_PORT_ACTIVE ,"is active" ); -ehca_query_sma_attr (shca, port, - &sport->saved_attr); +ehca_query_sma_attr (shca, port, &sport->saved_attr); }else { sport->port_state =IB_PORT_DOWN ; dispatch_port_event(shca, port, IB_EVENT_PORT_ERR,
drivers/infiniband/hw/ehca/ehca_qp.c +5 -0
@@ -860,6 +860,11 @@ static struct ehca_qp *internal_create_qp(if (qp_type ==IB_QPT_GSI ) { h_ret =ehca_define_sqp (shca, my_qp, init_attr);if (h_ret !=H_SUCCESS ) { +kfree (my_qp->mod_qp_parm); + my_qp->mod_qp_parm =NULL ; +/* the QP pointer is no longer valid */ + shca->sport[init_attr->port_num -1 ].ibqp_sqp[qp_type] = +NULL ; ret =ehca2ib_return_code (h_ret); goto create_qp_exit6; }
Signature · 1 line
1.5.5
Roland Dreier
Appliedthanks, applied