[openib-general] [PATCH 12/17] ehca: queue pair

Hal Rosenstock halr at voltaire.com
Fri Mar 3 05:14:02 PST 2006


On Thu, 2006-03-02 at 03:38, Heiko J Schick wrote:

> -- linux-2.6.16-rc4-orig/drivers/infiniband/hw/ehca/ehca_sqp.c	1970-01-01 01:00:00.000000000 +0100
> +++ linux-2.6.16-rc4/drivers/infiniband/hw/ehca/ehca_sqp.c	2006-03-01 09:23:12.000000000 +0100

> +extern int ehca_port_act_time;
> +
> +/**
> + * ehca_define_sqp - defines special queue pair 1(GSI QP). When special queue
> + * pair is created successfully, the corresponding port gets active.

The wait for active before creating QP1 seems problematic to me for a
number of reasons. I know there is a module parameter to tune this to
the subnet. Is there a reason that QP1 can't be created before this (the
port becoming active) ? I think it may need to be created before the
port gets to armed state if active trigger is supported (I don't know
whether that's the case with eHCA).

> + * Define Special Queue pair 0 (SMI QP) is still not supported.

The comment implies that the intent is to support this. Is that true ?
I'm wondering if in the interim something needs to be done with the core
to handle this case which I think is valid per the spec. I don't there
is a requirement that QP0 be exposed and that a device be able to
support an SM. This should all be handled in a graceful manner by the
layers above.

> + *
> + * @qp_init_attr : Queue pair init attributes including port and queue pair type.
> + */
> +
> +u64 ehca_define_sqp(struct ehca_shca *shca,
> +			       struct ehca_qp *ehca_qp,
> +			       struct ib_qp_init_attr *qp_init_attr)
> +{
> +
> +	u32 pma_qp_nr = 0;
> +	u32 bma_qp_nr = 0;
> +	u64 ret = H_Success;
> +	u8 port = qp_init_attr->port_num;
> +	int counter = 0;
> +
> +	EDEB_EN(7, "port=%x qp_type=%x",
> +		port, qp_init_attr->qp_type);
> +
> +	shca->sport[port - 1].port_state = IB_PORT_DOWN;
> +
> +	switch (qp_init_attr->qp_type) {
> +	case IB_QPT_SMI:
> +		/* function not supported yet */
> +		break;

Should this be:
		ret = H_unsupported; (or something like this)
		goto hca_define_aqp1;
while this is not supported ?

> +	case IB_QPT_GSI:
> +		ret = hipz_h_define_aqp1(shca->ipz_hca_handle,
> +					 ehca_qp->ipz_qp_handle,
> +					 ehca_qp->ehca_qp_core.galpas.kernel,
> +					 (u32) qp_init_attr->port_num,
> +					 &pma_qp_nr, &bma_qp_nr);
> +
> +		if (ret != H_Success) {
> +			EDEB_ERR(4, "Can't define AQP1 for port %x. rc=%lx",
> +				    port, ret);
> +			goto ehca_define_aqp1;
> +		}
> +		break;
> +	default:
> +		ret = H_Parameter;
> +		goto ehca_define_aqp1;
> +	}
> +
> +	while ((shca->sport[port - 1].port_state != IB_PORT_ACTIVE) &&
> +	       (counter < ehca_port_act_time)) {
> +		EDEB(6, "... wait until port %x is active",
> +			port);
> +		msleep_interruptible(1000);
> +		counter++;
> +	}
> +
> +	if (counter == ehca_port_act_time) {
> +		EDEB_ERR(4, "Port %x is not active.", port);
> +		ret = H_Hardware;
> +	}
> +
> +      ehca_define_aqp1:
> +	EDEB_EX(7, "ret=%lx", ret);
> +
> +	return ret;
> +}

-- Hal




More information about the general mailing list