On Mon, Jan 22, 2024 at 04:03:53PM +0800, Huang, Ying wrote: > Gregory Price <gourry.memverge@xxxxxxxxx> writes: > > > + /* > > + * The default weight is 1 (for now), when the kernel-internal > > + * default weight array is implemented, this should be updated to > > + * collect the system-default weight of the node if the user passes 0. > > + */ > > + if (!weight) > > + weight = 1; > > From functionality point of view, it's OK to set "weight = 1" here now. > But when we add system default weight table in the future, we need to > use "weight = 0". Otherwise, we cannot distinguish whether the default > value have been customized via sysfs. So, I suggest to use that rule. > [... snip ...] > > + else > > + memset(new, 1, nr_node_ids); > > With similar reason as above ("From functionality..."), I suggest to set > "0" here. > blah - the comment is misleading at best. The future patch should pass 0 through to the sysfs table and the allocators updated to collect the system-default weight of the node. re: doing it this way right now - I chose to do it this way for now because it ultimately simplifies the logic in the allocators - all of which will need to be updated with the future patch set regardless of our implementation choice now. e.g. rcu_read_lock(); table = rcu_dereference(iw_table); if (!policy->wil.cur_weight) policy->wil.cur_weight = table ? table[next] : 1; ^^^ only need single conditional now rcu_read_unlock(); This logic will need to be updated to use default table values, so I chose the simpler implementation and left the change to be explicit at the time the default table is implemented. If you prefer it the other way now, I can change it, but this seemed cleaner and simpler for the time being. > > + new[node_attr->nid] = weight; > > + rcu_assign_pointer(iw_table, new); > > + mutex_unlock(&iw_table_lock); > > + synchronize_rcu(); > > + kfree(old); > > + return count; > > +} > > + > > +static struct iw_node_attr *node_attrs[MAX_NUMNODES]; > > node_attrs[] can be allocated dynamically too. Just a suggestion. > ack to this and other references to nr_node_ids, will change. > > + kfree(old); > > It appears unnecessary to free iw_table in error path. But this isn't a > big deal because error path will almost never be executed in practice. > checkpatch.pl yells at you if you do null checks before kfree :] > > + int err; > > + struct kobject *mempolicy_kobj; > > This overrides the global "mempolicy_kobj" defined before function. But > I don't think we need the global definition. > Assuming the exit path isn't needed then yeah the global isn't needed. > > +static int __init mempolicy_sysfs_init(void) > > +{ > > + /* A NULL iw_table is interpreted by interleave logic as "all 1s" */ > > + iw_table = NULL; > > + return 0; > > +} > > + > > +static void __exit mempolicy_exit(void) { } > > +#endif /* CONFIG_SYSFS */ > > +late_initcall(mempolicy_sysfs_init); > > +module_exit(mempolicy_exit); > > mempolicy.c will not be compiled as module, so we don't need > module_exit(). > ack