From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932560Ab2GFJw6 (ORCPT ); Fri, 6 Jul 2012 05:52:58 -0400 Received: from e23smtp03.au.ibm.com ([202.81.31.145]:50710 "EHLO e23smtp03.au.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932264Ab2GFJw4 (ORCPT ); Fri, 6 Jul 2012 05:52:56 -0400 Message-ID: <4FF6B537.1030703@linux.vnet.ibm.com> Date: Fri, 06 Jul 2012 15:21:51 +0530 From: "Srivatsa S. Bhat" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120605 Thunderbird/13.0 MIME-Version: 1.0 To: Yasuaki Ishimatsu CC: linux-acpi@vger.kernel.org, lenb@kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/2] acpi : cpu hot-remove returns error number when cpu_down() fails References: <4FF65898.3000301@jp.fujitsu.com> In-Reply-To: <4FF65898.3000301@jp.fujitsu.com> Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit x-cbid: 12070523-6102-0000-0000-000001D5C187 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07/06/2012 08:46 AM, Yasuaki Ishimatsu wrote: > Even if cpu_down() fails, acpi_processor_remove() continues to remove the cpu. Ouch! > But in this case, it should return error number since some process may run on > the cpu. If the cpu has a running process and the cpu is turned the power off, > the system cannot work well. > > Signed-off-by: Yasuaki Ishimatsu > > --- > drivers/acpi/processor_driver.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > Index: linux-3.5-rc4/drivers/acpi/processor_driver.c > =================================================================== > --- linux-3.5-rc4.orig/drivers/acpi/processor_driver.c 2012-06-25 04:53:04.000000000 +0900 > +++ linux-3.5-rc4/drivers/acpi/processor_driver.c 2012-07-05 21:02:58.711285382 +0900 > @@ -610,7 +610,7 @@ err_free_pr: > static int acpi_processor_remove(struct acpi_device *device, int type) > { > struct acpi_processor *pr = NULL; > - > + int ret; > > if (!device || !acpi_driver_data(device)) > return -EINVAL; > @@ -621,8 +621,9 @@ static int acpi_processor_remove(struct > goto free; > > if (type == ACPI_BUS_REMOVAL_EJECT) { > - if (acpi_processor_handle_eject(pr)) > - return -EINVAL; > + ret = acpi_processor_handle_eject(pr); > + if (ret) > + return ret; > } > > acpi_processor_power_exit(pr, device); > @@ -841,12 +842,17 @@ static acpi_status acpi_processor_hotadd > > static int acpi_processor_handle_eject(struct acpi_processor *pr) > { > - if (cpu_online(pr->id)) > - cpu_down(pr->id); > + int ret; > + > + if (cpu_online(pr->id)) { > + ret = cpu_down(pr->id); > + if (ret) > + return ret; > + } > Strictly speaking, this is not thorough enough. What prevents someone from onlining that same cpu again, at this point? So, IMHO, you need to wrap the contents of this function inside a get_online_cpus()/put_online_cpus() block, to prevent anyone else from messing with CPU hotplug at the same time. Regards, Srivatsa S. Bhat > arch_unregister_cpu(pr->id); > acpi_unmap_lsapic(pr->id); > - return (0); > + return ret; > } > #else > static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr) >