diff options
-rw-r--r-- | include/linux/hugetlb.h | 2 | ||||
-rw-r--r-- | mm/hugetlb.c | 10 |
2 files changed, 12 insertions, 0 deletions
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 8104e5af75ab..24968790bc3e 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
@@ -168,6 +168,8 @@ struct file *hugetlb_file_setup(const char *name, size_t); | |||
168 | int hugetlb_get_quota(struct address_space *mapping, long delta); | 168 | int hugetlb_get_quota(struct address_space *mapping, long delta); |
169 | void hugetlb_put_quota(struct address_space *mapping, long delta); | 169 | void hugetlb_put_quota(struct address_space *mapping, long delta); |
170 | 170 | ||
171 | #define BLOCKS_PER_HUGEPAGE (HPAGE_SIZE / 512) | ||
172 | |||
171 | static inline int is_file_hugepages(struct file *file) | 173 | static inline int is_file_hugepages(struct file *file) |
172 | { | 174 | { |
173 | if (file->f_op == &hugetlbfs_file_operations) | 175 | if (file->f_op == &hugetlbfs_file_operations) |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index abe1e9f2a942..6121b57bbe96 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -801,6 +801,7 @@ retry: | |||
801 | 801 | ||
802 | if (vma->vm_flags & VM_SHARED) { | 802 | if (vma->vm_flags & VM_SHARED) { |
803 | int err; | 803 | int err; |
804 | struct inode *inode = mapping->host; | ||
804 | 805 | ||
805 | err = add_to_page_cache(page, mapping, idx, GFP_KERNEL); | 806 | err = add_to_page_cache(page, mapping, idx, GFP_KERNEL); |
806 | if (err) { | 807 | if (err) { |
@@ -809,6 +810,10 @@ retry: | |||
809 | goto retry; | 810 | goto retry; |
810 | goto out; | 811 | goto out; |
811 | } | 812 | } |
813 | |||
814 | spin_lock(&inode->i_lock); | ||
815 | inode->i_blocks += BLOCKS_PER_HUGEPAGE; | ||
816 | spin_unlock(&inode->i_lock); | ||
812 | } else | 817 | } else |
813 | lock_page(page); | 818 | lock_page(page); |
814 | } | 819 | } |
@@ -1160,6 +1165,11 @@ int hugetlb_reserve_pages(struct inode *inode, long from, long to) | |||
1160 | void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed) | 1165 | void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed) |
1161 | { | 1166 | { |
1162 | long chg = region_truncate(&inode->i_mapping->private_list, offset); | 1167 | long chg = region_truncate(&inode->i_mapping->private_list, offset); |
1168 | |||
1169 | spin_lock(&inode->i_lock); | ||
1170 | inode->i_blocks -= BLOCKS_PER_HUGEPAGE * freed; | ||
1171 | spin_unlock(&inode->i_lock); | ||
1172 | |||
1163 | hugetlb_put_quota(inode->i_mapping, (chg - freed)); | 1173 | hugetlb_put_quota(inode->i_mapping, (chg - freed)); |
1164 | hugetlb_acct_memory(-(chg - freed)); | 1174 | hugetlb_acct_memory(-(chg - freed)); |
1165 | } | 1175 | } |