mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Arve Hjønnevåg" <arve@android.com>
To: Tejun Heo <tj@kernel.org>
Cc: Oleg Nesterov <oleg@redhat.com>,
	linux-pm@lists.linux-foundation.org,
	linux-kernel@vger.kernel.org,
	Andrew Morton <akpm@linux-foundation.org>,
	Dmitri Vorobiev <dmitri.vorobiev@movial.com>,
	Jiri Kosina <jkosina@suse.cz>,
	Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
	Andi Kleen <ak@linux.intel.com>
Subject: Re: [PATCH 7/9] PM: Add suspend blocking work.
Date: Sat, 24 Apr 2010 00:21:58 -0700	[thread overview]
Message-ID: <r2zd6200be21004240021sfaec0f3ft8a1ea7c1b12ea52a@mail.gmail.com> (raw)
In-Reply-To: <4BD290CC.4080601@kernel.org>

2010/4/23 Tejun Heo <tj@kernel.org>:
> Hello,
>
> On 04/24/2010 12:49 AM, Arve Hjønnevåg wrote:
>> I want the suspend blocker active when the work is pending or running.
>> I did not see a way to do this on top of the workqueue api without
>> adding additional locking.
>
> Well, then add additional locking.  suspend_blocker is far away from
> being a hot path and there's nothing wrong with additional locking as
> long as everything is wrapped inside proper APIs.  Adding stuff to the
> core code for things as specific as this is much worse.
>

OK, I'll try to do this. Do you want it in a separate header file as well?

>> If the work is both queued and starts running on another workqueue
>> between "get_wq_data(work) == cwq" and "!work_pending(work)", then
>> suspend_unblock will be called when it shouldn't. It should work fine
>> if I change to it check pending first though, since it cannot move
>> back to the current workqueue without locking cwq->lock first.
>
> The code is more fundamentally broken.  Once work->func has started
> executing, the work pointer can't be dereferenced as work callback is
> allowed to free or re-purpose the work data structure and in the same
> manner you can't check for pending status after execution has
> completed.
>

I only touch the work structure after the callback has returned for
suspend blocking work, which does not allow that.

>> Or are you talking about the race when the callback is running on
>> multiple (cpu) workqueues at the same time. In that case the suspend
>> blocker is released when the callback returns from the last workqueue
>> is was queued on, not when all the callbacks have returned. On that
>> note, is it ever safe to use flush_work and cancel_work_sync for work
>> queues on anything other than a single single threaded workqueue?
>
> flush_work() is guaranteed only to flush from the last queued cpu but
> cancel_work_sync() will guarantee that no cpu is executing or holding
> onto the work.  So, yeah, as long as the limitations of flush_work()
> is understood, it's safe.
>

Sorry, I didn't see the for_each_cpu(cpu, cpu_map) part of
wait_on_work(). cancel_work_sync() does look safe as long as the work
has not moved to completely different workqueue.

> Going back to the original subject, just add simplistic outside
> locking in suspend_blocker_work API (or whatever other name you
> prefer).  That will be much cleaner and safer.  Let's think about
> moving them into workqueue implementation proper after the number of
> the API users grows to hundreds.
>

OK.

-- 
Arve Hjønnevåg

  reply	other threads:[~2010-04-24  7:22 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-23  1:08 [PATCH 0/9] Suspend block api (version 4) Arve Hjønnevåg
2010-04-23  1:08 ` [PATCH 1/9] PM: Add suspend block api Arve Hjønnevåg
2010-04-23  1:08   ` [PATCH 2/9] PM: suspend_block: Add driver to access suspend blockers from user-space Arve Hjønnevåg
2010-04-23  1:08     ` [PATCH 3/9] PM: suspend_block: Abort task freezing if a suspend_blocker is active Arve Hjønnevåg
2010-04-23  1:08       ` [PATCH 4/9] PM: suspend_block: Switch to list of active and inactive suspend blockers Arve Hjønnevåg
2010-04-23  1:08         ` [PATCH 5/9] PM: suspend_block: Add debugfs file Arve Hjønnevåg
2010-04-23  1:08           ` [PATCH 6/9] PM: suspend_block: Add suspend_blocker stats Arve Hjønnevåg
2010-04-23  1:08             ` [PATCH 7/9] PM: Add suspend blocking work Arve Hjønnevåg
2010-04-23  1:08               ` [PATCH 8/9] Input: Block suspend while event queue is not empty Arve Hjønnevåg
2010-04-23  1:08                 ` [PATCH 9/9] power_supply: Block suspend while power supply change notifications are pending Arve Hjønnevåg
2010-04-23 20:56                 ` [PATCH 8/9] Input: Block suspend while event queue is not empty Randy Dunlap
2010-04-23 21:08                   ` Dmitry Torokhov
2010-04-24  5:02                     ` Arve Hjønnevåg
2010-04-24 14:36                       ` [linux-pm] " Alan Stern
2010-04-25  2:30                         ` Rafael J. Wysocki
2010-04-25 15:29                           ` Alan Stern
2010-04-25 22:41                             ` Arve Hjønnevåg
2010-04-24  4:58                   ` Arve Hjønnevåg
2010-04-23  8:16               ` [PATCH 7/9] PM: Add suspend blocking work Tejun Heo
2010-04-23 12:20                 ` Oleg Nesterov
2010-04-23 22:49                   ` Arve Hjønnevåg
2010-04-24  5:21                     ` Arve Hjønnevåg
2010-04-24  6:33                     ` Tejun Heo
2010-04-24  7:21                       ` Arve Hjønnevåg [this message]
2010-04-24  7:43                         ` Tejun Heo
2010-04-26 14:06                     ` Oleg Nesterov
2010-04-23 20:58           ` [PATCH 5/9] PM: suspend_block: Add debugfs file Randy Dunlap
2010-04-24  3:23             ` Arve Hjønnevåg
2010-04-24  4:24               ` Randy Dunlap
2010-04-24  4:54                 ` Arve Hjønnevåg
2010-04-25 18:15             ` Greg KH
2010-04-25 19:53               ` Randy Dunlap
2010-04-26  0:00                 ` tytso
2010-04-26  0:23                   ` Randy Dunlap
2010-04-26  0:45                     ` tytso
2010-04-26  0:50                       ` Randy Dunlap
2010-04-26  1:39                     ` [linux-pm] " Alan Stern
2010-04-26  6:24                 ` Brian Swetland
2010-04-26 13:28                   ` Randy Dunlap
2010-04-23  2:25     ` [linux-pm] [PATCH 2/9] PM: suspend_block: Add driver to access suspend blockers from user-space Matt Helsley
2010-04-23  3:54       ` Arve Hjønnevåg
2010-04-23  4:38       ` Greg KH
2010-04-23  8:43     ` Pavel Machek
2010-04-23 16:43       ` [linux-pm] " Alan Stern
2010-04-24  3:20         ` Arve Hjønnevåg
2010-04-24  5:55           ` Pavel Machek
2010-04-24 14:44             ` Alan Stern
2010-04-25 22:34               ` Arve Hjønnevåg
2010-04-26 19:25                 ` Alan Stern
2010-04-27  4:04                   ` Arve Hjønnevåg
2010-04-27 18:33                     ` Alan Stern
2010-04-27 22:03                       ` Rafael J. Wysocki
2010-04-27 23:22                         ` Arve Hjønnevåg
2010-04-24  1:53       ` tytso
2010-04-24  5:39         ` Pavel Machek
2010-04-23 16:33   ` [PATCH 1/9] PM: Add suspend block api Alan Stern
2010-04-23 16:45     ` [linux-pm] " Alan Stern
2010-04-24  2:15     ` Arve Hjønnevåg
2010-04-24  2:30       ` Alan Stern
2010-04-24  3:14         ` Arve Hjønnevåg
2010-04-23  4:39 ` [linux-pm] [PATCH 0/9] Suspend block api (version 4) 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=r2zd6200be21004240021sfaec0f3ft8a1ea7c1b12ea52a@mail.gmail.com \
    --to=arve@android.com \
    --cc=ak@linux.intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=dmitri.vorobiev@movial.com \
    --cc=jkosina@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@lists.linux-foundation.org \
    --cc=mingo@elte.hu \
    --cc=oleg@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=tj@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

all inboxes | Powered by JetHome®