ia64/linux-2.6.18-xen.hg

view arch/sparc64/kernel/binfmt_elf32.c @ 897:329ea0ccb344

balloon: try harder to balloon up under memory pressure.

Currently if the balloon driver is unable to increase the guest's
reservation it assumes the failure was due to reaching its full
allocation, gives up on the ballooning operation and records the limit
it reached as the "hard limit". The driver will not try again until
the target is set again (even to the same value).

However it is possible that ballooning has in fact failed due to
memory pressure in the host and therefore it is desirable to keep
attempting to reach the target in case memory becomes available. The
most likely scenario is that some guests are ballooning down while
others are ballooning up and therefore there is temporary memory
pressure while things stabilise. You would not expect a well behaved
toolstack to ask a domain to balloon to more than its allocation nor
would you expect it to deliberately over-commit memory by setting
balloon targets which exceed the total host memory.

This patch drops the concept of a hard limit and causes the balloon
driver to retry increasing the reservation on a timer in the same
manner as when decreasing the reservation.

Also if we partially succeed in increasing the reservation
(i.e. receive less pages than we asked for) then we may as well keep
those pages rather than returning them to Xen.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
author Keir Fraser <keir.fraser@citrix.com>
date Fri Jun 05 14:01:20 2009 +0100 (2009-06-05)
parents 831230e53067
children
line source
1 /*
2 * binfmt_elf32.c: Support 32-bit Sparc ELF binaries on Ultra.
3 *
4 * Copyright (C) 1995, 1996, 1997, 1998 David S. Miller (davem@redhat.com)
5 * Copyright (C) 1995, 1996, 1997, 1998 Jakub Jelinek (jj@ultra.linux.cz)
6 */
8 #define ELF_ARCH EM_SPARC
9 #define ELF_CLASS ELFCLASS32
10 #define ELF_DATA ELFDATA2MSB;
12 /* For the most part we present code dumps in the format
13 * Solaris does.
14 */
15 typedef unsigned int elf_greg_t;
16 #define ELF_NGREG 38
17 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
19 /* Format is:
20 * G0 --> G7
21 * O0 --> O7
22 * L0 --> L7
23 * I0 --> I7
24 * PSR, PC, nPC, Y, WIM, TBR
25 */
26 #include <asm/psrcompat.h>
27 #define ELF_CORE_COPY_REGS(__elf_regs, __pt_regs) \
28 do { unsigned int *dest = &(__elf_regs[0]); \
29 struct pt_regs *src = (__pt_regs); \
30 unsigned int __user *sp; \
31 int i; \
32 for(i = 0; i < 16; i++) \
33 dest[i] = (unsigned int) src->u_regs[i];\
34 /* Don't try this at home kids... */ \
35 sp = (unsigned int __user *) (src->u_regs[14] & \
36 0x00000000fffffffc); \
37 for(i = 0; i < 16; i++) \
38 __get_user(dest[i+16], &sp[i]); \
39 dest[32] = tstate_to_psr(src->tstate); \
40 dest[33] = (unsigned int) src->tpc; \
41 dest[34] = (unsigned int) src->tnpc; \
42 dest[35] = src->y; \
43 dest[36] = dest[37] = 0; /* XXX */ \
44 } while(0);
46 typedef struct {
47 union {
48 unsigned int pr_regs[32];
49 unsigned long pr_dregs[16];
50 } pr_fr;
51 unsigned int __unused;
52 unsigned int pr_fsr;
53 unsigned char pr_qcnt;
54 unsigned char pr_q_entrysize;
55 unsigned char pr_en;
56 unsigned int pr_q[64];
57 } elf_fpregset_t;
59 /* UltraSparc extensions. Still unused, but will be eventually. */
60 typedef struct {
61 unsigned int pr_type;
62 unsigned int pr_align;
63 union {
64 struct {
65 union {
66 unsigned int pr_regs[32];
67 unsigned long pr_dregs[16];
68 long double pr_qregs[8];
69 } pr_xfr;
70 } pr_v8p;
71 unsigned int pr_xfsr;
72 unsigned int pr_fprs;
73 unsigned int pr_xg[8];
74 unsigned int pr_xo[8];
75 unsigned long pr_tstate;
76 unsigned int pr_filler[8];
77 } pr_un;
78 } elf_xregset_t;
80 #define elf_check_arch(x) (((x)->e_machine == EM_SPARC) || ((x)->e_machine == EM_SPARC32PLUS))
82 #define ELF_ET_DYN_BASE 0x70000000
85 #include <asm/processor.h>
86 #include <linux/module.h>
87 #include <linux/elfcore.h>
88 #include <linux/compat.h>
90 #define elf_prstatus elf_prstatus32
91 struct elf_prstatus32
92 {
93 struct elf_siginfo pr_info; /* Info associated with signal */
94 short pr_cursig; /* Current signal */
95 unsigned int pr_sigpend; /* Set of pending signals */
96 unsigned int pr_sighold; /* Set of held signals */
97 pid_t pr_pid;
98 pid_t pr_ppid;
99 pid_t pr_pgrp;
100 pid_t pr_sid;
101 struct compat_timeval pr_utime; /* User time */
102 struct compat_timeval pr_stime; /* System time */
103 struct compat_timeval pr_cutime; /* Cumulative user time */
104 struct compat_timeval pr_cstime; /* Cumulative system time */
105 elf_gregset_t pr_reg; /* GP registers */
106 int pr_fpvalid; /* True if math co-processor being used. */
107 };
109 #define elf_prpsinfo elf_prpsinfo32
110 struct elf_prpsinfo32
111 {
112 char pr_state; /* numeric process state */
113 char pr_sname; /* char for pr_state */
114 char pr_zomb; /* zombie */
115 char pr_nice; /* nice val */
116 unsigned int pr_flag; /* flags */
117 u16 pr_uid;
118 u16 pr_gid;
119 pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid;
120 /* Lots missing */
121 char pr_fname[16]; /* filename of executable */
122 char pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
123 };
125 #include <linux/highuid.h>
127 #undef NEW_TO_OLD_UID
128 #undef NEW_TO_OLD_GID
129 #define NEW_TO_OLD_UID(uid) ((uid) > 65535) ? (u16)overflowuid : (u16)(uid)
130 #define NEW_TO_OLD_GID(gid) ((gid) > 65535) ? (u16)overflowgid : (u16)(gid)
132 #include <linux/time.h>
134 #undef cputime_to_timeval
135 #define cputime_to_timeval cputime_to_compat_timeval
136 static __inline__ void
137 cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value)
138 {
139 unsigned long jiffies = cputime_to_jiffies(cputime);
140 value->tv_usec = (jiffies % HZ) * (1000000L / HZ);
141 value->tv_sec = jiffies / HZ;
142 }
144 #define elf_addr_t u32
145 #undef start_thread
146 #define start_thread start_thread32
147 #define init_elf_binfmt init_elf32_binfmt
149 MODULE_DESCRIPTION("Binary format loader for compatibility with 32bit SparcLinux binaries on the Ultra");
150 MODULE_AUTHOR("Eric Youngdale, David S. Miller, Jakub Jelinek");
152 #undef MODULE_DESCRIPTION
153 #undef MODULE_AUTHOR
155 #include <asm/a.out.h>
157 #undef TASK_SIZE
158 #define TASK_SIZE STACK_TOP32
160 #include "../../../fs/binfmt_elf.c"