...
...
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