Linux v4.5-4071-g10fdfee7f7fd
- input, livepatching, trivial, hid, gpio, m68knommu, arm64, selftest merges
This commit is contained in:
		
							parent
							
								
									8b7fda18c9
								
							
						
					
					
						commit
						1dea4eb579
					
				| @ -1,52 +0,0 @@ | |||||||
| From e2fea58e57993ab2ed011eb35a034507347336ed Mon Sep 17 00:00:00 2001 |  | ||||||
| From: "Rafael J. Wysocki" <rjw@rjwysocki.net> |  | ||||||
| Date: Thu, 17 Mar 2016 15:07:16 +0100 |  | ||||||
| Subject: [PATCH] Temp fix for intel_pstate oopses and lockdep report with |  | ||||||
|  Linux v4.5-1822-g63e30271b04c |  | ||||||
| 
 |  | ||||||
| On Thursday, March 17, 2016 09:02:29 AM Josh Boyer wrote: |  | ||||||
| > Hello,
 |  | ||||||
| 
 |  | ||||||
| Hi, |  | ||||||
| 
 |  | ||||||
| > I have an Intel Atom based NUC that is producing the following
 |  | ||||||
| > backtraces on boot of Linus' tree as of last evening.  This does not
 |  | ||||||
| > happen with a tree with top level commit 271ecc5253e2, but does happen
 |  | ||||||
| > when using the tree mentioned in the subject with top level commit
 |  | ||||||
| > 63e30271b04c.
 |  | ||||||
| > |  | ||||||
| > The first backtrace appears to be a warning because the intel_pstate
 |  | ||||||
| > driver is calling wrmsrl_on_cpu when interrupts are disabled?  Not
 |  | ||||||
| > sure on that one.
 |  | ||||||
| > |  | ||||||
| > The second backtrace is a lockdep report.  Both are from the same boot.
 |  | ||||||
| 
 |  | ||||||
| OK, thanks for the report. |  | ||||||
| 
 |  | ||||||
| Can you please try the patch below? |  | ||||||
| 
 |  | ||||||
| I'm actually unsure if we can do that safely in general for Atom because |  | ||||||
| of the initialization, but that's what Core does anyway. |  | ||||||
| 
 |  | ||||||
| Srinivas, Philippe, why exactly do we need the wrmsrl_on_cpu() in |  | ||||||
| atom_set_pstate()?  core_set_pstate() uses wrmsrl() and seems to be doing fine. |  | ||||||
| ---
 |  | ||||||
|  drivers/cpufreq/intel_pstate.c | 2 +- |  | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
 |  | ||||||
| index cb5607495816..32d5d6456290 100644
 |  | ||||||
| --- a/drivers/cpufreq/intel_pstate.c
 |  | ||||||
| +++ b/drivers/cpufreq/intel_pstate.c
 |  | ||||||
| @@ -587,7 +587,7 @@ static void atom_set_pstate(struct cpudata *cpudata, int pstate)
 |  | ||||||
|   |  | ||||||
|  	val |= vid; |  | ||||||
|   |  | ||||||
| -	wrmsrl_on_cpu(cpudata->cpu, MSR_IA32_PERF_CTL, val);
 |  | ||||||
| +	wrmsrl(MSR_IA32_PERF_CTL, val);
 |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  static int silvermont_get_scaling(void) |  | ||||||
| -- 
 |  | ||||||
| 2.5.0 |  | ||||||
| 
 |  | ||||||
| @ -1,7 +1,7 @@ | |||||||
| From 47f6b5c281137394d627e275cb80980492d00d84 Mon Sep 17 00:00:00 2001 | From 24ceffbbe2764a31328e1146a2cf4bdcf85664e7 Mon Sep 17 00:00:00 2001 | ||||||
| From: Dave Howells <dhowells@redhat.com> | From: Dave Howells <dhowells@redhat.com> | ||||||
| Date: Tue, 23 Oct 2012 09:30:54 -0400 | Date: Tue, 23 Oct 2012 09:30:54 -0400 | ||||||
| Subject: [PATCH 15/20] Add EFI signature data types | Subject: [PATCH] Add EFI signature data types | ||||||
| 
 | 
 | ||||||
| Add the data types that are used for containing hashes, keys and certificates | Add the data types that are used for containing hashes, keys and certificates | ||||||
| for cryptographic verification. | for cryptographic verification. | ||||||
| @ -15,12 +15,12 @@ Signed-off-by: David Howells <dhowells@redhat.com> | |||||||
|  1 file changed, 20 insertions(+) |  1 file changed, 20 insertions(+) | ||||||
| 
 | 
 | ||||||
| diff --git a/include/linux/efi.h b/include/linux/efi.h
 | diff --git a/include/linux/efi.h b/include/linux/efi.h
 | ||||||
| index 4dc970e..82d6218 100644
 | index 333d0ca6940f..b3efb6d06344 100644
 | ||||||
| --- a/include/linux/efi.h
 | --- a/include/linux/efi.h
 | ||||||
| +++ b/include/linux/efi.h
 | +++ b/include/linux/efi.h
 | ||||||
| @@ -599,6 +599,12 @@ void efi_native_runtime_setup(void);
 | @@ -603,6 +603,12 @@ void efi_native_runtime_setup(void);
 | ||||||
|  #define EFI_PROPERTIES_TABLE_GUID \ |  	EFI_GUID(0x3152bca5, 0xeade, 0x433d, \ | ||||||
|      EFI_GUID(  0x880aaca3, 0x4adc, 0x4a04, 0x90, 0x79, 0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5 ) |  		 0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44) | ||||||
|   |   | ||||||
| +#define EFI_CERT_SHA256_GUID \
 | +#define EFI_CERT_SHA256_GUID \
 | ||||||
| +    EFI_GUID(  0xc1c41626, 0x504c, 0x4092, 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28 )
 | +    EFI_GUID(  0xc1c41626, 0x504c, 0x4092, 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28 )
 | ||||||
| @ -31,7 +31,7 @@ index 4dc970e..82d6218 100644 | |||||||
|  typedef struct { |  typedef struct { | ||||||
|  	efi_guid_t guid; |  	efi_guid_t guid; | ||||||
|  	u64 table; |  	u64 table; | ||||||
| @@ -823,6 +829,20 @@ typedef struct {
 | @@ -827,6 +833,20 @@ typedef struct {
 | ||||||
|   |   | ||||||
|  #define EFI_INVALID_TABLE_ADDR		(~0UL) |  #define EFI_INVALID_TABLE_ADDR		(~0UL) | ||||||
|   |   | ||||||
|  | |||||||
| @ -1,49 +0,0 @@ | |||||||
| From 954d6154959c8c196fa4b89fc98a4fb377c6a38d Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Benjamin Tissoires <benjamin.tissoires@redhat.com> |  | ||||||
| Date: Fri, 8 Jan 2016 17:58:49 +0100 |  | ||||||
| Subject: [PATCH] HID: sony: do not bail out when the sixaxis refuses the |  | ||||||
|  output report |  | ||||||
| 
 |  | ||||||
| When setting the operational mode, some third party (Speedlink Strike-FX) |  | ||||||
| gamepads refuse the output report. Failing here means we refuse to |  | ||||||
| initialize the gamepad while this should be harmless. |  | ||||||
| 
 |  | ||||||
| The weird part is that the initial commit that added this: a7de9b8 |  | ||||||
| ("HID: sony: Enable Gasia third-party PS3 controllers") mentions this |  | ||||||
| very same controller as one requiring this output report. |  | ||||||
| Anyway, it's broken for one user at least, so let's change it. |  | ||||||
| We will report an error, but at least the controller should work. |  | ||||||
| 
 |  | ||||||
| And no, these devices present themselves as legacy Sony controllers |  | ||||||
| (VID:PID of 054C:0268, as in the official ones) so there are no ways |  | ||||||
| of discriminating them from the official ones. |  | ||||||
| 
 |  | ||||||
| https://bugzilla.redhat.com/show_bug.cgi?id=1255325 |  | ||||||
| 
 |  | ||||||
| Reported-and-tested-by: Max Fedotov <thesourcehim@gmail.com> |  | ||||||
| Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> |  | ||||||
| Signed-off-by: Jiri Kosina <jkosina@suse.cz> |  | ||||||
| ---
 |  | ||||||
|  drivers/hid/hid-sony.c | 6 ++++-- |  | ||||||
|  1 file changed, 4 insertions(+), 2 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
 |  | ||||||
| index 661f94f8ab8b..11f91c0c2458 100644
 |  | ||||||
| --- a/drivers/hid/hid-sony.c
 |  | ||||||
| +++ b/drivers/hid/hid-sony.c
 |  | ||||||
| @@ -1411,8 +1411,10 @@ static int sixaxis_set_operational_usb(struct hid_device *hdev)
 |  | ||||||
|  	} |  | ||||||
|   |  | ||||||
|  	ret = hid_hw_output_report(hdev, buf, 1); |  | ||||||
| -	if (ret < 0)
 |  | ||||||
| -		hid_err(hdev, "can't set operational mode: step 3\n");
 |  | ||||||
| +	if (ret < 0) {
 |  | ||||||
| +		hid_info(hdev, "can't set operational mode: step 3, ignoring\n");
 |  | ||||||
| +		ret = 0;
 |  | ||||||
| +	}
 |  | ||||||
|   |  | ||||||
|  out: |  | ||||||
|  	kfree(buf); |  | ||||||
| -- 
 |  | ||||||
| 2.5.0 |  | ||||||
| 
 |  | ||||||
| @ -1,38 +0,0 @@ | |||||||
| From 0383ff3ba89d3e6c604138e3ba46685621d71f98 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Josh Boyer <jwboyer@fedoraproject.org> |  | ||||||
| Date: Mon, 14 Mar 2016 10:02:51 -0400 |  | ||||||
| Subject: [PATCH] USB: input: powermate: fix oops with malicious USB |  | ||||||
|  descriptors |  | ||||||
| 
 |  | ||||||
| The powermate driver expects at least one valid USB endpoint in its |  | ||||||
| probe function.  If given malicious descriptors that specify 0 for |  | ||||||
| the number of endpoints, it will crash.  Validate the number of |  | ||||||
| endpoints on the interface before using them. |  | ||||||
| 
 |  | ||||||
| The full report for this issue can be found here: |  | ||||||
| http://seclists.org/bugtraq/2016/Mar/85 |  | ||||||
| 
 |  | ||||||
| Reported-by: Ralf Spenneberg <ralf@spenneberg.net> |  | ||||||
| Cc: stable <stable@vger.kernel.org> |  | ||||||
| Signed-off-by: Josh Boyer <jwboyer@fedoraproject.org> |  | ||||||
| ---
 |  | ||||||
|  drivers/input/misc/powermate.c | 3 +++ |  | ||||||
|  1 file changed, 3 insertions(+) |  | ||||||
| 
 |  | ||||||
| diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c
 |  | ||||||
| index 63b539d3daba..84909a12ff36 100644
 |  | ||||||
| --- a/drivers/input/misc/powermate.c
 |  | ||||||
| +++ b/drivers/input/misc/powermate.c
 |  | ||||||
| @@ -307,6 +307,9 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
 |  | ||||||
|  	int error = -ENOMEM; |  | ||||||
|   |  | ||||||
|  	interface = intf->cur_altsetting; |  | ||||||
| +	if (interface->desc.bNumEndpoints < 1)
 |  | ||||||
| +		return -EINVAL;
 |  | ||||||
| +
 |  | ||||||
|  	endpoint = &interface->endpoint[0].desc; |  | ||||||
|  	if (!usb_endpoint_is_int_in(endpoint)) |  | ||||||
|  		return -EIO; |  | ||||||
| -- 
 |  | ||||||
| 2.5.0 |  | ||||||
| 
 |  | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From ede02df9a481ba07348e6fd4393ba2e273ef16d8 Mon Sep 17 00:00:00 2001 | From ce7a9e482dcf66d155e74b39ada1708cf6d9cb25 Mon Sep 17 00:00:00 2001 | ||||||
| From: Mark Salter <msalter@redhat.com> | From: Mark Salter <msalter@redhat.com> | ||||||
| Date: Wed, 25 Mar 2015 14:17:50 -0400 | Date: Wed, 25 Mar 2015 14:17:50 -0400 | ||||||
| Subject: [PATCH] arm64: avoid needing console= to enable serial console | Subject: [PATCH] arm64: avoid needing console= to enable serial console | ||||||
| @ -11,17 +11,17 @@ firmware. | |||||||
| 
 | 
 | ||||||
| Signed-off-by: Mark Salter <msalter@redhat.com> | Signed-off-by: Mark Salter <msalter@redhat.com> | ||||||
| ---
 | ---
 | ||||||
|  arch/arm64/kernel/setup.c | 19 +++++++++++++++++++ |  arch/arm64/kernel/setup.c | 20 ++++++++++++++++++++ | ||||||
|  1 file changed, 19 insertions(+) |  1 file changed, 20 insertions(+) | ||||||
| 
 | 
 | ||||||
| diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
 | diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
 | ||||||
| index 8119479..ea9ff80 100644
 | index 9dc67769b6a4..dfac33b47423 100644
 | ||||||
| --- a/arch/arm64/kernel/setup.c
 | --- a/arch/arm64/kernel/setup.c
 | ||||||
| +++ b/arch/arm64/kernel/setup.c
 | +++ b/arch/arm64/kernel/setup.c
 | ||||||
| @@ -381,3 +381,22 @@ static int __init topology_init(void)
 | @@ -417,3 +417,22 @@ static int __init register_kernel_offset_dumper(void)
 | ||||||
|  	return 0; |  	return 0; | ||||||
|  } |  } | ||||||
|  subsys_initcall(topology_init); |  __initcall(register_kernel_offset_dumper); | ||||||
| +
 | +
 | ||||||
| +/*
 | +/*
 | ||||||
| + * Temporary hack to avoid need for console= on command line
 | + * Temporary hack to avoid need for console= on command line
 | ||||||
|  | |||||||
| @ -36,6 +36,7 @@ CONFIG_ARM64_ERRATUM_843419=y | |||||||
| CONFIG_ARM64_ERRATUM_834220=y | CONFIG_ARM64_ERRATUM_834220=y | ||||||
| CONFIG_CAVIUM_ERRATUM_22375=y | CONFIG_CAVIUM_ERRATUM_22375=y | ||||||
| CONFIG_CAVIUM_ERRATUM_23154=y | CONFIG_CAVIUM_ERRATUM_23154=y | ||||||
|  | CONFIG_CAVIUM_ERRATUM_27456=y | ||||||
| 
 | 
 | ||||||
| # AMBA / VExpress | # AMBA / VExpress | ||||||
| # CONFIG_RTC_DRV_PL030 is not set | # CONFIG_RTC_DRV_PL030 is not set | ||||||
| @ -51,6 +52,13 @@ CONFIG_ARM64_HW_AFDBM=y | |||||||
| CONFIG_ARM64_PAN=y | CONFIG_ARM64_PAN=y | ||||||
| CONFIG_ARM64_LSE_ATOMICS=y | CONFIG_ARM64_LSE_ATOMICS=y | ||||||
| CONFIG_ARM64_VHE=y | CONFIG_ARM64_VHE=y | ||||||
|  | CONFIG_ARM64_UAO=y | ||||||
|  | 
 | ||||||
|  | # Have ARM team revisit | ||||||
|  | # CONFIG_RELOCATABLE is not set | ||||||
|  | # CONFIG_RANDOMIZE_BASE is not set | ||||||
|  | 
 | ||||||
|  | CONFIG_ARM64_ACPI_PARKING_PROTOCOL=y | ||||||
| 
 | 
 | ||||||
| CONFIG_BCMA_POSSIBLE=y | CONFIG_BCMA_POSSIBLE=y | ||||||
| CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||||||
|  | |||||||
| @ -2542,6 +2542,7 @@ CONFIG_TOUCHSCREEN_ZFORCE=m | |||||||
| # CONFIG_TOUCHSCREEN_FT6236 is not set | # CONFIG_TOUCHSCREEN_FT6236 is not set | ||||||
| # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set | # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set | ||||||
| # CONFIG_TOUCHSCREEN_TSC2004 is not set | # CONFIG_TOUCHSCREEN_TSC2004 is not set | ||||||
|  | # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set | ||||||
| 
 | 
 | ||||||
| CONFIG_INPUT_MISC=y | CONFIG_INPUT_MISC=y | ||||||
| CONFIG_INPUT_E3X0_BUTTON=m | CONFIG_INPUT_E3X0_BUTTON=m | ||||||
| @ -2566,6 +2567,13 @@ CONFIG_INPUT_MPU3050=m | |||||||
| CONFIG_INPUT_KXTJ9=m | CONFIG_INPUT_KXTJ9=m | ||||||
| # CONFIG_INPUT_KXTJ9_POLLED_MODE is not set | # CONFIG_INPUT_KXTJ9_POLLED_MODE is not set | ||||||
| 
 | 
 | ||||||
|  | CONFIG_RMI4_CORE=m | ||||||
|  | CONFIG_RMI4_I2C=m | ||||||
|  | CONFIG_RMI4_F11=y | ||||||
|  | CONFIG_RMI4_F12=y | ||||||
|  | CONFIG_RMI4_F30=y | ||||||
|  | CONFIG_RMI4_SPI=m | ||||||
|  | 
 | ||||||
| # | # | ||||||
| # Character devices | # Character devices | ||||||
| # | # | ||||||
| @ -4083,6 +4091,7 @@ CONFIG_HID_APPLEIR=m | |||||||
| CONFIG_HID_LENOVO=m | CONFIG_HID_LENOVO=m | ||||||
| CONFIG_HID_CORSAIR=m | CONFIG_HID_CORSAIR=m | ||||||
| CONFIG_HID_GFRM=m | CONFIG_HID_GFRM=m | ||||||
|  | CONFIG_HID_CMEDIA=m | ||||||
| 
 | 
 | ||||||
| # | # | ||||||
| # USB Imaging devices | # USB Imaging devices | ||||||
| @ -4432,6 +4441,8 @@ CONFIG_MFD_VIPERBOARD=m | |||||||
| # CONFIG_MFD_CROS_EC is not set | # CONFIG_MFD_CROS_EC is not set | ||||||
| # CONFIG_MFD_SI476X_CORE is not set | # CONFIG_MFD_SI476X_CORE is not set | ||||||
| # CONFIG_MFD_TPS65912 is not set | # CONFIG_MFD_TPS65912 is not set | ||||||
|  | # CONFIG_MFD_TPS65912_SPI is not set | ||||||
|  | # CONFIG_MFD_TPS65912_I2C is not set | ||||||
| # CONFIG_MFD_SYSCON is not set | # CONFIG_MFD_SYSCON is not set | ||||||
| # CONFIG_MFD_DA9063 is not set | # CONFIG_MFD_DA9063 is not set | ||||||
| # CONFIG_MFD_DLN2 is not set | # CONFIG_MFD_DLN2 is not set | ||||||
| @ -4441,7 +4452,6 @@ CONFIG_MFD_VIPERBOARD=m | |||||||
| # CONFIG_MFD_TPS65218 is not set | # CONFIG_MFD_TPS65218 is not set | ||||||
| # CONFIG_MFD_WM831X_SPI is not set | # CONFIG_MFD_WM831X_SPI is not set | ||||||
| # CONFIG_MFD_ARIZONA_SPI is not set | # CONFIG_MFD_ARIZONA_SPI is not set | ||||||
| # CONFIG_MFD_TPS65912_SPI is not set |  | ||||||
| # CONFIG_MFD_MC13XXX_SPI is not set | # CONFIG_MFD_MC13XXX_SPI is not set | ||||||
| # CONFIG_MFD_DA9052_SPI is not set | # CONFIG_MFD_DA9052_SPI is not set | ||||||
| # CONFIG_MFD_MENF21BMC is not set | # CONFIG_MFD_MENF21BMC is not set | ||||||
| @ -5768,6 +5778,13 @@ CONFIG_GPIO_VIPERBOARD=m | |||||||
| # CONFIG_GPIO_AMDPT is not set | # CONFIG_GPIO_AMDPT is not set | ||||||
| # CONFIG_GPIO_104_IDIO_16 is not set | # CONFIG_GPIO_104_IDIO_16 is not set | ||||||
| # CONFIG_GPIO_IT87 is not set | # CONFIG_GPIO_IT87 is not set | ||||||
|  | # CONFIG_GPIO_TPIC2810 is not set | ||||||
|  | # CONFIG_GPIO_MPC8XXX is not set | ||||||
|  | # CONFIG_GPIO_PISOSR is not set | ||||||
|  | # CONFIG_GPIO_TS4800 is not set | ||||||
|  | # CONFIG_GPIO_TPS65218 is not set | ||||||
|  | # CONFIG_GPIO_104_DIO_48E is not set | ||||||
|  | # CONFIG_GPIO_WS16C48 is not set | ||||||
| 
 | 
 | ||||||
| # FIXME: Why? | # FIXME: Why? | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								gitrev
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gitrev
									
									
									
									
									
								
							| @ -1 +1 @@ | |||||||
| 5cd0911a9e0e408f28079a5e36a981217bf47520 | 10fdfee7f7fd8d4a6a8455ac4c9fbbc51d79b9f7 | ||||||
|  | |||||||
							
								
								
									
										241
									
								
								intel_pstate-Do-not-call-wrmsrl_on_cpu-with-disabled.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								intel_pstate-Do-not-call-wrmsrl_on_cpu-with-disabled.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,241 @@ | |||||||
|  | From c517e903c4dbc9271b3cfb43b27d303dd6f03cd7 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> | ||||||
|  | Date: Fri, 18 Mar 2016 15:36:25 +0100 | ||||||
|  | Subject: [PATCH] intel_pstate: Do not call wrmsrl_on_cpu() with disabled | ||||||
|  |  interrupts | ||||||
|  | 
 | ||||||
|  | After commit a4675fbc4a7a (cpufreq: intel_pstate: Replace timers with | ||||||
|  | utilization update callbacks) wrmsrl_on_cpu() cannot be called in the | ||||||
|  | intel_pstate_adjust_busy_pstate() path as that is executed with | ||||||
|  | disabled interrupts.  However, atom_set_pstate() called from there | ||||||
|  | via intel_pstate_set_pstate() uses wrmsrl_on_cpu() to update the | ||||||
|  | IA32_PERF_CTL MSR which triggers the WARN_ON_ONCE() in | ||||||
|  | smp_call_function_single(). | ||||||
|  | 
 | ||||||
|  | The reason why wrmsrl_on_cpu() is used by atom_set_pstate() is | ||||||
|  | because intel_pstate_set_pstate() calling it is also invoked during | ||||||
|  | the initialization and cleanup of the driver and in those cases it is | ||||||
|  | not guaranteed to be run on the CPU that is being updated.  However, | ||||||
|  | in the case when intel_pstate_set_pstate() is called by | ||||||
|  | intel_pstate_adjust_busy_pstate(), wrmsrl() can be used to update | ||||||
|  | the register safely.  Moreover, intel_pstate_set_pstate() already | ||||||
|  | contains code that only is executed if the function is called by | ||||||
|  | intel_pstate_adjust_busy_pstate() and there is a special argument | ||||||
|  | passed to it because of that. | ||||||
|  | 
 | ||||||
|  | To fix the problem at hand, rearrange the code taking the above | ||||||
|  | observations into account. | ||||||
|  | 
 | ||||||
|  | First, replace the ->set() callback in struct pstate_funcs with a | ||||||
|  | ->get_val() one that will return the value to be written to the
 | ||||||
|  | IA32_PERF_CTL MSR without updating the register. | ||||||
|  | 
 | ||||||
|  | Second, split intel_pstate_set_pstate() into two functions, | ||||||
|  | intel_pstate_update_pstate() to be called by | ||||||
|  | intel_pstate_adjust_busy_pstate() that will contain all of the | ||||||
|  | intel_pstate_set_pstate() code which only needs to be executed in | ||||||
|  | that case and will use wrmsrl() to update the MSR (after obtaining | ||||||
|  | the value to write to it from the ->get_val() callback), and | ||||||
|  | intel_pstate_set_min_pstate() to be invoked during the | ||||||
|  | initialization and cleanup that will set the P-state to the | ||||||
|  | minimum one and will update the MSR using wrmsrl_on_cpu(). | ||||||
|  | 
 | ||||||
|  | Finally, move the code shared between intel_pstate_update_pstate() | ||||||
|  | and intel_pstate_set_min_pstate() to a new static inline function | ||||||
|  | intel_pstate_record_pstate() and make them both call it. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||||||
|  | Fixes: a4675fbc4a7a (cpufreq: intel_pstate: Replace timers with utilization update callbacks) | ||||||
|  | ---
 | ||||||
|  |  drivers/cpufreq/intel_pstate.c | 73 +++++++++++++++++++++++++----------------- | ||||||
|  |  1 file changed, 43 insertions(+), 30 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
 | ||||||
|  | index cb5607495816..4b644526fd59 100644
 | ||||||
|  | --- a/drivers/cpufreq/intel_pstate.c
 | ||||||
|  | +++ b/drivers/cpufreq/intel_pstate.c
 | ||||||
|  | @@ -134,7 +134,7 @@ struct pstate_funcs {
 | ||||||
|  |  	int (*get_min)(void); | ||||||
|  |  	int (*get_turbo)(void); | ||||||
|  |  	int (*get_scaling)(void); | ||||||
|  | -	void (*set)(struct cpudata*, int pstate);
 | ||||||
|  | +	u64 (*get_val)(struct cpudata*, int pstate);
 | ||||||
|  |  	void (*get_vid)(struct cpudata *); | ||||||
|  |  	int32_t (*get_target_pstate)(struct cpudata *); | ||||||
|  |  }; | ||||||
|  | @@ -565,7 +565,7 @@ static int atom_get_turbo_pstate(void)
 | ||||||
|  |  	return value & 0x7F; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static void atom_set_pstate(struct cpudata *cpudata, int pstate)
 | ||||||
|  | +static u64 atom_get_val(struct cpudata *cpudata, int pstate)
 | ||||||
|  |  { | ||||||
|  |  	u64 val; | ||||||
|  |  	int32_t vid_fp; | ||||||
|  | @@ -585,9 +585,7 @@ static void atom_set_pstate(struct cpudata *cpudata, int pstate)
 | ||||||
|  |  	if (pstate > cpudata->pstate.max_pstate) | ||||||
|  |  		vid = cpudata->vid.turbo; | ||||||
|  |   | ||||||
|  | -	val |= vid;
 | ||||||
|  | -
 | ||||||
|  | -	wrmsrl_on_cpu(cpudata->cpu, MSR_IA32_PERF_CTL, val);
 | ||||||
|  | +	return val | vid;
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static int silvermont_get_scaling(void) | ||||||
|  | @@ -711,7 +709,7 @@ static inline int core_get_scaling(void)
 | ||||||
|  |  	return 100000; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static void core_set_pstate(struct cpudata *cpudata, int pstate)
 | ||||||
|  | +static u64 core_get_val(struct cpudata *cpudata, int pstate)
 | ||||||
|  |  { | ||||||
|  |  	u64 val; | ||||||
|  |   | ||||||
|  | @@ -719,7 +717,7 @@ static void core_set_pstate(struct cpudata *cpudata, int pstate)
 | ||||||
|  |  	if (limits->no_turbo && !limits->turbo_disabled) | ||||||
|  |  		val |= (u64)1 << 32; | ||||||
|  |   | ||||||
|  | -	wrmsrl(MSR_IA32_PERF_CTL, val);
 | ||||||
|  | +	return val;
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static int knl_get_turbo_pstate(void) | ||||||
|  | @@ -750,7 +748,7 @@ static struct cpu_defaults core_params = {
 | ||||||
|  |  		.get_min = core_get_min_pstate, | ||||||
|  |  		.get_turbo = core_get_turbo_pstate, | ||||||
|  |  		.get_scaling = core_get_scaling, | ||||||
|  | -		.set = core_set_pstate,
 | ||||||
|  | +		.get_val = core_get_val,
 | ||||||
|  |  		.get_target_pstate = get_target_pstate_use_performance, | ||||||
|  |  	}, | ||||||
|  |  }; | ||||||
|  | @@ -769,7 +767,7 @@ static struct cpu_defaults silvermont_params = {
 | ||||||
|  |  		.get_max_physical = atom_get_max_pstate, | ||||||
|  |  		.get_min = atom_get_min_pstate, | ||||||
|  |  		.get_turbo = atom_get_turbo_pstate, | ||||||
|  | -		.set = atom_set_pstate,
 | ||||||
|  | +		.get_val = atom_get_val,
 | ||||||
|  |  		.get_scaling = silvermont_get_scaling, | ||||||
|  |  		.get_vid = atom_get_vid, | ||||||
|  |  		.get_target_pstate = get_target_pstate_use_cpu_load, | ||||||
|  | @@ -790,7 +788,7 @@ static struct cpu_defaults airmont_params = {
 | ||||||
|  |  		.get_max_physical = atom_get_max_pstate, | ||||||
|  |  		.get_min = atom_get_min_pstate, | ||||||
|  |  		.get_turbo = atom_get_turbo_pstate, | ||||||
|  | -		.set = atom_set_pstate,
 | ||||||
|  | +		.get_val = atom_get_val,
 | ||||||
|  |  		.get_scaling = airmont_get_scaling, | ||||||
|  |  		.get_vid = atom_get_vid, | ||||||
|  |  		.get_target_pstate = get_target_pstate_use_cpu_load, | ||||||
|  | @@ -812,7 +810,7 @@ static struct cpu_defaults knl_params = {
 | ||||||
|  |  		.get_min = core_get_min_pstate, | ||||||
|  |  		.get_turbo = knl_get_turbo_pstate, | ||||||
|  |  		.get_scaling = core_get_scaling, | ||||||
|  | -		.set = core_set_pstate,
 | ||||||
|  | +		.get_val = core_get_val,
 | ||||||
|  |  		.get_target_pstate = get_target_pstate_use_performance, | ||||||
|  |  	}, | ||||||
|  |  }; | ||||||
|  | @@ -839,25 +837,24 @@ static void intel_pstate_get_min_max(struct cpudata *cpu, int *min, int *max)
 | ||||||
|  |  	*min = clamp_t(int, min_perf, cpu->pstate.min_pstate, max_perf); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static void intel_pstate_set_pstate(struct cpudata *cpu, int pstate, bool force)
 | ||||||
|  | +static inline void intel_pstate_record_pstate(struct cpudata *cpu, int pstate)
 | ||||||
|  |  { | ||||||
|  | -	int max_perf, min_perf;
 | ||||||
|  | -
 | ||||||
|  | -	if (force) {
 | ||||||
|  | -		update_turbo_state();
 | ||||||
|  | -
 | ||||||
|  | -		intel_pstate_get_min_max(cpu, &min_perf, &max_perf);
 | ||||||
|  | -
 | ||||||
|  | -		pstate = clamp_t(int, pstate, min_perf, max_perf);
 | ||||||
|  | -
 | ||||||
|  | -		if (pstate == cpu->pstate.current_pstate)
 | ||||||
|  | -			return;
 | ||||||
|  | -	}
 | ||||||
|  |  	trace_cpu_frequency(pstate * cpu->pstate.scaling, cpu->cpu); | ||||||
|  | -
 | ||||||
|  |  	cpu->pstate.current_pstate = pstate; | ||||||
|  | +}
 | ||||||
|  |   | ||||||
|  | -	pstate_funcs.set(cpu, pstate);
 | ||||||
|  | +static void intel_pstate_set_min_pstate(struct cpudata *cpu)
 | ||||||
|  | +{
 | ||||||
|  | +	int pstate = cpu->pstate.min_pstate;
 | ||||||
|  | +
 | ||||||
|  | +	intel_pstate_record_pstate(cpu, pstate);
 | ||||||
|  | +	/*
 | ||||||
|  | +	 * Generally, there is no guarantee that this code will always run on
 | ||||||
|  | +	 * the CPU being updated, so force the register update to run on the
 | ||||||
|  | +	 * right CPU.
 | ||||||
|  | +	 */
 | ||||||
|  | +	wrmsrl_on_cpu(cpu->cpu, MSR_IA32_PERF_CTL,
 | ||||||
|  | +		      pstate_funcs.get_val(cpu, pstate));
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static void intel_pstate_get_cpu_pstates(struct cpudata *cpu) | ||||||
|  | @@ -870,7 +867,8 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
 | ||||||
|  |   | ||||||
|  |  	if (pstate_funcs.get_vid) | ||||||
|  |  		pstate_funcs.get_vid(cpu); | ||||||
|  | -	intel_pstate_set_pstate(cpu, cpu->pstate.min_pstate, false);
 | ||||||
|  | +
 | ||||||
|  | +	intel_pstate_set_min_pstate(cpu);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static inline void intel_pstate_calc_busy(struct cpudata *cpu) | ||||||
|  | @@ -997,6 +995,21 @@ static inline int32_t get_target_pstate_use_performance(struct cpudata *cpu)
 | ||||||
|  |  	return cpu->pstate.current_pstate - pid_calc(&cpu->pid, core_busy); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static inline void intel_pstate_update_pstate(struct cpudata *cpu, int pstate)
 | ||||||
|  | +{
 | ||||||
|  | +	int max_perf, min_perf;
 | ||||||
|  | +
 | ||||||
|  | +	update_turbo_state();
 | ||||||
|  | +
 | ||||||
|  | +	intel_pstate_get_min_max(cpu, &min_perf, &max_perf);
 | ||||||
|  | +	pstate = clamp_t(int, pstate, min_perf, max_perf);
 | ||||||
|  | +	if (pstate == cpu->pstate.current_pstate)
 | ||||||
|  | +		return;
 | ||||||
|  | +
 | ||||||
|  | +	intel_pstate_record_pstate(cpu, pstate);
 | ||||||
|  | +	wrmsrl(MSR_IA32_PERF_CTL, pstate_funcs.get_val(cpu, pstate));
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  static inline void intel_pstate_adjust_busy_pstate(struct cpudata *cpu) | ||||||
|  |  { | ||||||
|  |  	int from, target_pstate; | ||||||
|  | @@ -1006,7 +1019,7 @@ static inline void intel_pstate_adjust_busy_pstate(struct cpudata *cpu)
 | ||||||
|  |   | ||||||
|  |  	target_pstate = pstate_funcs.get_target_pstate(cpu); | ||||||
|  |   | ||||||
|  | -	intel_pstate_set_pstate(cpu, target_pstate, true);
 | ||||||
|  | +	intel_pstate_update_pstate(cpu, target_pstate);
 | ||||||
|  |   | ||||||
|  |  	sample = &cpu->sample; | ||||||
|  |  	trace_pstate_sample(fp_toint(sample->core_pct_busy), | ||||||
|  | @@ -1180,7 +1193,7 @@ static void intel_pstate_stop_cpu(struct cpufreq_policy *policy)
 | ||||||
|  |  	if (hwp_active) | ||||||
|  |  		return; | ||||||
|  |   | ||||||
|  | -	intel_pstate_set_pstate(cpu, cpu->pstate.min_pstate, false);
 | ||||||
|  | +	intel_pstate_set_min_pstate(cpu);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static int intel_pstate_cpu_init(struct cpufreq_policy *policy) | ||||||
|  | @@ -1255,7 +1268,7 @@ static void copy_cpu_funcs(struct pstate_funcs *funcs)
 | ||||||
|  |  	pstate_funcs.get_min   = funcs->get_min; | ||||||
|  |  	pstate_funcs.get_turbo = funcs->get_turbo; | ||||||
|  |  	pstate_funcs.get_scaling = funcs->get_scaling; | ||||||
|  | -	pstate_funcs.set       = funcs->set;
 | ||||||
|  | +	pstate_funcs.get_val   = funcs->get_val;
 | ||||||
|  |  	pstate_funcs.get_vid   = funcs->get_vid; | ||||||
|  |  	pstate_funcs.get_target_pstate = funcs->get_target_pstate; | ||||||
|  |   | ||||||
|  | -- 
 | ||||||
|  | 2.5.0 | ||||||
|  | 
 | ||||||
							
								
								
									
										14
									
								
								kernel.spec
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								kernel.spec
									
									
									
									
									
								
							| @ -69,7 +69,7 @@ Summary: The Linux kernel | |||||||
| # The rc snapshot level | # The rc snapshot level | ||||||
| %define rcrev 0 | %define rcrev 0 | ||||||
| # The git snapshot level | # The git snapshot level | ||||||
| %define gitrev 8 | %define gitrev 9 | ||||||
| # Set rpm version accordingly | # Set rpm version accordingly | ||||||
| %define rpmversion 4.%{upstream_sublevel}.0 | %define rpmversion 4.%{upstream_sublevel}.0 | ||||||
| %endif | %endif | ||||||
| @ -604,9 +604,6 @@ Patch621: drm-udl-Use-unlocked-gem-unreferencing.patch | |||||||
| #Required for some persistent memory options | #Required for some persistent memory options | ||||||
| Patch641: disable-CONFIG_EXPERT-for-ZONE_DMA.patch | Patch641: disable-CONFIG_EXPERT-for-ZONE_DMA.patch | ||||||
| 
 | 
 | ||||||
| #rhbz 1255325 |  | ||||||
| Patch646: HID-sony-do-not-bail-out-when-the-sixaxis-refuses-th.patch |  | ||||||
| 
 |  | ||||||
| #rhbz 1309658 | #rhbz 1309658 | ||||||
| Patch648: 0001-mm-CONFIG_NR_ZONES_EXTENDED.patch | Patch648: 0001-mm-CONFIG_NR_ZONES_EXTENDED.patch | ||||||
| 
 | 
 | ||||||
| @ -622,7 +619,7 @@ Patch665: netfilter-x_tables-deal-with-bogus-nextoffset-values.patch | |||||||
| #CVE-2016-3135 rhbz 1318172 1318270 | #CVE-2016-3135 rhbz 1318172 1318270 | ||||||
| Patch666: ipv4-Dont-do-expensive-useless-work-during-inetdev-des.patch | Patch666: ipv4-Dont-do-expensive-useless-work-during-inetdev-des.patch | ||||||
| 
 | 
 | ||||||
| Patch667: 0001-Temp-fix-for-intel_pstate-oopses-and-lockdep-report-.patch | Patch667: intel_pstate-Do-not-call-wrmsrl_on_cpu-with-disabled.patch | ||||||
| 
 | 
 | ||||||
| #rhbz 1318596 | #rhbz 1318596 | ||||||
| Patch668: x86-tsc-Prevent-NULL-pointer-deref-in-calibrate_dela.patch | Patch668: x86-tsc-Prevent-NULL-pointer-deref-in-calibrate_dela.patch | ||||||
| @ -634,9 +631,6 @@ Patch671: ALSA-usb-audio-Add-sanity-checks-for-endpoint-access.patch | |||||||
| #CVE-2016-3137 rhbz 1317010 1316996 | #CVE-2016-3137 rhbz 1317010 1316996 | ||||||
| Patch672: cypress_m8-add-sanity-checking.patch | Patch672: cypress_m8-add-sanity-checking.patch | ||||||
| 
 | 
 | ||||||
| #CVE-2016-2186 rhbz 1317015 1317464 |  | ||||||
| Patch673: USB-input-powermate-fix-oops-with-malicious-USB-desc.patch |  | ||||||
| 
 |  | ||||||
| #CVE-2016-2188 rhbz 1317018 1317467 | #CVE-2016-2188 rhbz 1317018 1317467 | ||||||
| Patch674: USB-iowarrior-fix-oops-with-malicious-USB-descriptor.patch | Patch674: USB-iowarrior-fix-oops-with-malicious-USB-descriptor.patch | ||||||
| 
 | 
 | ||||||
| @ -2172,6 +2166,10 @@ fi | |||||||
| # | # | ||||||
| #  | #  | ||||||
| %changelog | %changelog | ||||||
|  | * Fri Mar 18 2016 Josh Boyer <jwboyer@fedoraproject.org> - 4.6.0-0.rc0.git9.1 | ||||||
|  | - Linux v4.5-4071-g10fdfee7f7fd | ||||||
|  | - input, livepatching, trivial, hid, gpio, m68knommu, arm64, selftest merges | ||||||
|  | 
 | ||||||
| * Fri Mar 18 2016 Josh Boyer <jwboyer@fedoraproject.org> | * Fri Mar 18 2016 Josh Boyer <jwboyer@fedoraproject.org> | ||||||
| - ims-pcu: sanity checking on missing interfaces | - ims-pcu: sanity checking on missing interfaces | ||||||
| - CVE-2016-3140 digi_acceleport: oops on invalid USB descriptors (rhbz 1317010 1316995) | - CVE-2016-3140 digi_acceleport: oops on invalid USB descriptors (rhbz 1317010 1316995) | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								sources
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								sources
									
									
									
									
									
								
							| @ -1,3 +1,3 @@ | |||||||
| a60d48eee08ec0536d5efb17ca819aef  linux-4.5.tar.xz | a60d48eee08ec0536d5efb17ca819aef  linux-4.5.tar.xz | ||||||
| 6f557fe90b800b615c85c2ca04da6154  perf-man-4.5.tar.gz | 6f557fe90b800b615c85c2ca04da6154  perf-man-4.5.tar.gz | ||||||
| 2ec8a12d2908ee34366bc3314df03a04  patch-4.5-git8.xz | dba9097c028e0f4baf12f05d19f563c7  patch-4.5-git9.xz | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user