*参照元 [#h6067d19]
#backlinks

*説明 [#m51ecb99]
-パス: [[linux-4.4.1/mm/mmap.c]]

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


**引数 [#g200bdfc]
-unsigned long addr
--
-unsigned long len
--
-unsigned long prot
--
-unsigned long flags
--
-unsigned long fd
--
-unsigned long pgoff
--


**返り値 [#mfd9b0d1]
-unsigned long
--


**参考 [#i39d9053]


*実装 [#y9b64e6e]
 SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
                 unsigned long, prot, unsigned long, flags,
                 unsigned long, fd, unsigned long, pgoff)
 {
         struct file *file = NULL;
         unsigned long retval;
 
-
--[[linux-4.4.1/file]]

         if (!(flags & MAP_ANONYMOUS)) {
                 audit_mmap_fd(fd, flags);
                 file = fget(fd);
                 if (!file)
                         return -EBADF;
-
--[[linux-4.4.1/MAP_ANONYMOUS]]
--[[linux-4.4.1/audit_mmap_fd()]]
--[[linux-4.4.1/fget()]]

                 if (is_file_hugepages(file))
                         len = ALIGN(len, huge_page_size(hstate_file(file)));
-
--[[linux-4.4.1/is_file_hugepages()]]
--[[linux-4.4.1/ALIGN()]]
--[[linux-4.4.1/huge_page_size()]]
--[[linux-4.4.1/hstate_file()]]

                 retval = -EINVAL;
                 if (unlikely(flags & MAP_HUGETLB && !is_file_hugepages(file)))
                         goto out_fput;
-
--[[linux-4.4.1/unlikely()]]
--[[linux-4.4.1/MAP_HUGETLB]]

         } else if (flags & MAP_HUGETLB) {
                 struct user_struct *user = NULL;
                 struct hstate *hs;
 
-
--[[linux-4.4.1/user_struct]]
--[[linux-4.4.1/hstate]]

                 hs = hstate_sizelog((flags >> MAP_HUGE_SHIFT) & SHM_HUGE_MASK);
                 if (!hs)
                         return -EINVAL;
 
-
--[[linux-4.4.1/hstate_sizelog()]]
--[[linux-4.4.1/MAP_HUGE_SHIFT]]
--[[linux-4.4.1/SHM_HUGE_MASK]]

                 len = ALIGN(len, huge_page_size(hs));
                 /*
                  * VM_NORESERVE is used because the reservations will be
                  * taken when vm_ops->mmap() is called
                  * A dummy user value is used because we are not locking
                  * memory so no accounting is necessary
                  */
                 file = hugetlb_file_setup(HUGETLB_ANON_FILE, len,
                                 VM_NORESERVE,
                                 &user, HUGETLB_ANONHUGE_INODE,
                                 (flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK);
                 if (IS_ERR(file))
                         return PTR_ERR(file);
-
--[[linux-4.4.1/hugetlb_file_setup()]]
--[[linux-4.4.1/HUGETLB_ANON_FILE]]
--[[linux-4.4.1/VM_NORESERVE]]
--[[linux-4.4.1/HUGETLB_ANONHUGE_INODE]]

         }
 
         flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
 
         retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff);
-
--[[linux-4.4.1/MAP_EXECUTABLE]]
--[[linux-4.4.1/MAP_DENYWRITE]]
--[[linux-4.4.1/vm_mmap_pgoff()]]

 out_fput:
         if (file)
                 fput(file);
         return retval;
-
--[[linux-4.4.1/fput()]]

 }


*コメント [#qbb1a95c]


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