From owner-svn-src-projects@FreeBSD.ORG Wed Oct 27 23:21:31 2010 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 06B281065674; Wed, 27 Oct 2010 23:21:31 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E8D7B8FC08; Wed, 27 Oct 2010 23:21:30 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o9RNLU3W043726; Wed, 27 Oct 2010 23:21:30 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o9RNLU1m043721; Wed, 27 Oct 2010 23:21:30 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201010272321.o9RNLU1m043721@svn.freebsd.org> From: Jeff Roberson Date: Wed, 27 Oct 2010 23:21:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r214436 - in projects/ofed/head/sys: ofed/drivers/infiniband/core ofed/drivers/infiniband/hw/mthca vm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Oct 2010 23:21:31 -0000 Author: jeff Date: Wed Oct 27 23:21:30 2010 New Revision: 214436 URL: http://svn.freebsd.org/changeset/base/214436 Log: - Add a new flag to vm_map_wire(), VM_MAP_WIRE_WRITE which checks for write access when adding a wired region. This is required when ib's umem requests write access. Sponsored by: Isilon Systems, iX Systems, and Panasas. Modified: projects/ofed/head/sys/ofed/drivers/infiniband/core/umem.c projects/ofed/head/sys/ofed/drivers/infiniband/hw/mthca/mthca_memfree.c projects/ofed/head/sys/vm/vm_map.c projects/ofed/head/sys/vm/vm_map.h Modified: projects/ofed/head/sys/ofed/drivers/infiniband/core/umem.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/infiniband/core/umem.c Wed Oct 27 23:18:25 2010 (r214435) +++ projects/ofed/head/sys/ofed/drivers/infiniband/core/umem.c Wed Oct 27 23:21:30 2010 (r214436) @@ -327,7 +327,8 @@ out: return ERR_PTR(-EAGAIN); } error = vm_map_wire(&proc->p_vmspace->vm_map, start, end, - VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES); + VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES | + umem->writable ? VM_MAP_WIRE_WRITE : 0); if (error != KERN_SUCCESS) { kfree(umem); return ERR_PTR(-ENOMEM); Modified: projects/ofed/head/sys/ofed/drivers/infiniband/hw/mthca/mthca_memfree.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/infiniband/hw/mthca/mthca_memfree.c Wed Oct 27 23:18:25 2010 (r214435) +++ projects/ofed/head/sys/ofed/drivers/infiniband/hw/mthca/mthca_memfree.c Wed Oct 27 23:21:30 2010 (r214436) @@ -564,8 +564,7 @@ out: } start = uaddr & PAGE_MASK; ret = vm_map_wire(&proc->p_vmspace->vm_map, start, start + PAGE_SIZE, - VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES /* | VM_MAP_WIRE_READ | - VM_MAP_WIRE_WRITE */); + VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES | VM_MAP_WIRE_WRITE); if (ret != KERN_SUCCESS) { start = 0; ret = -ENOMEM; Modified: projects/ofed/head/sys/vm/vm_map.c ============================================================================== --- projects/ofed/head/sys/vm/vm_map.c Wed Oct 27 23:18:25 2010 (r214435) +++ projects/ofed/head/sys/vm/vm_map.c Wed Oct 27 23:21:30 2010 (r214436) @@ -2299,7 +2299,11 @@ vm_map_wire(vm_map_t map, vm_offset_t st unsigned int last_timestamp; int rv; boolean_t fictitious, need_wakeup, result, user_wire; + vm_prot_t prot; + prot = VM_PROT_READ | VM_PROT_EXECUTE; + if (flags & VM_MAP_WIRE_WRITE) + prot |= VM_PROT_WRITE; user_wire = (flags & VM_MAP_WIRE_USER) ? TRUE : FALSE; vm_map_lock(map); VM_MAP_RANGE_CHECK(map, start, end); @@ -2367,20 +2371,16 @@ vm_map_wire(vm_map_t map, vm_offset_t st * above.) */ entry->eflags |= MAP_ENTRY_IN_TRANSITION; - /* - * - */ - if (entry->wired_count == 0) { - if ((entry->protection & (VM_PROT_READ|VM_PROT_EXECUTE)) - == 0) { - entry->eflags |= MAP_ENTRY_WIRE_SKIPPED; - if ((flags & VM_MAP_WIRE_HOLESOK) == 0) { - end = entry->end; - rv = KERN_INVALID_ADDRESS; - goto done; - } - goto next_entry; + if ((entry->protection & prot) != prot) { + entry->eflags |= MAP_ENTRY_WIRE_SKIPPED; + if ((flags & VM_MAP_WIRE_HOLESOK) == 0) { + end = entry->end; + rv = KERN_INVALID_ADDRESS; + goto done; } + goto next_entry; + } + if (entry->wired_count == 0) { entry->wired_count++; saved_start = entry->start; saved_end = entry->end; Modified: projects/ofed/head/sys/vm/vm_map.h ============================================================================== --- projects/ofed/head/sys/vm/vm_map.h Wed Oct 27 23:18:25 2010 (r214435) +++ projects/ofed/head/sys/vm/vm_map.h Wed Oct 27 23:21:30 2010 (r214436) @@ -339,6 +339,8 @@ long vmspace_wired_count(struct vmspace #define VM_MAP_WIRE_NOHOLES 0 /* region must not have holes */ #define VM_MAP_WIRE_HOLESOK 2 /* region may have holes */ +#define VM_MAP_WIRE_WRITE 4 /* Validate writable. */ + #ifdef _KERNEL boolean_t vm_map_check_protection (vm_map_t, vm_offset_t, vm_offset_t, vm_prot_t); vm_map_t vm_map_create(pmap_t, vm_offset_t, vm_offset_t);