Kernel: Make VirtIOConsole block when VirtIOQueue is full

This commit is contained in:
Sahan Fernando 2021-04-18 18:10:34 +10:00 committed by Andreas Kling
parent 5c924d395f
commit 45f97c1096
4 changed files with 13 additions and 1 deletions

View file

@ -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)
{

View file

@ -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)

View file

@ -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;
}
}

View file

@ -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();