All of lore.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 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.