このページを編集する際は、編集に関する方針に従ってください。

概要

  • linux2.6/mm/rmap.cにて定義
  • ファイルにマッピングされたページの参照数を返す

引数

実装

/**

* page_referenced_file - referenced check for object-based rmap
* @page: the page we're checking references on.
*
* For an object-based mapped page, find all the places it is mapped and
* check/clear the referenced flag.  This is done by following the page->mapping
* pointer, then walking the chain of vmas it holds.  It returns the number
* of references it found.
*
* This function is only called from page_referenced for object-based pages.
*/

static int page_referenced_file(struct page *page, int ignore_token) {

	unsigned int mapcount;
  • pageがアドレス空間にマップされている数を格納
	struct address_space *mapping = page->mapping;
  • アドレス空間オブジェクト
    • ページキャッシュを構成する構造体
      • ページキャッシュはinode番号とファイルオフセットをインデックスとするファイルのキャッシュである
    • address_space/linux2.6を参照
	pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT);
	struct vm_area_struct *vma;
	struct prio_tree_iter iter;
	int referenced = 0;
  • ページの参照数を格納する
	/*
	 * The caller's checks on page->mapping and !PageAnon have made
	 * sure that this is a file page: the check for page->mapping
	 * excludes the case just before it gets set on an anon page.
	 */
	BUG_ON(PageAnon(page));
  • pageが無名ページならバグである
  • ページpageがユーザ仮想メモリにマッピングされている場合、1を返して終了
	/*
	 * The page lock not only makes sure that page->mapping cannot
	 * suddenly be NULLified by truncation, it makes sure that the
	 * structure at mapping cannot be freed and reused yet,
	 * so we can safely take mapping->i_mmap_lock.
	 */
	BUG_ON(!PageLocked(page));
  • pegeがロックされていない場合はバグである
  • ページpageがロックされている場合は1を、ロックされていない場合は0を返す
	spin_lock(&mapping->i_mmap_lock);
  • スピンロックmapping->i_mmap_lockの取得を試みる
    • ロックの取得に失敗した場合は待ち状態に入る
    • 詳細はspin_lock()/linux2.6を参照
	/*
	 * i_mmap_lock does not stabilize mapcount at all, but mapcount
	 * is more likely to be accurate if we note it after spinning.
	 */
	mapcount = page_mapcount(page);
	vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) {
  • 優先度ツリー内のメモリリージョンを走査する
		if ((vma->vm_flags & (VM_LOCKED|VM_MAYSHARE))
				  == (VM_LOCKED|VM_MAYSHARE)) {
  • vmaが共有されている場合:
    • 参照カウントをインクリメントして繰り返しを抜ける
			referenced++;
			break;
		}
		referenced += page_referenced_one(page, vma, &mapcount,
							ignore_token);
		if (!mapcount)
			break;
	}
	spin_unlock(&mapping->i_mmap_lock);
  • スピンロックmapping->i_mmap_lockの開放を行う。プリエンプション機能を有効にし、可能であれば自ら積極的にプリエンプション(実行権の移譲を行うこと)する
	return referenced;

}

呼出元


履歴

  • 作者:ひら
  • 日付:2005/11/28
  • 対象:2.6.10
    更新日更新者更新内容

コメント



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-11-24 (火) 07:16:41 (2861d)