![Robert Love](/assets/img/avatar_default.png)
The anonymous shared memory (ashmem) subsystem provides a Unix-y,file-based shared memory interface to user-space. It works like anonymous memory (e.g. mmapping fd=0) except if you share the file descriptor via the usual means, you will share the mapping. The shared memory can be accessed via both mmap or file I/O. The backing store is a simple shmem file. Additionally, ashmem introduces the concept of page pinning. Pinned pages (the default) behave like any anonymous memory. Unpinned pages are available to the kernel for eviction during VM pressure. When repinning the pages, the return value instructs user-space as to any eviction. In this manner, user-space processes may implement caching and similar resource management that efficiently integrates with kernel memory management. Signed-off-by: Robert Love <rlove@google.com> ashmem: Don't install fault handler for private mmaps. Ashmem is used to create named private heaps. If this heap is backed by a tmpfs file it will allocate two pages for every page touched. In 2.6.27, the extra page would later be freed, but 2.6.29 does not scan anonymous pages when running without swap so the memory is not freed while the file is referenced. This change changes the behavior of private ashmem mmaps to match /dev/zero instead tmpfs. Signed-off-by: Arve Hjønnevåg <arve@android.com> ashmem: Add common prefix to name reported in /proc/pid/maps Signed-off-by: Arve Hjønnevåg <arve@android.com> ashmem: don't require a page aligned size This makes ashmem more similar to shmem and mmap, by not requiring the specified size to be page aligned, instead rounding it internally as needed. Signed-off-by: Marco Nelissen <marcone@android.com> [jstultz: Improved commit subject and included patch description from rlove. Also moved ashmem files to staging dir, and reworked code to avoid touching mm/shmem.c while we're in staging.] CC: Brian Swetland <swetland@google.com> CC: Colin Cross <ccross@android.com> CC: Arve Hjønnevåg <arve@android.com> CC: Dima Zavin <dima@android.com> CC: Robert Love <rlove@google.com> Signed-off-by: John Stultz <john.stultz@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
49 lines
1.4 KiB
C
49 lines
1.4 KiB
C
/*
|
|
* include/linux/ashmem.h
|
|
*
|
|
* Copyright 2008 Google Inc.
|
|
* Author: Robert Love
|
|
*
|
|
* This file is dual licensed. It may be redistributed and/or modified
|
|
* under the terms of the Apache 2.0 License OR version 2 of the GNU
|
|
* General Public License.
|
|
*/
|
|
|
|
#ifndef _LINUX_ASHMEM_H
|
|
#define _LINUX_ASHMEM_H
|
|
|
|
#include <linux/limits.h>
|
|
#include <linux/ioctl.h>
|
|
|
|
#define ASHMEM_NAME_LEN 256
|
|
|
|
#define ASHMEM_NAME_DEF "dev/ashmem"
|
|
|
|
/* Return values from ASHMEM_PIN: Was the mapping purged while unpinned? */
|
|
#define ASHMEM_NOT_PURGED 0
|
|
#define ASHMEM_WAS_PURGED 1
|
|
|
|
/* Return values from ASHMEM_GET_PIN_STATUS: Is the mapping pinned? */
|
|
#define ASHMEM_IS_UNPINNED 0
|
|
#define ASHMEM_IS_PINNED 1
|
|
|
|
struct ashmem_pin {
|
|
__u32 offset; /* offset into region, in bytes, page-aligned */
|
|
__u32 len; /* length forward from offset, in bytes, page-aligned */
|
|
};
|
|
|
|
#define __ASHMEMIOC 0x77
|
|
|
|
#define ASHMEM_SET_NAME _IOW(__ASHMEMIOC, 1, char[ASHMEM_NAME_LEN])
|
|
#define ASHMEM_GET_NAME _IOR(__ASHMEMIOC, 2, char[ASHMEM_NAME_LEN])
|
|
#define ASHMEM_SET_SIZE _IOW(__ASHMEMIOC, 3, size_t)
|
|
#define ASHMEM_GET_SIZE _IO(__ASHMEMIOC, 4)
|
|
#define ASHMEM_SET_PROT_MASK _IOW(__ASHMEMIOC, 5, unsigned long)
|
|
#define ASHMEM_GET_PROT_MASK _IO(__ASHMEMIOC, 6)
|
|
#define ASHMEM_PIN _IOW(__ASHMEMIOC, 7, struct ashmem_pin)
|
|
#define ASHMEM_UNPIN _IOW(__ASHMEMIOC, 8, struct ashmem_pin)
|
|
#define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9)
|
|
#define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10)
|
|
|
|
#endif /* _LINUX_ASHMEM_H */
|