From owner-svn-src-all@freebsd.org Sat Oct 20 23:08:05 2018 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 64244FF9EBB; Sat, 20 Oct 2018 23:08:05 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 0D7448F418; Sat, 20 Oct 2018 23:08:05 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id EE6C824B73; Sat, 20 Oct 2018 23:08:04 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w9KN84a7087759; Sat, 20 Oct 2018 23:08:04 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w9KN84Qg087758; Sat, 20 Oct 2018 23:08:04 GMT (envelope-from kib@FreeBSD.org) Message-Id: <201810202308.w9KN84Qg087758@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Sat, 20 Oct 2018 23:08:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r339506 - head/sys/vm X-SVN-Group: head X-SVN-Commit-Author: kib X-SVN-Commit-Paths: head/sys/vm X-SVN-Commit-Revision: 339506 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 20 Oct 2018 23:08:05 -0000 Author: kib Date: Sat Oct 20 23:08:04 2018 New Revision: 339506 URL: https://svnweb.freebsd.org/changeset/base/339506 Log: Reduce code duplication in merging vm_entry neighbors. Submitted by: Doug Moore Reviewed by: markj MFC after: 1 week Differential revision: https://reviews.freebsd.org/D17610 Modified: head/sys/vm/vm_map.c Modified: head/sys/vm/vm_map.c ============================================================================== --- head/sys/vm/vm_map.c Sat Oct 20 22:39:35 2018 (r339505) +++ head/sys/vm/vm_map.c Sat Oct 20 23:08:04 2018 (r339506) @@ -1643,6 +1643,49 @@ vm_map_find_min(vm_map_t map, vm_object_t object, vm_o } } +static bool +vm_map_mergeable_neighbors(vm_map_entry_t prev, vm_map_entry_t entry) +{ + vm_size_t prevsize; + + prevsize = prev->end - prev->start; + return (prev->end == entry->start && + prev->object.vm_object == entry->object.vm_object && + (prev->object.vm_object == NULL || + prev->offset + prevsize == entry->offset) && + prev->eflags == entry->eflags && + prev->protection == entry->protection && + prev->max_protection == entry->max_protection && + prev->inheritance == entry->inheritance && + prev->wired_count == entry->wired_count && + prev->cred == entry->cred); +} + +static void +vm_map_merged_neighbor_dispose(vm_map_t map, vm_map_entry_t entry) +{ + + /* + * If the backing object is a vnode object, + * vm_object_deallocate() calls vrele(). + * However, vrele() does not lock the vnode + * because the vnode has additional + * references. Thus, the map lock can be kept + * without causing a lock-order reversal with + * the vnode lock. + * + * Since we count the number of virtual page + * mappings in object->un_pager.vnp.writemappings, + * the writemappings value should not be adjusted + * when the entry is disposed of. + */ + if (entry->object.vm_object != NULL) + vm_object_deallocate(entry->object.vm_object); + if (entry->cred != NULL) + crfree(entry->cred); + vm_map_entry_dispose(map, entry); +} + /* * vm_map_simplify_entry: * @@ -1659,7 +1702,6 @@ void vm_map_simplify_entry(vm_map_t map, vm_map_entry_t entry) { vm_map_entry_t next, prev; - vm_size_t prevsize, esize; if ((entry->eflags & (MAP_ENTRY_GROWS_DOWN | MAP_ENTRY_GROWS_UP | MAP_ENTRY_IN_TRANSITION | MAP_ENTRY_IS_SUB_MAP)) != 0) @@ -1667,70 +1709,23 @@ vm_map_simplify_entry(vm_map_t map, vm_map_entry_t ent prev = entry->prev; if (prev != &map->header) { - prevsize = prev->end - prev->start; - if ( (prev->end == entry->start) && - (prev->object.vm_object == entry->object.vm_object) && - (!prev->object.vm_object || - (prev->offset + prevsize == entry->offset)) && - (prev->eflags == entry->eflags) && - (prev->protection == entry->protection) && - (prev->max_protection == entry->max_protection) && - (prev->inheritance == entry->inheritance) && - (prev->wired_count == entry->wired_count) && - (prev->cred == entry->cred)) { + if (vm_map_mergeable_neighbors(prev, entry)) { vm_map_entry_unlink(map, prev); entry->start = prev->start; entry->offset = prev->offset; if (entry->prev != &map->header) vm_map_entry_resize_free(map, entry->prev); - - /* - * If the backing object is a vnode object, - * vm_object_deallocate() calls vrele(). - * However, vrele() does not lock the vnode - * because the vnode has additional - * references. Thus, the map lock can be kept - * without causing a lock-order reversal with - * the vnode lock. - * - * Since we count the number of virtual page - * mappings in object->un_pager.vnp.writemappings, - * the writemappings value should not be adjusted - * when the entry is disposed of. - */ - if (prev->object.vm_object) - vm_object_deallocate(prev->object.vm_object); - if (prev->cred != NULL) - crfree(prev->cred); - vm_map_entry_dispose(map, prev); + vm_map_merged_neighbor_dispose(map, prev); } } next = entry->next; if (next != &map->header) { - esize = entry->end - entry->start; - if ((entry->end == next->start) && - (next->object.vm_object == entry->object.vm_object) && - (!entry->object.vm_object || - (entry->offset + esize == next->offset)) && - (next->eflags == entry->eflags) && - (next->protection == entry->protection) && - (next->max_protection == entry->max_protection) && - (next->inheritance == entry->inheritance) && - (next->wired_count == entry->wired_count) && - (next->cred == entry->cred)) { + if (vm_map_mergeable_neighbors(entry, next)) { vm_map_entry_unlink(map, next); entry->end = next->end; vm_map_entry_resize_free(map, entry); - - /* - * See comment above. - */ - if (next->object.vm_object) - vm_object_deallocate(next->object.vm_object); - if (next->cred != NULL) - crfree(next->cred); - vm_map_entry_dispose(map, next); + vm_map_merged_neighbor_dispose(map, next); } } }