net/sunrpc/sched.c
Source file repositories/reference/linux-study-clean/net/sunrpc/sched.c
File Facts
- System
- Linux kernel
- Corpus path
net/sunrpc/sched.c- Extension
.c- Size
- 34792 bytes
- Lines
- 1360
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/sched.hlinux/interrupt.hlinux/slab.hlinux/mempool.hlinux/smp.hlinux/spinlock.hlinux/mutex.hlinux/freezer.hlinux/sched/mm.hlinux/sunrpc/clnt.hlinux/sunrpc/metrics.hsunrpc.htrace/events/sunrpc.h
Detected Declarations
function rpc_task_gfp_maskfunction rpc_task_set_rpc_statusfunction rpc_task_timeoutfunction rpc_run_timerfunction rpc_set_queue_timerfunction __rpc_add_timerfunction rpc_set_waitqueue_priorityfunction rpc_reset_waitqueue_priorityfunction __rpc_list_enqueue_taskfunction list_for_each_entryfunction __rpc_list_dequeue_taskfunction __rpc_add_wait_queue_priorityfunction __rpc_add_wait_queuefunction __rpc_remove_wait_queue_priorityfunction __rpc_remove_wait_queuefunction __rpc_init_priority_wait_queuefunction rpc_init_priority_wait_queuefunction rpc_init_wait_queuefunction rpc_destroy_wait_queuefunction rpc_wait_bit_killablefunction rpc_task_set_debuginfofunction rpc_task_set_debuginfofunction rpc_complete_taskfunction out_of_line_wait_on_bitfunction rpc_test_and_set_runningfunction __rpc_do_sleep_on_priorityfunction __rpc_sleep_on_priorityfunction __rpc_sleep_on_priority_timeoutfunction rpc_set_tk_callbackfunction rpc_sleep_check_activatedfunction rpc_sleep_on_timeoutfunction rpc_sleep_onfunction rpc_sleep_on_priority_timeoutfunction rpc_sleep_on_priorityfunction __rpc_do_wake_up_task_on_wqfunction rpc_wake_up_task_on_wq_queue_action_lockedfunction rpc_wake_up_task_queue_lockedfunction rpc_wake_up_queued_taskfunction rpc_task_action_set_statusfunction rpc_wake_up_task_queue_set_status_lockedfunction rpc_wake_up_queued_task_set_statusfunction boolfunction boolfunction rpc_wake_up_next_funcfunction rpc_wake_up_lockedfunction rpc_wake_upfunction rpc_wake_up_status_lockedfunction rpc_wake_up_status
Annotated Snippet
if (t->tk_owner == task->tk_owner) {
list_add_tail(&task->u.tk_wait.links,
&t->u.tk_wait.links);
/* Cache the queue head in task->u.tk_wait.list */
task->u.tk_wait.list.next = q;
task->u.tk_wait.list.prev = NULL;
return;
}
}
INIT_LIST_HEAD(&task->u.tk_wait.links);
list_add_tail(&task->u.tk_wait.list, q);
}
/*
* Remove request from a queue list
*/
static void
__rpc_list_dequeue_task(struct rpc_task *task)
{
struct list_head *q;
struct rpc_task *t;
if (task->u.tk_wait.list.prev == NULL) {
list_del(&task->u.tk_wait.links);
return;
}
if (!list_empty(&task->u.tk_wait.links)) {
t = list_first_entry(&task->u.tk_wait.links,
struct rpc_task,
u.tk_wait.links);
/* Assume __rpc_list_enqueue_task() cached the queue head */
q = t->u.tk_wait.list.next;
list_add_tail(&t->u.tk_wait.list, q);
list_del(&task->u.tk_wait.links);
}
list_del(&task->u.tk_wait.list);
}
/*
* Add new request to a priority queue.
*/
static void __rpc_add_wait_queue_priority(struct rpc_wait_queue *queue,
struct rpc_task *task,
unsigned char queue_priority)
{
if (unlikely(queue_priority > queue->maxpriority))
queue_priority = queue->maxpriority;
__rpc_list_enqueue_task(&queue->tasks[queue_priority], task);
}
/*
* Add new request to wait queue.
*/
static void __rpc_add_wait_queue(struct rpc_wait_queue *queue,
struct rpc_task *task,
unsigned char queue_priority)
{
INIT_LIST_HEAD(&task->u.tk_wait.timer_list);
if (RPC_IS_PRIORITY(queue))
__rpc_add_wait_queue_priority(queue, task, queue_priority);
else
list_add_tail(&task->u.tk_wait.list, &queue->tasks[0]);
task->tk_waitqueue = queue;
queue->qlen++;
/* barrier matches the read in rpc_wake_up_task_queue_locked() */
smp_wmb();
rpc_set_queued(task);
}
/*
* Remove request from a priority queue.
*/
static void __rpc_remove_wait_queue_priority(struct rpc_task *task)
{
__rpc_list_dequeue_task(task);
}
/*
* Remove request from queue.
* Note: must be called with spin lock held.
*/
static void __rpc_remove_wait_queue(struct rpc_wait_queue *queue, struct rpc_task *task)
{
__rpc_disable_timer(queue, task);
if (RPC_IS_PRIORITY(queue))
__rpc_remove_wait_queue_priority(task);
else
list_del(&task->u.tk_wait.list);
queue->qlen--;
}
Annotation
- Immediate include surface: `linux/module.h`, `linux/sched.h`, `linux/interrupt.h`, `linux/slab.h`, `linux/mempool.h`, `linux/smp.h`, `linux/spinlock.h`, `linux/mutex.h`.
- Detected declarations: `function rpc_task_gfp_mask`, `function rpc_task_set_rpc_status`, `function rpc_task_timeout`, `function rpc_run_timer`, `function rpc_set_queue_timer`, `function __rpc_add_timer`, `function rpc_set_waitqueue_priority`, `function rpc_reset_waitqueue_priority`, `function __rpc_list_enqueue_task`, `function list_for_each_entry`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.