From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754250AbYHMVWn (ORCPT ); Wed, 13 Aug 2008 17:22:43 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752424AbYHMVWe (ORCPT ); Wed, 13 Aug 2008 17:22:34 -0400 Received: from mx1.redhat.com ([66.187.233.31]:34989 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751880AbYHMVWe (ORCPT ); Wed, 13 Aug 2008 17:22:34 -0400 Date: Wed, 13 Aug 2008 17:21:47 -0400 From: Vivek Goyal To: Andrew Morton Cc: Linus Torvalds , ebiederm@xmission.com, ying.huang@intel.com, pavel@ucw.cz, nigel@nigel.suspend2.net, rjw@sisk.pl, mingo@elte.hu, linux-kernel@vger.kernel.org, kexec@lists.infradead.org Subject: Re: [PATCH] kexec jump: fix compiling warning on xchg(&kexec_lock, 0) in kernel_kexec() Message-ID: <20080813212147.GF20974@redhat.com> References: <1218618760.24951.137.camel@caritas-dev.intel.com> <20080813124406.21091eae.akpm@linux-foundation.org> <20080813130749.c406ab6c.akpm@linux-foundation.org> <20080813132535.6cd4bab6.akpm@linux-foundation.org> <20080813134118.e1ab1292.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080813134118.e1ab1292.akpm@linux-foundation.org> User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Aug 13, 2008 at 01:41:18PM -0700, Andrew Morton wrote: > On Wed, 13 Aug 2008 13:31:24 -0700 (PDT) > Linus Torvalds wrote: > > > On Wed, 13 Aug 2008, Andrew Morton wrote: > > > > > > #2: > > > > I thought you said there were things that want to sleep in the region? > > be reasonable - that was over five minutes ago. > > --- a/kernel/kexec.c~kexec-use-a-bitop-for-locking-rather-than-xchg > +++ a/kernel/kexec.c > @@ -12,7 +12,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > #include > @@ -924,19 +924,14 @@ static int kimage_load_segment(struct ki > */ > struct kimage *kexec_image; > struct kimage *kexec_crash_image; > -/* > - * A home grown binary mutex. > - * Nothing can wait so this mutex is safe to use > - * in interrupt context :) > - */ > -static int kexec_lock; > + > +static DEFINE_MUTEX(kexec_mutex); > > asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, > struct kexec_segment __user *segments, > unsigned long flags) > { > struct kimage **dest_image, *image; > - int locked; > int result; > > /* We only trust the superuser with rebooting the system. */ > @@ -972,8 +967,7 @@ asmlinkage long sys_kexec_load(unsigned > * > * KISS: always take the mutex. > */ > - locked = xchg(&kexec_lock, 1); > - if (locked) > + if (!mutex_trylock(&kexec_mutex)) > return -EBUSY; > > dest_image = &kexec_image; > @@ -1015,8 +1009,7 @@ asmlinkage long sys_kexec_load(unsigned > image = xchg(dest_image, image); > > out: > - locked = xchg(&kexec_lock, 0); /* Release the mutex */ > - BUG_ON(!locked); > + mutex_unlock(&kexec_mutex); > kimage_free(image); > > return result; > @@ -1063,10 +1056,7 @@ asmlinkage long compat_sys_kexec_load(un > > void crash_kexec(struct pt_regs *regs) > { > - int locked; > - > - > - /* Take the kexec_lock here to prevent sys_kexec_load > + /* Take the kexec_mutex here to prevent sys_kexec_load > * running on one cpu from replacing the crash kernel > * we are using after a panic on a different cpu. > * > @@ -1074,8 +1064,7 @@ void crash_kexec(struct pt_regs *regs) > * of memory the xchg(&kexec_crash_image) would be > * sufficient. But since I reuse the memory... > */ > - locked = xchg(&kexec_lock, 1); > - if (!locked) { > + if (mutex_trylock(&kexec_mutex)) { > if (kexec_crash_image) { > struct pt_regs fixed_regs; > crash_setup_regs(&fixed_regs, regs); > @@ -1083,8 +1072,7 @@ void crash_kexec(struct pt_regs *regs) > machine_crash_shutdown(&fixed_regs); > machine_kexec(kexec_crash_image); > } > - locked = xchg(&kexec_lock, 0); > - BUG_ON(!locked); > + mutex_unlock(&kexec_mutex); > } > } > > @@ -1434,7 +1422,7 @@ int kernel_kexec(void) > { > int error = 0; > > - if (xchg(&kexec_lock, 1)) > + if (!mutex_trylock(&kexec_mutex)) > return -EBUSY; > if (!kexec_image) { > error = -EINVAL; > @@ -1498,8 +1486,6 @@ int kernel_kexec(void) > #endif > > Unlock: > - if (!xchg(&kexec_lock, 0)) > - BUG(); > - > + mutex_unlock(&kexec_mutex); > return error; > } I tested kexec and kudmp on 2.6.27-rc3 with this patch. Works for me on a 32 bit machine. Thanks Vivek