On Tue, Dec 12, 2023 at 03:08:24PM +0800, Huang, Ying wrote: > Gregory Price <gregory.price@xxxxxxxxxxxx> writes: > > >> For example, can we use something as below? > >> > >> long set_mempolicy2(int mode, const unsigned long *nodemask, unsigned int *il_weights, > >> unsigned long maxnode, unsigned long home_node, > >> unsigned long flags); > >> > >> long mbind2(unsigned long start, unsigned long len, > >> int mode, const unsigned long *nodemask, unsigned int *il_weights, > >> unsigned long maxnode, unsigned long home_node, > >> unsigned long flags); > >> > > > > Your definition of mbind2 is impossible. > > > > Neither of these interfaces solve the extensibility issue. If a new > > policy which requires a new format of data arrives, we can look forward > > to set_mempolicy3 and mbind3. > > IIUC, we will not over-engineering too much. It's hard to predict the > requirements in the future. > Sure, but having the mempolicy struct at least gives us more flexibility than the original interface. > >> A struct may be defined to hold mempolicy iteself. > >> > >> struct mpol { > >> int mode; > >> unsigned int home_node; > >> const unsigned long *nodemask; > >> unsigned int *il_weights; > >> unsigned int maxnode; > >> }; > >> > > > > addr could be pulled out for get_mempolicy2, so i will do that > > > > 'addr_node' and 'policy_node' are warts that came from the original > > get_mempolicy. Removing them increases the complexity of handling > > arguments in the common get_mempolicy code. > > > > I could probably just drop support for retrieving the addr_node from > > get_mempolicy2, since it's already possible with get_mempolicy. So I > > will do that. > > If it's necessary, we can add another struct for get_mempolicy2(). But > I don't think that it's necessary to add get_mempolicy2() specific > parameters for set_mempolicy2() or mbind2(). After edits, the only parameter that doesn't have parity between interfaces is `addr_node` and `policy_node`. This was an unfortunate wart on the original get_mempolicy() that multiplexed the output of (*mode) based on whether MPOL_F_NODE was set. Example: if (MPOL_F_ADDR | MPOL_F_NODE), then get_mempolicy() would return details about a VMA mempolicy + the node of that address in (*mode). Right now in get_mempolicy2() I fetch this unconditionally instead of requiring MPOL_F_NODE. I did not want to multiplexing (*mode) output. I see two options: 1) Get rid of MPOL_F_NODE functionality in get_mempolicy2() If a user wants that information, they can still use get_mempolicy() 2) Keep MPOL_F_NODE and mpol_args->addr_node/policy_node, but don't allow any future extensions that create this kind of situation. I'm fine with either. I originally aimed for get_mempolicy2() to be all of get_mempolicy() features + new data, but that obviously isn't required. ~Gregory