从2.6.32 移植到 2.6.18内核 上碰到的一个问题
当我们判断某个 红黑树节点 或者 list_node 没有被 加到红黑树(或者list)上时,我们会用
RB_EMPTY_NODE
list_empty_careful
if(!RB_EMPTY_NODE) {...} 表示若该节点没有被加到红黑树,就如何处理。
但是在2.6.32内核中,该函数的语义变了。
if(RB_EMPTY_NODE) {...} 表示若该节点没有被加到红黑树,就如何处理。
1
preempt_count 获得当前进程上下文的spin_lock或者读写锁的数目。
默认编译选项出来的linux内核是非抢占式的,该模式下preempt_count一直为0,但是当你把内核编译成抢占式的话,该值会发生变化。
2
nr_free_pages 获得系统当前空闲页的数目。
3
用wait_on_bit 代替spin_lock。
在spin_lock中,schedule(或者sleep)都会发生很严重的问题, 所以可以尝试使用wait_on_bit。以前使用信号量来控制并发,但是信号量内部也是使用自旋锁实现的,所以现在使用 wait_on_bit这个函数。
它底层是用wait_queue_head_t实现的
:__wait_on_bit会让进程休眠吗? http://www.linuxforum.net/forum/showflat.php?Board=linuxK&Number=616702
4
wait_event(true)
将当前进程同步到某个事件
5 signal_pending( current )
检查当前进程是否有信号处理,返回不为0表示有信号需要处理
等待队列操作(wait queue) http://makel2004.blog.163.com/blog/static/413507720081153113241/
6 改变块设备的大小,并写入磁盘
set_capacity(asdp->gd, asdp->size);
i_size_write(bdev->bd_inode, dev_size);
mark_inode_dirty_sync(bdev->bd_inode);
7 test_bit返回值
test_bit(int nr, void* addr)
前提:一个数的第2位被置位
若nr使用常数的话,则test_bit返回1 (内部调用constant_test_bit)
若nr使用变量的话,则test_bit返回-1 (内部调用variable_test_bit)
8 schedule_timeout
使用它一般建议睡眠的时间为HZ/50。 其它值可能有问题。
使用方法见内核。 一般是先把current置为TASK_INTERRUPTIBLE(或者TASK_UNINTERRUPTIBLE)