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.