From: "Jan Beulich" <JBeulich@suse.com>
To: xen-devel <xen-devel@lists.xenproject.org>
Cc: Ian Campbell <Ian.Campbell@eu.citrix.com>,
Keir Fraser <keir@xen.org>,
Ian Jackson <Ian.Jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>
Subject: [PATCH] re-order struct domain fields
Date: Mon, 19 Jan 2015 15:42:46 +0000 [thread overview]
Message-ID: <54BD340602000078000568FB@mail.emea.novell.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 4650 bytes --]
... to reduce padding holes.
I also wonder whether having independent spin locks side by side is
really a good thing cache-line-bouncing-wise.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -306,6 +306,9 @@ struct domain
{
domid_t domain_id;
+ unsigned int max_vcpus;
+ struct vcpu **vcpu;
+
shared_info_t *shared_info; /* shared data area */
spinlock_t domain_lock;
@@ -314,13 +317,11 @@ struct domain
struct page_list_head page_list; /* linked list */
struct page_list_head xenpage_list; /* linked list (size xenheap_pages) */
unsigned int tot_pages; /* number of pages currently possesed */
+ unsigned int xenheap_pages; /* # pages allocated from Xen heap */
unsigned int outstanding_pages; /* pages claimed but not possessed */
unsigned int max_pages; /* maximum value for tot_pages */
atomic_t shr_pages; /* number of shared pages */
atomic_t paged_pages; /* number of paged-out pages */
- unsigned int xenheap_pages; /* # pages allocated from Xen heap */
-
- unsigned int max_vcpus;
/* Scheduling. */
void *sched_priv; /* scheduler-specific data */
@@ -347,15 +348,19 @@ struct domain
* Interrupt to event-channel mappings and other per-guest-pirq data.
* Protected by the domain's event-channel spinlock.
*/
- unsigned int nr_pirqs;
struct radix_tree_root pirq_tree;
-
- /* I/O capabilities (access to IRQs and memory-mapped I/O). */
- struct rangeset *iomem_caps;
- struct rangeset *irq_caps;
+ unsigned int nr_pirqs;
enum guest_type guest_type;
+ /* Is this guest dying (i.e., a zombie)? */
+ enum { DOMDYING_alive, DOMDYING_dying, DOMDYING_dead } is_dying;
+
+ /* Domain is paused by controller software? */
+ int controller_pause_count;
+
+ int32_t time_offset_seconds;
+
#ifdef HAS_PASSTHROUGH
/* Does this guest need iommu mappings (-1 meaning "being set up")? */
s8 need_iommu;
@@ -364,16 +369,14 @@ struct domain
bool_t auto_node_affinity;
/* Is this guest fully privileged (aka dom0)? */
bool_t is_privileged;
- /* Which guest this guest has privileges on */
- struct domain *target;
- /* Is this guest being debugged by dom0? */
- bool_t debugger_attached;
- /* Is this guest dying (i.e., a zombie)? */
- enum { DOMDYING_alive, DOMDYING_dying, DOMDYING_dead } is_dying;
- /* Domain is paused by controller software? */
- int controller_pause_count;
/* Domain's VCPUs are pinned 1:1 to physical CPUs? */
bool_t is_pinned;
+ /* Non-migratable and non-restoreable? */
+ bool_t disable_migrate;
+ /* Is this guest being debugged by dom0? */
+ bool_t debugger_attached;
+ /* Which guest this guest has privileges on */
+ struct domain *target;
/* Are any VCPUs polling event channels (SCHEDOP_poll)? */
#if MAX_VIRT_CPUS <= BITS_PER_LONG
@@ -382,6 +385,10 @@ struct domain
unsigned long *poll_mask;
#endif
+ /* I/O capabilities (access to IRQs and memory-mapped I/O). */
+ struct rangeset *iomem_caps;
+ struct rangeset *irq_caps;
+
/* Guest has shut down (inc. reason code)? */
spinlock_t shutdown_lock;
bool_t is_shutting_down; /* in process of shutting down? */
@@ -390,15 +397,12 @@ struct domain
/* If this is not 0, send suspend notification here instead of
* raising DOM_EXC */
- int suspend_evtchn;
+ evtchn_port_t suspend_evtchn;
atomic_t pause_count;
-
- unsigned long vm_assist;
-
atomic_t refcnt;
- struct vcpu **vcpu;
+ unsigned long vm_assist;
/* Bitmask of CPUs which are holding onto this domain's state. */
cpumask_var_t domain_dirty_cpumask;
@@ -418,7 +422,6 @@ struct domain
/* OProfile support. */
struct xenoprof *xenoprof;
- int32_t time_offset_seconds;
/* Domain watchdog. */
#define NR_DOMAIN_WATCHDOG_TIMERS 2
@@ -439,9 +442,6 @@ struct domain
struct lock_profile_qhead profile_head;
- /* Non-migratable and non-restoreable? */
- bool_t disable_migrate;
-
/* Various mem_events */
struct mem_event_per_domain *mem_event;
[-- Attachment #2: struct-domain-reorder.patch --]
[-- Type: text/plain, Size: 4679 bytes --]
re-order struct domain fields
... to reduce padding holes.
I also wonder whether having independent spin locks side by side is
really a good thing cache-line-bouncing-wise.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -306,6 +306,9 @@ struct domain
{
domid_t domain_id;
+ unsigned int max_vcpus;
+ struct vcpu **vcpu;
+
shared_info_t *shared_info; /* shared data area */
spinlock_t domain_lock;
@@ -314,13 +317,11 @@ struct domain
struct page_list_head page_list; /* linked list */
struct page_list_head xenpage_list; /* linked list (size xenheap_pages) */
unsigned int tot_pages; /* number of pages currently possesed */
+ unsigned int xenheap_pages; /* # pages allocated from Xen heap */
unsigned int outstanding_pages; /* pages claimed but not possessed */
unsigned int max_pages; /* maximum value for tot_pages */
atomic_t shr_pages; /* number of shared pages */
atomic_t paged_pages; /* number of paged-out pages */
- unsigned int xenheap_pages; /* # pages allocated from Xen heap */
-
- unsigned int max_vcpus;
/* Scheduling. */
void *sched_priv; /* scheduler-specific data */
@@ -347,15 +348,19 @@ struct domain
* Interrupt to event-channel mappings and other per-guest-pirq data.
* Protected by the domain's event-channel spinlock.
*/
- unsigned int nr_pirqs;
struct radix_tree_root pirq_tree;
-
- /* I/O capabilities (access to IRQs and memory-mapped I/O). */
- struct rangeset *iomem_caps;
- struct rangeset *irq_caps;
+ unsigned int nr_pirqs;
enum guest_type guest_type;
+ /* Is this guest dying (i.e., a zombie)? */
+ enum { DOMDYING_alive, DOMDYING_dying, DOMDYING_dead } is_dying;
+
+ /* Domain is paused by controller software? */
+ int controller_pause_count;
+
+ int32_t time_offset_seconds;
+
#ifdef HAS_PASSTHROUGH
/* Does this guest need iommu mappings (-1 meaning "being set up")? */
s8 need_iommu;
@@ -364,16 +369,14 @@ struct domain
bool_t auto_node_affinity;
/* Is this guest fully privileged (aka dom0)? */
bool_t is_privileged;
- /* Which guest this guest has privileges on */
- struct domain *target;
- /* Is this guest being debugged by dom0? */
- bool_t debugger_attached;
- /* Is this guest dying (i.e., a zombie)? */
- enum { DOMDYING_alive, DOMDYING_dying, DOMDYING_dead } is_dying;
- /* Domain is paused by controller software? */
- int controller_pause_count;
/* Domain's VCPUs are pinned 1:1 to physical CPUs? */
bool_t is_pinned;
+ /* Non-migratable and non-restoreable? */
+ bool_t disable_migrate;
+ /* Is this guest being debugged by dom0? */
+ bool_t debugger_attached;
+ /* Which guest this guest has privileges on */
+ struct domain *target;
/* Are any VCPUs polling event channels (SCHEDOP_poll)? */
#if MAX_VIRT_CPUS <= BITS_PER_LONG
@@ -382,6 +385,10 @@ struct domain
unsigned long *poll_mask;
#endif
+ /* I/O capabilities (access to IRQs and memory-mapped I/O). */
+ struct rangeset *iomem_caps;
+ struct rangeset *irq_caps;
+
/* Guest has shut down (inc. reason code)? */
spinlock_t shutdown_lock;
bool_t is_shutting_down; /* in process of shutting down? */
@@ -390,15 +397,12 @@ struct domain
/* If this is not 0, send suspend notification here instead of
* raising DOM_EXC */
- int suspend_evtchn;
+ evtchn_port_t suspend_evtchn;
atomic_t pause_count;
-
- unsigned long vm_assist;
-
atomic_t refcnt;
- struct vcpu **vcpu;
+ unsigned long vm_assist;
/* Bitmask of CPUs which are holding onto this domain's state. */
cpumask_var_t domain_dirty_cpumask;
@@ -418,7 +422,6 @@ struct domain
/* OProfile support. */
struct xenoprof *xenoprof;
- int32_t time_offset_seconds;
/* Domain watchdog. */
#define NR_DOMAIN_WATCHDOG_TIMERS 2
@@ -439,9 +442,6 @@ struct domain
struct lock_profile_qhead profile_head;
- /* Non-migratable and non-restoreable? */
- bool_t disable_migrate;
-
/* Various mem_events */
struct mem_event_per_domain *mem_event;
[-- Attachment #3: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next reply other threads:[~2015-01-19 15:42 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-19 15:42 Jan Beulich [this message]
2015-01-19 16:00 ` [PATCH] re-order struct domain fields Tim Deegan
2015-01-19 16:25 ` Ian Campbell
2015-01-19 16:35 ` Jan Beulich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54BD340602000078000568FB@mail.emea.novell.com \
--to=jbeulich@suse.com \
--cc=Ian.Campbell@eu.citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=keir@xen.org \
--cc=tim@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.