mirror of
https://github.com/genesi/linux-legacy.git
synced 2026-02-14 05:35:11 +00:00
Such an old version of BFS is not maintained and while it gave us some
noticable benefits, it is not worth dealing with the problems it could
cause.
This reverts commit 469d88e87d.
92 lines
2.2 KiB
C
92 lines
2.2 KiB
C
#ifndef IOPRIO_H
|
|
#define IOPRIO_H
|
|
|
|
#include <linux/sched.h>
|
|
#include <linux/iocontext.h>
|
|
|
|
/*
|
|
* 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)
|
|
#define IOPRIO_PRIO_VALUE(class, data) (((class) << IOPRIO_CLASS_SHIFT) | data)
|
|
|
|
#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)
|
|
|
|
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)
|
|
static inline int task_ioprio(struct io_context *ioc)
|
|
{
|
|
if (ioprio_valid(ioc->ioprio))
|
|
return IOPRIO_PRIO_DATA(ioc->ioprio);
|
|
|
|
return IOPRIO_NORM;
|
|
}
|
|
|
|
static inline int task_ioprio_class(struct io_context *ioc)
|
|
{
|
|
if (ioprio_valid(ioc->ioprio))
|
|
return IOPRIO_PRIO_CLASS(ioc->ioprio);
|
|
|
|
return IOPRIO_CLASS_BE;
|
|
}
|
|
|
|
static inline int task_nice_ioprio(struct task_struct *task)
|
|
{
|
|
return (task_nice(task) + 20) / 5;
|
|
}
|
|
|
|
/*
|
|
* 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;
|
|
}
|
|
|
|
/*
|
|
* For inheritance, return the highest of the two given priorities
|
|
*/
|
|
extern int ioprio_best(unsigned short aprio, unsigned short bprio);
|
|
|
|
extern int set_task_ioprio(struct task_struct *task, int ioprio);
|
|
|
|
#endif
|