request_resource_conflict 源码分析

来源:互联网 发布:mac pro配什么显示器 编辑:程序博客网 时间:2024/05/16 10:41
request_resource_conflict 用于检测新的resource和已经加入的resource是否有重叠,这个函数可以检测io/memory resource是否冲突
struct resource *request_resource_conflict(struct resource *root, struct resource *new)
{
struct resource *conflict;


write_lock(&resource_lock);
conflict = __request_resource(root, new);
write_unlock(&resource_lock);
return conflict;
}
这个函数的第一个参数必须是io/memory 的root,其定义如下:
struct resource ioport_resource = {
.name = "PCI IO",
.start = 0,
.end = IO_SPACE_LIMIT,
.flags = IORESOURCE_IO,
};
EXPORT_SYMBOL(ioport_resource);


struct resource iomem_resource = {
.name = "PCI mem",
.start = 0,
.end = -1,
.flags = IORESOURCE_MEM,
};
EXPORT_SYMBOL(iomem_resource);
request_resource_conflict 通过resource_lock 后调用__request_resource,其返回值也是resource类型,如果其值不为NULL的话,就表示有冲突
static struct resource * __request_resource(struct resource *root, struct resource *new)
{
resource_size_t start = new->start;
resource_size_t end = new->end;
struct resource *tmp, **p;


if (end < start)
return root;
if (start < root->start)
return root;
if (end > root->end)
return root;
p = &root->child;
for (;;) {
tmp = *p;
if (!tmp || tmp->start > end) {
new->sibling = tmp;
*p = new;
new->parent = root;
return NULL;
}
p = &tmp->sibling;
if (tmp->end < start)
continue;
return tmp;
}
}
在__request_resource 中首先得到需要新检测的resource的start和end
resource_size_t start = new->start;
resource_size_t end = new->end;
检测的原来就是看start~end 这段空间是否和已有的空间冲突
核心的检查在for循环中,这个for是死循环,其出口有两个,第一个是return NULL,第二是return tmp。我们假定以return NULL为结果,可以看如果tmp为null,也就是到最后一个resource了,或者tmp->start > end 就代表没有冲突,这两种情况下就返回NULL,代表新添加的资源和已有的资源不冲突.
0 0
原创粉丝点击