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