Commit Graph
100 Commits
Author SHA1 Message Date
Paweł Dziepak 91bf7d51f0 boot/arm: mailbox_bxm2708: add final and override specifiers
Signed-off-by: Paweł Dziepak <[email protected]>
2015-03-06 19:03:59 +01:00
Paweł Dziepak 1410ffb696 boot/arm: use std::atomic<> to access bcm2708 mailbox
Signed-off-by: Paweł Dziepak <[email protected]>
2015-03-06 19:03:59 +01:00
Paweł Dziepak 2b92ac2a70 boot/arm: enable C++14
Signed-off-by: Paweł Dziepak <[email protected]>
2015-03-06 19:03:59 +01:00
Paweł Dziepak 1592beeabd build/raspberry_pi: tell gcc to generate code for armv6
Signed-off-by: Paweł Dziepak <[email protected]>
2015-03-06 19:03:59 +01:00
Paweł Dziepak 9c5c599041 kernel: pagecache: provided buffers are not always in user memory
Source or destination buffers passed to pagecache functions may belong
to kernel memory (e.g. when the caller is packagefs). Because of that
we should tell vm_memcpy_{from, to}_physical() truth, not assume that all
buffers are in user memory. That's important because user memory page fault
handlers cannot be nested and these functions may be used while handling
a page fault.

With high probability fixes #11246.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-25 21:57:32 +02:00
Paweł Dziepak ac97d35790 kernel/arch: remove leftover debug message
Polite fault handlers are nice, but we like the silent ones even more.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-25 21:57:32 +02:00
Paweł Dziepak 95e97463d2 kernel: add generic wrapper for accessing user memory
This patch adds user_access() which can be used to gracefully handle
page faults that may happen when accessing user memory. It is used
by arch_cpu_user{memcpy, memset, strlcpy}() to allow using optimized
functions from the standard library.

Currently only x64 uses this, but nothing really is arch specific here.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-14 22:39:07 +02:00
Paweł Dziepak e81b792e8f Merge branch 'memcpy-v3'
This is a major rework of how Haiku implements memset() and memcpy() on
x64. These functions are now removed from the commpage and reimplemented
in C++ using sse2 where it proved to be beneficial. That required some
serious changes in handling fpu state. Now, full fpu state is saved
at each interrupt, but not on task switch.

Some numbers: results of building targets: kernel libroot.so runtime_loader
and HaikuDepot on Intel i7 4770 with 16GB of memory.

real
user
sys

before:
1m54.367
7m40.617
0m58.641

1m33.922
8m12.362
1m0.852

1m32.922
8m10.509
1m1.006

1m31.947
8m12.596
1m1.353

after:
1m50.959
7m43.118
0m58.923

1m30.644
8m6.385
1m0.584

1m31.549
8m7.976
0m59.792

1m31.546
8m6.733
1m0.242
2014-09-14 19:26:07 +02:00
Paweł Dziepak 4582b6e3a3 libroot/x86_64: new memcpy implementation
This patch introduces new memcpy() implementation that improves the
performance when the buffer is small. It was written for processors that
support ERMSB, but performs reasonably well on older CPUs as well.

The following benchmarks were done on Haswell i7 running Debian Jessie
with Linux 3.16.1. In each iteration 64MB buffer was copied, the
parameter "size" is the size of the buffer passed in a single call (i.e.
for "size: 2" memcpy() was called ~32 million times to copy the whole
64MB).

f - original implementation, g - new implementation, all buffers 16 byte
aligned

cpy, size:        8, f:    79971 µs, g:    20419 µs, ∆:   74.47%
cpy, size:       32, f:    42068 µs, g:    12159 µs, ∆:   71.10%
cpy, size:      128, f:    13408 µs, g:    10359 µs, ∆:   22.74%
cpy, size:      512, f:    10634 µs, g:    10433 µs, ∆:    1.89%
cpy, size:     1024, f:    10474 µs, g:    10536 µs, ∆:   -0.59%
cpy, size:     4096, f:     9419 µs, g:     8630 µs, ∆:    8.38%

f - glibc 2.19 implementation, g - new implementation, all buffers 16 byte
aligned

cpy, size:        8, f:    26299 µs, g:    20919 µs, ∆:   20.46%
cpy, size:       32, f:    11146 µs, g:    12159 µs, ∆:   -9.09%
cpy, size:      128, f:    10778 µs, g:    10354 µs, ∆:    3.93%
cpy, size:      512, f:    12291 µs, g:    10426 µs, ∆:   15.17%
cpy, size:     1024, f:    13923 µs, g:    10571 µs, ∆:   24.08%
cpy, size:     4096, f:    11770 µs, g:     8671 µs, ∆:   26.33%

f - glibc 2.19 implementation, g - new implementation, all buffers unaligned

cpy, size:       16, f:    13376 µs, g:    13009 µs, ∆:    2.74%
cpy, size:       32, f:    11130 µs, g:    12171 µs, ∆:   -9.35%
cpy, size:       64, f:    11017 µs, g:    11231 µs, ∆:   -1.94%
cpy, size:      128, f:    10884 µs, g:    10407 µs, ∆:    4.38%
cpy, size:      256, f:    10826 µs, g:    10106 µs, ∆:    6.65%
cpy, size:      512, f:    12354 µs, g:    10396 µs, ∆:   15.85%

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-14 19:16:52 +02:00
Paweł Dziepak 1d7b716f84 libroot/x86_64: new memset implementation
This patch introduces new memset() implementation that improves the
performance when the buffer is small. It was written for processors that
support ERMSB, but performs reasonably well on older CPUs as well.

The following benchmarks were done on Haswell i7 running Debian Jessie
with Linux 3.16.1. In each iteration 64MB buffer was memset()ed, the
parameter "size" is the size of the buffer passed in a single call (i.e.
for "size: 2" memset() was called ~32 million times to memset the whole
64MB).

f - original implementation, g - new implementation, all buffers 16 byte
aligned

set, size:        8, f:    66885 µs, g:    17768 µs, ∆:   73.44%
set, size:       32, f:    17123 µs, g:     9163 µs, ∆:   46.49%
set, size:      128, f:     6677 µs, g:     6919 µs, ∆:   -3.62%
set, size:      512, f:    11656 µs, g:     7715 µs, ∆:   33.81%
set, size:     1024, f:     9156 µs, g:     7359 µs, ∆:   19.63%
set, size:     4096, f:     4936 µs, g:     5159 µs, ∆:   -4.52%

f - glibc 2.19 implementation, g - new implementation, all buffers 16 byte
aligned

set, size:        8, f:    19631 µs, g:    17828 µs, ∆:    9.18%
set, size:       32, f:     8545 µs, g:     9047 µs, ∆:   -5.87%
set, size:      128, f:     8304 µs, g:     6874 µs, ∆:   17.22%
set, size:      512, f:     7373 µs, g:     7486 µs, ∆:   -1.53%
set, size:     1024, f:     9007 µs, g:     7344 µs, ∆:   18.46%
set, size:     4096, f:     8169 µs, g:     5146 µs, ∆:   37.01%

Apparently, glibc uses SSE even for large buffers and therefore does not
takes advantage of ERMSB:

set, size:    16384, f:     7007 µs, g:     3223 µs, ∆:   54.00%
set, size:    32768, f:     6979 µs, g:     2930 µs, ∆:   58.02%
set, size:    65536, f:     6907 µs, g:     2826 µs, ∆:   59.08%
set, size:   131072, f:     6919 µs, g:     2752 µs, ∆:   60.23%

The new implementation handles unaligned buffers quite well:

f - glibc 2.19 implementation, g - new implementation, all buffers unaligned

set, size:       16, f:    10045 µs, g:    10498 µs, ∆:   -4.51%
set, size:       32, f:     8590 µs, g:     9358 µs, ∆:   -8.94%
set, size:       64, f:     8618 µs, g:     8585 µs, ∆:    0.38%
set, size:      128, f:     8393 µs, g:     6893 µs, ∆:   17.87%
set, size:      256, f:     8042 µs, g:     7621 µs, ∆:    5.24%
set, size:      512, f:     9661 µs, g:     7738 µs, ∆:   19.90%

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-14 19:16:52 +02:00
Paweł Dziepak 718fd007a6 kernel/x86_64: clear xmm0-15 registers on syscall exit
As Alex pointed out we can leak possibly sensitive data in xmm registers
when returning from the kernel. To prevent that xmm0-15 are zeroed
before sysret or iret. The cost is negligible.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-14 19:16:52 +02:00
Paweł Dziepak 396b74228e kernel/x86_64: save fpu state at interrupts
The kernel is allowed to use fpu anywhere so we must make sure that
user state is not clobbered by saving fpu state at interrupt entry.
There is no need to do that in case of system calls since all fpu
data registers are caller saved.

We do not need, though, to save the whole fpu state at task swich
(again, thanks to calling convention). Only status and control
registers are preserved. This patch actually adds xmm0-15 register
to clobber list of task swich code, but the only reason of that is
to make sure that nothing bad happens inside the function that
executes that task swich. Inspection of the generated code shows
that no xmm registers are actually saved.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-14 19:16:52 +02:00
Paweł Dziepak b41f281071 boot/x86_64: enable sse early
Enable SSE as a part of the "preparation of the environment to run any
C or C++ code" in the entry points of stage2 bootloader.

SSE2 is going to be used by memset() and memcpy().

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-14 19:16:52 +02:00
Paweł Dziepak acad7bf64a kernel/x86_64: make sure stack is properly aligned in syscalls
Just following the path of least resistance and adding andq $~15, %rsp
where appropriate. That should also make things harder to break
when changing the amount of stuff placed on stack before calling the
actual syscall routine.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-14 19:16:52 +02:00
Paweł Dziepak f2f91078bd kernel/x86_64: remove memset and memcpy from commpage
There is absolutely no reason for these functions to be in commpage,
they don't do anything that involves the kernel in any way.

Additionaly, this patch rewrites memset and memcpy to C++, current
implementation is quite simple (though it may perform surprisingly
well when dealing with large buffers on cpus with ermsb). Better
versions are coming soon.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-14 19:16:52 +02:00
Paweł Dziepak 6156a508ad kernel/x86[_64]: remove get_optimized_functions from cpu modules
The possibility to specify custom memcpy and memset implementations
in cpu modules is currently unused and there is generally no point
in such feature.

There are only 2 x86 vendors that really matter and there isn't
very big difference in performance of the generic optmized versions
of these funcions across different models. Even if we wanted different
versions of memset and memcpy depending on the processor model or
features much better solution would be to use STT_GNU_IFUNC and save
one indirect call.

Long story short, we don't really benefit in any way from
get_optimized_functions and the feature it implements and it only adds
unnecessary complexity to the code.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-14 19:16:51 +02:00
Paweł Dziepak b52b104798 boot/x86_64: convert address of previous_debug_output
Together with the previous commit should fix #10535.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-12 01:09:17 +02:00
Paweł Dziepak c343f75d76 boot/x86_64: call debug_cleanup() before preparing mmu data
long_mmu_init() prepares initial paging structures for 64 bit kernel.
Once that function completes bootloader cannot allocate any memory
that needs to be passed to the kernel.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-12 01:09:14 +02:00
Paweł Dziepak 669e389c33 tools: data_to_source: fix types of generated variables
Both data array and its size should be constant so that GCC can do
as much as possible at compile time and it is safe to use them in
static assertions.

This patch also changes the type of size constant to size_t which
more appropriate and uses sizeof() to determine the size of the
array.

Fixes build breakage introduced in e547662664.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-10 16:17:33 +02:00
Paweł Dziepak ece6f8ba5d boot: remove check against large gaps between elf segments
As discussed on the ML the limitation of the gap between segments
imposed by this check is completely artifical and pointless.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-06 19:38:13 +02:00
Paweł Dziepak 5fa80ab691 usb: fix format string
fDebugChunkSize is an uint32.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-09-02 23:35:42 +02:00
Paweł Dziepak 72a446e10b libroot/x86_64: implement get_cpuid() in user mode
cpuid is available in user mode as well and it doesn't look like there
are going to be any x86 platforms with significantly different CPUs anytime
soon.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-26 19:01:37 +02:00
Paweł Dziepak 6d70d75a8e libroot/x86_64: rewrite system_time[_nsecs]() to C++
No functional change intended, just code deobfuscation.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-26 19:01:37 +02:00
Paweł Dziepak 2268a48350 kernel/x86_64: use C++11 style static assert
Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-25 23:07:32 +02:00
Paweł Dziepak 4b75a1e237 kernel/x86_64: implement x86_swap_pgdir in C++
No reason not to inline this function.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-25 23:07:29 +02:00
Paweł Dziepak 1eba40776d kernel/x86_64: rewrite cpuid.S -> cpuid.cpp
Just getting rid of some assembly, no functional change.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-25 23:07:22 +02:00
Paweł Dziepak 721a07ac24 libroot: remove ATOMIC_FUNCS_ARE_SYSCALLS
GCC knows whether these functions need to be implemented using syscalls
(or more clever solutions like in Linux) and calls libgcc in such case.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-25 23:07:18 +02:00
Paweł Dziepak a4cdc6072c build: remove B_USE_BUILTIN_ATOMIC_FUNCTIONS
No reason not to use GCC atomic support on non-x86 archs.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-25 23:06:58 +02:00
Paweł Dziepak d3b1caa62d kernel, libroot: use C++11 atomics in atomic_*()
The less assembler in our sources the better. These functions wouldn't
be used very much since SupportDef.h inlines them, but the symbols should
be available.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-25 23:06:08 +02:00
Paweł Dziepak aa58f7e431 os/arch: implement all atomic_*() using std::atomic<>
Time to get rid of some asm code. Surprisingly, it appears that
on x86[_64] the emitted code for atomic_test_and_get() isn't as efficient
as it could be, even with -O2, but cmpxchg is so expensive that this slight
difference shouldn't matter much.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-25 23:06:08 +02:00
Paweł Dziepak 2e2c9bd3d0 os/support: implement atomic_*() using GCC builtin helpers
If GCC knows what these functions are actually doing the resulting
code can be optimized better what is especially noticeable in case of
invocations of atomic_{or,and}() that ignore the result. Obviously,
everything is inlined what also improves performance.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-25 23:05:07 +02:00
Paweł Dziepak 54b314f15f add-ons/kernel: add casts when calling atomic_*()
Soon GCC is going to be a bit stricter about the type of pointer passed
to atomic_*() functions.

Signed-off-by: Paweł Dziepak <[email protected]>
2014-08-25 23:02:32 +02:00
Paweł Dziepak b20eb413cd kernel/x86_64: help gcc with devirtualization
This patch gets rid of some indirect calls in the paging code.
2014-05-30 02:11:05 +02:00
Paweł Dziepak fb010e297f kernel/x86_64: use C++11 atomics in X86PagingMethod64Bit 2014-05-30 00:23:49 +02:00
Paweł Dziepak 91e7f347f9 kernel/x86_64: try to inline physical page mapper functions
The way we handle paging is very wasteful and relies heavily on virtual
funcions even if there is absolutely no reason to do so. The proper
solution would be to do a major rework of paging code (including
arch-independent parts).

On x86_64 physical page mapper is very simple what makes the overhead
resulting from the desing of paging interface very expensive. This
patch attempts to make things a bit better by helping GCC with
devirtualization and allowing inlining physical page mapper impementation
(well, only when it is devirtualized).
2014-05-29 23:41:46 +02:00
Pawel Dziepak 680ca3b13d runtime_loader: fix CID 1211995, improve generation counting
There is no need to increase generation counter each time new DSO is
registered.
2014-05-08 23:07:50 +02:00
Pawel Dziepak fad7246fcd runtime_loader: fix CID 1211997, proper corner case handling 2014-05-08 23:07:50 +02:00
Pawel Dziepak 2c001246a0 build: when using gcc4 build kernel with c++11 2014-05-08 23:07:50 +02:00
Pawel Dziepak 578558b439 add-ons/kernel: add spaces between literals and identifiers
Due to introduction of user-defined suffixes C++11 requires that there
is a space between literal and identifier to avoid ambiguity.

This patch makes the whole kernel build successfully with C++11.
2014-05-08 23:07:50 +02:00
Pawel Dziepak 76636769bd kernel/x86_64: inline x86_{read, write}_msr()
This patch makes it possible to inline rdmsr and wrmsr instruction. The
performance impact shouldn't be significant since they are used relatively
rarely and wrmsr is usually a serializing instruction, but there is no reason
not to do so.
2014-05-06 21:41:49 +02:00
Pawel Dziepak 88e8e24c84 kernel/x86_64: improve context switch implementation
The goal of this patch is to amortize the cost of context switch by making
the compiler aware that context switch clobbers all registers. Because all
register need to be saved anyway there is no additional cost of using
callee saved register in the function that does the context switch.
2014-05-06 21:15:55 +02:00
Pawel Dziepak 9db5b975f9 kernel/x86_64: rework of IDT handling code
Similarly to previous patch regarding GDT this is mostly a rewrite of
IDT handling code from C to C++. Thanks to constexpr IDT is now entirely
generated at compile-time.
2014-05-06 14:59:54 +02:00
Pawel Dziepak 2b6d4bc657 kernel/x86: add space between literal and identifier
Due to introduction of user-defined suffixes C++11 requires that there
is a space between literal and identifier to avoid ambiguity.
2014-05-06 14:59:53 +02:00
Pawel Dziepak cd59bf4349 kernel/x86_64: x86_64 gdt handling code overhaul
Virtually no functional change, just rewriting the code from
"C in *.cpp files" to C++. Use of constexpr may be advantageous but
that code is not performance critical anyway.
2014-05-06 14:59:53 +02:00
Pawel Dziepak c1dc104960 kernel/x86_64: enable c++11 in x86_64 specific code 2014-05-06 14:59:53 +02:00
Pawel Dziepak f31c19bb9e libroot/x86_64: relax asm constraints in find_thread() 2014-05-06 14:59:53 +02:00
Pawel Dziepak 344643740a libroot/x86_64: minor improvements in TLS code
* less inline asm
 * std::atomic<> instead of obsolete atomic_*()
2014-05-06 14:59:53 +02:00
Pawel Dziepak ea7e57c966 libroot: enable c++11 in os/arch/x86_64 2014-05-06 14:59:53 +02:00
Pawel Dziepak 0e45e3eb1d runtime_loader: keep symbol DSO in SymbolLookupCache
While resolving TLS related relocations it is necessary to know the DSO
that defines the symbol. Without proper support in caching that information
is available only when the symbol is resolved first time. That works well
for TLS since TLS_DTPMOD is guaranteed to be before TLS_DTPOFF relocation.
This patch makes the newly introduced parts of the interface work in a
general case.
2014-05-04 12:52:05 +02:00
Pawel Dziepak df58e6a9f4 runtime_loader: support linking TLS symbols from any DSO
Previously TLS_DTPMOD relocation blindly returned ID of the current DSO.
This patch does proper symbol lookup if there is a symbol assigned to the
relocation and uses ID of the DSO in which the symbol is defined.
2014-05-04 12:21:26 +02:00
Pawel Dziepak 44c0c4d3d0 runtime_loader: add support for ELF based TLS
This patch introduces support of ELF based TLS handling with lazy allocation
and initalization of TLS block for each DSO and thread. The implementation
generally follows the official ABI except that generation counter in dtv
is in fact a pointer to Generation object that contains both generation
counter and size of the dtv. That simplified the implementation a bit, but
could be changed later. The ABI requirements regariding in memory position
of TLS block is not honoured what results in static TLS model being
unsupported. However, that should not be a problem as long as
"executables" in Haiku are in fact shared objects and optimizations which
require specific TLS block in memory layout are not possible anyway.
2014-05-04 04:00:17 +02:00
Pawel Dziepak 828ea2c47d headers/system: add ELF TLS related constants 2014-05-04 02:40:04 +02:00
Pawel Dziepak bc472ab8f9 runtime_loader: add simple vector implementation
std::vector requires libstdc++ which may be unsafe to use in runtime_loader.
2014-05-04 02:40:04 +02:00
Pawel Dziepak 634bc98a3c libroot/x86[_64]: relax asm constraints in tls_*() functions 2014-05-04 02:40:04 +02:00
Pawel Dziepak 744dfa3c4c kernel: make sure thread priority is within valid range
The scheduler expects that all threads expect the initial idle threads
have priority in range [THREAD_MIN_SET_PRIORITY, THREAD_MAX_SET_PRIORITY].
If the requested pririty is out of range the value is clamped. Failing
with B_BAD_VALUE is probably an overkill since there isn't any real
change in the guarantees provided by the scheduler about the behavior
of such thread. Also, BeBook suggests that spawn_thread() can specify
priority 0.
2014-04-18 23:55:18 +02:00
Pawel Dziepak 91810926dc scheduler: Fix and simplify thread migration logic in low latency mode
This patch remove the old thread migration logic which used few special
cases and (broken) general check that attempted to balance threads.

The new logic is pretty straightforward and seems perform well without
any additional special cases. Current core is compared with the least loaded
one and the thread is migrated if that would result in estimated loads of
both cores (i.e. the current one and the least loaded one) to become closer
to the average load (i.e. average of that two cores).
2014-04-09 03:24:34 +02:00
Pawel Dziepak 1bba129c56 scheduler: Let ThreadData::ShouldRebalance() choose the actual core
Currently, ThreadData::ShouldRebalance() (and mode specific functions
it calls) only decides whether to migrate thread to another core or not.
However, in most cases it actually needs to find the best candidate for
new core so it could as well return that information.
2014-04-09 03:24:34 +02:00
Pawel Dziepak b167307526 kernel: Properly synchronize suspending new thread
After load_image() the child thread is suspended and the parent is
expected to resume it later. However, it is possible that the parent
attempts to resume its child after it has been notified that the image
had been loaded but before the child managed to suspend itself. In such
case the child would suspends itself after that wake up attempt and,
consequently will not be ever resumed.

To mitigate that problem flag Thread::going_to_suspend has been added
which helps synchronizing thread suspension and continuation in a similar
way that "traditional" thread blocking is performed. This means that
the child should behave in a following manner: set its going_to_suspend flag,
notify the parent (i.e. any thread that may want to resume it), acquire
its scheduler_lock and suspend itself if the going_to_suspend flag is set.
The parent should follow pattern: clear going_to_suspend flag of the thread
that is about to be resumed, acquire that thread scheduler_lock and enqueue
it in a run queue if it is suspended.

Thanks Oliver for reporting the bug and identifying what causes it.
2014-03-17 02:40:12 +01:00
Pawel Dziepak d7e1e3e012 kernel/UserEvent: Make sure UserEvent object is valid during DPC
Most of the actual UserEvent work is done in DPC so that we don't have
to care about the limitations of the context in which UserEvent::Fire()
is invoked. This requires appropriate management of lifetime of UserEvent
instances to make sure that DoDPC() method is always called on a valid
object.
2014-03-17 02:40:12 +01:00
Pawel Dziepak 0012ba6a87 scheduler/low_latency: Try harder to balance load
In low latency mode the scheduler would not attempt to balance load
on not heavily loaded cores unless difference in load exceeded
kLoadDifference * 2 (i.e. 40 percentage points), which does not seem
to be good enough.
2014-03-09 19:58:11 +01:00
Pawel Dziepak a57a7a8c6d scheduler: Fix load update on idle cores
To make sure that load statistics are accurate on idle cores each time
idle thread is scheduled a timer is set to update load when current
load measurement interval elapses. However, core load is defined as the
average load during last measurement interval and idle core may be still
considered busy if it was not idle during entire measurement interval.
Since, load update timer is a one shot timer that information will not be
updated until the core becomes active again.

To mitigate that issue load update timer is set to fire after two load
measurement intervals had elapsed.
2014-03-09 19:58:11 +01:00
Pawel Dziepak 5df1ecb2ab x86_64: Relax ltr operand constraint
Any 16 bit general puprose register can be a ltr operand, no need
to force AX.
2014-03-09 19:58:10 +01:00
Pawel Dziepak 1700e825b1 scheduler: Always protect gCore[High]LoadHeap with spinlock
Should fix #10628. If there is a race condition with a writer getting
minimum or maximum from double ended heap may incorrectly result NULL.
Which is not expected in the most of the thread migration logic. Apart
from that, because of the race condition heap state may be observed as
inconsistent thus failing assertions.
ended heap
2014-03-09 19:58:10 +01:00
Pawel Dziepak 3ed7ce75b3 kernel: Relax atomic loads in SMP code
The main purpose of using atomic_get() was the necessity of a compiler
barrier to prevent the compiler from optimizing busy loops. However,
each such loop contains in its body at least one statement that acts
as a compiler barrier (namely, cpu_wait() or cpu_pause()) making
atomic_get() redundant (well, atomic_get() is stronger - it also issues
a load barrier but in these particular cases we do not need it).
2014-02-27 02:21:13 +01:00
Pawel Dziepak e31212e4d7 kernel: Fix acquire_read_spinlock() acquire checks
If the initial attempt to acquire read spinlock fails we use more relaxed
loop (which doesn't require CPU to lock the bus). However, check in that
loop, incorrectly, didn't allow a lock to be acquired when there was at
least one other reader.
2014-02-27 02:21:13 +01:00
Pawel Dziepak d072da2344 nfs4: Don't flush cache when closing read only share reservation
NFS4 specification requires that modified data has to be flushed before
sending CLOSE request. Our original implementation was stricter than that
by flushing all modified data at each file close. That caused problems
with e.g. Tracker, which likes to periodically open files for read only,
in a situation when there were still asynchronous writes pending
(e.g. large file copied).
2014-02-21 04:53:45 +01:00
Pawel Dziepak b637b72e15 nfs4: Notify listeners when file grows 2014-02-21 04:52:29 +01:00
Pawel Dziepak 90213f44ac nfs4: Fix coding style
No functional change intended.
2014-02-21 04:19:00 +01:00
Pawel Dziepak e1be7a26a4 nfs4: Make sure OpenDirCookie::fSnapshot is properly initialized 2014-02-21 04:19:00 +01:00
Pawel Dziepak afc21e1367 nfs4: Fix gIdMapper resource leak
Mounting another nfs4 volume loses reference to the previous idmapper
service. Thanks Stephan for pointing this out.
2014-02-21 04:19:00 +01:00
Pawel Dziepak a96e17ba9d kernel: Adjust load tracking interval 2014-02-06 03:23:28 +01:00
Pawel Dziepak 1da76fd4cc scheduler: Inherit estimated load, do not inherit assigned core
The initial core assignment has to be done without any knowledge about
the thread behaviour. Moreover, short lived tasks may spent most of their
time executing on that initial core. This patch attempts to improve the
qualiti of that initial decision.
2014-02-06 03:23:28 +01:00
Pawel Dziepak 667b23ddc2 scheduler: Always update core heaps after thread migration
The main purpose of this patch is to eliminate the delay between thread
migration and result of that migration being visible in load statistics.
Such delay, in certain circumstances, may cause some cores to become
overloaded because the scheduler migrates too many threads to them before
the effect of migration becomes apparent.
2014-02-06 03:23:28 +01:00
Pawel Dziepak 230d1fcfea scheduler: Update load of idle cores
In order to keep the scheduler tickless core load is computed and updated
only during various scheduler events (i.e. thread enqueue, reschedule, etc).
The problem it creates is that if a core becomes idle its load may remain
outdated for an extended period of time thus resulting in suboptimal thread
migration decisions.

The solution to this problem is to add a timer each time an idle thread is
scheudled which, after kLoadMeasureInterval, would fire and force load
update.
2014-02-06 03:23:28 +01:00
Pawel Dziepak 771ae065db scheduler: Update priority penalty computation in debug dump 2014-02-06 03:23:28 +01:00
Pawel Dziepak f116370edd scheduler: Relax penalty cancellation requirements
Priority penalties were made more strict in order to prevent situation
when two or more high priority threads uses up all available CPU time
in such manner that they do not receive a penalty but starve low priority
threads.

However, a significant change to thread priorites has been made since and
now priority of all non real time threads varies in a range from 1 to
static priority minus penalty. This means that the scheduler is able to
prevent thread starvation without any complex penalty policies.
2014-02-03 04:55:16 +01:00
Pawel Dziepak 6155ab7b25 scheduler: Provide more stable core load statistics
Originially, core load was a sum of eastimated loads of all currently
running or ready threads on a given core. Such value is changing very
rapidly preventing the thread migration logic from making any reasonable
decisions.

This patch changes the way core load is computed to make it more stable
thus improving the qualitiy of decisions made by the thread migration logic.
Currently core load is a sum of estimated loads of all threads that have been
ready during last load measurement interval and haven't been migrated or
killed.
2014-02-03 04:55:16 +01:00
Pawel Dziepak e6cfae450e kernel/x86: Make x2APIC CPU topology detection more future proof
The main reason for this patch is to fix gcc 4.8.2 warning about
hierarchyLevels possibly being used not initialized. Such thing
actually can not happen since all x2APIC CPUs are aware of at least
3 topology levels. However, once more topology levels are introduced
we will have to deal with CPUs that do not report information about all
of them.
2014-02-03 04:55:09 +01:00
Pawel Dziepak 3306e3aa75 build: Enable -Werror for add-ons/kernel/power 2014-01-29 04:11:42 +01:00
Pawel Dziepak bf1694667e build: Enable -Werror for libroot/os 2014-01-29 04:11:42 +01:00
Pawel Dziepak 225acfb3b0 build: Enable -Werror for bootloader 2014-01-29 04:11:42 +01:00
Pawel Dziepak 01a479daa9 boot/x86: Fix unused variable warning 2014-01-29 04:11:42 +01:00
Pawel Dziepak 527da4ca8a x86[_64]: Separate bootloader and kernel GDT and IDT logic
From now on bootloader sets up its own minimal valid GDT and IDT. Then
the kernel replaces them with its own tables.
2014-01-28 00:44:02 +01:00
Pawel Dziepak 819824e020 kernel/{x86, vm}: Add more error checks in VM initialization 2014-01-27 05:36:30 +01:00
Pawel Dziepak 931ce674a9 scheduler: Fix core unassignment 2014-01-27 05:36:30 +01:00
Pawel Dziepak 7adce94d45 scheduler: Check team user time timers before entering scheduler
User timers may cause another thread to become ready in which case we would
like this to happen before scheduler_reschedule() chooses next thread to
be executed.
2014-01-27 05:36:30 +01:00
Pawel Dziepak 82bcd89b92 kernel: Add CPUSet::{Clear, Set}BitAtomic() functions 2014-01-24 13:59:58 +01:00
Pawel Dziepak 03451e4cc1 kernel: Fix deadlock with thread sending signal to itself
UserEvent can be fired from scheduler_reschedule() i.e. while holding current
thread scheduler_lock. If the current thread goes sleep and during reschedule
one of its timers sends a signel to it, then scheduler_enqueue_in_run_queue()
attempts to acquire again its scheduler_lock resulting in a deadlock.

There was also a minor issue with both scheduler_reschedule() and
scheduler_enqueue_in_run_queue() acquiring current CPU scheduler mode lock.
2014-01-24 13:59:58 +01:00
Pawel Dziepak 5d79095e44 scheduler: Do not update load of disabled cores 2014-01-22 03:04:01 +01:00
Pawel Dziepak ae81c98aaf intel_cstates: Fix integer division inaccuracy
Integer division could have result in an out of bound substate.
2014-01-21 04:18:20 +01:00
Pawel Dziepak d01fa1ffe3 scheduler: Always update core load at thread reenqueue 2014-01-21 03:50:26 +01:00
Pawel Dziepak e1720098c6 kernel: No need for arch specific ifdefs in arch/atomic.h 2014-01-20 04:09:17 +01:00
Pawel Dziepak 1a5afe0404 add-ons/kernel: Use UsePrivateKernelHeaders where appropriate 2014-01-20 04:09:12 +01:00
Pawel Dziepak 59b9b52aaf scheduler: system_time() may be unreliable
On multisocket systems as well as under virtual machines logical CPUs
may use separate TSC. We could attempt to synchronize them what probably
would solve problems on multisocket systems. Unfortunately, when running
under hypervisor there is still a chance that TSC will get out of sync
again (e.g. cpufreq enabled on host when there is no invariant TSC). As
long as we use RDTSC as our main time source the scheduler must accept the
fact that time may go backwards (what isn't really a serious problem).
2014-01-20 03:22:04 +01:00
Pawel Dziepak 73db12ab31 kernel: Align user_thread objects to CACHE_LINE_SIZE 2014-01-20 03:22:04 +01:00
Pawel Dziepak cf87df8ba3 libroot: Fix gcc2 build 2014-01-20 00:54:52 +01:00
Pawel Dziepak 25dcdbc2b5 libroot: Avoid conflicts with legacy CPU and platform enums 2014-01-20 00:32:57 +01:00
Pawel Dziepak 32d1afe024 Remove B_CPU_x86_VENDOR_MASK 2014-01-20 00:31:38 +01:00
Pawel Dziepak 9d80738d95 kernel: Fix NULL dereference in has_permission_to_signal 2014-01-19 19:35:13 +01:00
Pawel Dziepak 955e4cff94 scheduler: Weaken time slept assertion 2014-01-17 18:07:47 +01:00