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