Skip to content

Commit

Permalink
Remove fixed limit on number of guests, and lguests array.
Browse files Browse the repository at this point in the history
Back when we had all the Guest state in the switcher, we had a fixed
array of them.  This is no longer necessary.

If we switch the network code to using random_ether_addr (46 bits is
enough to avoid clashes), we can get rid of the concept of "guest id"
altogether.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
  • Loading branch information
Rusty Russell committed Oct 23, 2007
1 parent 3c6b5bf commit 48245cc
Show file tree
Hide file tree
Showing 7 changed files with 14 additions and 45 deletions.
14 changes: 0 additions & 14 deletions drivers/lguest/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,6 @@ static struct {
DEFINE_MUTEX(lguest_lock);
static DEFINE_PER_CPU(struct lguest *, last_guest);

/* FIXME: Make dynamic. */
#define MAX_LGUEST_GUESTS 16
struct lguest lguests[MAX_LGUEST_GUESTS];

/* Offset from where switcher.S was compiled to where we've copied it */
static unsigned long switcher_offset(void)
{
Expand Down Expand Up @@ -660,16 +656,6 @@ int run_guest(struct lguest *lg, unsigned long __user *user)
* deliver_trap() and demand_page(). After all those, we'll be ready to
* examine the Switcher, and our philosophical understanding of the Host/Guest
* duality will be complete. :*/

int find_free_guest(void)
{
unsigned int i;
for (i = 0; i < MAX_LGUEST_GUESTS; i++)
if (!lguests[i].tsk)
return i;
return -1;
}

static void adjust_pge(void *on)
{
if (on)
Expand Down
4 changes: 1 addition & 3 deletions drivers/lguest/hypercalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,9 +225,7 @@ static void initialize(struct lguest *lg)
/* We tell the Guest that it can't use the top 4MB of virtual
* addresses used by the Switcher. */
|| put_user(4U*1024*1024, &lg->lguest_data->reserve_mem)
|| put_user(tsc_speed, &lg->lguest_data->tsc_khz)
/* We also give the Guest a unique id, as used in lguest_net.c. */
|| put_user(lg->guestid, &lg->lguest_data->guestid))
|| put_user(tsc_speed, &lg->lguest_data->tsc_khz))
kill_guest(lg, "bad guest page %p", lg->lguest_data);

/* We write the current time into the Guest's data page once now. */
Expand Down
10 changes: 5 additions & 5 deletions drivers/lguest/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ int bind_dma(struct lguest *lg,
lg->dma[i].num_dmas = numdmas;
lg->dma[i].next_dma = 0;
lg->dma[i].key = key;
lg->dma[i].guestid = lg->guestid;
lg->dma[i].owner = lg;
lg->dma[i].interrupt = interrupt;

/* Now we add it to the hash table: the position
Expand Down Expand Up @@ -412,7 +412,7 @@ static int dma_transfer(struct lguest *srclg,

/* From the "struct lguest_dma_info" we found in the hash, grab the
* Guest. */
dstlg = &lguests[dst->guestid];
dstlg = dst->owner;
/* Read in the source "struct lguest_dma" handed to SEND_DMA. */
lgread(srclg, &src_dma, udma, sizeof(src_dma));

Expand Down Expand Up @@ -506,8 +506,8 @@ void send_dma(struct lguest *lg, unsigned long ukey, unsigned long udma)
struct lguest_dma_info *i;
/* Look through the hash for other Guests. */
list_for_each_entry(i, &dma_hash[hash(&key)], list) {
/* Don't send to ourselves. */
if (i->guestid == lg->guestid)
/* Don't send to ourselves (would deadlock). */
if (i->owner->mm == lg->mm)
continue;
if (!key_eq(&key, &i->key))
continue;
Expand Down Expand Up @@ -594,7 +594,7 @@ unsigned long get_dma_buffer(struct lguest *lg,
* send to its own Guest for the moment, so the entry must be for this
* Guest) */
list_for_each_entry(i, &dma_hash[hash(&key)], list) {
if (key_eq(&key, &i->key) && i->guestid == lg->guestid) {
if (key_eq(&key, &i->key) && i->owner == lg) {
unsigned int j;
/* Look through the registered DMA array for an
* available buffer. */
Expand Down
5 changes: 1 addition & 4 deletions drivers/lguest/lg.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ struct lguest_dma_info
struct list_head list;
union futex_key key;
unsigned long dmas;
struct lguest *owner;
u16 next_dma;
u16 num_dmas;
u16 guestid;
u8 interrupt; /* 0 when not registered */
};

Expand Down Expand Up @@ -140,7 +140,6 @@ struct lguest
struct lguest_data __user *lguest_data;
struct task_struct *tsk;
struct mm_struct *mm; /* == tsk->mm, but that becomes NULL on exit */
u16 guestid;
u32 pfn_limit;
/* This provides the offset to the base of guest-physical
* memory in the Launcher. */
Expand Down Expand Up @@ -195,15 +194,13 @@ struct lguest
DECLARE_BITMAP(irqs_pending, LGUEST_IRQS);
};

extern struct lguest lguests[];
extern struct mutex lguest_lock;

/* core.c: */
u32 lgread_u32(struct lguest *lg, unsigned long addr);
void lgwrite_u32(struct lguest *lg, unsigned long addr, u32 val);
void lgread(struct lguest *lg, void *buf, unsigned long addr, unsigned len);
void lgwrite(struct lguest *lg, unsigned long, const void *buf, unsigned len);
int find_free_guest(void);
int lguest_address_ok(const struct lguest *lg,
unsigned long addr, unsigned long len);
int run_guest(struct lguest *lg, unsigned long __user *user);
Expand Down
17 changes: 6 additions & 11 deletions drivers/lguest/lguest_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,11 +167,11 @@ static int initialize(struct file *file, const u32 __user *input)
/* "struct lguest" contains everything we (the Host) know about a
* Guest. */
struct lguest *lg;
int err, i;
int err;
u32 args[5];

/* We grab the Big Lguest lock, which protects the global array
* "lguests" and multiple simultaneous initializations. */
/* We grab the Big Lguest lock, which protects against multiple
* simultaneous initializations. */
mutex_lock(&lguest_lock);
/* You can't initialize twice! Close the device and start again... */
if (file->private_data) {
Expand All @@ -184,18 +184,13 @@ static int initialize(struct file *file, const u32 __user *input)
goto unlock;
}

/* Find an unused guest. */
i = find_free_guest();
if (i < 0) {
err = -ENOSPC;
lg = kzalloc(sizeof(*lg), GFP_KERNEL);
if (!lg) {
err = -ENOMEM;
goto unlock;
}
/* OK, we have an index into the "lguest" array: "lg" is a convenient
* pointer. */
lg = &lguests[i];

/* Populate the easy fields of our "struct lguest" */
lg->guestid = i;
lg->mem_base = (void __user *)(long)args[0];
lg->pfn_limit = args[1];
lg->page_offset = args[4];
Expand Down
7 changes: 1 addition & 6 deletions drivers/net/lguest_net.c
Original file line number Diff line number Diff line change
Expand Up @@ -463,12 +463,7 @@ static int lguestnet_probe(struct lguest_device *lgdev)
/* Ethernet defaults with some changes */
ether_setup(dev);
dev->set_mac_address = NULL;

dev->dev_addr[0] = 0x02; /* set local assignment bit (IEEE802) */
dev->dev_addr[1] = 0x00;
memcpy(&dev->dev_addr[2], &lguest_data.guestid, 2);
dev->dev_addr[4] = 0x00;
dev->dev_addr[5] = 0x00;
random_ether_addr(dev->dev_addr);

dev->open = lguestnet_open;
dev->stop = lguestnet_close;
Expand Down
2 changes: 0 additions & 2 deletions include/linux/lguest.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,6 @@ struct lguest_data
/* Fields initialized by the Host at boot: */
/* Memory not to try to access */
unsigned long reserve_mem;
/* ID of this Guest (used by network driver to set ethernet address) */
u16 guestid;
/* KHz for the TSC clock. */
u32 tsc_khz;

Expand Down

0 comments on commit 48245cc

Please sign in to comment.