2011-8-1 21:13:48
来源:互联网 发布:淘宝哪个网站领优惠券 编辑:程序博客网 时间:2024/04/30 04:48
2011-8-1 21:13:48
struct percpu_data {
void *ptrs[NR_CPUS];
};
#define __percpu_disguise(pdata) (struct percpu_data *)~(unsigned long)(pdata)
每cpu数据
void percpu_depopulate(void *__pdata, int cpu)
{
struct percpu_data *pdata = __percpu_disguise(__pdata);
kfree(pdata->ptrs[cpu]);
pdata->ptrs[cpu] = NULL;
}
释放指定CPU的perCpu数据
void __percpu_depopulate_mask(void *__pdata, cpumask_t *mask)
{
int cpu;
for_each_cpu_mask(cpu, *mask)
percpu_depopulate(__pdata, cpu);
}
用掩码的形式指定一些CPU来释放数据
void *percpu_populate(void *__pdata, size_t size, gfp_t gfp, int cpu)
{
struct percpu_data *pdata = __percpu_disguise(__pdata);
int node = cpu_to_node(cpu);
BUG_ON(pdata->ptrs[cpu]);
if (node_online(node)) {
/* FIXME: kzalloc_node(size, gfp, node) */
pdata->ptrs[cpu] = kmalloc_node(size, gfp, node);
if (pdata->ptrs[cpu])
memset(pdata->ptrs[cpu], 0, size);
} else
pdata->ptrs[cpu] = kzalloc(size, gfp);
return pdata->ptrs[cpu];
}
如果CPU有节点就在节点上分配
static wait_queue_head_t congestion_wqh[2] = {
__WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[0]),
__WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[1])
};
有2个阻塞队列
void clear_bdi_congested(struct backing_dev_info *bdi, int rw)
{
enum bdi_state bit;
wait_queue_head_t *wqh = &congestion_wqh[rw];
bit = (rw == WRITE) ? BDI_write_congested : BDI_read_congested;
clear_bit(bit, &bdi->state);
smp_mb__after_clear_bit();
if (waitqueue_active(wqh))
wake_up(wqh);
}
清除阻塞队列 唤醒阻塞进程
void set_bdi_congested(struct backing_dev_info *bdi, int rw)
{
enum bdi_state bit;
bit = (rw == WRITE) ? BDI_write_congested : BDI_read_congested;
set_bit(bit, &bdi->state);
}
设置阻塞
long congestion_wait(int rw, long timeout)
{
long ret;
DEFINE_WAIT(wait);
wait_queue_head_t *wqh = &congestion_wqh[rw];
prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
ret = io_schedule_timeout(timeout);
finish_wait(wqh, &wait);
return ret;
}
把自己加入到等待队列中,并设置阻塞超时
long congestion_wait_interruptible(int rw, long timeout)
{
long ret;
DEFINE_WAIT(wait);
wait_queue_head_t *wqh = &congestion_wqh[rw];
prepare_to_wait(wqh, &wait, TASK_INTERRUPTIBLE);
if (signal_pending(current))
ret = -ERESTARTSYS;
else
ret = io_schedule_timeout(timeout);
finish_wait(wqh, &wait);
return ret;
}
可信号唤醒的阻塞等待
void congestion_end(int rw)
{
wait_queue_head_t *wqh = &congestion_wqh[rw];
if (waitqueue_active(wqh))
wake_up(wqh);
}
阻塞结束
- 2011-8-1 21:13:48
- 2011-8-10 21:55:13
- 2011-8-1 21:05:03
- 2011-8-1 21:07:39
- 2011-8-1 21:40:28
- 2011-8-13 1:18:23
- 2011-8-21
- 2011-8-8 18:48:31
- 2011-9-17 13:48:42
- 2011-9-17 13:48:42
- 1 1 2 3 5 8 13 21 34
- 2011-8-13 16:13:41
- 2011-02-17 13:40:21
- 2011-06-06 13:21:30
- 2011-7-10 13:50:21
- sdibt 2552 计算1 - 1/2 + 2/3 - 3/5 + 5/8 - 8/13 + 13/21…前n项
- 2011-8-8 13:07:20
- 2/1+3/2+5/3+8/5+13/8+21/13......前20项之和?
- 用Java删除文件夹中嵌套了很多层的文件【鼠标右键不能删除解决方法】
- Microsoft JScript 运行时错误: 'Sys' 未定义
- POJ 1013
- googlemaps API V3 之(三)marker集群优化处理
- 【VC++】VS2005/2008 CString和const char*
- 2011-8-1 21:13:48
- 自己的无线网卡使用--方便以后自己查看
- 【VC++】VS2005中MessageBox问题
- 做Web Application开发我常去的网站
- 实习归来
- 在python下file类型、open方法
- 小SQL(一)
- 【VC++】VC对话框中增加菜单栏
- 地面搜索(上) (2008高教社杯全国大学生数学建模竞赛)