|
驱动程序中出现“scheduling while atomic”的提示
[复制链接]
设备结构定义如下:
typedef struct smschar_dev
{
volatile int pending_messages; //!< number of pending messages for this channel
struct cdev cdev; //!< Char device structure -
wait_queue_head_t wtq; //!< wait queue for read and poll to block on
spinlock_t lock; //!< critical section
struct list_head pending_data; //!< list of pending data
}CharDev_ST;
在从一个缓冲区读取数据的函数中,代码大概如下
ssize_t chr_read(struct file * filp, char __user * buf, size_t count, loff_t * f_pos)
{
CharDev_ST *dev = filp->private_data;
spin_lock(&dev->lock);
if(wait_event_interruptible(dev-wtq,!list_empty(&dev->pending_data)))
{
spin_unlock(&dev->lock);
return -ERESTARTSYS;
}
///在这里读取数据
spin_unlock(&dev->lock);
}
下面是数据到达时,往该设备的缓冲区填充数据的函数,大概实现过程:
spinlock_t global_read_ctrl_lock = SPIN_LOCK_UNLOCKED;
static void fill_buffer(u8* buf,int len)
{
unsigned long flags;
spin_lock_irqsave(&global_read_ctrl_lock,flags);
//在这里填充数据
wake_up_interruptible (&(pDev->wtq));
spin_unlock_irqrestore(&global_read_ctrl_lock,flags);
}
在运行的过程中,内核打印了BUG: scheduling while atomic,的提示,而且每次读取一次数据,就打印一次。我的理解是,内核认为在chr_read函数中,会出现占用了dev->lock的情况下由于wait_event_interruptible造成睡眠的情况。
不知各位有没有好的解决这个问题的方法?把内核的“BUG: scheduling while atomic”提示去掉,我尝试把chr_read函数的spin_lock和wait_event_interruptible进行对调,那个打印信息倒是去掉了,但是觉得这样有问题。请各位指点下啊
|
|