调整内核服务

用途

通过易于访问的接口提供对内核可调变量的访问。

语法

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 ,否则其他进程打开同一文件的尝试将被阻止。

Readfunc 回调的行为类似于生产者函数。 当用户尝试从文件中读取时,将调用该函数。 除非用户过早关闭该文件,否则 模式 参数等于 TH_MORE 。 在输入时, 大小 参数是一个整数,其中包含缓冲区的大小。 上下文 参数是传递至注册函数的上下文指针。 在返回时, 大小 应包含返回的实际数据量,或者如果应该向用户返回文件结束条件,那么应包含零。 该函数的返回值也可以用于信号结束文件,如下所述。
注:Readfunc 回调返回文件结束信号时,它应该已执行任何必要的文件结束清除。

如果返回的数据量为非零值,那么可以修改 布夫 参数以指向新的缓冲区。 如果执行了此操作,那么回调将负责释放新缓冲区。

如果调用者提供的缓冲区太小,那么调用者可以改为将 布夫 设置为 NULL。 在此情况下,应该修改 大小 参数以指示所需缓冲区的大小。 然后,调用者将使用至少具有所请求大小的缓冲区来重新调用回调。

如果用户在回调指示结束文件之前关闭该文件,那么将在 模式 等于 TH_ABORT的情况下最后一次调用该回调。 在此情况下, 大小 参数在输入时等于 0 ,并且将废弃返回的任何数据。 回调必须重置其状态,因为将不会对此流进行进一步的回调。

Writefunc 回调的行为与使用者函数类似,并且在用户尝试写入文件时使用。 如果在此流上无法期望更多数据 (例如,用户在文件上调用了 关闭 子例程) ,那么 模式 参数将设置为 TH_EOF 。 否则, 模式 设置为 TH_MORE大小 参数包含在缓冲区中传递的数据的大小。 布夫 参数是指向该缓冲区的指针。
注: 对于每个流,将有零个或多个调用 ( 模式 参数设置为 TH_MORE ) 和一个调用 ( 模式 参数设置为 TH_EOF )。
布夫 参数可能在两次调用之间更改。 在从回调返回时,必须修改 大小 参数以反映从缓冲区消耗的数据量,并且即使所有数据都被消耗,也不得释放缓冲区。 该函数预计将以线性方式 (首先使用,先使用) 使用数据。 在回调的下一次调用时,未使用的数据出现在缓冲区的开头。 大小 参数将包括未使用的数据的大小。

这两个回调的返回值都应该为零。 如果不成功,那么会将正值放置在 错误号 全局变量中 (并附带指示从内核服务返回错误)。 如果回调的返回值小于 0,将向用户发出文件结束信号,返回值将被视为其单数否定(例如,-1 将被视为 0)。 在此情况下,将不会对此流进行进一步的回调。

tuning_register_bint32tuning_register_buint32tuning_register_bint64tuning_register_buint64 内核服务用于在 路径 参数指定的位置添加文件,从该文件中读取时,将返回 变量 参数指向的整数变量的 ASCII 值。 When written to, this file will set the integer variable to the value whose ASCII value was written, unless that value does not satisfy the relation low <= value < high. 在此情况下,不会修改整数变量,并且会通过内核服务的错误返回向用户返回错误,在此期间会检测到无效尝试 (可能是 关闭)。

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 的值。 该变量在第一次读取时被读取。 写操作将设置变量的值,但仅在写入第一个换行符或执行 关闭 函数时才执行。 为了在读取变量后将其写入,您必须关闭该文件并将其重新打开以进行写入。 此文件不可种子值。