From owner-p4-projects@FreeBSD.ORG Mon Jul 4 16:26:32 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3A9B41065674; Mon, 4 Jul 2011 16:26:32 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id F1849106566B for ; Mon, 4 Jul 2011 16:26:31 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id D86488FC08 for ; Mon, 4 Jul 2011 16:26:31 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p64GQV4p047635 for ; Mon, 4 Jul 2011 16:26:31 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p64GQVRm047632 for perforce@freebsd.org; Mon, 4 Jul 2011 16:26:31 GMT (envelope-from ilya@FreeBSD.org) Date: Mon, 4 Jul 2011 16:26:31 GMT Message-Id: <201107041626.p64GQVRm047632@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195717 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Jul 2011 16:26:32 -0000 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; }