diff options
author | Andrew Morton <akpm@digeo.com> | 2003-04-20 00:29:05 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@home.transmeta.com> | 2003-04-20 00:29:05 -0700 |
commit | 88bdd4c3d1faed465755e2b0f5b9c34352693ac5 (patch) | |
tree | 039c2498b453f233160a1d94b92ba9df76004d6c /ipc | |
parent | d7b557d1e7b8069a0ce6125a774cf9264901a957 (diff) | |
download | history-88bdd4c3d1faed465755e2b0f5b9c34352693ac5.tar.gz |
[PATCH] shm_get_stat-handle-hugetlb-pages.patch
From: William Lee Irwin III <wli@holomorphy.com>
shm_get_stat() didn't know about hugetlbpage-backed shm.
Diffstat (limited to 'ipc')
-rw-r--r-- | ipc/shm.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/ipc/shm.c b/ipc/shm.c index c822dc7872f59d..19c06135b18479 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -361,27 +361,35 @@ static inline unsigned long copy_shminfo_to_user(void *buf, struct shminfo64 *in } } -static void shm_get_stat (unsigned long *rss, unsigned long *swp) +static void shm_get_stat(unsigned long *rss, unsigned long *swp) { - struct shmem_inode_info *info; int i; *rss = 0; *swp = 0; - for(i = 0; i <= shm_ids.max_id; i++) { - struct shmid_kernel* shp; - struct inode * inode; + for (i = 0; i <= shm_ids.max_id; i++) { + struct shmid_kernel *shp; + struct inode *inode; shp = shm_get(i); - if(shp == NULL) + if(!shp) continue; + inode = shp->shm_file->f_dentry->d_inode; - info = SHMEM_I(inode); - spin_lock (&info->lock); - *rss += inode->i_mapping->nrpages; - *swp += info->swapped; - spin_unlock (&info->lock); + + if (is_file_hugepages(shp->shm_file)) { + struct address_space *mapping = inode->i_mapping; + spin_lock(&mapping->page_lock); + *rss += (HPAGE_SIZE/PAGE_SIZE)*mapping->nrpages; + spin_unlock(&mapping->page_lock); + } else { + struct shmem_inode_info *info = SHMEM_I(inode); + spin_lock(&info->lock); + *rss += inode->i_mapping->nrpages; + *swp += info->swapped; + spin_unlock(&info->lock); + } } } |