El mié, 29-08-2007 a las 12:37 +1000, Nick Piggin escribió: > Simplest will be just to set referenced to 0 right after calling > page_referenced, in the case you want to forcefully swap out the > page. > > try_to_unmap will get called later in the same function. I have tried this solution, but 0 pages are freed... - RO/EXEC pages mapped from the executable are now skipped due to this check: if (!mapping || !remove_mapping(mapping, page)) goto keep_locked; The offender is this check in remove_mapping: if (unlikely(page_count(page) != 2)) goto cannot_free; - RW pages mapped from the executable are skipped because pageout returns PAGE_KEEP. - Other pages are skipped because try_to_unmap returns SWAP_FAIL. I also added a call ptep_clear_flush_young for each pte, to satisfy this check in try_to_unmap_one: if (!migration && ((vma->vm_flags & VM_LOCKED) || (ptep_clear_flush_young(vma, address, pte)))) { ret = SWAP_FAIL; goto out_unmap; } My code calls the following function for each VMA of the process. Are there errors in the function?: 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); } Thanks Javi -- Javier Cabezas Rodríguez Phd. Student - DAC (UPC) jcabezas@ac.upc.edu