linux-2.6.33/__get_user_pages()(nommu)
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#ub18603a]
#backlinks
*説明 [#qa639f91]
-パス: [[linux-2.6.33/mm/nommu.c]]
-FIXME: これは何?
--説明
**引数 [#c69109e4]
-struct task_struct *tsk
--
--[[linux-2.6.33/task_struct]]
-struct mm_struct *mm
--
--[[linux-2.6.33/mm_struct]]
-unsigned long start
--
-unsigned int foll_flags
--
-int force
--
-struct page **pages
--
--[[linux-2.6.33/page]]
-struct vm_area_struct **vmas
-
--[[linux-2.6.33/vm_area_struct]]
**返り値 [#g83da4ba]
-int
--
**参考 [#k6d846df]
*実装 [#rd1bf7c9]
int __get_user_pages(struct task_struct *tsk, struct mm_...
unsigned long start, int nr_pages, unsigned int f...
struct page **pages, struct vm_area_struct **vmas)
{
struct vm_area_struct *vma;
unsigned long vm_flags;
int i;
/* calculate required read or write permissions.
* If FOLL_FORCE is set, we only require the "MAY" flags.
*/
vm_flags = (foll_flags & FOLL_WRITE) ?
(VM_WRITE | VM_MAYWRITE) : (VM_READ | VM_MAYREAD);
vm_flags &= (foll_flags & FOLL_FORCE) ?
(VM_MAYREAD | VM_MAYWRITE) : (VM_READ | VM_WRITE);
-
--[[linux-2.6.33/FOLL_WRITE]]
-
--[[linux-2.6.33/FOLL_FORCE]]
-
--[[linux-2.6.33/VM_WRITE]]
-
--[[linux-2.6.33/VM_MAYWRITE]]
-
--[[linux-2.6.33/VM_READ]]
-
--[[linux-2.6.33/VM_MAYREAD]]
for (i = 0; i < nr_pages; i++) {
vma = find_vma(mm, start);
if (!vma)
goto finish_or_fault;
-
--[[linux-2.6.33/find_vma()]]
/* protect what we can, including chardevs */
if ((vma->vm_flags & (VM_IO | VM_PFNMAP)) ||
!(vm_flags & vma->vm_flags))
goto finish_or_fault;
-
--[[linux-2.6.33/VM_IO]]
-
--[[linux-2.6.33/VM_PFNMAP]]
if (pages) {
pages[i] = virt_to_page(start);
if (pages[i])
page_cache_get(pages[i]);
}
-
--[[linux-2.6.33/virt_to_page()]]
-
--[[linux-2.6.33/page_cache_get()]]
if (vmas)
vmas[i] = vma;
start += PAGE_SIZE;
}
return i;
finish_or_fault:
return i ? : -EFAULT;
}
*コメント [#u4c0e316]
終了行:
*参照元 [#ub18603a]
#backlinks
*説明 [#qa639f91]
-パス: [[linux-2.6.33/mm/nommu.c]]
-FIXME: これは何?
--説明
**引数 [#c69109e4]
-struct task_struct *tsk
--
--[[linux-2.6.33/task_struct]]
-struct mm_struct *mm
--
--[[linux-2.6.33/mm_struct]]
-unsigned long start
--
-unsigned int foll_flags
--
-int force
--
-struct page **pages
--
--[[linux-2.6.33/page]]
-struct vm_area_struct **vmas
-
--[[linux-2.6.33/vm_area_struct]]
**返り値 [#g83da4ba]
-int
--
**参考 [#k6d846df]
*実装 [#rd1bf7c9]
int __get_user_pages(struct task_struct *tsk, struct mm_...
unsigned long start, int nr_pages, unsigned int f...
struct page **pages, struct vm_area_struct **vmas)
{
struct vm_area_struct *vma;
unsigned long vm_flags;
int i;
/* calculate required read or write permissions.
* If FOLL_FORCE is set, we only require the "MAY" flags.
*/
vm_flags = (foll_flags & FOLL_WRITE) ?
(VM_WRITE | VM_MAYWRITE) : (VM_READ | VM_MAYREAD);
vm_flags &= (foll_flags & FOLL_FORCE) ?
(VM_MAYREAD | VM_MAYWRITE) : (VM_READ | VM_WRITE);
-
--[[linux-2.6.33/FOLL_WRITE]]
-
--[[linux-2.6.33/FOLL_FORCE]]
-
--[[linux-2.6.33/VM_WRITE]]
-
--[[linux-2.6.33/VM_MAYWRITE]]
-
--[[linux-2.6.33/VM_READ]]
-
--[[linux-2.6.33/VM_MAYREAD]]
for (i = 0; i < nr_pages; i++) {
vma = find_vma(mm, start);
if (!vma)
goto finish_or_fault;
-
--[[linux-2.6.33/find_vma()]]
/* protect what we can, including chardevs */
if ((vma->vm_flags & (VM_IO | VM_PFNMAP)) ||
!(vm_flags & vma->vm_flags))
goto finish_or_fault;
-
--[[linux-2.6.33/VM_IO]]
-
--[[linux-2.6.33/VM_PFNMAP]]
if (pages) {
pages[i] = virt_to_page(start);
if (pages[i])
page_cache_get(pages[i]);
}
-
--[[linux-2.6.33/virt_to_page()]]
-
--[[linux-2.6.33/page_cache_get()]]
if (vmas)
vmas[i] = vma;
start += PAGE_SIZE;
}
return i;
finish_or_fault:
return i ? : -EFAULT;
}
*コメント [#u4c0e316]
ページ名: