Remove fixed limit on number of guests, and lguests array.

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>
diff --git a/drivers/lguest/core.c b/drivers/lguest/core.c
index eb95860..ca581ef 100644
--- a/drivers/lguest/core.c
+++ b/drivers/lguest/core.c
@@ -47,10 +47,6 @@
 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)
 {
@@ -660,16 +656,6 @@
  * 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)
diff --git a/drivers/lguest/hypercalls.c b/drivers/lguest/hypercalls.c
index 02e67b4..8bde209 100644
--- a/drivers/lguest/hypercalls.c
+++ b/drivers/lguest/hypercalls.c
@@ -225,9 +225,7 @@
 	    /* 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. */
diff --git a/drivers/lguest/io.c b/drivers/lguest/io.c
index 3a84533..0e842e9 100644
--- a/drivers/lguest/io.c
+++ b/drivers/lguest/io.c
@@ -212,7 +212,7 @@
 			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
@@ -412,7 +412,7 @@
 
 	/* 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));
 
@@ -506,8 +506,8 @@
 		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;
@@ -594,7 +594,7 @@
 	 * 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. */
diff --git a/drivers/lguest/lg.h b/drivers/lguest/lg.h
index 54f2c24..c9d1dc2 100644
--- a/drivers/lguest/lg.h
+++ b/drivers/lguest/lg.h
@@ -51,9 +51,9 @@
 	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 */
 };
 
@@ -140,7 +140,6 @@
 	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. */
@@ -195,7 +194,6 @@
 	DECLARE_BITMAP(irqs_pending, LGUEST_IRQS);
 };
 
-extern struct lguest lguests[];
 extern struct mutex lguest_lock;
 
 /* core.c: */
@@ -203,7 +201,6 @@
 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);
diff --git a/drivers/lguest/lguest_user.c b/drivers/lguest/lguest_user.c
index 816d4d1..5632ed8 100644
--- a/drivers/lguest/lguest_user.c
+++ b/drivers/lguest/lguest_user.c
@@ -167,11 +167,11 @@
 	/* "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) {
@@ -184,18 +184,13 @@
 		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];
diff --git a/drivers/net/lguest_net.c b/drivers/net/lguest_net.c
index abce2ee..e255476 100644
--- a/drivers/net/lguest_net.c
+++ b/drivers/net/lguest_net.c
@@ -463,12 +463,7 @@
 	/* 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;
diff --git a/include/linux/lguest.h b/include/linux/lguest.h
index d4d94a1..8e959de 100644
--- a/include/linux/lguest.h
+++ b/include/linux/lguest.h
@@ -41,8 +41,6 @@
 /* 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;