i8k: Don't revert affinity in i8k_smm

Con Kolivas kernel at kolivas.org
Mon Aug 18 23:19:55 UTC 2014


As a followup to this discussion:

On Tue, 15 Jul 2014 08:01:13 PM Sam Asadi wrote:
> Commit f36fdb9f0266 (i8k: Force SMM to run on CPU 0) adds support
> for multi-core CPUs to the driver. Unfortunately, that causes it
> to fail loading if compiled without SMP support, at least on
> 32 bit kernels. Kernel log shows "i8k: unable to get SMM Dell
> signature", and function i8k_smm is found to return -EINVAL.
> 
> Testing revealed that the culprit is the missing return value check
> of set_cpus_allowed_ptr.

It appears that the original commit f36fdb9f0266 changes the affinity for the 
duration of i8k_smm function and then unconditionally reverts the affinity to 
the old cpu mask regardless of whether the function succeeds or fails. As this 
must run on CPU 0 at all times it does not make sense to revert the affinity at 
the end of the function. Proposed patch attached.

Signed-off-by: Con Kolivas <kernel at kolivas.org>

---
 drivers/char/i8k.c |    6 ------
 1 file changed, 6 deletions(-)

Index: linux-3.16-ck1/drivers/char/i8k.c
===================================================================
--- linux-3.16-ck1.orig/drivers/char/i8k.c	2014-08-12 14:07:49.000000000 +1000
+++ linux-3.16-ck1/drivers/char/i8k.c	2014-08-19 09:09:57.939056696 +1000
@@ -132,12 +132,8 @@ static int i8k_smm(struct smm_regs *regs
 {
 	int rc;
 	int eax = regs->eax;
-	cpumask_var_t old_mask;
 
 	/* SMM requires CPU 0 */
-	if (!alloc_cpumask_var(&old_mask, GFP_KERNEL))
-		return -ENOMEM;
-	cpumask_copy(old_mask, &current->cpus_allowed);
 	rc = set_cpus_allowed_ptr(current, cpumask_of(0));
 	if (rc)
 		goto out;
@@ -203,8 +199,6 @@ static int i8k_smm(struct smm_regs *regs
 		rc = -EINVAL;
 
 out:
-	set_cpus_allowed_ptr(current, old_mask);
-	free_cpumask_var(old_mask);
 	return rc;
 }
 

-- 
-ck


More information about the devel mailing list