diff options
| author | Kevin Hilman (TI) <khilman@baylibre.com> | 2026-09-24 13:29:57 -0700 |
|---|---|---|
| committer | Ulf Hansson <ulfh@kernel.org> | 2026-09-28 15:25:20 +0200 |
| commit | b7cbbc33bc4eaa9c1fd4485527ab167a736d5505 (patch) | |
| tree | 308bb8ddffb57ddb44e6554a34a212351ddc86cf /kernel | |
| parent | 4ff08254de73780e9a0d72a14060e5957070ff12 (diff) | |
| download | linux-next-b7cbbc33bc4eaa9c1fd4485527ab167a736d5505.tar.gz linux-next-b7cbbc33bc4eaa9c1fd4485527ab167a736d5505.zip | |
PM / QoS: add lockless read for flags
Add a lockless read for QoS flags similar to the lockless read for
resume latency (dev_pm_qos_raw_resume_latency) which may be called
from atomic context (e.g. genpd governors running under a raw spinlock
or in the syscore suspend path), where taking that sleeping lock would
be invalid on PREEMPT_RT.
dev_pm_qos_raw_flags() now reads dev->power.qos->flags.effective_flags
with READ_ONCE() so also add corresponding WRITE_ONCE() to the two
effective_flags writes, the same way pm_qos_set_value() already does
for target_value/pm_qos_read_value().
Reviewed-by: Kendall Willis <k-willis@ti.com>
Acked-by: Rafael J. Wysocki (Intel) <rafael@kernel.org>
Signed-off-by: Kevin Hilman (TI) <khilman@baylibre.com>
Signed-off-by: Ulf Hansson <ulfh@kernel.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/power/qos.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/power/qos.c b/kernel/power/qos.c index 1944dbeb0d4c..c241da5bccf6 100644 --- a/kernel/power/qos.c +++ b/kernel/power/qos.c @@ -159,7 +159,7 @@ static void pm_qos_flags_remove_req(struct pm_qos_flags *pqf, list_for_each_entry(req, &pqf->list, node) val |= req->flags; - pqf->effective_flags = val; + WRITE_ONCE(pqf->effective_flags, val); } /** @@ -193,7 +193,7 @@ bool pm_qos_update_flags(struct pm_qos_flags *pqf, req->flags = val; INIT_LIST_HEAD(&req->node); list_add_tail(&req->node, &pqf->list); - pqf->effective_flags |= val; + WRITE_ONCE(pqf->effective_flags, pqf->effective_flags | val); break; default: /* no action */ |
