...
...
13
when initialization failed or when nodes were removed.
13
when initialization failed or when nodes were removed.
14
- Lack of Dynamic Updates: Sysfs attributes were created only during
14
- Lack of Dynamic Updates: Sysfs attributes were created only during
15
initialization, preventing nodes added at runtime from being recognized.
15
initialization, preventing nodes added at runtime from being recognized.
16
- Handling of Unusable Nodes: Sysfs entries were generated for all
16
- Handling of Unusable Nodes: Sysfs entries were generated for all
17
possible nodes (`N_POSSIBLE`), including memoryless or unavailable nodes,
17
possible nodes (`N_POSSIBLE`), including memoryless or unavailable nodes,
18
leading to unnecessary sysfs attributes and misconfiguration issues.
18
leading to sysfs entries for unusable nodes and potential
19
misconfigurations.
19
20
20
### Patch Overview
21
### Patch Overview
21
1. [PATCH 1/3] Fix memory leaks in weighted interleave sysfs
22
1. [PATCH 1/3] Fix memory leaks in weighted interleave sysfs
22
- Ensures proper cleanup of `kobject` allocations.
23
- Ensures proper cleanup of `kobject` allocations.
23
- Replaces unnecessary `kfree()` calls with `kobject_put()`, preventing
24
- Replaces unnecessary `kfree()` calls with `kobject_put()`, preventing
...
...
37
preventing stale or redundant entries from persisting.
38
preventing stale or redundant entries from persisting.
38
39
39
These patches have been tested under CXL-based memory configurations,
40
These patches have been tested under CXL-based memory configurations,
40
including hotplug scenarios, to ensure proper behavior and stability.
41
including hotplug scenarios, to ensure proper behavior and stability.
41
42
42
mm/mempolicy.c | 191 +++++++++++++++++++++++++++++++------------------
43
mm/mempolicy.c | 195 ++++++++++++++++++++++++++++++++-----------------
43
1 file changed, 123 insertions(+), 68 deletions(-)
44
1 file changed, 127 insertions(+), 68 deletions(-)
44
45
45
46
46
base-commit: 4701f33a10702d5fc577c32434eb62adde0a1ae1
47
base-commit: 38fec10eb60d687e30c8c6b5420d86e8149f7557
47
--
48
--
48
2.34.1
49
2.34.1
diff view generated by jsdifflib
...
...
10
properly deallocates memory without causing resource leaks,
10
properly deallocates memory without causing resource leaks,
11
thereby improving system stability.
11
thereby improving system stability.
12
12
13
Fixes: dce41f5ae253 ("mm/mempolicy: implement the sysfs-based weighted_interleave interface")
13
Fixes: dce41f5ae253 ("mm/mempolicy: implement the sysfs-based weighted_interleave interface")
14
Signed-off-by: Rakie Kim <rakie.kim@sk.com>
14
Signed-off-by: Rakie Kim <rakie.kim@sk.com>
15
Signed-off-by: Honggyu Kim <honggyu.kim@sk.com>
16
Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com>
17
Reviewed-by: Gregory Price <gourry@gourry.net>
15
---
18
---
16
mm/mempolicy.c | 61 +++++++++++++++++++++++++-------------------------
19
mm/mempolicy.c | 61 +++++++++++++++++++++++++-------------------------
17
1 file changed, 31 insertions(+), 30 deletions(-)
20
1 file changed, 31 insertions(+), 30 deletions(-)
18
21
19
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
22
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
...
...
129
-    pr_err("failed to add mempolicy kobject to the system\n");
132
-    pr_err("failed to add mempolicy kobject to the system\n");
130
+    kobject_put(mempolicy_kobj);
133
+    kobject_put(mempolicy_kobj);
131
    return err;
134
    return err;
132
}
135
}
133
136
134
135
base-commit: 4701f33a10702d5fc577c32434eb62adde0a1ae1
136
--
137
--
137
2.34.1
138
2.34.1
diff view generated by jsdifflib
...
...
9
With this change, sysfs management for weighted interleave is
9
With this change, sysfs management for weighted interleave is
10
more flexible, supporting hotplug events and runtime updates
10
more flexible, supporting hotplug events and runtime updates
11
more effectively.
11
more effectively.
12
12
13
Signed-off-by: Rakie Kim <rakie.kim@sk.com>
13
Signed-off-by: Rakie Kim <rakie.kim@sk.com>
14
Signed-off-by: Honggyu Kim <honggyu.kim@sk.com>
15
Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com>
16
Reviewed-by: Gregory Price <gourry@gourry.net>
14
---
17
---
15
mm/mempolicy.c | 70 ++++++++++++++++++++++----------------------------
18
mm/mempolicy.c | 71 ++++++++++++++++++++++----------------------------
16
1 file changed, 30 insertions(+), 40 deletions(-)
19
1 file changed, 31 insertions(+), 40 deletions(-)
17
20
18
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
21
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
19
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
20
--- a/mm/mempolicy.c
23
--- a/mm/mempolicy.c
21
+++ b/mm/mempolicy.c
24
+++ b/mm/mempolicy.c
...
...
26
+struct sysfs_wi_group {
29
+struct sysfs_wi_group {
27
+    struct kobject wi_kobj;
30
+    struct kobject wi_kobj;
28
+    struct iw_node_attr *nattrs[];
31
+    struct iw_node_attr *nattrs[];
29
+};
32
+};
30
+
33
+
31
+static struct sysfs_wi_group *sgrp;
34
+static struct sysfs_wi_group *wi_group;
32
+
35
+
33
static ssize_t node_show(struct kobject *kobj, struct kobj_attribute *attr,
36
static ssize_t node_show(struct kobject *kobj, struct kobj_attribute *attr,
34
             char *buf)
37
             char *buf)
35
{
38
{
36
@@ -XXX,XX +XXX,XX @@ static ssize_t node_store(struct kobject *kobj, struct kobj_attribute *attr,
39
@@ -XXX,XX +XXX,XX @@ static ssize_t node_store(struct kobject *kobj, struct kobj_attribute *attr,
...
...
42
-static void sysfs_wi_node_release(struct iw_node_attr *node_attr,
45
-static void sysfs_wi_node_release(struct iw_node_attr *node_attr,
43
-                 struct kobject *parent)
46
-                 struct kobject *parent)
44
+static void sysfs_wi_node_release(int nid)
47
+static void sysfs_wi_node_release(int nid)
45
{
48
{
46
-    if (!node_attr)
49
-    if (!node_attr)
47
+    if (!sgrp->nattrs[nid])
50
+    if (!wi_group->nattrs[nid])
48
        return;
51
        return;
49
-    sysfs_remove_file(parent, &node_attr->kobj_attr.attr);
52
-    sysfs_remove_file(parent, &node_attr->kobj_attr.attr);
50
-    kfree(node_attr->kobj_attr.attr.name);
53
-    kfree(node_attr->kobj_attr.attr.name);
51
-    kfree(node_attr);
54
-    kfree(node_attr);
52
+
55
+
53
+    sysfs_remove_file(&sgrp->wi_kobj, &sgrp->nattrs[nid]->kobj_attr.attr);
56
+    sysfs_remove_file(&wi_group->wi_kobj,
54
+    kfree(sgrp->nattrs[nid]->kobj_attr.attr.name);
57
+             &wi_group->nattrs[nid]->kobj_attr.attr);
55
+    kfree(sgrp->nattrs[nid]);
58
+    kfree(wi_group->nattrs[nid]->kobj_attr.attr.name);
59
+    kfree(wi_group->nattrs[nid]);
56
}
60
}
57
61
58
static void sysfs_wi_release(struct kobject *wi_kobj)
62
static void sysfs_wi_release(struct kobject *wi_kobj)
59
{
63
{
60
-    int i;
64
-    int i;
...
...
65
69
66
-    kfree(node_attrs);
70
-    kfree(node_attrs);
67
-    kfree(wi_kobj);
71
-    kfree(wi_kobj);
68
+    for (nid = 0; nid < nr_node_ids; nid++)
72
+    for (nid = 0; nid < nr_node_ids; nid++)
69
+        sysfs_wi_node_release(nid);
73
+        sysfs_wi_node_release(nid);
70
+    kfree(sgrp);
74
+    kfree(wi_group);
71
}
75
}
72
76
73
static const struct kobj_type wi_ktype = {
77
static const struct kobj_type wi_ktype = {
74
@@ -XXX,XX +XXX,XX @@ static const struct kobj_type wi_ktype = {
78
@@ -XXX,XX +XXX,XX @@ static const struct kobj_type wi_ktype = {
75
    .release = sysfs_wi_release,
79
    .release = sysfs_wi_release,
...
...
83
@@ -XXX,XX +XXX,XX @@ static int add_weight_node(int nid, struct kobject *wi_kobj)
87
@@ -XXX,XX +XXX,XX @@ static int add_weight_node(int nid, struct kobject *wi_kobj)
84
    node_attr->kobj_attr.store = node_store;
88
    node_attr->kobj_attr.store = node_store;
85
    node_attr->nid = nid;
89
    node_attr->nid = nid;
86
90
87
-    if (sysfs_create_file(wi_kobj, &node_attr->kobj_attr.attr)) {
91
-    if (sysfs_create_file(wi_kobj, &node_attr->kobj_attr.attr)) {
88
+    if (sysfs_create_file(&sgrp->wi_kobj, &node_attr->kobj_attr.attr)) {
92
+    if (sysfs_create_file(&wi_group->wi_kobj, &node_attr->kobj_attr.attr)) {
89
        kfree(node_attr->kobj_attr.attr.name);
93
        kfree(node_attr->kobj_attr.attr.name);
90
        kfree(node_attr);
94
        kfree(node_attr);
91
        pr_err("failed to add attribute to weighted_interleave\n");
95
        pr_err("failed to add attribute to weighted_interleave\n");
92
        return -ENOMEM;
96
        return -ENOMEM;
93
    }
97
    }
94
98
95
-    node_attrs[nid] = node_attr;
99
-    node_attrs[nid] = node_attr;
96
+    sgrp->nattrs[nid] = node_attr;
100
+    wi_group->nattrs[nid] = node_attr;
97
    return 0;
101
    return 0;
98
}
102
}
99
103
100
-static int add_weighted_interleave_group(struct kobject *root_kobj)
104
-static int add_weighted_interleave_group(struct kobject *root_kobj)
101
+static int add_weighted_interleave_group(struct kobject *mempolicy_kobj)
105
+static int add_weighted_interleave_group(struct kobject *mempolicy_kobj)
...
...
104
    int nid, err;
108
    int nid, err;
105
109
106
-    node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *),
110
-    node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *),
107
-             GFP_KERNEL);
111
-             GFP_KERNEL);
108
-    if (!node_attrs)
112
-    if (!node_attrs)
109
+    sgrp = kzalloc(sizeof(struct sysfs_wi_group) +             \
113
+    wi_group = kzalloc(sizeof(struct sysfs_wi_group) +         \
110
+         nr_node_ids * sizeof(struct iw_node_attr *),    \
114
+         nr_node_ids * sizeof(struct iw_node_attr *),    \
111
+         GFP_KERNEL);
115
+         GFP_KERNEL);
112
+    if (!sgrp)
116
+    if (!wi_group)
113
        return -ENOMEM;
117
        return -ENOMEM;
114
118
115
-    wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL);
119
-    wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL);
116
-    if (!wi_kobj) {
120
-    if (!wi_kobj) {
117
-        err = -ENOMEM;
121
-        err = -ENOMEM;
118
-        goto node_out;
122
-        goto node_out;
119
-    }
123
-    }
120
-
124
-
121
-    err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj,
125
-    err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj,
122
+    err = kobject_init_and_add(&sgrp->wi_kobj, &wi_ktype, mempolicy_kobj,
126
+    err = kobject_init_and_add(&wi_group->wi_kobj, &wi_ktype, mempolicy_kobj,
123
                 "weighted_interleave");
127
                 "weighted_interleave");
124
-    if (err) {
128
-    if (err) {
125
-        kobject_put(wi_kobj);
129
-        kobject_put(wi_kobj);
126
+    if (err)
130
+    if (err)
127
        goto err_out;
131
        goto err_out;
...
...
144
    return 0;
148
    return 0;
145
149
146
-node_out:
150
-node_out:
147
-    kfree(node_attrs);
151
-    kfree(node_attrs);
148
err_out:
152
err_out:
149
+    kobject_put(&sgrp->wi_kobj);
153
+    kobject_put(&wi_group->wi_kobj);
150
    return err;
154
    return err;
151
}
155
}
152
156
153
--
157
--
154
2.34.1
158
2.34.1
diff view generated by jsdifflib
...
...
9
runtime, as some may remain memoryless or offline.
9
runtime, as some may remain memoryless or offline.
10
This led to sysfs entries being created for unusable nodes, causing
10
This led to sysfs entries being created for unusable nodes, causing
11
potential misconfiguration issues.
11
potential misconfiguration issues.
12
12
13
To address this issue, this patch modifies the sysfs creation logic to:
13
To address this issue, this patch modifies the sysfs creation logic to:
14
1) Limit sysfs entries to nodes that are online and have memory, reducing
14
1) Limit sysfs entries to nodes that are online and have memory, avoiding
15
the creation of sysfs attributes for unusable nodes.
15
the creation of sysfs entries for nodes that cannot be used.
16
2) Support memory hotplug by dynamically adding and removing sysfs entries
16
2) Support memory hotplug by dynamically adding and removing sysfs entries
17
based on whether a node transitions into or out of the N_MEMORY state.
17
based on whether a node transitions into or out of the N_MEMORY state.
18
18
19
Additionally, the patch ensures that sysfs attributes are properly managed
19
Additionally, the patch ensures that sysfs attributes are properly managed
20
when nodes go offline, preventing stale or redundant entries from persisting
20
when nodes go offline, preventing stale or redundant entries from persisting
...
...
24
sysfs entries more efficiently, ensuring that only relevant nodes are
24
sysfs entries more efficiently, ensuring that only relevant nodes are
25
considered for interleaving, and dynamically adapting to memory hotplug
25
considered for interleaving, and dynamically adapting to memory hotplug
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>
30
Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com>
29
---
31
---
30
mm/mempolicy.c | 108 +++++++++++++++++++++++++++++++++++++++----------
32
mm/mempolicy.c | 113 +++++++++++++++++++++++++++++++++++++++----------
31
1 file changed, 86 insertions(+), 22 deletions(-)
33
1 file changed, 90 insertions(+), 23 deletions(-)
32
34
33
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
35
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
34
index XXXXXXX..XXXXXXX 100644
36
index XXXXXXX..XXXXXXX 100644
35
--- a/mm/mempolicy.c
37
--- a/mm/mempolicy.c
36
+++ b/mm/mempolicy.c
38
+++ b/mm/mempolicy.c
...
...
52
54
53
@@ -XXX,XX +XXX,XX @@ static ssize_t node_store(struct kobject *kobj, struct kobj_attribute *attr,
55
@@ -XXX,XX +XXX,XX @@ static ssize_t node_store(struct kobject *kobj, struct kobj_attribute *attr,
54
56
55
static void sysfs_wi_node_release(int nid)
57
static void sysfs_wi_node_release(int nid)
56
{
58
{
57
-    if (!sgrp->nattrs[nid])
59
-    if (!wi_group->nattrs[nid])
58
+    struct iw_node_attr *attr;
60
+    struct iw_node_attr *attr;
59
+
61
+
60
+    if (nid < 0 || nid >= nr_node_ids)
62
+    if (nid < 0 || nid >= nr_node_ids)
61
+        return;
63
+        return;
62
+
64
+
63
+    mutex_lock(&sgrp->kobj_lock);
65
+    mutex_lock(&wi_group->kobj_lock);
64
+    attr = sgrp->nattrs[nid];
66
+    attr = wi_group->nattrs[nid];
65
+    if (!attr) {
67
+    if (!attr) {
66
+        mutex_unlock(&sgrp->kobj_lock);
68
+        mutex_unlock(&wi_group->kobj_lock);
67
        return;
69
        return;
68
+    }
70
+    }
69
+
71
70
+    sgrp->nattrs[nid] = NULL;
72
-    sysfs_remove_file(&wi_group->wi_kobj,
71
+    mutex_unlock(&sgrp->kobj_lock);
73
-             &wi_group->nattrs[nid]->kobj_attr.attr);
72
74
-    kfree(wi_group->nattrs[nid]->kobj_attr.attr.name);
73
-    sysfs_remove_file(&sgrp->wi_kobj, &sgrp->nattrs[nid]->kobj_attr.attr);
75
-    kfree(wi_group->nattrs[nid]);
74
-    kfree(sgrp->nattrs[nid]->kobj_attr.attr.name);
76
+    wi_group->nattrs[nid] = NULL;
75
-    kfree(sgrp->nattrs[nid]);
77
+    mutex_unlock(&wi_group->kobj_lock);
76
+    sysfs_remove_file(&sgrp->wi_kobj, &attr->kobj_attr.attr);
78
+
79
+    sysfs_remove_file(&wi_group->wi_kobj, &attr->kobj_attr.attr);
77
+    kfree(attr->kobj_attr.attr.name);
80
+    kfree(attr->kobj_attr.attr.name);
78
+    kfree(attr);
81
+    kfree(attr);
79
}
82
}
80
83
81
static void sysfs_wi_release(struct kobject *wi_kobj)
84
static void sysfs_wi_release(struct kobject *wi_kobj)
...
...
85
{
88
{
86
-    struct iw_node_attr *node_attr;
89
-    struct iw_node_attr *node_attr;
87
+    int ret = 0;
90
+    int ret = 0;
88
    char *name;
91
    char *name;
89
+    struct iw_node_attr *new_attr = NULL;
92
+    struct iw_node_attr *new_attr = NULL;
90
+
93
94
-    node_attr = kzalloc(sizeof(*node_attr), GFP_KERNEL);
95
-    if (!node_attr)
91
+    if (nid < 0 || nid >= nr_node_ids) {
96
+    if (nid < 0 || nid >= nr_node_ids) {
92
+        pr_err("Invalid node id: %d\n", nid);
97
+        pr_err("Invalid node id: %d\n", nid);
93
+        return -EINVAL;
98
+        return -EINVAL;
94
+    }
99
+    }
95
100
+
96
-    node_attr = kzalloc(sizeof(*node_attr), GFP_KERNEL);
97
-    if (!node_attr)
98
+    new_attr = kzalloc(sizeof(struct iw_node_attr), GFP_KERNEL);
101
+    new_attr = kzalloc(sizeof(struct iw_node_attr), GFP_KERNEL);
99
+    if (!new_attr)
102
+    if (!new_attr)
100
        return -ENOMEM;
103
        return -ENOMEM;
101
104
102
    name = kasprintf(GFP_KERNEL, "node%d", nid);
105
    name = kasprintf(GFP_KERNEL, "node%d", nid);
...
...
110
-    node_attr->kobj_attr.attr.name = name;
113
-    node_attr->kobj_attr.attr.name = name;
111
-    node_attr->kobj_attr.attr.mode = 0644;
114
-    node_attr->kobj_attr.attr.mode = 0644;
112
-    node_attr->kobj_attr.show = node_show;
115
-    node_attr->kobj_attr.show = node_show;
113
-    node_attr->kobj_attr.store = node_store;
116
-    node_attr->kobj_attr.store = node_store;
114
-    node_attr->nid = nid;
117
-    node_attr->nid = nid;
115
+    mutex_lock(&sgrp->kobj_lock);
118
+    mutex_lock(&wi_group->kobj_lock);
116
+    if (sgrp->nattrs[nid]) {
119
+    if (wi_group->nattrs[nid]) {
117
+        mutex_unlock(&sgrp->kobj_lock);
120
+        mutex_unlock(&wi_group->kobj_lock);
118
+        pr_info("Node [%d] already exists\n", nid);
121
+        pr_info("Node [%d] already exists\n", nid);
119
+        kfree(new_attr);
122
+        kfree(new_attr);
120
+        kfree(name);
123
+        kfree(name);
121
+        return 0;
124
+        return 0;
122
+    }
125
+    }
123
126
124
-    if (sysfs_create_file(&sgrp->wi_kobj, &node_attr->kobj_attr.attr)) {
127
-    if (sysfs_create_file(&wi_group->wi_kobj, &node_attr->kobj_attr.attr)) {
125
-        kfree(node_attr->kobj_attr.attr.name);
128
-        kfree(node_attr->kobj_attr.attr.name);
126
-        kfree(node_attr);
129
-        kfree(node_attr);
127
-        pr_err("failed to add attribute to weighted_interleave\n");
130
-        pr_err("failed to add attribute to weighted_interleave\n");
128
-        return -ENOMEM;
131
-        return -ENOMEM;
129
+    sgrp->nattrs[nid] = new_attr;
132
+    wi_group->nattrs[nid] = new_attr;
130
+    mutex_unlock(&sgrp->kobj_lock);
133
+    mutex_unlock(&wi_group->kobj_lock);
131
+
134
+
132
+    sysfs_attr_init(&sgrp->nattrs[nid]->kobj_attr.attr);
135
+    sysfs_attr_init(&wi_group->nattrs[nid]->kobj_attr.attr);
133
+    sgrp->nattrs[nid]->kobj_attr.attr.name = name;
136
+    wi_group->nattrs[nid]->kobj_attr.attr.name = name;
134
+    sgrp->nattrs[nid]->kobj_attr.attr.mode = 0644;
137
+    wi_group->nattrs[nid]->kobj_attr.attr.mode = 0644;
135
+    sgrp->nattrs[nid]->kobj_attr.show = node_show;
138
+    wi_group->nattrs[nid]->kobj_attr.show = node_show;
136
+    sgrp->nattrs[nid]->kobj_attr.store = node_store;
139
+    wi_group->nattrs[nid]->kobj_attr.store = node_store;
137
+    sgrp->nattrs[nid]->nid = nid;
140
+    wi_group->nattrs[nid]->nid = nid;
138
+
141
+
139
+    ret = sysfs_create_file(&sgrp->wi_kobj, &sgrp->nattrs[nid]->kobj_attr.attr);
142
+    ret = sysfs_create_file(&wi_group->wi_kobj,
143
+                &wi_group->nattrs[nid]->kobj_attr.attr);
140
+    if (ret) {
144
+    if (ret) {
141
+        kfree(sgrp->nattrs[nid]->kobj_attr.attr.name);
145
+        kfree(wi_group->nattrs[nid]->kobj_attr.attr.name);
142
+        kfree(sgrp->nattrs[nid]);
146
+        kfree(wi_group->nattrs[nid]);
143
+        sgrp->nattrs[nid] = NULL;
147
+        wi_group->nattrs[nid] = NULL;
144
+        pr_err("Failed to add attribute to weighted_interleave: %d\n", ret);
148
+        pr_err("Failed to add attribute to weighted_interleave: %d\n", ret);
145
    }
149
    }
146
150
147
-    sgrp->nattrs[nid] = node_attr;
151
-    wi_group->nattrs[nid] = node_attr;
148
-    return 0;
152
-    return 0;
149
+    return ret;
153
+    return ret;
150
+}
154
+}
151
+
155
+
152
+static int wi_node_notifier(struct notifier_block *nb,
156
+static int wi_node_notifier(struct notifier_block *nb,
...
...
159
+    if (nid < 0)
163
+    if (nid < 0)
160
+        goto notifier_end;
164
+        goto notifier_end;
161
+
165
+
162
+    switch(action) {
166
+    switch(action) {
163
+    case MEM_ONLINE:
167
+    case MEM_ONLINE:
164
+        err = sysfs_wi_node_add(nid);
168
+        if (node_state(nid, N_MEMORY)) {
165
+        if (err) {
169
+            err = sysfs_wi_node_add(nid);
166
+            pr_err("failed to add sysfs [node%d]\n", nid);
170
+            if (err) {
167
+            return NOTIFY_BAD;
171
+                pr_err("failed to add sysfs [node%d]\n", nid);
172
+                return NOTIFY_BAD;
173
+            }
168
+        }
174
+        }
169
+        break;
175
+        break;
170
+    case MEM_OFFLINE:
176
+    case MEM_OFFLINE:
171
+        sysfs_wi_node_release(nid);
177
+        if (!node_state(nid, N_MEMORY))
178
+            sysfs_wi_node_release(nid);
172
+        break;
179
+        break;
173
+    }
180
+    }
174
+
181
+
175
+notifier_end:
182
+notifier_end:
176
+    return NOTIFY_OK;
183
+    return NOTIFY_OK;
177
}
184
}
178
185
179
static int add_weighted_interleave_group(struct kobject *mempolicy_kobj)
186
static int add_weighted_interleave_group(struct kobject *mempolicy_kobj)
180
@@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *mempolicy_kobj)
187
@@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *mempolicy_kobj)
181
         GFP_KERNEL);
188
         GFP_KERNEL);
182
    if (!sgrp)
189
    if (!wi_group)
183
        return -ENOMEM;
190
        return -ENOMEM;
184
+    mutex_init(&sgrp->kobj_lock);
191
+    mutex_init(&wi_group->kobj_lock);
185
192
186
    err = kobject_init_and_add(&sgrp->wi_kobj, &wi_ktype, mempolicy_kobj,
193
    err = kobject_init_and_add(&wi_group->wi_kobj, &wi_ktype, mempolicy_kobj,
187
                 "weighted_interleave");
194
                 "weighted_interleave");
188
    if (err)
195
    if (err)
189
        goto err_out;
196
        goto err_out;
190
197
191
-    for_each_node_state(nid, N_POSSIBLE) {
198
-    for_each_node_state(nid, N_POSSIBLE) {
...
...
diff view generated by jsdifflib