Blame view

include/linux/ioprio.h 2.23 KB
22e2c507c   Jens Axboe   [PATCH] Update cf...
1
2
3
4
  #ifndef IOPRIO_H
  #define IOPRIO_H
  
  #include <linux/sched.h>
fd0928df9   Jens Axboe   ioprio: move io p...
5
  #include <linux/iocontext.h>
22e2c507c   Jens Axboe   [PATCH] Update cf...
6
7
8
9
10
11
12
13
14
15
  
  /*
   * Gives us 8 prio classes with 13-bits of data for each class
   */
  #define IOPRIO_BITS		(16)
  #define IOPRIO_CLASS_SHIFT	(13)
  #define IOPRIO_PRIO_MASK	((1UL << IOPRIO_CLASS_SHIFT) - 1)
  
  #define IOPRIO_PRIO_CLASS(mask)	((mask) >> IOPRIO_CLASS_SHIFT)
  #define IOPRIO_PRIO_DATA(mask)	((mask) & IOPRIO_PRIO_MASK)
3b18152c3   Jens Axboe   [PATCH] CFQ io sc...
16
  #define IOPRIO_PRIO_VALUE(class, data)	(((class) << IOPRIO_CLASS_SHIFT) | data)
22e2c507c   Jens Axboe   [PATCH] Update cf...
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  
  #define ioprio_valid(mask)	(IOPRIO_PRIO_CLASS((mask)) != IOPRIO_CLASS_NONE)
  
  /*
   * These are the io priority groups as implemented by CFQ. RT is the realtime
   * class, it always gets premium service. BE is the best-effort scheduling
   * class, the default for any process. IDLE is the idle scheduling class, it
   * is only served when no one else is using the disk.
   */
  enum {
  	IOPRIO_CLASS_NONE,
  	IOPRIO_CLASS_RT,
  	IOPRIO_CLASS_BE,
  	IOPRIO_CLASS_IDLE,
  };
  
  /*
   * 8 best effort priority levels are supported
   */
  #define IOPRIO_BE_NR	(8)
22e2c507c   Jens Axboe   [PATCH] Update cf...
37
38
39
40
41
42
43
44
45
46
47
  enum {
  	IOPRIO_WHO_PROCESS = 1,
  	IOPRIO_WHO_PGRP,
  	IOPRIO_WHO_USER,
  };
  
  /*
   * if process has set io priority explicitly, use that. if not, convert
   * the cpu scheduler nice value to an io priority
   */
  #define IOPRIO_NORM	(4)
fd0928df9   Jens Axboe   ioprio: move io p...
48
  static inline int task_ioprio(struct io_context *ioc)
22e2c507c   Jens Axboe   [PATCH] Update cf...
49
  {
fd0928df9   Jens Axboe   ioprio: move io p...
50
51
  	if (ioprio_valid(ioc->ioprio))
  		return IOPRIO_PRIO_DATA(ioc->ioprio);
15c31be4d   Jens Axboe   cfq-iosched: fix ...
52
53
  
  	return IOPRIO_NORM;
22e2c507c   Jens Axboe   [PATCH] Update cf...
54
  }
fd0928df9   Jens Axboe   ioprio: move io p...
55
  static inline int task_ioprio_class(struct io_context *ioc)
c2dea2d1f   Vasily Tarasov   cfq: async queue ...
56
  {
fd0928df9   Jens Axboe   ioprio: move io p...
57
58
  	if (ioprio_valid(ioc->ioprio))
  		return IOPRIO_PRIO_CLASS(ioc->ioprio);
c2dea2d1f   Vasily Tarasov   cfq: async queue ...
59
60
61
  
  	return IOPRIO_CLASS_BE;
  }
22e2c507c   Jens Axboe   [PATCH] Update cf...
62
63
64
65
66
67
  static inline int task_nice_ioprio(struct task_struct *task)
  {
  	return (task_nice(task) + 20) / 5;
  }
  
  /*
6d63c2755   Jens Axboe   cfq-iosched: make...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
   * This is for the case where the task hasn't asked for a specific IO class.
   * Check for idle and rt task process, and return appropriate IO class.
   */
  static inline int task_nice_ioclass(struct task_struct *task)
  {
  	if (task->policy == SCHED_IDLE)
  		return IOPRIO_CLASS_IDLE;
  	else if (task->policy == SCHED_FIFO || task->policy == SCHED_RR)
  		return IOPRIO_CLASS_RT;
  	else
  		return IOPRIO_CLASS_BE;
  }
  
  /*
22e2c507c   Jens Axboe   [PATCH] Update cf...
82
83
   * For inheritance, return the highest of the two given priorities
   */
e014ff8d4   Oleg Nesterov   [PATCH] uninline ...
84
  extern int ioprio_best(unsigned short aprio, unsigned short bprio);
22e2c507c   Jens Axboe   [PATCH] Update cf...
85

b3881f74b   Theodore Ts'o   ext4: Add mount o...
86
  extern int set_task_ioprio(struct task_struct *task, int ioprio);
22e2c507c   Jens Axboe   [PATCH] Update cf...
87
  #endif