uvm_swap_io: if pagedaemon, don't wait for iobuf.
This commit is contained in:
parent
e674d1c49a
commit
19b9de9868
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: uvm_extern.h,v 1.144 2008/01/28 12:22:47 yamt Exp $ */
|
/* $NetBSD: uvm_extern.h,v 1.145 2008/02/29 20:35:23 yamt Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
|
@ -690,6 +690,8 @@ void uvm_setpagesize(void);
|
||||||
void uvm_aio_biodone1(struct buf *);
|
void uvm_aio_biodone1(struct buf *);
|
||||||
void uvm_aio_biodone(struct buf *);
|
void uvm_aio_biodone(struct buf *);
|
||||||
void uvm_aio_aiodone(struct buf *);
|
void uvm_aio_aiodone(struct buf *);
|
||||||
|
void uvm_aio_aiodone_pages(struct vm_page **, int, bool,
|
||||||
|
int);
|
||||||
|
|
||||||
/* uvm_pdaemon.c */
|
/* uvm_pdaemon.c */
|
||||||
void uvm_pageout(void *);
|
void uvm_pageout(void *);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: uvm_pager.c,v 1.90 2008/01/02 11:49:19 ad Exp $ */
|
/* $NetBSD: uvm_pager.c,v 1.91 2008/02/29 20:35:23 yamt Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
|
@ -39,7 +39,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: uvm_pager.c,v 1.90 2008/01/02 11:49:19 ad Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: uvm_pager.c,v 1.91 2008/02/29 20:35:23 yamt Exp $");
|
||||||
|
|
||||||
#include "opt_uvmhist.h"
|
#include "opt_uvmhist.h"
|
||||||
#include "opt_readahead.h"
|
#include "opt_readahead.h"
|
||||||
|
@ -291,39 +291,21 @@ uvm_aio_biodone(struct buf *bp)
|
||||||
workqueue_enqueue(uvm.aiodone_queue, &bp->b_work, NULL);
|
workqueue_enqueue(uvm.aiodone_queue, &bp->b_work, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* uvm_aio_aiodone: do iodone processing for async i/os.
|
|
||||||
* this should be called in thread context, not interrupt context.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
void
|
||||||
uvm_aio_aiodone(struct buf *bp)
|
uvm_aio_aiodone_pages(struct vm_page **pgs, int npages, bool write, int error)
|
||||||
{
|
{
|
||||||
int npages = bp->b_bufsize >> PAGE_SHIFT;
|
|
||||||
struct vm_page *pg, *pgs[npages];
|
|
||||||
struct uvm_object *uobj;
|
struct uvm_object *uobj;
|
||||||
|
struct vm_page *pg;
|
||||||
kmutex_t *slock;
|
kmutex_t *slock;
|
||||||
int i, error, swslot;
|
int pageout_done;
|
||||||
int pageout_done = 0;
|
int swslot;
|
||||||
bool write, swap;
|
int i;
|
||||||
UVMHIST_FUNC("uvm_aio_aiodone"); UVMHIST_CALLED(ubchist);
|
bool swap;
|
||||||
UVMHIST_LOG(ubchist, "bp %p", bp, 0,0,0);
|
|
||||||
|
|
||||||
error = bp->b_error;
|
|
||||||
write = (bp->b_flags & B_READ) == 0;
|
|
||||||
/* XXXUBC BC_NOCACHE is for swap pager, should be done differently */
|
|
||||||
if (write && !(bp->b_cflags & BC_NOCACHE) && bioopsp != NULL)
|
|
||||||
(*bioopsp->io_pageiodone)(bp);
|
|
||||||
|
|
||||||
uobj = NULL;
|
|
||||||
for (i = 0; i < npages; i++) {
|
|
||||||
pgs[i] = uvm_pageratop((vaddr_t)bp->b_data + (i << PAGE_SHIFT));
|
|
||||||
UVMHIST_LOG(ubchist, "pgs[%d] = %p", i, pgs[i],0,0);
|
|
||||||
}
|
|
||||||
uvm_pagermapout((vaddr_t)bp->b_data, npages);
|
|
||||||
|
|
||||||
swslot = 0;
|
swslot = 0;
|
||||||
|
pageout_done = 0;
|
||||||
slock = NULL;
|
slock = NULL;
|
||||||
|
uobj = NULL;
|
||||||
pg = pgs[0];
|
pg = pgs[0];
|
||||||
swap = (pg->uanon != NULL && pg->uobject == NULL) ||
|
swap = (pg->uanon != NULL && pg->uobject == NULL) ||
|
||||||
(pg->pqflags & PQ_AOBJ) != 0;
|
(pg->pqflags & PQ_AOBJ) != 0;
|
||||||
|
@ -484,6 +466,37 @@ uvm_aio_aiodone(struct buf *bp)
|
||||||
uvmexp.pdpending--;
|
uvmexp.pdpending--;
|
||||||
#endif /* defined(VMSWAP) */
|
#endif /* defined(VMSWAP) */
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* uvm_aio_aiodone: do iodone processing for async i/os.
|
||||||
|
* this should be called in thread context, not interrupt context.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
uvm_aio_aiodone(struct buf *bp)
|
||||||
|
{
|
||||||
|
int npages = bp->b_bufsize >> PAGE_SHIFT;
|
||||||
|
struct vm_page *pgs[npages];
|
||||||
|
int i, error;
|
||||||
|
bool write;
|
||||||
|
UVMHIST_FUNC("uvm_aio_aiodone"); UVMHIST_CALLED(ubchist);
|
||||||
|
UVMHIST_LOG(ubchist, "bp %p", bp, 0,0,0);
|
||||||
|
|
||||||
|
error = bp->b_error;
|
||||||
|
write = (bp->b_flags & B_READ) == 0;
|
||||||
|
/* XXXUBC BC_NOCACHE is for swap pager, should be done differently */
|
||||||
|
if (write && !(bp->b_cflags & BC_NOCACHE) && bioopsp != NULL)
|
||||||
|
(*bioopsp->io_pageiodone)(bp);
|
||||||
|
|
||||||
|
for (i = 0; i < npages; i++) {
|
||||||
|
pgs[i] = uvm_pageratop((vaddr_t)bp->b_data + (i << PAGE_SHIFT));
|
||||||
|
UVMHIST_LOG(ubchist, "pgs[%d] = %p", i, pgs[i],0,0);
|
||||||
|
}
|
||||||
|
uvm_pagermapout((vaddr_t)bp->b_data, npages);
|
||||||
|
|
||||||
|
uvm_aio_aiodone_pages(pgs, npages, write, error);
|
||||||
|
|
||||||
if (write && (bp->b_cflags & BC_AGE) != 0) {
|
if (write && (bp->b_cflags & BC_AGE) != 0) {
|
||||||
mutex_enter(bp->b_objlock);
|
mutex_enter(bp->b_objlock);
|
||||||
vwakeup(bp);
|
vwakeup(bp);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: uvm_pdaemon.c,v 1.91 2008/02/07 12:24:16 yamt Exp $ */
|
/* $NetBSD: uvm_pdaemon.c,v 1.92 2008/02/29 20:35:23 yamt Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997 Charles D. Cranor and Washington University.
|
* Copyright (c) 1997 Charles D. Cranor and Washington University.
|
||||||
|
@ -71,7 +71,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.91 2008/02/07 12:24:16 yamt Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.92 2008/02/29 20:35:23 yamt Exp $");
|
||||||
|
|
||||||
#include "opt_uvmhist.h"
|
#include "opt_uvmhist.h"
|
||||||
#include "opt_readahead.h"
|
#include "opt_readahead.h"
|
||||||
|
@ -537,7 +537,7 @@ swapcluster_flush(struct swapcluster *swc, bool now)
|
||||||
uvmexp.pdpageouts++;
|
uvmexp.pdpageouts++;
|
||||||
uvm_pageout_start(nused);
|
uvm_pageout_start(nused);
|
||||||
error = uvm_swap_put(slot, swc->swc_pages, nused, 0);
|
error = uvm_swap_put(slot, swc->swc_pages, nused, 0);
|
||||||
KASSERT(error == 0);
|
KASSERT(error == 0 || error == ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: uvm_swap.c,v 1.136 2008/01/30 14:25:21 hannken Exp $ */
|
/* $NetBSD: uvm_swap.c,v 1.137 2008/02/29 20:35:23 yamt Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1995, 1996, 1997 Matthew R. Green
|
* Copyright (c) 1995, 1996, 1997 Matthew R. Green
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v 1.136 2008/01/30 14:25:21 hannken Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v 1.137 2008/02/29 20:35:23 yamt Exp $");
|
||||||
|
|
||||||
#include "fs_nfs.h"
|
#include "fs_nfs.h"
|
||||||
#include "opt_uvmhist.h"
|
#include "opt_uvmhist.h"
|
||||||
|
@ -1699,6 +1699,17 @@ uvm_swap_io(struct vm_page **pps, int startslot, int npages, int flags)
|
||||||
write = (flags & B_READ) == 0;
|
write = (flags & B_READ) == 0;
|
||||||
async = (flags & B_ASYNC) != 0;
|
async = (flags & B_ASYNC) != 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* allocate a buf for the i/o.
|
||||||
|
*/
|
||||||
|
|
||||||
|
KASSERT(curlwp != uvm.pagedaemon_lwp || (write && async));
|
||||||
|
bp = getiobuf(swapdev_vp, curlwp != uvm.pagedaemon_lwp);
|
||||||
|
if (bp == NULL) {
|
||||||
|
uvm_aio_aiodone_pages(pps, npages, true, ENOMEM);
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* convert starting drum slot to block number
|
* convert starting drum slot to block number
|
||||||
*/
|
*/
|
||||||
|
@ -1714,12 +1725,6 @@ uvm_swap_io(struct vm_page **pps, int startslot, int npages, int flags)
|
||||||
UVMPAGER_MAPIN_WAITOK|UVMPAGER_MAPIN_WRITE;
|
UVMPAGER_MAPIN_WAITOK|UVMPAGER_MAPIN_WRITE;
|
||||||
kva = uvm_pagermapin(pps, npages, mapinflags);
|
kva = uvm_pagermapin(pps, npages, mapinflags);
|
||||||
|
|
||||||
/*
|
|
||||||
* now allocate a buf for the i/o.
|
|
||||||
*/
|
|
||||||
|
|
||||||
bp = getiobuf(swapdev_vp, true);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* fill in the bp/sbp. we currently route our i/o through
|
* fill in the bp/sbp. we currently route our i/o through
|
||||||
* /dev/drum's vnode [swapdev_vp].
|
* /dev/drum's vnode [swapdev_vp].
|
||||||
|
|
Loading…
Reference in New Issue