[PATCH 3/9] staging: unisys: visorinput: use kref ref-counting for device data struct

Greg KH gregkh at linuxfoundation.org
Sat Oct 17 05:58:51 UTC 2015


On Fri, Oct 16, 2015 at 10:06:48AM -0400, Benjamin Romer wrote:
> From: Tim Sell <Timothy.Sell at unisys.com>
> 
> This is NOT technically required for the code as it stands now, but will
> be needed for subsequent patches.
> 
> Signed-off-by: Tim Sell <Timothy.Sell at unisys.com>
> Signed-off-by: Benjamin Romer <benjamin.romer at unisys.com>
> ---
>  drivers/staging/unisys/visorinput/visorinput.c | 45 ++++++++++++++++++++------
>  1 file changed, 35 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/staging/unisys/visorinput/visorinput.c b/drivers/staging/unisys/visorinput/visorinput.c
> index d23c129..59641d7 100644
> --- a/drivers/staging/unisys/visorinput/visorinput.c
> +++ b/drivers/staging/unisys/visorinput/visorinput.c
> @@ -62,6 +62,7 @@ enum visorinput_device_type {
>   * dev_get_drvdata() / dev_set_drvdata() for each struct device.
>   */
>  struct visorinput_devdata {
> +	struct kref kref;
>  	struct visor_device *dev;
>  	struct rw_semaphore lock_visor_dev; /* lock for dev */
>  	struct input_dev *visorinput_dev;
> @@ -346,6 +347,35 @@ register_client_mouse(void *devdata /* opaque on purpose */)
>  	return visorinput_dev;
>  }
>  
> +static void
> +unregister_client_input(struct input_dev *visorinput_dev)
> +{
> +	if (visorinput_dev)
> +		input_unregister_device(visorinput_dev);
> +}
> +
> +static void devdata_release(struct kref *kref)
> +{
> +	struct visorinput_devdata *devdata =
> +		container_of(kref, struct visorinput_devdata, kref);
> +	unregister_client_input(devdata->visorinput_dev);
> +	kfree(devdata);
> +}
> +
> +static struct visorinput_devdata *
> +devdata_get(struct visorinput_devdata *devdata)
> +{
> +	if (devdata)
> +		kref_get(&devdata->kref);
> +	return devdata;
> +}
> +
> +static void devdata_put(struct visorinput_devdata *devdata)
> +{
> +	if (devdata)
> +		kref_put(&devdata->kref, devdata_release);

Are you sure this is safe?  Where is your lock protecting two release
functions from happening at the same time?

Please use the kref-with-a-lock functions if at all possible, unless you
can guarantee that they are safe to call without one.

thanks,

greg k-h


More information about the devel mailing list