2011-07-10 4 views
0

Je veux obtenir une liste de tous les PFN qui appartiennent à la pagecache. Une façon est de parcourir chaque fichier/inode ouvert et obtenir les pages address_space. Existe-t-il un moyen plus simple? Impossible de trouver une grande liste de cache-pages. Y at-il une telle liste/API que je peux utiliser?Liste de cache de pages Linux

Répondre

0

oui, quelque chose comme ce que vous avez dit - le pointeur adresse_space est appelé i_mapping pour un inode.

Ainsi, par exemple, à l'intérieur fs/drop_cache.c est une fonction qui énumèrent tous les pagecache pour un superbloc:

static void drop_pagecache_sb(struct super_block *sb, void *unused) 
{ 
     struct inode *inode, *toput_inode = NULL; 

     spin_lock(&inode_sb_list_lock); 
     list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { 
       spin_lock(&inode->i_lock); 
       if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) || 
        (inode->i_mapping->nrpages == 0)) { 
         spin_unlock(&inode->i_lock); 
         continue; 
       } 
       __iget(inode); 
       spin_unlock(&inode->i_lock); 
       spin_unlock(&inode_sb_list_lock); 
       invalidate_mapping_pages(inode->i_mapping, 0, -1); 
       iput(toput_inode); 
       toput_inode = inode; 
       spin_lock(&inode_sb_list_lock); 
     } 
     spin_unlock(&inode_sb_list_lock); 
     iput(toput_inode); 
} 

Ainsi, au lieu d'appeler « invalidate_mapping_pages() » utilisera le pointeur de i_mapping d'énumérer tous le composant pagecache.

En ce qui concerne les blocs enumerate, et donc l'identification PFN de la page, u pouvez suivre cette ici:

http://www.makelinux.net/books/ulk3/understandlk-CHP-15-SECT-2#understandlk-CHP-15-SECT-2.6

(15.2.6. Recherche blocs dans la cache de page).