public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
From: Mattia Dongili <malattia@linux.it>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: linux-acpi@vger.kernel.org
Subject: Re: [PATCH] sony-laptop - remove private workqueue, use keventd instead
Date: Fri, 4 Dec 2009 07:01:07 +0900	[thread overview]
Message-ID: <20091203220107.GA1907@kamineko.org> (raw)
In-Reply-To: <20091203050742.GF9121@core.coreip.homeip.net>

On Wed, Dec 02, 2009 at 09:07:42PM -0800, Dmitry Torokhov wrote:
> If we reschedule work instead of having work function sleep for 10 msecs
> between reads from kfifo we can safely use the main workqueue (keventd)
> and not bother with creating driver-private one.
> 
> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

Hi Dmitry,

Looks reasonable to me. Let me take a deeper look and give it a go and
I'll submit it for inclusion together with another pending patch I have
for 2.6.33.

Thanks
mattia

> ---
> 
>  drivers/platform/x86/sony-laptop.c |   57 ++++++++++++++++++++----------------
>  1 files changed, 31 insertions(+), 26 deletions(-)
> 
> 
> diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
> index a2a742c..b6d2961 100644
> --- a/drivers/platform/x86/sony-laptop.c
> +++ b/drivers/platform/x86/sony-laptop.c
> @@ -144,7 +144,6 @@ struct sony_laptop_input_s {
>  	struct input_dev	*key_dev;
>  	struct kfifo		*fifo;
>  	spinlock_t		fifo_lock;
> -	struct workqueue_struct	*wq;
>  };
>  
>  static struct sony_laptop_input_s sony_laptop_input = {
> @@ -298,17 +297,28 @@ static int sony_laptop_input_keycode_map[] = {
>  /* release buttons after a short delay if pressed */
>  static void do_sony_laptop_release_key(struct work_struct *work)
>  {
> +	struct delayed_work *dwork =
> +			container_of(work, struct delayed_work, work);
>  	struct sony_laptop_keypress kp;
>  
> -	while (kfifo_get(sony_laptop_input.fifo, (unsigned char *)&kp,
> -			 sizeof(kp)) == sizeof(kp)) {
> -		msleep(10);
> +	if (kfifo_get(sony_laptop_input.fifo,
> +		      (unsigned char *)&kp, sizeof(kp)) == sizeof(kp)) {
>  		input_report_key(kp.dev, kp.key, 0);
>  		input_sync(kp.dev);
>  	}
> +
> +	/*
> +	 * If there is something in the fifo scnhedule nect release.
> +	 * We don't care about locking, at worst we may schedule an
> +	 * extra "empty" wakeup. This may be improved with the new
> +	 * kfifo API.
> +	 */
> +	if (__kfifo_len(sony_laptop_input.fifo) != 0)
> +		schedule_delayed_work(dwork, msecs_to_jiffies(10));
>  }
> -static DECLARE_WORK(sony_laptop_release_key_work,
> -		do_sony_laptop_release_key);
> +
> +static DECLARE_DELAYED_WORK(sony_laptop_release_key_work,
> +			    do_sony_laptop_release_key);
>  
>  /* forward event to the input subsystem */
>  static void sony_laptop_report_input_event(u8 event)
> @@ -362,12 +372,12 @@ static void sony_laptop_report_input_event(u8 event)
>  		/* we emit the scancode so we can always remap the key */
>  		input_event(kp.dev, EV_MSC, MSC_SCAN, event);
>  		input_sync(kp.dev);
> +
> +		/* schedule key release */
>  		kfifo_put(sony_laptop_input.fifo,
>  			  (unsigned char *)&kp, sizeof(kp));
> -
> -		if (!work_pending(&sony_laptop_release_key_work))
> -			queue_work(sony_laptop_input.wq,
> -					&sony_laptop_release_key_work);
> +		schedule_delayed_work(&sony_laptop_release_key_work,
> +				      msecs_to_jiffies(10));
>  	} else
>  		dprintk("unknown input event %.2x\n", event);
>  }
> @@ -394,20 +404,11 @@ static int sony_laptop_setup_input(struct acpi_device *acpi_device)
>  		goto err_dec_users;
>  	}
>  
> -	/* init workqueue */
> -	sony_laptop_input.wq = create_singlethread_workqueue("sony-laptop");
> -	if (!sony_laptop_input.wq) {
> -		printk(KERN_ERR DRV_PFX
> -				"Unable to create workqueue.\n");
> -		error = -ENXIO;
> -		goto err_free_kfifo;
> -	}
> -
>  	/* input keys */
>  	key_dev = input_allocate_device();
>  	if (!key_dev) {
>  		error = -ENOMEM;
> -		goto err_destroy_wq;
> +		goto err_free_kfifo;
>  	}
>  
>  	key_dev->name = "Sony Vaio Keys";
> @@ -470,9 +471,6 @@ err_unregister_keydev:
>  err_free_keydev:
>  	input_free_device(key_dev);
>  
> -err_destroy_wq:
> -	destroy_workqueue(sony_laptop_input.wq);
> -
>  err_free_kfifo:
>  	kfifo_free(sony_laptop_input.fifo);
>  
> @@ -483,12 +481,20 @@ err_dec_users:
>  
>  static void sony_laptop_remove_input(void)
>  {
> +	struct sony_laptop_keypress kp = { NULL };
> +
>  	/* cleanup only after the last user has gone */
>  	if (!atomic_dec_and_test(&sony_laptop_input.users))
>  		return;
>  
> -	/* flush workqueue first */
> -	flush_workqueue(sony_laptop_input.wq);
> +	cancel_delayed_work_sync(&sony_laptop_release_key_work);
> +
> +	/* Generate key-up events for remaining keys */
> +	while (kfifo_get(sony_laptop_input.fifo,
> +			 (unsigned char *)&kp, sizeof(kp)) == sizeof(kp)) {
> +		input_report_key(kp.dev, kp.key, 0);
> +		input_sync(kp.dev);
> +	}
>  
>  	/* destroy input devs */
>  	input_unregister_device(sony_laptop_input.key_dev);
> @@ -499,7 +505,6 @@ static void sony_laptop_remove_input(void)
>  		sony_laptop_input.jog_dev = NULL;
>  	}
>  
> -	destroy_workqueue(sony_laptop_input.wq);
>  	kfifo_free(sony_laptop_input.fifo);
>  }
>  
> -- 
> Dmitry
-- 
mattia
:wq!

      reply	other threads:[~2009-12-03 22:01 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-03  5:07 [PATCH] sony-laptop - remove private workqueue, use keventd instead Dmitry Torokhov
2009-12-03 22:01 ` Mattia Dongili [this message]

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=20091203220107.GA1907@kamineko.org \
    --to=malattia@linux.it \
    --cc=dmitry.torokhov@gmail.com \
    --cc=linux-acpi@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox