mirror of https://gitee.com/openkylin/linux.git
Merge branches 'pm-cpuidle', 'pm-cpufreq' and 'acpi-resources'
* pm-cpuidle: suspend-to-idle: Prevent RCU from complaining about tick_freeze() * pm-cpufreq: cpufreq: Allow freq_table to be obtained for offline CPUs cpufreq: Initialize the governor again while restoring policy * acpi-resources: ACPI / PCI: Fix regressions caused by resource_size_t overflow with 32-bit kernel
This commit is contained in:
commit
17ffc8b083
|
@ -193,6 +193,7 @@ static bool acpi_decode_space(struct resource_win *win,
|
|||
u8 iodec = attr->granularity == 0xfff ? ACPI_DECODE_10 : ACPI_DECODE_16;
|
||||
bool wp = addr->info.mem.write_protect;
|
||||
u64 len = attr->address_length;
|
||||
u64 start, end, offset = 0;
|
||||
struct resource *res = &win->res;
|
||||
|
||||
/*
|
||||
|
@ -204,9 +205,6 @@ static bool acpi_decode_space(struct resource_win *win,
|
|||
pr_debug("ACPI: Invalid address space min_addr_fix %d, max_addr_fix %d, len %llx\n",
|
||||
addr->min_address_fixed, addr->max_address_fixed, len);
|
||||
|
||||
res->start = attr->minimum;
|
||||
res->end = attr->maximum;
|
||||
|
||||
/*
|
||||
* For bridges that translate addresses across the bridge,
|
||||
* translation_offset is the offset that must be added to the
|
||||
|
@ -214,12 +212,22 @@ static bool acpi_decode_space(struct resource_win *win,
|
|||
* primary side. Non-bridge devices must list 0 for all Address
|
||||
* Translation offset bits.
|
||||
*/
|
||||
if (addr->producer_consumer == ACPI_PRODUCER) {
|
||||
res->start += attr->translation_offset;
|
||||
res->end += attr->translation_offset;
|
||||
} else if (attr->translation_offset) {
|
||||
if (addr->producer_consumer == ACPI_PRODUCER)
|
||||
offset = attr->translation_offset;
|
||||
else if (attr->translation_offset)
|
||||
pr_debug("ACPI: translation_offset(%lld) is invalid for non-bridge device.\n",
|
||||
attr->translation_offset);
|
||||
start = attr->minimum + offset;
|
||||
end = attr->maximum + offset;
|
||||
|
||||
win->offset = offset;
|
||||
res->start = start;
|
||||
res->end = end;
|
||||
if (sizeof(resource_size_t) < sizeof(u64) &&
|
||||
(offset != win->offset || start != res->start || end != res->end)) {
|
||||
pr_warn("acpi resource window ([%#llx-%#llx] ignored, not CPU addressable)\n",
|
||||
attr->minimum, attr->maximum);
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (addr->resource_type) {
|
||||
|
@ -236,8 +244,6 @@ static bool acpi_decode_space(struct resource_win *win,
|
|||
return false;
|
||||
}
|
||||
|
||||
win->offset = attr->translation_offset;
|
||||
|
||||
if (addr->producer_consumer == ACPI_PRODUCER)
|
||||
res->flags |= IORESOURCE_WINDOW;
|
||||
|
||||
|
|
|
@ -169,6 +169,15 @@ struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(get_governor_parent_kobj);
|
||||
|
||||
struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu)
|
||||
{
|
||||
struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
|
||||
|
||||
return policy && !policy_is_inactive(policy) ?
|
||||
policy->freq_table : NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cpufreq_frequency_get_table);
|
||||
|
||||
static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
|
||||
{
|
||||
u64 idle_time;
|
||||
|
@ -1132,6 +1141,7 @@ static struct cpufreq_policy *cpufreq_policy_restore(unsigned int cpu)
|
|||
|
||||
down_write(&policy->rwsem);
|
||||
policy->cpu = cpu;
|
||||
policy->governor = NULL;
|
||||
up_write(&policy->rwsem);
|
||||
}
|
||||
|
||||
|
|
|
@ -297,15 +297,6 @@ int cpufreq_table_validate_and_show(struct cpufreq_policy *policy,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(cpufreq_table_validate_and_show);
|
||||
|
||||
struct cpufreq_policy *cpufreq_cpu_get_raw(unsigned int cpu);
|
||||
|
||||
struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu)
|
||||
{
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu);
|
||||
return policy ? policy->freq_table : NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cpufreq_frequency_get_table);
|
||||
|
||||
MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>");
|
||||
MODULE_DESCRIPTION("CPUfreq frequency table helpers");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -112,7 +112,12 @@ int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
|
|||
static void enter_freeze_proper(struct cpuidle_driver *drv,
|
||||
struct cpuidle_device *dev, int index)
|
||||
{
|
||||
tick_freeze();
|
||||
/*
|
||||
* trace_suspend_resume() called by tick_freeze() for the last CPU
|
||||
* executing it contains RCU usage regarded as invalid in the idle
|
||||
* context, so tell RCU about that.
|
||||
*/
|
||||
RCU_NONIDLE(tick_freeze());
|
||||
/*
|
||||
* The state used here cannot be a "coupled" one, because the "coupled"
|
||||
* cpuidle mechanism enables interrupts and doing that with timekeeping
|
||||
|
@ -122,7 +127,7 @@ static void enter_freeze_proper(struct cpuidle_driver *drv,
|
|||
WARN_ON(!irqs_disabled());
|
||||
/*
|
||||
* timekeeping_resume() that will be called by tick_unfreeze() for the
|
||||
* last CPU executing it calls functions containing RCU read-side
|
||||
* first CPU executing it calls functions containing RCU read-side
|
||||
* critical sections, so tell RCU about that.
|
||||
*/
|
||||
RCU_NONIDLE(tick_unfreeze());
|
||||
|
|
Loading…
Reference in New Issue