From patchwork Fri Jul 2 17:12:52 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Williamson X-Patchwork-Id: 57717 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 641851007DA for ; Sat, 3 Jul 2010 04:01:10 +1000 (EST) Received: from localhost ([127.0.0.1]:33695 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OUk56-0003Dk-1M for incoming@patchwork.ozlabs.org; Fri, 02 Jul 2010 13:31:16 -0400 Received: from [140.186.70.92] (port=42921 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OUjnO-0003YY-9c for qemu-devel@nongnu.org; Fri, 02 Jul 2010 13:12:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OUjnM-0007Nj-CR for qemu-devel@nongnu.org; Fri, 02 Jul 2010 13:12:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:64595) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OUjnM-0007NQ-5P for qemu-devel@nongnu.org; Fri, 02 Jul 2010 13:12:56 -0400 Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o62HCsDX027708 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 2 Jul 2010 13:12:54 -0400 Received: from localhost.localdomain (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o62HCqTJ000408; Fri, 2 Jul 2010 13:12:53 -0400 From: Alex Williamson To: qemu-devel@nongnu.org Date: Fri, 02 Jul 2010 11:12:52 -0600 Message-ID: <20100702171252.30243.29653.stgit@localhost.localdomain> In-Reply-To: <20100702171054.30243.19599.stgit@localhost.localdomain> References: <20100702171054.30243.19599.stgit@localhost.localdomain> User-Agent: StGIT/0.14.3 MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.67 on 10.5.11.17 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Cc: alex.williamson@redhat.com Subject: [Qemu-devel] [PATCH v3 10/16] ramblocks: Make use of DeviceState pointer and BusInfo.get_dev_path X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org With these two pieces in place, we can start naming ramblocks. When the device is present and it lives on a bus that provides a device path, we concatenate the path and the provided name. Otherwise we just use name. The resulting id string must be unique. For now we assume an allocation for the same name and size is a device that has been removed and reinserted and return the same block. This will go away once qemu_ram_free() is implemented. Signed-off-by: Alex Williamson --- cpu-all.h | 1 + exec.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/cpu-all.h b/cpu-all.h index dbb2139..5d8342b 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -865,6 +865,7 @@ typedef struct RAMBlock { uint8_t *host; ram_addr_t offset; ram_addr_t length; + char idstr[256]; QLIST_ENTRY(RAMBlock) next; } RAMBlock; diff --git a/exec.c b/exec.c index 164ba16..fd47d5b 100644 --- a/exec.c +++ b/exec.c @@ -36,6 +36,7 @@ #include "qemu-common.h" #include "tcg.h" #include "hw/hw.h" +#include "hw/qdev.h" #include "osdep.h" #include "kvm.h" #include "qemu-timer.h" @@ -2780,10 +2781,34 @@ static ram_addr_t find_ram_offset(ram_addr_t size) ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size) { - RAMBlock *new_block; + RAMBlock *new_block, *block; size = TARGET_PAGE_ALIGN(size); - new_block = qemu_malloc(sizeof(*new_block)); + new_block = qemu_mallocz(sizeof(*new_block)); + + if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) { + char *id = dev->parent_bus->info->get_dev_path(dev); + if (id) { + snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id); + qemu_free(id); + } + } + pstrcat(new_block->idstr, sizeof(new_block->idstr), name); + + QLIST_FOREACH(block, &ram_list.blocks, next) { + if (!strcmp(block->idstr, new_block->idstr)) { + if (block->length == new_block->length) { + fprintf(stderr, "RAMBlock \"%s\" exists, assuming lack of" + "free.\n", new_block->idstr); + qemu_free(new_block); + return block->offset; + } else { + fprintf(stderr, "RAMBlock \"%s\" already registered with" + "different size, abort\n", new_block->idstr); + abort(); + } + } + } if (mem_path) { #if defined (__linux__) && !defined(TARGET_S390X)