diff --git a/headers/private/kernel/kdriver_settings.h b/headers/private/kernel/kdriver_settings.h index aa7ecd86b0..a00cb31fb8 100644 --- a/headers/private/kernel/kdriver_settings.h +++ b/headers/private/kernel/kdriver_settings.h @@ -16,7 +16,6 @@ extern "C" { #endif status_t driver_settings_init(struct kernel_args *args); -status_t driver_settings_init_post_sem(struct kernel_args *args); #ifdef __cplusplus } diff --git a/src/system/kernel/arch/generic/generic_vm_physical_page_mapper.cpp b/src/system/kernel/arch/generic/generic_vm_physical_page_mapper.cpp index a245d12385..2257cb84d7 100644 --- a/src/system/kernel/arch/generic/generic_vm_physical_page_mapper.cpp +++ b/src/system/kernel/arch/generic/generic_vm_physical_page_mapper.cpp @@ -43,7 +43,7 @@ static paddr_chunk_desc **virtual_pmappings; // will be one ptr per virtual chun static int first_free_vmapping; static int num_virtual_chunks; static queue mapped_paddr_lru; -static mutex sMutex; +static mutex sMutex = MUTEX_INITIALIZER("iospace_mutex"); static sem_id sChunkAvailableSem; static int32 sChunkAvailableWaitingCounter; @@ -282,7 +282,6 @@ generic_vm_physical_page_mapper_init(kernel_args *args, memset(virtual_pmappings, 0, sizeof(paddr_chunk_desc *) * num_virtual_chunks); first_free_vmapping = 0; queue_init(&mapped_paddr_lru); - mutex_init(&sMutex, "iospace_mutex"); sChunkAvailableSem = -1; TRACE(("generic_vm_physical_page_mapper_init: done\n")); diff --git a/src/system/kernel/debug/frame_buffer_console.cpp b/src/system/kernel/debug/frame_buffer_console.cpp index 0155bf9297..359ca8a90e 100644 --- a/src/system/kernel/debug/frame_buffer_console.cpp +++ b/src/system/kernel/debug/frame_buffer_console.cpp @@ -396,6 +396,8 @@ frame_buffer_console_init(kernel_args *args) if (!args->frame_buffer.enabled) return B_OK; + mutex_init(&sConsole.lock, "console_lock"); + void *frameBuffer; sConsole.area = map_physical_memory("vesa_fb", (void *)args->frame_buffer.physical_buffer.start, @@ -443,8 +445,6 @@ frame_buffer_console_init(kernel_args *args) status_t frame_buffer_console_init_post_modules(kernel_args *args) { - mutex_init(&sConsole.lock, "console_lock"); - if (sConsole.frame_buffer == 0) return B_OK; diff --git a/src/system/kernel/device_manager/id_generator.cpp b/src/system/kernel/device_manager/id_generator.cpp index 2a5bed3ffe..9fadf6e709 100644 --- a/src/system/kernel/device_manager/id_generator.cpp +++ b/src/system/kernel/device_manager/id_generator.cpp @@ -67,7 +67,7 @@ typedef DoublyLinkedList GeneratorList; GeneratorList sGenerators; -static mutex sLock; +static mutex sLock = MUTEX_INITIALIZER("id generator"); /*! Create new generator. @@ -169,7 +169,6 @@ void dm_init_id_generator(void) { new(&sGenerators) GeneratorList; - mutex_init(&sLock, "id generator"); } diff --git a/src/system/kernel/elf.cpp b/src/system/kernel/elf.cpp index 157602bdf1..aa44ec43d5 100644 --- a/src/system/kernel/elf.cpp +++ b/src/system/kernel/elf.cpp @@ -59,9 +59,11 @@ typedef struct elf_linked_image { static hash_table *sImagesHash; static struct elf_image_info *sKernelImage = NULL; -static mutex sImageMutex; // guards sImagesHash -static mutex sImageLoadMutex; // serializes loading/unloading add-ons - // locking order sImageLoadMutex -> sImageMutex +static mutex sImageMutex = MUTEX_INITIALIZER("kimages_lock"); + // guards sImagesHash +static mutex sImageLoadMutex = MUTEX_INITIALIZER("kimages_load_lock"); + // serializes loading/unloading add-ons locking order + // sImageLoadMutex -> sImageMutex static bool sInitialized = false; @@ -1785,9 +1787,6 @@ elf_init(kernel_args *args) image_init(); - mutex_init(&sImageMutex, "kimages_lock"); - mutex_init(&sImageLoadMutex, "kimages_load_lock"); - sImagesHash = hash_init(IMAGE_HASH_SIZE, 0, image_compare, image_hash); if (sImagesHash == NULL) return B_NO_MEMORY; diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp index 638ea660c0..cd1cb0bf90 100644 --- a/src/system/kernel/fs/vfs.cpp +++ b/src/system/kernel/fs/vfs.cpp @@ -169,7 +169,7 @@ struct advisory_locking { } }; -static mutex sFileSystemsMutex; +static mutex sFileSystemsMutex = MUTEX_INITIALIZER("vfs_lock"); /*! \brief Guards sMountsTable. @@ -177,7 +177,7 @@ static mutex sFileSystemsMutex; Manipulation of the fs_mount structures themselves (and their destruction) requires different locks though. */ -static mutex sMountMutex; +static mutex sMountMutex = MUTEX_INITIALIZER("vfs_mount_lock"); /*! \brief Guards mount/unmount operations. @@ -201,7 +201,8 @@ static recursive_lock sMountOpLock; The thread trying to lock the must not hold sVnodeMutex. */ -static mutex sVnodeCoveredByMutex; +static mutex sVnodeCoveredByMutex + = MUTEX_INITIALIZER("vfs_vnode_covered_by_lock"); /*! \brief Guards sVnodeTable. @@ -215,7 +216,7 @@ static mutex sVnodeCoveredByMutex; You must not have this mutex held when calling create_sem(), as this might call vfs_free_unused_vnodes(). */ -static mutex sVnodeMutex; +static mutex sVnodeMutex = MUTEX_INITIALIZER("vfs_vnode_lock"); /*! \brief Guards io_context::root. @@ -223,7 +224,7 @@ static mutex sVnodeMutex; The only operation allowed while holding this lock besides getting or setting the field is inc_vnode_ref_count() on io_context::root. */ -static mutex sIOContextRootLock; +static mutex sIOContextRootLock = MUTEX_INITIALIZER("io_context::root lock"); #define VNODE_HASH_TABLE_SIZE 1024 static hash_table *sVnodeTable; @@ -4414,13 +4415,7 @@ vfs_init(kernel_args *args) sRoot = NULL; - mutex_init(&sFileSystemsMutex, "vfs_lock"); - recursive_lock_init(&sMountOpLock, "vfs_mount_op_lock"); - mutex_init(&sMountMutex, "vfs_mount_lock"); - mutex_init(&sVnodeCoveredByMutex, "vfs_vnode_covered_by_lock"); - mutex_init(&sVnodeMutex, "vfs_vnode_lock"); - mutex_init(&sIOContextRootLock, "io_context::root lock"); if (block_cache_init() != B_OK) return B_ERROR; diff --git a/src/system/kernel/image.c b/src/system/kernel/image.c index 20f4ff36a6..4b78476a61 100644 --- a/src/system/kernel/image.c +++ b/src/system/kernel/image.c @@ -38,7 +38,7 @@ struct image { static image_id sNextImageID = 1; -static mutex sImageMutex; +static mutex sImageMutex = MUTEX_INITIALIZER("image"); /*! Registers an image with the specified team. @@ -274,7 +274,6 @@ image_init(void) add_debugger_command("team_images", &dump_images_list, "Dump all registered images from the current team"); #endif - mutex_init(&sImageMutex, "image"); return B_OK; } diff --git a/src/system/kernel/kernel_daemon.cpp b/src/system/kernel/kernel_daemon.cpp index 6ce1712cbc..f3cddbfc55 100644 --- a/src/system/kernel/kernel_daemon.cpp +++ b/src/system/kernel/kernel_daemon.cpp @@ -33,7 +33,7 @@ struct daemon : DoublyLinkedListLinkImpl { typedef DoublyLinkedList DaemonList; -static mutex sDaemonMutex; +static mutex sDaemonMutex = MUTEX_INITIALIZER("kernel daemon"); static DaemonList sDaemons; @@ -130,12 +130,9 @@ register_kernel_daemon(daemon_hook function, void* arg, int frequency) extern "C" status_t kernel_daemon_init(void) { - thread_id thread; - - mutex_init(&sDaemonMutex, "kernel daemon"); new(&sDaemons) DaemonList; - thread = spawn_kernel_thread(&kernel_daemon, "kernel daemon", + thread_id thread = spawn_kernel_thread(&kernel_daemon, "kernel daemon", B_LOW_PRIORITY, NULL); send_signal_etc(thread, SIGCONT, B_DO_NOT_RESCHEDULE); diff --git a/src/system/kernel/lock.cpp b/src/system/kernel/lock.cpp index 8ae7f72c52..6a8371dd11 100644 --- a/src/system/kernel/lock.cpp +++ b/src/system/kernel/lock.cpp @@ -400,15 +400,14 @@ _mutex_lock(mutex* lock, bool threadsLocked) // Might have been released after we decremented the count, but before // we acquired the spinlock. #ifdef KDEBUG - if (!kernel_startup && lock->holder == thread_get_current_thread_id()) { - panic("_mutex_lock(): double lock of %p by thread %ld", lock, - lock->holder); - } - - if (lock->holder <= 0) { + if (lock->holder < 0) { lock->holder = thread_get_current_thread_id(); return B_OK; - } + } else if (lock->holder == thread_get_current_thread_id()) { + panic("_mutex_lock(): double lock of %p by thread %ld", lock, + lock->holder); + } else if (lock->holder == 0) + panic("_mutex_lock(): using unitialized lock %p", lock); #else if ((lock->flags & MUTEX_FLAG_RELEASED) != 0) { lock->flags &= ~MUTEX_FLAG_RELEASED; diff --git a/src/system/kernel/main.cpp b/src/system/kernel/main.cpp index 957a3c1b80..d10628ee48 100644 --- a/src/system/kernel/main.cpp +++ b/src/system/kernel/main.cpp @@ -156,8 +156,6 @@ _start(kernel_args *bootKernelArgs, int currentCPU) // now we can create and use semaphores TRACE("init VM semaphores\n"); vm_init_post_sem(&sKernelArgs); - TRACE("init driver_settings\n"); - driver_settings_init_post_sem(&sKernelArgs); TRACE("init generic syscall\n"); generic_syscall_init(); smp_init_post_generic_syscalls(); diff --git a/src/system/kernel/slab/Slab.cpp b/src/system/kernel/slab/Slab.cpp index 7338925f89..04020781b9 100644 --- a/src/system/kernel/slab/Slab.cpp +++ b/src/system/kernel/slab/Slab.cpp @@ -164,7 +164,7 @@ struct depot_cpu_store { static ObjectCacheList sObjectCaches; -static mutex sObjectCacheListLock; +static mutex sObjectCacheListLock = MUTEX_INITIALIZER("object cache list"); static uint8 *sInitialBegin, *sInitialLimit, *sInitialPointer; static kernel_args *sKernelArgs; @@ -1454,8 +1454,6 @@ slab_init(kernel_args *args, addr_t initialBase, size_t initialSize) void slab_init_post_sem() { - mutex_init(&sObjectCacheListLock, "object cache list"); - ObjectCacheList::Iterator it = sObjectCaches.GetIterator(); while (it.HasNext()) { diff --git a/src/system/kernel/syscalls.cpp b/src/system/kernel/syscalls.cpp index e2652b182a..622cfa34b4 100644 --- a/src/system/kernel/syscalls.cpp +++ b/src/system/kernel/syscalls.cpp @@ -55,7 +55,7 @@ struct generic_syscall { generic_syscall *previous; }; -static struct mutex sGenericSyscallLock; +static mutex sGenericSyscallLock = MUTEX_INITIALIZER("generic syscall"); static struct list sGenericSyscalls; @@ -212,7 +212,6 @@ status_t generic_syscall_init(void) { list_init(&sGenericSyscalls); - mutex_init(&sGenericSyscallLock, "generic syscall"); #if SYSCALL_TRACING add_debugger_command_etc("straced", &dump_syscall_tracing, diff --git a/src/system/kernel/util/cbuf.c b/src/system/kernel/util/cbuf.c index 55eccf32cf..9aa4fb9e32 100644 --- a/src/system/kernel/util/cbuf.c +++ b/src/system/kernel/util/cbuf.c @@ -44,7 +44,7 @@ struct cbuf { #define CBUF_BITMAP_SIZE (CBUF_REGION_SIZE / CBUF_LENGTH) static cbuf *sFreeBufferList; -static mutex sFreeBufferListMutex; +static mutex sFreeBufferListMutex = MUTEX_INITIALIZER("cbuf_free_list"); static cbuf *sFreeBufferNoBlockList; static spinlock sNoBlockSpinlock; @@ -950,8 +950,6 @@ cbuf_init(void) // add the debug command add_debugger_command("cbuf_freelist", &dbg_dump_cbuf_freelists, "Dumps the cbuf free lists"); - mutex_init(&sFreeBufferListMutex, "cbuf_free_list"); - // errors are fatal, that's why we don't clean up here sBufferArea = create_area("cbuf region", (void **)&sBuffer, B_ANY_KERNEL_ADDRESS, diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index 18b390e0b2..3c2bb19daa 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -194,11 +194,11 @@ public: static area_id sNextAreaID; static hash_table *sAreaHash; static sem_id sAreaHashLock; -static mutex sMappingLock; -static mutex sAreaCacheLock; +static mutex sMappingLock = MUTEX_INITIALIZER("page mappings"); +static mutex sAreaCacheLock = MUTEX_INITIALIZER("area->cache"); static off_t sAvailableMemory; -static mutex sAvailableMemoryLock; +static mutex sAvailableMemoryLock = MUTEX_INITIALIZER("available memory lock"); #if DEBUG_CACHE_LIST @@ -3955,13 +3955,10 @@ vm_init_post_sem(kernel_args *args) // since we're still single threaded and only the kernel address space exists, // it isn't that hard to find all of the ones we need to create - mutex_init(&sAvailableMemoryLock, "available memory lock"); arch_vm_translation_map_init_post_sem(args); vm_address_space_init_post_sem(); sAreaHashLock = create_sem(WRITE_COUNT, "area hash"); - mutex_init(&sAreaCacheLock, "area->cache"); - mutex_init(&sMappingLock, "page mappings"); slab_init_post_sem(); return heap_init_post_sem(); diff --git a/src/system/kernel/vm/vm_low_memory.cpp b/src/system/kernel/vm/vm_low_memory.cpp index f36361d18d..0096a14eff 100644 --- a/src/system/kernel/vm/vm_low_memory.cpp +++ b/src/system/kernel/vm/vm_low_memory.cpp @@ -50,7 +50,7 @@ static const size_t kCriticalLimit = 32; static int32 sLowMemoryState = B_NO_LOW_MEMORY; static bigtime_t sLastMeasurement; -static mutex sLowMemoryMutex; +static mutex sLowMemoryMutex = MUTEX_INITIALIZER("low memory"); static sem_id sLowMemoryWaitSem; static HandlerList sLowMemoryHandlers; @@ -184,8 +184,6 @@ vm_low_memory_init(void) status_t vm_low_memory_init_post_thread(void) { - mutex_init(&sLowMemoryMutex, "low memory"); - sLowMemoryWaitSem = create_sem(0, "low memory wait"); if (sLowMemoryWaitSem < B_OK) return sLowMemoryWaitSem; diff --git a/src/system/libroot/os/driver_settings.c b/src/system/libroot/os/driver_settings.c index f0c258eadd..17bd88a68c 100644 --- a/src/system/libroot/os/driver_settings.c +++ b/src/system/libroot/os/driver_settings.c @@ -88,7 +88,7 @@ enum assignment_mode { #ifdef _KERNEL_MODE static struct list sHandles; -static mutex sLock; +static mutex sLock = MUTEX_INITIALIZER("driver settings"); #endif @@ -652,14 +652,6 @@ driver_settings_init(kernel_args *args) return B_OK; } - - -status_t -driver_settings_init_post_sem(kernel_args *args) -{ - mutex_init(&sLock, "driver settings"); - return B_OK; -} #endif