Gregory Price <gregory.price@xxxxxxxxxxxx> writes: > 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. 3) Add another parameter to get_mempolicy2(), such as "unsigned long *value" to retrieve addr_node or policy_node. We can extend it to be a "struct *" in the future if necessary. > 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. -- Best Regards, Huang, Ying