... | ... | ||
---|---|---|---|
35 | - Hooks into memory hotplug notifier for runtime updates. | 35 | - Hooks into memory hotplug notifier for runtime updates. |
36 | 36 | ||
37 | These patches have been tested under CXL-based memory configurations, | 37 | These patches have been tested under CXL-based memory configurations, |
38 | including hotplug scenarios, to ensure proper behavior and stability. | 38 | including hotplug scenarios, to ensure proper behavior and stability. |
39 | 39 | ||
40 | mm/mempolicy.c | 194 ++++++++++++++++++++++++++++++++----------------- | 40 | mm/mempolicy.c | 193 +++++++++++++++++++++++++++++++------------------ |
41 | 1 file changed, 126 insertions(+), 68 deletions(-) | 41 | 1 file changed, 124 insertions(+), 69 deletions(-) |
42 | 42 | ||
43 | 43 | ||
44 | base-commit: 38fec10eb60d687e30c8c6b5420d86e8149f7557 | 44 | base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8 |
45 | -- | 45 | -- |
46 | 2.34.1 | 46 | 2.34.1 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
16 | Signed-off-by: Rakie Kim <rakie.kim@sk.com> | 16 | Signed-off-by: Rakie Kim <rakie.kim@sk.com> |
17 | Signed-off-by: Honggyu Kim <honggyu.kim@sk.com> | 17 | Signed-off-by: Honggyu Kim <honggyu.kim@sk.com> |
18 | Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com> | 18 | Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com> |
19 | Reviewed-by: Gregory Price <gourry@gourry.net> | 19 | Reviewed-by: Gregory Price <gourry@gourry.net> |
20 | --- | 20 | --- |
21 | mm/mempolicy.c | 64 +++++++++++++++++++++++++++----------------------- | 21 | mm/mempolicy.c | 66 ++++++++++++++++++++++++-------------------------- |
22 | 1 file changed, 34 insertions(+), 30 deletions(-) | 22 | 1 file changed, 32 insertions(+), 34 deletions(-) |
23 | 23 | ||
24 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c | 24 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
25 | index XXXXXXX..XXXXXXX 100644 | 25 | index XXXXXXX..XXXXXXX 100644 |
26 | --- a/mm/mempolicy.c | 26 | --- a/mm/mempolicy.c |
27 | +++ b/mm/mempolicy.c | 27 | +++ b/mm/mempolicy.c |
... | ... | ||
38 | static const struct kobj_type wi_ktype = { | 38 | static const struct kobj_type wi_ktype = { |
39 | @@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *root_kobj) | 39 | @@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *root_kobj) |
40 | struct kobject *wi_kobj; | 40 | struct kobject *wi_kobj; |
41 | int nid, err; | 41 | int nid, err; |
42 | 42 | ||
43 | - wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL); | ||
44 | - if (!wi_kobj) | ||
45 | + node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *), | 43 | + node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *), |
46 | + GFP_KERNEL); | 44 | + GFP_KERNEL); |
47 | + if (!node_attrs) | 45 | + if (!node_attrs) |
46 | + return -ENOMEM; | ||
47 | + | ||
48 | wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL); | ||
49 | - if (!wi_kobj) | ||
50 | + if (!wi_kobj) { | ||
51 | + kfree(node_attrs); | ||
48 | return -ENOMEM; | 52 | return -ENOMEM; |
49 | |||
50 | + wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL); | ||
51 | + if (!wi_kobj) { | ||
52 | + err = -ENOMEM; | ||
53 | + goto node_out; | ||
54 | + } | 53 | + } |
55 | + | 54 | |
56 | err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj, | 55 | err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj, |
57 | "weighted_interleave"); | 56 | "weighted_interleave"); |
58 | if (err) { | 57 | - if (err) { |
59 | - kfree(wi_kobj); | 58 | - kfree(wi_kobj); |
60 | - return err; | 59 | - return err; |
61 | + kobject_put(wi_kobj); | 60 | - } |
62 | + goto err_out; | 61 | + if (err) |
63 | } | 62 | + goto err_put_kobj; |
64 | 63 | ||
65 | for_each_node_state(nid, N_POSSIBLE) { | 64 | for_each_node_state(nid, N_POSSIBLE) { |
66 | @@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *root_kobj) | 65 | err = add_weight_node(nid, wi_kobj); |
67 | break; | 66 | if (err) { |
67 | pr_err("failed to add sysfs [node%d]\n", nid); | ||
68 | - break; | ||
69 | + goto err_del_kobj; | ||
68 | } | 70 | } |
69 | } | 71 | } |
70 | - if (err) | 72 | - if (err) |
71 | + if (err) { | 73 | - kobject_put(wi_kobj); |
72 | + kobject_del(wi_kobj); | ||
73 | kobject_put(wi_kobj); | ||
74 | + goto err_out; | ||
75 | + } | ||
76 | + | 74 | + |
77 | return 0; | 75 | return 0; |
78 | + | 76 | + |
79 | +node_out: | 77 | +err_del_kobj: |
80 | + kfree(node_attrs); | 78 | + kobject_del(wi_kobj); |
81 | +err_out: | 79 | +err_put_kobj: |
80 | + kobject_put(wi_kobj); | ||
82 | + return err; | 81 | + return err; |
83 | } | 82 | } |
84 | 83 | ||
85 | static void mempolicy_kobj_release(struct kobject *kobj) | 84 | static void mempolicy_kobj_release(struct kobject *kobj) |
86 | @@ -XXX,XX +XXX,XX @@ static void mempolicy_kobj_release(struct kobject *kobj) | 85 | @@ -XXX,XX +XXX,XX @@ static void mempolicy_kobj_release(struct kobject *kobj) |
... | ... | ||
111 | 110 | ||
112 | err = kobject_init_and_add(mempolicy_kobj, &mempolicy_ktype, mm_kobj, | 111 | err = kobject_init_and_add(mempolicy_kobj, &mempolicy_ktype, mm_kobj, |
113 | "mempolicy"); | 112 | "mempolicy"); |
114 | if (err) | 113 | if (err) |
115 | - goto node_out; | 114 | - goto node_out; |
116 | + goto err_out; | 115 | + goto err_put_kobj; |
117 | 116 | ||
118 | err = add_weighted_interleave_group(mempolicy_kobj); | 117 | err = add_weighted_interleave_group(mempolicy_kobj); |
119 | - if (err) { | 118 | - if (err) { |
120 | - pr_err("mempolicy sysfs structure failed to initialize\n"); | 119 | - pr_err("mempolicy sysfs structure failed to initialize\n"); |
121 | - kobject_put(mempolicy_kobj); | 120 | - kobject_put(mempolicy_kobj); |
122 | - return err; | 121 | - return err; |
123 | - } | 122 | - } |
124 | + if (err) | 123 | + if (err) |
125 | + goto err_del; | 124 | + goto err_del_kobj; |
126 | 125 | ||
127 | - return err; | 126 | - return err; |
128 | -node_out: | 127 | -node_out: |
129 | - kfree(node_attrs); | 128 | - kfree(node_attrs); |
130 | -mempol_out: | 129 | -mempol_out: |
131 | - kfree(mempolicy_kobj); | 130 | - kfree(mempolicy_kobj); |
131 | -err_out: | ||
132 | - pr_err("failed to add mempolicy kobject to the system\n"); | ||
132 | + return 0; | 133 | + return 0; |
133 | + | 134 | + |
134 | +err_del: | 135 | +err_del_kobj: |
135 | + kobject_del(mempolicy_kobj); | 136 | + kobject_del(mempolicy_kobj); |
136 | err_out: | 137 | +err_put_kobj: |
137 | - pr_err("failed to add mempolicy kobject to the system\n"); | ||
138 | + kobject_put(mempolicy_kobj); | 138 | + kobject_put(mempolicy_kobj); |
139 | return err; | 139 | return err; |
140 | } | 140 | } |
141 | 141 | ||
142 | -- | 142 | -- |
143 | 2.34.1 | 143 | 2.34.1 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
21 | Signed-off-by: Rakie Kim <rakie.kim@sk.com> | 21 | Signed-off-by: Rakie Kim <rakie.kim@sk.com> |
22 | Signed-off-by: Honggyu Kim <honggyu.kim@sk.com> | 22 | Signed-off-by: Honggyu Kim <honggyu.kim@sk.com> |
23 | Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com> | 23 | Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com> |
24 | Reviewed-by: Gregory Price <gourry@gourry.net> | 24 | Reviewed-by: Gregory Price <gourry@gourry.net> |
25 | --- | 25 | --- |
26 | mm/mempolicy.c | 73 ++++++++++++++++++++++---------------------------- | 26 | mm/mempolicy.c | 61 ++++++++++++++++++++++++-------------------------- |
27 | 1 file changed, 32 insertions(+), 41 deletions(-) | 27 | 1 file changed, 29 insertions(+), 32 deletions(-) |
28 | 28 | ||
29 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c | 29 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
30 | index XXXXXXX..XXXXXXX 100644 | 30 | index XXXXXXX..XXXXXXX 100644 |
31 | --- a/mm/mempolicy.c | 31 | --- a/mm/mempolicy.c |
32 | +++ b/mm/mempolicy.c | 32 | +++ b/mm/mempolicy.c |
... | ... | ||
108 | + wi_group->nattrs[nid] = node_attr; | 108 | + wi_group->nattrs[nid] = node_attr; |
109 | return 0; | 109 | return 0; |
110 | } | 110 | } |
111 | 111 | ||
112 | -static int add_weighted_interleave_group(struct kobject *root_kobj) | 112 | -static int add_weighted_interleave_group(struct kobject *root_kobj) |
113 | +static int add_weighted_interleave_group(struct kobject *mempolicy_kobj) | 113 | +static int __init add_weighted_interleave_group(struct kobject *mempolicy_kobj) |
114 | { | 114 | { |
115 | - struct kobject *wi_kobj; | 115 | - struct kobject *wi_kobj; |
116 | int nid, err; | 116 | int nid, err; |
117 | 117 | ||
118 | - node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *), | 118 | - node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *), |
119 | - GFP_KERNEL); | 119 | - GFP_KERNEL); |
120 | - if (!node_attrs) | 120 | - if (!node_attrs) |
121 | + wi_group = kzalloc(struct_size(wi_group, nattrs, nr_node_ids), | 121 | + wi_group = kzalloc(struct_size(wi_group, nattrs, nr_node_ids), |
122 | + GFP_KERNEL); | 122 | + GFP_KERNEL); |
123 | + if (!wi_group) | 123 | + if (!wi_group) |
124 | return -ENOMEM; | 124 | return -ENOMEM; |
125 | 125 | ||
126 | - wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL); | 126 | - wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL); |
127 | - if (!wi_kobj) { | 127 | - if (!wi_kobj) { |
128 | - err = -ENOMEM; | 128 | - kfree(node_attrs); |
129 | - goto node_out; | 129 | - return -ENOMEM; |
130 | - } | 130 | - } |
131 | - | 131 | - |
132 | - err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj, | 132 | - err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj, |
133 | + err = kobject_init_and_add(&wi_group->wi_kobj, &wi_ktype, mempolicy_kobj, | 133 | + err = kobject_init_and_add(&wi_group->wi_kobj, &wi_ktype, mempolicy_kobj, |
134 | "weighted_interleave"); | 134 | "weighted_interleave"); |
135 | - if (err) { | 135 | if (err) |
136 | - kobject_put(wi_kobj); | 136 | goto err_put_kobj; |
137 | + if (err) | ||
138 | goto err_out; | ||
139 | - } | ||
140 | 137 | ||
141 | for_each_node_state(nid, N_POSSIBLE) { | 138 | for_each_node_state(nid, N_POSSIBLE) { |
142 | - err = add_weight_node(nid, wi_kobj); | 139 | - err = add_weight_node(nid, wi_kobj); |
143 | + err = sysfs_wi_node_add(nid); | 140 | + err = sysfs_wi_node_add(nid); |
144 | if (err) { | 141 | if (err) { |
145 | pr_err("failed to add sysfs [node%d]\n", nid); | 142 | pr_err("failed to add sysfs [node%d]\n", nid); |
146 | - break; | 143 | goto err_del_kobj; |
147 | + goto err_del; | 144 | @@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *root_kobj) |
148 | } | ||
149 | } | ||
150 | - if (err) { | ||
151 | - kobject_del(wi_kobj); | ||
152 | - kobject_put(wi_kobj); | ||
153 | - goto err_out; | ||
154 | - } | ||
155 | |||
156 | return 0; | 145 | return 0; |
157 | 146 | ||
158 | -node_out: | 147 | err_del_kobj: |
159 | - kfree(node_attrs); | 148 | - kobject_del(wi_kobj); |
160 | +err_del: | ||
161 | + kobject_del(&wi_group->wi_kobj); | 149 | + kobject_del(&wi_group->wi_kobj); |
162 | err_out: | 150 | err_put_kobj: |
151 | - kobject_put(wi_kobj); | ||
163 | + kobject_put(&wi_group->wi_kobj); | 152 | + kobject_put(&wi_group->wi_kobj); |
164 | return err; | 153 | return err; |
165 | } | 154 | } |
166 | 155 | ||
167 | -- | 156 | -- |
168 | 2.34.1 | 157 | 2.34.1 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
26 | events. | 26 | events. |
27 | 27 | ||
28 | Signed-off-by: Rakie Kim <rakie.kim@sk.com> | 28 | Signed-off-by: Rakie Kim <rakie.kim@sk.com> |
29 | Signed-off-by: Honggyu Kim <honggyu.kim@sk.com> | 29 | Signed-off-by: Honggyu Kim <honggyu.kim@sk.com> |
30 | Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com> | 30 | Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com> |
31 | Reviewed-by: Oscar Salvador <osalvador@suse.de> | ||
31 | --- | 32 | --- |
32 | mm/mempolicy.c | 109 ++++++++++++++++++++++++++++++++++++++----------- | 33 | mm/mempolicy.c | 106 ++++++++++++++++++++++++++++++++++++++----------- |
33 | 1 file changed, 86 insertions(+), 23 deletions(-) | 34 | 1 file changed, 83 insertions(+), 23 deletions(-) |
34 | 35 | ||
35 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c | 36 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
36 | index XXXXXXX..XXXXXXX 100644 | 37 | index XXXXXXX..XXXXXXX 100644 |
37 | --- a/mm/mempolicy.c | 38 | --- a/mm/mempolicy.c |
38 | +++ b/mm/mempolicy.c | 39 | +++ b/mm/mempolicy.c |
... | ... | ||
158 | + int err; | 159 | + int err; |
159 | + struct memory_notify *arg = data; | 160 | + struct memory_notify *arg = data; |
160 | + int nid = arg->status_change_nid; | 161 | + int nid = arg->status_change_nid; |
161 | + | 162 | + |
162 | + if (nid < 0) | 163 | + if (nid < 0) |
163 | + goto notifier_end; | 164 | + return NOTIFY_OK; |
164 | + | 165 | + |
165 | + switch(action) { | 166 | + switch(action) { |
166 | + case MEM_ONLINE: | 167 | + case MEM_ONLINE: |
167 | + err = sysfs_wi_node_add(nid); | 168 | + err = sysfs_wi_node_add(nid); |
168 | + if (err) { | 169 | + if (err) |
169 | + pr_err("failed to add sysfs [node%d]\n", nid); | 170 | + pr_err("failed to add sysfs [node%d]\n", nid); |
170 | + return NOTIFY_BAD; | ||
171 | + } | ||
172 | + break; | 171 | + break; |
173 | + case MEM_OFFLINE: | 172 | + case MEM_OFFLINE: |
174 | + sysfs_wi_node_delete(nid); | 173 | + sysfs_wi_node_delete(nid); |
175 | + break; | 174 | + break; |
176 | + } | 175 | + } |
177 | + | 176 | + |
178 | +notifier_end: | ||
179 | + return NOTIFY_OK; | 177 | + return NOTIFY_OK; |
180 | } | 178 | } |
181 | 179 | ||
182 | static int add_weighted_interleave_group(struct kobject *mempolicy_kobj) | 180 | static int __init add_weighted_interleave_group(struct kobject *mempolicy_kobj) |
183 | @@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *mempolicy_kobj) | 181 | @@ -XXX,XX +XXX,XX @@ static int __init add_weighted_interleave_group(struct kobject *mempolicy_kobj) |
184 | GFP_KERNEL); | 182 | GFP_KERNEL); |
185 | if (!wi_group) | 183 | if (!wi_group) |
186 | return -ENOMEM; | 184 | return -ENOMEM; |
187 | + mutex_init(&wi_group->kobj_lock); | 185 | + mutex_init(&wi_group->kobj_lock); |
188 | 186 | ||
189 | err = kobject_init_and_add(&wi_group->wi_kobj, &wi_ktype, mempolicy_kobj, | 187 | err = kobject_init_and_add(&wi_group->wi_kobj, &wi_ktype, mempolicy_kobj, |
190 | "weighted_interleave"); | 188 | "weighted_interleave"); |
191 | if (err) | 189 | if (err) |
192 | goto err_out; | 190 | goto err_put_kobj; |
193 | 191 | ||
194 | - for_each_node_state(nid, N_POSSIBLE) { | 192 | - for_each_node_state(nid, N_POSSIBLE) { |
195 | + for_each_online_node(nid) { | 193 | + for_each_online_node(nid) { |
196 | + if (!node_state(nid, N_MEMORY)) | 194 | + if (!node_state(nid, N_MEMORY)) |
197 | + continue; | 195 | + continue; |
198 | + | 196 | + |
199 | err = sysfs_wi_node_add(nid); | 197 | err = sysfs_wi_node_add(nid); |
200 | if (err) { | 198 | if (err) { |
201 | pr_err("failed to add sysfs [node%d]\n", nid); | 199 | pr_err("failed to add sysfs [node%d]\n", nid); |
202 | @@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *mempolicy_kobj) | 200 | @@ -XXX,XX +XXX,XX @@ static int __init add_weighted_interleave_group(struct kobject *mempolicy_kobj) |
203 | } | 201 | } |
204 | } | 202 | } |
205 | 203 | ||
206 | + hotplug_memory_notifier(wi_node_notifier, DEFAULT_CALLBACK_PRI); | 204 | + hotplug_memory_notifier(wi_node_notifier, DEFAULT_CALLBACK_PRI); |
207 | return 0; | 205 | return 0; |
208 | 206 | ||
209 | err_del: | 207 | err_del_kobj: |
210 | -- | 208 | -- |
211 | 2.34.1 | 209 | 2.34.1 | diff view generated by jsdifflib |