> My code calls the following function for each VMA of the process. Are > there errors in the function?: Sorry. I forgot some lines: int my_free_pages(struct vm_area_struct * vma, struct mm_struct * mm) { LIST_HEAD(page_list); unsigned long nr_taken; struct zone * zone = NULL; int ret; pte_t *pte_k; pud_t *pud; pmd_t *pmd; unsigned long addr; struct page * p; struct scan_control sc; sc.gfp_mask = __GFP_FS; sc.may_swap = 1; sc.may_writepage = 1; for (addr = vma->vm_start, nr_taken = 0; addr < vma->vm_end; addr += PAGE_SIZE, nr_taken++) { pgd_t *pgd = pgd_offset(mm, addr); if (pgd_none(*pgd)) return; pud = pud_offset(pgd, addr); if (pud_none(*pud)) return; pmd = pmd_offset(pud, addr); if (pmd_none(*pmd)) return; if (pmd_large(*pmd)) pte_k = (pte_t *)pmd; else pte_k = pte_offset_kernel(pmd, addr); if (pte_k && pte_present(*pte_k)) { p = pte_page(*pte_k); if (!zone) zone = page_zone(p); ptep_clear_flush_young(vma, addr, pte_k); del_page_from_lru(zone, p); list_add(&p->lru, &page_list); } } spin_lock_irq(&zone->lru_lock); __mod_zone_page_state(zone, NR_INACTIVE, -nr_taken); zone->pages_scanned += nr_taken; spin_unlock_irq(&zone->lru_lock); printk("VMC: %lu pages set to be freed\n", nr_taken); printk("VMC: %d pages freed\n", ret = shrink_page_list_vmswap(&page_list, &sc, PAGEOUT_IO_SYNC)); } Javi -- Javier Cabezas Rodríguez Phd. Student - DAC (UPC) jcabezas@ac.upc.edu