Commit Graph
100 Commits
Author SHA1 Message Date
Ingo Weinhold 6608ae57c1 * Added "profile" command to the image.
* Enforced 80 columns limit.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27534 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-15 13:46:40 +00:00
Ingo Weinhold 8df6a8dbf5 * Moved strace sourced to src/bin/debug/.
* Factored a few functions out of strace that can be reused.
* Added the beginnings of a "profile" command. It is very much work in
  progress, though it is already able to profile the main thread of a
  program.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27533 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-15 13:45:43 +00:00
Ingo Weinhold cbcebd3330 * Extended the debugger API by sampling-based profiling support. This is
still pretty much work in progress.
* Introduced init_thread_debug_info() which is used instead of
  clear_thread_debug_info() when the thread is created. The latter
  requires former initialization.
* user_debug_thread_deleted() is now already invoked in thread_exit(),
  not in the undertaker.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27531 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-15 13:36:31 +00:00
Ingo Weinhold 243300b289 For the time being allow page faults to happen when interrupts are
disabled, as long as a fault handler is installed for the thread. It
allows user_memcpy() to be invoked with interrupts disabled -- in this
case it will simply fail, when the address is valid, but not mapped yet.
This is a more desirable behavior for debug facilities, though in all
other cases it is likely a bug. We should probably introduce a thread
flag to discriminate these situations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27530 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-15 13:18:11 +00:00
Ingo Weinhold e670fc6f63 Added new parameter "skipIframes" to arch_debug_get_stack_trace(). That
many iframes are supposed to be skipped before recording the stack
trace. Currently implemented for x86 only.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27529 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-15 13:09:14 +00:00
Ingo Weinhold b4ec7b8ee5 Added (kernel private) B_PEEK_PORT_MESSAGE flag for read_port_etc().
When specified, the message is read but not removed from the port.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27527 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-15 12:59:49 +00:00
Ingo Weinhold 68e6763b07 Added functionality for iterating through the symbols of a debugged
team's image to libdebug.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27526 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-15 12:47:59 +00:00
Ingo Weinhold 034fb25c4d * The image was create one byte too short. Fixes #2722.
* Automatic whitespace cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27472 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-13 10:04:51 +00:00
Ingo Weinhold a2b5ecab7a Added Zhao Shuai to the contributors list.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27394 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-09 22:11:03 +00:00
Ingo Weinhold d29be7f320 * CID 153 (line 754): delete array with delete[].
* CID 152 (line 796): delete array with delete[].
* Automatic whitespace cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27393 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-09 21:32:15 +00:00
Ingo Weinhold bfdf82d450 * When using the generic attribute emulation the Link actions does now
first remove the target and its attributes (if any). Before gcc would
  just unlink it and leak the attributes, which could lead to later
  mixups, if the file's inode ID was re-used. As reported by Rene this
  improves the attribute mixup situation, but doesn't solve it
  completely. So that status quo is still the same: When using the
  generic attribute emulation one has to build from the scratch to be
  sure all attributes are fine.
* Got rid of superfluous whitespace.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27385 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-08 23:03:52 +00:00
Ingo Weinhold 6f3ee1f167 When mapping a file into memory we do now immediately map all active
pages into the team's address space. Doing that is relatively cheap and
saves later page faults.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27380 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-08 13:45:27 +00:00
Ingo Weinhold b41928bf48 Use the new entry cache.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27367 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-08 05:09:13 +00:00
Ingo Weinhold ee1a1571a2 Implemented a simple directory entry cache to speed up path resolution.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27366 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-08 05:08:37 +00:00
Ingo Weinhold 91e9d17c3f Small test program timing our path resolution. Which sucks badly...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27364 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-08 00:50:27 +00:00
Ingo Weinhold b27c9bd52f * env.c -> env.cpp
* Squashed TODO: Use a benaphore for locking to improve performance.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27360 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-07 15:28:39 +00:00
Ingo Weinhold 3c529bf7fe * Retry in benaphore_lock() when interrupted.
* Added TODO in benaphore_lock_etc().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27359 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-07 15:27:14 +00:00
Ingo Weinhold 61713fc607 * More verbose usage text.
* Parse the command line options posixly correct. Running command lines
  that contained options was broken before.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27358 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-07 14:22:53 +00:00
Ingo Weinhold c909ca65bf Patch by Zhao Shuai: Updated documentation regarding the use of the
radix tree.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27356 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-07 13:58:49 +00:00
Ingo Weinhold dcadb2ba8d Patch by Zhao Shuai:
* Imported radix bitmap tree implementation from FreeBSD and adjusted it
  for Haiku.
* Make use of the radix tree in the swap support implementation instead
  of using simple bitmaps. This will allow for faster swap slot
  allocations. ATM Haiku doesn't benefit that much, since we always
  allocate single pages, but that will change eventually.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27355 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-07 13:57:25 +00:00
Ingo Weinhold c1deff9677 <malloc.h> is no standard header, use <stdlib.h> instead.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27352 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-07 01:08:30 +00:00
Ingo Weinhold 6d915a4d4c Translate ENOATTR properly. That seemed to be all that kept FreeBSD extattr support from working.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27351 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-07 01:07:45 +00:00
Ingo Weinhold b360cc7f00 Refactored the BeOS attribute emulation using xattr a bit:
* Renamed fs_attr_xattr.cpp to libroot/fs_attr_untyped.cpp.
* Pulled the xattr specifics into a separate fs_attr_xattr.h.
* Added fs_attr_extattr.h, interfacing with FreeBSD's extattr support.
  Totally untested yet. Might not even compile.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27350 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-06 23:46:59 +00:00
Ingo Weinhold 537d081817 release_sem_etc(): Reschedule only when a thread with a priority greater
than that of the current thread has been woken up. I didn't see the
reason why the thread should otherwise relinquish the rest of its
quantum. I noticed for instance that client and app server window
threads were ping-ponging more than seemed necessary. In most cases
when the client sent a port message it would be unscheduled although it
had run only for a few microseconds and had still stuff to do.
I measured a relatively Terminal-heavy "find /boot" (second run), which
does now take 5-10% less time.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27314 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-04 00:32:12 +00:00
Ingo Weinhold f88e298ec7 * In the timing table user and kernel time were swapped.
* Scheduling analysis output:
  - Sort the threads by total run time.
  - Group the locking primitives a thread has waited on by common type
    and name. E.g. all "I/O request finished" condition variables are
    put in a single group. The sum wait time and wait count is printed
    for the group, so it is easy to see how often and how long the
    thread had waited for I/O.
  - Both the groups and their elements are sorted by wait time.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27313 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-04 00:13:53 +00:00
Ingo Weinhold e032a7f50e Scheduling analysis: Also record the number of times a thread waits on a
locking primitive.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27312 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-04 00:07:11 +00:00
Ingo Weinhold 49de5a2f65 * Added "-s" option, which uses the new scheduling analysis feature to
gather additional information on the threads that were running and
  what they were doing.
* Added "-o <output>" option for specifying a file to which to print the
  statistics to.
* Some beautifications (usage, help, etc.).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27306 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-03 15:15:19 +00:00
Ingo Weinhold 886c05d0b6 Macro for additional scheduling analysis tracing.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27305 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-03 15:11:41 +00:00
Ingo Weinhold 020ac56840 * Fixed bug in the "scheduler" command: The check when a thread was
unscheduled was incorrect.
* Introduced _kern_analyze_scheduling() syscall. It requires scheduler
  kernel tracing to be enabled. It uses the tracing entries for a given
  period of time to do a similar analysis the "scheduler" debugger
  command does (i.e. number of runs, run time, latencies, preemption
  times) for each thread. Additionally the analysis includes for each
  thread how long the thread waited on each locking primitive in total.
* Added kernel tracing for the creation of semaphores and initialization
  of condition variables, mutexes, and rw locks. The enabling macro is
  SCHEDULING_ANALYSIS_TRACING. The only purpose is to provide
  _kern_analyze_scheduling() with more info on the locking primitives
  (the name in particular).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27304 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-03 15:10:44 +00:00
Ingo Weinhold d5488b7703 Added ConditionVariable::ObjectType() getter.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27303 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-03 14:53:01 +00:00
Ingo Weinhold aa1a64f35a Added [un]lock_tracing_buffer(). This allows other components to analyze
tracing buffer entries even when not in the kernel debugger.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27302 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-03 14:51:00 +00:00
Ingo Weinhold 232fd3bae3 Moved the wait type definitions to <thread_defs.h>. We're going to use
them in userland, too.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27301 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-03 14:48:47 +00:00
Ingo Weinhold dd1c278d4b Added elf_get_image_info_for_address() to get an image info for a kernel
image.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27300 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-03 14:47:26 +00:00
Ingo Weinhold b0b6878c97 <sys/ioctl.h> also seems to be the standard Linux place for the
ioctl() prototype. Apparently some Linuxes discarded the <stropts.h>
header which POSIX demands.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27293 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-03 00:39:45 +00:00
Ingo Weinhold ce2a6a4bed Don't release the semaphore, if no one is waiting on the condition
variable. pthread_cond_broadcast() incorrectly returned an error
when no one was waiting.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27253 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-31 13:41:52 +00:00
Ingo Weinhold fbed358934 The incorrect indentation fooled me. <stropts.h> is already included in
Linux.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27252 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-31 12:35:12 +00:00
Ingo Weinhold 3d62be2e79 Not so in BeOS/Haiku, but officially ioctl() is defined in <stropts.h>.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27251 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-31 12:30:23 +00:00
Ingo Weinhold e969748a3d Added test program "time_stats" which is a "time" on steroids. It prints
not only the times for the child process, but also for all other
threads. Gives some more insight into what was going on in the system.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27249 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-31 03:04:28 +00:00
Ingo Weinhold 841b6cd749 * Also add the creating thread to an IORequest and let child requests
inherit it.
* IOScheduler::ScheduleRequest() uses the request's thread and team now
  instead of the current one. Otherwise for requests processed
  iteratively this would always be the I/O scheduler's notifier thread.
* Also get the thread's I/O priority now. It's still ignored later,
  though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27248 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-31 00:43:46 +00:00
Ingo Weinhold 3b3e3805f8 Added thread::io_priority field and functions to get/set it.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27247 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-31 00:37:02 +00:00
Ingo Weinhold 4612433715 * Added parameter "size_t align" to file_map_translate(). If > 1, the
vector at the end of the file will be aligned to the given value.
* BFS uses an alignment of 512 bytes (should be block size of the
  underlying device or BFS block size, whatever is less), which should
  be fine, since file data are only stored in BFS blocks. This totally
  avoids any partial operations at the I/O scheduler level, thus saving
  disk operations. Not that I could measure any performance difference.
  Theoretically it should help a lot though, particularly when dealing
  with lots of small files, since we avoid using bounce buffers, which
  are (a) limited in number and (b) require copying of the data.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27246 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-30 23:06:28 +00:00
Ingo Weinhold fd49e6b35a Print some more interesting timing info for the page writer.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27245 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-30 22:50:44 +00:00
Ingo Weinhold 1d059a02b9 Enabled swap file support by default. I successfully built Haiku with
256 MB RAM, 1.5 GB swap, and "jam -j2", so it basically seems to do its
job alright.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27233 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-29 13:48:55 +00:00
Ingo Weinhold aa868cf6c1 Adding/removing swap files:
* swap_file_add() open()s the swap file now with O_NOCACHE and
  swap_file_delete() closes it. This squashes a TODO (the file cache
  wasn't kept disabled for the swap file before).
* swap_file_add() only adds swap files that can actually be used (i.e.
  non 0-sized ones).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27232 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-29 13:45:08 +00:00
Ingo Weinhold d277d9f2f8 Don't always commit memory in VMAnonymousCache::Fault() for
overcommitting caches. If the page in question was just not mapped or
swapped out, we would increase the committment unnecessarily
(potentially even beyond the size of the cache).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27229 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-29 00:49:09 +00:00
Ingo Weinhold ae21ddaf58 steal_pages() was leaking a cache reference since r26572, i.e caches
locked there would be leaked eventually.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-29 00:44:12 +00:00
Ingo Weinhold 96b6a162a1 Increased the number of pages the page writer tries to write per run.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27217 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-28 01:49:59 +00:00
Ingo Weinhold 0316483f0a * DMAResource::TranslateNext(): Added parameter to limit the maximum
operation length.
* IORequest: Added owner (IORequestOwner). Also added a SetUnfinished()
  method, which is invoked by the I/O scheduler after all operations of
  the request have been finished, but the request isn't done yet.
* Added debugger commands "io_request_owner" and "io_scheduler" printing
  information for a IORequestOwner and IOScheduler object respectively.
* Implemented an actual I/O scheduling algorithm. It's a simple round
  robin strategy (a queue per thread) with a unidirectional elevator
  serializing the operations. ATM priorities are ignored, the bandwidth
  isn't adjusted to the device, and there are TODOs all over the place.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27216 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-28 01:49:18 +00:00
Ingo Weinhold ca2a5874fa Disabled support for nested partition maps for the time being. Since
we're quite lenient parsing the partition descriptors, we recognized
pretty much any partition that by accident has a PTS signature and that
no other disk system supports. Should fix bug #2668.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27215 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-27 22:36:44 +00:00
Ingo Weinhold 953cb30447 Re-added support for kernel breakpoints. This feature is just way to
handy in certain situations to not have it.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27213 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-27 12:52:23 +00:00
Ingo Weinhold 0490454cb8 Made safe to be included from assembly code.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27212 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-27 12:50:56 +00:00
Ingo Weinhold 9837b719af Some documentation on swap file support by Zhao Shuai.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27203 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-25 22:09:45 +00:00
Ingo Weinhold ddeb7bfaf1 Changes by Zhao Shuai and myself:
* The VMAnonymousCache destructor was unreserving too much physical
  memory.
* Addressed TODO in _SwapBlockBuild(): When the swap block couldn't be
  allocated we wait and loop until it can.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27202 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-25 22:04:17 +00:00
Ingo Weinhold b9f431f1df Extended debugger language: Dereferenced addresses are now supported as
left hand side of assignments. IOW it is possible to modify memory, now.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27193 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-25 00:24:06 +00:00
Ingo Weinhold 18f2a9c17d Added support for architecture specific debug variables, e.g. for
referencing iframe registers. Their prefix is "$". E.g. "$eax" refers to
the eax register of the current iframe. The features cooperates with the
"in_context" command, i.e. "in_context 92 $eip = 0" will set the eip
register of thread 92 to 0 (thus sealing its fate ;-)).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27192 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-24 23:01:43 +00:00
Ingo Weinhold 23fdebca54 * Added option "-b <count>" to "dis". It causes up to <count>
instructions to be printed before the given address. The feature is
  implemented by looking up the address of the previous symbol for the
  given address and disassembling forward (two passes).
* The instuction at given address is printed highlighted (blue).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27191 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-24 21:53:43 +00:00
Ingo Weinhold 1b20a9a58e arch_debug_get_interrupt_pc() does now also support the currently
debugged thread, if set. This makes "dis" without specified address work
when used with "in_context".


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27190 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-24 21:46:10 +00:00
Ingo Weinhold cd56082077 * Register command with add_debugger_command_etc() and show some nicer
usage text.
* Removed "length" parameter from disasm_arch_dump_insns() and the
  instruction count limit. If at all this should be an architecture
  implementation specific limitation.
* In the x86 case we use an input hook instead of a fixed buffer, now.
* Addressed TODO: If no address is given, the current iframe's PC is
  used.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27187 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-24 18:16:31 +00:00
Ingo Weinhold de5fcb8ab4 * The IOScheduler does not create as many operations as it can before
executing them. Doesn't really make any difference ATM.
* Handle B_BUSY returned by DMAResource::TranslateNext() correctly.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27186 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-24 17:00:42 +00:00
Ingo Weinhold 025f7c3289 A DMABuffer doesn't have a fixed bounce buffer assigned anymore. We do
dynamically assign one when needed. Under the assumption that in most
cases a bounce buffer isn't needed, we can thus prepare a lot more
operations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27185 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-24 16:57:31 +00:00
Ingo Weinhold ded820241d Added optional debug facility (can be enabled by defining
TRACK_PAGE_USAGE_STATS): The page daemon tracks the distribution of page
usage counts. Can be printed using the "page_usage" command.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27182 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-23 23:41:44 +00:00
Ingo Weinhold aacb158ca2 * The LIMIT_AVAILABLE_MEMORY macro can be defined to limit the amount of
RAM Haiku uses (for debugging purposes).
* "page_stats" prints some more infos now.
* page_writer():
  - Moved the low_resource_state() invocation out of the inner loop.
    Reduces lock contention on the sLowResourceLock recursive lock.
  - Additional debug output: Every 1024 written pages the page writer
    prints a message.
* steal_pages(): Addressed the TODO: When there should be pages to
  steal, but we can't get them ATM, we now timeout on the free pages
  condition variable instead of snoozing unconditionally, so that we
  wake up earlier when someone frees pages in the meantime.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27181 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-23 23:38:59 +00:00
Ingo Weinhold ed43619500 * vm_page: Swapped members usage_count and wired_count. We lost 4 bytes
due to alignment padding before.
* Reorganized merging of caches a bit. Renamed MergeStore() to Merge()
  and moved some more functionality into it. The method also moves the
  pages from source to consumer, now. This is necessary, since
  VMAnonymousCache needs to consider both physical pages and swap pages
  at the same time. Before we first moved the physical pages and the
  swap pages later, which was broken for two reasons: (1) A swap page in
  the consumer cache shadows a physical page of the source cache, which
  we ignored. (2) A source cache's physical page that also had a swap
  page would lose the latter in the process when moved to the consumer
  cache, i.e. if the page was not marked modified, it could be stolen
  and its data would be lost.

These changes improve the situation when building Haiku with 256 MB RAM
in that jam doesn't crash anymore, but in my test the system became
totally unusable after about an hour or 7000 targets (GUI froze). For
some reason it didn't manage to free pages anymore although swapping
heavily.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27179 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-23 19:01:01 +00:00
Ingo Weinhold fa2fa606af Added kernel tracing for the swap support.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27178 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-23 14:54:28 +00:00
Ingo Weinhold 79b5db483c Enhanced scheduler tracing. The reschedule tracing entry does now record
more information of the unscheduled thread, namely its new state and, if
waiting, also the object it is going to wait on. When scheduler tracing
level 2 is enabled, additionally the address where the thread was
preempted is recorded. The latter could be interesting for analyzing
race condition bugs.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27168 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-23 00:12:27 +00:00
Ingo Weinhold 982413718d Improved the "ls" command:
* It can now also lookup userland symbols.
* By respecting the currently debugged thread it smoothly cooperates
  with the "in_context" command. IOW it can lookup symbols in any team.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27167 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-23 00:05:16 +00:00
Ingo Weinhold 0739b87ee9 * Added arch_debug_get_interrupt_pc(), which is supposed to return the
PC of the innermost iframe.
* The "in_context" command does now set the currently debugged thread
  respectively.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27166 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 23:59:21 +00:00
Ingo Weinhold ec16be9366 Added i386_get_current_iframe(), returning the innermost iframe, if any.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27165 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 23:55:43 +00:00
Ingo Weinhold 290e3dd228 Introduced the notion of a currently debugged thread in the kernel
debugger and added respective getter/setter methods
debug_{get,set}_debugged_thread(). By default the currently debugged
thread is the thread that dropped into the kernel debugger, but commands
like "in_context" can change it.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27164 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 23:54:49 +00:00
Ingo Weinhold 07569b03c9 * Added kernel private thread_state_to_text() which just calls
state_to_text().
* state_to_text() can now deal with a NULL thread argument.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27163 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 23:51:22 +00:00
Ingo Weinhold 757f253a2d Added "in_context" debugger command. It takes a thread ID and a command
line and executes the command line in the context of the specified
thread. E.g. "in_context <thread> db <addr>" allows to read memory from
a team that is not active ATM.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27156 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 15:42:27 +00:00
Ingo Weinhold 0deddbe36c Added function parse_next_debug_command_argument(), which parses the
first command line argument of a given command line string.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27155 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 15:38:57 +00:00
Ingo Weinhold 16cfc87748 * Added option "-s" to the "thread" command, which prints the info in
short form (like "threads").
* "thread" allows to specify more than one thread now.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27152 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 14:29:00 +00:00
Ingo Weinhold d74af3b17f Improved output. Particularly when the allocation is filled, it is nice
to know whether there's still progress.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27124 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 01:16:48 +00:00
Ingo Weinhold 5540989032 Squashed a TODO: The global swap hash table is no longer resized
synchronously; we use the resource resizer instead. This avoids another
potential deadlock.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27123 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 01:15:18 +00:00
Ingo Weinhold 77b93362c2 * Refactored the kernel daemon code into a class.
* Added a second kernel daemon service, resource resizer, which is
  mainly supposed to be used for resizing allocations asynchrounously.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27122 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 01:13:18 +00:00
Ingo Weinhold fc06a3f822 Added methods that allow asynchronous resizing of the hash table.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27121 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-22 01:10:24 +00:00
Ingo Weinhold 9445c73970 * Fixed spelling typo.
* Switched from new[]/delete[] to malloc()/free().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27119 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 23:17:27 +00:00
Ingo Weinhold 7ce72b986c * Implement CACHE_DONT_SLEEP partially. At least for small object caches
without object depot it should be complete. For the other stuff
  internal_alloc() would need to pass the flag on to block_alloc(), but
  that isn't possible yet.
* Adjusted the low memory handler to respect the minimum object reserve
  of the object caches.

The swap_test_heap test does seem to pass reliably with 128 MB RAM and
128 MB allocation, now. It's quite slow, though. Particularly while the
allocation is filled, the system is completely unusable.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27118 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 23:02:08 +00:00
Ingo Weinhold 1e90630527 * Added a "flags" parameter to vm_create_anonymous_area() and
create_area_etc().
* When the new flag CREATE_AREA_DONT_WAIT is specified, the functions
  don't wait for memory or pages to become available. They fail
  immediately instead.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27117 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 22:50:11 +00:00
Ingo Weinhold 2e8e6c9c6e Introduced vm_page_try_reserve_pages(), which fails when not enough
pages are free ATM.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27116 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 22:43:52 +00:00
Ingo Weinhold d80bf853c6 Added swap support test program. It's currently running into deadlocks.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27110 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 14:37:28 +00:00
Ingo Weinhold 6cc522252e Patch by Zhao Shuai with some changes by myself: Some optimization of
_SwapBlockBuild() and _SwapBlockFree().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27107 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 13:52:42 +00:00
Ingo Weinhold 4f2d40ec1b * The callback object created in WriteAsync() was never deleted. Thus
eventually the VIP heap would be exhausted.
* WriteAsync() didn't call the provided callback when an error occurred
  before invoking vfs_asynchronous_write_pages(). The page writer would
  get stuck in those cases.
* The object cache used for the swap blocks does now use the
  asynchronous resizing feature to avoid deadlocks.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27101 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 03:28:35 +00:00
Ingo Weinhold 1cda5944ad Added object_cache_set_minimum_reserve() which sets the minimal number
of free objects an object cache should try to have ready. If the number
of free objects drops below the threshold, a new urgent priority thread
is asked to asynchronously resize the object cache (pretty similar to
the heap grower thread). Such a mechanism is necessary for code paths
that are supposed to free pages, but may need memory themselves (like
the swap support).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27100 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 03:21:37 +00:00
Ingo Weinhold 17331a1768 * IOBuffer::Delete(): Check for NULL pointer. The IORequest destructor
calls the method unchecked, and the buffer can actually be NULL, if
  Init() failed.
* panic() when running out of VIP memory, at least when KDEBUG is
  set.
* Use heap_set_get_caller() for the VIP heap, so the heap leak checking
  produces useful caller addresses.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27099 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 03:11:47 +00:00
Ingo Weinhold 4a40451dd9 The "symbol" command does now set its return value to the symbol
address, so it can be used in expressions.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27098 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 03:05:26 +00:00
Ingo Weinhold 9e637a6a84 * Added heap_set_get_caller() which can be used when heap leak checking
is enabled to set a per-heap get_caller() function.
* Added "-h <heap>" option to the "allocations_per_caller" command. If
  given only the allocation for the specified heap are considered.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27097 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-21 03:04:12 +00:00
Ingo Weinhold aab58d8730 Implemented (a simple) WriteAsync(), i.e. swap pages are now written
asynchronously, too.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27077 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-20 11:44:23 +00:00
Ingo Weinhold c9b064de56 * Added "swap" debugger command printing some info on the swap space.
* Fixed lock leak in Write().
* Fixed bug in _Commit(): swap_space_reserve() was fed with the wrong
  value (could even be negative).
* swap_free_page_swap_space(): Removed incrementing of sAvailSwapSpace.
  The function is only supposed to deallocate swap space, not to
  unreserve it.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27071 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-19 23:43:41 +00:00
Ingo Weinhold 5c8d420b7c * Added "bool wait" parameter to _GetOperation(). If false and no unused
operation is available ATM, it will return NULL.
* _Finisher() does now re-schedule a request, if all of its operations
  finished successfully, but there are still remaining bytes.
* _Scheduler() does now operate in two passes. First it creates as many
  operations for a given request as possible, then it executes the
  operations. This fixes bug #2644. The problem was that by creating and
  executing the operations in a single loop, an operation could be
  finished before the next one was added. The request would thus be
  considered finished and the request owner be notified. This would
  usually lead to the destruction of the request while it was still in
  use.
* _Scheduler(): In case we don't have a DMA resource also advance the
  request.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27070 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-19 21:37:16 +00:00
Ingo Weinhold 16d07755e4 * IOBuffer does now track whether its memory is locked.
* Moved memory unlocking from IORequest::OperationFinished() to
  IORequest::NotifyFinished(). This way we can reschedule a request,
  e.g. if we didn't have enough unused IOOperations at hand the first
  time.
* Added some more debug output and asserts.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27069 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-19 21:17:36 +00:00
Ingo Weinhold 7fd3b44794 Patch by Zhao Shuai with small changes by myself:
* Some renaming: A location in a swap file where a page can be stored is
  now called "slot" instead of "page" or "swap page".
* swap_slot_alloc(): Update the hint more correctly after allocating
  slots at the hint.
* swap_space_reserve(): When less than the requested space could be
  reserved, it always returned 0 and leaked the remaining pages.
* swap_file_delete(): sSwapFileListLock wasn't unlocked in error cases.
  Use MutexLocker now.
* swap_free_page_swap_space(): sAvailSwapSpace wasn't updated.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27057 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-19 00:32:54 +00:00
Ingo Weinhold 2a79a7686f * VMCache::Write(): Added "uint32 flags" argument which is supposed to
be passed on to the IORequest. Most relevantly physical pages can now
  be written directly by passing B_PHYSICAL_IO_REQUEST.
* Added VMCache::WriteAsync() which is supposed to write pages
  asynchronously. The base class version version falls back to the
  synchronous Write(). Only VMVnodeCache implements WriteAsync() ATM,
  VMAnonymousCache (swap support) still has to be adjusted accordingly.
* write_page() doesn't need to map the page anymore as it can write the
  physical page directly.
* Modified the page writer to write pages asynchronously. This shouldn't
  have any noticeable effect yet. It will though as soon as the I/O
  scheduler reorders I/O operations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27056 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-18 23:28:34 +00:00
Ingo Weinhold 663948966c Added method vfs_asynchronous_write_pages(), which, unsurprisingly,
writes the given page iovecs asynchronously. The new class
AsyncIOCallback is used to inform the caller when the request has been
finished.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27055 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-18 23:09:10 +00:00
Ingo Weinhold 80048d7de3 * Added B_DELETE_IO_REQUEST flag, which causes the IORequest to be
deleted automatically when it's finished.
* Added IORequest::Create() for creating a IORequest on the heap
  (respectively the VIP heap).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27054 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-18 22:59:56 +00:00
Ingo Weinhold ff388d5189 DMAResource::TranslateNext(): Fixed several bugs that could cause too
many bytes to be read/written, which, among other things, could trigger
an assert in the IORequest code:
* In case of a partial (i.e. non-block-aligned) begin, transferLeft was
  not adjusted correctly.
* The main loop was lacking a transferLeft check.
* Main loop: When finally using a bounce buffer, the unrestricted vec
  length was used as base length for the bounce buffer.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27042 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-18 15:32:11 +00:00
Ingo Weinhold 27a11ab8b0 Tests exposing several problems with partial writes shorter than the
vector size, and partial writes of less than one block.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27041 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-18 15:16:27 +00:00
Ingo Weinhold 9d4ec2ee7f The return value of the identify_partition() hook is not error code
compatible. Small floats have to be returned.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27040 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-18 15:10:47 +00:00
Ingo Weinhold af8fa701f8 Removed the description for obsolete
HAIKU_ADD_POSIX_TEST_SUITE_TO_IMAGE. There's a PosixTestSuite optional
package instead.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27039 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-18 14:44:35 +00:00