[openib-general] HP ZX1 and HP IB cards...

Grant Grundler iod00d at hp.com
Thu Dec 9 15:41:09 PST 2004


On Mon, Dec 06, 2004 at 10:59:51AM -0800, Roland Dreier wrote:
>     Grant> Yes - that works. Please commit.
> 
> I rewrote things in a way that seems cleaner to me -- what I actually
> committed is below.  Please try one more time and make sure this still
> fixes the problem.

I've updated to svn 1316 and that has both the problem I
originally observed plus it "hangs" when the module is loaded.

...
> Index: infiniband/hw/mthca/mthca_cmd.c
> ===================================================================
> --- infiniband/hw/mthca/mthca_cmd.c	(revision 1310)
> +++ infiniband/hw/mthca/mthca_cmd.c	(working copy)
> @@ -293,6 +293,12 @@
>  	complete(&context->done);
>  }
>  
> +void mthca_cmd_complete(struct mthca_dev *dev, int ncomp)
> +{
> +	while (ncomp--)
> +		up(&dev->cmd.event_sem);
> +}
> +
>  static void event_timeout(unsigned long context_ptr)
>  {
>  	struct mthca_cmd_context *context =
> @@ -357,7 +363,6 @@
>  	dev->cmd.free_head = context - dev->cmd.context;
>  	spin_unlock(&dev->cmd.context_lock);
>  
> -	up(&dev->cmd.event_sem);
>  	return err;
>  }

I have the feeling the timeout code isn't cleaning
up the event_sem and that's causing the hang.

trying to understand this now.

thanks,
grant

>  
> Index: infiniband/hw/mthca/mthca_eq.c
> ===================================================================
> --- infiniband/hw/mthca/mthca_eq.c	(revision 1310)
> +++ infiniband/hw/mthca/mthca_eq.c	(working copy)
> @@ -219,6 +219,7 @@
>  	struct mthca_eqe *eqe;
>  	int disarm_cqn;
>  	int work = 0;
> +	int ncmd = 0;
>  
>  	while (1) {
>  		if (!next_eqe_sw(eq))
> @@ -274,6 +275,7 @@
>  					be16_to_cpu(eqe->event.cmd.token),
>  					eqe->event.cmd.status,
>  					be64_to_cpu(eqe->event.cmd.out_param));
> +			++ncmd;
>  			break;
>  
>  		case MTHCA_EVENT_TYPE_PORT_CHANGE:
> @@ -303,6 +305,9 @@
>  		set_eq_ci(dev, eq->eqn, eq->cons_index);
>  	}
>  
> +	if (ncmd)
> +		mthca_cmd_complete(dev, ncmd);
> +
>  	eq_req_not(dev, eq->eqn);
>  }
>  
> Index: infiniband/hw/mthca/mthca_cmd.h
> ===================================================================
> --- infiniband/hw/mthca/mthca_cmd.h	(revision 1310)
> +++ infiniband/hw/mthca/mthca_cmd.h	(working copy)
> @@ -203,10 +203,9 @@
>  
>  int mthca_cmd_use_events(struct mthca_dev *dev);
>  void mthca_cmd_use_polling(struct mthca_dev *dev);
> -void mthca_cmd_event(struct mthca_dev *dev,
> -		     u16 token,
> -		     u8  status,
> -		     u64 out_param);
> +void mthca_cmd_event(struct mthca_dev *dev, u16 token,
> +		     u8  status, u64 out_param);
> +void mthca_cmd_complete(struct mthca_dev *dev, int ncomp);
>  
>  int mthca_SYS_EN(struct mthca_dev *dev, u8 *status);
>  int mthca_SYS_DIS(struct mthca_dev *dev, u8 *status);



More information about the general mailing list