Source-Changes-D archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: CVS commit: [uebayasi-xip] src/sys/miscfs/genfs
On Sun, Nov 21, 2010 at 07:41:49AM +0000, Masao Uebayashi wrote:
> Module Name: src
> Committed By: uebayasi
> Date: Sun Nov 21 07:41:49 UTC 2010
>
> Modified Files:
> src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c
>
> Log Message:
> Revert XIP putpages totally.
>
> XIP'ed uobj owns no pages; uvm_object::uo_npages is always 0,
> nothing happens.
>
> Upper layer is responsible to unmap pmap-level mappings.
This assumption seems wrong. More thought is needed here...
>
>
> To generate a diff of this commit:
> cvs rdiff -u -r1.36.2.58 -r1.36.2.59 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.58
> src/sys/miscfs/genfs/genfs_io.c:1.36.2.59
> --- src/sys/miscfs/genfs/genfs_io.c:1.36.2.58 Sun Nov 21 06:46:15 2010
> +++ src/sys/miscfs/genfs/genfs_io.c Sun Nov 21 07:41:49 2010
> @@ -1,4 +1,4 @@
> -/* $NetBSD: genfs_io.c,v 1.36.2.58 2010/11/21 06:46:15 uebayasi Exp $
> */
> +/* $NetBSD: genfs_io.c,v 1.36.2.59 2010/11/21 07:41:49 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.58 2010/11/21 06:46:15
> uebayasi Exp $");
> +__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.36.2.59 2010/11/21 07:41:49
> uebayasi Exp $");
>
> #include "opt_xip.h"
>
> @@ -58,12 +58,6 @@
> #include <uvm/uvm.h>
> #include <uvm/uvm_pager.h>
>
> -#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_putpages_xip(struct vnode *, off_t, off_t, int,
> - struct vm_page **);
> -#endif
> static int genfs_do_directio(struct vmspace *, vaddr_t, size_t, struct vnode
> *,
> off_t, enum uio_rw);
> static void genfs_dio_iodone(struct buf *);
> @@ -940,100 +934,6 @@
> return error;
> }
>
> -#ifdef XIP
> -/*
> - * genfs_do_getpages_xip_io
> - * Return "direct pages" of XIP vnode. The block addresses of XIP
> - * vnode pages are returned back to the VM fault handler as the
> - * actually mapped physical addresses.
> - */
> -static int
> -genfs_do_getpages_xip_io(
> - 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)
> -{
> - const int fs_bshift = vp2fs_bshift(vp);
> - const int dev_bshift = vp2dev_bshift(vp);
> - const int fs_bsize = 1 << fs_bshift;
> -
> - int error;
> - off_t off;
> - int i;
> -
> - UVMHIST_FUNC("genfs_do_getpages_xip_io"); UVMHIST_CALLED(ubchist);
> -
> - KASSERT(((flags & PGO_GLOCKHELD) != 0) || genfs_node_rdlocked(vp));
> -
> -#ifdef UVMHIST
> - const off_t startoffset = trunc_blk(origoffset);
> - const off_t endoffset = round_blk(origoffset + PAGE_SIZE *
> orignmempages);
> -#endif
> -
> - const int ridx = (origoffset - startoffset) >> PAGE_SHIFT;
> -
> - UVMHIST_LOG(ubchist,
> - "ridx=%d xip npages=%d startoff=0x%lx endoff=0x%lx",
> - ridx, orignmempages, (long)startoffset, (long)endoffset);
> -
> - off = origoffset;
> - for (i = ridx; i < ridx + orignmempages; i++) {
> - daddr_t blkno;
> - int run;
> - struct vnode *devvp;
> -
> - KASSERT((off - origoffset) >> PAGE_SHIFT == i - ridx);
> -
> - const daddr_t lbn = trunc_blk(off) >> fs_bshift;
> -
> - error = VOP_BMAP(vp, lbn, &devvp, &blkno, &run);
> - KASSERT(error == 0);
> - UVMHIST_LOG(ubchist, "xip VOP_BMAP: lbn=%ld blkno=%ld run=%d",
> - (long)lbn, (long)blkno, run, 0);
> -
> - const daddr_t blk_off = blkno << dev_bshift;
> - const daddr_t fs_off = origoffset - (lbn << fs_bshift);
> -
> - /*
> - * XIP page metadata assignment
> - * - Unallocated block is redirected to the dedicated zero'ed
> - * page.
> - */
> - if (blkno < 0) {
> - panic("XIP hole is not supported yet!");
> - } else {
> - KASSERT(off - origoffset == (i - ridx) << PAGE_SHIFT);
> -
> - const daddr_t pg_off = (i - ridx) << PAGE_SHIFT;
> -
> - struct vm_page *pg;
> -
> - UVMHIST_LOG(ubchist,
> - "xip blk_off=%lx fs_off=%lx pg_off=%lx",
> - (long)blk_off, (long)fs_off, (long)pg_off, 0);
> -
> - pg = uvn_findpage_xip(devvp, &vp->v_uobj,
> - blk_off + fs_off + pg_off);
> - KASSERT(pg != NULL);
> - UVMHIST_LOG(ubchist,
> - "xip pgs %d => phys_addr=0x%lx (%p)",
> - i, (long)pg->phys_addr, pg, 0);
> - pps[i] = pg;
> - }
> -
> - off += PAGE_SIZE;
> - }
> -
> - return 0;
> -}
> -#endif
> -
> /*
> * generic VM putpages routine.
> * Write the given range of pages to backing store.
> @@ -1092,12 +992,6 @@
> int a_flags;
> } */ * const ap = v;
>
> -#ifdef XIP
> - if ((ap->a_vp->v_vflag & VV_XIP) != 0)
> - return genfs_do_putpages_xip(ap->a_vp, ap->a_offlo, ap->a_offhi,
> - ap->a_flags, NULL);
> - else
> -#endif
> return genfs_do_putpages(ap->a_vp, ap->a_offlo, ap->a_offhi,
> ap->a_flags, NULL);
> }
> @@ -1563,98 +1457,6 @@
> return (error);
> }
>
> -#ifdef XIP
> -int
> -genfs_do_putpages_xip(struct vnode *vp, off_t startoff, off_t endoff,
> - int flags, struct vm_page **busypg)
> -{
> - struct uvm_object *uobj = &vp->v_uobj;
> -#ifdef DIAGNOSTIC
> - struct genfs_node * const gp = VTOG(vp);
> -#endif
> -
> - UVMHIST_FUNC("genfs_do_putpages_xip"); UVMHIST_CALLED(ubchist);
> -
> - KASSERT(mutex_owned(&uobj->vmobjlock));
> - KASSERT((vp->v_iflag & VI_ONWORKLST) == 0);
> - KASSERT(vp->v_numoutput == 0);
> - KASSERT(gp->g_dirtygen == 0);
> -
> - UVMHIST_LOG(ubchist, "vp %p pages %d off 0x%x len 0x%x",
> - vp, uobj->uo_npages, startoff, endoff - startoff);
> -
> - /*
> - * XIP pages are read-only, and never become dirty. They're also never
> - * queued. PGO_DEACTIVATE and PGO_CLEANIT are meaningless for XIP
> - * pages, so we ignore them.
> - */
> - if ((flags & PGO_FREE) == 0)
> - goto done;
> -
> - /*
> - * For PGO_FREE (or (PGO_CLEANIT | PGO_FREE)), we invalidate MMU
> - * mappings of both XIP pages and XIP zero pages.
> - *
> - * Zero page is freed when one of its mapped offset is freed, even if
> - * one file (vnode) has many holes and mapping its zero page to all
> - * of those hole pages.
> - *
> - * We don't know which pages are currently mapped in the given vnode,
> - * because XIP pages are not added to vnode. What we can do is to
> - * locate pages by querying the filesystem as done in getpages. Call
> - * genfs_do_getpages_xip_io().
> - */
> -
> - off_t off, eof;
> -
> - off = trunc_page(startoff);
> - if (endoff == 0 || (flags & PGO_ALLPAGES))
> - GOP_SIZE(vp, vp->v_size, &eof, GOP_SIZE_MEM);
> - else
> - eof = endoff;
> -
> - while (off < eof) {
> - int npages, orignpages, error, i;
> - struct vm_page *pgs[maxpages], *pg;
> -
> - npages = round_page(eof - off) >> PAGE_SHIFT;
> - if (npages > maxpages)
> - npages = maxpages;
> -
> - orignpages = npages;
> - KASSERT(mutex_owned(&uobj->vmobjlock));
> - mutex_exit(&uobj->vmobjlock);
> - error = genfs_do_getpages_xip_io(vp, off, pgs, &npages, 0,
> - VM_PROT_ALL, 0, PGO_GLOCKHELD, orignpages);
> - KASSERT(error == 0);
> - KASSERT(npages == orignpages);
> - mutex_enter(&uobj->vmobjlock);
> - for (i = 0; i < npages; i++) {
> - pg = pgs[i];
> - if (pg == NULL || pg == PGO_DONTCARE)
> - continue;
> - /*
> - * Freeing normal XIP pages; nothing to do.
> - */
> - pmap_page_protect(pg, VM_PROT_NONE);
> - KASSERT((pg->flags & PG_RDONLY) != 0);
> - KASSERT((pg->flags & PG_CLEAN) != 0);
> - KASSERT((pg->flags & PG_FAKE) == 0);
> - KASSERT((pg->flags & PG_DEVICE) != 0);
> - pg->flags &= ~PG_BUSY;
> - }
> - off += npages << PAGE_SHIFT;
> - }
> -
> - KASSERT(uobj->uo_npages == 0);
> -
> -done:
> - KASSERT(mutex_owned(&uobj->vmobjlock));
> - mutex_exit(&uobj->vmobjlock);
> - return 0;
> -}
> -#endif
> -
> int
> genfs_gop_write(struct vnode *vp, struct vm_page **pgs, int npages, int
> flags)
> {
>
--
Masao Uebayashi / Tombi Inc. / Tel: +81-90-9141-4635
Home |
Main Index |
Thread Index |
Old Index