khugepaged.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #ifndef _LINUX_KHUGEPAGED_H
  2. #define _LINUX_KHUGEPAGED_H
  3. #include <linux/sched.h> /* MMF_VM_HUGEPAGE */
  4. #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  5. extern int __khugepaged_enter(struct mm_struct *mm);
  6. extern void __khugepaged_exit(struct mm_struct *mm);
  7. extern int khugepaged_enter_vma_merge(struct vm_area_struct *vma,
  8. unsigned long vm_flags);
  9. #define khugepaged_enabled() \
  10. (transparent_hugepage_flags & \
  11. ((1<<TRANSPARENT_HUGEPAGE_FLAG) | \
  12. (1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG)))
  13. #define khugepaged_always() \
  14. (transparent_hugepage_flags & \
  15. (1<<TRANSPARENT_HUGEPAGE_FLAG))
  16. #define khugepaged_req_madv() \
  17. (transparent_hugepage_flags & \
  18. (1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG))
  19. #define khugepaged_defrag() \
  20. (transparent_hugepage_flags & \
  21. (1<<TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG))
  22. static inline int khugepaged_fork(struct mm_struct *mm, struct mm_struct *oldmm)
  23. {
  24. if (test_bit(MMF_VM_HUGEPAGE, &oldmm->flags))
  25. return __khugepaged_enter(mm);
  26. return 0;
  27. }
  28. static inline void khugepaged_exit(struct mm_struct *mm)
  29. {
  30. if (test_bit(MMF_VM_HUGEPAGE, &mm->flags))
  31. __khugepaged_exit(mm);
  32. }
  33. static inline int khugepaged_enter(struct vm_area_struct *vma,
  34. unsigned long vm_flags)
  35. {
  36. if (!test_bit(MMF_VM_HUGEPAGE, &vma->vm_mm->flags))
  37. if ((khugepaged_always() ||
  38. (khugepaged_req_madv() && (vm_flags & VM_HUGEPAGE))) &&
  39. !(vm_flags & VM_NOHUGEPAGE))
  40. if (__khugepaged_enter(vma->vm_mm))
  41. return -ENOMEM;
  42. return 0;
  43. }
  44. #else /* CONFIG_TRANSPARENT_HUGEPAGE */
  45. static inline int khugepaged_fork(struct mm_struct *mm, struct mm_struct *oldmm)
  46. {
  47. return 0;
  48. }
  49. static inline void khugepaged_exit(struct mm_struct *mm)
  50. {
  51. }
  52. static inline int khugepaged_enter(struct vm_area_struct *vma,
  53. unsigned long vm_flags)
  54. {
  55. return 0;
  56. }
  57. static inline int khugepaged_enter_vma_merge(struct vm_area_struct *vma,
  58. unsigned long vm_flags)
  59. {
  60. return 0;
  61. }
  62. #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
  63. #endif /* _LINUX_KHUGEPAGED_H */