Author: markj
Date: Wed Aug 28 16:16:14 2019
New Revision: 351570
URL: https://svnweb.freebsd.org/changeset/base/351570

Log:
  MFC r351333:
  Simplify vm_page_dequeue() and fix an assertion.

Modified:
  stable/12/sys/vm/vm_page.c
  stable/12/sys/vm/vm_page.h
  stable/12/sys/vm/vm_pagequeue.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/vm/vm_page.c
==============================================================================
--- stable/12/sys/vm/vm_page.c  Wed Aug 28 16:08:06 2019        (r351569)
+++ stable/12/sys/vm/vm_page.c  Wed Aug 28 16:16:14 2019        (r351570)
@@ -3079,21 +3079,15 @@ vm_waitpfault(struct domainset *dset)
                mtx_unlock(&vm_domainset_lock);
 }
 
-struct vm_pagequeue *
+static struct vm_pagequeue *
 vm_page_pagequeue(vm_page_t m)
 {
 
-       return (&vm_pagequeue_domain(m)->vmd_pagequeues[m->queue]);
-}
-
-static struct mtx *
-vm_page_pagequeue_lockptr(vm_page_t m)
-{
        uint8_t queue;
 
        if ((queue = atomic_load_8(&m->queue)) == PQ_NONE)
                return (NULL);
-       return (&vm_pagequeue_domain(m)->vmd_pagequeues[queue].pq_mutex);
+       return (&vm_pagequeue_domain(m)->vmd_pagequeues[queue]);
 }
 
 static inline void
@@ -3116,10 +3110,8 @@ vm_pqbatch_process_page(struct vm_pagequeue *pq, vm_pa
            m, pq, qflags));
 
        if ((qflags & PGA_DEQUEUE) != 0) {
-               if (__predict_true((qflags & PGA_ENQUEUED) != 0)) {
-                       TAILQ_REMOVE(&pq->pq_pl, m, plinks.q);
-                       vm_pagequeue_cnt_dec(pq);
-               }
+               if (__predict_true((qflags & PGA_ENQUEUED) != 0))
+                       vm_pagequeue_remove(pq, m);
                vm_page_dequeue_complete(m);
        } else if ((qflags & (PGA_REQUEUE | PGA_REQUEUE_HEAD)) != 0) {
                if ((qflags & PGA_ENQUEUED) != 0)
@@ -3293,16 +3285,14 @@ vm_page_dequeue_deferred(vm_page_t m)
 void
 vm_page_dequeue(vm_page_t m)
 {
-       struct mtx *lock, *lock1;
-       struct vm_pagequeue *pq;
+       struct vm_pagequeue *pq, *pq1;
        uint8_t aflags;
 
-       KASSERT(mtx_owned(vm_page_lockptr(m)) || m->order == VM_NFREEORDER,
+       KASSERT(mtx_owned(vm_page_lockptr(m)) || m->object == NULL,
            ("page %p is allocated and unlocked", m));
 
-       for (;;) {
-               lock = vm_page_pagequeue_lockptr(m);
-               if (lock == NULL) {
+       for (pq = vm_page_pagequeue(m);; pq = pq1) {
+               if (pq == NULL) {
                        /*
                         * A thread may be concurrently executing
                         * vm_page_dequeue_complete().  Ensure that all queue
@@ -3321,27 +3311,24 @@ vm_page_dequeue(vm_page_t m)
                         * critical section.
                         */
                        cpu_spinwait();
+                       pq1 = vm_page_pagequeue(m);
                        continue;
                }
-               mtx_lock(lock);
-               if ((lock1 = vm_page_pagequeue_lockptr(m)) == lock)
+               vm_pagequeue_lock(pq);
+               if ((pq1 = vm_page_pagequeue(m)) == pq)
                        break;
-               mtx_unlock(lock);
-               lock = lock1;
+               vm_pagequeue_unlock(pq);
        }
-       KASSERT(lock == vm_page_pagequeue_lockptr(m),
+       KASSERT(pq == vm_page_pagequeue(m),
            ("%s: page %p migrated directly between queues", __func__, m));
        KASSERT((m->aflags & PGA_DEQUEUE) != 0 ||
            mtx_owned(vm_page_lockptr(m)),
            ("%s: queued unlocked page %p", __func__, m));
 
-       if ((m->aflags & PGA_ENQUEUED) != 0) {
-               pq = vm_page_pagequeue(m);
-               TAILQ_REMOVE(&pq->pq_pl, m, plinks.q);
-               vm_pagequeue_cnt_dec(pq);
-       }
+       if ((m->aflags & PGA_ENQUEUED) != 0)
+               vm_pagequeue_remove(pq, m);
        vm_page_dequeue_complete(m);
-       mtx_unlock(lock);
+       vm_pagequeue_unlock(pq);
 }
 
 /*

Modified: stable/12/sys/vm/vm_page.h
==============================================================================
--- stable/12/sys/vm/vm_page.h  Wed Aug 28 16:08:06 2019        (r351569)
+++ stable/12/sys/vm/vm_page.h  Wed Aug 28 16:16:14 2019        (r351570)
@@ -554,7 +554,6 @@ void vm_page_launder(vm_page_t m);
 vm_page_t vm_page_lookup (vm_object_t, vm_pindex_t);
 vm_page_t vm_page_next(vm_page_t m);
 int vm_page_pa_tryrelock(pmap_t, vm_paddr_t, vm_paddr_t *);
-struct vm_pagequeue *vm_page_pagequeue(vm_page_t m);
 vm_page_t vm_page_prev(vm_page_t m);
 bool vm_page_ps_test(vm_page_t m, int flags, vm_page_t skip_m);
 void vm_page_putfake(vm_page_t m);

Modified: stable/12/sys/vm/vm_pagequeue.h
==============================================================================
--- stable/12/sys/vm/vm_pagequeue.h     Wed Aug 28 16:08:06 2019        
(r351569)
+++ stable/12/sys/vm/vm_pagequeue.h     Wed Aug 28 16:16:14 2019        
(r351570)
@@ -199,6 +199,14 @@ vm_pagequeue_cnt_add(struct vm_pagequeue *pq, int adde
 #define        vm_pagequeue_cnt_dec(pq)        vm_pagequeue_cnt_add((pq), -1)
 
 static inline void
+vm_pagequeue_remove(struct vm_pagequeue *pq, vm_page_t m)
+{
+
+       TAILQ_REMOVE(&pq->pq_pl, m, plinks.q);
+       vm_pagequeue_cnt_dec(pq);
+}
+
+static inline void
 vm_batchqueue_init(struct vm_batchqueue *bq)
 {
 
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to