0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-25 08:12:37 +01:00

ircd::ctx: Add nice/ionice values to context.

This commit is contained in:
Jason Volk 2020-01-06 11:40:37 -08:00
parent 68a56374e3
commit 78d300b3b7
4 changed files with 46 additions and 0 deletions

View file

@ -50,6 +50,8 @@ namespace ircd::ctx
const int32_t &notes(const ctx &) noexcept; // Peeks at internal semaphore count
const uint64_t &epoch(const ctx &) noexcept; // Context switching counter
const ulong &cycles(const ctx &) noexcept; // Accumulated tsc (not counting cur slice)
const int8_t &ionice(const ctx &) noexcept; // IO priority nice-value
const int8_t &nice(const ctx &) noexcept; // Scheduling priority nice-value
bool interruptible(const ctx &) noexcept; // Context can throw at interruption point
bool interruption(const ctx &) noexcept; // Context was marked for interruption
bool termination(const ctx &) noexcept; // Context was marked for termination
@ -59,6 +61,8 @@ namespace ircd::ctx
bool waiting(const ctx &) noexcept; // started() && !finished() && !running()
bool queued(const ctx &) noexcept; // !running() && notes() > 0
int8_t ionice(ctx &, const int8_t &); // IO priority nice-value
int8_t nice(ctx &, const int8_t &); // Scheduling priority nice-value
void interruptible(ctx &, const bool &); // False for interrupt suppression.
void interrupt(ctx &); // Interrupt the context.
void terminate(ctx &); // Interrupt for termination.

View file

@ -512,6 +512,22 @@ ircd::ctx::interruptible(ctx &ctx,
ctx.flags |= context::NOINTERRUPT;
}
int8_t
ircd::ctx::nice(ctx &ctx,
const int8_t &val)
{
ctx.nice = val;
return ctx.nice;
}
int8_t
ircd::ctx::ionice(ctx &ctx,
const int8_t &val)
{
ctx.ionice = val;
return ctx.ionice;
}
/// !running() && notes > 0
[[gnu::hot]]
bool
@ -593,6 +609,24 @@ noexcept
return prof::get(ctx, prof::event::CYCLES);
}
/// Returns the IO priority nice-value
[[gnu::hot]]
const int8_t &
ircd::ctx::ionice(const ctx &ctx)
noexcept
{
return ctx.ionice;
}
/// Returns the context scheduling priority nice-value
[[gnu::hot]]
const int8_t &
ircd::ctx::nice(const ctx &ctx)
noexcept
{
return ctx.nice;
}
/// Returns the yield count for `ctx`
[[gnu::hot]]
const uint64_t &

View file

@ -52,6 +52,8 @@ struct ircd::ctx::ctx
uint64_t id {++id_ctr}; // Unique runtime ID
string_view name; // User given name (optional)
context::flags flags; // User given flags
int8_t nice {0}; // Scheduling priority nice-value
int8_t ionice {0}; // IO priority nice-value (defaults for fs::opts)
int32_t notes {0}; // norm: 0 = asleep; 1 = awake; inc by others; dec by self
boost::asio::io_service::strand strand; // mutex/serializer
boost::asio::deadline_timer alarm; // acting semaphore (64B)

View file

@ -3987,6 +3987,8 @@ ircd::db::database::env::state::pool::pool(database &d,
{
pri == Priority::HIGH?
IOPriority::IO_HIGH:
pri == Priority::BOTTOM?
IOPriority::IO_LOW:
IOPriority::IO_LOW
}
,name
@ -4002,6 +4004,10 @@ ircd::db::database::env::state::pool::pool(database &d,
0, // initial workers
-1, // queue hard limit
-1, // queue soft limit
true, // queue_max_blocking
true, // queue_max_dwarning
make_nice(iopri), // ionice
make_nice(this->pri), // nice
}
,p
{