Date: Fri, 28 Feb 2020 20:34:30 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r358447 - in head/sys: dev/drm2/ttm dev/md kern vm Message-ID: <202002282034.01SKYUC0048237@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jeff Date: Fri Feb 28 20:34:30 2020 New Revision: 358447 URL: https://svnweb.freebsd.org/changeset/base/358447 Log: Convert a few triviail consumers to the new unlocked grab API. Reviewed by: kib, markj Differential Revision: https://reviews.freebsd.org/D23847 Modified: head/sys/dev/drm2/ttm/ttm_tt.c head/sys/dev/md/md.c head/sys/kern/kern_exec.c head/sys/kern/kern_sendfile.c head/sys/kern/vfs_bio.c head/sys/vm/vm_glue.c Modified: head/sys/dev/drm2/ttm/ttm_tt.c ============================================================================== --- head/sys/dev/drm2/ttm/ttm_tt.c Fri Feb 28 20:33:28 2020 (r358446) +++ head/sys/dev/drm2/ttm/ttm_tt.c Fri Feb 28 20:34:30 2020 (r358447) @@ -285,24 +285,24 @@ int ttm_tt_swapin(struct ttm_tt *ttm) obj = ttm->swap_storage; - VM_OBJECT_WLOCK(obj); vm_object_pip_add(obj, 1); for (i = 0; i < ttm->num_pages; ++i) { - rv = vm_page_grab_valid(&from_page, obj, i, - VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY); + rv = vm_page_grab_valid_unlocked(&from_page, obj, i, + VM_ALLOC_NORMAL | VM_ALLOC_SBUSY | VM_ALLOC_IGN_SBUSY); if (rv != VM_PAGER_OK) { ret = -EIO; goto err_ret; } to_page = ttm->pages[i]; if (unlikely(to_page == NULL)) { + vm_page_sunbusy(from_page); ret = -ENOMEM; goto err_ret; } pmap_copy_page(from_page, to_page); + vm_page_sunbusy(from_page); } vm_object_pip_wakeup(obj); - VM_OBJECT_WUNLOCK(obj); if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP)) vm_object_deallocate(obj); @@ -312,7 +312,6 @@ int ttm_tt_swapin(struct ttm_tt *ttm) err_ret: vm_object_pip_wakeup(obj); - VM_OBJECT_WUNLOCK(obj); return (ret); } Modified: head/sys/dev/md/md.c ============================================================================== --- head/sys/dev/md/md.c Fri Feb 28 20:33:28 2020 (r358446) +++ head/sys/dev/md/md.c Fri Feb 28 20:34:30 2020 (r358447) @@ -1060,9 +1060,7 @@ mdstart_swap(struct md_s *sc, struct bio *bp) vm_object_pip_add(sc->object, 1); for (i = bp->bio_offset / PAGE_SIZE; i <= lastp; i++) { len = ((i == lastp) ? lastend : PAGE_SIZE) - offs; - VM_OBJECT_WLOCK(sc->object); - m = vm_page_grab(sc->object, i, VM_ALLOC_SYSTEM); - VM_OBJECT_WUNLOCK(sc->object); + m = vm_page_grab_unlocked(sc->object, i, VM_ALLOC_SYSTEM); if (bp->bio_cmd == BIO_READ) { if (vm_page_all_valid(m)) rv = VM_PAGER_OK; Modified: head/sys/kern/kern_exec.c ============================================================================== --- head/sys/kern/kern_exec.c Fri Feb 28 20:33:28 2020 (r358446) +++ head/sys/kern/kern_exec.c Fri Feb 28 20:34:30 2020 (r358447) @@ -984,14 +984,16 @@ exec_map_first_page(struct image_params *imgp) object = imgp->vp->v_object; if (object == NULL) return (EACCES); - VM_OBJECT_WLOCK(object); #if VM_NRESERVLEVEL > 0 - vm_object_color(object, 0); + if ((object->flags & OBJ_COLORED) == 0) { + VM_OBJECT_WLOCK(object); + vm_object_color(object, 0); + VM_OBJECT_WUNLOCK(object); + } #endif - error = vm_page_grab_valid(&m, object, 0, + error = vm_page_grab_valid_unlocked(&m, object, 0, VM_ALLOC_COUNT(VM_INITIAL_PAGEIN) | VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED); - VM_OBJECT_WUNLOCK(object); if (error != VM_PAGER_OK) return (EIO); Modified: head/sys/kern/kern_sendfile.c ============================================================================== --- head/sys/kern/kern_sendfile.c Fri Feb 28 20:33:28 2020 (r358446) +++ head/sys/kern/kern_sendfile.c Fri Feb 28 20:34:30 2020 (r358447) @@ -350,6 +350,7 @@ sendfile_swapin(vm_object_t obj, struct sf_io *sfio, i { vm_page_t *pa = sfio->pa; int grabbed; + bool locked; *nios = 0; flags = (flags & SF_NODISKIO) ? VM_ALLOC_NOWAIT : 0; @@ -358,9 +359,9 @@ sendfile_swapin(vm_object_t obj, struct sf_io *sfio, i * First grab all the pages and wire them. Note that we grab * only required pages. Readahead pages are dealt with later. */ - VM_OBJECT_WLOCK(obj); + locked = false; - grabbed = vm_page_grab_pages(obj, OFF_TO_IDX(off), + grabbed = vm_page_grab_pages_unlocked(obj, OFF_TO_IDX(off), VM_ALLOC_NORMAL | VM_ALLOC_WIRED | flags, pa, npages); if (grabbed < npages) { for (int i = grabbed; i < npages; i++) @@ -380,6 +381,10 @@ sendfile_swapin(vm_object_t obj, struct sf_io *sfio, i i++; continue; } + if (!locked) { + VM_OBJECT_WLOCK(obj); + locked = true; + } /* * Next page is invalid. Check if it belongs to pager. It @@ -480,7 +485,8 @@ sendfile_swapin(vm_object_t obj, struct sf_io *sfio, i (*nios)++; } - VM_OBJECT_WUNLOCK(obj); + if (locked) + VM_OBJECT_WUNLOCK(obj); if (*nios == 0 && npages != 0) SFSTAT_INC(sf_noiocnt); Modified: head/sys/kern/vfs_bio.c ============================================================================== --- head/sys/kern/vfs_bio.c Fri Feb 28 20:33:28 2020 (r358446) +++ head/sys/kern/vfs_bio.c Fri Feb 28 20:34:30 2020 (r358447) @@ -3046,13 +3046,11 @@ vfs_vmio_extend(struct buf *bp, int desiredpages, int * deadlocks once allocbuf() is called after * pages are vfs_busy_pages(). */ - VM_OBJECT_WLOCK(obj); - (void)vm_page_grab_pages(obj, + (void)vm_page_grab_pages_unlocked(obj, OFF_TO_IDX(bp->b_offset) + bp->b_npages, VM_ALLOC_SYSTEM | VM_ALLOC_IGN_SBUSY | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED, &bp->b_pages[bp->b_npages], desiredpages - bp->b_npages); - VM_OBJECT_WUNLOCK(obj); bp->b_npages = desiredpages; } @@ -5237,11 +5235,13 @@ next_page:; } end_pages: - VM_OBJECT_WLOCK(object); redo = false; for (i = 0; i < count; i++) { - vm_page_sunbusy(ma[i]); - ma[i] = vm_page_grab(object, ma[i]->pindex, VM_ALLOC_NORMAL); + if (vm_page_busy_tryupgrade(ma[i]) == 0) { + vm_page_sunbusy(ma[i]); + ma[i] = vm_page_grab_unlocked(object, ma[i]->pindex, + VM_ALLOC_NORMAL); + } /* * Since the pages were only sbusy while neither the @@ -5259,7 +5259,6 @@ end_pages: if (!vm_page_all_valid(ma[i])) redo = true; } - VM_OBJECT_WUNLOCK(object); if (redo && error == 0) goto again; return (error != 0 ? VM_PAGER_ERROR : VM_PAGER_OK); Modified: head/sys/vm/vm_glue.c ============================================================================== --- head/sys/vm/vm_glue.c Fri Feb 28 20:33:28 2020 (r358446) +++ head/sys/vm/vm_glue.c Fri Feb 28 20:34:30 2020 (r358447) @@ -222,10 +222,8 @@ vm_imgact_hold_page(vm_object_t object, vm_ooffset_t o vm_pindex_t pindex; pindex = OFF_TO_IDX(offset); - VM_OBJECT_WLOCK(object); - (void)vm_page_grab_valid(&m, object, pindex, + (void)vm_page_grab_valid_unlocked(&m, object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED); - VM_OBJECT_WUNLOCK(object); return (m); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202002282034.01SKYUC0048237>