diff options
-rw-r--r-- | mm/mempolicy.c | 64 |
1 files changed, 31 insertions, 33 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index b8c7cce61103..c99bae7d8219 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -3427,6 +3427,13 @@ struct iw_node_attr { int nid; }; +struct sysfs_wi_group { + struct kobject wi_kobj; + struct iw_node_attr *nattrs[]; +}; + +static struct sysfs_wi_group *wi_group; + static ssize_t node_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { @@ -3469,24 +3476,23 @@ static ssize_t node_store(struct kobject *kobj, struct kobj_attribute *attr, return count; } -static struct iw_node_attr **node_attrs; - -static void sysfs_wi_node_delete(struct iw_node_attr *node_attr, - struct kobject *parent) +static void sysfs_wi_node_delete(int nid) { - if (!node_attr) + if (!wi_group->nattrs[nid]) return; - sysfs_remove_file(parent, &node_attr->kobj_attr.attr); - kfree(node_attr->kobj_attr.attr.name); - kfree(node_attr); + + sysfs_remove_file(&wi_group->wi_kobj, + &wi_group->nattrs[nid]->kobj_attr.attr); + kfree(wi_group->nattrs[nid]->kobj_attr.attr.name); + kfree(wi_group->nattrs[nid]); } -static void sysfs_wi_node_delete_all(struct kobject *wi_kobj) +static void sysfs_wi_node_delete_all(void) { int nid; for (nid = 0; nid < nr_node_ids; nid++) - sysfs_wi_node_delete(node_attrs[nid], wi_kobj); + sysfs_wi_node_delete(nid); } static void iw_table_free(void) @@ -3503,15 +3509,14 @@ static void iw_table_free(void) kfree(old); } -static void wi_cleanup(struct kobject *wi_kobj) { - sysfs_wi_node_delete_all(wi_kobj); +static void wi_cleanup(void) { + sysfs_wi_node_delete_all(); iw_table_free(); - kfree(node_attrs); } static void wi_kobj_release(struct kobject *wi_kobj) { - kfree(wi_kobj); + kfree(wi_group); } static const struct kobj_type wi_ktype = { @@ -3519,7 +3524,7 @@ static const struct kobj_type wi_ktype = { .release = wi_kobj_release, }; -static int add_weight_node(int nid, struct kobject *wi_kobj) +static int sysfs_wi_node_add(int nid) { struct iw_node_attr *node_attr; char *name; @@ -3541,40 +3546,33 @@ static int add_weight_node(int nid, struct kobject *wi_kobj) node_attr->kobj_attr.store = node_store; node_attr->nid = nid; - if (sysfs_create_file(wi_kobj, &node_attr->kobj_attr.attr)) { + if (sysfs_create_file(&wi_group->wi_kobj, &node_attr->kobj_attr.attr)) { kfree(node_attr->kobj_attr.attr.name); kfree(node_attr); pr_err("failed to add attribute to weighted_interleave\n"); return -ENOMEM; } - node_attrs[nid] = node_attr; + wi_group->nattrs[nid] = node_attr; return 0; } -static int add_weighted_interleave_group(struct kobject *root_kobj) +static int __init add_weighted_interleave_group(struct kobject *mempolicy_kobj) { - struct kobject *wi_kobj; int nid, err; - node_attrs = kcalloc(nr_node_ids, sizeof(struct iw_node_attr *), - GFP_KERNEL); - if (!node_attrs) - return -ENOMEM; - - wi_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL); - if (!wi_kobj) { - kfree(node_attrs); + wi_group = kzalloc(struct_size(wi_group, nattrs, nr_node_ids), + GFP_KERNEL); + if (!wi_group) return -ENOMEM; - } - err = kobject_init_and_add(wi_kobj, &wi_ktype, root_kobj, + err = kobject_init_and_add(&wi_group->wi_kobj, &wi_ktype, mempolicy_kobj, "weighted_interleave"); if (err) goto err_put_kobj; for_each_node_state(nid, N_POSSIBLE) { - err = add_weight_node(nid, wi_kobj); + err = sysfs_wi_node_add(nid); if (err) { pr_err("failed to add sysfs [node%d]\n", nid); goto err_cleanup_kobj; @@ -3584,10 +3582,10 @@ static int add_weighted_interleave_group(struct kobject *root_kobj) return 0; err_cleanup_kobj: - wi_cleanup(wi_kobj); - kobject_del(wi_kobj); + wi_cleanup(); + kobject_del(&wi_group->wi_kobj); err_put_kobj: - kobject_put(wi_kobj); + kobject_put(&wi_group->wi_kobj); return err; } |