Commit 5fa0eb0b authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 updates from Thomas Gleixner:
 "A pile of regression fixes and updates:

   - address the fallout of the patches which made the cpuid - nodeid
     relation permanent: Handling of invalid APIC ids and preventing
     pointless warning messages.

   - force eager FPU when protection keys are enabled. Protection keys
     are not generating FPU exceptions so they cannot work with the lazy
     FPU mechanism.

   - prevent force migration of interrupts which are not part of the CPU
     vector domain.

   - handle the fact that APIC ids are not updated in the ACPI/MADT
     tables on physical CPU hotplug

   - remove bash-isms from syscall table generator script

   - use the hypervisor supplied APIC frequency when running on VMware"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/pkeys: Make protection keys an "eager" feature
  x86/apic: Prevent pointless warning messages
  x86/acpi: Prevent LAPIC id 0xff from being accounted
  arch/x86: Handle non enumerated CPU after physical hotplug
  x86/unwind: Fix oprofile module link error
  x86/vmware: Skip lapic calibration on VMware
  x86/syscalls: Remove bash-isms in syscall table generator
  x86/irq: Prevent force migration of irqs which are not in the vector domain
parents c48ce9f1 d4b05923
...@@ -10,8 +10,11 @@ syscall_macro() { ...@@ -10,8 +10,11 @@ syscall_macro() {
# Entry can be either just a function name or "function/qualifier" # Entry can be either just a function name or "function/qualifier"
real_entry="${entry%%/*}" real_entry="${entry%%/*}"
qualifier="${entry:${#real_entry}}" # Strip the function name if [ "$entry" = "$real_entry" ]; then
qualifier="${qualifier:1}" # Strip the slash, if any qualifier=
else
qualifier=${entry#*/}
fi
echo "__SYSCALL_${abi}($nr, $real_entry, $qualifier)" echo "__SYSCALL_${abi}($nr, $real_entry, $qualifier)"
} }
...@@ -22,7 +25,7 @@ emit() { ...@@ -22,7 +25,7 @@ emit() {
entry="$3" entry="$3"
compat="$4" compat="$4"
if [ "$abi" == "64" -a -n "$compat" ]; then if [ "$abi" = "64" -a -n "$compat" ]; then
echo "a compat entry for a 64-bit syscall makes no sense" >&2 echo "a compat entry for a 64-bit syscall makes no sense" >&2
exit 1 exit 1
fi fi
...@@ -45,17 +48,17 @@ emit() { ...@@ -45,17 +48,17 @@ emit() {
grep '^[0-9]' "$in" | sort -n | ( grep '^[0-9]' "$in" | sort -n | (
while read nr abi name entry compat; do while read nr abi name entry compat; do
abi=`echo "$abi" | tr '[a-z]' '[A-Z]'` abi=`echo "$abi" | tr '[a-z]' '[A-Z]'`
if [ "$abi" == "COMMON" -o "$abi" == "64" ]; then if [ "$abi" = "COMMON" -o "$abi" = "64" ]; then
# COMMON is the same as 64, except that we don't expect X32 # COMMON is the same as 64, except that we don't expect X32
# programs to use it. Our expectation has nothing to do with # programs to use it. Our expectation has nothing to do with
# any generated code, so treat them the same. # any generated code, so treat them the same.
emit 64 "$nr" "$entry" "$compat" emit 64 "$nr" "$entry" "$compat"
elif [ "$abi" == "X32" ]; then elif [ "$abi" = "X32" ]; then
# X32 is equivalent to 64 on an X32-compatible kernel. # X32 is equivalent to 64 on an X32-compatible kernel.
echo "#ifdef CONFIG_X86_X32_ABI" echo "#ifdef CONFIG_X86_X32_ABI"
emit 64 "$nr" "$entry" "$compat" emit 64 "$nr" "$entry" "$compat"
echo "#endif" echo "#endif"
elif [ "$abi" == "I386" ]; then elif [ "$abi" = "I386" ]; then
emit "$abi" "$nr" "$entry" "$compat" emit "$abi" "$nr" "$entry" "$compat"
else else
echo "Unknown abi $abi" >&2 echo "Unknown abi $abi" >&2
......
...@@ -27,11 +27,12 @@ ...@@ -27,11 +27,12 @@
XFEATURE_MASK_YMM | \ XFEATURE_MASK_YMM | \
XFEATURE_MASK_OPMASK | \ XFEATURE_MASK_OPMASK | \
XFEATURE_MASK_ZMM_Hi256 | \ XFEATURE_MASK_ZMM_Hi256 | \
XFEATURE_MASK_Hi16_ZMM | \ XFEATURE_MASK_Hi16_ZMM)
XFEATURE_MASK_PKRU)
/* Supported features which require eager state saving */ /* Supported features which require eager state saving */
#define XFEATURE_MASK_EAGER (XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR) #define XFEATURE_MASK_EAGER (XFEATURE_MASK_BNDREGS | \
XFEATURE_MASK_BNDCSR | \
XFEATURE_MASK_PKRU)
/* All currently supported features */ /* All currently supported features */
#define XCNTXT_MASK (XFEATURE_MASK_LAZY | XFEATURE_MASK_EAGER) #define XCNTXT_MASK (XFEATURE_MASK_LAZY | XFEATURE_MASK_EAGER)
......
...@@ -23,6 +23,8 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task, ...@@ -23,6 +23,8 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task,
bool unwind_next_frame(struct unwind_state *state); bool unwind_next_frame(struct unwind_state *state);
unsigned long unwind_get_return_address(struct unwind_state *state);
static inline bool unwind_done(struct unwind_state *state) static inline bool unwind_done(struct unwind_state *state)
{ {
return state->stack_info.type == STACK_TYPE_UNKNOWN; return state->stack_info.type == STACK_TYPE_UNKNOWN;
...@@ -48,8 +50,6 @@ unsigned long *unwind_get_return_address_ptr(struct unwind_state *state) ...@@ -48,8 +50,6 @@ unsigned long *unwind_get_return_address_ptr(struct unwind_state *state)
return state->bp + 1; return state->bp + 1;
} }
unsigned long unwind_get_return_address(struct unwind_state *state);
#else /* !CONFIG_FRAME_POINTER */ #else /* !CONFIG_FRAME_POINTER */
static inline static inline
...@@ -58,16 +58,6 @@ unsigned long *unwind_get_return_address_ptr(struct unwind_state *state) ...@@ -58,16 +58,6 @@ unsigned long *unwind_get_return_address_ptr(struct unwind_state *state)
return NULL; return NULL;
} }
static inline
unsigned long unwind_get_return_address(struct unwind_state *state)
{
if (unwind_done(state))
return 0;
return ftrace_graph_ret_addr(state->task, &state->graph_idx,
*state->sp, state->sp);
}
#endif /* CONFIG_FRAME_POINTER */ #endif /* CONFIG_FRAME_POINTER */
#endif /* _ASM_X86_UNWIND_H */ #endif /* _ASM_X86_UNWIND_H */
...@@ -233,6 +233,10 @@ acpi_parse_lapic(struct acpi_subtable_header * header, const unsigned long end) ...@@ -233,6 +233,10 @@ acpi_parse_lapic(struct acpi_subtable_header * header, const unsigned long end)
acpi_table_print_madt_entry(header); acpi_table_print_madt_entry(header);
/* Ignore invalid ID */
if (processor->id == 0xff)
return 0;
/* /*
* We need to register disabled CPU as well to permit * We need to register disabled CPU as well to permit
* counting disabled CPUs. This allows us to size * counting disabled CPUs. This allows us to size
......
...@@ -2128,9 +2128,11 @@ int __generic_processor_info(int apicid, int version, bool enabled) ...@@ -2128,9 +2128,11 @@ int __generic_processor_info(int apicid, int version, bool enabled)
if (num_processors >= nr_cpu_ids) { if (num_processors >= nr_cpu_ids) {
int thiscpu = max + disabled_cpus; int thiscpu = max + disabled_cpus;
pr_warning( if (enabled) {
"APIC: NR_CPUS/possible_cpus limit of %i reached." pr_warning("APIC: NR_CPUS/possible_cpus limit of %i "
" Processor %d/0x%x ignored.\n", max, thiscpu, apicid); "reached. Processor %d/0x%x ignored.\n",
max, thiscpu, apicid);
}
disabled_cpus++; disabled_cpus++;
return -EINVAL; return -EINVAL;
......
...@@ -661,11 +661,28 @@ void irq_complete_move(struct irq_cfg *cfg) ...@@ -661,11 +661,28 @@ void irq_complete_move(struct irq_cfg *cfg)
*/ */
void irq_force_complete_move(struct irq_desc *desc) void irq_force_complete_move(struct irq_desc *desc)
{ {
struct irq_data *irqdata = irq_desc_get_irq_data(desc); struct irq_data *irqdata;
struct apic_chip_data *data = apic_chip_data(irqdata); struct apic_chip_data *data;
struct irq_cfg *cfg = data ? &data->cfg : NULL; struct irq_cfg *cfg;
unsigned int cpu; unsigned int cpu;
/*
* The function is called for all descriptors regardless of which
* irqdomain they belong to. For example if an IRQ is provided by
* an irq_chip as part of a GPIO driver, the chip data for that
* descriptor is specific to the irq_chip in question.
*
* Check first that the chip_data is what we expect
* (apic_chip_data) before touching it any further.
*/
irqdata = irq_domain_get_irq_data(x86_vector_domain,
irq_desc_get_irq(desc));
if (!irqdata)
return;
data = apic_chip_data(irqdata);
cfg = data ? &data->cfg : NULL;
if (!cfg) if (!cfg)
return; return;
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <asm/div64.h> #include <asm/div64.h>
#include <asm/x86_init.h> #include <asm/x86_init.h>
#include <asm/hypervisor.h> #include <asm/hypervisor.h>
#include <asm/apic.h>
#define CPUID_VMWARE_INFO_LEAF 0x40000000 #define CPUID_VMWARE_INFO_LEAF 0x40000000
#define VMWARE_HYPERVISOR_MAGIC 0x564D5868 #define VMWARE_HYPERVISOR_MAGIC 0x564D5868
...@@ -82,10 +83,17 @@ static void __init vmware_platform_setup(void) ...@@ -82,10 +83,17 @@ static void __init vmware_platform_setup(void)
VMWARE_PORT(GETHZ, eax, ebx, ecx, edx); VMWARE_PORT(GETHZ, eax, ebx, ecx, edx);
if (ebx != UINT_MAX) if (ebx != UINT_MAX) {
x86_platform.calibrate_tsc = vmware_get_tsc_khz; x86_platform.calibrate_tsc = vmware_get_tsc_khz;
else #ifdef CONFIG_X86_LOCAL_APIC
/* Skip lapic calibration since we know the bus frequency. */
lapic_timer_frequency = ecx / HZ;
pr_info("Host bus clock speed read from hypervisor : %u Hz\n",
ecx);
#endif
} else {
pr_warn("Failed to get TSC freq from the hypervisor\n"); pr_warn("Failed to get TSC freq from the hypervisor\n");
}
} }
/* /*
......
...@@ -1407,9 +1407,21 @@ __init void prefill_possible_map(void) ...@@ -1407,9 +1407,21 @@ __init void prefill_possible_map(void)
{ {
int i, possible; int i, possible;
/* no processor from mptable or madt */ /* No boot processor was found in mptable or ACPI MADT */
if (!num_processors) if (!num_processors) {
num_processors = 1; int apicid = boot_cpu_physical_apicid;
int cpu = hard_smp_processor_id();
pr_warn("Boot CPU (id %d) not listed by BIOS\n", cpu);
/* Make sure boot cpu is enumerated */
if (apic->cpu_present_to_apicid(0) == BAD_APICID &&
apic->apic_id_valid(apicid))
generic_processor_info(apicid, boot_cpu_apic_version);
if (!num_processors)
num_processors = 1;
}
i = setup_max_cpus ?: 1; i = setup_max_cpus ?: 1;
if (setup_possible_cpus == -1) { if (setup_possible_cpus == -1) {
......
...@@ -5,6 +5,16 @@ ...@@ -5,6 +5,16 @@
#include <asm/stacktrace.h> #include <asm/stacktrace.h>
#include <asm/unwind.h> #include <asm/unwind.h>
unsigned long unwind_get_return_address(struct unwind_state *state)
{
if (unwind_done(state))
return 0;
return ftrace_graph_ret_addr(state->task, &state->graph_idx,
*state->sp, state->sp);
}
EXPORT_SYMBOL_GPL(unwind_get_return_address);
bool unwind_next_frame(struct unwind_state *state) bool unwind_next_frame(struct unwind_state *state)
{ {
struct stack_info *info = &state->stack_info; struct stack_info *info = &state->stack_info;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment