Message ID | 20230621091000.424843-1-j.granados@samsung.com (mailing list archive) |
---|---|
Headers | show |
Series | Remove the end element in sysctl table arrays. | expand |
On Wed, Jun 21, 2023 at 11:09:49AM +0200, Joel Granados wrote: > This is part of the effort to remove the empty element from the ctl_table > structures (used to calculate size) and replace it with the ARRAY_SIZE macro. > The "sysctl: Remove the end element in sysctl table arrays" commit is the one that > actually removes the empty element. With a "yesall" configuration the bloat-o-meter > says that 9158 bytes where saved (report at the end of the cover letter). 9k in ram or read-only memory? > Main changes: > 1. Add the ctl_table size into the ctl_table_header > 2. Remove the empty element at the end of all ctl_table arrays > > Commit Overview: > 1. There are preparation commits that make sure that we have the > ctl_table_header in all the places that we need to have the array size. > sysctl: Prefer ctl_table_header in proc_sysct > sysctl: Use the ctl header in list ctl_table macro > sysctl: Add ctl_table_size to ctl_table_header > > 2. Add size to relevant register calls. Calculate the ctl_table array size > where register_sysctl is called. Add a table_size argument to the relevant > sysctl register functions (init_header, __register_sysctl_table, > register_net_sysctl, register_sysctl and register_sysctl_init). Important to > note that these commits do NOT change the way we calculate size; they plumb > things in preparation for the empty element removal commit. Care is taken to > leave the tree in a state where it can be compiled which is the reason to > not separate the "big" commits (like "sysctl: Add size to the > register_net_sysctl function"). If you have an alternative way of dealing > with such a big commit while leaving it in a compilable state, please let me > know. > sysctl: Add size argument to init_header > sysctl: Add a size arg to __register_sysctl_table > sysctl: Add size to the register_net_sysctl function > sysctl: Add size to register_sysctl > sysctl: Add size to register_sysctl_init Why not make these calls automatically calculate the size based on the structure passed into them by using a #define instead of having to touch the code everywhere? That would make this much simpler AND make it impossible for future people to get this wrong. thanks, greg k-h
On Wed, Jun 21, 2023 at 12:46:47PM +0200, Greg KH wrote: > On Wed, Jun 21, 2023 at 11:09:49AM +0200, Joel Granados wrote: > > This is part of the effort to remove the empty element from the ctl_table > > structures (used to calculate size) and replace it with the ARRAY_SIZE macro. > > The "sysctl: Remove the end element in sysctl table arrays" commit is the one that > > actually removes the empty element. With a "yesall" configuration the bloat-o-meter > > says that 9158 bytes where saved (report at the end of the cover letter). > > 9k in ram or read-only memory? AFAIK its ro as I'm removing all the "empty" end elements from ctl_table array that are hardcoded all over the place. > > > Main changes: > > 1. Add the ctl_table size into the ctl_table_header > > 2. Remove the empty element at the end of all ctl_table arrays > > > > Commit Overview: > > 1. There are preparation commits that make sure that we have the > > ctl_table_header in all the places that we need to have the array size. > > sysctl: Prefer ctl_table_header in proc_sysct > > sysctl: Use the ctl header in list ctl_table macro > > sysctl: Add ctl_table_size to ctl_table_header > > > > 2. Add size to relevant register calls. Calculate the ctl_table array size > > where register_sysctl is called. Add a table_size argument to the relevant > > sysctl register functions (init_header, __register_sysctl_table, > > register_net_sysctl, register_sysctl and register_sysctl_init). Important to > > note that these commits do NOT change the way we calculate size; they plumb > > things in preparation for the empty element removal commit. Care is taken to > > leave the tree in a state where it can be compiled which is the reason to > > not separate the "big" commits (like "sysctl: Add size to the > > register_net_sysctl function"). If you have an alternative way of dealing > > with such a big commit while leaving it in a compilable state, please let me > > know. > > sysctl: Add size argument to init_header > > sysctl: Add a size arg to __register_sysctl_table > > sysctl: Add size to the register_net_sysctl function > > sysctl: Add size to register_sysctl > > sysctl: Add size to register_sysctl_init > > Why not make these calls automatically calculate the size based on the > structure passed into them by using a #define instead of having to touch > the code everywhere? That would make this much simpler AND make it > impossible for future people to get this wrong. I considered this at the outset, but it will not work with callers that use a pointer instead of the actual array. Additionally, we would not avoid big commits as we would have to go looking in all the files where register is called directly or indirectly and make sure the logic is sound. Best > > thanks, > > greg k-h
On Wed, Jun 21, 2023 at 02:38:16PM +0200, Joel Granados wrote: > On Wed, Jun 21, 2023 at 12:46:47PM +0200, Greg KH wrote: > > On Wed, Jun 21, 2023 at 11:09:49AM +0200, Joel Granados wrote: > > > This is part of the effort to remove the empty element from the ctl_table > > > structures (used to calculate size) and replace it with the ARRAY_SIZE macro. > > > The "sysctl: Remove the end element in sysctl table arrays" commit is the one that > > > actually removes the empty element. With a "yesall" configuration the bloat-o-meter > > > says that 9158 bytes where saved (report at the end of the cover letter). > > > > 9k in ram or read-only memory? > AFAIK its ro as I'm removing all the "empty" end elements from ctl_table > array that are hardcoded all over the place. > > > > > Main changes: > > > 1. Add the ctl_table size into the ctl_table_header > > > 2. Remove the empty element at the end of all ctl_table arrays > > > > > > Commit Overview: > > > 1. There are preparation commits that make sure that we have the > > > ctl_table_header in all the places that we need to have the array size. > > > sysctl: Prefer ctl_table_header in proc_sysct > > > sysctl: Use the ctl header in list ctl_table macro > > > sysctl: Add ctl_table_size to ctl_table_header > > > > > > 2. Add size to relevant register calls. Calculate the ctl_table array size > > > where register_sysctl is called. Add a table_size argument to the relevant > > > sysctl register functions (init_header, __register_sysctl_table, > > > register_net_sysctl, register_sysctl and register_sysctl_init). Important to > > > note that these commits do NOT change the way we calculate size; they plumb > > > things in preparation for the empty element removal commit. Care is taken to > > > leave the tree in a state where it can be compiled which is the reason to > > > not separate the "big" commits (like "sysctl: Add size to the > > > register_net_sysctl function"). If you have an alternative way of dealing > > > with such a big commit while leaving it in a compilable state, please let me > > > know. > > > sysctl: Add size argument to init_header > > > sysctl: Add a size arg to __register_sysctl_table > > > sysctl: Add size to the register_net_sysctl function > > > sysctl: Add size to register_sysctl > > > sysctl: Add size to register_sysctl_init > > > > Why not make these calls automatically calculate the size based on the > > structure passed into them by using a #define instead of having to touch > > the code everywhere? That would make this much simpler AND make it > > impossible for future people to get this wrong. > I considered this at the outset, but it will not work with callers that > use a pointer instead of the actual array. Then make 2 functions, one a "normal" one where you can't get it wrong as you pass in the structure that you can compute ARRAY_SIZE() and one that you have to do it manually. Don't force developers to think about stuff like this as now you are going to have to constantly audit the code to verify that the array size is correct. Right now it always "just works" due to the null termination, and now you are going to add complexity to the author in order to save a trivial amount of memory that no one is asking for :) > Additionally, we would not avoid big commits as we would have to go > looking in all the files where register is called directly or indirectly > and make sure the logic is sound. Then you need to think about how this could be done better, having "flag days" like this just doesn't work, sorry. There are ways to evolve common apis, and it's not like this patch set :) I'm all for saving space, but do NOT do it at the expense of making apis harder to use and easier to get incorrect. That will just cause more long-term problems and bugs, which is NOT a good trade off you ever want to make. thanks, greg k-h
On Wed, Jun 21, 2023 at 03:10:57PM +0200, Greg KH wrote: > On Wed, Jun 21, 2023 at 02:38:16PM +0200, Joel Granados wrote: > > On Wed, Jun 21, 2023 at 12:46:47PM +0200, Greg KH wrote: > > > On Wed, Jun 21, 2023 at 11:09:49AM +0200, Joel Granados wrote: > > > > This is part of the effort to remove the empty element from the ctl_table > > > > structures (used to calculate size) and replace it with the ARRAY_SIZE macro. > > > > The "sysctl: Remove the end element in sysctl table arrays" commit is the one that > > > > actually removes the empty element. With a "yesall" configuration the bloat-o-meter > > > > says that 9158 bytes where saved (report at the end of the cover letter). > > > > > > 9k in ram or read-only memory? > > AFAIK its ro as I'm removing all the "empty" end elements from ctl_table > > array that are hardcoded all over the place. > > > > > > > Main changes: > > > > 1. Add the ctl_table size into the ctl_table_header > > > > 2. Remove the empty element at the end of all ctl_table arrays > > > > > > > > Commit Overview: > > > > 1. There are preparation commits that make sure that we have the > > > > ctl_table_header in all the places that we need to have the array size. > > > > sysctl: Prefer ctl_table_header in proc_sysct > > > > sysctl: Use the ctl header in list ctl_table macro > > > > sysctl: Add ctl_table_size to ctl_table_header > > > > > > > > 2. Add size to relevant register calls. Calculate the ctl_table array size > > > > where register_sysctl is called. Add a table_size argument to the relevant > > > > sysctl register functions (init_header, __register_sysctl_table, > > > > register_net_sysctl, register_sysctl and register_sysctl_init). Important to > > > > note that these commits do NOT change the way we calculate size; they plumb > > > > things in preparation for the empty element removal commit. Care is taken to > > > > leave the tree in a state where it can be compiled which is the reason to > > > > not separate the "big" commits (like "sysctl: Add size to the > > > > register_net_sysctl function"). If you have an alternative way of dealing > > > > with such a big commit while leaving it in a compilable state, please let me > > > > know. > > > > sysctl: Add size argument to init_header > > > > sysctl: Add a size arg to __register_sysctl_table > > > > sysctl: Add size to the register_net_sysctl function > > > > sysctl: Add size to register_sysctl > > > > sysctl: Add size to register_sysctl_init > > > > > > Why not make these calls automatically calculate the size based on the > > > structure passed into them by using a #define instead of having to touch > > > the code everywhere? That would make this much simpler AND make it > > > impossible for future people to get this wrong. > > I considered this at the outset, but it will not work with callers that > > use a pointer instead of the actual array. > > Then make 2 functions, one a "normal" one where you can't get it wrong > as you pass in the structure that you can compute ARRAY_SIZE() and one > that you have to do it manually. Yes. And I actually think that there is a patch somewhere (I can't find it in my history) that does something similar. Additionally, when the call that does not have the size is used with a non-array, then the developer gets a warning. Still unsure about the indirection calls. But I'm guessing that they can have the same define. > > Don't force developers to think about stuff like this as now you are > going to have to constantly audit the code to verify that the array size > is correct. Right now it always "just works" due to the null > termination, and now you are going to add complexity to the author in > order to save a trivial amount of memory that no one is asking for :) > > > Additionally, we would not avoid big commits as we would have to go > > looking in all the files where register is called directly or indirectly > > and make sure the logic is sound. > > Then you need to think about how this could be done better, having "flag > days" like this just doesn't work, sorry. There are ways to evolve > common apis, and it's not like this patch set :) > > I'm all for saving space, but do NOT do it at the expense of making apis > harder to use and easier to get incorrect. That will just cause more > long-term problems and bugs, which is NOT a good trade off you ever want > to make. All good points. thx for the feedback, let me see if my V2 can be less invasive :) Best > > thanks, > > greg k-h