mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
Reformat the pfn_info structure to ensure that
lock cmpxchg8b instructions occur only on naturally aligned 8-byte memory values. This is needed for some NUMA x86 systems. Signed-off-by: Keir Fraser <keir@xensource.com> Signed-off-by: Aravindh Puthiyaparambil <first.last@unisys.com>
This commit is contained in:
1 parent
c436ce043d
commit
ec7c322ccd
3 files changed
+12
-9
No files matched your search
@@ -156,6 +156,7 @@ void subarch_init_memory(struct domain *dom_xen)
|
||||
*/
|
||||
if ( (offsetof(struct pfn_info, u.inuse._domain) !=
|
||||
(offsetof(struct pfn_info, count_info) + sizeof(u32))) ||
|
||||
((offsetof(struct pfn_info, count_info) & 7) != 0) ||
|
||||
(sizeof(struct pfn_info) != 24) )
|
||||
{
|
||||
printk("Weird pfn_info layout (%ld,%ld,%d)\n",
|
||||
|
||||
@@ -137,8 +137,10 @@ void subarch_init_memory(struct domain *dom_xen)
|
||||
* count_info and domain fields must be adjacent, as we perform atomic
|
||||
* 64-bit operations on them.
|
||||
*/
|
||||
if ( (offsetof(struct pfn_info, u.inuse._domain) !=
|
||||
(offsetof(struct pfn_info, count_info) + sizeof(u32))) )
|
||||
if ( ((offsetof(struct pfn_info, u.inuse._domain) !=
|
||||
(offsetof(struct pfn_info, count_info) + sizeof(u32)))) ||
|
||||
((offsetof(struct pfn_info, count_info) & 7) != 0) ||
|
||||
(sizeof(struct pfn_info) != 40) )
|
||||
{
|
||||
printk("Weird pfn_info layout (%ld,%ld,%ld)\n",
|
||||
offsetof(struct pfn_info, count_info),
|
||||
|
||||
@@ -22,9 +22,6 @@ struct pfn_info
|
||||
/* Each frame can be threaded onto a doubly-linked list. */
|
||||
struct list_head list;
|
||||
|
||||
/* Timestamp from 'TLB clock', used to reduce need for safety flushes. */
|
||||
u32 tlbflush_timestamp;
|
||||
|
||||
/* Reference count and various PGC_xxx flags and fields. */
|
||||
u32 count_info;
|
||||
|
||||
@@ -37,17 +34,20 @@ struct pfn_info
|
||||
u32 _domain; /* pickled format */
|
||||
/* Type reference count and various PGT_xxx flags and fields. */
|
||||
unsigned long type_info;
|
||||
} inuse;
|
||||
} __attribute__ ((packed)) inuse;
|
||||
|
||||
/* Page is on a free list: ((count_info & PGC_count_mask) == 0). */
|
||||
struct {
|
||||
/* Order-size of the free chunk this page is the head of. */
|
||||
u32 order;
|
||||
/* Mask of possibly-tainted TLBs. */
|
||||
cpumask_t cpumask;
|
||||
/* Order-size of the free chunk this page is the head of. */
|
||||
u8 order;
|
||||
} free;
|
||||
} __attribute__ ((packed)) free;
|
||||
|
||||
} u;
|
||||
|
||||
/* Timestamp from 'TLB clock', used to reduce need for safety flushes. */
|
||||
u32 tlbflush_timestamp;
|
||||
};
|
||||
|
||||
/* The following page types are MUTUALLY EXCLUSIVE. */
|
||||
|
||||