On Mon, Oct 14, 2019 at 01:20:35PM +0530, Vishal Kulkarni wrote:
> Release resources when attaching to ULD fail. Otherwise, data
> mismatch is seen between LLD and ULD later on, which lead to
> kernel panic when accessing resources that should not even
> exist in the first place.
> 
> Fixes: 94cdb8bb993a ("cxgb4: Add support for dynamic allocation of resources 
> for ULD")
> Signed-off-by: Shahjada Abul Husain <shahj...@chelsio.com>
> Signed-off-by: Vishal Kulkarni <vis...@chelsio.com>
> ---
>  drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c | 14 +++++++++-----
>  1 file changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c 
> b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c
> index 5b60224..0482ef8 100644
> --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c
> +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c
> @@ -692,10 +692,10 @@ static void uld_init(struct adapter *adap, struct 
> cxgb4_lld_info *lld)
>       lld->write_cmpl_support = adap->params.write_cmpl_support;
>  }
>  
> -static void uld_attach(struct adapter *adap, unsigned int uld)
> +static int uld_attach(struct adapter *adap, unsigned int uld)
>  {
> -     void *handle;
>       struct cxgb4_lld_info lli;
> +     void *handle;
>  
>       uld_init(adap, &lli);
>       uld_queue_init(adap, uld, &lli);
> @@ -705,7 +705,7 @@ static void uld_attach(struct adapter *adap, unsigned int 
> uld)
>               dev_warn(adap->pdev_dev,
>                        "could not attach to the %s driver, error %ld\n",
>                        adap->uld[uld].name, PTR_ERR(handle));
> -             return;
> +             return PTR_ERR(handle);
>       }
>  
>       adap->uld[uld].handle = handle;
> @@ -713,6 +713,8 @@ static void uld_attach(struct adapter *adap, unsigned int 
> uld)
>  
>       if (adap->flags & CXGB4_FULL_INIT_DONE)
>               adap->uld[uld].state_change(handle, CXGB4_STATE_UP);
> +
> +     return 0;
>  }
>  
>  /**
> @@ -727,8 +729,8 @@ static void uld_attach(struct adapter *adap, unsigned int 
> uld)
>  void cxgb4_register_uld(enum cxgb4_uld type,
>                       const struct cxgb4_uld_info *p)

Not part of this patch, but the comment above this function describes
it as returning -EBUSY and yet the return type is void. Also, the comment
seems to be in semi-kdoc format, perhaps converting it would be worthwhile.

>  {
> -     int ret = 0;
>       struct adapter *adap;
> +     int ret = 0;
>  
>       if (type >= CXGB4_ULD_MAX)
>               return;
> @@ -760,7 +762,9 @@ void cxgb4_register_uld(enum cxgb4_uld type,
>               if (ret)
>                       goto free_irq;
>               adap->uld[type] = *p;
> -             uld_attach(adap, type);
> +             ret = uld_attach(adap, type);
> +             if (ret)
> +                     goto free_irq;

Is it desired that the loop continues and that only the current iteration
is cleaned up?

>               continue;
>  free_irq:
>               if (adap->flags & CXGB4_FULL_INIT_DONE)
> -- 
> 1.8.3.1
> 

Reply via email to