All of lore.kernel.org
 help / color / mirror / Atom feed
From: Russ Weight <russell.h.weight@intel.com>
To: Greg KH <gregkh@linuxfoundation.org>, Moritz Fischer <mdf@kernel.org>
Cc: linux-fpga@vger.kernel.org, Xu Yilun <yilun.xu@intel.com>
Subject: Re: [PATCH 6/8] fpga: mgr: Use standard dev_release for class driver
Date: Tue, 15 Jun 2021 09:00:39 -0700	[thread overview]
Message-ID: <263efef2-8e75-2c6c-f6ac-9cfb73b9dc86@intel.com> (raw)
In-Reply-To: <YMhV8XGJ6fxXi9Eh@kroah.com>



On 6/15/21 12:25 AM, Greg KH wrote:
> On Mon, Jun 14, 2021 at 10:09:07AM -0700, Moritz Fischer wrote:
>> From: Russ Weight <russell.h.weight@intel.com>
>>
>> The FPGA manager class driver data structure is being treated as a
>> managed resource instead of using the class.dev_release call-back
>> function to release the class data structure. This change populates
>> the class.dev_release function, changes the fpga_mgr_free() function
>> to call put_device() and changes the fpga_mgr_unregister() function
>> to call device_del() instead of device_unregister().
>>
>> Signed-off-by: Russ Weight <russell.h.weight@intel.com>
>> Reviewed-by: Xu Yilun <yilun.xu@intel.com>
>> Signed-off-by: Moritz Fischer <mdf@kernel.org>
>> ---
>>  drivers/fpga/fpga-mgr.c | 35 +++++++++++++++--------------------
>>  1 file changed, 15 insertions(+), 20 deletions(-)
>>
>> diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c
>> index 42ddc0844781..9f6c3760b6ff 100644
>> --- a/drivers/fpga/fpga-mgr.c
>> +++ b/drivers/fpga/fpga-mgr.c
>> @@ -585,8 +585,10 @@ struct fpga_manager *fpga_mgr_create(struct device *parent, const char *name,
>>  		return NULL;
>>  
>>  	id = ida_simple_get(&fpga_mgr_ida, 0, 0, GFP_KERNEL);
>> -	if (id < 0)
>> -		goto error_kfree;
>> +	if (id < 0) {
>> +		kfree(mgr);
>> +		return NULL;
>> +	}
>>  
>>  	mutex_init(&mgr->ref_mutex);
>>  
>> @@ -602,17 +604,12 @@ struct fpga_manager *fpga_mgr_create(struct device *parent, const char *name,
>>  	mgr->dev.id = id;
>>  
>>  	ret = dev_set_name(&mgr->dev, "fpga%d", id);
>> -	if (ret)
>> -		goto error_device;
>> +	if (ret) {
>> +		put_device(&mgr->dev);
>> +		return NULL;
>> +	}
>>  
>>  	return mgr;
>> -
>> -error_device:
>> -	ida_simple_remove(&fpga_mgr_ida, id);
>> -error_kfree:
>> -	kfree(mgr);
>> -
>> -	return NULL;
>>  }
>>  EXPORT_SYMBOL_GPL(fpga_mgr_create);
>>  
>> @@ -622,8 +619,7 @@ EXPORT_SYMBOL_GPL(fpga_mgr_create);
>>   */
>>  void fpga_mgr_free(struct fpga_manager *mgr)
>>  {
>> -	ida_simple_remove(&fpga_mgr_ida, mgr->dev.id);
>> -	kfree(mgr);
>> +	put_device(&mgr->dev);
>>  }
>>  EXPORT_SYMBOL_GPL(fpga_mgr_free);
>>  
>> @@ -692,16 +688,11 @@ int fpga_mgr_register(struct fpga_manager *mgr)
>>  
>>  	ret = device_add(&mgr->dev);
>>  	if (ret)
>> -		goto error_device;
>> +		return ret;
> If this fails, are you sure you want to just return the error number?
>
> You can not call device_del() afterward if this fails, you have to call
> put_device().  See the documentation for device_add() for details.
>
> This is messy as you are doing a "two step" initialization of your
> fpga_manager device for some odd reason.  Why do you need to do that?
>
> When you call this you seem to be forced to do:
> 	fpga_mgr_create()
> 	fpga_mgr_register()
> in each individual driver.
>
> Why force drivers to do this and not just do a simple:
> 	fpga_mgr_register()
> that internally does the create/add process?
>
> Why the two steps?  That's normally reserved for when you need to do
> something complex in the "core" for the subsystem, and shouldn't be
> pushed out to each individual driver like it currently is for the fpga
> core as you will run into the problem you have here.
>
> Namely when you want to clean up from a failure, you don't know if you
> really did register that device properly or not.

I started on this patchset by moving to a single fpga_mgr_register call. There were some subtle issues that made it more complex, and it was suggested that there was value in simplifying the fix and maintaining the current API.

Based on your comments, I'll go back resume my original fix, address the remaining issues, and go back through the review process.

Thanks,
- Russ

>
> And no, don't add another flag, just make this simple and hard to get
> wrong.  As it is it feels like each fpga driver has to do extra work to
> be sure to get this all correct each time.
>
> So I can not take this as-is, sorry.
>
> And sorry I never noticed these problems when the code when in
> originally.
>
> thanks,
>
> greg k-h


  reply	other threads:[~2021-06-15 16:01 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-14 17:09 [PATCH 0/8] FPGA Manager devres cleanup Moritz Fischer
2021-06-14 17:09 ` [PATCH 1/8] fpga: altera-pr-ip: Remove function alt_pr_unregister Moritz Fischer
2021-06-14 17:09 ` [PATCH 2/8] fpga: stratix10-soc: Add missing fpga_mgr_free() call Moritz Fischer
2021-06-14 17:30   ` Greg KH
2021-06-14 17:38     ` Russ Weight
2021-06-15  7:16       ` Greg KH
2021-06-14 17:40     ` Moritz Fischer
2021-06-15  7:28       ` Greg KH
2021-06-14 17:09 ` [PATCH 3/8] fpga: mgr: Rename dev to parent for parent device Moritz Fischer
2021-06-14 19:37   ` Tom Rix
2021-06-14 17:09 ` [PATCH 4/8] fpga: bridge: " Moritz Fischer
2021-06-14 17:09 ` [PATCH 5/8] fpga: region: " Moritz Fischer
2021-06-14 17:09 ` [PATCH 6/8] fpga: mgr: Use standard dev_release for class driver Moritz Fischer
2021-06-15  7:25   ` Greg KH
2021-06-15 16:00     ` Russ Weight [this message]
2021-06-14 17:09 ` [PATCH 7/8] fpga: bridge: " Moritz Fischer
2021-06-15  7:26   ` Greg KH
2021-06-14 17:09 ` [PATCH 8/8] fpga: region: " Moritz Fischer
2021-06-15  7:27   ` Greg KH
2021-06-15  7:30 ` [PATCH 0/8] FPGA Manager devres cleanup Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=263efef2-8e75-2c6c-f6ac-9cfb73b9dc86@intel.com \
    --to=russell.h.weight@intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-fpga@vger.kernel.org \
    --cc=mdf@kernel.org \
    --cc=yilun.xu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.