include/linux/hung_task.h
Source file repositories/reference/linux-study-clean/include/linux/hung_task.h
File Facts
- System
- Linux kernel
- Corpus path
include/linux/hung_task.h- Extension
.h- Size
- 2614 bytes
- Lines
- 102
- Domain
- Core OS
- Bucket
- Core Kernel Interface
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
Dependency Surface
linux/bug.hlinux/sched.hlinux/compiler.h
Detected Declarations
function Copyrightfunction hung_task_clear_blockerfunction hung_task_get_blocker_typefunction hung_task_set_blocker
Annotated Snippet
#ifndef __LINUX_HUNG_TASK_H
#define __LINUX_HUNG_TASK_H
#include <linux/bug.h>
#include <linux/sched.h>
#include <linux/compiler.h>
/*
* @blocker: Combines lock address and blocking type.
*
* Since lock pointers are at least 4-byte aligned(32-bit) or 8-byte
* aligned(64-bit). This leaves the 2 least bits (LSBs) of the pointer
* always zero. So we can use these bits to encode the specific blocking
* type.
*
* Note that on architectures where this is not guaranteed, or for any
* unaligned lock, this tracking mechanism is silently skipped for that
* lock.
*
* Type encoding:
* 00 - Blocked on mutex (BLOCKER_TYPE_MUTEX)
* 01 - Blocked on semaphore (BLOCKER_TYPE_SEM)
* 10 - Blocked on rw-semaphore as READER (BLOCKER_TYPE_RWSEM_READER)
* 11 - Blocked on rw-semaphore as WRITER (BLOCKER_TYPE_RWSEM_WRITER)
*/
#define BLOCKER_TYPE_MUTEX 0x00UL
#define BLOCKER_TYPE_SEM 0x01UL
#define BLOCKER_TYPE_RWSEM_READER 0x02UL
#define BLOCKER_TYPE_RWSEM_WRITER 0x03UL
#define BLOCKER_TYPE_MASK 0x03UL
#ifdef CONFIG_DETECT_HUNG_TASK_BLOCKER
static inline void hung_task_set_blocker(void *lock, unsigned long type)
{
unsigned long lock_ptr = (unsigned long)lock;
WARN_ON_ONCE(!lock_ptr);
WARN_ON_ONCE(READ_ONCE(current->blocker));
/*
* If the lock pointer matches the BLOCKER_TYPE_MASK, return
* without writing anything.
*/
if (lock_ptr & BLOCKER_TYPE_MASK)
return;
WRITE_ONCE(current->blocker, lock_ptr | type);
}
static inline void hung_task_clear_blocker(void)
{
WRITE_ONCE(current->blocker, 0UL);
}
/*
* hung_task_get_blocker_type - Extracts blocker type from encoded blocker
* address.
*
* @blocker: Blocker pointer with encoded type (via LSB bits)
*
* Returns: BLOCKER_TYPE_MUTEX, BLOCKER_TYPE_SEM, etc.
*/
static inline unsigned long hung_task_get_blocker_type(unsigned long blocker)
{
WARN_ON_ONCE(!blocker);
return blocker & BLOCKER_TYPE_MASK;
}
static inline void *hung_task_blocker_to_lock(unsigned long blocker)
{
WARN_ON_ONCE(!blocker);
return (void *)(blocker & ~BLOCKER_TYPE_MASK);
}
#else
static inline void hung_task_set_blocker(void *lock, unsigned long type)
{
}
static inline void hung_task_clear_blocker(void)
{
}
static inline unsigned long hung_task_get_blocker_type(unsigned long blocker)
{
return 0UL;
}
static inline void *hung_task_blocker_to_lock(unsigned long blocker)
{
return NULL;
Annotation
- Immediate include surface: `linux/bug.h`, `linux/sched.h`, `linux/compiler.h`.
- Detected declarations: `function Copyright`, `function hung_task_clear_blocker`, `function hung_task_get_blocker_type`, `function hung_task_set_blocker`.
- Atlas domain: Core OS / Core Kernel Interface.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.