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

概要

  • mm/page_alloc.cにて定義
  • CPU固有のページキャッシュへ、ページを解放する
    • CPU固有のページキャッシュは、CPUごとにcoldキャッシュとhotキャッシュの2つを持つ
      • hotキャッシュ:頻繁に使用されるページ
      • coldキャッシュ:使用頻度が低いページ
    • 原則、解放はhotキャッシュに対して行われる

引数

  • page--解放するページ
  • cold--coldキャッシュ/hotキャッシュ
    • 0: hot
    • 1: cold

実装

/*

* Free a 0-order page
*/

static void FASTCALL(free_hot_cold_page(struct page *page, int cold));

static void fastcall free_hot_cold_page(struct page *page, int cold) {

	struct zone *zone = page_zone(page);
  • ページpageがどのゾーンに属しているか調べ、そのゾーンを返す
	struct per_cpu_pages *pcp;
	unsigned long flags;
	arch_free_page(page, 0);
  • arch_free_page()はx86系では処理は行われない
	kernel_map_pages(page, 1, 0);
  • デバッグ時(CONFIG_DEBUG_PAGEALLOC)のみ処理を行う。通常は処理は行わない。
	inc_page_state(pgfree);
	if (PageAnon(page))
		page->mapping = NULL;
  • pageがユーザ仮想メモリにマッピングされている場合はpage->mappingにNULLを設定する
  • pageがユーザ仮想メモリにマッピングされている場合、1を返す
	free_pages_check(__FUNCTION__, page);
  • 利用可能(フリー)ページpageをチェックする
  • __FUNCTION__はこの関数の関数名が入る
	pcp = &zone->pageset[get_cpu()].pcp[cold];
  • プリエンプティブ不可にしてCPU識別子を返す
	local_irq_save(flags);
  • この関数を呼び出したCPUの割り込み禁止/許可状態(EFLAGSレジスタ)を、flagsに保存する
	if (pcp->count >= pcp->high)
		pcp->count -= free_pages_bulk(zone, pcp->batch, &pcp->list, 0);
  • CPU固有のページキャッシュのキャッシュ数がしきい値より大きくなった場合は、キャッシュしているページを一定の数、バディシステムへ返す
  • バディシステムへCPU固有のページキャッシュpcp->listのページ群(pcp->batch個のページ)の解放を試みる
  • CPU固有のページキャッシュのページ数pcp->countから解放されたページ数を減算する
	list_add(&page->lru, &pcp->list);
  • CPU固有のページキャッシュへpageを追加する
  • リスト上のエントリpcp->listの前にエントリpage->lruを挿入する
	pcp->count++;
  • CPU固有のページキャッシュのキャッシュ数を1増やす
	local_irq_restore(flags);
  • この関数を呼び出したCPUの割り込み禁止/許可状態(EFLAGSレジスタ)を、flagsに設定する
	put_cpu();
  • プリエンプション機能を有効にし、可能であれば自ら積極的にプリエンプション(実行権の移譲を行うこと)する

}

呼出元


履歴

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

コメント

  • Very well written article. It will be helpful to anyone who usess it, as well as yours truly kffekaecddec -- Johnf173? 2016-11-25 (金) 22:17:41
  • Hello there, i am interested ggggfcebgfga -- Johnk318? 2016-11-25 (金) 22:18:16
  • Hey, thanks for the post.Really thank you! Really Cool. ddacdbdeeabc -- Johnd473? 2016-11-26 (土) 08:28:41


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-11-26 (土) 08:28:42 (122d)