Date: Wed, 27 Oct 2010 23:21:30 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r214436 - in projects/ofed/head/sys: ofed/drivers/infiniband/core ofed/drivers/infiniband/hw/mthca vm Message-ID: <201010272321.o9RNLU1m043721@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201010272321.o9RNLU1m043721>