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,代表新添加的资源和已有的资源不冲突.
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
- request_resource_conflict 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析:SparseArray分析
- 源码- Spark Broadcast源码分析
- Android源码/框架源码分析
- 【Android应用源码分析】HandlerThread 源码分析
- 【Android应用源码分析】IntentService 源码分析
- java源码分析01-Object源码分析
- VC++源码分析 - 中国象棋源码分析
- [Java源码分析]ArrayList源码分析
- [java源码分析]LinkedList源码分析
- java-使用 freemarker 替换 jstl EL 开发 springmvc web项目
- Others2_谈谈个人常用的软件
- Android Dalvik 虚拟机(一)
- iOS 抓取 HTML ,CSS XPath 解析数据
- Oracle问题——查询数值数据时,小数点前0不显示
- request_resource_conflict 源码分析
- Dubbo超时配置
- tld算法总结
- JS和HTML结合
- updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db'
- Android 热修复 Tinker接入
- error: xxx.elf uses VFP register arguments
- 学习python——python实现简单的用户登录
- MySql 模糊查询