Module Name: src Committed By: uebayasi Date: Fri Nov 19 08:11:04 UTC 2010
Modified Files: src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c Log Message: More adjustment. Reorder genfs_node_unlock() -> putiobuf() to putiobuf() -> genfs_node_unlock() but I don't think there's any constraint between these two. To generate a diff of this commit: cvs rdiff -u -r1.36.2.43 -r1.36.2.44 src/sys/miscfs/genfs/genfs_io.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/miscfs/genfs/genfs_io.c diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.43 src/sys/miscfs/genfs/genfs_io.c:1.36.2.44 --- src/sys/miscfs/genfs/genfs_io.c:1.36.2.43 Fri Nov 19 07:09:49 2010 +++ src/sys/miscfs/genfs/genfs_io.c Fri Nov 19 08:11:04 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: genfs_io.c,v 1.36.2.43 2010/11/19 07:09:49 uebayasi Exp $ */ +/* $NetBSD: genfs_io.c,v 1.36.2.44 2010/11/19 08:11:04 uebayasi Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.36.2.43 2010/11/19 07:09:49 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.36.2.44 2010/11/19 08:11:04 uebayasi Exp $"); #include "opt_xip.h" @@ -62,6 +62,8 @@ #ifdef XIP static int genfs_do_getpages_xip_io(struct vnode *, voff_t, struct vm_page **, int *, int, vm_prot_t, int, int, const int); +static int genfs_do_getpages_xip_io_done(struct vnode *, voff_t, struct vm_page **, + int *, int, vm_prot_t, int, int, const int); static int genfs_do_putpages_xip(struct vnode *, off_t, off_t, int, struct vm_page **); #endif @@ -475,26 +477,10 @@ mutex_exit(&uobj->vmobjlock); -#if 1 - if ((ap->a_vp->v_vflag & VV_XIP) != 0) { - error = genfs_do_getpages_xip_io( - ap->a_vp, - ap->a_offset, - ap->a_m, - ap->a_count, - ap->a_centeridx, - ap->a_access_type, - ap->a_advice, - ap->a_flags, - orignmempages); - goto out_err_free; - } -#endif - { size_t bytes, iobytes, tailstart, tailbytes, totalbytes, skipbytes; - vaddr_t kva; - struct buf *bp, *mbp; + vaddr_t kva = 0; + struct buf *bp = NULL, *mbp = NULL; bool sawhole = false; /* @@ -506,6 +492,11 @@ tailbytes = totalbytes - bytes; skipbytes = 0; +#if 1 + if ((ap->a_vp->v_vflag & VV_XIP) != 0) + goto genfs_getpages_bio_prepare_done; +#endif + kva = uvm_pagermapin(pgs, npages, UVMPAGER_MAPIN_READ | UVMPAGER_MAPIN_WAITOK); @@ -526,6 +517,10 @@ else BIO_SETPRIO(mbp, BPRIO_TIMECRITICAL); +#if 1 +genfs_getpages_bio_prepare_done: +#endif + /* * if EOF is in the middle of the range, zero the part past EOF. * skip over pages which are not PG_FAKE since in that case they have @@ -546,6 +541,22 @@ tailbytes -= len; } +#if 1 + if ((ap->a_vp->v_vflag & VV_XIP) != 0) { + error = genfs_do_getpages_xip_io( + ap->a_vp, + ap->a_offset, + ap->a_m, + ap->a_count, + ap->a_centeridx, + ap->a_access_type, + ap->a_advice, + ap->a_flags, + orignmempages); + goto loopdone; + } +#endif + /* * now loop over the pages, reading as needed. */ @@ -675,6 +686,16 @@ } loopdone: +#if 1 + if ((ap->a_vp->v_vflag & VV_XIP) != 0) + goto genfs_getpages_biodone_done; +#endif +#if 0 + +int +genfs_getpages_biodone() +{ +#endif nestiobuf_done(mbp, skipbytes, error); if (async) { UVMHIST_LOG(ubchist, "returning 0 (async)",0,0,0,0); @@ -731,12 +752,47 @@ } } } + + putiobuf(mbp); +#if 0 +} + +#endif +#if 1 +genfs_getpages_biodone_done: + {} +#endif + } + if (!glocked) { genfs_node_unlock(vp); } - putiobuf(mbp); - } +#if 1 + if ((ap->a_vp->v_vflag & VV_XIP) != 0) { + error = genfs_do_getpages_xip_io_done( + ap->a_vp, + ap->a_offset, + ap->a_m, + ap->a_count, + ap->a_centeridx, + ap->a_access_type, + ap->a_advice, + ap->a_flags, + orignmempages); + goto genfs_getpages_generic_io_done_done; + } +#endif +#if 0 + else { + error = genfs_getpages_generic_io_done(); + } +} + +int +genfs_getpages_generic_io_done() +{ +#endif mutex_enter(&uobj->vmobjlock); @@ -804,6 +860,7 @@ } } mutex_exit(&uvm_pageqlock); + if (memwrite) { genfs_markdirty(vp); } @@ -812,6 +869,14 @@ memcpy(ap->a_m, &pgs[ridx], orignmempages * sizeof(struct vm_page *)); } +#if 0 +} + +#endif +#if 1 +genfs_getpages_generic_io_done_done: + {} +#endif out_err_free: if (pgs != NULL && pgs != pgs_onstack) @@ -841,9 +906,6 @@ int flags, const int orignmempages) { - struct uvm_object * const uobj = &vp->v_uobj; - const bool glocked = (flags & PGO_GLOCKHELD) != 0; - const int fs_bshift = vp2fs_bshift(vp); const int dev_bshift = vp2dev_bshift(vp); const int fs_bsize = 1 << fs_bshift; @@ -872,7 +934,7 @@ UVMHIST_FUNC("genfs_do_getpages_xip_io"); UVMHIST_CALLED(ubchist); - KASSERT(glocked || genfs_node_rdlocked(vp)); + KASSERT(((flags & PGO_GLOCKHELD) != 0) || genfs_node_rdlocked(vp)); #if 0 GOP_SIZE(vp, vp->v_size, &memeof, GOP_SIZE_MEM); @@ -936,6 +998,24 @@ off += PAGE_SIZE; } + return 0; +} + +int +genfs_do_getpages_xip_io_done( + struct vnode *vp, + voff_t origoffset, + struct vm_page **pps, + int *npagesp, + int centeridx, + vm_prot_t access_type, + int advice, + int flags, + const int orignmempages) +{ + struct uvm_object * const uobj = &vp->v_uobj; + int i; + mutex_enter(&uobj->vmobjlock); for (i = 0; i < orignmempages; i++) { @@ -952,9 +1032,6 @@ mutex_exit(&uobj->vmobjlock); - if (!glocked) - genfs_node_unlock(vp); - *npagesp = orignmempages; return 0; @@ -1564,7 +1641,6 @@ * Freeing normal XIP pages; nothing to do. */ pmap_page_protect(pg, VM_PROT_NONE); - KASSERT((pg->flags & PG_BUSY) != 0); KASSERT((pg->flags & PG_RDONLY) != 0); KASSERT((pg->flags & PG_CLEAN) != 0); KASSERT((pg->flags & PG_FAKE) == 0);