From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: KVM: pvmmu breakage with gcc 4.3.0 Date: Thu, 26 Jun 2008 07:47:30 -0500 Message-ID: <48638FE2.1020005@codemonkey.ws> References: <20080626021047.GA10263@dmt.cnet> <486380DB.9070905@qumranet.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , Anthony Liguori , Alexandre Oliva , kvm-devel To: Avi Kivity Return-path: Received: from an-out-0708.google.com ([209.85.132.244]:40738 "EHLO an-out-0708.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753785AbYFZMrw (ORCPT ); Thu, 26 Jun 2008 08:47:52 -0400 Received: by an-out-0708.google.com with SMTP id d40so1090and.103 for ; Thu, 26 Jun 2008 05:47:52 -0700 (PDT) In-Reply-To: <486380DB.9070905@qumranet.com> Sender: kvm-owner@vger.kernel.org List-ID: Avi Kivity wrote: > Marcelo Tosatti wrote: >> Some pvmmu functions store their commands on stack, and newer GCC >> versions conclude that these commands are unused. >> >> So stick an inline asm statement to convince the compiler otherwise. >> >> Signed-off-by: Marcelo Tosatti >> >> >> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c >> index 8b7a3cf..c892752 100644 >> --- a/arch/x86/kernel/kvm.c >> +++ b/arch/x86/kernel/kvm.c >> @@ -55,6 +55,12 @@ static void kvm_mmu_op(void *buffer, unsigned len) >> int r; >> unsigned long a1, a2; >> >> + /* >> + * GCC 4.3.0 concludes that on-stack kvm_mmu_op* is unused and >> + * optimizes its initialization away. >> + */ >> + asm ("" : : "p" (buffer)); >> + >> > > I don't think "p" should force the contents into memory? Perhaps > "m"(*(char *)buffer)? > > Anthony, I don't see why a memory clobber would tell gcc that the > variables is actually used. It doesn't, but it seems to me that it should force GCC to assume everything is live. It's a big stick to hit the problem with but it seems like the right thing semantically. > The problem is with the void * -> unsigned long cast (__pa), once > that happens gcc loses track. It's probably needed anyway since > hypercalls _do_ clobber memory. Right, it's not telling GCC that we touch a particular variable, but rather that we may have touched any variable. Regards, Anthony Liguori