You are correct!  Good catch.
We will add this to OFED.

(P.S., I would rather leave irqsave -- it is used everywhere else for this 
spinlock).

-Jack

On Monday 14 February 2011 09:32, sebastien dugue wrote:
> 
>   Resending to the proper ML (sorry).
> 
> 
>   In mlx4_ib_reg_xrc_rcv_qp(), we need to take the xrc_reg_list_lock spinlock
> when walking the xrc_reg_list.
> 
>   We've been hit by this on 2 customer sites.
> 
>   Also, I guess spin_lock_irqsave() could be replaced by spin_lock_irq() in
> that function as we know for sure we're in process context.
> 
> Signed-off-by: Sébastien Dugué <sebastien.du...@bull.net>
> 
> --
> 
>  qp.c |    3 +++
>  1 file changed, 3 insertions(+)
> 
> dIndex: kernel-ib/drivers/infiniband/hw/mlx4/qp.c
> ===================================================================
> --- kernel-ib.orig/drivers/infiniband/hw/mlx4/qp.c    2011-01-31 
> 16:52:11.000000000 +0100
> +++ kernel-ib/drivers/infiniband/hw/mlx4/qp.c 2011-02-11 15:24:27.000000000 
> +0100
> @@ -2549,13 +2549,16 @@
>       }
>  
>       mutex_lock(&mibqp->mutex);
> +     spin_lock_irqsave(&mibqp->xrc_reg_list_lock, flags);
>       list_for_each_entry(tmp, &mibqp->xrc_reg_list, list)
>               if (tmp->context == context) {
> +                     spin_unlock_irqrestore(&mibqp->xrc_reg_list_lock, 
> flags);
>                       mutex_unlock(&mibqp->mutex);
>                       kfree(ctx_entry);
>                       mutex_unlock(&to_mdev(xrcd->device)->xrc_reg_mutex);
>                       return 0;
>               }
> +     spin_unlock_irqrestore(&mibqp->xrc_reg_list_lock, flags);
>  
>       ctx_entry->context = context;
>       spin_lock_irqsave(&mibqp->xrc_reg_list_lock, flags);
> 
_______________________________________________
ewg mailing list
ewg@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg

Reply via email to