Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
dynamic_queue_limits.h
Go to the documentation of this file.
1
/*
2
* Dynamic queue limits (dql) - Definitions
3
*
4
* Copyright (c) 2011, Tom Herbert <
[email protected]
>
5
*
6
* This header file contains the definitions for dynamic queue limits (dql).
7
* dql would be used in conjunction with a producer/consumer type queue
8
* (possibly a HW queue). Such a queue would have these general properties:
9
*
10
* 1) Objects are queued up to some limit specified as number of objects.
11
* 2) Periodically a completion process executes which retires consumed
12
* objects.
13
* 3) Starvation occurs when limit has been reached, all queued data has
14
* actually been consumed, but completion processing has not yet run
15
* so queuing new data is blocked.
16
* 4) Minimizing the amount of queued data is desirable.
17
*
18
* The goal of dql is to calculate the limit as the minimum number of objects
19
* needed to prevent starvation.
20
*
21
* The primary functions of dql are:
22
* dql_queued - called when objects are enqueued to record number of objects
23
* dql_avail - returns how many objects are available to be queued based
24
* on the object limit and how many objects are already enqueued
25
* dql_completed - called at completion time to indicate how many objects
26
* were retired from the queue
27
*
28
* The dql implementation does not implement any locking for the dql data
29
* structures, the higher layer should provide this. dql_queued should
30
* be serialized to prevent concurrent execution of the function; this
31
* is also true for dql_completed. However, dql_queued and dlq_completed can
32
* be executed concurrently (i.e. they can be protected by different locks).
33
*/
34
35
#ifndef _LINUX_DQL_H
36
#define _LINUX_DQL_H
37
38
#ifdef __KERNEL__
39
40
struct
dql {
41
/* Fields accessed in enqueue path (dql_queued) */
42
unsigned
int
num_queued;
/* Total ever queued */
43
unsigned
int
adj_limit;
/* limit + num_completed */
44
unsigned
int
last_obj_cnt;
/* Count at last queuing */
45
46
/* Fields accessed only by completion path (dql_completed) */
47
48
unsigned
int
limit
____cacheline_aligned_in_smp
;
/* Current limit */
49
unsigned
int
num_completed;
/* Total ever completed */
50
51
unsigned
int
prev_ovlimit;
/* Previous over limit */
52
unsigned
int
prev_num_queued;
/* Previous queue total */
53
unsigned
int
prev_last_obj_cnt;
/* Previous queuing cnt */
54
55
unsigned
int
lowest_slack;
/* Lowest slack found */
56
unsigned
long
slack_start_time;
/* Time slacks seen */
57
58
/* Configuration */
59
unsigned
int
max_limit;
/* Max limit */
60
unsigned
int
min_limit;
/* Minimum limit */
61
unsigned
int
slack_hold_time;
/* Time to measure slack */
62
};
63
64
/* Set some static maximums */
65
#define DQL_MAX_OBJECT (UINT_MAX / 16)
66
#define DQL_MAX_LIMIT ((UINT_MAX / 2) - DQL_MAX_OBJECT)
67
68
/*
69
* Record number of objects queued. Assumes that caller has already checked
70
* availability in the queue with dql_avail.
71
*/
72
static
inline
void
dql_queued(
struct
dql *dql,
unsigned
int
count
)
73
{
74
BUG_ON
(count > DQL_MAX_OBJECT);
75
76
dql->num_queued +=
count
;
77
dql->last_obj_cnt =
count
;
78
}
79
80
/* Returns how many objects can be queued, < 0 indicates over limit. */
81
static
inline
int
dql_avail(
const
struct
dql *dql)
82
{
83
return
dql->adj_limit - dql->num_queued;
84
}
85
86
/* Record number of completed objects and recalculate the limit. */
87
void
dql_completed
(
struct
dql *dql,
unsigned
int
count
);
88
89
/* Reset dql state */
90
void
dql_reset
(
struct
dql *dql);
91
92
/* Initialize dql state */
93
int
dql_init
(
struct
dql *dql,
unsigned
hold_time);
94
95
#endif
/* _KERNEL_ */
96
97
#endif
/* _LINUX_DQL_H */
Generated on Thu Jan 10 2013 14:51:20 for Linux Kernel by
1.8.2