summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2015-08-28kern: provide a way to steal a lockJustus Winter
During the message transport, the sender acquires a lock that is released by the sender. By making this explicit, we can provide stronger guarantees about the locking. * ipc/ipc_mqueue.c (ipc_mqueue_receive): Steal lock. * ipc/ipc_object.h (io_lock_steal): New macro. * ipc/ipc_port.h (ip_lock_steal): Likewise. * ipc/mach_msg.c (mach_msg_trap): Steal lock in the inlined version of `ipc_mqueue_receive'. * kern/lock.c (lock_done): Assert that the current thread holds the lock. * kern/lock.h (lock_write_steal): New macro.
2015-08-28ipc/ipc_mqueue: use a general lockJustus Winter
* ipc/ipc_mqueue.h (struct ipc_mqueue): Use a general lock. Adapt macros.
2015-08-28ipc: use a general lock for the ipc_port_multiple lockJustus Winter
* ipc/ipc_port.c (ipc_port_multiple_lock_data): Use a general lock. * ipc/ipc_port.h (ipc_port_multiple_lock_data): Likewise. (ipc_port_multiple_{lock_init,lock,unlock}): Adapt accordingly.
2015-08-28yyy vm: turn page queue lock into a general lockJustus Winter
2015-08-28kern: use a general lock for the IPC structuresJustus Winter
* ipc/ipc_thread.h (ith_{lock_init,lock,unlock}): Use a general lock. * kern/task.h (struct task): Use a general lock for `itk_lock_data'. (itk_{lock_init,lock,unlock}): Use a general lock. * kern/thread.h (struct thread): Use a general lock for `ith_lock_data'.
2015-08-28vm/object: use a general lock to protect vm objectsJustus Winter
* vm/vm_object.h (struct vm_object): Use a general lock, adapt macros.
2015-08-28kern/lock: add lock_takenJustus Winter
* kern/lock.h (lock_taken): New macro.
2015-08-28vm/object: use a general lock to protect the object cacheJustus Winter
* vm/vm_object.c: Use a general lock to protect the object cache.
2015-08-28vm: use a general lock to protect the default memory managerJustus Winter
* vm/memory_object.c: Use a general lock to protect the default memory manager.
2015-08-28device: use general lock for port listsJustus Winter
* device/if_hdr.h (struct ifnet): Turn the port list locks into general locks. (port_list_{lock_init,lock,unlock): New macros. * device/net_io.c (net_filter, net_set_filter): Use new macros. * device/subrs.c (if_init_queues): Likewise.
2015-08-28device: use general lock for `mach_device'Justus Winter
* device/dev_hdr.h (struct mach_device): Turn lock into a general lock. (device_lock_init): New macro. (device_lock, device_unlock): Adapt accordingly. * device/dev_lookup.c (device_lookup): Use `device_lock_init'. * device/ds_routines.c (device_open): Adapt accordingly.
2015-08-28turn all_psets_lock into a general lockJustus Winter
2015-08-28yyy more general locks, crashes, maybe b/c interrupt handlerJustus Winter
2015-08-28kern: new function `thread_sleep_lock'Justus Winter
* kern/sched_prim.c (thread_sleep_lock): New function. * kern/sched_prim.h (thread_sleep_lock): New delcaration.
2015-08-28ipc: fix locking issuesJustus Winter
* ipc/ipc_port.h (struct ipc_port): Document locking exception. * ipc/ipc_port.c (ipc_port_destroy): Avoid accessing `port's fields without the lock. (ipc_port_alloc_special): Lock `port'. * ipc/mach_msg.c (mach_msg_trap): Avoid using `ipc_port_flag_protected_payload' on unlocked port. * ipc/ipc_kmsg.c (ipc_kmsg_copyout_header): Likewise.
2015-08-28vm: fix locking issuesJustus Winter
Avoid accessing fields of `vm_object' objects without having it locked. These problems have been found using a code transformation done by Coccinelle that instrumented all accesses with a runtime check, and manual inspection. * vm/memory_object.c (memory_object_data_supply): Avoid accessing fields without the lock. * vm/vm_fault.c (vm_fault_page): Likewise. * vm/vm_map.c (vm_map_submap): Properly lock `object'. (vm_map_copy_overwrite): Avoid accessing fields without the lock. (vm_map_copyin): Lock `src_object'. * vm/vm_object.c (_vm_object_setup): Likewise. (vm_object_allocate): Likewise. (vm_object_terminate): Avoid accessing fields without the lock. (vm_object_copy_slowly): Lock `new_object'. (vm_object_copy_delayed): Lock `src_object' earlier, lock `new_copy'. (vm_object_shadow): Lock `result'. (vm_object_enter): Properly lock `object'. Avoid accessing fields without the lock. * vm/vm_pageout.c (vm_pageout_setup): Properly lock `old_object'.
2015-08-28Make sure the reply port's reference is released when the thread needs to be ↵Flávio Cruz
halted. * kern/thread.h (thread_halt_self): Add continuation_t parameter. * kern/thread.c (thread_halt_self): Pass continuation_t parameter to thread_block instead of thread_exception_return. * kern/ast.c (ast_taken): Pass thread_exception_return to thread_halt_self. * kern/profile.c (profile_thread): Likewise. * kern/exception.c (exception_no_server): Likewise. (thread_release_and_exception_return): New function. (exception_raise_continue_slow): Pass thread_release_and_exception_return to thread_halt_self.
2015-08-28Add a thread_no_continuation definitionFlávio Cruz
to replace the use of the NULL pointer. * kern/sched_prim.h (thread_no_continuation): New macro. * kern/machine.c (processor_assign, processor_doaction): Use thread_no_continuation instead of 0. * kern/profile.c (send_last_sample_buf): Likewise * kern/sched_prim.c (thread_sleep, thread_invoke, thread_dispatch): Likewise. * kern/task.c (task_terminate, task_assign): Likewise. * kern/thread.c (thread_suspend): Likewise. * kern/thread.h (struct thread): Change type of swap_func field to continuation_t.
2015-08-20kern/bootstrap: tune lockingJustus Winter
* kern/bootstrap.c (boot_script_exec_cmd): Avoid holding the lock across the call to `thread_create'.
2015-08-20i386: enable assertionsJustus Winter
* i386/intel/pmap.c (pmap_page_protect): Enable assertions. (phys_attribute_clear, phys_attribute_test): Likewise.
2015-08-20kern: really zero-out unused simple lock info entriesJustus Winter
* kern/lock.c (simple_unlock): Really zero-out unused simple lock info entries.
2015-08-18i386: fix panic messageJustus Winter
* i386/intel/pmap.c (pmap_page_protect): Fix function name in panic message.
2015-08-18vm: collapse unreachable branch into assertionJustus Winter
* vm/vm_object.c (vm_object_collapse): Collapse unreachable branch into assertion.
2015-08-17kern: keep track of the writer when debugging locksJustus Winter
* configfrag.ac (MACH_LDEBUG): Adjust comment, we use it to sanity check all locks now. * kern/lock.c (lock_write): Keep track of the writer thread. (lock_done): Clear writer. (lock_read_to_write): Keep track of the writer thread. (lock_write_to_read): Assert that the current thread holds the lock. Clear writer. (lock_try_write): Keep track of the writer thread. (lock_try_read_to_write): Likewise. (lock_set_recursive): Assert that the current thread holds the lock. * kern/lock.h (struct lock): New field `writer'. (have_read_lock, have_write_lock, have_lock): New macros that can be used to assert that the current thread holds the given lock. If MACH_LDEBUG is not set, they evaluate to true.
2015-08-17kern: improve simple lock debuggingJustus Winter
Do not bother saving the return address when acquire a simple lock. Save the location as provided by the compiler as string instead. Also save the lock parameter. * kern/lock.c (struct simple_locks_info): Drop `ra', add `expr', `loc'. (simple_lock): Rename to `_simple_lock', add expression and location parameters and save them. (simple_lock_try): Likewise. (simple_unlock): Zero-out the now unused slot in the list of taken locks. (db_show_all_slocks): Use the new information. * kern/lock.h (simple_lock, simple_lock_try): Provide macro versions passing the location and expression as string.
2015-08-17kern: disable the simple lock checks while debuggingJustus Winter
* kern/lock.c (do_check_simple_locks): New variable. (check_simple_locks): Make check conditional. (check_simple_locks_{en,dis}able): New functions. * kern/lock.h (check_simple_locks_{en,dis}able): New declarations. * ddb/db_trap.c (db_task_trap): Disable simple lock checks.
2015-08-15vm: fix compiler warningJustus Winter
* vm/vm_user.c (vm_wire): Drop unused but set variable `host'.
2015-08-15vm: enable extra assertionsJustus Winter
* vm/vm_fault.c (vm_fault_page): Enable extra assertions.
2015-08-15Avoid re-defining macrosJustus Winter
* kern/macros.h: Avoid re-defining macros. * linux/src/include/linux/compiler-gcc.h: Likewise. * linux/src/include/linux/compiler.h: Likewise.
2015-07-25kern: add boot-time clock, use it for time stampsHEADmasterJustus Winter
The kernel keeps track of task and thread creation times by saving a time stamp. Previously, the real-time clock was used for this. When the real-time clock is changed, however, the reference frame for the time stamps is lost. This surfaced in Hurd systems reporting spuriously long uptimes. Fix this by creating a boot-time clock and use it as reference frame for the time stamps. * kern/mach_clock.c (clock_boottime_offset): Create clock by keeping track of the offset from the real-time. (clock_boottime_update): New function. (record_time_stamp): Use the boot-time clock for time stamps. (read_time_stamp): New function to convert it back to real-time. (host_set_time): Call `clock_boottime_update'. * kern/mach_clock.h (record_time_stamp): Amend comment. (read_time_stamp): New declaration. * kern/task.c (task_info): Use `read_time_stamp'. * kern/thread.c (thread_info): Likewise.
2015-07-25include: provide time-value substractionJustus Winter
* include/mach/time_value.h (time_value_assert): New macro to assert that the given value is well-formed. (time_value_add_usec): Use the new macro. (time_value_sub_usec): New macro. (time_value_add): Use `time_value_add_usec'. (time_value_sub_usec): New macro.
2015-07-25kern/lock: make sure the macros are only used on simple locksJustus Winter
* kern/lock.h (struct slock, simple_lock_data_empty): Add field `is_a_simple_lock'. (simple_lock_assert): New macro that tests for `is_a_simple_lock'. Use this macro to assert that the arguments to various other macros are indeed simple locks.
2015-07-25Disable the kernel tracing system XPRJustus Winter
* configfrag.ac (XPR_DEBUG): Disable tracing system.
2015-07-25ipc/space: inline reference countingJustus Winter
* ipc/ipc_space.h (is_{reference,release}): Use the macro variant.
2015-07-25Make sure the field offsets are updatedJustus Winter
* Makerules.am: Make sure the field offsets are updated.
2015-07-20kern/bootstrap: deallocate threadJustus Winter
Previously, killing the thread would fail because of the extra reference, making task_terminate loop forever. * kern/bootstrap.c (boot_script_exec_command): Deallocate thread.
2015-07-19kern/bootstrap: deallocate taskJustus Winter
* kern/bootstrap.c (boot_script_free_task): Deallocate task.
2015-07-18linux/net: fix build with -O0Justus Winter
* linux/src/drivers/net/pci-scan.c: Avoid #erroring out.
2015-07-18kern/printf: do not serialize printf and coJustus Winter
A lot of code assumes that printf is re-entrant, e.g. the pagination code in the debugger, or any use of assert inside the console driver. * kern/printf.c: Drop the lock serializing calls to `_doprnt'. (printf_init): Remove function. * kern/printf.h (printf_init): Remove declaration. * kern/startup.c (setup_main): Remove call to `printf_init'.
2015-07-18kern/lock: use compiler built-in functions to get return addressJustus Winter
* kern/lock.c (struct simple_locks_info): Fix type of `ra'. (simple_lock, simple_lock_try): Use compiler built-in functions to get return address.
2015-07-18kern/bootstrap: fix lockingJustus Winter
* kern/bootstrap.c (boot_script_exec_cmd): Add missing unlock. (user_bootstrap): Likewise.
2015-07-18kern/slab: fix lockingJustus Winter
* kern/slab.c (host_slab_info): Fix locking.
2015-07-15ipc: use a general lock to protect IPC spacesJustus Winter
This fixes a corruption in the radix trees representing the IPC spaces when memory was tight. * ipc/ipc_space.h: Use a general lock to protect IPC spaces.
2015-07-15ipc: fix the locking of the IPC entry allocation functionsJustus Winter
* ipc/ipc_entry.c (ipc_entry_alloc): Assume the space is write-locked. (ipc_entry_alloc_name): Likewise. * ipc/ipc_object.c: Fix the locking around all call sites to the two functions where the space was not locked before.
2015-07-15i386: fix typoJustus Winter
* i386/intel/pmap.c: Fix typo.
2015-07-12ipc: avoid kmem_allocJustus Winter
* ipc/ipc_table.c (ipc_table_alloc): Unconditionally use `kalloc'. (ipc_table_free): Unconditionally use `kfree'.
2015-07-12vm: really fix traversing the list of inactive pagesJustus Winter
Previously, the pageout code traversed the list of pages in an object instead of the list of inactive pages. * vm/vm_pageout.c (vm_pageout_scan): Fix traversing the list of inactive pages.
2015-07-11kern: make sure the queue macros are only used on queuesJustus Winter
This turns mistakes as the one corrected in e59f05e9 into compile-time errors. * kern/queue.h: Add a new macro, queue_assert, and use it to assert that all arguments given to the queue macros have the correct type. * device/net_io.c (ENQUEUE_DEAD): Adapt to the fact that `queue_next(q)' is no longer an lvalue.
2015-07-11vm: fix traversing the list of inactive pagesJustus Winter
Previously, the pageout code traversed the hash table chain instead of the list of inactive pages. The code merely compiled by accident, because the `struct page' also has a field called `next' for the hash table chain. * vm/vm_pageout.c (vm_pageout_scan): Fix traversing the list of inactive pages.
2015-07-10vm: drop debugging remnantsJustus Winter
* vm/vm_object.c (vm_object_terminate): Drop debugging remnants.