From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:43164) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TSlrD-0002bS-Tx for qemu-devel@nongnu.org; Mon, 29 Oct 2012 05:42:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TSlr8-0002lz-49 for qemu-devel@nongnu.org; Mon, 29 Oct 2012 05:42:07 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57807) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TSlr7-0002lu-QZ for qemu-devel@nongnu.org; Mon, 29 Oct 2012 05:42:02 -0400 Message-ID: <508E4F61.7070103@redhat.com> Date: Mon, 29 Oct 2012 11:41:53 +0200 From: Avi Kivity MIME-Version: 1.0 References: <1351468127-15025-1-git-send-email-pingfank@linux.vnet.ibm.com> <1351468127-15025-7-git-send-email-pingfank@linux.vnet.ibm.com> In-Reply-To: <1351468127-15025-7-git-send-email-pingfank@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [patch v5 6/8] memory: make mmio dispatch able to be out of biglock List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Liu Ping Fan Cc: Peter Maydell , Stefan Hajnoczi , Marcelo Tosatti , qemu-devel@nongnu.org, Anthony Liguori , Jan Kiszka , Paolo Bonzini On 10/29/2012 01:48 AM, Liu Ping Fan wrote: > Without biglock, we try to protect the mr by increase refcnt. > If we can inc refcnt, go backward and resort to biglock. > > Another point is memory radix-tree can be flushed by another > thread, so we should get the copy of terminal mr to survive > from such issue. > > +static bool memory_region_section_ref(MemoryRegionSection *mrs) > +{ > + MemoryRegion *mr; > + bool ret = false; > + > + mr = mrs->mr; > + if (mr->ops && mr->ops->ref) { > + ret = mr->ops->ref(mr); I still don't see why ->ref() needs to return something. > + } > + return ret; > +} > + > > while (len > 0) { > page = addr & TARGET_PAGE_MASK; > l = (page + TARGET_PAGE_SIZE) - addr; > if (l > len) > l = len; > - section = phys_page_find(d, page >> TARGET_PAGE_BITS); > + > + if (as->lock) { > + qemu_mutex_lock(as->lock); > + safe_ref = memory_region_section_lookup_ref(d, page, &obj_mrs); > + qemu_mutex_unlock(as->lock); > + if (!safe_ref) { > + qemu_mutex_lock_iothread(); > + qemu_mutex_lock(as->lock); > + /* when 2nd try, mem map can change, need to judge it again */ > + safe_ref = memory_region_section_lookup_ref(d, page, &obj_mrs); > + qemu_mutex_unlock(as->lock); > + if (safe_ref) { > + qemu_mutex_unlock_iothread(); > + } > + } > + } else { > + /* Caller hold the big lock */ > + memory_region_section_lookup_ref(d, page, &obj_mrs); It's not a property of the address space, it's a property of the caller. > + } > + section = &obj_mrs; > > if (is_write) { > if (!memory_region_is_ram(section->mr)) { -- error compiling committee.c: too many arguments to function