Просмотр исходного кода

Kernel: Make VirtIOConsole block when VirtIOQueue is full

Sahan Fernando 4 лет назад
Родитель
Сommit
45f97c1096

+ 6 - 0
Kernel/VirtIO/VirtIO.h

@@ -192,6 +192,12 @@ protected:
         return m_queues[queue_index];
     }
 
+    const VirtIOQueue& get_queue(u16 queue_index) const
+    {
+        VERIFY(queue_index < m_queue_count);
+        return m_queues[queue_index];
+    }
+
     template<typename F>
     bool negotiate_features(F f)
     {

+ 1 - 1
Kernel/VirtIO/VirtIOConsole.cpp

@@ -110,7 +110,7 @@ KResultOr<size_t> VirtIOConsole::read(FileDescription&, u64, [[maybe_unused]] Us
 
 bool VirtIOConsole::can_write(const FileDescription&, size_t) const
 {
-    return true;
+    return get_queue(TRANSMITQ).can_write();
 }
 
 KResultOr<size_t> VirtIOConsole::write(FileDescription&, u64, const UserOrKernelBuffer& data, size_t size)

+ 5 - 0
Kernel/VirtIO/VirtIOQueue.cpp

@@ -145,4 +145,9 @@ void VirtIOQueue::pop_buffer(u16 descriptor_index)
     m_free_head = descriptor_index;
 }
 
+bool VirtIOQueue::can_write() const
+{
+    return m_free_buffers > 0;
+}
+
 }

+ 1 - 0
Kernel/VirtIO/VirtIOQueue.h

@@ -60,6 +60,7 @@ public:
 
     bool supply_buffer(Badge<VirtIODevice>, const ScatterGatherList&, BufferType, void* token);
     bool new_data_available() const;
+    bool can_write() const;
     void* get_buffer(size_t*);
     void discard_used_buffers();