ia64/linux-2.6.18-xen.hg

view scripts/mod/modpost.h @ 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 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4 #include <string.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <sys/mman.h>
8 #include <fcntl.h>
9 #include <unistd.h>
10 #include <elf.h>
12 #include "elfconfig.h"
14 #if KERNEL_ELFCLASS == ELFCLASS32
16 #define Elf_Ehdr Elf32_Ehdr
17 #define Elf_Shdr Elf32_Shdr
18 #define Elf_Sym Elf32_Sym
19 #define Elf_Addr Elf32_Addr
20 #define Elf_Section Elf32_Section
21 #define ELF_ST_BIND ELF32_ST_BIND
22 #define ELF_ST_TYPE ELF32_ST_TYPE
24 #define Elf_Rel Elf32_Rel
25 #define Elf_Rela Elf32_Rela
26 #define ELF_R_SYM ELF32_R_SYM
27 #define ELF_R_TYPE ELF32_R_TYPE
28 #else
30 #define Elf_Ehdr Elf64_Ehdr
31 #define Elf_Shdr Elf64_Shdr
32 #define Elf_Sym Elf64_Sym
33 #define Elf_Addr Elf64_Addr
34 #define Elf_Section Elf64_Section
35 #define ELF_ST_BIND ELF64_ST_BIND
36 #define ELF_ST_TYPE ELF64_ST_TYPE
38 #define Elf_Rel Elf64_Rel
39 #define Elf_Rela Elf64_Rela
40 #define ELF_R_SYM ELF64_R_SYM
41 #define ELF_R_TYPE ELF64_R_TYPE
42 #endif
44 /* The 64-bit MIPS ELF ABI uses an unusual reloc format. */
45 typedef struct
46 {
47 Elf32_Word r_sym; /* Symbol index */
48 unsigned char r_ssym; /* Special symbol for 2nd relocation */
49 unsigned char r_type3; /* 3rd relocation type */
50 unsigned char r_type2; /* 2nd relocation type */
51 unsigned char r_type1; /* 1st relocation type */
52 } _Elf64_Mips_R_Info;
54 typedef union
55 {
56 Elf64_Xword r_info_number;
57 _Elf64_Mips_R_Info r_info_fields;
58 } _Elf64_Mips_R_Info_union;
60 #define ELF64_MIPS_R_SYM(i) \
61 ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym)
63 #if KERNEL_ELFDATA != HOST_ELFDATA
65 static inline void __endian(const void *src, void *dest, unsigned int size)
66 {
67 unsigned int i;
68 for (i = 0; i < size; i++)
69 ((unsigned char*)dest)[i] = ((unsigned char*)src)[size - i-1];
70 }
72 #define TO_NATIVE(x) \
73 ({ \
74 typeof(x) __x; \
75 __endian(&(x), &(__x), sizeof(__x)); \
76 __x; \
77 })
79 #else /* endianness matches */
81 #define TO_NATIVE(x) (x)
83 #endif
85 #define NOFAIL(ptr) do_nofail((ptr), #ptr)
86 void *do_nofail(void *ptr, const char *expr);
88 struct buffer {
89 char *p;
90 int pos;
91 int size;
92 };
94 void __attribute__((format(printf, 2, 3)))
95 buf_printf(struct buffer *buf, const char *fmt, ...);
97 void
98 buf_write(struct buffer *buf, const char *s, int len);
100 struct module {
101 struct module *next;
102 const char *name;
103 int gpl_compatible;
104 struct symbol *unres;
105 int seen;
106 int skip;
107 int has_init;
108 int has_cleanup;
109 struct buffer dev_table_buf;
110 char srcversion[25];
111 };
113 struct elf_info {
114 unsigned long size;
115 Elf_Ehdr *hdr;
116 Elf_Shdr *sechdrs;
117 Elf_Sym *symtab_start;
118 Elf_Sym *symtab_stop;
119 Elf_Section export_sec;
120 Elf_Section export_unused_sec;
121 Elf_Section export_gpl_sec;
122 Elf_Section export_unused_gpl_sec;
123 Elf_Section export_gpl_future_sec;
124 const char *strtab;
125 char *modinfo;
126 unsigned int modinfo_len;
127 };
129 /* file2alias.c */
130 void handle_moddevtable(struct module *mod, struct elf_info *info,
131 Elf_Sym *sym, const char *symname);
132 void add_moddevtable(struct buffer *buf, struct module *mod);
134 /* sumversion.c */
135 void maybe_frob_rcs_version(const char *modfilename,
136 char *version,
137 void *modinfo,
138 unsigned long modinfo_offset);
139 void get_src_version(const char *modname, char sum[], unsigned sumlen);
141 /* from modpost.c */
142 void *grab_file(const char *filename, unsigned long *size);
143 char* get_next_line(unsigned long *pos, void *file, unsigned long size);
144 void release_file(void *file, unsigned long size);
146 void fatal(const char *fmt, ...);
147 void warn(const char *fmt, ...);