0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-30 02:32:43 +01:00

ircd::fs::aio: Initialize context with parameters sampled from devices.

ircd::fs: Simplify init infolog related.
This commit is contained in:
Jason Volk 2020-06-07 00:56:43 -07:00
parent 22eb9b514b
commit 839998e474
2 changed files with 23 additions and 22 deletions

View file

@ -73,16 +73,7 @@ ircd::fs::init_dump_info()
false || iou::system || aio::system false || iou::system || aio::system
}; };
if(support_async) if(!support_async)
log::info
{
log, "Asynchronous filesystem IO provided by %s %s.",
RB_OS,
iou::system? "io_uring":
aio::system? "AIO":
"?????",
};
else
log::warning log::warning
{ {
log, "Support for asynchronous filesystem IO has not been" log, "Support for asynchronous filesystem IO has not been"
@ -1615,6 +1606,12 @@ ircd::fs::reflect(const ready &ready)
// fs/aio.h // fs/aio.h
// //
decltype(ircd::fs::aio::MAX_EVENTS)
ircd::fs::aio::MAX_EVENTS
{
info::aio_max
};
decltype(ircd::fs::aio::MAX_REQPRIO) decltype(ircd::fs::aio::MAX_REQPRIO)
ircd::fs::aio::MAX_REQPRIO ircd::fs::aio::MAX_REQPRIO
{ {

View file

@ -42,18 +42,11 @@ ircd::fs::support::aio_fdsync
#endif #endif
}; };
decltype(ircd::fs::aio::MAX_EVENTS)
ircd::fs::aio::MAX_EVENTS
{
//TODO: device queue depth
std::min(info::aio_max, 64UL)
};
decltype(ircd::fs::aio::max_events) decltype(ircd::fs::aio::max_events)
ircd::fs::aio::max_events ircd::fs::aio::max_events
{ {
{ "name", "ircd.fs.aio.max_events" }, { "name", "ircd.fs.aio.max_events" },
{ "default", long(aio::MAX_EVENTS) }, { "default", 0L },
{ "persist", false }, { "persist", false },
}; };
@ -101,6 +94,19 @@ ircd::fs::aio::init::init()
return; return;
#endif #endif
// We don't know which storage device (if any one) will be used by this
// application, and we only have one aio instance shared by everything.
// To deal with this for now, we look for the most favorable device and
// tune to it. The caveat here is that if the application makes heavy use
// of an inferior device on the same system, it wont be optimally utilized.
if(max_events == 0UL)
for(const auto &[mm, bd] : fs::dev::block)
if(bd.is_device && bd.type == "disk")
max_events._value = std::clamp
(
bd.queue_depth, size_t(max_events), MAX_EVENTS
);
system = new struct aio::system system = new struct aio::system
( (
size_t(max_events), size_t(max_events),
@ -686,11 +692,9 @@ try
sizeof(*head), sizeof(*head),
}; };
log::debug log::info
{ {
log, "Established head(%p) ring(%p) id:%u fd:%d max_events:%zu max_submit:%zu compat:%x incompat:%x len:%u nr:%u", log, "AIO id:%u fd:%d max_events:%zu max_submit:%zu compat:%x incompat:%x len:%u nr:%u",
head.get(),
ring,
head->id, head->id,
int(resfd.native_handle()), int(resfd.native_handle()),
this->max_events(), this->max_events(),