MCPcopy Create free account
hub / github.com/F-Stack/f-stack / shm_map

Function shm_map

freebsd/kern/uipc_shm.c:1680–1732  ·  view source on GitHub ↗

* Helper routines to allow the backing object of a shared memory file * descriptor to be mapped in the kernel. */

Source from the content-addressed store, hash-verified

1678 * descriptor to be mapped in the kernel.
1679 */
1680int
1681shm_map(struct file *fp, size_t size, off_t offset, void **memp)
1682{
1683 struct shmfd *shmfd;
1684 vm_offset_t kva, ofs;
1685 vm_object_t obj;
1686 int rv;
1687
1688 if (fp->f_type != DTYPE_SHM)
1689 return (EINVAL);
1690 shmfd = fp->f_data;
1691 obj = shmfd->shm_object;
1692 VM_OBJECT_WLOCK(obj);
1693 /*
1694 * XXXRW: This validation is probably insufficient, and subject to
1695 * sign errors. It should be fixed.
1696 */
1697 if (offset >= shmfd->shm_size ||
1698 offset + size > round_page(shmfd->shm_size)) {
1699 VM_OBJECT_WUNLOCK(obj);
1700 return (EINVAL);
1701 }
1702
1703 shmfd->shm_kmappings++;
1704 vm_object_reference_locked(obj);
1705 VM_OBJECT_WUNLOCK(obj);
1706
1707 /* Map the object into the kernel_map and wire it. */
1708 kva = vm_map_min(kernel_map);
1709 ofs = offset & PAGE_MASK;
1710 offset = trunc_page(offset);
1711 size = round_page(size + ofs);
1712 rv = vm_map_find(kernel_map, obj, offset, &kva, size, 0,
1713 VMFS_OPTIMAL_SPACE, VM_PROT_READ | VM_PROT_WRITE,
1714 VM_PROT_READ | VM_PROT_WRITE, 0);
1715 if (rv == KERN_SUCCESS) {
1716 rv = vm_map_wire(kernel_map, kva, kva + size,
1717 VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES);
1718 if (rv == KERN_SUCCESS) {
1719 *memp = (void *)(kva + ofs);
1720 return (0);
1721 }
1722 vm_map_remove(kernel_map, kva, kva + size);
1723 } else
1724 vm_object_deallocate(obj);
1725
1726 /* On failure, drop our mapping reference. */
1727 VM_OBJECT_WLOCK(obj);
1728 shmfd->shm_kmappings--;
1729 VM_OBJECT_WUNLOCK(obj);
1730
1731 return (vm_mmap_to_errno(rv));
1732}
1733
1734/*
1735 * We require the caller to unmap the entire entry. This allows us to

Callers

nothing calls this directly

Calls 7

vm_map_minFunction · 0.85
vm_map_findFunction · 0.85
vm_map_wireFunction · 0.85
vm_map_removeFunction · 0.85
vm_object_deallocateFunction · 0.85
vm_mmap_to_errnoFunction · 0.85

Tested by

no test coverage detected