Skip to content

Commit

Permalink
ANDROID: power: wakeup_reason: convert wakeup_reason_lock to raw_spin…
Browse files Browse the repository at this point in the history
…lock_t for PREEMPT_RT

[   87.220277] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
[   87.220282] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/1
[   87.220284] INFO: lockdep is turned off.
[   87.220287] irq event stamp: 11238
[   87.220300] hardirqs last  enabled at (11237): [<ffffff8008183dec>] tick_nohz_idle_enter+0x74/0xc0
[   87.220307] hardirqs last disabled at (11238): [<ffffff80080fef74>] do_idle+0xbc/0x290
[   87.220314] softirqs last  enabled at (0): [<ffffff80080b2cc8>] copy_process.isra.5.part.6+0x328/0x1c90
[   87.220317] softirqs last disabled at (0): [<0000000000000000>]           (null)
[   87.220319] Preemption disabled at:
[   87.220325] [<ffffff8008099168>] secondary_start_kernel+0xb8/0x1e8
[   87.220333] CPU: 1 PID: 0 Comm: swapper/1 Tainted: G        W         4.19.232-rt104 #68
[   87.220335] Hardware name: Rockchip RK3568 EVB1 DDR4 V10 Board (DT)
[   87.220338] Call trace:
[   87.220343]  dump_backtrace+0x0/0x180
[   87.220347]  show_stack+0x14/0x20
[   87.220352]  dump_stack+0xa4/0xd8
[   87.220357]  ___might_sleep+0x1cc/0x228
[   87.220362]  rt_spin_lock+0xa0/0xe8
[   87.220367]  __log_abort_or_abnormal_wake+0x30/0xb8
[   87.220370]  log_abnormal_wakeup_reason+0x68/0x88
[   87.220374]  irq_may_run+0x98/0xb0
[   87.220379]  handle_fasteoi_irq+0x30/0x1b8
[   87.220382]  generic_handle_irq+0x24/0x38
[   87.220386]  __handle_domain_irq+0x84/0xf8
[   87.220389]  gic_handle_irq+0xc4/0x184
[   87.220392]  el1_irq+0xec/0x1ac
[   87.220398]  cpuidle_enter_state+0xb8/0x3d8
[   87.220401]  cpuidle_enter+0x18/0x20
[   87.220405]  call_cpuidle+0x24/0x48
[   87.220408]  do_idle+0x230/0x290
[   87.220411]  cpu_startup_entry+0x24/0x28
[   87.220415]  secondary_start_kernel+0x150/0x1e8

Signed-off-by: Liang Chen <[email protected]>
Change-Id: I383164b2a646250d34dc7c085e7a1d297889581e
  • Loading branch information
Liang Chen committed Sep 1, 2022
1 parent 793d4b5 commit 46d6c62
Showing 1 changed file with 18 additions and 18 deletions.
36 changes: 18 additions & 18 deletions kernel/power/wakeup_reason.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ struct wakeup_irq_node {
const char *irq_name;
};

static DEFINE_SPINLOCK(wakeup_reason_lock);
static DEFINE_RAW_SPINLOCK(wakeup_reason_lock);

static LIST_HEAD(leaf_irqs); /* kept in ascending IRQ sorted order */
static LIST_HEAD(parent_irqs); /* unordered */
Expand Down Expand Up @@ -149,17 +149,17 @@ void log_irq_wakeup_reason(int irq)
{
unsigned long flags;

spin_lock_irqsave(&wakeup_reason_lock, flags);
raw_spin_lock_irqsave(&wakeup_reason_lock, flags);

if (!capture_reasons) {
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
return;
}

if (find_node_in_list(&parent_irqs, irq) == NULL)
add_sibling_node_sorted(&leaf_irqs, irq);

spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
}

void log_threaded_irq_wakeup_reason(int irq, int parent_irq)
Expand All @@ -177,10 +177,10 @@ void log_threaded_irq_wakeup_reason(int irq, int parent_irq)
if (!capture_reasons)
return;

spin_lock_irqsave(&wakeup_reason_lock, flags);
raw_spin_lock_irqsave(&wakeup_reason_lock, flags);

if (!capture_reasons || (find_node_in_list(&leaf_irqs, irq) != NULL)) {
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
return;
}

Expand All @@ -196,27 +196,27 @@ void log_threaded_irq_wakeup_reason(int irq, int parent_irq)
}
}

spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
}

static void __log_abort_or_abnormal_wake(bool abort, const char *fmt,
va_list args)
{
unsigned long flags;

spin_lock_irqsave(&wakeup_reason_lock, flags);
raw_spin_lock_irqsave(&wakeup_reason_lock, flags);

/* Suspend abort or abnormal wake reason has already been logged. */
if (suspend_abort || abnormal_wake) {
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
return;
}

suspend_abort = abort;
abnormal_wake = !abort;
vsnprintf(non_irq_wake_reason, MAX_SUSPEND_ABORT_LEN, fmt, args);

spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
}

void log_suspend_abort_reason(const char *fmt, ...)
Expand All @@ -241,29 +241,29 @@ void clear_wakeup_reasons(void)
{
unsigned long flags;

spin_lock_irqsave(&wakeup_reason_lock, flags);
raw_spin_lock_irqsave(&wakeup_reason_lock, flags);

delete_list(&leaf_irqs);
delete_list(&parent_irqs);
suspend_abort = false;
abnormal_wake = false;
capture_reasons = true;

spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
}

static void print_wakeup_sources(void)
{
struct wakeup_irq_node *n;
unsigned long flags;

spin_lock_irqsave(&wakeup_reason_lock, flags);
raw_spin_lock_irqsave(&wakeup_reason_lock, flags);

capture_reasons = false;

if (suspend_abort) {
pr_info("Abort: %s\n", non_irq_wake_reason);
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
return;
}

Expand All @@ -276,7 +276,7 @@ static void print_wakeup_sources(void)
else
pr_info("Resume cause unknown\n");

spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
}

static ssize_t last_resume_reason_show(struct kobject *kobj,
Expand All @@ -286,12 +286,12 @@ static ssize_t last_resume_reason_show(struct kobject *kobj,
struct wakeup_irq_node *n;
unsigned long flags;

spin_lock_irqsave(&wakeup_reason_lock, flags);
raw_spin_lock_irqsave(&wakeup_reason_lock, flags);

if (suspend_abort) {
buf_offset = scnprintf(buf, PAGE_SIZE, "Abort: %s",
non_irq_wake_reason);
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
return buf_offset;
}

Expand All @@ -304,7 +304,7 @@ static ssize_t last_resume_reason_show(struct kobject *kobj,
buf_offset = scnprintf(buf, PAGE_SIZE, "-1 %s",
non_irq_wake_reason);

spin_unlock_irqrestore(&wakeup_reason_lock, flags);
raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);

return buf_offset;
}
Expand Down

0 comments on commit 46d6c62

Please sign in to comment.