From ceebf63bc278df3bf7e758fe59c35eeefb244a62 Mon Sep 17 00:00:00 2001 From: Ken Chen Date: Wed, 14 Nov 2007 16:59:44 -0800 Subject: [PATCH] --- yaml --- r: 73702 b: refs/heads/master c: 45c682a68a87251d9a01383ce076ab21ee09812e h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/linux/hugetlb.h | 2 ++ trunk/mm/hugetlb.c | 10 ++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 5e74be0e73b8..15d2d951a883 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8cde045c7ee97573be6ce495b8f7c918182a2c7a +refs/heads/master: 45c682a68a87251d9a01383ce076ab21ee09812e diff --git a/trunk/include/linux/hugetlb.h b/trunk/include/linux/hugetlb.h index 8104e5af75ab..24968790bc3e 100644 --- a/trunk/include/linux/hugetlb.h +++ b/trunk/include/linux/hugetlb.h @@ -168,6 +168,8 @@ struct file *hugetlb_file_setup(const char *name, size_t); int hugetlb_get_quota(struct address_space *mapping, long delta); void hugetlb_put_quota(struct address_space *mapping, long delta); +#define BLOCKS_PER_HUGEPAGE (HPAGE_SIZE / 512) + static inline int is_file_hugepages(struct file *file) { if (file->f_op == &hugetlbfs_file_operations) diff --git a/trunk/mm/hugetlb.c b/trunk/mm/hugetlb.c index abe1e9f2a942..6121b57bbe96 100644 --- a/trunk/mm/hugetlb.c +++ b/trunk/mm/hugetlb.c @@ -801,6 +801,7 @@ static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, if (vma->vm_flags & VM_SHARED) { int err; + struct inode *inode = mapping->host; err = add_to_page_cache(page, mapping, idx, GFP_KERNEL); if (err) { @@ -809,6 +810,10 @@ static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, goto retry; goto out; } + + spin_lock(&inode->i_lock); + inode->i_blocks += BLOCKS_PER_HUGEPAGE; + spin_unlock(&inode->i_lock); } else lock_page(page); } @@ -1160,6 +1165,11 @@ int hugetlb_reserve_pages(struct inode *inode, long from, long to) void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed) { long chg = region_truncate(&inode->i_mapping->private_list, offset); + + spin_lock(&inode->i_lock); + inode->i_blocks -= BLOCKS_PER_HUGEPAGE * freed; + spin_unlock(&inode->i_lock); + hugetlb_put_quota(inode->i_mapping, (chg - freed)); hugetlb_acct_memory(-(chg - freed)); }