]> Zhao Yanbai Git Server - kernel.git/commitdiff
在 buffer 上添加等待队列和 io 结束completion
authoracevest <zhaoyanbai@126.com>
Fri, 20 Oct 2023 12:43:31 +0000 (20:43 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 13 Apr 2024 08:17:03 +0000 (16:17 +0800)
fs/buffer.c
include/buffer.h
include/completion.h
include/sched.h
include/semaphore.h
include/task.h
include/wait.h
kernel/completion.c
kernel/irq.c

index a5f0777d745bca128e400d866f54ffbfde6f49e3..5d98a227b66097ed726f15bb1f37c58c4a74b809 100644 (file)
@@ -108,7 +108,7 @@ again:
         assert(NULL != t);
         assert(t->block_size == size);
 
-        if (t->ref_count == 0 && t->locked == 0) {
+        if (t->ref_count == 0) {
             b = t;
             break;
         }
@@ -123,13 +123,13 @@ again:
         goto again;
     }
 
-    // 此时b->locked不一定为0
+    // 把它从free_list上删掉
+    list_del_init(&b->node);
+
+    // 虽然此时该bbuffer_t上的ref_count为0但其可能还有I/O操作没有完成
     // 因为可能有的进程调用了write、read后再直接调用brelse
-    // 虽然此时ref_count为0,但io操作标记的b->locked并未结束
     // 所以需要在此等待其结束
-    while (b->locked == 1) {
-        // 此时是不用担心wake_up在这个sleep_on之前调用
-    }
+    wait_completion(&b->io_done);
 
     // 找到了
     b->block = block;
@@ -190,7 +190,7 @@ void init_buffer() {
             b->dev = 0;
             b->page = page;
             b->uptodate = 0;
-            b->locked = 0;
+            init_completion(&b->io_done);
             list_init(&b->node);
 
             assert(NULL != b->data);
index 8f570cc5fa9519da3ff0029758be1646e1f5ee78..c64a3a88c44aed7e7ad452f490f2d048c88afed8 100644 (file)
 #pragma once
 
 #include <atomic.h>
+#include <completion.h>
 #include <fs.h>
 #include <mm.h>
 #include <page.h>
 #include <system.h>
-
 typedef struct bbuffer {
     uint32_t block;  // block number
     void *data;      //
@@ -22,8 +22,7 @@ typedef struct bbuffer {
     dev_t dev;
     page_t *page;
     list_head_t node;
+    completion_t io_done;
     uint16_t block_size;  // block size
     uint16_t uptodate : 1;
-    uint16_t locked : 1;
-    uint16_t dirt : 1;  // 还不支持
 } bbuffer_t;
index 291f73ae122e7439d9d1c5885a105b77f3f6642f..93afe91a6133401f3e9eac1ba850b7f1b1ff8e0b 100644 (file)
@@ -9,7 +9,6 @@
 
 #pragma once
 
-#if 0
 #include <wait.h>
 
 typedef struct completion {
@@ -24,4 +23,3 @@ void wait_completion(completion_t *x);
 void init_completion(completion_t *x);
 
 void complete(completion_t *x);
-#endif
index ed00ce6dde3f99f2c511245fd665088b63e011d1..7bc55cc600d1df91db6d766d4fc0628e77f8a1f6 100644 (file)
@@ -25,8 +25,6 @@
 
 void schedule();
 
-void wake_up(wait_queue_head_t *wqh);
-
 extern task_union root_task;
 
 extern void load_cr3(task_union *tsk);
index 27eb0094f546bf0576346d4a20ba7cd55873650a..207341cb428e48770733035c4a9fa3ff125215d0 100644 (file)
@@ -28,8 +28,6 @@ void semaphore_init(semaphore_t *s, unsigned int v);
 // 如果s->cnt == 0 会重新调度进程
 volatile void down(semaphore_t *s);
 
-// volatile bool try_down(semaphore_t *s);
-
 // up
 // 只会唤醒进程,但不会立即重新调度进程
 volatile void up(semaphore_t *s);
index 18827237c264ae2b4f8edfc5b08f85d9e5597741..795b28e3b423e2b32104a664fc8478c57978d8bf 100644 (file)
@@ -22,7 +22,7 @@
 #include <processor.h>
 #include <system.h>
 #include <types.h>
-#include <wait.h>
+// #include <wait.h>
 
 enum {
     TASK_UNUSED,
index 8f29e935d4e75cda0b18fd9ccce0b478171ef54e..f1bf5ea0aec44592627355edcc97dac0e02e8ef5 100644 (file)
@@ -14,7 +14,7 @@
 
 #include <irq.h>
 #include <list.h>
-
+#include <sched.h>
 union task_union;
 
 typedef struct wait_queue_head {
index d556f3192fc99c02422a932782a806d9d34e7aaa..78c191c03320d389220f6ed0e910f6266bea04e8 100644 (file)
@@ -7,7 +7,6 @@
  * ------------------------------------------------------------------------
  */
 
-#if 0
 #include <completion.h>
 #include <sched.h>
 
@@ -25,4 +24,3 @@ void init_completion(completion_t *x) {
     x->done = 0;
     init_wait_queue_head(&x->wait);
 }
-#endif
index ff2d26585b2b355e103cfb13b592955271e7c1c5..b6f6a5b45b1378d27c60cee74ec845b5969c213e 100644 (file)
@@ -75,6 +75,7 @@ void dump_irq_nr_stack() {
 #endif
 
 void irq_bh_handler();
+void schedule();
 
 __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
     unsigned int irq = regs->irq;