...
...
38
preventing stale or redundant entries from persisting.
38
preventing stale or redundant entries from persisting.
39
39
40
These patches have been tested under CXL-based memory configurations,
40
These patches have been tested under CXL-based memory configurations,
41
including hotplug scenarios, to ensure proper behavior and stability.
41
including hotplug scenarios, to ensure proper behavior and stability.
42
42
43
mm/mempolicy.c | 195 ++++++++++++++++++++++++++++++++-----------------
43
mm/mempolicy.c | 192 +++++++++++++++++++++++++++++++------------------
44
1 file changed, 127 insertions(+), 68 deletions(-)
44
1 file changed, 124 insertions(+), 68 deletions(-)
45
45
46
46
47
base-commit: 38fec10eb60d687e30c8c6b5420d86e8149f7557
47
base-commit: 38fec10eb60d687e30c8c6b5420d86e8149f7557
48
--
48
--
49
2.34.1
49
2.34.1
diff view generated by jsdifflib
1
Memory leaks occurred when removing sysfs attributes for weighted
1
Memory leaks occurred when removing sysfs attributes for weighted
2
interleave. Improper kobject deallocation led to unreleased memory
2
interleave. Improper kobject deallocation led to unreleased memory
3
when initialization failed or when nodes were removed.
3
when initialization failed or when nodes were removed.
4
4
5
This patch resolves the issue by replacing unnecessary `kfree()`
5
This patch resolves the issue by replacing unnecessary `kfree()`
6
calls with `kobject_put()`, ensuring proper cleanup and preventing
6
calls with `kobject_put()`, ensuring proper cleanup and preventing
7
memory leaks.
7
memory leaks.
8
8
9
By correctly using `kobject_put()`, the release function now
9
By correctly using `kobject_put()`, the release function now
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>
15
Signed-off-by: Honggyu Kim <honggyu.kim@sk.com>
16
Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com>
16
Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com>
17
Reviewed-by: Gregory Price <gourry@gourry.net>
17
Reviewed-by: Gregory Price <gourry@gourry.net>
18
---
18
---
19
mm/mempolicy.c | 61 +++++++++++++++++++++++++-------------------------
19
mm/mempolicy.c | 61 +++++++++++++++++++++++++-------------------------
20
1 file changed, 31 insertions(+), 30 deletions(-)
20
1 file changed, 31 insertions(+), 30 deletions(-)
21
21
22
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
22
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
23
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
24
--- a/mm/mempolicy.c
24
--- a/mm/mempolicy.c
25
+++ b/mm/mempolicy.c
25
+++ b/mm/mempolicy.c
26
@@ -XXX,XX +XXX,XX @@ static void sysfs_wi_release(struct kobject *wi_kobj)
26
@@ -XXX,XX +XXX,XX @@ static void sysfs_wi_release(struct kobject *wi_kobj)
27
27
28
    for (i = 0; i < nr_node_ids; i++)
28
    for (i = 0; i < nr_node_ids; i++)
29
        sysfs_wi_node_release(node_attrs[i], wi_kobj);
29
        sysfs_wi_node_release(node_attrs[i], wi_kobj);
30
-    kobject_put(wi_kobj);
30
-    kobject_put(wi_kobj);
31
+
31
+
32
+    kfree(node_attrs);
32
+    kfree(node_attrs);
33
+    kfree(wi_kobj);
33
+    kfree(wi_kobj);
34
}
34
}
35
35
36
static const struct kobj_type wi_ktype = {
36
static const struct kobj_type wi_ktype = {
37
@@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *root_kobj)
37
@@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *root_kobj)
38
    struct kobject *wi_kobj;
38
    struct kobject *wi_kobj;
39
    int nid, err;
39
    int nid, err;
40
40
41
-    wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL);
41
-    wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL);
42
-    if (!wi_kobj)
42
-    if (!wi_kobj)
43
+    node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *),
43
+    node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *),
44
+             GFP_KERNEL);
44
+             GFP_KERNEL);
45
+    if (!node_attrs)
45
+    if (!node_attrs)
46
        return -ENOMEM;
46
        return -ENOMEM;
47
47
48
+    wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL);
48
+    wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL);
49
+    if (!wi_kobj) {
49
+    if (!wi_kobj) {
50
+        err = -ENOMEM;
50
+        err = -ENOMEM;
51
+        goto node_out;
51
+        goto node_out;
52
+    }
52
+    }
53
+
53
+
54
    err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj,
54
    err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj,
55
                 "weighted_interleave");
55
                 "weighted_interleave");
56
    if (err) {
56
    if (err) {
57
-        kfree(wi_kobj);
57
-        kfree(wi_kobj);
58
-        return err;
58
-        return err;
59
+        kobject_put(wi_kobj);
59
+        kobject_put(wi_kobj);
60
+        goto err_out;
60
+        goto err_out;
61
    }
61
    }
62
62
63
    for_each_node_state(nid, N_POSSIBLE) {
63
    for_each_node_state(nid, N_POSSIBLE) {
64
@@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *root_kobj)
64
@@ -XXX,XX +XXX,XX @@ static int add_weighted_interleave_group(struct kobject *root_kobj)
65
            break;
65
            break;
66
        }
66
        }
67
    }
67
    }
68
-    if (err)
68
-    if (err)
69
+    if (err) {
69
+    if (err) {
70
        kobject_put(wi_kobj);
70
        kobject_put(wi_kobj);
71
+        goto err_out;
71
+        goto err_out;
72
+    }
72
+    }
73
+
73
+
74
    return 0;
74
    return 0;
75
+
75
+
76
+node_out:
76
+node_out:
77
+    kfree(node_attrs);
77
+    kfree(node_attrs);
78
+err_out:
78
+err_out:
79
+    return err;
79
+    return err;
80
}
80
}
81
81
82
static void mempolicy_kobj_release(struct kobject *kobj)
82
static void mempolicy_kobj_release(struct kobject *kobj)
83
@@ -XXX,XX +XXX,XX @@ static void mempolicy_kobj_release(struct kobject *kobj)
83
@@ -XXX,XX +XXX,XX @@ static void mempolicy_kobj_release(struct kobject *kobj)
84
    mutex_unlock(&iw_table_lock);
84
    mutex_unlock(&iw_table_lock);
85
    synchronize_rcu();
85
    synchronize_rcu();
86
    kfree(old);
86
    kfree(old);
87
-    kfree(node_attrs);
87
-    kfree(node_attrs);
88
    kfree(kobj);
88
    kfree(kobj);
89
}
89
}
90
90
91
@@ -XXX,XX +XXX,XX @@ static int __init mempolicy_sysfs_init(void)
91
@@ -XXX,XX +XXX,XX @@ static int __init mempolicy_sysfs_init(void)
92
    static struct kobject *mempolicy_kobj;
92
    static struct kobject *mempolicy_kobj;
93
93
94
    mempolicy_kobj = kzalloc(sizeof(*mempolicy_kobj), GFP_KERNEL);
94
    mempolicy_kobj = kzalloc(sizeof(*mempolicy_kobj), GFP_KERNEL);
95
-    if (!mempolicy_kobj) {
95
-    if (!mempolicy_kobj) {
96
-        err = -ENOMEM;
96
-        err = -ENOMEM;
97
-        goto err_out;
97
-        goto err_out;
98
-    }
98
-    }
99
-
99
-
100
-    node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *),
100
-    node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *),
101
-             GFP_KERNEL);
101
-             GFP_KERNEL);
102
-    if (!node_attrs) {
102
-    if (!node_attrs) {
103
-        err = -ENOMEM;
103
-        err = -ENOMEM;
104
-        goto mempol_out;
104
-        goto mempol_out;
105
-    }
105
-    }
106
+    if (!mempolicy_kobj)
106
+    if (!mempolicy_kobj)
107
+        return -ENOMEM;
107
+        return -ENOMEM;
108
108
109
    err = kobject_init_and_add(mempolicy_kobj, &mempolicy_ktype, mm_kobj,
109
    err = kobject_init_and_add(mempolicy_kobj, &mempolicy_ktype, mm_kobj,
110
                 "mempolicy");
110
                 "mempolicy");
111
    if (err)
111
    if (err)
112
-        goto node_out;
112
-        goto node_out;
113
+        goto err_out;
113
+        goto err_out;
114
114
115
    err = add_weighted_interleave_group(mempolicy_kobj);
115
    err = add_weighted_interleave_group(mempolicy_kobj);
116
-    if (err) {
116
-    if (err) {
117
-        pr_err("mempolicy sysfs structure failed to initialize\n");
117
-        pr_err("mempolicy sysfs structure failed to initialize\n");
118
-        kobject_put(mempolicy_kobj);
118
-        kobject_put(mempolicy_kobj);
119
-        return err;
119
-        return err;
120
-    }
120
-    }
121
+    if (err)
121
+    if (err)
122
+        goto err_out;
122
+        goto err_out;
123
+
123
+
124
+    return 0;
124
+    return 0;
125
125
126
-    return err;
126
-    return err;
127
-node_out:
127
-node_out:
128
-    kfree(node_attrs);
128
-    kfree(node_attrs);
129
-mempol_out:
129
-mempol_out:
130
-    kfree(mempolicy_kobj);
130
-    kfree(mempolicy_kobj);
131
err_out:
131
err_out:
132
-    pr_err("failed to add mempolicy kobject to the system\n");
132
-    pr_err("failed to add mempolicy kobject to the system\n");
133
+    kobject_put(mempolicy_kobj);
133
+    kobject_put(mempolicy_kobj);
134
    return err;
134
    return err;
135
}
135
}
136
136
137
--
137
--
138
2.34.1
138
2.34.1
diff view generated by jsdifflib
1
Previously, the weighted interleave sysfs structure was statically
1
Previously, the weighted interleave sysfs structure was statically
2
managed, preventing dynamic updates when nodes were added or removed.
2
managed, preventing dynamic updates when nodes were added or removed.
3
3
4
This patch restructures the weighted interleave sysfs to support
4
This patch restructures the weighted interleave sysfs to support
5
dynamic insertion and deletion. The sysfs that was part of
5
dynamic insertion and deletion. The sysfs that was part of
6
the 'weighted_interleave_group' is now globally accessible,
6
the 'weighted_interleave_group' is now globally accessible,
7
allowing external access to that sysfs.
7
allowing external access to that sysfs.
8
8
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>
14
Signed-off-by: Honggyu Kim <honggyu.kim@sk.com>
15
Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com>
15
Signed-off-by: Yunjeong Mun <yunjeong.mun@sk.com>
16
Reviewed-by: Gregory Price <gourry@gourry.net>
16
Reviewed-by: Gregory Price <gourry@gourry.net>
17
---
17
---
18
mm/mempolicy.c | 71 ++++++++++++++++++++++----------------------------
18
mm/mempolicy.c | 71 ++++++++++++++++++++++----------------------------
19
1 file changed, 31 insertions(+), 40 deletions(-)
19
1 file changed, 31 insertions(+), 40 deletions(-)
20
20
21
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
21
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
22
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
23
--- a/mm/mempolicy.c
23
--- a/mm/mempolicy.c
24
+++ b/mm/mempolicy.c
24
+++ b/mm/mempolicy.c
25
@@ -XXX,XX +XXX,XX @@ struct iw_node_attr {
25
@@ -XXX,XX +XXX,XX @@ struct iw_node_attr {
26
    int nid;
26
    int nid;
27
};
27
};
28
28
29
+struct sysfs_wi_group {
29
+struct sysfs_wi_group {
30
+    struct kobject wi_kobj;
30
+    struct kobject wi_kobj;
31
+    struct iw_node_attr *nattrs[];
31
+    struct iw_node_attr *nattrs[];
32
+};
32
+};
33
+
33
+
34
+static struct sysfs_wi_group *wi_group;
34
+static struct sysfs_wi_group *wi_group;
35
+
35
+
36
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,
37
             char *buf)
37
             char *buf)
38
{
38
{
39
@@ -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,
40
    return count;
40
    return count;
41
}
41
}
42
42
43
-static struct iw_node_attr **node_attrs;
43
-static struct iw_node_attr **node_attrs;
44
-
44
-
45
-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,
46
-                 struct kobject *parent)
46
-                 struct kobject *parent)
47
+static void sysfs_wi_node_release(int nid)
47
+static void sysfs_wi_node_release(int nid)
48
{
48
{
49
-    if (!node_attr)
49
-    if (!node_attr)
50
+    if (!wi_group->nattrs[nid])
50
+    if (!wi_group->nattrs[nid])
51
        return;
51
        return;
52
-    sysfs_remove_file(parent, &node_attr->kobj_attr.attr);
52
-    sysfs_remove_file(parent, &node_attr->kobj_attr.attr);
53
-    kfree(node_attr->kobj_attr.attr.name);
53
-    kfree(node_attr->kobj_attr.attr.name);
54
-    kfree(node_attr);
54
-    kfree(node_attr);
55
+
55
+
56
+    sysfs_remove_file(&wi_group->wi_kobj,
56
+    sysfs_remove_file(&wi_group->wi_kobj,
57
+             &wi_group->nattrs[nid]->kobj_attr.attr);
57
+             &wi_group->nattrs[nid]->kobj_attr.attr);
58
+    kfree(wi_group->nattrs[nid]->kobj_attr.attr.name);
58
+    kfree(wi_group->nattrs[nid]->kobj_attr.attr.name);
59
+    kfree(wi_group->nattrs[nid]);
59
+    kfree(wi_group->nattrs[nid]);
60
}
60
}
61
61
62
static void sysfs_wi_release(struct kobject *wi_kobj)
62
static void sysfs_wi_release(struct kobject *wi_kobj)
63
{
63
{
64
-    int i;
64
-    int i;
65
-
65
-
66
-    for (i = 0; i < nr_node_ids; i++)
66
-    for (i = 0; i < nr_node_ids; i++)
67
-        sysfs_wi_node_release(node_attrs[i], wi_kobj);
67
-        sysfs_wi_node_release(node_attrs[i], wi_kobj);
68
+    int nid;
68
+    int nid;
69
69
70
-    kfree(node_attrs);
70
-    kfree(node_attrs);
71
-    kfree(wi_kobj);
71
-    kfree(wi_kobj);
72
+    for (nid = 0; nid < nr_node_ids; nid++)
72
+    for (nid = 0; nid < nr_node_ids; nid++)
73
+        sysfs_wi_node_release(nid);
73
+        sysfs_wi_node_release(nid);
74
+    kfree(wi_group);
74
+    kfree(wi_group);
75
}
75
}
76
76
77
static const struct kobj_type wi_ktype = {
77
static const struct kobj_type wi_ktype = {
78
@@ -XXX,XX +XXX,XX @@ static const struct kobj_type wi_ktype = {
78
@@ -XXX,XX +XXX,XX @@ static const struct kobj_type wi_ktype = {
79
    .release = sysfs_wi_release,
79
    .release = sysfs_wi_release,
80
};
80
};
81
81
82
-static int add_weight_node(int nid, struct kobject *wi_kobj)
82
-static int add_weight_node(int nid, struct kobject *wi_kobj)
83
+static int sysfs_wi_node_add(int nid)
83
+static int sysfs_wi_node_add(int nid)
84
{
84
{
85
    struct iw_node_attr *node_attr;
85
    struct iw_node_attr *node_attr;
86
    char *name;
86
    char *name;
87
@@ -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)
88
    node_attr->kobj_attr.store = node_store;
88
    node_attr->kobj_attr.store = node_store;
89
    node_attr->nid = nid;
89
    node_attr->nid = nid;
90
90
91
-    if (sysfs_create_file(wi_kobj, &node_attr->kobj_attr.attr)) {
91
-    if (sysfs_create_file(wi_kobj, &node_attr->kobj_attr.attr)) {
92
+    if (sysfs_create_file(&wi_group->wi_kobj, &node_attr->kobj_attr.attr)) {
92
+    if (sysfs_create_file(&wi_group->wi_kobj, &node_attr->kobj_attr.attr)) {
93
        kfree(node_attr->kobj_attr.attr.name);
93
        kfree(node_attr->kobj_attr.attr.name);
94
        kfree(node_attr);
94
        kfree(node_attr);
95
        pr_err("failed to add attribute to weighted_interleave\n");
95
        pr_err("failed to add attribute to weighted_interleave\n");
96
        return -ENOMEM;
96
        return -ENOMEM;
97
    }
97
    }
98
98
99
-    node_attrs[nid] = node_attr;
99
-    node_attrs[nid] = node_attr;
100
+    wi_group->nattrs[nid] = node_attr;
100
+    wi_group->nattrs[nid] = node_attr;
101
    return 0;
101
    return 0;
102
}
102
}
103
103
104
-static int add_weighted_interleave_group(struct kobject *root_kobj)
104
-static int add_weighted_interleave_group(struct kobject *root_kobj)
105
+static int add_weighted_interleave_group(struct kobject *mempolicy_kobj)
105
+static int add_weighted_interleave_group(struct kobject *mempolicy_kobj)
106
{
106
{
107
-    struct kobject *wi_kobj;
107
-    struct kobject *wi_kobj;
108
    int nid, err;
108
    int nid, err;
109
109
110
-    node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *),
110
-    node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *),
111
-             GFP_KERNEL);
111
-             GFP_KERNEL);
112
-    if (!node_attrs)
112
-    if (!node_attrs)
113
+    wi_group = kzalloc(sizeof(struct sysfs_wi_group) +         \
113
+    wi_group = kzalloc(sizeof(struct sysfs_wi_group) +         \
114
+         nr_node_ids * sizeof(struct iw_node_attr *),    \
114
+         nr_node_ids * sizeof(struct iw_node_attr *),    \
115
+         GFP_KERNEL);
115
+         GFP_KERNEL);
116
+    if (!wi_group)
116
+    if (!wi_group)
117
        return -ENOMEM;
117
        return -ENOMEM;
118
118
119
-    wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL);
119
-    wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL);
120
-    if (!wi_kobj) {
120
-    if (!wi_kobj) {
121
-        err = -ENOMEM;
121
-        err = -ENOMEM;
122
-        goto node_out;
122
-        goto node_out;
123
-    }
123
-    }
124
-
124
-
125
-    err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj,
125
-    err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj,
126
+    err = kobject_init_and_add(&wi_group->wi_kobj, &wi_ktype, mempolicy_kobj,
126
+    err = kobject_init_and_add(&wi_group->wi_kobj, &wi_ktype, mempolicy_kobj,
127
                 "weighted_interleave");
127
                 "weighted_interleave");
128
-    if (err) {
128
-    if (err) {
129
-        kobject_put(wi_kobj);
129
-        kobject_put(wi_kobj);
130
+    if (err)
130
+    if (err)
131
        goto err_out;
131
        goto err_out;
132
-    }
132
-    }
133
133
134
    for_each_node_state(nid, N_POSSIBLE) {
134
    for_each_node_state(nid, N_POSSIBLE) {
135
-        err = add_weight_node(nid, wi_kobj);
135
-        err = add_weight_node(nid, wi_kobj);
136
+        err = sysfs_wi_node_add(nid);
136
+        err = sysfs_wi_node_add(nid);
137
        if (err) {
137
        if (err) {
138
            pr_err("failed to add sysfs [node%d]\n", nid);
138
            pr_err("failed to add sysfs [node%d]\n", nid);
139
-            break;
139
-            break;
140
+            goto err_out;
140
+            goto err_out;
141
        }
141
        }
142
    }
142
    }
143
-    if (err) {
143
-    if (err) {
144
-        kobject_put(wi_kobj);
144
-        kobject_put(wi_kobj);
145
-        goto err_out;
145
-        goto err_out;
146
-    }
146
-    }
147
147
148
    return 0;
148
    return 0;
149
149
150
-node_out:
150
-node_out:
151
-    kfree(node_attrs);
151
-    kfree(node_attrs);
152
err_out:
152
err_out:
153
+    kobject_put(&wi_group->wi_kobj);
153
+    kobject_put(&wi_group->wi_kobj);
154
    return err;
154
    return err;
155
}
155
}
156
156
157
--
157
--
158
2.34.1
158
2.34.1
diff view generated by jsdifflib
...
...
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
---
31
---
32
mm/mempolicy.c | 113 +++++++++++++++++++++++++++++++++++++++----------
32
mm/mempolicy.c | 110 ++++++++++++++++++++++++++++++++++++++-----------
33
1 file changed, 90 insertions(+), 23 deletions(-)
33
1 file changed, 87 insertions(+), 23 deletions(-)
34
34
35
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
35
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
36
index XXXXXXX..XXXXXXX 100644
36
index XXXXXXX..XXXXXXX 100644
37
--- a/mm/mempolicy.c
37
--- a/mm/mempolicy.c
38
+++ b/mm/mempolicy.c
38
+++ b/mm/mempolicy.c
...
...
66
+    attr = wi_group->nattrs[nid];
66
+    attr = wi_group->nattrs[nid];
67
+    if (!attr) {
67
+    if (!attr) {
68
+        mutex_unlock(&wi_group->kobj_lock);
68
+        mutex_unlock(&wi_group->kobj_lock);
69
        return;
69
        return;
70
+    }
70
+    }
71
+
72
+    wi_group->nattrs[nid] = NULL;
73
+    mutex_unlock(&wi_group->kobj_lock);
71
74
72
-    sysfs_remove_file(&wi_group->wi_kobj,
75
-    sysfs_remove_file(&wi_group->wi_kobj,
73
-             &wi_group->nattrs[nid]->kobj_attr.attr);
76
-             &wi_group->nattrs[nid]->kobj_attr.attr);
74
-    kfree(wi_group->nattrs[nid]->kobj_attr.attr.name);
77
-    kfree(wi_group->nattrs[nid]->kobj_attr.attr.name);
75
-    kfree(wi_group->nattrs[nid]);
78
-    kfree(wi_group->nattrs[nid]);
76
+    wi_group->nattrs[nid] = NULL;
77
+    mutex_unlock(&wi_group->kobj_lock);
78
+
79
+    sysfs_remove_file(&wi_group->wi_kobj, &attr->kobj_attr.attr);
79
+    sysfs_remove_file(&wi_group->wi_kobj, &attr->kobj_attr.attr);
80
+    kfree(attr->kobj_attr.attr.name);
80
+    kfree(attr->kobj_attr.attr.name);
81
+    kfree(attr);
81
+    kfree(attr);
82
}
82
}
83
83
...
...
121
+        pr_info("Node [%d] already exists\n", nid);
121
+        pr_info("Node [%d] already exists\n", nid);
122
+        kfree(new_attr);
122
+        kfree(new_attr);
123
+        kfree(name);
123
+        kfree(name);
124
+        return 0;
124
+        return 0;
125
+    }
125
+    }
126
+    wi_group->nattrs[nid] = new_attr;
126
127
127
-    if (sysfs_create_file(&wi_group->wi_kobj, &node_attr->kobj_attr.attr)) {
128
-    if (sysfs_create_file(&wi_group->wi_kobj, &node_attr->kobj_attr.attr)) {
128
-        kfree(node_attr->kobj_attr.attr.name);
129
-        kfree(node_attr->kobj_attr.attr.name);
129
-        kfree(node_attr);
130
-        kfree(node_attr);
130
-        pr_err("failed to add attribute to weighted_interleave\n");
131
-        pr_err("failed to add attribute to weighted_interleave\n");
131
-        return -ENOMEM;
132
-        return -ENOMEM;
132
+    wi_group->nattrs[nid] = new_attr;
133
+    mutex_unlock(&wi_group->kobj_lock);
134
+
135
+    sysfs_attr_init(&wi_group->nattrs[nid]->kobj_attr.attr);
133
+    sysfs_attr_init(&wi_group->nattrs[nid]->kobj_attr.attr);
136
+    wi_group->nattrs[nid]->kobj_attr.attr.name = name;
134
+    wi_group->nattrs[nid]->kobj_attr.attr.name = name;
137
+    wi_group->nattrs[nid]->kobj_attr.attr.mode = 0644;
135
+    wi_group->nattrs[nid]->kobj_attr.attr.mode = 0644;
138
+    wi_group->nattrs[nid]->kobj_attr.show = node_show;
136
+    wi_group->nattrs[nid]->kobj_attr.show = node_show;
139
+    wi_group->nattrs[nid]->kobj_attr.store = node_store;
137
+    wi_group->nattrs[nid]->kobj_attr.store = node_store;
...
...
145
+        kfree(wi_group->nattrs[nid]->kobj_attr.attr.name);
143
+        kfree(wi_group->nattrs[nid]->kobj_attr.attr.name);
146
+        kfree(wi_group->nattrs[nid]);
144
+        kfree(wi_group->nattrs[nid]);
147
+        wi_group->nattrs[nid] = NULL;
145
+        wi_group->nattrs[nid] = NULL;
148
+        pr_err("Failed to add attribute to weighted_interleave: %d\n", ret);
146
+        pr_err("Failed to add attribute to weighted_interleave: %d\n", ret);
149
    }
147
    }
148
+    mutex_unlock(&wi_group->kobj_lock);
150
149
151
-    wi_group->nattrs[nid] = node_attr;
150
-    wi_group->nattrs[nid] = node_attr;
152
-    return 0;
151
-    return 0;
153
+    return ret;
152
+    return ret;
154
+}
153
+}
...
...
163
+    if (nid < 0)
162
+    if (nid < 0)
164
+        goto notifier_end;
163
+        goto notifier_end;
165
+
164
+
166
+    switch(action) {
165
+    switch(action) {
167
+    case MEM_ONLINE:
166
+    case MEM_ONLINE:
168
+        if (node_state(nid, N_MEMORY)) {
167
+        err = sysfs_wi_node_add(nid);
169
+            err = sysfs_wi_node_add(nid);
168
+        if (err) {
170
+            if (err) {
169
+            pr_err("failed to add sysfs [node%d]\n", nid);
171
+                pr_err("failed to add sysfs [node%d]\n", nid);
170
+            return NOTIFY_BAD;
172
+                return NOTIFY_BAD;
173
+            }
174
+        }
171
+        }
175
+        break;
172
+        break;
176
+    case MEM_OFFLINE:
173
+    case MEM_OFFLINE:
177
+        if (!node_state(nid, N_MEMORY))
174
+        if (!node_state(nid, N_MEMORY))
178
+            sysfs_wi_node_release(nid);
175
+            sysfs_wi_node_release(nid);
...
...
diff view generated by jsdifflib