Changes in 4.9.285 ocfs2: drop acl cache for directories too usb: gadget: r8a66597: fix a loop in set_feature() usb: musb: tusb6010: uninitialized data in tusb_fifo_write_unaligned() cifs: fix incorrect check for null pointer in header_assemble xen/x86: fix PV trap handling on secondary processors usb-storage: Add quirk for ScanLogic SL11R-IDE older than 2.6c USB: serial: cp210x: add ID for GW Instek GDM-834x Digital Multimeter staging: greybus: uart: fix tty use after free USB: serial: mos7840: remove duplicated 0xac24 device ID USB: serial: option: add Telit LN920 compositions USB: serial: option: remove duplicate USB device ID USB: serial: option: add device id for Foxconn T99W265 mcb: fix error handling in mcb_alloc_bus() serial: mvebu-uart: fix driver's tx_empty callback net: hso: fix muxed tty registration net/mlx4_en: Don't allow aRFS for encapsulated packets scsi: iscsi: Adjust iface sysfs attr detection blktrace: Fix uaf in blk_trace access after removing by sysfs net: stmmac: allow CSR clock of 300MHz m68k: Double cast io functions to unsigned long compiler.h: Introduce absolute_pointer macro net: i825xx: Use absolute_pointer for memcpy from fixed memory location sparc: avoid stringop-overread errors qnx4: avoid stringop-overread errors parisc: Use absolute_pointer() to define PAGE0 arm64: Mark __stack_chk_guard as __ro_after_init alpha: Declare virt_to_phys and virt_to_bus parameter as pointer to volatile net: 6pack: Fix tx timeout and slot time spi: Fix tegra20 build with CONFIG_PM=n arm64: dts: marvell: armada-37xx: Extend PCIe MEM space qnx4: work around gcc false positive warning bug tty: Fix out-of-bound vmalloc access in imageblit cpufreq: schedutil: Use kobject release() method to free sugov_tunables cpufreq: schedutil: Destroy mutex before kobject_put() frees the memory mac80211: fix use-after-free in CCMP/GCMP RX ipvs: check that ip_vs_conn_tab_bits is between 8 and 20 mac80211: limit injected vht mcs/nss in ieee80211_parse_tx_radiotap hwmon: (tmp421) fix rounding for negative values e100: fix length calculation in e100_get_regs_len e100: fix buffer overrun in e100_get_regs ipack: ipoctal: fix stack information leak ipack: ipoctal: fix tty registration race ipack: ipoctal: fix tty-registration error handling ipack: ipoctal: fix missing allocation-failure check ipack: ipoctal: fix module reference leak ext4: fix potential infinite loop in ext4_dx_readdir() net: udp: annotate data race around udp_sk(sk)->corkflag EDAC/synopsys: Fix wrong value type assignment for edac_mode ARM: 9077/1: PLT: Move struct plt_entries definition to header ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link() ARM: 9079/1: ftrace: Add MODULE_PLTS support ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE arm64: Extend workaround for erratum 1024718 to all versions of Cortex-A55 HID: betop: fix slab-out-of-bounds Write in betop_probe netfilter: ipset: Fix oversized kvmalloc() calls HID: usbhid: free raw_report buffers in usbhid_stop cred: allow get_cred() and put_cred() to be given NULL. Linux 4.9.285 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I55fa39c89ba10e7092db6001c6feee0d792a401f
85 lines
2.3 KiB
C
85 lines
2.3 KiB
C
/*
|
|
* Abstract code for CPUFreq governor tunable sysfs attributes.
|
|
*
|
|
* Copyright (C) 2016, Intel Corporation
|
|
* Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include "cpufreq_governor.h"
|
|
|
|
static inline struct gov_attr_set *to_gov_attr_set(struct kobject *kobj)
|
|
{
|
|
return container_of(kobj, struct gov_attr_set, kobj);
|
|
}
|
|
|
|
static inline struct governor_attr *to_gov_attr(struct attribute *attr)
|
|
{
|
|
return container_of(attr, struct governor_attr, attr);
|
|
}
|
|
|
|
static ssize_t governor_show(struct kobject *kobj, struct attribute *attr,
|
|
char *buf)
|
|
{
|
|
struct governor_attr *gattr = to_gov_attr(attr);
|
|
|
|
return gattr->show(to_gov_attr_set(kobj), buf);
|
|
}
|
|
|
|
static ssize_t governor_store(struct kobject *kobj, struct attribute *attr,
|
|
const char *buf, size_t count)
|
|
{
|
|
struct gov_attr_set *attr_set = to_gov_attr_set(kobj);
|
|
struct governor_attr *gattr = to_gov_attr(attr);
|
|
int ret;
|
|
|
|
mutex_lock(&attr_set->update_lock);
|
|
ret = attr_set->usage_count ? gattr->store(attr_set, buf, count) : -EBUSY;
|
|
mutex_unlock(&attr_set->update_lock);
|
|
return ret;
|
|
}
|
|
|
|
const struct sysfs_ops governor_sysfs_ops = {
|
|
.show = governor_show,
|
|
.store = governor_store,
|
|
};
|
|
EXPORT_SYMBOL_GPL(governor_sysfs_ops);
|
|
|
|
void gov_attr_set_init(struct gov_attr_set *attr_set, struct list_head *list_node)
|
|
{
|
|
INIT_LIST_HEAD(&attr_set->policy_list);
|
|
mutex_init(&attr_set->update_lock);
|
|
attr_set->usage_count = 1;
|
|
list_add(list_node, &attr_set->policy_list);
|
|
}
|
|
EXPORT_SYMBOL_GPL(gov_attr_set_init);
|
|
|
|
void gov_attr_set_get(struct gov_attr_set *attr_set, struct list_head *list_node)
|
|
{
|
|
mutex_lock(&attr_set->update_lock);
|
|
attr_set->usage_count++;
|
|
list_add(list_node, &attr_set->policy_list);
|
|
mutex_unlock(&attr_set->update_lock);
|
|
}
|
|
EXPORT_SYMBOL_GPL(gov_attr_set_get);
|
|
|
|
unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *list_node)
|
|
{
|
|
unsigned int count;
|
|
|
|
mutex_lock(&attr_set->update_lock);
|
|
list_del(list_node);
|
|
count = --attr_set->usage_count;
|
|
mutex_unlock(&attr_set->update_lock);
|
|
if (count)
|
|
return count;
|
|
|
|
mutex_destroy(&attr_set->update_lock);
|
|
kobject_put(&attr_set->kobj);
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(gov_attr_set_put);
|