From bab329103a59dcdde2d79f710e31a90c3f37bedc Mon Sep 17 00:00:00 2001 From: acevest Date: Sat, 27 Nov 2021 11:54:08 +0800 Subject: [PATCH] =?utf8?q?ide=20ata=20disk=20=E9=A9=B1=E5=8A=A8=E7=A8=8B?= =?utf8?q?=E5=BA=8F=E4=BD=BF=E7=94=A8=20completion=5Ft=20=E6=9D=A5?= =?utf8?q?=E7=AD=89=E5=BE=85=E7=A3=81=E7=9B=98=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- include/disk.h | 7 ++++--- kernel/task_disk.c | 16 +++++++++++----- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/include/disk.h b/include/disk.h index 96ef573..15f4338 100644 --- a/include/disk.h +++ b/include/disk.h @@ -9,10 +9,10 @@ #pragma once +#include #include #include #include -#include typedef enum { DISK_REQ_IDENTIFY, @@ -26,13 +26,14 @@ typedef struct disk_request { void *buf; // 到的缓冲区 disk_request_cmd_t command; // 命令 list_head_t list; - wait_queue_head_t wait; // 等待队列 + // wait_queue_head_t wait; // 等待队列 // 驱动器完全有可能在进程在进程睡眠到等待队列前返回数据并执行唤醒操作 // 这时等待队列上无进程,就相当于不执行任何操作 // 然后进程再睡眠到等待队列上,就会造成永远无法唤醒该进程 // 因此要添加一个字段,标志驱动器已经对该请求做过唤醒操作 // 进程在睡眠前需要检查该字段 - int done; + // int done; + completion_t completion; } disk_request_t; typedef struct { diff --git a/kernel/task_disk.c b/kernel/task_disk.c index 15800f1..e6960df 100644 --- a/kernel/task_disk.c +++ b/kernel/task_disk.c @@ -7,6 +7,7 @@ * ------------------------------------------------------------------------ */ +#include #include #include @@ -35,8 +36,11 @@ void send_disk_request(disk_request_t *r) { panic("disk DMA read cross 64K"); } - INIT_LIST_HEAD(&r->wait.task_list); - r->done = 0; + // INIT_LIST_HEAD(&r->wait.task_list); + // r->done = 0; + + init_completion(&r->completion); + // r.pos = pos; // r.count = count; // r.buf = kmalloc(512, 0); @@ -60,7 +64,8 @@ void send_disk_request(disk_request_t *r) { // 等待task_dist结束 // printk("wait event\n"); - wait_event(&r->wait, r->done != 0); + // wait_event(&r->wait, r->done != 0); + wait_completion(&r->completion); // printk("wait finished\n"); } @@ -122,7 +127,8 @@ void disk_task_entry() { } // 唤醒等待该请求的进程 - r->done = 1; - wake_up(&r->wait); + // r->done = 1; + // wake_up(&r->wait); + complete(&r->completion); } } -- 2.44.0