*参照元 [#e168cb7d]
#backlinks

*説明 [#def4a777]
-パス: 複数あり
--WANT_PAGE_VIRTUAL 有効: [[linux-4.4.1/include/linux/mm.h]]
--WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 無効: [[linux-4.4.1/include/linux/mm.h]]
--WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 有効: [[linux-4.4.1/mm/highmem.c]]

-FIXME: これは何?
--説明

-WANT_PAGE_VIRTUAL はアーキテクチャ依存の値で、定義されているのは下記 3つのみ。
--arc
--m68k
--sparc
-HASHED_PAGE_VIRTUAL は CONFIG_HIGHMEM 有効、WANT_PAGE_VIRTUAL 無効のときに有効

-要するに、下記の 3パターンがあるってことです。
--WANT_PAGE_VIRTUAL 有効
--WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 無効
--WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 有効


**引数 [#x389acd0]
-const struct page *page
--
--[[linux-4.4.1/page]]


**返り値 [#ib3b1951]
-void *
--


**参考 [#sc75c2fd]


*実装 [#w5daec85]

**WANT_PAGE_VIRTUAL 有効: include/linux/mm.h [#j7bfc510]
-特殊ケース。CONFIG_HIGHMEM は無視されて、下記の実装が選択される。

 #if defined(WANT_PAGE_VIRTUAL)
 static inline void *page_address(const struct page *page)
 {
         return page->virtual;
 }
 ...


**WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 無効: include/linux/mm.h [#l9ce5881]
 #if !defined(HASHED_PAGE_VIRTUAL) && !defined(WANT_PAGE_VIRTUAL)
 #define page_address(page) lowmem_page_address(page)
 ...
-
--[[linux-4.4.1/lowmem_page_address()]]


**WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 有効: mm/highmem.c [#q95dd008]
 /**
  * page_address - get the mapped virtual address of a page
  * @page: &struct page to get the virtual address of
  *
  * Returns the page's virtual address.
  */
 void *page_address(const struct page *page)
 {
         unsigned long flags;
         void *ret;
         struct page_address_slot *pas;
 
-
--[[linux-4.4.1/page_address_slot()]]

         if (!PageHighMem(page))
                 return lowmem_page_address(page);
 
-
--[[linux-4.4.1/PageHighMem()]]
--[[linux-4.4.1/lowmem_page_address()]]

         pas = page_slot(page);
         ret = NULL;
         spin_lock_irqsave(&pas->lock, flags);
-
--[[linux-4.4.1/page_slot()]]
--[[linux-4.4.1/spin_lock_irqsave()]]

         if (!list_empty(&pas->lh)) {
-
--[[linux-4.4.1/list_empty()]]

                 struct page_address_map *pam;
 
-
--[[linux-4.4.1/page_address_map]]

                 list_for_each_entry(pam, &pas->lh, list) {
                         if (pam->page == page) {
                                 ret = pam->virtual;
                                 goto done;
                         }
                 }
-
--[[linux-4.4.1/list_for_each_entry()]]

         }
 done:
         spin_unlock_irqrestore(&pas->lock, flags);
         return ret;
-
--[[linux-4.4.1/spin_unlock_irqrestore()]]

 }
 
 EXPORT_SYMBOL(page_address);
-
--[[linux-4.4.1/EXPORT_SYMBOL()]]


*コメント [#r72c3d1b]


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS