On Sun, Jan 17, 2010 at 9:08 PM, Bart Van Assche
<bart.vanass...@gmail.com> wrote:
> Hello,
>
> Once I noticed that the SRP initiator triggers two IB interrupts per I/O (more
> precise, per srp_queuecommand() call) I started looking at reducing the number
> of IB interrupts. The patch below didn't help. Does this mean that the patch
> below isn't complete or is this because of the hw driver used during the test
> (mlx4) ?
When you say that the patch did not help, do you mean that it did not
reduce the rate of interrupts?  I also think that you have a race here
since the head and tail operations are not protected (I don't know the
SRP driver I think locking should be done here). It would be better if
you'd choose a value that is a fraction of the queue size to request a
completion so that you don't get to a situation where your queue is
full and you the sender is waiting for it to be cleared. Also, you did
not touch the completion handler. Seems to me you should increment the
tail for each completion by the number of completions you skipped.
Failing to do so will keep cause the completion to be requested each
post after the first time it skipped queue len completions.


>
> Bart.
>
> diff --git a/drivers/infiniband/ulp/srp/ib_srp.c 
> b/drivers/infiniband/ulp/srp/ib_srp.c
> index 54c8fe2..1f674b8 100644
> --- a/drivers/infiniband/ulp/srp/ib_srp.c
> +++ b/drivers/infiniband/ulp/srp/ib_srp.c
> @@ -241,7 +241,7 @@ static int srp_create_target_ib(struct srp_target_port 
> *target)
>        init_attr->cap.max_recv_wr     = SRP_RQ_SIZE;
>        init_attr->cap.max_recv_sge    = 1;
>        init_attr->cap.max_send_sge    = 1;
> -       init_attr->sq_sig_type         = IB_SIGNAL_ALL_WR;
> +       init_attr->sq_sig_type         = IB_SIGNAL_REQ_WR;
>        init_attr->qp_type             = IB_QPT_RC;
>        init_attr->send_cq             = target->cq;
>        init_attr->recv_cq             = target->cq;
> @@ -1001,7 +1001,8 @@ static int __srp_post_send(struct srp_target_port 
> *target,
>        wr.sg_list    = &list;
>        wr.num_sge    = 1;
>        wr.opcode     = IB_WR_SEND;
> -       wr.send_flags = IB_SEND_SIGNALED;
> +       wr.send_flags = target->tx_head - target->tx_tail == SRP_SQ_SIZE - 1
> +               ? IB_SEND_SIGNALED : 0;
>
>        ret = ib_post_send(target->qp, &wr, &bad_wr);
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to