On Wed, Feb 01, 2023 at 01:32:22PM +0530, Raghavendra K T wrote: > 2) Maintain duplicate list of accessing PIDs to keep track of history of access. and switch/reset. use OR operation during iteration > > Two lists of PIDs maintained. At regular interval old list is reset and we make current list as old list > At any point of time tracking of PIDs accessing VMA is determined by ORing list1 and list2 > > accessing_pids_list1 <- current list > accessing_pids_list2 <- old list ( I'm not sure why you think this part of the email doesn't need to be nicely wrapped at 76 chars.. ) This seems simple enough to me and can be trivially extended to N if needed. The typical implementation would looks something like: unsigned long pids[N]; unsigned int pid_idx; set: unsigned long *pids = numab->pids + pid_idx; if (!__test_bit(bit, pids)) __set_bit(bit, pids); test: unsigned long pids = 0; for (int i = 0; i < N; i++) pids |= numab->pids[i]; return __test_bit(bit, &pids); rotate: idx = READ_ONCE(numab->pid_idx); WRITE_ONCE(numab->pid_idx, (idx + 1) % N); numab->pids[idx] = 0; Note the actual rotate can be simplified to ^1 for N:=2.