calculate NGROUPS_PER_BLOCK from PAGE_SIZE
PATCH 1/1 calculate NGROUPS_PER_BLOCK from PAGE_SIZE
On ia64, EXEC_PAGESIZE (max page size) is 65536, but the default page size is 16k. This results in NGROUPS_PER_BLOCK in include/linux/sched.h being calculated incorrectly when the page size is anything other than 64k. For example, on a 16k page size kernel, a setgroups() call with a gidsetsize of 65536 will end up walking over memory since only 1/4 of the needed pages were allocated for the blocks[] array in the group_info struct.
Patch below calculates NGROUPS_PER_BLOCK from PAGE_SIZE instead.
Greg
===== include/linux/sched.h 1.210 vs edited =====
include/linux/sched.h +1 -1
@@ -352,7 +352,7 @@void exit_io_context (void );#define NGROUPS_SMALL 32 -#define NGROUPS_PER_BLOCK ((int)(EXEC_PAGESIZE / sizeof(gid_t))) +#define NGROUPS_PER_BLOCK ((int)(PAGE_SIZE / sizeof(gid_t)))struct group_info {int ngroups;atomic_t usage;
Quoted 10 lines · [email protected] (Greg Edwards) wrote:
On ia64,
EXEC_PAGESIZE(max page size) is 65536, but the default page size is 16k. This results inNGROUPS_PER_BLOCKininclude/linux/sched.hbeing calculated incorrectly when the page size is anything other than 64k. For example, on a 16k page size kernel, asetgroups()call with a gidsetsize of 65536 will end up walking over memory since only 1/4 of the needed pages were allocated for the blocks[] array in thegroup_infostruct.Patch below calculates
NGROUPS_PER_BLOCKfromPAGE_SIZEinstead.
yep, thanks.