shmem: split huge pages beyond i_size under memory pressure
Even if user asked to allocate huge pages always (huge=always), we should be able to free up some memory by splitting pages which are partly byound i_size if memory presure comes or once we hit limit on filesystem size (-o size=). In order to do this we maintain per-superblock list of inodes, which potentially have huge pages on the border of file size. Per-fs shrinker can reclaim memory by splitting such pages. If we hit -ENOSPC during shmem_getpage_gfp(), we try to split a page to free up space on the filesystem and retry allocation if it succeed. Link: http://lkml.kernel.org/r/1466021202-61880-37-git-send-email-kirill.shutemov@linux.intel.com Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
e496cf3d78
commit
779750d20b
@@ -16,8 +16,9 @@ struct shmem_inode_info {
|
||||
unsigned long flags;
|
||||
unsigned long alloced; /* data pages alloced to file */
|
||||
unsigned long swapped; /* subtotal assigned to swap */
|
||||
struct shared_policy policy; /* NUMA memory alloc policy */
|
||||
struct list_head shrinklist; /* shrinkable hpage inodes */
|
||||
struct list_head swaplist; /* chain of maybes on swap */
|
||||
struct shared_policy policy; /* NUMA memory alloc policy */
|
||||
struct simple_xattrs xattrs; /* list of xattrs */
|
||||
struct inode vfs_inode;
|
||||
};
|
||||
@@ -33,6 +34,9 @@ struct shmem_sb_info {
|
||||
kuid_t uid; /* Mount uid for root directory */
|
||||
kgid_t gid; /* Mount gid for root directory */
|
||||
struct mempolicy *mpol; /* default memory policy for mappings */
|
||||
spinlock_t shrinklist_lock; /* Protects shrinklist */
|
||||
struct list_head shrinklist; /* List of shinkable inodes */
|
||||
unsigned long shrinklist_len; /* Length of shrinklist */
|
||||
};
|
||||
|
||||
static inline struct shmem_inode_info *SHMEM_I(struct inode *inode)
|
||||
|
Reference in New Issue
Block a user