mirror of
https://github.com/matrix-construct/construct
synced 2025-03-17 06:50:23 +01:00
ircd::fs: Move madvise suite to allocator unit.
This commit is contained in:
parent
f0fe13e8e5
commit
5534672a07
3 changed files with 103 additions and 75 deletions
|
@ -47,6 +47,9 @@ namespace ircd::allocator
|
|||
bool trim(const size_t &pad = 0) noexcept; // malloc_trim(3)
|
||||
|
||||
size_t incore(const const_buffer &);
|
||||
size_t advise(const const_buffer &, const int &);
|
||||
size_t prefetch(const const_buffer &);
|
||||
size_t evict(const const_buffer &);
|
||||
|
||||
std::unique_ptr<char, decltype(&std::free)>
|
||||
aligned_alloc(const size_t &align, const size_t &size);
|
||||
|
|
|
@ -24,6 +24,26 @@ namespace ircd::allocator
|
|||
static void advise_hugepage(void *const &, const size_t &alignment, const size_t &size);
|
||||
}
|
||||
|
||||
#if defined(MADV_NORMAL) && defined(POSIX_MADV_NORMAL)
|
||||
static_assert(MADV_NORMAL == POSIX_MADV_NORMAL);
|
||||
#endif
|
||||
|
||||
#if defined(MADV_SEQUENTIAL) && defined(POSIX_MADV_SEQUENTIAL)
|
||||
static_assert(MADV_SEQUENTIAL == POSIX_MADV_SEQUENTIAL);
|
||||
#endif
|
||||
|
||||
#if defined(MADV_RANDOM) && defined(POSIX_MADV_RANDOM)
|
||||
static_assert(MADV_RANDOM == POSIX_MADV_RANDOM);
|
||||
#endif
|
||||
|
||||
#if defined(MADV_WILLNEED) && defined(POSIX_MADV_WILLNEED)
|
||||
static_assert(MADV_WILLNEED == POSIX_MADV_WILLNEED);
|
||||
#endif
|
||||
|
||||
#if defined(MADV_DONTNEED) && defined(POSIX_MADV_DONTNEED)
|
||||
static_assert(MADV_DONTNEED == POSIX_MADV_DONTNEED);
|
||||
#endif
|
||||
|
||||
std::unique_ptr<char, decltype(&std::free)>
|
||||
ircd::allocator::aligned_alloc(const size_t &alignment_,
|
||||
const size_t &size_)
|
||||
|
@ -115,6 +135,65 @@ catch(const std::exception &e)
|
|||
}
|
||||
#endif
|
||||
|
||||
size_t
|
||||
ircd::allocator::evict(const const_buffer &buf)
|
||||
{
|
||||
#if defined(POSIX_MADV_DONTNEED)
|
||||
return advise(buf, POSIX_MADV_DONTNEED);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
size_t
|
||||
ircd::allocator::prefetch(const const_buffer &buf)
|
||||
{
|
||||
#if defined(POSIX_MADV_WILLNEED)
|
||||
return advise(buf, POSIX_MADV_WILLNEED);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(HAVE_MADVISE)
|
||||
size_t
|
||||
ircd::allocator::advise(const const_buffer &buf,
|
||||
const int &advice)
|
||||
{
|
||||
assert(aligned(data(buf), info::page_size));
|
||||
switch(const auto r(::madvise(mutable_cast(data(buf)), size(buf), advice)); r)
|
||||
{
|
||||
case 0:
|
||||
return size(buf); // success
|
||||
|
||||
default:
|
||||
throw_system_error(r); // error
|
||||
}
|
||||
|
||||
__builtin_unreachable();
|
||||
}
|
||||
#elif defined(HAVE_POSIX_MADVISE)
|
||||
size_t
|
||||
ircd::allocator::advise(const const_buffer &buf,
|
||||
const int &advice)
|
||||
{
|
||||
const auto res
|
||||
{
|
||||
syscall(::posix_madvise, mutable_cast(data(buf)), size(buf), advice)
|
||||
};
|
||||
|
||||
return size(buf);
|
||||
}
|
||||
#else
|
||||
#warning "posix_madvise(2) not available for this compilation."
|
||||
size_t
|
||||
ircd::allocator::advise(const const_buffer &buf,
|
||||
const int &advice)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
size_t
|
||||
ircd::allocator::incore(const const_buffer &buf)
|
||||
{
|
||||
|
|
96
ircd/fs.cc
96
ircd/fs.cc
|
@ -1941,56 +1941,10 @@ namespace ircd::fs
|
|||
static uint prot(const map::opts &);
|
||||
}
|
||||
|
||||
#if defined(MADV_NORMAL) && defined(POSIX_MADV_NORMAL)
|
||||
static_assert(MADV_NORMAL == POSIX_MADV_NORMAL);
|
||||
#endif
|
||||
|
||||
#if defined(MADV_SEQUENTIAL) && defined(POSIX_MADV_SEQUENTIAL)
|
||||
static_assert(MADV_SEQUENTIAL == POSIX_MADV_SEQUENTIAL);
|
||||
#endif
|
||||
|
||||
#if defined(MADV_RANDOM) && defined(POSIX_MADV_RANDOM)
|
||||
static_assert(MADV_RANDOM == POSIX_MADV_RANDOM);
|
||||
#endif
|
||||
|
||||
#if defined(MADV_WILLNEED) && defined(POSIX_MADV_WILLNEED)
|
||||
static_assert(MADV_WILLNEED == POSIX_MADV_WILLNEED);
|
||||
#endif
|
||||
|
||||
#if defined(MADV_DONTNEED) && defined(POSIX_MADV_DONTNEED)
|
||||
static_assert(MADV_DONTNEED == POSIX_MADV_DONTNEED);
|
||||
#endif
|
||||
|
||||
size_t
|
||||
ircd::fs::evict(const map &map,
|
||||
const size_t &len,
|
||||
const opts &opts)
|
||||
{
|
||||
#if defined(POSIX_MADV_DONTNEED)
|
||||
return advise(map, POSIX_MADV_DONTNEED, len, opts);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
size_t
|
||||
ircd::fs::prefetch(const map &map,
|
||||
const size_t &len,
|
||||
const opts &opts)
|
||||
{
|
||||
#if defined(POSIX_MADV_WILLNEED)
|
||||
return advise(map, POSIX_MADV_WILLNEED, len, opts);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(HAVE_MADVISE) && defined(__linux__)
|
||||
size_t
|
||||
ircd::fs::advise(const map &map,
|
||||
const int &advice,
|
||||
const size_t &len,
|
||||
const opts &opts)
|
||||
{
|
||||
const size_t offset
|
||||
{
|
||||
|
@ -2002,19 +1956,27 @@ ircd::fs::advise(const map &map,
|
|||
map + offset, len
|
||||
};
|
||||
|
||||
assert(aligned(data(buf), info::page_size));
|
||||
switch(const auto res(::madvise(data(buf), size(buf), advice)); res)
|
||||
{
|
||||
case 0:
|
||||
return size(buf); // success
|
||||
|
||||
default:
|
||||
throw_system_error(res); // error
|
||||
}
|
||||
|
||||
__builtin_unreachable();
|
||||
return allocator::evict(buf);
|
||||
}
|
||||
#elif defined(HAVE_POSIX_MADVISE)
|
||||
|
||||
size_t
|
||||
ircd::fs::prefetch(const map &map,
|
||||
const size_t &len,
|
||||
const opts &opts)
|
||||
{
|
||||
const size_t offset
|
||||
{
|
||||
buffer::align(opts.offset, info::page_size)
|
||||
};
|
||||
|
||||
const mutable_buffer buf
|
||||
{
|
||||
map + offset, len
|
||||
};
|
||||
|
||||
return allocator::prefetch(buf);
|
||||
}
|
||||
|
||||
size_t
|
||||
ircd::fs::advise(const map &map,
|
||||
const int &advice,
|
||||
|
@ -2026,24 +1988,8 @@ ircd::fs::advise(const map &map,
|
|||
map + opts.offset, len
|
||||
};
|
||||
|
||||
const auto res
|
||||
{
|
||||
syscall(::posix_madvise, data(buf), size(buf), advice)
|
||||
};
|
||||
|
||||
return size(buf);
|
||||
return allocator::advise(buf, advice);
|
||||
}
|
||||
#else
|
||||
#warning "posix_madvise(2) not available for this compilation."
|
||||
size_t
|
||||
ircd::fs::advise(const map &map,
|
||||
const int &advice,
|
||||
const size_t &len,
|
||||
const opts &opts)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
//
|
||||
// map::map
|
||||
|
|
Loading…
Add table
Reference in a new issue