[openib-general] [PATCH] Extra kfrees, clean up unregisters, etc ...

Krishna Kumar krkumar at us.ibm.com
Mon Nov 8 10:45:08 PST 2004


Yes, looks good.

- KK


On Fri, 5 Nov 2004, Roland Dreier wrote:

> Thanks for the audit.  I applied this version of your patch.  Does
> this still look correct?
>
> Index: infiniband/core/sa_query.c
> ===================================================================
> --- infiniband/core/sa_query.c	(revision 1164)
> +++ infiniband/core/sa_query.c	(working copy)
> @@ -699,29 +710,28 @@
>  	sa_dev->start_port = s;
>  	sa_dev->end_port   = e;
>
> -	for (i = s; i <= e; ++i) {
> -		sa_dev->port[i - s].mr       = NULL;
> -		sa_dev->port[i - s].sm_ah    = NULL;
> -		sa_dev->port[i - s].port_num = i;
> -		spin_lock_init(&sa_dev->port[i - s].ah_lock);
> +	for (i = 0; i <= e - s; ++i) {
> +		sa_dev->port[i].mr       = NULL;
> +		sa_dev->port[i].sm_ah    = NULL;
> +		sa_dev->port[i].port_num = i + s;
> +		spin_lock_init(&sa_dev->port[i].ah_lock);
>
> -		sa_dev->port[i - s].agent =
> -			ib_register_mad_agent(device, i, IB_QPT_GSI,
> +		sa_dev->port[i].agent =
> +			ib_register_mad_agent(device, i + s, IB_QPT_GSI,
>  					      NULL, 0, send_handler,
>  					      recv_handler, sa_dev);
> -		if (IS_ERR(sa_dev->port[i - s].agent))
> +		if (IS_ERR(sa_dev->port[i].agent))
>  			goto err;
>
> -		sa_dev->port[i - s].mr = ib_get_dma_mr(sa_dev->port[i - s].agent->qp->pd,
> -						       IB_ACCESS_LOCAL_WRITE);
> -		if (IS_ERR(sa_dev->port[i - s].mr)) {
> -			/* Bump i so agent from this iter. is freed */
> -			++i;
> +		sa_dev->port[i].mr = ib_get_dma_mr(sa_dev->port[i].agent->qp->pd,
> +						   IB_ACCESS_LOCAL_WRITE);
> +		if (IS_ERR(sa_dev->port[i].mr)) {
> +			ib_unregister_mad_agent(sa_dev->port[i].agent);
>  			goto err;
>  		}
>
> -		INIT_WORK(&sa_dev->port[i - s].update_task,
> -			  update_sm_ah, &sa_dev->port[i - s]);
> +		INIT_WORK(&sa_dev->port[i].update_task,
> +			  update_sm_ah, &sa_dev->port[i]);
>  	}
>
>  	/*
> @@ -732,27 +742,20 @@
>  	 */
>
>  	INIT_IB_EVENT_HANDLER(&sa_dev->event_handler, device, ib_sa_event);
> -	if (ib_register_event_handler(&sa_dev->event_handler)) {
> -		kfree(sa_dev);
> +	if (ib_register_event_handler(&sa_dev->event_handler))
>  		goto err;
> -	}
>
> -	for (i = s; i <= e; ++i)
> -		update_sm_ah(&sa_dev->port[i - s]);
> +	for (i = 0; i <= e - s; ++i)
> +		update_sm_ah(&sa_dev->port[i]);
>
>  	ib_set_client_data(device, &sa_client, sa_dev);
>
>  	return;
>
>  err:
> -	while (--i >= s) {
> -		if (sa_dev->port[i - s].mr && !IS_ERR(sa_dev->port[i - s].mr))
> -			ib_dereg_mr(sa_dev->port[i - s].mr);
> -
> -		if (sa_dev->port[i - s].sm_ah)
> -			kref_put(&sa_dev->port[i].sm_ah->ref, free_sm_ah);
> -
> -		ib_unregister_mad_agent(sa_dev->port[i - s].agent);
> +	while (--i >= 0) {
> +		ib_dereg_mr(sa_dev->port[i].mr);
> +		ib_unregister_mad_agent(sa_dev->port[i].agent);
>  	}
>
>  	kfree(sa_dev);
>
>




More information about the general mailing list