调整内核服务

用途

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

语法

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