函数逻辑报告

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source Code:fs\userfaultfd.c Create Date:2022-07-29 10:52:38
Last Modify:2020-03-12 14:18:49 Copyright©Brick
首页 函数Tree
注解内核,赢得工具下载SCCTEnglish

函数名称:userfaultfd_register

函数原型:static int userfaultfd_register(struct userfaultfd_ctx *ctx, unsigned long arg)

返回类型:int

参数:

类型参数名称
struct userfaultfd_ctx *ctx
unsigned longarg
1305  mm等于mm with one ore more vmas attached to this userfaultfd_ctx
1309  __useruser_uffdio_register
1315  user_uffdio_register等于arg
1317  ret等于负EFAULT
1318  如果copy_from_user( & uffdio_register, user_uffdio_register, uffdio_register的长度 - sizeof(__u64))则转到:out
1322  ret等于负EINVAL
1323  如果非mode则转到:out
1325  如果mode按位与UFFDIO_REGISTER_MODE_MISSING按位或UFFDIO_REGISTER_MODE_WP的值的反则转到:out
1328  vm_flags等于0
1329  如果mode按位与UFFDIO_REGISTER_MODE_MISSINGvm_flags或等于missing pages tracking
1331  如果mode按位与UFFDIO_REGISTER_MODE_WP
1332  vm_flags或等于wrprotect pages tracking
1337  ret等于负EINVAL
1338  转到:out
1341  ret等于validate_range(mm, & start, len)
1343  如果ret则转到:out
1346  start等于start
1347  end等于startlen
1349  ret等于负ENOMEM
1350  如果非mmget_not_zero(mm)则转到:out
1353  lock for writing
1354  如果非This has to be called after a get_task_mm()/mmget_not_zero()* followed by taking the mmap_sem for writing before modifying the* vmas or anything the coredump pretends not to change from under it则转到:out_unlock
1356  vma等于Same as find_vma, but also return a pointer to the previous VMA in *pprev.
1357  如果非vma则转到:out_unlock
1361  ret等于负EINVAL
1362  如果Our start address within vm_mm. 大于等于end则转到:out_unlock
1369  如果is_vm_hugetlb_page(vma)则
1370  vma_hpagesize等于Return the size of the pages allocated when backing a VMA. In the majority* cases this will be same size as used by the page table entries.
1372  如果start按位与vma_hpagesize减1则转到:out_unlock
1379  found = false
1380  basic_ioctls = false
1381 curOur start address within vm_mm. 小于end循环
1382  cond_resched()
1384  BUG_ON(!!ctx ^ !!(Flags, see mm.h. & (missing pages tracking | wrprotect pages tracking )))
1388  ret等于负EINVAL
1389  如果非vma_can_userfault(cur)则转到:out_unlock
1400  ret等于负EPERM
1401  如果此条件成立可能性小(为编译器优化)(!(Flags, see mm.h. & VM_MAYWRITE))则转到:out_unlock
1412  ret等于负EINVAL
1414  如果end按位与vma_hpagesize减1则转到:out_unlock
1424  ret等于负EBUSY
1425  如果ctxctx不等于ctx则转到:out_unlock
1432  如果is_vm_hugetlb_page(cur)则basic_ioctls = true
1435  found = true
1437  BUG_ON(!found)
1439  如果Our start address within vm_mm. 小于startprev等于vma
1442  ret等于0
1443  循环
1444  cond_resched()
1446  BUG_ON(!vma_can_userfault(vma))
1447  BUG_ON(ctx && ctx != ctx)
1449  WARN_ON(!(Flags, see mm.h. & VM_MAYWRITE))
1455  如果ctx恒等于ctxFlags, see mm.h. 按位与vm_flags的值恒等于vm_flags则转到:skip
1459  如果Our start address within vm_mm. 大于startstart等于Our start address within vm_mm.
1461  vma_end等于两数取小(end, The first byte after our end addresswithin vm_mm. )
1463  new_flags等于Flags, see mm.h. 按位与missing pages tracking 按位或wrprotect pages tracking 的值的反按位或vm_flags
1465  prev等于Given a mapping request (addr,end,vm_flags,file,pgoff), figure out* whether that can be merged with its predecessor or its successor
1469  如果prev
1470  vma等于prev
1471  转到:next
1475  如果ret退出
1480  如果ret退出
1483  :
1489  Flags, see mm.h. 等于new_flags
1490  ctx等于ctx
1492  :
1493  prev等于vma
1494  start等于The first byte after our end addresswithin vm_mm.
1495  vma等于linked list of VM areas per task, sorted by address
1496 vmaOur start address within vm_mm. 小于end循环
1497  out_unlock :
1498  lease a write lock
1499  Decrement the use count and release all resources for an mm.
1500  如果非ret
1506  如果put_user - Write a simple value into user space(basic_ioctls ? UFFD_API_RANGE_IOCTLS_BASIC : UFFD_API_RANGE_IOCTLS, & * kernel answers which ioctl commands are available for the * range, keep at the end as the last 8 bytes aren't read.)则ret等于负EFAULT
1511  out :
1512  返回:ret
调用者
名称描述
userfaultfd_ioctl