ioprio.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef IOPRIO_H
  3. #define IOPRIO_H
  4. #include <linux/sched.h>
  5. #include <linux/sched/rt.h>
  6. #include <linux/iocontext.h>
  7. /*
  8. * Gives us 8 prio classes with 13-bits of data for each class
  9. */
  10. #define IOPRIO_CLASS_SHIFT (13)
  11. #define IOPRIO_PRIO_MASK ((1UL << IOPRIO_CLASS_SHIFT) - 1)
  12. #define IOPRIO_PRIO_CLASS(mask) ((mask) >> IOPRIO_CLASS_SHIFT)
  13. #define IOPRIO_PRIO_DATA(mask) ((mask) & IOPRIO_PRIO_MASK)
  14. #define IOPRIO_PRIO_VALUE(class, data) (((class) << IOPRIO_CLASS_SHIFT) | data)
  15. #define ioprio_valid(mask) (IOPRIO_PRIO_CLASS((mask)) != IOPRIO_CLASS_NONE)
  16. /*
  17. * These are the io priority groups as implemented by CFQ. RT is the realtime
  18. * class, it always gets premium service. BE is the best-effort scheduling
  19. * class, the default for any process. IDLE is the idle scheduling class, it
  20. * is only served when no one else is using the disk.
  21. */
  22. enum {
  23. IOPRIO_CLASS_NONE,
  24. IOPRIO_CLASS_RT,
  25. IOPRIO_CLASS_BE,
  26. IOPRIO_CLASS_IDLE,
  27. };
  28. /*
  29. * 8 best effort priority levels are supported
  30. */
  31. #define IOPRIO_BE_NR (8)
  32. enum {
  33. IOPRIO_WHO_PROCESS = 1,
  34. IOPRIO_WHO_PGRP,
  35. IOPRIO_WHO_USER,
  36. };
  37. /*
  38. * Fallback BE priority
  39. */
  40. #define IOPRIO_NORM (4)
  41. /*
  42. * if process has set io priority explicitly, use that. if not, convert
  43. * the cpu scheduler nice value to an io priority
  44. */
  45. static inline int task_nice_ioprio(struct task_struct *task)
  46. {
  47. return (task_nice(task) + 20) / 5;
  48. }
  49. /*
  50. * This is for the case where the task hasn't asked for a specific IO class.
  51. * Check for idle and rt task process, and return appropriate IO class.
  52. */
  53. static inline int task_nice_ioclass(struct task_struct *task)
  54. {
  55. if (task->policy == SCHED_IDLE)
  56. return IOPRIO_CLASS_IDLE;
  57. else if (task_is_realtime(task))
  58. return IOPRIO_CLASS_RT;
  59. else
  60. return IOPRIO_CLASS_BE;
  61. }
  62. /*
  63. * If the calling process has set an I/O priority, use that. Otherwise, return
  64. * the default I/O priority.
  65. */
  66. static inline int get_current_ioprio(void)
  67. {
  68. struct io_context *ioc = current->io_context;
  69. if (ioc)
  70. return ioc->ioprio;
  71. return IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0);
  72. }
  73. /*
  74. * For inheritance, return the highest of the two given priorities
  75. */
  76. extern int ioprio_best(unsigned short aprio, unsigned short bprio);
  77. extern int set_task_ioprio(struct task_struct *task, int ioprio);
  78. #ifdef CONFIG_BLOCK
  79. extern int ioprio_check_cap(int ioprio);
  80. #else
  81. static inline int ioprio_check_cap(int ioprio)
  82. {
  83. return -ENOTBLK;
  84. }
  85. #endif /* CONFIG_BLOCK */
  86. #endif