世界杯加纳

ID 分配¶

函数和结构¶

IDR_INIT¶

IDR_INIT (name)

初始化一个 IDR。

参数

名称IDR 的名称。

描述

一个新初始化的 IDR 不包含任何 ID。

DEFINE_IDR¶

DEFINE_IDR (name)

定义一个静态分配的 IDR。

参数

名称IDR 的名称。

描述

使用此宏定义的 IDR 可直接使用,无需额外初始化。它不包含任何 ID。

unsigned int idr_get_cursor(const struct idr *idr)¶

返回循环分配器的当前位置

参数

const struct idr *idridr 句柄

描述

返回值是 idr_alloc_cyclic() 下次将返回的值,如果该值是空闲的(否则搜索将从该位置开始)。

void idr_set_cursor(struct idr *idr, unsigned int val)¶

设置循环分配器的当前位置

参数

struct idr *idridr 句柄

unsigned int val新位置

描述

下次调用 idr_alloc_cyclic() 将返回 val,如果它空闲(否则搜索将从该位置开始)。

void idr_init_base(struct idr *idr, int base)¶

初始化一个 IDR。

参数

struct idr *idrIDR 句柄。

int baseIDR 的基值。

描述

此 idr_init() 变体创建了一个 IDR,它将从 base 开始分配 ID。

void idr_init(struct idr *idr)¶

初始化一个 IDR。

参数

struct idr *idrIDR 句柄。

描述

初始化一个动态分配的 IDR。要初始化静态分配的 IDR,请使用 DEFINE_IDR()。

bool idr_is_empty(const struct idr *idr)¶

是否分配了任何 ID?

参数

const struct idr *idrIDR 句柄。

返回

如果已从该 IDR 分配了任何 ID,则为 true。

void idr_preload_end(void)¶

结束由 idr_preload() 开始的预加载段

参数

void无参数

描述

每个 idr_preload() 都应该与此函数的调用相匹配。有关详细信息,请参阅 idr_preload()。

idr_for_each_entry¶

idr_for_each_entry (idr, entry, id)

迭代 IDR 中给定类型的元素。

参数

idrIDR 句柄。

entry用作游标的类型 *

id条目 ID。

描述

entry 和 id 在循环之前无需初始化,正常终止后 entry 将保留 NULL 值。这对于表示“未找到”的值很方便。

idr_for_each_entry_ul¶

idr_for_each_entry_ul (idr, entry, tmp, id)

迭代 IDR 中给定类型的元素。

参数

idrIDR 句柄。

entry用作游标的类型 *。

tmpID 的临时占位符。

id条目 ID。

描述

entry 和 id 在循环之前无需初始化,正常终止后 entry 将保留 NULL 值。这对于表示“未找到”的值很方便。

idr_for_each_entry_continue¶

idr_for_each_entry_continue (idr, entry, id)

继续迭代 IDR 中给定类型的元素

参数

idrIDR 句柄。

entry用作游标的类型 *。

id条目 ID。

描述

继续迭代条目,从当前位置之后继续。

idr_for_each_entry_continue_ul¶

idr_for_each_entry_continue_ul (idr, entry, tmp, id)

继续迭代 IDR 中给定类型的元素

参数

idrIDR 句柄。

entry用作游标的类型 *。

tmpID 的临时占位符。

id条目 ID。

描述

继续迭代条目,从当前位置之后继续。正常终止后,entry 将保留 NULL 值。这对于表示“未找到”的值很方便。

int ida_alloc(struct ida *ida, gfp_t gfp)¶

分配一个未使用的 ID。

参数

struct ida *idaIDA 句柄。

gfp_t gfp内存分配标志。

描述

分配一个介于 0 和 INT_MAX(含)之间的 ID。

上下文

任何上下文。在您的代码中,安全地调用此函数无需加锁。

返回

已分配的 ID,如果无法分配内存则为 -ENOMEM,如果没有空闲 ID 则为 -ENOSPC。

int ida_alloc_min(struct ida *ida, unsigned int min, gfp_t gfp)¶

分配一个未使用的 ID。

参数

struct ida *idaIDA 句柄。

unsigned int min要分配的最低 ID。

gfp_t gfp内存分配标志。

描述

分配一个介于 min 和 INT_MAX(含)之间的 ID。

上下文

任何上下文。在您的代码中,安全地调用此函数无需加锁。

返回

已分配的 ID,如果无法分配内存则为 -ENOMEM,如果没有空闲 ID 则为 -ENOSPC。

int ida_alloc_max(struct ida *ida, unsigned int max, gfp_t gfp)¶

分配一个未使用的 ID。

参数

struct ida *idaIDA 句柄。

unsigned int max要分配的最高 ID。

gfp_t gfp内存分配标志。

描述

分配一个介于 0 和 max(含)之间的 ID。

上下文

任何上下文。在您的代码中,安全地调用此函数无需加锁。

返回

已分配的 ID,如果无法分配内存则为 -ENOMEM,如果没有空闲 ID 则为 -ENOSPC。

int idr_alloc_u32(struct idr *idr, void *ptr, u32 *nextid, unsigned long max, gfp_t gfp)¶

分配一个 ID。

参数

struct idr *idrIDR 句柄。

void *ptr与新 ID 关联的指针。

u32 *nextid指向一个 ID 的指针。

unsigned long max要分配的最大 ID(含)。

gfp_t gfp内存分配标志。

描述

在由 nextid 和 max 指定的范围内分配一个未使用的 ID。请注意,max 是包含的,而 idr_alloc() 的 end 参数是排他的。新 ID 在指针插入 IDR 之前被分配给 nextid,因此如果 nextid 指向 ptr 所指向的对象,并发查找将不会找到未初始化的 ID。

调用者应提供自己的锁,以确保不可能对 IDR 进行两次并发修改。对 IDR 的只读访问可以在 RCU 读锁下进行,或者可以排除同时写入。

返回

如果分配了 ID 则为 0,如果内存分配失败则为 -ENOMEM,如果找不到空闲 ID 则为 -ENOSPC。如果发生错误,nextid 不变。

int idr_alloc(struct idr *idr, void *ptr, int start, int end, gfp_t gfp)¶

分配一个 ID。

参数

struct idr *idrIDR 句柄。

void *ptr与新 ID 关联的指针。

int start最小 ID(含)。

int end最大 ID(不含)。

gfp_t gfp内存分配标志。

描述

在由 start 和 end 指定的范围内分配一个未使用的 ID。如果 end <= 0,则将其视为比 INT_MAX 大一。这允许调用者使用 start + N 作为 end,只要 N 在整数范围内即可。

调用者应提供自己的锁,以确保不可能对 IDR 进行两次并发修改。对 IDR 的只读访问可以在 RCU 读锁下进行,或者可以排除同时写入。

返回

新分配的 ID;如果内存分配失败则为 -ENOMEM;如果找不到空闲 ID 则为 -ENOSPC。

int idr_alloc_cyclic(struct idr *idr, void *ptr, int start, int end, gfp_t gfp)¶

循环分配一个 ID。

参数

struct idr *idrIDR 句柄。

void *ptr与新 ID 关联的指针。

int start最小 ID(含)。

int end最大 ID(不含)。

gfp_t gfp内存分配标志。

描述

在由 start 和 end 指定的范围内分配一个未使用的 ID。如果 end <= 0,则将其视为比 INT_MAX 大一。这允许调用者使用 start + N 作为 end,只要 N 在整数范围内即可。对未使用 ID 的搜索将从上次分配的 ID 开始,如果未在到达 end 之前找到空闲 ID,则将环绕到 start。

调用者应提供自己的锁,以确保不可能对 IDR 进行两次并发修改。对 IDR 的只读访问可以在 RCU 读锁下进行,或者可以排除同时写入。

返回

新分配的 ID;如果内存分配失败则为 -ENOMEM;如果找不到空闲 ID 则为 -ENOSPC。

void *idr_remove(struct idr *idr, unsigned long id)¶

从 IDR 中移除一个 ID。

参数

struct idr *idrIDR 句柄。

unsigned long id指针 ID。

描述

从 IDR 中移除此 ID。如果此 ID 之前不在 IDR 中,此函数返回 NULL。

由于此函数修改 IDR,调用者应提供自己的锁以确保不可能对同一 IDR 进行并发修改。

返回

以前与此 ID 关联的指针。

void *idr_find(const struct idr *idr, unsigned long id)¶

返回给定 ID 的指针。

参数

const struct idr *idrIDR 句柄。

unsigned long id指针 ID。

描述

查找与此 ID 关联的指针。NULL 指针可能表示 id 未分配,或者 NULL 指针与此 ID 关联。

在叶指针生命周期正确管理的情况下,此函数可以在 rcu_read_lock() 下调用。

返回

与此 ID 关联的指针。

int idr_for_each(const struct idr *idr, int (*fn)(int id, void *p, void *data), void *data)¶

迭代所有存储的指针。

参数

const struct idr *idrIDR 句柄。

int (*fn)(int id, void *p, void *data)为每个指针调用的函数。

void *data传递给回调函数的数据。

描述

将为 idr 中的每个条目调用回调函数,并传递 ID、条目和 data。

如果 fn 返回非 0 的值,则迭代停止,并从此函数返回该值。

如果受 RCU 保护,idr_for_each() 可以与 idr_alloc() 和 idr_remove() 并发调用。新添加的条目可能不会被看到,已删除的条目可能会被看到,但添加和删除条目不会导致其他条目被跳过,也不会导致虚假条目被看到。

void *idr_get_next_ul(struct idr *idr, unsigned long *nextid)¶

查找下一个已填充的条目。

参数

struct idr *idrIDR 句柄。

unsigned long *nextid指向一个 ID 的指针。

描述

返回树中 ID 大于或等于 nextid 所指向的值的下一个已填充条目。退出时,nextid 将更新为找到的值的 ID。要在循环中使用,用户必须递增 nextid 所指向的值。

void *idr_get_next(struct idr *idr, int *nextid)¶

查找下一个已填充的条目。

参数

struct idr *idrIDR 句柄。

int *nextid指向一个 ID 的指针。

描述

返回树中 ID 大于或等于 nextid 所指向的值的下一个已填充条目。退出时,nextid 将更新为找到的值的 ID。要在循环中使用,用户必须递增 nextid 所指向的值。

void *idr_replace(struct idr *idr, void *ptr, unsigned long id)¶

替换给定 ID 的指针。

参数

struct idr *idrIDR 句柄。

void *ptr与 ID 关联的新指针。

unsigned long id要更改的 ID。

描述

替换已注册 ID 的指针并返回旧值。此函数可以在 RCU 读锁下与 idr_alloc() 和 idr_remove() 并发调用(只要被移除的 ID 不是被替换的 ID!)。

返回

成功时的旧值。-ENOENT 表示未找到 id。-EINVAL 表示 ptr 无效。

int ida_alloc_range(struct ida *ida, unsigned int min, unsigned int max, gfp_t gfp)¶

分配一个未使用的 ID。

参数

struct ida *idaIDA 句柄。

unsigned int min要分配的最低 ID。

unsigned int max要分配的最高 ID。

gfp_t gfp内存分配标志。

描述

分配一个介于 min 和 max(含)之间的 ID。即使 max 更大,分配的 ID 也不会超过 INT_MAX。

上下文

任何上下文。在您的代码中,安全地调用此函数无需加锁。

返回

已分配的 ID,如果无法分配内存则为 -ENOMEM,如果没有空闲 ID 则为 -ENOSPC。

int ida_find_first_range(struct ida *ida, unsigned int min, unsigned int max)¶

获取最低使用的 ID。

参数

struct ida *idaIDA 句柄。

unsigned int min要获取的最低 ID。

unsigned int max要获取的最高 ID。

描述

获取介于 min 和 max(含)之间的最低已使用 ID。即使 max 更大,返回的 ID 也不会超过 INT_MAX。

上下文

任何上下文。获取并释放 xa_lock。

返回

最低使用的 ID,如果未找到使用的 ID 则返回 errno。

void ida_free(struct ida *ida, unsigned int id)¶

释放一个已分配的 ID。

参数

struct ida *idaIDA 句柄。

unsigned int id先前分配的 ID。

上下文

任何上下文。在您的代码中,安全地调用此函数无需加锁。

void ida_destroy(struct ida *ida)¶

释放所有 ID。

参数

struct ida *idaIDA 句柄。

描述

调用此函数将释放所有 ID 并释放 IDA 使用的所有资源。此调用返回后,IDA 将为空,可以重复使用或释放。如果 IDA 已为空,则无需调用此函数。

上下文

任何上下文。在您的代码中,安全地调用此函数无需加锁。