Date: Mon, 4 Jul 2011 16:26:31 GMT From: Ilya Putsikau <ilya@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 195717 for review Message-ID: <201107041626.p64GQVRm047632@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@195717?ac=10 Change 195717 by ilya@ilya_triton2011 on 2011/07/04 16:26:01 Fix vm page locking Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#33 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#33 (text+ko) ==== @@ -132,6 +132,18 @@ int fuse_pbuf_freecnt = -1; +#if __FreeBSD_version >= 900011 +#define fuse_vm_page_lock(m) vm_page_lock((m)); +#define fuse_vm_page_unlock(m) vm_page_unlock((m)); +#define fuse_vm_page_lock_queues() ((void)0) +#define fuse_vm_page_unlock_queues() ((void)0) +#else +#define fuse_vm_page_lock(m) ((void)0) +#define fuse_vm_page_unlock(m) ((void)0) +#define fuse_vm_page_lock_queues() vm_page_lock_queues() +#define fuse_vm_page_unlock_queues() vm_page_unlock_queues() +#endif + /* struct vnop_access_args { struct vnode *a_vp; @@ -1898,19 +1910,22 @@ vm_page_t m = pages[ap->a_reqpage]; VM_OBJECT_LOCK(vp->v_object); - vm_page_lock_queues(); + fuse_vm_page_lock_queues(); if (m->valid != 0) { /* handled by vm_fault now */ /* vm_page_zero_invalid(m, TRUE); */ for (i = 0; i < npages; ++i) { - if (i != ap->a_reqpage) + if (i != ap->a_reqpage) { + fuse_vm_page_lock(pages[i]); vm_page_free(pages[i]); + fuse_vm_page_unlock(pages[i]); + } } - vm_page_unlock_queues(); + fuse_vm_page_unlock_queues(); VM_OBJECT_UNLOCK(vp->v_object); return(0); } - vm_page_unlock_queues(); + fuse_vm_page_unlock_queues(); VM_OBJECT_UNLOCK(vp->v_object); } @@ -1947,12 +1962,15 @@ if (error && (FUSE_PAGEOPS_RESID == count)) { DEBUG2G("error %d\n", error); VM_OBJECT_LOCK(vp->v_object); - vm_page_lock_queues(); + fuse_vm_page_lock_queues(); for (i = 0; i < npages; ++i) { - if (i != ap->a_reqpage) + if (i != ap->a_reqpage) { + fuse_vm_page_lock(pages[i]); vm_page_free(pages[i]); + fuse_vm_page_unlock(pages[i]); + } } - vm_page_unlock_queues(); + fuse_vm_page_unlock_queues(); VM_OBJECT_UNLOCK(vp->v_object); return VM_PAGER_ERROR; } @@ -1965,7 +1983,7 @@ size = count - FUSE_PAGEOPS_RESID; VM_OBJECT_LOCK(vp->v_object); - vm_page_lock_queues(); + fuse_vm_page_lock_queues(); for (i = 0, toff = 0; i < npages; i++, toff = nextoff) { vm_page_t m; nextoff = toff + PAGE_SIZE; @@ -2007,21 +2025,24 @@ * now tell them that it is ok to use. */ if (!error) { -#ifdef VPO_WANTED - if (m->oflags & VPO_WANTED) -#else - if (m->flags & PG_WANTED) -#endif + if (m->oflags & VPO_WANTED) { + fuse_vm_page_lock(m); vm_page_activate(m); - else + fuse_vm_page_unlock(m); + } else { + fuse_vm_page_lock(m); vm_page_deactivate(m); + fuse_vm_page_unlock(m); + } vm_page_wakeup(m); } else { + fuse_vm_page_lock(m); vm_page_free(m); + fuse_vm_page_unlock(m); } } } - vm_page_unlock_queues(); + fuse_vm_page_unlock_queues(); VM_OBJECT_UNLOCK(vp->v_object); return 0; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107041626.p64GQVRm047632>