diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2012-05-05 15:57:20 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2012-05-11 15:11:02 -0400 |
commit | c73893e2ca731b4a81ae59246ab57979aa188777 (patch) | |
tree | bec6c0253b848ea658acb72de6bfd86e707bc798 | |
parent | 6237dd132d4eb408ffa80830fe395448e5657ab0 (diff) |
PM / Sleep: Make the limit of user space wakeup sources configurable
Make it possible to configure out the check against the limit of
user space wakeup sources for debugging and default Android builds.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Arve Hjønnevåg <arve@android.com>
-rw-r--r-- | kernel/power/Kconfig | 6 | ||||
-rw-r--r-- | kernel/power/wakelock.c | 31 |
2 files changed, 32 insertions, 5 deletions
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index 1d534076d33a..08783eda9ce4 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig | |||
@@ -119,6 +119,12 @@ config PM_WAKELOCKS | |||
119 | Allow user space to create, activate and deactivate wakeup source | 119 | Allow user space to create, activate and deactivate wakeup source |
120 | objects with the help of a sysfs-based interface. | 120 | objects with the help of a sysfs-based interface. |
121 | 121 | ||
122 | config PM_WAKELOCKS_LIMIT | ||
123 | int "Maximum number of user space wakeup sources (0 = no limit)" | ||
124 | range 0 100000 | ||
125 | default 100 | ||
126 | depends on PM_WAKELOCKS | ||
127 | |||
122 | config PM_RUNTIME | 128 | config PM_RUNTIME |
123 | bool "Run-time PM core functionality" | 129 | bool "Run-time PM core functionality" |
124 | depends on !IA64_HP_SIM | 130 | depends on !IA64_HP_SIM |
diff --git a/kernel/power/wakelock.c b/kernel/power/wakelock.c index 579700665e8c..dc34b9d3b7d8 100644 --- a/kernel/power/wakelock.c +++ b/kernel/power/wakelock.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/rbtree.h> | 17 | #include <linux/rbtree.h> |
18 | #include <linux/slab.h> | 18 | #include <linux/slab.h> |
19 | 19 | ||
20 | #define WL_NUMBER_LIMIT 100 | ||
21 | #define WL_GC_COUNT_MAX 100 | 20 | #define WL_GC_COUNT_MAX 100 |
22 | #define WL_GC_TIME_SEC 300 | 21 | #define WL_GC_TIME_SEC 300 |
23 | 22 | ||
@@ -32,7 +31,6 @@ struct wakelock { | |||
32 | 31 | ||
33 | static struct rb_root wakelocks_tree = RB_ROOT; | 32 | static struct rb_root wakelocks_tree = RB_ROOT; |
34 | static LIST_HEAD(wakelocks_lru_list); | 33 | static LIST_HEAD(wakelocks_lru_list); |
35 | static unsigned int number_of_wakelocks; | ||
36 | static unsigned int wakelocks_gc_count; | 34 | static unsigned int wakelocks_gc_count; |
37 | 35 | ||
38 | ssize_t pm_show_wakelocks(char *buf, bool show_active) | 36 | ssize_t pm_show_wakelocks(char *buf, bool show_active) |
@@ -58,6 +56,29 @@ ssize_t pm_show_wakelocks(char *buf, bool show_active) | |||
58 | return (str - buf); | 56 | return (str - buf); |
59 | } | 57 | } |
60 | 58 | ||
59 | #if CONFIG_PM_WAKELOCKS_LIMIT > 0 | ||
60 | static unsigned int number_of_wakelocks; | ||
61 | |||
62 | static inline bool wakelocks_limit_exceeded(void) | ||
63 | { | ||
64 | return number_of_wakelocks > CONFIG_PM_WAKELOCKS_LIMIT; | ||
65 | } | ||
66 | |||
67 | static inline void increment_wakelocks_number(void) | ||
68 | { | ||
69 | number_of_wakelocks++; | ||
70 | } | ||
71 | |||
72 | static inline void decrement_wakelocks_number(void) | ||
73 | { | ||
74 | number_of_wakelocks--; | ||
75 | } | ||
76 | #else /* CONFIG_PM_WAKELOCKS_LIMIT = 0 */ | ||
77 | static inline bool wakelocks_limit_exceeded(void) { return false; } | ||
78 | static inline void increment_wakelocks_number(void) {} | ||
79 | static inline void decrement_wakelocks_number(void) {} | ||
80 | #endif /* CONFIG_PM_WAKELOCKS_LIMIT */ | ||
81 | |||
61 | static struct wakelock *wakelock_lookup_add(const char *name, size_t len, | 82 | static struct wakelock *wakelock_lookup_add(const char *name, size_t len, |
62 | bool add_if_not_found) | 83 | bool add_if_not_found) |
63 | { | 84 | { |
@@ -85,7 +106,7 @@ static struct wakelock *wakelock_lookup_add(const char *name, size_t len, | |||
85 | if (!add_if_not_found) | 106 | if (!add_if_not_found) |
86 | return ERR_PTR(-EINVAL); | 107 | return ERR_PTR(-EINVAL); |
87 | 108 | ||
88 | if (number_of_wakelocks > WL_NUMBER_LIMIT) | 109 | if (wakelocks_limit_exceeded()) |
89 | return ERR_PTR(-ENOSPC); | 110 | return ERR_PTR(-ENOSPC); |
90 | 111 | ||
91 | /* Not found, we have to add a new one. */ | 112 | /* Not found, we have to add a new one. */ |
@@ -103,7 +124,7 @@ static struct wakelock *wakelock_lookup_add(const char *name, size_t len, | |||
103 | rb_link_node(&wl->node, parent, node); | 124 | rb_link_node(&wl->node, parent, node); |
104 | rb_insert_color(&wl->node, &wakelocks_tree); | 125 | rb_insert_color(&wl->node, &wakelocks_tree); |
105 | list_add(&wl->lru, &wakelocks_lru_list); | 126 | list_add(&wl->lru, &wakelocks_lru_list); |
106 | number_of_wakelocks++; | 127 | increment_wakelocks_number(); |
107 | return wl; | 128 | return wl; |
108 | } | 129 | } |
109 | 130 | ||
@@ -175,7 +196,7 @@ static void wakelocks_gc(void) | |||
175 | list_del(&wl->lru); | 196 | list_del(&wl->lru); |
176 | kfree(wl->name); | 197 | kfree(wl->name); |
177 | kfree(wl); | 198 | kfree(wl); |
178 | number_of_wakelocks--; | 199 | decrement_wakelocks_number(); |
179 | } | 200 | } |
180 | } | 201 | } |
181 | wakelocks_gc_count = 0; | 202 | wakelocks_gc_count = 0; |