Linux 4.4.163
x86/time: Correct the attribute on jiffies' definition
* l2tp: hold tunnel socket when handling control frames in l2tp_ip and l2tp_ip6
net/l2tp/l2tp_ip.c
net/l2tp/l2tp_ip6.c
* cpuidle: Do not access cpuidle_devices when !CONFIG_CPU_IDLE
include/linux/cpuidle.h
kernel/sched/idle.c
x86/percpu: Fix this_cpu_read()
* sched/fair: Fix throttle_list starvation with low CFS quota
kernel/sched/fair.c
kernel/sched/sched.h
Input: elan_i2c - add ACPI ID for Lenovo IdeaPad 330-15IGM
* USB: fix the usbfs flag sanitization for control transfers
drivers/usb/core/devio.c
* usb: gadget: storage: Fix Spectre v1 vulnerability
drivers/usb/gadget/function/f_mass_storage.c
* cdc-acm: correct counting of UART states in serial state notification
drivers/usb/class/cdc-acm.c
IB/ucm: Fix Spectre v1 vulnerability
RDMA/ucma: Fix Spectre v1 vulnerability
ptp: fix Spectre v1 vulnerability
cachefiles: fix the race between cachefiles_bury_object() and rmdir(2)
ahci: don't ignore result code of ahci_reset_controller()
* crypto: shash - Fix a sleep-in-atomic bug in shash_setkey_unaligned
crypto/shash.c
* mremap: properly flush TLB before releasing the page
mm/huge_memory.c
mm/mremap.c
* rtnetlink: Disallow FDB configuration for non-Ethernet device
net/core/rtnetlink.c
vhost: Fix Spectre V1 vulnerability
* net: drop skb on failure in ip_check_defrag()
net/ipv4/ip_fragment.c
* sctp: fix race on sctp_id2asoc
net/sctp/socket.c
r8169: fix NAPI handling under high load
net: stmmac: Fix stmmac_mdio_reset() when building stmmac as modules
* net: socket: fix a missing-check bug
net/socket.c
net: sched: gred: pass the right attribute to gred_change_table_def()
* net/ipv6: Fix index counter for unicast addresses in in6_dump_addrs
net/ipv6/addrconf.c
* ipv6/ndisc: Preserve IPv6 control buffer if protocol error handlers are called
net/ipv6/ndisc.c
* ipv6: mcast: fix a use-after-free in inet6_mc_check
net/ipv6/mcast.c
* net: bridge: remove ipv6 zero address check in mcast queries
net/bridge/br_multicast.c
* bridge: do not add port to router list when receives query with source 0.0.0.0
net/bridge/br_multicast.c
perf tools: Disable parallelism for 'make clean'
mtd: spi-nor: Add support for is25wp series chips
* fs/fat/fatent.c: add cond_resched() to fat_count_free_clusters()
fs/fat/fatent.c
ARM: dts: imx53-qsb: disable 1.2GHz OPP
MIPS: DEC: Fix an int-handler.S CPU_DADDI_WORKAROUNDS regression
igb: Remove superfluous reset to PHY and page 0 selection
MIPS: microMIPS: Fix decoding of swsp16 instruction
scsi: aacraid: Fix typo in blink status
* bonding: avoid defaulting hard_header_len to ETH_HLEN on slave removal
drivers/net/bonding/bond_main.c
PM / devfreq: tegra: fix error return code in tegra_devfreq_probe()
ASoC: spear: fix error return code in spdif_in_probe()
spi: xlp: fix error return code in xlp_spi_probe()
spi/bcm63xx: fix error return code in bcm63xx_spi_probe()
MIPS: Handle non word sized instructions when examining frame
spi/bcm63xx-hspi: fix error return code in bcm63xx_hsspi_probe()
usb: dwc3: omap: fix error return code in dwc3_omap_probe()
usb: ehci-omap: fix error return code in ehci_hcd_omap_probe()
usb: imx21-hcd: fix error return code in imx21_probe()
gpio: msic: fix error return code in platform_msic_gpio_probe()
sparc64: Fix exception handling in UltraSPARC-III memcpy.
gpu: host1x: fix error return code in host1x_probe()
sparc64 mm: Fix more TSB sizing issues
video: fbdev: pxa3xx_gcu: fix error return code in pxa3xx_gcu_probe()
tty: serial: sprd: fix error return code in sprd_probe()
* l2tp: hold socket before dropping lock in l2tp_ip{, 6}_recv()
net/l2tp/l2tp_ip.c
net/l2tp/l2tp_ip6.c
brcmfmac: Fix glom_skb leak in brcmf_sdiod_recv_chain
gro: Allow tunnel stacking in the case of FOU/GUE
* vti6: flush x-netns xfrm cache when vti interface is removed
net/ipv6/ip6_vti.c
* ALSA: timer: Fix zero-division by continue of uninitialized instance
sound/core/timer.c
ixgbe: Correct X550EM_x revision check
ixgbe: fix RSS limit for X550
net/mlx5e: Correctly handle RSS indirection table when changing number of channels
net/mlx5e: Fix LRO modify
ixgbevf: Fix handling of NAPI budget when multiple queues are enabled per vector
* fuse: Dont call set_page_dirty_lock() for ITER_BVEC pages for async_dio
fs/fuse/file.c
fs/fuse/fuse_i.h
drm/nouveau/fbcon: fix oops without fbdev emulation
* bpf: generally move prog destruction to RCU deferral
include/linux/bpf.h
kernel/bpf/arraymap.c
kernel/bpf/syscall.c
kernel/events/core.c
* usb-storage: fix bogus hardware error messages for ATA pass-thru devices
drivers/usb/storage/transport.c
sch_red: update backlog as well
sparc/pci: Refactor dev_archdata initialization into pci_init_dev_archdata
* scsi: Add STARGET_CREATED_REMOVE state to scsi_target_state
drivers/scsi/scsi_scan.c
drivers/scsi/scsi_sysfs.c
include/scsi/scsi_device.h
* xfrm: Clear sk_dst_cache when applying per-socket policy.
net/xfrm/xfrm_state.c
* arm64: Fix potential race with hardware DBM in ptep_set_access_flags()
arch/arm64/mm/fault.c
* CIFS: handle guest access errors to Windows shares
fs/cifs/connect.c
ASoC: wm8940: Enable cache usage to fix crashes on resume
ASoC: ak4613: Enable cache usage to fix crashes on resume
MIPS: Fix FCSR Cause bit handling for correct SIGFPE issue
usbvision: revert commit 588afcc1
* perf/core: Don't leak event in the syscall error path
kernel/events/core.c
aacraid: Start adapter after updating number of MSIX vectors
x86/PCI: Mark Broadwell-EP Home Agent 1 as having non-compliant BARs
tpm: fix: return rc when devm_add_action() fails
* thermal: allow u8500-thermal driver to be a module
drivers/thermal/Kconfig
* thermal: allow spear-thermal driver to be a module
drivers/thermal/Kconfig
btrfs: don't create or leak aliased root while cleaning up orphans
* sched/cgroup: Fix cgroup entity load tracking tear-down
kernel/sched/core.c
kernel/sched/fair.c
kernel/sched/sched.h
um: Avoid longjmp/setjmp symbol clashes with libpthread.a
* ipv6: orphan skbs in reassembly unit
net/ipv6/netfilter/nf_conntrack_reasm.c
net/mlx4_en: Resolve dividing by zero in 32-bit system
af_iucv: Move sockaddr length checks to before accessing sa_family in bind and connect handlers
* radix-tree: fix radix_tree_iter_retry() for tagged iterators.
include/linux/radix-tree.h
x86/mm/pat: Prevent hang during boot when mapping pages
ARM: dts: apq8064: add ahci ports-implemented mask
* tracing: Skip more functions when doing stack tracing of events
kernel/trace/trace.c
ser_gigaset: use container_of() instead of detour
* net: drop write-only stack variable
net/unix/af_unix.c
* ipv6: suppress sparse warnings in IP6_ECN_set_ce()
include/net/inet_ecn.h
* KEYS: put keyring if install_session_keyring_to_cred() fails
security/keys/process_keys.c
net: cxgb3_main: fix a missing-check bug
* perf/ring_buffer: Prevent concurent ring buffer access
kernel/events/core.c
smsc95xx: Check for Wake-on-LAN modes
smsc75xx: Check for Wake-on-LAN modes
* r8152: Check for supported Wake-on-LAN Modes
drivers/net/usb/r8152.c
sr9800: Check for supported Wake-on-LAN modes
lan78xx: Check for supported Wake-on-LAN modes
* ax88179_178a: Check for supported Wake-on-LAN modes
drivers/net/usb/ax88179_178a.c
* asix: Check for supported Wake-on-LAN modes
drivers/net/usb/asix_common.c
pxa168fb: prepare the clock
* Bluetooth: SMP: fix crash in unpairing
net/bluetooth/mgmt.c
net/bluetooth/smp.c
net/bluetooth/smp.h
mac80211_hwsim: do not omit multicast announce of first added radio
* xfrm: validate template mode
net/xfrm/xfrm_user.c
ARM: 8799/1: mm: fix pci_ioremap_io() offset check
* cfg80211: reg: Init wiphy_idx in regulatory_hint_core()
net/wireless/reg.c
mac80211: Always report TX status
* xfrm6: call kfree_skb when skb is toobig
net/ipv6/xfrm6_output.c
* xfrm: Validate address prefix lengths in the xfrm selector.
net/xfrm/xfrm_user.c
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
256 lines
8.1 KiB
C
256 lines
8.1 KiB
C
/*
|
|
* cpuidle.h - a generic framework for CPU idle power management
|
|
*
|
|
* (C) 2007 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
|
* Shaohua Li <shaohua.li@intel.com>
|
|
* Adam Belay <abelay@novell.com>
|
|
*
|
|
* This code is licenced under the GPL.
|
|
*/
|
|
|
|
#ifndef _LINUX_CPUIDLE_H
|
|
#define _LINUX_CPUIDLE_H
|
|
|
|
#include <linux/percpu.h>
|
|
#include <linux/list.h>
|
|
#include <linux/hrtimer.h>
|
|
|
|
#define CPUIDLE_STATE_MAX 10
|
|
#define CPUIDLE_NAME_LEN 16
|
|
#define CPUIDLE_DESC_LEN 32
|
|
|
|
struct module;
|
|
|
|
struct cpuidle_device;
|
|
struct cpuidle_driver;
|
|
|
|
|
|
/****************************
|
|
* CPUIDLE DEVICE INTERFACE *
|
|
****************************/
|
|
|
|
struct cpuidle_state_usage {
|
|
unsigned long long disable;
|
|
unsigned long long usage;
|
|
unsigned long long time; /* in US */
|
|
};
|
|
|
|
struct cpuidle_state {
|
|
char name[CPUIDLE_NAME_LEN];
|
|
char desc[CPUIDLE_DESC_LEN];
|
|
|
|
unsigned int flags;
|
|
unsigned int exit_latency; /* in US */
|
|
int power_usage; /* in mW */
|
|
unsigned int target_residency; /* in US */
|
|
bool disabled; /* disabled on all CPUs */
|
|
|
|
int (*enter) (struct cpuidle_device *dev,
|
|
struct cpuidle_driver *drv,
|
|
int index);
|
|
|
|
int (*enter_dead) (struct cpuidle_device *dev, int index);
|
|
|
|
/*
|
|
* CPUs execute ->enter_freeze with the local tick or entire timekeeping
|
|
* suspended, so it must not re-enable interrupts at any point (even
|
|
* temporarily) or attempt to change states of clock event devices.
|
|
*/
|
|
void (*enter_freeze) (struct cpuidle_device *dev,
|
|
struct cpuidle_driver *drv,
|
|
int index);
|
|
};
|
|
|
|
/* Idle State Flags */
|
|
#define CPUIDLE_FLAG_COUPLED (0x02) /* state applies to multiple cpus */
|
|
#define CPUIDLE_FLAG_TIMER_STOP (0x04) /* timer is stopped on this state */
|
|
|
|
#define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000)
|
|
|
|
struct cpuidle_device_kobj;
|
|
struct cpuidle_state_kobj;
|
|
struct cpuidle_driver_kobj;
|
|
|
|
struct cpuidle_device {
|
|
unsigned int registered:1;
|
|
unsigned int enabled:1;
|
|
unsigned int cpu;
|
|
|
|
int last_residency;
|
|
struct cpuidle_state_usage states_usage[CPUIDLE_STATE_MAX];
|
|
struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX];
|
|
struct cpuidle_driver_kobj *kobj_driver;
|
|
struct cpuidle_device_kobj *kobj_dev;
|
|
struct list_head device_list;
|
|
|
|
#ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
|
|
cpumask_t coupled_cpus;
|
|
struct cpuidle_coupled *coupled;
|
|
#endif
|
|
};
|
|
|
|
DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices);
|
|
DECLARE_PER_CPU(struct cpuidle_device, cpuidle_dev);
|
|
|
|
/**
|
|
* cpuidle_get_last_residency - retrieves the last state's residency time
|
|
* @dev: the target CPU
|
|
*/
|
|
static inline int cpuidle_get_last_residency(struct cpuidle_device *dev)
|
|
{
|
|
return dev->last_residency;
|
|
}
|
|
|
|
|
|
/****************************
|
|
* CPUIDLE DRIVER INTERFACE *
|
|
****************************/
|
|
|
|
struct cpuidle_driver {
|
|
const char *name;
|
|
struct module *owner;
|
|
int refcnt;
|
|
|
|
/* used by the cpuidle framework to setup the broadcast timer */
|
|
unsigned int bctimer:1;
|
|
/* states array must be ordered in decreasing power consumption */
|
|
struct cpuidle_state states[CPUIDLE_STATE_MAX];
|
|
int state_count;
|
|
int safe_state_index;
|
|
|
|
/* the driver handles the cpus in cpumask */
|
|
struct cpumask *cpumask;
|
|
};
|
|
|
|
#ifdef CONFIG_CPU_IDLE
|
|
extern void disable_cpuidle(void);
|
|
extern bool cpuidle_not_available(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
|
|
extern int cpuidle_select(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
extern int cpuidle_enter(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev, int index);
|
|
extern void cpuidle_reflect(struct cpuidle_device *dev, int index);
|
|
|
|
extern int cpuidle_register_driver(struct cpuidle_driver *drv);
|
|
extern struct cpuidle_driver *cpuidle_get_driver(void);
|
|
extern struct cpuidle_driver *cpuidle_driver_ref(void);
|
|
extern void cpuidle_driver_unref(void);
|
|
extern void cpuidle_unregister_driver(struct cpuidle_driver *drv);
|
|
extern int cpuidle_register_device(struct cpuidle_device *dev);
|
|
extern void cpuidle_unregister_device(struct cpuidle_device *dev);
|
|
extern int cpuidle_register(struct cpuidle_driver *drv,
|
|
const struct cpumask *const coupled_cpus);
|
|
extern void cpuidle_unregister(struct cpuidle_driver *drv);
|
|
extern void cpuidle_pause_and_lock(void);
|
|
extern void cpuidle_resume_and_unlock(void);
|
|
extern void cpuidle_pause(void);
|
|
extern void cpuidle_resume(void);
|
|
extern int cpuidle_enable_device(struct cpuidle_device *dev);
|
|
extern void cpuidle_disable_device(struct cpuidle_device *dev);
|
|
extern int cpuidle_play_dead(void);
|
|
|
|
extern struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev);
|
|
static inline struct cpuidle_device *cpuidle_get_device(void)
|
|
{return __this_cpu_read(cpuidle_devices); }
|
|
#else
|
|
static inline void disable_cpuidle(void) { }
|
|
static inline bool cpuidle_not_available(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev)
|
|
{return true; }
|
|
static inline int cpuidle_select(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev)
|
|
{return -ENODEV; }
|
|
static inline int cpuidle_enter(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev, int index)
|
|
{return -ENODEV; }
|
|
static inline void cpuidle_reflect(struct cpuidle_device *dev, int index) { }
|
|
static inline int cpuidle_register_driver(struct cpuidle_driver *drv)
|
|
{return -ENODEV; }
|
|
static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; }
|
|
static inline struct cpuidle_driver *cpuidle_driver_ref(void) {return NULL; }
|
|
static inline void cpuidle_driver_unref(void) {}
|
|
static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { }
|
|
static inline int cpuidle_register_device(struct cpuidle_device *dev)
|
|
{return -ENODEV; }
|
|
static inline void cpuidle_unregister_device(struct cpuidle_device *dev) { }
|
|
static inline int cpuidle_register(struct cpuidle_driver *drv,
|
|
const struct cpumask *const coupled_cpus)
|
|
{return -ENODEV; }
|
|
static inline void cpuidle_unregister(struct cpuidle_driver *drv) { }
|
|
static inline void cpuidle_pause_and_lock(void) { }
|
|
static inline void cpuidle_resume_and_unlock(void) { }
|
|
static inline void cpuidle_pause(void) { }
|
|
static inline void cpuidle_resume(void) { }
|
|
static inline int cpuidle_enable_device(struct cpuidle_device *dev)
|
|
{return -ENODEV; }
|
|
static inline void cpuidle_disable_device(struct cpuidle_device *dev) { }
|
|
static inline int cpuidle_play_dead(void) {return -ENODEV; }
|
|
static inline struct cpuidle_driver *cpuidle_get_cpu_driver(
|
|
struct cpuidle_device *dev) {return NULL; }
|
|
static inline struct cpuidle_device *cpuidle_get_device(void) {return NULL; }
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_IDLE) && defined(CONFIG_SUSPEND)
|
|
extern int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
extern int cpuidle_enter_freeze(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
#else
|
|
static inline int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev)
|
|
{return -ENODEV; }
|
|
static inline int cpuidle_enter_freeze(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev)
|
|
{return -ENODEV; }
|
|
#endif
|
|
|
|
/* kernel/sched/idle.c */
|
|
extern void sched_idle_set_state(struct cpuidle_state *idle_state, int index);
|
|
extern void default_idle_call(void);
|
|
|
|
#ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
|
|
void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a);
|
|
#else
|
|
static inline void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
/******************************
|
|
* CPUIDLE GOVERNOR INTERFACE *
|
|
******************************/
|
|
|
|
struct cpuidle_governor {
|
|
char name[CPUIDLE_NAME_LEN];
|
|
struct list_head governor_list;
|
|
unsigned int rating;
|
|
|
|
int (*enable) (struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
void (*disable) (struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
|
|
int (*select) (struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
void (*reflect) (struct cpuidle_device *dev, int index);
|
|
|
|
struct module *owner;
|
|
};
|
|
|
|
#ifdef CONFIG_CPU_IDLE
|
|
extern int cpuidle_register_governor(struct cpuidle_governor *gov);
|
|
#else
|
|
static inline int cpuidle_register_governor(struct cpuidle_governor *gov)
|
|
{return 0;}
|
|
#endif
|
|
|
|
#ifdef CONFIG_ARCH_HAS_CPU_RELAX
|
|
#define CPUIDLE_DRIVER_STATE_START 1
|
|
#else
|
|
#define CPUIDLE_DRIVER_STATE_START 0
|
|
#endif
|
|
|
|
#endif /* _LINUX_CPUIDLE_H */
|