mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
Unbreak large mem support by removing kqemu
kqemu introduces a number of restrictions on the i386 target. The worst is that it prevents large memory from working in the default build. Furthermore, kqemu is fundamentally flawed in a number of ways. It relies on the TSC as a time source which will not be reliable on a multiple processor system in userspace. Since most modern processors are multicore, this severely limits the utility of kqemu. kvm is a viable alternative for people looking to accelerate qemu and has the benefit of being supported by the upstream Linux kernel. If someone can implement work arounds to remove the restrictions introduced by kqemu, I'm happy to avoid and/or revert this patch. N.B. kqemu will still function in the 0.11 series but this patch removes it from the 0.12 series. Paul, please Ack or Nack this patch. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
0953a80f04
commit
4a1418e07b
24 changed files with 8 additions and 1722 deletions
121
osdep.c
121
osdep.c
|
@ -88,119 +88,6 @@ void qemu_vfree(void *ptr)
|
|||
|
||||
#else
|
||||
|
||||
#if defined(CONFIG_KQEMU)
|
||||
|
||||
#ifdef __OpenBSD__
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mount.h>
|
||||
#else
|
||||
#ifndef __FreeBSD__
|
||||
#include <sys/vfs.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
static void *kqemu_vmalloc(size_t size)
|
||||
{
|
||||
static int phys_ram_fd = -1;
|
||||
static int phys_ram_size = 0;
|
||||
void *ptr;
|
||||
|
||||
/* no need (?) for a dummy file on OpenBSD/FreeBSD */
|
||||
#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
|
||||
int map_anon = MAP_ANON;
|
||||
#else
|
||||
int map_anon = 0;
|
||||
const char *tmpdir;
|
||||
char phys_ram_file[1024];
|
||||
#ifdef CONFIG_SOLARIS
|
||||
struct statvfs stfs;
|
||||
#else
|
||||
struct statfs stfs;
|
||||
#endif
|
||||
|
||||
if (!size) {
|
||||
abort ();
|
||||
}
|
||||
|
||||
if (phys_ram_fd < 0) {
|
||||
tmpdir = getenv("QEMU_TMPDIR");
|
||||
if (!tmpdir)
|
||||
#ifdef CONFIG_SOLARIS
|
||||
tmpdir = "/tmp";
|
||||
if (statvfs(tmpdir, &stfs) == 0) {
|
||||
#else
|
||||
tmpdir = "/dev/shm";
|
||||
if (statfs(tmpdir, &stfs) == 0) {
|
||||
#endif
|
||||
int64_t free_space;
|
||||
int ram_mb;
|
||||
|
||||
free_space = (int64_t)stfs.f_bavail * stfs.f_bsize;
|
||||
if ((ram_size + 8192 * 1024) >= free_space) {
|
||||
ram_mb = (ram_size / (1024 * 1024));
|
||||
fprintf(stderr,
|
||||
"You do not have enough space in '%s' for the %d MB of QEMU virtual RAM.\n",
|
||||
tmpdir, ram_mb);
|
||||
if (strcmp(tmpdir, "/dev/shm") == 0) {
|
||||
fprintf(stderr, "To have more space available provided you have enough RAM and swap, do as root:\n"
|
||||
"mount -o remount,size=%dm /dev/shm\n",
|
||||
ram_mb + 16);
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
"Use the '-m' option of QEMU to diminish the amount of virtual RAM or use the\n"
|
||||
"QEMU_TMPDIR environment variable to set another directory where the QEMU\n"
|
||||
"temporary RAM file will be opened.\n");
|
||||
}
|
||||
fprintf(stderr, "Or disable the accelerator module with -no-kqemu\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/qemuXXXXXX",
|
||||
tmpdir);
|
||||
phys_ram_fd = mkstemp(phys_ram_file);
|
||||
if (phys_ram_fd < 0) {
|
||||
fprintf(stderr,
|
||||
"warning: could not create temporary file in '%s'.\n"
|
||||
"Use QEMU_TMPDIR to select a directory in a tmpfs filesystem.\n"
|
||||
"Using '/tmp' as fallback.\n",
|
||||
tmpdir);
|
||||
snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/qemuXXXXXX",
|
||||
"/tmp");
|
||||
phys_ram_fd = mkstemp(phys_ram_file);
|
||||
if (phys_ram_fd < 0) {
|
||||
fprintf(stderr, "Could not create temporary memory file '%s'\n",
|
||||
phys_ram_file);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
unlink(phys_ram_file);
|
||||
}
|
||||
size = (size + 4095) & ~4095;
|
||||
ftruncate(phys_ram_fd, phys_ram_size + size);
|
||||
#endif /* !(__OpenBSD__ || __FreeBSD__ || __DragonFly__) */
|
||||
ptr = mmap(NULL,
|
||||
size,
|
||||
PROT_WRITE | PROT_READ, map_anon | MAP_SHARED,
|
||||
phys_ram_fd, phys_ram_size);
|
||||
if (ptr == MAP_FAILED) {
|
||||
fprintf(stderr, "Could not map physical memory\n");
|
||||
exit(1);
|
||||
}
|
||||
phys_ram_size += size;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static void kqemu_vfree(void *ptr)
|
||||
{
|
||||
/* may be useful some day, but currently we do not need to free */
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void *qemu_memalign(size_t alignment, size_t size)
|
||||
{
|
||||
#if defined(_POSIX_C_SOURCE)
|
||||
|
@ -220,19 +107,11 @@ void *qemu_memalign(size_t alignment, size_t size)
|
|||
/* alloc shared memory pages */
|
||||
void *qemu_vmalloc(size_t size)
|
||||
{
|
||||
#if defined(CONFIG_KQEMU)
|
||||
if (kqemu_allowed)
|
||||
return kqemu_vmalloc(size);
|
||||
#endif
|
||||
return qemu_memalign(getpagesize(), size);
|
||||
}
|
||||
|
||||
void qemu_vfree(void *ptr)
|
||||
{
|
||||
#if defined(CONFIG_KQEMU)
|
||||
if (kqemu_allowed)
|
||||
kqemu_vfree(ptr);
|
||||
#endif
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue