Kernel: Make ext2 block buffers page aligned
This commit is contained in:
@@ -28,7 +28,7 @@ namespace Kernel
|
||||
BAN_NON_COPYABLE(BlockBufferWrapper);
|
||||
|
||||
public:
|
||||
BlockBufferWrapper(BAN::Span<uint8_t> buffer, void (*callback)(void*, const uint8_t*), void* argument)
|
||||
BlockBufferWrapper(BAN::ByteSpan buffer, void (*callback)(void*, const uint8_t*), void* argument)
|
||||
: m_buffer(buffer)
|
||||
, m_callback(callback)
|
||||
, m_argument(argument)
|
||||
@@ -60,13 +60,13 @@ namespace Kernel
|
||||
const uint8_t* data() const { return m_buffer.data(); }
|
||||
|
||||
BAN::ByteSpan span() { return m_buffer; }
|
||||
BAN::ConstByteSpan span() const { return m_buffer.as_const(); }
|
||||
BAN::ConstByteSpan span() const { return m_buffer; }
|
||||
|
||||
uint8_t& operator[](size_t index) { return m_buffer[index]; }
|
||||
uint8_t operator[](size_t index) const { return m_buffer[index]; }
|
||||
|
||||
private:
|
||||
BAN::Span<uint8_t> m_buffer;
|
||||
BAN::ByteSpan m_buffer;
|
||||
void (*m_callback)(void*, const uint8_t*);
|
||||
void* m_argument;
|
||||
};
|
||||
@@ -128,7 +128,7 @@ namespace Kernel
|
||||
private:
|
||||
struct BlockBuffer
|
||||
{
|
||||
BAN::Vector<uint8_t> buffer;
|
||||
BAN::ByteSpan buffer;
|
||||
bool used { false };
|
||||
};
|
||||
|
||||
@@ -144,6 +144,7 @@ namespace Kernel
|
||||
|
||||
Mutex m_buffer_mutex;
|
||||
ThreadBlocker m_buffer_blocker;
|
||||
BAN::UniqPtr<VirtualRange> m_buffer_data;
|
||||
BAN::Array<BlockBuffer, max_threads * max_buffers_per_thread> m_buffers;
|
||||
BAN::Array<ThreadInfo, max_threads> m_thread_infos;
|
||||
};
|
||||
|
||||
@@ -624,7 +624,7 @@ namespace Kernel
|
||||
continue;
|
||||
buffer.used = true;
|
||||
return Ext2FS::BlockBufferWrapper {
|
||||
buffer.buffer.span(),
|
||||
buffer.buffer,
|
||||
[](void* self, const uint8_t* buffer) { static_cast<BlockBufferManager*>(self)->destroy_callback(buffer); },
|
||||
this
|
||||
};
|
||||
@@ -635,11 +635,23 @@ namespace Kernel
|
||||
|
||||
BAN::ErrorOr<void> Ext2FS::BlockBufferManager::initialize(size_t block_size)
|
||||
{
|
||||
for (auto& buffer : m_buffers)
|
||||
m_buffer_data = TRY(VirtualRange::create_to_vaddr_range(
|
||||
PageTable::kernel(),
|
||||
{ KERNEL_OFFSET, BAN::numeric_limits<vaddr_t>::max() },
|
||||
block_size * m_buffers.size(),
|
||||
PageTable::ReadWrite | PageTable::Present,
|
||||
false
|
||||
));
|
||||
|
||||
auto buffer_data_span = BAN::ByteSpan { reinterpret_cast<uint8_t*>(m_buffer_data->vaddr()), m_buffer_data->size() };
|
||||
for (size_t i = 0; i < m_buffers.size(); i++)
|
||||
{
|
||||
TRY(buffer.buffer.resize(block_size));
|
||||
buffer.used = false;
|
||||
m_buffers[i] = {
|
||||
.buffer = buffer_data_span.slice(i * block_size, block_size),
|
||||
.used = false,
|
||||
};
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user