shmem: fixup memory reservation during truncating
Subsystems (2)
PATCH 1/1 shmem: fixup memory reservation during truncating
Shared anon mappings created without MAP_NORESERVE may hold reservation of memory commitment for whole size of shmem segment. There was no way to change that size, but recently introduced 'map_files' in proc allows to do that. This patch adjust memory reservation in shmem_setattr() during truncating.
Signed-off-by Konstantin Khlebnikov <[email protected]>
--- mm/shmem.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
mm/shmem.c +17 -0
@@ -148,6 +148,19 @@ static inline void shmem_unacct_size(unsigned long flags, loff_t size)vm_unacct_memory (VM_ACCT (size)); } +static inline int shmem_reacct_size (unsigned long flags, +loff_t oldsize,loff_t newsize) +{ +if (!(flags &VM_NORESERVE )) { +if (VM_ACCT (newsize) >VM_ACCT (oldsize)) +return security_vm_enough_memory_mm (current->mm, +VM_ACCT (newsize) -VM_ACCT (oldsize)); +else if (VM_ACCT (newsize) <VM_ACCT (oldsize)) +vm_unacct_memory (VM_ACCT (oldsize) -VM_ACCT (newsize)); + } +return 0 ; +} +/* * ... whereas tmpfs objects are accounted incrementally as * pages are allocated, in order to allow huge sparse files.
@@ -607,6 +620,10 @@ static int shmem_setattr(struct dentry *dentry, struct iattr *attr)loff_t newsize = attr->ia_size;if (newsize != oldsize) { + error =shmem_reacct_size (SHMEM_I (inode)->flags, + oldsize, newsize); +if (error) +return error;i_size_write (inode, newsize); inode->i_ctime = inode->i_mtime =CURRENT_TIME ; }
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>