Skip to content

Commit

Permalink
lguest: adapt launcher to per-cpuness
Browse files Browse the repository at this point in the history
This patch makes uses of pread() and pwrite() in lguest launcher
to communicate the vcpu id to the lguest driver. The id is kept in
a thread variable, which means we'll span in the future, vcpus as
threads. But right now, only the infrastructure is out there.

Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
  • Loading branch information
Glauber de Oliveira Costa authored and rustyrussell committed Jan 30, 2008
1 parent badb1e0 commit e3283fa
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions Documentation/lguest/lguest.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ static void *guest_base;
/* The maximum guest physical address allowed, and maximum possible. */
static unsigned long guest_limit, guest_max;

/* a per-cpu variable indicating whose vcpu is currently running */
static unsigned int __thread cpu_id;

/* This is our list of devices. */
struct device_list
{
Expand Down Expand Up @@ -557,7 +560,7 @@ static void wake_parent(int pipefd, int lguest_fd)
else
FD_CLR(-fd - 1, &devices.infds);
} else /* Send LHREQ_BREAK command. */
write(lguest_fd, args, sizeof(args));
pwrite(lguest_fd, args, sizeof(args), cpu_id);
}
}

Expand Down Expand Up @@ -1530,7 +1533,8 @@ static void __attribute__((noreturn)) run_guest(int lguest_fd)
int readval;

/* We read from the /dev/lguest device to run the Guest. */
readval = read(lguest_fd, &notify_addr, sizeof(notify_addr));
readval = pread(lguest_fd, &notify_addr,
sizeof(notify_addr), cpu_id);

/* One unsigned long means the Guest did HCALL_NOTIFY */
if (readval == sizeof(notify_addr)) {
Expand All @@ -1540,7 +1544,7 @@ static void __attribute__((noreturn)) run_guest(int lguest_fd)
/* ENOENT means the Guest died. Reading tells us why. */
} else if (errno == ENOENT) {
char reason[1024] = { 0 };
read(lguest_fd, reason, sizeof(reason)-1);
pread(lguest_fd, reason, sizeof(reason)-1, cpu_id);
errx(1, "%s", reason);
/* ERESTART means that we need to reboot the guest */
} else if (errno == ERESTART) {
Expand All @@ -1550,9 +1554,13 @@ static void __attribute__((noreturn)) run_guest(int lguest_fd)
} else if (errno != EAGAIN)
err(1, "Running guest failed");

/* Only service input on thread for CPU 0. */
if (cpu_id != 0)
continue;

/* Service input, then unset the BREAK to release the Waker. */
handle_input(lguest_fd);
if (write(lguest_fd, args, sizeof(args)) < 0)
if (pwrite(lguest_fd, args, sizeof(args), cpu_id) < 0)
err(1, "Resetting break");
}
}
Expand Down Expand Up @@ -1610,6 +1618,7 @@ int main(int argc, char *argv[])
devices.lastdev = &devices.dev;
devices.next_irq = 1;

cpu_id = 0;
/* We need to know how much memory so we can set up the device
* descriptor and memory pages for the devices as we parse the command
* line. So we quickly look through the arguments to find the amount
Expand Down

0 comments on commit e3283fa

Please sign in to comment.