int kthread_wss(void *data) { unsigned long va; int ret; int wss; pgd_t *pgd; pmd_t *pmd; pud_t *pud; pte_t *ptep; struct task_struct *task; while(!kthread_should_stop()) { printk(KERN_INFO "Checking process' WSS.\n"); for_each_process(task) { wss = 0; if(task->mm != NULL) { struct vm_area_struct *temp = task->mm->mmap; while(temp) { if(temp->vm_flags & VM_IO){} else { for(va = temp->vm_start; va < temp->vm_end; va+=PAGE_SIZE) { pgd = pgd_offset(task->mm,va); if(pgd_none(*pgd)) break; pud = pud_offset(pgd,va); if(pud_none(*pud)) break; pmd = pmd_offset(pud,va); if(pmd_none(*pmd)) break; ptep = pte_offset_map(pmd,va); ret = 0; if(pte_young(*ptep)) { ret = test_and_clear_bit(_PAGE_BIT_ACCESSED, (unsigned long *) &ptep->pte); wss++; } if(ret) { pte_update(task->mm, va, ptep); } pte_unmap(ptep); } } temp = temp->vm_next; } printk(KERN_INFO "%i: %i\n", task->pid, wss); } } msleep(1000); } return 0; }
void pte_update_defer(struct mm_struct *mm, unsigned long addr, pte_t *ptep) { pte_update(mm, addr, ptep); }