From: Dmitry Torokhov Date: Tue, 11 Oct 2011 01:30:03 +0000 (-0700) Subject: Input: serio_raw - use kref instead of rolling out its own refcounting X-Git-Tag: v3.12-rc1~9^2~136^2~12 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ba538cd2a83f3556448759283d2330a603005afe;p=kernel%2Fkernel-generic.git Input: serio_raw - use kref instead of rolling out its own refcounting Reviewed-by: Wanlong Gao Signed-off-by: Dmitry Torokhov --- diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c index b7ba459..ef3a69c3 100644 --- a/drivers/input/serio/serio_raw.c +++ b/drivers/input/serio/serio_raw.c @@ -9,6 +9,7 @@ * the Free Software Foundation. */ +#include #include #include #include @@ -33,7 +34,7 @@ struct serio_raw { unsigned int tail, head; char name[16]; - unsigned int refcnt; + struct kref kref; struct serio *serio; struct miscdevice dev; wait_queue_head_t wait; @@ -104,7 +105,7 @@ static int serio_raw_open(struct inode *inode, struct file *file) list->serio_raw = serio_raw; file->private_data = list; - serio_raw->refcnt++; + kref_get(&serio_raw->kref); list_add_tail(&list->node, &serio_raw->list); out: @@ -112,17 +113,14 @@ out: return retval; } -static int serio_raw_cleanup(struct serio_raw *serio_raw) +static void serio_raw_cleanup(struct kref *kref) { - if (--serio_raw->refcnt == 0) { - misc_deregister(&serio_raw->dev); - list_del_init(&serio_raw->node); - kfree(serio_raw); + struct serio_raw *serio_raw = + container_of(kref, struct serio_raw, kref); - return 1; - } - - return 0; + misc_deregister(&serio_raw->dev); + list_del_init(&serio_raw->node); + kfree(serio_raw); } static int serio_raw_release(struct inode *inode, struct file *file) @@ -132,7 +130,7 @@ static int serio_raw_release(struct inode *inode, struct file *file) mutex_lock(&serio_raw_mutex); - serio_raw_cleanup(serio_raw); + kref_put(&serio_raw->kref, serio_raw_cleanup); mutex_unlock(&serio_raw_mutex); return 0; @@ -283,7 +281,7 @@ static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) mutex_lock(&serio_raw_mutex); snprintf(serio_raw->name, sizeof(serio_raw->name), "serio_raw%d", serio_raw_no++); - serio_raw->refcnt = 1; + kref_init(&serio_raw->kref); serio_raw->serio = serio; INIT_LIST_HEAD(&serio_raw->list); init_waitqueue_head(&serio_raw->wait); @@ -357,8 +355,8 @@ static void serio_raw_disconnect(struct serio *serio) serio_set_drvdata(serio, NULL); serio_raw->serio = NULL; - if (!serio_raw_cleanup(serio_raw)) - wake_up_interruptible(&serio_raw->wait); + wake_up_interruptible(&serio_raw->wait); + kref_put(&serio_raw->kref, serio_raw_cleanup); mutex_unlock(&serio_raw_mutex); }