From patchwork Mon Feb 1 07:42:21 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Corneliu ZUZU X-Patchwork-Id: 8176441 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id E0939BEEE5 for ; Mon, 1 Feb 2016 07:45:47 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 9F4E42041E for ; Mon, 1 Feb 2016 07:45:46 +0000 (UTC) Received: from lists.xen.org (lists.xenproject.org [50.57.142.19]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 49598203E9 for ; Mon, 1 Feb 2016 07:45:45 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aQ986-0000Aq-GH; Mon, 01 Feb 2016 07:42:34 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aQ984-0000Al-VH for xen-devel@lists.xen.org; Mon, 01 Feb 2016 07:42:33 +0000 Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id 23/18-29478-86C0FA65; Mon, 01 Feb 2016 07:42:32 +0000 X-Env-Sender: czuzu@bitdefender.com X-Msg-Ref: server-12.tower-206.messagelabs.com!1454312548!19378710!1 X-Originating-IP: [91.199.104.161] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 7.35.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 60047 invoked from network); 1 Feb 2016 07:42:31 -0000 Received: from mx01.buh.bitdefender.com (HELO mx01.buh.bitdefender.com) (91.199.104.161) by server-12.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 1 Feb 2016 07:42:31 -0000 Comment: DomainKeys? See http://domainkeys.sourceforge.net/ DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=bitdefender.com; b=MmAbEUYzXUG2mm1xsV71SWxHvPgTSkR322cYK+k+L/dySOpIaPn+nKgrvBT7/v57V0xQy1nIzrFu7bJIn6FeW49pP1G1yAkpMNOjkEmFZiP9FJQwAV22+taWYdNp1RhHLeR1LTETP7QiVLfBVDDm6oQy0K38d+gYyNI1R70BvEPIWAzv2Vkipe/b7niTTpoOiowi8nUKpll0YFVu/gHvy2AjGUtjPv0gcwhVLALe/XpO/pgljHHfV9GBcUgl/cIYH7Bcp1JMU7AiiwSX6WEauAX4n1pwaDJsnvtqTNMFWTepe38OyCILVE5r0y3C3iKMQMfocBFN/AvBOL/AcIqU/Q==; h=Received:Received:Received:Received:Received:From:To:Cc:Subject:Date:Message-Id:X-Mailer:X-BitDefender-Scanner:X-BitDefender-Spam:X-BitDefender-SpamStamp:X-BitDefender-CF-Stamp; DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=bitdefender.com; h=from:to :cc:subject:date:message-id; s=default; bh=wUfTyjT44aSJDckxj3Ghv IRrgFw=; b=EZWUuLLIXtIsF+1bmIqQoGct0aNUjQE21W+usGnkL0QU4GCga1P9m mSkOk5z1O5lt9juIcg0/8a6Au5w48F6yk8h2k4TDJ94kgSs+9fulOrU5V4ilZfcl AmV74eQklF2Q+Q6QwmMotBc68VuVRMMNHo7zw0v5BNw+s1CgicAZVI6UVxb+VLWI ubZMjkCOYmBbgWXQWKrbYno6zJB23l0HwWW9G9gpDz67GBW1KjM7t3peC7r9ZlVU xKvOOgv2MskUuYDlIJuxxe/OFeXBkXBIKADwdfTl7hij7Yd8PufBiSE7bt2f1sAi P0XoanaAcS5O7fuY4KmjGVvyLRT8sXxaA== Received: (qmail 24419 invoked from network); 1 Feb 2016 09:42:28 +0200 Received: from unknown (HELO mx-sr.buh.bitdefender.com) (10.17.80.103) by mx01.buh.bitdefender.com with AES256-GCM-SHA384 encrypted SMTP; 1 Feb 2016 09:42:28 +0200 Received: from smtp02.buh.bitdefender.net (unknown [10.17.80.76]) by mx-sr.buh.bitdefender.com (Postfix) with ESMTP id E24D580346 for ; Mon, 1 Feb 2016 09:42:27 +0200 (EET) Received: (qmail 6778 invoked from network); 1 Feb 2016 09:42:26 +0200 Received: from unknown (HELO czuzu-dev-vm.clj.bitdefender.biz) (czuzu@bitdefender.com@172.21.6.207) by smtp02.buh.bitdefender.net with AES128-SHA256 encrypted SMTP; 1 Feb 2016 09:42:25 +0200 From: Corneliu ZUZU To: xen-devel@lists.xen.org Date: Mon, 1 Feb 2016 09:42:21 +0200 Message-Id: <1454312541-12422-1-git-send-email-czuzu@bitdefender.com> X-Mailer: git-send-email 2.5.0 X-BitDefender-Scanner: Clean, Agent: BitDefender qmail 3.1.4 on smtp02.buh.bitdefender.net, sigver: 7.64354 X-BitDefender-Spam: No (0) X-BitDefender-SpamStamp: Build: [Engines: 2.15.6.743, Dats: 413542, Stamp: 3], Multi: [Enabled, t: (0.000013, 0.009019)], BW: [Enabled, t: (0.000006)], RBL DNSBL: [Disabled], APM: [Enabled, Score: 500, t: (0.007481), Flags: 2A917CE3; NN_NO_CONTENT_TYPE; NN_LEGIT_SUMM_400_WORDS; NN_NO_LINK_NMD; NN_LEGIT_BITDEFENDER; NN_LEGIT_S_SQARE_BRACKETS; NN_LEGIT_MAILING_LIST_TO], SGN: [Enabled, t: (0.010270)], URL: [Enabled, t: (0.000004)], RTDA: [Enabled, t: (0.055204), Hit: No, Details: v2.3.2; Id: 2m1ghar.1aa3gr6oe.29mc0], total: 0(775) X-BitDefender-CF-Stamp: none Cc: Andrew Cooper , Keir Fraser , Jan Beulich Subject: [Xen-devel] [PATCH] x86: shrink 'struct domain', was already PAGE_SIZE X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The X86 domain structure already occupied PAGE_SIZE (4096). Looking @ the memory layout of the structure, we could see that overall most was occupied by (used the pahole tool on domain.o): * sizeof(domain.arch) = sizeof(arch_domain) = 3328 bytes. * sizeof(domain.arch.hvm_domain) = 2224 bytes. * sizeof(domain.arch.hvm_domain.pl_time) = 1088 bytes. This patch attempts to free some space, by making the pl_time field in hvm_domain dynamically allocated. We xzalloc/xfree it @ hvm_domain_initialise/hvm_domain_destroy. After this change, the domain structure shrunk w/ 1152 bytes (>1K!). Signed-off-by: Corneliu ZUZU Reviewed-by: Jan Beulich Reviewed-by: Andrew Cooper --- xen/arch/x86/hvm/hpet.c | 5 ++--- xen/arch/x86/hvm/hvm.c | 9 ++++++++- xen/arch/x86/hvm/pmtimer.c | 18 +++++++++--------- xen/arch/x86/hvm/rtc.c | 5 ++--- xen/arch/x86/hvm/vpt.c | 10 +++++----- xen/arch/x86/time.c | 2 +- xen/include/asm-x86/hvm/domain.h | 2 +- xen/include/asm-x86/hvm/vpt.h | 3 +++ 8 files changed, 31 insertions(+), 23 deletions(-) diff --git a/xen/arch/x86/hvm/hpet.c b/xen/arch/x86/hvm/hpet.c index 5e020ae..de5c088 100644 --- a/xen/arch/x86/hvm/hpet.c +++ b/xen/arch/x86/hvm/hpet.c @@ -26,10 +26,9 @@ #include #include -#define domain_vhpet(x) (&(x)->arch.hvm_domain.pl_time.vhpet) +#define domain_vhpet(x) (&(x)->arch.hvm_domain.pl_time->vhpet) #define vcpu_vhpet(x) (domain_vhpet((x)->domain)) -#define vhpet_domain(x) (container_of((x), struct domain, \ - arch.hvm_domain.pl_time.vhpet)) +#define vhpet_domain(x) (container_of((x), struct pl_time, vhpet)->domain) #define vhpet_vcpu(x) (pt_global_vcpu_target(vhpet_domain(x))) #define HPET_BASE_ADDRESS 0xfed00000ULL diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 674feea..cc667ae 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1574,13 +1574,18 @@ int hvm_domain_initialise(struct domain *d) if ( rc != 0 ) goto fail0; + d->arch.hvm_domain.pl_time = xzalloc(struct pl_time); d->arch.hvm_domain.params = xzalloc_array(uint64_t, HVM_NR_PARAMS); d->arch.hvm_domain.io_handler = xzalloc_array(struct hvm_io_handler, NR_IO_HANDLERS); rc = -ENOMEM; - if ( !d->arch.hvm_domain.params || !d->arch.hvm_domain.io_handler ) + if ( !d->arch.hvm_domain.pl_time || + !d->arch.hvm_domain.params || !d->arch.hvm_domain.io_handler ) goto fail1; + /* need link to containing domain */ + d->arch.hvm_domain.pl_time->domain = d; + /* Set the default IO Bitmap. */ if ( is_hardware_domain(d) ) { @@ -1637,6 +1642,7 @@ int hvm_domain_initialise(struct domain *d) xfree(d->arch.hvm_domain.io_bitmap); xfree(d->arch.hvm_domain.io_handler); xfree(d->arch.hvm_domain.params); + xfree(d->arch.hvm_domain.pl_time); fail0: hvm_destroy_cacheattr_region_list(d); return rc; @@ -1667,6 +1673,7 @@ void hvm_domain_destroy(struct domain *d) { xfree(d->arch.hvm_domain.io_handler); xfree(d->arch.hvm_domain.params); + xfree(d->arch.hvm_domain.pl_time); hvm_destroy_cacheattr_region_list(d); diff --git a/xen/arch/x86/hvm/pmtimer.c b/xen/arch/x86/hvm/pmtimer.c index 9c2e4bd..b1a5565 100644 --- a/xen/arch/x86/hvm/pmtimer.c +++ b/xen/arch/x86/hvm/pmtimer.c @@ -66,7 +66,7 @@ static void pmt_update_sci(PMTState *s) void hvm_acpi_power_button(struct domain *d) { - PMTState *s = &d->arch.hvm_domain.pl_time.vpmt; + PMTState *s = &d->arch.hvm_domain.pl_time->vpmt; if ( !has_vpm(d) ) return; @@ -79,7 +79,7 @@ void hvm_acpi_power_button(struct domain *d) void hvm_acpi_sleep_button(struct domain *d) { - PMTState *s = &d->arch.hvm_domain.pl_time.vpmt; + PMTState *s = &d->arch.hvm_domain.pl_time->vpmt; if ( !has_vpm(d) ) return; @@ -152,7 +152,7 @@ static int handle_evt_io( int dir, unsigned int port, unsigned int bytes, uint32_t *val) { struct vcpu *v = current; - PMTState *s = &v->domain->arch.hvm_domain.pl_time.vpmt; + PMTState *s = &v->domain->arch.hvm_domain.pl_time->vpmt; uint32_t addr, data, byte; int i; @@ -215,7 +215,7 @@ static int handle_pmt_io( int dir, unsigned int port, unsigned int bytes, uint32_t *val) { struct vcpu *v = current; - PMTState *s = &v->domain->arch.hvm_domain.pl_time.vpmt; + PMTState *s = &v->domain->arch.hvm_domain.pl_time->vpmt; if ( bytes != 4 ) { @@ -251,7 +251,7 @@ static int handle_pmt_io( static int pmtimer_save(struct domain *d, hvm_domain_context_t *h) { - PMTState *s = &d->arch.hvm_domain.pl_time.vpmt; + PMTState *s = &d->arch.hvm_domain.pl_time->vpmt; uint32_t x, msb = s->pm.tmr_val & TMR_VAL_MSB; int rc; @@ -282,7 +282,7 @@ static int pmtimer_save(struct domain *d, hvm_domain_context_t *h) static int pmtimer_load(struct domain *d, hvm_domain_context_t *h) { - PMTState *s = &d->arch.hvm_domain.pl_time.vpmt; + PMTState *s = &d->arch.hvm_domain.pl_time->vpmt; if ( !has_vpm(d) ) return -ENODEV; @@ -345,7 +345,7 @@ int pmtimer_change_ioport(struct domain *d, unsigned int version) void pmtimer_init(struct vcpu *v) { - PMTState *s = &v->domain->arch.hvm_domain.pl_time.vpmt; + PMTState *s = &v->domain->arch.hvm_domain.pl_time->vpmt; if ( !has_vpm(v->domain) ) return; @@ -369,7 +369,7 @@ void pmtimer_init(struct vcpu *v) void pmtimer_deinit(struct domain *d) { - PMTState *s = &d->arch.hvm_domain.pl_time.vpmt; + PMTState *s = &d->arch.hvm_domain.pl_time->vpmt; if ( !has_vpm(d) ) return; @@ -383,5 +383,5 @@ void pmtimer_reset(struct domain *d) return; /* Reset the counter. */ - d->arch.hvm_domain.pl_time.vpmt.pm.tmr_val = 0; + d->arch.hvm_domain.pl_time->vpmt.pm.tmr_val = 0; } diff --git a/xen/arch/x86/hvm/rtc.c b/xen/arch/x86/hvm/rtc.c index d391e38..d98d694 100644 --- a/xen/arch/x86/hvm/rtc.c +++ b/xen/arch/x86/hvm/rtc.c @@ -38,10 +38,9 @@ #define MIN_PER_HOUR 60 #define HOUR_PER_DAY 24 -#define domain_vrtc(x) (&(x)->arch.hvm_domain.pl_time.vrtc) +#define domain_vrtc(x) (&(x)->arch.hvm_domain.pl_time->vrtc) #define vcpu_vrtc(x) (domain_vrtc((x)->domain)) -#define vrtc_domain(x) (container_of((x), struct domain, \ - arch.hvm_domain.pl_time.vrtc)) +#define vrtc_domain(x) (container_of((x), struct pl_time, vrtc)->domain) #define vrtc_vcpu(x) (pt_global_vcpu_target(vrtc_domain(x))) #define epoch_year 1900 #define get_year(x) (x + epoch_year) diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c index 4fa6566..358ec57 100644 --- a/xen/arch/x86/hvm/vpt.c +++ b/xen/arch/x86/hvm/vpt.c @@ -28,7 +28,7 @@ void hvm_init_guest_time(struct domain *d) { - struct pl_time *pl = &d->arch.hvm_domain.pl_time; + struct pl_time *pl = d->arch.hvm_domain.pl_time; spin_lock_init(&pl->pl_time_lock); pl->stime_offset = -(u64)get_s_time(); @@ -37,7 +37,7 @@ void hvm_init_guest_time(struct domain *d) u64 hvm_get_guest_time_fixed(struct vcpu *v, u64 at_tsc) { - struct pl_time *pl = &v->domain->arch.hvm_domain.pl_time; + struct pl_time *pl = v->domain->arch.hvm_domain.pl_time; u64 now; /* Called from device models shared with PV guests. Be careful. */ @@ -505,7 +505,7 @@ void pt_adjust_global_vcpu_target(struct vcpu *v) pt_adjust_vcpu(&vpit->pt0, v); spin_unlock(&vpit->lock); - pl_time = &v->domain->arch.hvm_domain.pl_time; + pl_time = v->domain->arch.hvm_domain.pl_time; spin_lock(&pl_time->vrtc.lock); pt_adjust_vcpu(&pl_time->vrtc.pt, v); @@ -540,9 +540,9 @@ void pt_may_unmask_irq(struct domain *d, struct periodic_time *vlapic_pt) if ( d ) { pt_resume(&d->arch.vpit.pt0); - pt_resume(&d->arch.hvm_domain.pl_time.vrtc.pt); + pt_resume(&d->arch.hvm_domain.pl_time->vrtc.pt); for ( i = 0; i < HPET_TIMER_NUM; i++ ) - pt_resume(&d->arch.hvm_domain.pl_time.vhpet.pt[i]); + pt_resume(&d->arch.hvm_domain.pl_time->vhpet.pt[i]); } if ( vlapic_pt ) diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index 988403a..5819b9f 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -799,7 +799,7 @@ static void __update_vcpu_system_time(struct vcpu *v, int force) if ( is_hvm_domain(d) ) { - struct pl_time *pl = &v->domain->arch.hvm_domain.pl_time; + struct pl_time *pl = v->domain->arch.hvm_domain.pl_time; stime += pl->stime_offset + v->arch.hvm_vcpu.stime_offset; if ( stime >= 0 ) diff --git a/xen/include/asm-x86/hvm/domain.h b/xen/include/asm-x86/hvm/domain.h index a8cc2ad..2446586 100644 --- a/xen/include/asm-x86/hvm/domain.h +++ b/xen/include/asm-x86/hvm/domain.h @@ -91,7 +91,7 @@ struct hvm_domain { /* Cached CF8 for guest PCI config cycles */ uint32_t pci_cf8; - struct pl_time pl_time; + struct pl_time *pl_time; struct hvm_io_handler *io_handler; unsigned int io_handler_count; diff --git a/xen/include/asm-x86/hvm/vpt.h b/xen/include/asm-x86/hvm/vpt.h index 495d669..47e0ef1 100644 --- a/xen/include/asm-x86/hvm/vpt.h +++ b/xen/include/asm-x86/hvm/vpt.h @@ -139,6 +139,9 @@ struct pl_time { /* platform time */ /* Ensures monotonicity in appropriate timer modes. */ uint64_t last_guest_time; spinlock_t pl_time_lock; + /* pl_time allocated dynamically, need to keep link to + * containing domain */ + struct domain *domain; }; void pt_save_timer(struct vcpu *v);