]> Zhao Yanbai Git Server - kernel.git/commitdiff
ide ata disk 驱动程序使用 completion_t 来等待磁盘操作
authoracevest <zhaoyanbai@126.com>
Sat, 27 Nov 2021 03:54:08 +0000 (11:54 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 27 Nov 2021 03:54:08 +0000 (11:54 +0800)
include/disk.h
kernel/task_disk.c

index 96ef5739cca8af13527a201ca8031964e04d284c..15f433806f18afb74ea58b9fcd35de4b8fabd921 100644 (file)
@@ -9,10 +9,10 @@
 
 #pragma once
 
+#include <completion.h>
 #include <list.h>
 #include <semaphore.h>
 #include <types.h>
-#include <wait.h>
 
 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 {
index 15800f125551213c8241f9b48e7905d1b92e1eb4..e6960df0ff42d4cf4bcd20c600862561e6603537 100644 (file)
@@ -7,6 +7,7 @@
  * ------------------------------------------------------------------------
  */
 
+#include <completion.h>
 #include <disk.h>
 #include <sched.h>
 
@@ -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);
     }
 }