Exemplo n.º 1
0
static int copy_one_pte(struct vm_area_struct *vma, pte_t * src, pte_t * dst,
			unsigned long old_addr, unsigned long new_addr,
			struct pte_chain ** pte_chainp)
{
	int error = 0;
	pte_t pte;
	struct page * page = NULL;

	if (pte_present(*src))
		page = pte_page(*src);

	if (!pte_none(*src)) {
		if (page)
			page_remove_rmap(page, src);
		pte = vm_ptep_get_and_clear(vma, old_addr, src);
		if (!dst) {
			/* No dest?  We must put it back. */
			dst = src;
			error++;
		}
		vm_set_pte(vma, new_addr, dst, pte);
		if (page)
			*pte_chainp = page_add_rmap(page, dst, *pte_chainp);
	}
	return error;
}
Exemplo n.º 2
0
/* mmlist_lock and vma->vm_mm->page_table_lock are held */
static void
unuse_pte(struct vm_area_struct * vma, unsigned long address, pte_t * dir,
       swp_entry_t entry, struct page * page, struct pte_chain ** pte_chainp)
{
	pte_t pte = *dir;

	if (likely(pte_to_swp_entry(pte).val != entry.val))
		return;
	if (unlikely(pte_none(pte) || pte_present(pte)))
		return;
	get_page(page);
	vm_set_pte(vma, address, dir, pte_mkold(mk_pte(page, vma->vm_page_prot)));
	*pte_chainp = page_add_rmap(page, dir, *pte_chainp);
	swap_free(entry);
	++vma->vm_mm->rss;
}