cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

workqueue_internal.h (2508B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * kernel/workqueue_internal.h
      4 *
      5 * Workqueue internal header file.  Only to be included by workqueue and
      6 * core kernel subsystems.
      7 */
      8#ifndef _KERNEL_WORKQUEUE_INTERNAL_H
      9#define _KERNEL_WORKQUEUE_INTERNAL_H
     10
     11#include <linux/workqueue.h>
     12#include <linux/kthread.h>
     13#include <linux/preempt.h>
     14
     15struct worker_pool;
     16
     17/*
     18 * The poor guys doing the actual heavy lifting.  All on-duty workers are
     19 * either serving the manager role, on idle list or on busy hash.  For
     20 * details on the locking annotation (L, I, X...), refer to workqueue.c.
     21 *
     22 * Only to be used in workqueue and async.
     23 */
     24struct worker {
     25	/* on idle list while idle, on busy hash table while busy */
     26	union {
     27		struct list_head	entry;	/* L: while idle */
     28		struct hlist_node	hentry;	/* L: while busy */
     29	};
     30
     31	struct work_struct	*current_work;	/* L: work being processed */
     32	work_func_t		current_func;	/* L: current_work's fn */
     33	struct pool_workqueue	*current_pwq;	/* L: current_work's pwq */
     34	unsigned int		current_color;	/* L: current_work's color */
     35	struct list_head	scheduled;	/* L: scheduled works */
     36
     37	/* 64 bytes boundary on 64bit, 32 on 32bit */
     38
     39	struct task_struct	*task;		/* I: worker task */
     40	struct worker_pool	*pool;		/* A: the associated pool */
     41						/* L: for rescuers */
     42	struct list_head	node;		/* A: anchored at pool->workers */
     43						/* A: runs through worker->node */
     44
     45	unsigned long		last_active;	/* L: last active timestamp */
     46	unsigned int		flags;		/* X: flags */
     47	int			id;		/* I: worker id */
     48	int			sleeping;	/* None */
     49
     50	/*
     51	 * Opaque string set with work_set_desc().  Printed out with task
     52	 * dump for debugging - WARN, BUG, panic or sysrq.
     53	 */
     54	char			desc[WORKER_DESC_LEN];
     55
     56	/* used only by rescuers to point to the target workqueue */
     57	struct workqueue_struct	*rescue_wq;	/* I: the workqueue to rescue */
     58
     59	/* used by the scheduler to determine a worker's last known identity */
     60	work_func_t		last_func;
     61};
     62
     63/**
     64 * current_wq_worker - return struct worker if %current is a workqueue worker
     65 */
     66static inline struct worker *current_wq_worker(void)
     67{
     68	if (in_task() && (current->flags & PF_WQ_WORKER))
     69		return kthread_data(current);
     70	return NULL;
     71}
     72
     73/*
     74 * Scheduler hooks for concurrency managed workqueue.  Only to be used from
     75 * sched/ and workqueue.c.
     76 */
     77void wq_worker_running(struct task_struct *task);
     78void wq_worker_sleeping(struct task_struct *task);
     79work_func_t wq_worker_last_func(struct task_struct *task);
     80
     81#endif /* _KERNEL_WORKQUEUE_INTERNAL_H */