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