kernel/power/wakelock.c duplicates wakeup source creation and
registration code from drivers/base/power/wakeup.c.

Change struct wakelock's wakeup source to a pointer and use
wakeup_source_register() function to create and register said wakeup
source. Use wakeup_source_unregister() on cleanup path.

Signed-off-by: Tri Vo <tr...@android.com>
---
 kernel/power/wakelock.c | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/kernel/power/wakelock.c b/kernel/power/wakelock.c
index 4210152e56f0..d1eb7fd98b64 100644
--- a/kernel/power/wakelock.c
+++ b/kernel/power/wakelock.c
@@ -27,7 +27,7 @@ static DEFINE_MUTEX(wakelocks_lock);
 struct wakelock {
        char                    *name;
        struct rb_node          node;
-       struct wakeup_source    ws;
+       struct wakeup_source    *ws;
 #ifdef CONFIG_PM_WAKELOCKS_GC
        struct list_head        lru;
 #endif
@@ -46,7 +46,7 @@ ssize_t pm_show_wakelocks(char *buf, bool show_active)
 
        for (node = rb_first(&wakelocks_tree); node; node = rb_next(node)) {
                wl = rb_entry(node, struct wakelock, node);
-               if (wl->ws.active == show_active)
+               if (wl->ws->active == show_active)
                        str += scnprintf(str, end - str, "%s ", wl->name);
        }
        if (str > buf)
@@ -112,16 +112,16 @@ static void __wakelocks_gc(struct work_struct *work)
                u64 idle_time_ns;
                bool active;
 
-               spin_lock_irq(&wl->ws.lock);
-               idle_time_ns = ktime_to_ns(ktime_sub(now, wl->ws.last_time));
-               active = wl->ws.active;
-               spin_unlock_irq(&wl->ws.lock);
+               spin_lock_irq(&wl->ws->lock);
+               idle_time_ns = ktime_to_ns(ktime_sub(now, wl->ws->last_time));
+               active = wl->ws->active;
+               spin_unlock_irq(&wl->ws->lock);
 
                if (idle_time_ns < ((u64)WL_GC_TIME_SEC * NSEC_PER_SEC))
                        break;
 
                if (!active) {
-                       wakeup_source_remove(&wl->ws);
+                       wakeup_source_unregister(wl->ws);
                        rb_erase(&wl->node, &wakelocks_tree);
                        list_del(&wl->lru);
                        kfree(wl->name);
@@ -187,9 +187,15 @@ static struct wakelock *wakelock_lookup_add(const char 
*name, size_t len,
                kfree(wl);
                return ERR_PTR(-ENOMEM);
        }
-       wl->ws.name = wl->name;
-       wl->ws.last_time = ktime_get();
-       wakeup_source_add(&wl->ws);
+
+       wl->ws = wakeup_source_register(wl->name);
+       if (!wl->ws) {
+               kfree(wl->name);
+               kfree(wl);
+               return ERR_PTR(-ENOMEM);
+       }
+       wl->ws->last_time = ktime_get();
+
        rb_link_node(&wl->node, parent, node);
        rb_insert_color(&wl->node, &wakelocks_tree);
        wakelocks_lru_add(wl);
@@ -233,9 +239,9 @@ int pm_wake_lock(const char *buf)
                u64 timeout_ms = timeout_ns + NSEC_PER_MSEC - 1;
 
                do_div(timeout_ms, NSEC_PER_MSEC);
-               __pm_wakeup_event(&wl->ws, timeout_ms);
+               __pm_wakeup_event(wl->ws, timeout_ms);
        } else {
-               __pm_stay_awake(&wl->ws);
+               __pm_stay_awake(wl->ws);
        }
 
        wakelocks_lru_most_recent(wl);
@@ -271,7 +277,7 @@ int pm_wake_unlock(const char *buf)
                ret = PTR_ERR(wl);
                goto out;
        }
-       __pm_relax(&wl->ws);
+       __pm_relax(wl->ws);
 
        wakelocks_lru_most_recent(wl);
        wakelocks_gc();
-- 
2.22.0.770.g0f2c4a37fd-goog

Reply via email to