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