From 3bc42a38b713eabcb412b5f56794d68ebd0a731c Mon Sep 17 00:00:00 2001 From: Josef 'Jeff' Sipek Date: Tue, 6 Jun 2017 19:52:59 +0300 Subject: [PATCH] vm: page_mark_migrate should operate on vmobjects --- include/vm/page.h | 2 +- kernel/vm/seg_vn.c | 4 ++-- kernel/vm/vm_page.c | 29 +++++++++++++++++------------ 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/include/vm/page.h b/include/vm/page.h index 0765a1770b..dc4812e895 100644 --- a/include/vm/page.h +++ b/include/vm/page.h @@ -773,7 +773,7 @@ void page_demote_free_pages(page_t *); struct anon_map; void page_mark_migrate(struct seg *, caddr_t, size_t, struct anon_map *, - ulong_t, vnode_t *, uoff_t, int); + ulong_t, struct vmobject *, uoff_t, int); void page_migrate(struct seg *, caddr_t, page_t **, pgcnt_t); /* diff --git a/kernel/vm/seg_vn.c b/kernel/vm/seg_vn.c index d4ad0c0eda..8039bf72d5 100644 --- a/kernel/vm/seg_vn.c +++ b/kernel/vm/seg_vn.c @@ -8031,7 +8031,7 @@ segvn_advise(struct seg *seg, caddr_t addr, size_t len, uint_t behav) * migration */ page_mark_migrate(seg, addr, len, amp, svd->anon_index, - vp, svd->offset, 1); + &vp->v_object, svd->offset, 1); /* * If same policy set already or this is a shared @@ -8170,7 +8170,7 @@ segvn_advise(struct seg *seg, caddr_t addr, size_t len, uint_t behav) * migration */ page_mark_migrate(seg, addr, len, amp, svd->anon_index, - vp, svd->offset, 1); + &vp->v_object, svd->offset, 1); /* * Don't need to try to split or concatenate diff --git a/kernel/vm/vm_page.c b/kernel/vm/vm_page.c index 82b8644fb6..c28e378ce3 100644 --- a/kernel/vm/vm_page.c +++ b/kernel/vm/vm_page.c @@ -5029,11 +5029,11 @@ page_demote_vp_pages(page_t *pp) */ void page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, - struct anon_map *amp, ulong_t anon_index, vnode_t *vp, - uoff_t vnoff, int rflag) + struct anon_map *amp, ulong_t anon_index, struct vmobject *obj, + uoff_t objoff, int rflag) { struct anon *ap; - vnode_t *curvp; + struct vmobject *curobj; lgrp_t *from; pgcnt_t nlocked; uoff_t off; @@ -5073,25 +5073,30 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, * Lookup (root) page for vnode and offset corresponding to * this virtual address * Try anonmap first since there may be copy-on-write - * pages, but initialize vnode pointer and offset using - * vnode arguments just in case there isn't an amp. + * pages, but initialize object pointer and offset using + * arguments just in case there isn't an amp. */ - curvp = vp; - off = vnoff + va - seg->s_base; + curobj = obj; + off = objoff + va - seg->s_base; if (amp) { ANON_LOCK_ENTER(&->a_rwlock, RW_READER); an_idx = anon_index + seg_page(seg, va); anon_array_enter(amp, an_idx, &cookie); ap = anon_get_ptr(amp->ahp, an_idx); - if (ap) - swap_xlate(ap, &curvp, &off); + if (ap) { + struct vnode *vn; + + swap_xlate(ap, &vn, &off); + + curobj = (vn != NULL) ? &vn->v_object : NULL; + } anon_array_exit(&cookie); ANON_LOCK_EXIT(&->a_rwlock); } pp = NULL; - if (curvp) - pp = page_lookup(&curvp->v_object, off, SE_SHARED); + if (curobj) + pp = page_lookup(curobj, off, SE_SHARED); /* * If there isn't a page at this virtual address, @@ -5158,7 +5163,7 @@ page_mark_migrate(struct seg *seg, caddr_t addr, size_t len, /* * hat_page_demote() raced in with us. */ - ASSERT(!IS_SWAPFSVP(curvp)); + ASSERT(!IS_SWAPFSVP(curobj->vnode)); page_unlock(pp); break; } -- 2.11.4.GIT