From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39923) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ws82T-0002sM-BN for qemu-devel@nongnu.org; Wed, 04 Jun 2014 06:03:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ws82L-0000Q1-Ra for qemu-devel@nongnu.org; Wed, 04 Jun 2014 06:03:21 -0400 Date: Wed, 4 Jun 2014 11:01:49 +0100 From: "Dr. David Alan Gilbert" Message-ID: <20140604100148.GC2618@work-vm> References: <538C6F98.5070005@gmail.com> <538D79D4.5000900@huawei.com> <538DD187.5050400@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <538DD187.5050400@gmail.com> Subject: Re: [Qemu-devel] [PATCH-trivial] arch_init.c: Always be sure that 'encoded_buf' and 'current_buf' are lock protected List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Chen Gang Cc: ChenLiang , quintela@redhat.com, QEMU Trivial , Michael Tokarev , QEMU Developers , arei.gonglei@huawei.com * Chen Gang (gang.chen.5i5j@gmail.com) wrote: > > Firstly, thank you very much for reviewing the related 2 patches. > > On 06/03/2014 03:31 PM, ChenLiang wrote: > > On 2014/6/2 20:35, Chen Gang wrote: > > > >> 'encoded_buf' and 'current_buf' are lock protected during using in > >> save_xbzrle_page() in ram_save_page(), and during freeing in > >> migration_end(). > >> > >> So recommend to let them lock protected during starting, just like we > >> have done to 'cache'. This isn't one for Trivial - it needs some thought. Locks always need thought. > >> Signed-off-by: Chen Gang > >> --- > >> arch_init.c | 4 +++- > >> 1 file changed, 3 insertions(+), 1 deletion(-) > >> > >> diff --git a/arch_init.c b/arch_init.c > >> index 23044c1..784922c 100644 > >> --- a/arch_init.c > >> +++ b/arch_init.c > >> @@ -783,12 +783,12 @@ static int ram_save_setup(QEMUFile *f, void *opaque) > >> error_report("Error creating cache"); > >> return -1; > >> } > >> - XBZRLE_cache_unlock(); > >> > >> /* We prefer not to abort if there is no memory */ > >> XBZRLE.encoded_buf = g_try_malloc0(TARGET_PAGE_SIZE); > >> if (!XBZRLE.encoded_buf) { > >> error_report("Error allocating encoded_buf"); > >> + XBZRLE_cache_unlock(); > >> return -1; > >> } > >> > >> @@ -797,8 +797,10 @@ static int ram_save_setup(QEMUFile *f, void *opaque) > >> error_report("Error allocating current_buf"); > >> g_free(XBZRLE.encoded_buf); > >> XBZRLE.encoded_buf = NULL; > >> + XBZRLE_cache_unlock(); > >> return -1; > >> } > >> + XBZRLE_cache_unlock(); > >> > >> acct_clear(); > >> } > > > > > > It isn't necessary. > > > > For me, it is still necessary to be improved. > > - If this code is not performance sensitive: > > "always lock protected" will let source code easy understanding for > readers, and easy sustainable for maintainers. > > - Else (performance sensitive): > > Need give related comments to it (e.g. for performance reason, let it > out of lock protected). So readers easily understand, and the related > maintainers may notice about it at any time. > > It is not good to give comments in a function, except the code is > not used in normal way. I think the locks for the cache were originally there to handle the race between a resize (on the main thread) against the use (in the migration thread). That doesn't happen for the encoded_buf so I don't think we have that problem. Is there any other case that it could race? I can't see one - I think all of the other start/end is done within the migration thread. Dave > > > Thanks. > -- > Chen Gang > > Open, share, and attitude like air, water, and life which God blessed > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK