Files
Greg Kroah-Hartman 2e33202bb4 Merge 4.4.163 into android-msm-wahoo-4.4-lts
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>
2018-12-11 19:41:54 +01:00

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 */