mirror of
https://github.com/matrix-construct/construct
synced 2024-12-27 07:54:05 +01:00
ircd::fs::aio: Improve interface with kernel context structure.
This commit is contained in:
parent
672bb6f10c
commit
0ffb6d6c8e
2 changed files with 52 additions and 17 deletions
|
@ -410,23 +410,59 @@ try
|
||||||
{
|
{
|
||||||
ios::get(), int(syscall(::eventfd, ecount, eventfd_flags))
|
ios::get(), int(syscall(::eventfd, ecount, eventfd_flags))
|
||||||
}
|
}
|
||||||
|
,head
|
||||||
{
|
{
|
||||||
syscall<SYS_io_setup>(this->max_events(), &idp);
|
[this]
|
||||||
|
|
||||||
const system::ring *const ring
|
|
||||||
{
|
{
|
||||||
reinterpret_cast<const system::ring *>(idp)
|
aio_context *idp;
|
||||||
|
syscall<SYS_io_setup>(this->max_events(), &idp);
|
||||||
|
return idp;
|
||||||
|
}(), []
|
||||||
|
(const aio_context *const &head)
|
||||||
|
{
|
||||||
|
syscall<SYS_io_destroy>(head);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,ring
|
||||||
|
{
|
||||||
|
reinterpret_cast<const io_event *>
|
||||||
|
(
|
||||||
|
reinterpret_cast<const uint8_t *>(head.get()) +
|
||||||
|
sizeof(aio_context)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assert(head->magic == aio_context::MAGIC);
|
||||||
|
assert(sizeof(aio_context) == head->header_length);
|
||||||
|
if(unlikely(head->magic != aio_context::MAGIC))
|
||||||
|
throw panic
|
||||||
|
{
|
||||||
|
"ircd::fs::aio kernel context structure magic:%u != %u",
|
||||||
|
head->magic,
|
||||||
|
aio_context::MAGIC,
|
||||||
};
|
};
|
||||||
|
|
||||||
assert(ring->magic == ring::MAGIC);
|
if(unlikely(head->header_length != sizeof(*head)))
|
||||||
|
throw panic
|
||||||
|
{
|
||||||
|
"ircd::fs::aio kernel context structure length:%u != %u",
|
||||||
|
head->header_length,
|
||||||
|
sizeof(*head),
|
||||||
|
};
|
||||||
|
|
||||||
log::debug
|
log::debug
|
||||||
{
|
{
|
||||||
"Established AIO(%p) context (fd:%d max_events:%zu max_submit:%zu)",
|
"Established head(%p) ring(%p) id:%u fd:%d max_events:%zu max_submit:%zu compat:%x incompat:%x len:%u nr:%u",
|
||||||
this,
|
head.get(),
|
||||||
|
ring,
|
||||||
|
head->id,
|
||||||
int(resfd.native_handle()),
|
int(resfd.native_handle()),
|
||||||
this->max_events(),
|
this->max_events(),
|
||||||
this->max_submit(),
|
this->max_submit(),
|
||||||
|
head->compat_features,
|
||||||
|
head->incompat_features,
|
||||||
|
head->header_length,
|
||||||
|
head->nr
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
catch(const std::exception &e)
|
catch(const std::exception &e)
|
||||||
|
@ -450,8 +486,6 @@ noexcept try
|
||||||
|
|
||||||
boost::system::error_code ec;
|
boost::system::error_code ec;
|
||||||
resfd.close(ec);
|
resfd.close(ec);
|
||||||
|
|
||||||
syscall<SYS_io_destroy>(idp);
|
|
||||||
}
|
}
|
||||||
catch(const std::exception &e)
|
catch(const std::exception &e)
|
||||||
{
|
{
|
||||||
|
@ -572,7 +606,7 @@ ircd::fs::aio::system::cancel(request &request)
|
||||||
result.res = -1;
|
result.res = -1;
|
||||||
result.res2 = ECANCELED;
|
result.res2 = ECANCELED;
|
||||||
} else {
|
} else {
|
||||||
syscall_nointr<SYS_io_cancel>(idp, cb, &result);
|
syscall_nointr<SYS_io_cancel>(head.get(), cb, &result);
|
||||||
in_flight--;
|
in_flight--;
|
||||||
stats.cur_submits--;
|
stats.cur_submits--;
|
||||||
dock.notify_one();
|
dock.notify_one();
|
||||||
|
@ -717,7 +751,7 @@ try
|
||||||
qcount
|
qcount
|
||||||
};
|
};
|
||||||
|
|
||||||
return syscall<SYS_io_submit>(idp, qcount, queue.data());
|
return syscall<SYS_io_submit>(head.get(), qcount, queue.data());
|
||||||
}
|
}
|
||||||
catch(const std::system_error &e)
|
catch(const std::system_error &e)
|
||||||
{
|
{
|
||||||
|
@ -871,7 +905,7 @@ noexcept try
|
||||||
// events but it never blocks to do so.
|
// events but it never blocks to do so.
|
||||||
const auto count
|
const auto count
|
||||||
{
|
{
|
||||||
syscall_nointr<SYS_io_getevents>(idp, 0, event.size(), event.data(), nullptr)
|
syscall_nointr<SYS_io_getevents>(head.get(), 0, event.size(), event.data(), nullptr)
|
||||||
};
|
};
|
||||||
|
|
||||||
// The count should be at least 1 event. The only reason to return 0 might
|
// The count should be at least 1 event. The only reason to return 0 might
|
||||||
|
|
|
@ -27,7 +27,7 @@ namespace ircd::fs::aio
|
||||||
/// an extern instance pointer at fs::aio::context maintained by fs::aio::init.
|
/// an extern instance pointer at fs::aio::context maintained by fs::aio::init.
|
||||||
struct ircd::fs::aio::system
|
struct ircd::fs::aio::system
|
||||||
{
|
{
|
||||||
struct ring;
|
struct aio_context;
|
||||||
|
|
||||||
static const int eventfd_flags;
|
static const int eventfd_flags;
|
||||||
|
|
||||||
|
@ -55,7 +55,8 @@ struct ircd::fs::aio::system
|
||||||
asio::posix::stream_descriptor resfd;
|
asio::posix::stream_descriptor resfd;
|
||||||
|
|
||||||
/// Handler to the io context we submit requests to the system with
|
/// Handler to the io context we submit requests to the system with
|
||||||
aio_context_t idp {0};
|
const custom_ptr<const aio_context> head;
|
||||||
|
const io_event *ring {nullptr};
|
||||||
|
|
||||||
size_t max_events() const;
|
size_t max_events() const;
|
||||||
size_t max_submit() const;
|
size_t max_submit() const;
|
||||||
|
@ -88,7 +89,7 @@ struct ircd::fs::aio::system
|
||||||
~system() noexcept;
|
~system() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ircd::fs::aio::system::ring
|
struct ircd::fs::aio::system::aio_context
|
||||||
{
|
{
|
||||||
static constexpr uint MAGIC {0xA10A10A1};
|
static constexpr uint MAGIC {0xA10A10A1};
|
||||||
|
|
||||||
|
@ -99,7 +100,7 @@ struct ircd::fs::aio::system::ring
|
||||||
uint magic;
|
uint magic;
|
||||||
uint compat_features;
|
uint compat_features;
|
||||||
uint incompat_features;
|
uint incompat_features;
|
||||||
uint header_length; // size of aio_ring
|
uint header_length; // size of aio_context
|
||||||
struct io_event io_events[0];
|
struct io_event io_events[0];
|
||||||
};
|
};
|
||||||
// 128 bytes + ring size
|
// 128 bytes + ring size
|
||||||
|
|
Loading…
Reference in a new issue