File tree Expand file tree Collapse file tree 4 files changed +34
-19
lines changed Expand file tree Collapse file tree 4 files changed +34
-19
lines changed Original file line number Diff line number Diff line change @@ -370,6 +370,17 @@ static void init_intel(struct cpuinfo_x86 *c)
370
370
*/
371
371
detect_extended_topology (c );
372
372
373
+ if (!cpu_has (c , X86_FEATURE_XTOPOLOGY )) {
374
+ /*
375
+ * let's use the legacy cpuid vector 0x1 and 0x4 for topology
376
+ * detection.
377
+ */
378
+ c -> x86_max_cores = intel_num_cpu_cores (c );
379
+ #ifdef CONFIG_X86_32
380
+ detect_ht (c );
381
+ #endif
382
+ }
383
+
373
384
l2 = init_intel_cacheinfo (c );
374
385
if (c -> cpuid_level > 9 ) {
375
386
unsigned eax = cpuid_eax (10 );
@@ -438,17 +449,6 @@ static void init_intel(struct cpuinfo_x86 *c)
438
449
set_cpu_cap (c , X86_FEATURE_P3 );
439
450
#endif
440
451
441
- if (!cpu_has (c , X86_FEATURE_XTOPOLOGY )) {
442
- /*
443
- * let's use the legacy cpuid vector 0x1 and 0x4 for topology
444
- * detection.
445
- */
446
- c -> x86_max_cores = intel_num_cpu_cores (c );
447
- #ifdef CONFIG_X86_32
448
- detect_ht (c );
449
- #endif
450
- }
451
-
452
452
/* Work around errata */
453
453
srat_detect_node (c );
454
454
Original file line number Diff line number Diff line change @@ -730,6 +730,18 @@ unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c)
730
730
#endif
731
731
}
732
732
733
+ #ifdef CONFIG_X86_HT
734
+ /*
735
+ * If cpu_llc_id is not yet set, this means cpuid_level < 4 which in
736
+ * turns means that the only possibility is SMT (as indicated in
737
+ * cpuid1). Since cpuid2 doesn't specify shared caches, and we know
738
+ * that SMT shares all caches, we can unconditionally set cpu_llc_id to
739
+ * c->phys_proc_id.
740
+ */
741
+ if (per_cpu (cpu_llc_id , cpu ) == BAD_APICID )
742
+ per_cpu (cpu_llc_id , cpu ) = c -> phys_proc_id ;
743
+ #endif
744
+
733
745
c -> x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i + l1d ));
734
746
735
747
return l2 ;
Original file line number Diff line number Diff line change @@ -2451,6 +2451,12 @@ static __init int mcheck_init_device(void)
2451
2451
for_each_online_cpu (i ) {
2452
2452
err = mce_device_create (i );
2453
2453
if (err ) {
2454
+ /*
2455
+ * Register notifier anyway (and do not unreg it) so
2456
+ * that we don't leave undeleted timers, see notifier
2457
+ * callback above.
2458
+ */
2459
+ __register_hotcpu_notifier (& mce_cpu_notifier );
2454
2460
cpu_notifier_register_done ();
2455
2461
goto err_device_create ;
2456
2462
}
@@ -2471,10 +2477,6 @@ static __init int mcheck_init_device(void)
2471
2477
err_register :
2472
2478
unregister_syscore_ops (& mce_syscore_ops );
2473
2479
2474
- cpu_notifier_register_begin ();
2475
- __unregister_hotcpu_notifier (& mce_cpu_notifier );
2476
- cpu_notifier_register_done ();
2477
-
2478
2480
err_device_create :
2479
2481
/*
2480
2482
* We didn't keep track of which devices were created above, but
Original file line number Diff line number Diff line change @@ -425,8 +425,8 @@ sysenter_do_call:
425
425
cmpl $(NR_syscalls), %eax
426
426
jae sysenter_badsys
427
427
call *sys_call_table(,%eax ,4 )
428
- movl %eax ,PT_EAX(%esp )
429
428
sysenter_after_call:
429
+ movl %eax ,PT_EAX(%esp )
430
430
LOCKDEP_SYS_EXIT
431
431
DISABLE_INTERRUPTS(CLBR_ANY)
432
432
TRACE_IRQS_OFF
@@ -502,6 +502,7 @@ ENTRY(system_call)
502
502
jae syscall_badsys
503
503
syscall_call:
504
504
call *sys_call_table(,%eax ,4 )
505
+ syscall_after_call:
505
506
movl %eax ,PT_EAX(%esp ) # store the return value
506
507
syscall_exit:
507
508
LOCKDEP_SYS_EXIT
@@ -675,12 +676,12 @@ syscall_fault:
675
676
END(syscall_fault)
676
677
677
678
syscall_badsys:
678
- movl $-ENOSYS,PT_EAX( %esp )
679
- jmp syscall_exit
679
+ movl $-ENOSYS,%eax
680
+ jmp syscall_after_call
680
681
END(syscall_badsys)
681
682
682
683
sysenter_badsys:
683
- movl $-ENOSYS,PT_EAX( %esp )
684
+ movl $-ENOSYS,%eax
684
685
jmp sysenter_after_call
685
686
END(syscall_badsys)
686
687
CFI_ENDPROC
You can’t perform that action at this time.
0 commit comments