阅读:1239回复:0
求助!关于硬盘中断 i/o的问题
最近正在写一个ide硬盘filter的程序,其中用到一个简单的read操作:对端口发出命令后,进程阻塞,直到硬盘中断服务程序完成后继续执行,我用了以下语句实现:
DECLARE_WAIT_QUEUE_HEAD(my_wq); int complete; .......... complete=0; if(do_rw_disk(drive,rq,block)==ide_started) if(!complete){ cli(); if (!complete) interruptible_sleep_on(my_wq); ide_sti(); } ....... 在中断服务程序中: static ide_startstop_t read_intr1 (ide_drive_t *drive){ ....... my_complete=1; wake_up_interruptible(&my_wq); return ide_stopped; } 执行时发现 interruptible_sleep_on(my_wq)调用 schedule()时出错: ”scheduling in interrupt \" 翻了下原码发现在schedule()中有一行 if (in_interrupt()) goto scheduling_in_interrupt; scheduling_in_interrupt: printk(\"Scheduling in interrupt\\n\"); BUG(); , 问题好像出在这里.后来我在cli()前面调用in_interrupt()返回值也是真,不知如何解决,我对同步问题不太了解,希望那位高人能指点一二! |
|