]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.arch/s390-12-10-kernel_appldata_mutex.patch
Revert "Disable build of xen kernel."
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.arch / s390-12-10-kernel_appldata_mutex.patch
1 From: Gerald Schaefer <geraldsc@de.ibm.com>
2 Subject: kernel: use mutex for appldata_ops instead of spin_lock.
3 References: bnc#487755,LTC#52788
4
5 Symptom: Possible deadlock when appldata_mem is active
6 Problem: The appldata_ops callbacks are called with a spin_lock held.
7 But the appldata_mem callback then calls all_vm_events(), which
8 calls get_online_cpus(), which might sleep.
9 Solution: Use a mutex instead of a spin_lock.
10
11 Acked-by: John Jolly <jjolly@suse.de>
12 ---
13 arch/s390/appldata/appldata_base.c | 32 ++++++++++++++++----------------
14 arch/s390/appldata/appldata_mem.c | 4 +---
15 2 files changed, 17 insertions(+), 19 deletions(-)
16
17 Index: linux-sles11/arch/s390/appldata/appldata_base.c
18 ===================================================================
19 --- linux-sles11.orig/arch/s390/appldata/appldata_base.c
20 +++ linux-sles11/arch/s390/appldata/appldata_base.c
21 @@ -97,7 +97,7 @@ static DECLARE_WORK(appldata_work, appld
22 /*
23 * Ops list
24 */
25 -static DEFINE_SPINLOCK(appldata_ops_lock);
26 +static DEFINE_MUTEX(appldata_ops_mutex);
27 static LIST_HEAD(appldata_ops_list);
28
29
30 @@ -128,14 +128,14 @@ static void appldata_work_fn(struct work
31
32 i = 0;
33 get_online_cpus();
34 - spin_lock(&appldata_ops_lock);
35 + mutex_lock(&appldata_ops_mutex);
36 list_for_each(lh, &appldata_ops_list) {
37 ops = list_entry(lh, struct appldata_ops, list);
38 if (ops->active == 1) {
39 ops->callback(ops->data);
40 }
41 }
42 - spin_unlock(&appldata_ops_lock);
43 + mutex_unlock(&appldata_ops_mutex);
44 put_online_cpus();
45 }
46
47 @@ -337,7 +337,7 @@ appldata_generic_handler(ctl_table *ctl,
48 struct list_head *lh;
49
50 found = 0;
51 - spin_lock(&appldata_ops_lock);
52 + mutex_lock(&appldata_ops_mutex);
53 list_for_each(lh, &appldata_ops_list) {
54 tmp_ops = list_entry(lh, struct appldata_ops, list);
55 if (&tmp_ops->ctl_table[2] == ctl) {
56 @@ -345,15 +345,15 @@ appldata_generic_handler(ctl_table *ctl,
57 }
58 }
59 if (!found) {
60 - spin_unlock(&appldata_ops_lock);
61 + mutex_unlock(&appldata_ops_mutex);
62 return -ENODEV;
63 }
64 ops = ctl->data;
65 if (!try_module_get(ops->owner)) { // protect this function
66 - spin_unlock(&appldata_ops_lock);
67 + mutex_unlock(&appldata_ops_mutex);
68 return -ENODEV;
69 }
70 - spin_unlock(&appldata_ops_lock);
71 + mutex_unlock(&appldata_ops_mutex);
72
73 if (!*lenp || *ppos) {
74 *lenp = 0;
75 @@ -377,11 +377,11 @@ appldata_generic_handler(ctl_table *ctl,
76 return -EFAULT;
77 }
78
79 - spin_lock(&appldata_ops_lock);
80 + mutex_lock(&appldata_ops_mutex);
81 if ((buf[0] == '1') && (ops->active == 0)) {
82 // protect work queue callback
83 if (!try_module_get(ops->owner)) {
84 - spin_unlock(&appldata_ops_lock);
85 + mutex_unlock(&appldata_ops_mutex);
86 module_put(ops->owner);
87 return -ENODEV;
88 }
89 @@ -406,7 +406,7 @@ appldata_generic_handler(ctl_table *ctl,
90 "failed with rc=%d\n", ops->name, rc);
91 module_put(ops->owner);
92 }
93 - spin_unlock(&appldata_ops_lock);
94 + mutex_unlock(&appldata_ops_mutex);
95 out:
96 *lenp = len;
97 *ppos += len;
98 @@ -432,9 +432,9 @@ int appldata_register_ops(struct appldat
99 if (!ops->ctl_table)
100 return -ENOMEM;
101
102 - spin_lock(&appldata_ops_lock);
103 + mutex_lock(&appldata_ops_mutex);
104 list_add(&ops->list, &appldata_ops_list);
105 - spin_unlock(&appldata_ops_lock);
106 + mutex_unlock(&appldata_ops_mutex);
107
108 ops->ctl_table[0].procname = appldata_proc_name;
109 ops->ctl_table[0].maxlen = 0;
110 @@ -451,9 +451,9 @@ int appldata_register_ops(struct appldat
111 goto out;
112 return 0;
113 out:
114 - spin_lock(&appldata_ops_lock);
115 + mutex_lock(&appldata_ops_mutex);
116 list_del(&ops->list);
117 - spin_unlock(&appldata_ops_lock);
118 + mutex_unlock(&appldata_ops_mutex);
119 kfree(ops->ctl_table);
120 return -ENOMEM;
121 }
122 @@ -465,9 +465,9 @@ out:
123 */
124 void appldata_unregister_ops(struct appldata_ops *ops)
125 {
126 - spin_lock(&appldata_ops_lock);
127 + mutex_lock(&appldata_ops_mutex);
128 list_del(&ops->list);
129 - spin_unlock(&appldata_ops_lock);
130 + mutex_unlock(&appldata_ops_mutex);
131 unregister_sysctl_table(ops->sysctl_header);
132 kfree(ops->ctl_table);
133 }
134 Index: linux-sles11/arch/s390/appldata/appldata_mem.c
135 ===================================================================
136 --- linux-sles11.orig/arch/s390/appldata/appldata_mem.c
137 +++ linux-sles11/arch/s390/appldata/appldata_mem.c
138 @@ -78,7 +78,7 @@ static void appldata_get_mem_data(void *
139 {
140 /*
141 * don't put large structures on the stack, we are
142 - * serialized through the appldata_ops_lock and can use static
143 + * serialized through the appldata_ops_mutex and can use static
144 */
145 static struct sysinfo val;
146 unsigned long ev[NR_VM_EVENT_ITEMS];