ia64/linux-2.6.18-xen.hg

view arch/sparc64/kernel/sys32.S @ 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 /* $Id: sys32.S,v 1.12 2000/03/24 04:17:37 davem Exp $
2 * sys32.S: I-cache tricks for 32-bit compatibility layer simple
3 * conversions.
4 *
5 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
6 * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz)
7 */
9 #include <asm/errno.h>
11 /* NOTE: call as jump breaks return stack, we have to avoid that */
13 .text
15 #define SIGN1(STUB,SYSCALL,REG1) \
16 .align 32; \
17 .globl STUB; \
18 STUB: sethi %hi(SYSCALL), %g1; \
19 jmpl %g1 + %lo(SYSCALL), %g0; \
20 sra REG1, 0, REG1
22 #define SIGN2(STUB,SYSCALL,REG1,REG2) \
23 .align 32; \
24 .globl STUB; \
25 STUB: sethi %hi(SYSCALL), %g1; \
26 sra REG1, 0, REG1; \
27 jmpl %g1 + %lo(SYSCALL), %g0; \
28 sra REG2, 0, REG2
30 #define SIGN3(STUB,SYSCALL,REG1,REG2,REG3) \
31 .align 32; \
32 .globl STUB; \
33 STUB: sra REG1, 0, REG1; \
34 sethi %hi(SYSCALL), %g1; \
35 sra REG2, 0, REG2; \
36 jmpl %g1 + %lo(SYSCALL), %g0; \
37 sra REG3, 0, REG3
39 #define SIGN4(STUB,SYSCALL,REG1,REG2,REG3,REG4) \
40 .align 32; \
41 .globl STUB; \
42 STUB: sra REG1, 0, REG1; \
43 sethi %hi(SYSCALL), %g1; \
44 sra REG2, 0, REG2; \
45 sra REG3, 0, REG3; \
46 jmpl %g1 + %lo(SYSCALL), %g0; \
47 sra REG4, 0, REG4
49 SIGN1(sys32_exit, sparc_exit, %o0)
50 SIGN1(sys32_exit_group, sys_exit_group, %o0)
51 SIGN1(sys32_wait4, compat_sys_wait4, %o2)
52 SIGN1(sys32_creat, sys_creat, %o1)
53 SIGN1(sys32_mknod, sys_mknod, %o1)
54 SIGN1(sys32_perfctr, sys_perfctr, %o0)
55 SIGN1(sys32_umount, sys_umount, %o1)
56 SIGN1(sys32_signal, sys_signal, %o0)
57 SIGN1(sys32_access, sys_access, %o1)
58 SIGN1(sys32_msync, sys_msync, %o2)
59 SIGN2(sys32_reboot, sys_reboot, %o0, %o1)
60 SIGN1(sys32_setitimer, compat_sys_setitimer, %o0)
61 SIGN1(sys32_getitimer, compat_sys_getitimer, %o0)
62 SIGN1(sys32_sethostname, sys_sethostname, %o1)
63 SIGN1(sys32_swapon, sys_swapon, %o1)
64 SIGN1(sys32_sigaction, compat_sys_sigaction, %o0)
65 SIGN1(sys32_rt_sigaction, compat_sys_rt_sigaction, %o0)
66 SIGN1(sys32_sigprocmask, compat_sys_sigprocmask, %o0)
67 SIGN1(sys32_rt_sigprocmask, compat_sys_rt_sigprocmask, %o0)
68 SIGN2(sys32_rt_sigqueueinfo, compat_sys_rt_sigqueueinfo, %o0, %o1)
69 SIGN1(sys32_getrusage, compat_sys_getrusage, %o0)
70 SIGN1(sys32_setxattr, sys_setxattr, %o4)
71 SIGN1(sys32_lsetxattr, sys_lsetxattr, %o4)
72 SIGN1(sys32_fsetxattr, sys_fsetxattr, %o4)
73 SIGN1(sys32_fgetxattr, sys_fgetxattr, %o0)
74 SIGN1(sys32_flistxattr, sys_flistxattr, %o0)
75 SIGN1(sys32_fremovexattr, sys_fremovexattr, %o0)
76 SIGN2(sys32_tkill, sys_tkill, %o0, %o1)
77 SIGN1(sys32_epoll_create, sys_epoll_create, %o0)
78 SIGN3(sys32_epoll_ctl, sys_epoll_ctl, %o0, %o1, %o2)
79 SIGN3(sys32_epoll_wait, sys_epoll_wait, %o0, %o2, %o3)
80 SIGN1(sys32_readahead, compat_sys_readahead, %o0)
81 SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4)
82 SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5)
83 SIGN2(sys32_bdflush, sys_bdflush, %o0, %o1)
84 SIGN1(sys32_mlockall, sys_mlockall, %o0)
85 SIGN1(sys32_nfsservctl, compat_sys_nfsservctl, %o0)
86 SIGN1(sys32_clock_nanosleep, compat_sys_clock_nanosleep, %o1)
87 SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1)
88 SIGN1(sys32_io_submit, compat_sys_io_submit, %o1)
89 SIGN1(sys32_mq_open, compat_sys_mq_open, %o1)
90 SIGN1(sys32_select, compat_sys_select, %o0)
91 SIGN1(sys32_mkdir, sys_mkdir, %o1)
92 SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5)
93 SIGN1(sys32_sysfs, compat_sys_sysfs, %o0)
94 SIGN3(sys32_ipc, compat_sys_ipc, %o1, %o2, %o3)
95 SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1)
96 SIGN2(sys32_sendfile64, compat_sys_sendfile64, %o0, %o1)
97 SIGN1(sys32_prctl, sys_prctl, %o0)
98 SIGN1(sys32_sched_rr_get_interval, compat_sys_sched_rr_get_interval, %o0)
99 SIGN2(sys32_waitpid, sys_waitpid, %o0, %o2)
100 SIGN1(sys32_getgroups, sys_getgroups, %o0)
101 SIGN1(sys32_getpgid, sys_getpgid, %o0)
102 SIGN2(sys32_getpriority, sys_getpriority, %o0, %o1)
103 SIGN1(sys32_getsid, sys_getsid, %o0)
104 SIGN2(sys32_kill, sys_kill, %o0, %o1)
105 SIGN1(sys32_nice, sys_nice, %o0)
106 SIGN1(sys32_lseek, sys_lseek, %o1)
107 SIGN2(sys32_open, sparc32_open, %o1, %o2)
108 SIGN1(sys32_readlink, sys_readlink, %o2)
109 SIGN1(sys32_sched_get_priority_max, sys_sched_get_priority_max, %o0)
110 SIGN1(sys32_sched_get_priority_min, sys_sched_get_priority_min, %o0)
111 SIGN1(sys32_sched_getparam, sys_sched_getparam, %o0)
112 SIGN1(sys32_sched_getscheduler, sys_sched_getscheduler, %o0)
113 SIGN1(sys32_sched_setparam, sys_sched_setparam, %o0)
114 SIGN2(sys32_sched_setscheduler, sys_sched_setscheduler, %o0, %o1)
115 SIGN1(sys32_getdomainname, sys_getdomainname, %o1)
116 SIGN1(sys32_setdomainname, sys_setdomainname, %o1)
117 SIGN1(sys32_setgroups, sys_setgroups, %o0)
118 SIGN2(sys32_setpgid, sys_setpgid, %o0, %o1)
119 SIGN3(sys32_setpriority, sys_setpriority, %o0, %o1, %o2)
120 SIGN1(sys32_ssetmask, sys_ssetmask, %o0)
121 SIGN2(sys32_syslog, sys_syslog, %o0, %o2)
122 SIGN1(sys32_umask, sys_umask, %o0)
123 SIGN3(sys32_tgkill, sys_tgkill, %o0, %o1, %o2)
124 SIGN1(sys32_sendto, sys_sendto, %o0)
125 SIGN1(sys32_recvfrom, sys_recvfrom, %o0)
126 SIGN3(sys32_socket, sys_socket, %o0, %o1, %o2)
127 SIGN2(sys32_connect, sys_connect, %o0, %o2)
128 SIGN2(sys32_bind, sys_bind, %o0, %o2)
129 SIGN2(sys32_listen, sys_listen, %o0, %o1)
130 SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)
131 SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0)
132 SIGN2(sys32_shutdown, sys_shutdown, %o0, %o1)
133 SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2)
134 SIGN1(sys32_getpeername, sys_getpeername, %o0)
135 SIGN1(sys32_getsockname, sys_getsockname, %o0)
136 SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1)
137 SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2)
138 SIGN2(sys32_splice, sys_splice, %o0, %o1)
139 SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)
140 SIGN2(sys32_tee, sys_tee, %o0, %o1)
141 SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0)
143 .globl sys32_mmap2
144 sys32_mmap2:
145 sethi %hi(sys_mmap), %g1
146 jmpl %g1 + %lo(sys_mmap), %g0
147 sllx %o5, 12, %o5
149 .align 32
150 .globl sys32_socketcall
151 sys32_socketcall: /* %o0=call, %o1=args */
152 cmp %o0, 1
153 bl,pn %xcc, do_einval
154 cmp %o0, 17
155 bg,pn %xcc, do_einval
156 sub %o0, 1, %o0
157 sllx %o0, 5, %o0
158 sethi %hi(__socketcall_table_begin), %g2
159 or %g2, %lo(__socketcall_table_begin), %g2
160 jmpl %g2 + %o0, %g0
161 nop
162 do_einval:
163 retl
164 mov -EINVAL, %o0
166 .align 32
167 __socketcall_table_begin:
169 /* Each entry is exactly 32 bytes. */
170 do_sys_socket: /* sys_socket(int, int, int) */
171 1: ldswa [%o1 + 0x0] %asi, %o0
172 sethi %hi(sys_socket), %g1
173 2: ldswa [%o1 + 0x8] %asi, %o2
174 jmpl %g1 + %lo(sys_socket), %g0
175 3: ldswa [%o1 + 0x4] %asi, %o1
176 nop
177 nop
178 nop
179 do_sys_bind: /* sys_bind(int fd, struct sockaddr *, int) */
180 4: ldswa [%o1 + 0x0] %asi, %o0
181 sethi %hi(sys_bind), %g1
182 5: ldswa [%o1 + 0x8] %asi, %o2
183 jmpl %g1 + %lo(sys_bind), %g0
184 6: lduwa [%o1 + 0x4] %asi, %o1
185 nop
186 nop
187 nop
188 do_sys_connect: /* sys_connect(int, struct sockaddr *, int) */
189 7: ldswa [%o1 + 0x0] %asi, %o0
190 sethi %hi(sys_connect), %g1
191 8: ldswa [%o1 + 0x8] %asi, %o2
192 jmpl %g1 + %lo(sys_connect), %g0
193 9: lduwa [%o1 + 0x4] %asi, %o1
194 nop
195 nop
196 nop
197 do_sys_listen: /* sys_listen(int, int) */
198 10: ldswa [%o1 + 0x0] %asi, %o0
199 sethi %hi(sys_listen), %g1
200 jmpl %g1 + %lo(sys_listen), %g0
201 11: ldswa [%o1 + 0x4] %asi, %o1
202 nop
203 nop
204 nop
205 nop
206 do_sys_accept: /* sys_accept(int, struct sockaddr *, int *) */
207 12: ldswa [%o1 + 0x0] %asi, %o0
208 sethi %hi(sys_accept), %g1
209 13: lduwa [%o1 + 0x8] %asi, %o2
210 jmpl %g1 + %lo(sys_accept), %g0
211 14: lduwa [%o1 + 0x4] %asi, %o1
212 nop
213 nop
214 nop
215 do_sys_getsockname: /* sys_getsockname(int, struct sockaddr *, int *) */
216 15: ldswa [%o1 + 0x0] %asi, %o0
217 sethi %hi(sys_getsockname), %g1
218 16: lduwa [%o1 + 0x8] %asi, %o2
219 jmpl %g1 + %lo(sys_getsockname), %g0
220 17: lduwa [%o1 + 0x4] %asi, %o1
221 nop
222 nop
223 nop
224 do_sys_getpeername: /* sys_getpeername(int, struct sockaddr *, int *) */
225 18: ldswa [%o1 + 0x0] %asi, %o0
226 sethi %hi(sys_getpeername), %g1
227 19: lduwa [%o1 + 0x8] %asi, %o2
228 jmpl %g1 + %lo(sys_getpeername), %g0
229 20: lduwa [%o1 + 0x4] %asi, %o1
230 nop
231 nop
232 nop
233 do_sys_socketpair: /* sys_socketpair(int, int, int, int *) */
234 21: ldswa [%o1 + 0x0] %asi, %o0
235 sethi %hi(sys_socketpair), %g1
236 22: ldswa [%o1 + 0x8] %asi, %o2
237 23: lduwa [%o1 + 0xc] %asi, %o3
238 jmpl %g1 + %lo(sys_socketpair), %g0
239 24: ldswa [%o1 + 0x4] %asi, %o1
240 nop
241 nop
242 do_sys_send: /* sys_send(int, void *, size_t, unsigned int) */
243 25: ldswa [%o1 + 0x0] %asi, %o0
244 sethi %hi(sys_send), %g1
245 26: lduwa [%o1 + 0x8] %asi, %o2
246 27: lduwa [%o1 + 0xc] %asi, %o3
247 jmpl %g1 + %lo(sys_send), %g0
248 28: lduwa [%o1 + 0x4] %asi, %o1
249 nop
250 nop
251 do_sys_recv: /* sys_recv(int, void *, size_t, unsigned int) */
252 29: ldswa [%o1 + 0x0] %asi, %o0
253 sethi %hi(sys_recv), %g1
254 30: lduwa [%o1 + 0x8] %asi, %o2
255 31: lduwa [%o1 + 0xc] %asi, %o3
256 jmpl %g1 + %lo(sys_recv), %g0
257 32: lduwa [%o1 + 0x4] %asi, %o1
258 nop
259 nop
260 do_sys_sendto: /* sys_sendto(int, u32, compat_size_t, unsigned int, u32, int) */
261 33: ldswa [%o1 + 0x0] %asi, %o0
262 sethi %hi(sys_sendto), %g1
263 34: lduwa [%o1 + 0x8] %asi, %o2
264 35: lduwa [%o1 + 0xc] %asi, %o3
265 36: lduwa [%o1 + 0x10] %asi, %o4
266 37: ldswa [%o1 + 0x14] %asi, %o5
267 jmpl %g1 + %lo(sys_sendto), %g0
268 38: lduwa [%o1 + 0x4] %asi, %o1
269 do_sys_recvfrom: /* sys_recvfrom(int, u32, compat_size_t, unsigned int, u32, u32) */
270 39: ldswa [%o1 + 0x0] %asi, %o0
271 sethi %hi(sys_recvfrom), %g1
272 40: lduwa [%o1 + 0x8] %asi, %o2
273 41: lduwa [%o1 + 0xc] %asi, %o3
274 42: lduwa [%o1 + 0x10] %asi, %o4
275 43: lduwa [%o1 + 0x14] %asi, %o5
276 jmpl %g1 + %lo(sys_recvfrom), %g0
277 44: lduwa [%o1 + 0x4] %asi, %o1
278 do_sys_shutdown: /* sys_shutdown(int, int) */
279 45: ldswa [%o1 + 0x0] %asi, %o0
280 sethi %hi(sys_shutdown), %g1
281 jmpl %g1 + %lo(sys_shutdown), %g0
282 46: ldswa [%o1 + 0x4] %asi, %o1
283 nop
284 nop
285 nop
286 nop
287 do_sys_setsockopt: /* compat_sys_setsockopt(int, int, int, char *, int) */
288 47: ldswa [%o1 + 0x0] %asi, %o0
289 sethi %hi(compat_sys_setsockopt), %g1
290 48: ldswa [%o1 + 0x8] %asi, %o2
291 49: lduwa [%o1 + 0xc] %asi, %o3
292 50: ldswa [%o1 + 0x10] %asi, %o4
293 jmpl %g1 + %lo(compat_sys_setsockopt), %g0
294 51: ldswa [%o1 + 0x4] %asi, %o1
295 nop
296 do_sys_getsockopt: /* compat_sys_getsockopt(int, int, int, u32, u32) */
297 52: ldswa [%o1 + 0x0] %asi, %o0
298 sethi %hi(compat_sys_getsockopt), %g1
299 53: ldswa [%o1 + 0x8] %asi, %o2
300 54: lduwa [%o1 + 0xc] %asi, %o3
301 55: lduwa [%o1 + 0x10] %asi, %o4
302 jmpl %g1 + %lo(compat_sys_getsockopt), %g0
303 56: ldswa [%o1 + 0x4] %asi, %o1
304 nop
305 do_sys_sendmsg: /* compat_sys_sendmsg(int, struct compat_msghdr *, unsigned int) */
306 57: ldswa [%o1 + 0x0] %asi, %o0
307 sethi %hi(compat_sys_sendmsg), %g1
308 58: lduwa [%o1 + 0x8] %asi, %o2
309 jmpl %g1 + %lo(compat_sys_sendmsg), %g0
310 59: lduwa [%o1 + 0x4] %asi, %o1
311 nop
312 nop
313 nop
314 do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) */
315 60: ldswa [%o1 + 0x0] %asi, %o0
316 sethi %hi(compat_sys_recvmsg), %g1
317 61: lduwa [%o1 + 0x8] %asi, %o2
318 jmpl %g1 + %lo(compat_sys_recvmsg), %g0
319 62: lduwa [%o1 + 0x4] %asi, %o1
320 nop
321 nop
322 nop
324 .section __ex_table,"a"
325 .align 4
326 .word 1b, __retl_efault, 2b, __retl_efault
327 .word 3b, __retl_efault, 4b, __retl_efault
328 .word 5b, __retl_efault, 6b, __retl_efault
329 .word 7b, __retl_efault, 8b, __retl_efault
330 .word 9b, __retl_efault, 10b, __retl_efault
331 .word 11b, __retl_efault, 12b, __retl_efault
332 .word 13b, __retl_efault, 14b, __retl_efault
333 .word 15b, __retl_efault, 16b, __retl_efault
334 .word 17b, __retl_efault, 18b, __retl_efault
335 .word 19b, __retl_efault, 20b, __retl_efault
336 .word 21b, __retl_efault, 22b, __retl_efault
337 .word 23b, __retl_efault, 24b, __retl_efault
338 .word 25b, __retl_efault, 26b, __retl_efault
339 .word 27b, __retl_efault, 28b, __retl_efault
340 .word 29b, __retl_efault, 30b, __retl_efault
341 .word 31b, __retl_efault, 32b, __retl_efault
342 .word 33b, __retl_efault, 34b, __retl_efault
343 .word 35b, __retl_efault, 36b, __retl_efault
344 .word 37b, __retl_efault, 38b, __retl_efault
345 .word 39b, __retl_efault, 40b, __retl_efault
346 .word 41b, __retl_efault, 42b, __retl_efault
347 .word 43b, __retl_efault, 44b, __retl_efault
348 .word 45b, __retl_efault, 46b, __retl_efault
349 .word 47b, __retl_efault, 48b, __retl_efault
350 .word 49b, __retl_efault, 50b, __retl_efault
351 .word 51b, __retl_efault, 52b, __retl_efault
352 .word 53b, __retl_efault, 54b, __retl_efault
353 .word 55b, __retl_efault, 56b, __retl_efault
354 .word 57b, __retl_efault, 58b, __retl_efault
355 .word 59b, __retl_efault, 60b, __retl_efault
356 .word 61b, __retl_efault, 62b, __retl_efault
357 .previous