调整内核服务
用途
通过易于访问的接口提供对内核可调变量的访问。
语法
typedef enum {
TH_MORE,
TH_EOF
} tmode_t;
#define TH_ABORT TH_EOF
typedef int (*tuning_read_t)(tmode_t mode, long *size, char **buf, void *context);
typedef int (*tuning_write_t)(tmode_t mode, long *size, char *buf, void *context); tinode_t *tuning_register_handler (path, mode, readfunc, writefunc, context)
const char *path;
mode_t mode;
tuning_read_t readfunc;
tuning_write_t writefunc;
void * context; tinode *tuning_register_bint32 (path, mode, variable, low, high)
const char *path;
mode_t mode;
int32 *variable;
int32 low;
int32 high; tinode *tuning_register_bint32x (path, rfunc, wfunc, mode, low, high)
const char *path;
mode_t mode;
int32 (*rfunc)(void *);
int (*wfunc)(int32, void *);
void *context;
int32 low;
int32 high; tinode *tuning_register_buint32 (path, mode,variable, low, high)
const char *path;
mode_t mode;
uint32 *variable;
uint32 low;
uint32 high; tinode *tuning_register_buint32x (path, rfunc, wfunc, mode, low, high)
const char *path;
mode_t mode;
uint32 (*rfunc)(void *);
int (*wfunc)(uint32, void *);
void *context;
uint32 low;
uint32 high; tinode *tuning_register_bint64 (path, mode, variable, low, high)
const char *path;
mode_t mode;
int64 *variable;
int64 low;
int64 high; tinode *tuning_register_bint64x (path, rfunc, wfunc, mode, low, high)
const char *path;
mode_t mode;
int64 (*rfunc)(void *);
int (*wfunc)(int64, void *);
void *context;
in64 low;
in64 high; tinode *tuning_register_buint64 (path, mode, variable, low, high)
const char *path;
mode_t mode;
uint64 *variable;
uint64 low;
uint64 high; tinode *tuning_register_buint64x (path, rfunc, wfunc, mode, low, high)
const char *path;
mode_t mode;
uint64 (*rfunc)(void *);
int (*wfunc)(uint64, void *);
void *context;
uint64 low;
uint64 high; void tuning_deregister (t)
tinode_t * t;描述
tuning_register_handler 内核服务用于将文件添加到 路径 参数指定的位置。 在读取或写入此文件时,将调用作为参数传递到该函数的两个回调中的一个。
将根据流来查看对文件的访问。 单个流由文件中的一个打开,一个或多个读取和一个关闭的序列创建。 当该文件由一个进程打开时,除非在 开 子例程的标志中传递 O_NONBLOCK ,否则其他进程打开同一文件的尝试将被阻止。
如果返回的数据量为非零值,那么可以修改 布夫 参数以指向新的缓冲区。 如果执行了此操作,那么回调将负责释放新缓冲区。
如果调用者提供的缓冲区太小,那么调用者可以改为将 布夫 设置为 NULL。 在此情况下,应该修改 大小 参数以指示所需缓冲区的大小。 然后,调用者将使用至少具有所请求大小的缓冲区来重新调用回调。
如果用户在回调指示结束文件之前关闭该文件,那么将在 模式 等于 TH_ABORT的情况下最后一次调用该回调。 在此情况下, 大小 参数在输入时等于 0 ,并且将废弃返回的任何数据。 回调必须重置其状态,因为将不会对此流进行进一步的回调。
这两个回调的返回值都应该为零。 如果不成功,那么会将正值放置在 错误号 全局变量中 (并附带指示从内核服务返回错误)。 如果回调的返回值小于 0,将向用户发出文件结束信号,返回值将被视为其单数否定(例如,-1 将被视为 0)。 在此情况下,将不会对此流进行进一步的回调。
tuning_register_bint32, tuning_register_buint32, tuning_register_bint64和 tuning_register_buint64 内核服务用于在 路径 参数指定的位置添加文件,从该文件中读取时,将返回 变量 参数指向的整数变量的 ASCII 值。 当写入该文件时,除非该值不符合 low <= value < high 的关系,否则该文件将把整数变量设置为写入的 ASCII 值。 在此情况下,不会修改整数变量,并且会通过内核服务的错误返回向用户返回错误,在此期间会检测到无效尝试 (可能是 写 或 关闭)。
tuning_register_b*x 函数的操作与它们的非X 变体类似,但它们使用一对回调来检索 (雷丰克) 和设置 (世界) 变量。 会向回调传递值 (如果设置) 和上下文参数。 这允许对读/写执行更复杂的操作,例如序列化和内存分配以及释放。
tuning_get_context 内核服务返回用于创建 蒂诺代 _t 结构 (由 参数 参数引用) 的注册函数的 上下文 。
tuning_register 内核服务是基本接口,通过该接口可以将文件添加到 /proc/sys 目录层次结构。 此函数不会导出到内核扩展,并且强烈建议不要在内核中直接使用此函数。 路径 参数包含相对于 /proc/sys 根的路径,文件应该出现在该路径中。 将自动创建中间路径组件。 模式 参数包含要创建的文件的 UNIX 许可权和类型 (根据 统计 struct 的 st_mode 字段)。 如果未指定该文件类型,那么假定它为 _ IFREG。 在大多数情况下,此参数将为 0644 或 0600。 弗诺普斯 参数用于分派对文件执行的所有操作。
tuning_deregister 内核服务用于从 /proc/sys 目录层次结构中移除文件。 它导出到内核扩展。 仅当特定文件的实现不再可用时,才应该使用此参数。 特 参数是一个由 tuning_register返回的 蒂诺代 _t 结构。 如果该文件当前处于打开状态,那么在此调用后对其进行的任何进一步访问都将返回 ESTALE。
参数
| 项 | 描述 |
|---|---|
| 模式 | 设置为 TH_EOF (如果预期用户不会提供此更改的更多数据) 或 TH_MORE (如果期望提供更多数据)。 |
| 大小 | 包含在缓冲区中传递的数据的大小。 |
| 布夫 | 指向该缓冲区。 |
| 上下文 | 指向已传递给注册函数的上下文。 |
| 路径 | 指定要添加的文件所在的位置。 |
| Readfunc | 表现为生产者函数。 |
| 雷丰克 | 检索变量。 |
| 世界 | 设置变量。 |
| Writefunc | 表现为使用者功能。 |
| 变量 (variable) | 指定变量。 |
| 高 | 指定 变量 参数可包含的最大值。 |
| 低级 | 指定 变量 参数可以包含的最小值。 |
| t | 由 tuning_register返回的 蒂诺代 _t 结构。 |
返回值
成功完成后, tuning_register 内核服务将返回新创建的 蒂诺代 _t 结构。 如果不成功,那么将返回 NULL 值。
示例
tuning_var = tuning_register_buint64
("fs/jfs2/max_readahead", 0644 &j2_max_read_ahead, 0, 1024); 在此示例中, tuning_var 是类型为 tinode_t *的全局变量。 这将导致创建 国际 和 fs/jfs2 目录,并将文件 (管道) 创建为 fs/jfs2/max_readahead。 该文件在读取时以 ASCII 格式返回 j2_max_readahead 的值。 该变量在第一次读取时被读取。 写操作将设置变量的值,但仅在写入第一个换行符或执行 关闭 函数时才执行。 为了在读取变量后将其写入,您必须关闭该文件并将其重新打开以进行写入。 此文件不可种子值。