aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-07-17 13:33:02 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-07-17 13:33:02 +0000
commit0657eaa748d04883fe9deef188165ecc53fd3d08 (patch)
tree8472196cf5c94cd36345c53eac0a3af8a1b752dc
parentfa3e395ae6efa68851e7a0bb50ee791c74ca491d (diff)
downloadxen-0657eaa748d04883fe9deef188165ecc53fd3d08.tar.gz
xen-0657eaa748d04883fe9deef188165ecc53fd3d08.tar.bz2
xen-0657eaa748d04883fe9deef188165ecc53fd3d08.zip
bitkeeper revision 1.358.1.1 (3f16a58eCfq6ZxRU1cDvl3KdW6uV4g)
network.c, xi_stop.c, xi_start.c, xi_destroy.c, xi_build.c: Bug fixes and clean ups.
-rw-r--r--tools/internal/xi_build.c8
-rw-r--r--tools/internal/xi_destroy.c11
-rw-r--r--tools/internal/xi_start.c11
-rw-r--r--tools/internal/xi_stop.c11
-rw-r--r--xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c32
5 files changed, 58 insertions, 15 deletions
diff --git a/tools/internal/xi_build.c b/tools/internal/xi_build.c
index 8c1cdb91da..b6c30d2a64 100644
--- a/tools/internal/xi_build.c
+++ b/tools/internal/xi_build.c
@@ -361,7 +361,13 @@ int main(int argc, char **argv)
return 1;
}
- domain_id = atol(argv[1]);
+ domain_id = atoi(argv[1]);
+ if ( domain_id == 0 )
+ {
+ ERROR("Did you really mean domain 0?");
+ return 1;
+ }
+
if ( (tot_pages = get_tot_pages(domain_id)) < 0 )
{
PERROR("Could not find total pages for domain");
diff --git a/tools/internal/xi_destroy.c b/tools/internal/xi_destroy.c
index d6b7a09763..b3a975e73f 100644
--- a/tools/internal/xi_destroy.c
+++ b/tools/internal/xi_destroy.c
@@ -21,7 +21,7 @@ static int kill_domain(int dom_id, int force)
int main(int argc, char **argv)
{
- int ret;
+ int ret, dom;
if ( argv[0] != NULL )
argv0 = argv[0];
@@ -37,7 +37,14 @@ int main(int argc, char **argv)
if ( (argc == 3) && strcmp("-f", argv[1]) )
goto usage;
- ret = kill_domain(atoi(argv[argc-1]), argc == 3);
+ dom = atoi(argv[argc-1]);
+ if ( dom == 0 )
+ {
+ ERROR("Did you really mean domain 0?");
+ return 1;
+ }
+
+ ret = kill_domain(dom, argc == 3);
return (ret != 0) ? 1 : 0;
}
diff --git a/tools/internal/xi_start.c b/tools/internal/xi_start.c
index b21cc84f9f..e04fc8b502 100644
--- a/tools/internal/xi_start.c
+++ b/tools/internal/xi_start.c
@@ -20,7 +20,7 @@ static int start_domain(int id)
int main(int argc, char **argv)
{
- int rc;
+ int rc, dom;
if ( argv[0] != NULL )
argv0 = argv[0];
@@ -31,7 +31,14 @@ int main(int argc, char **argv)
return 1;
}
- rc = start_domain(atol(argv[1]));
+ dom = atoi(argv[1]);
+ if ( dom == 0 )
+ {
+ ERROR("Did you really mean domain 0?");
+ return 1;
+ }
+
+ rc = start_domain(dom);;
return (rc != 0) ? 1 : 0;
}
diff --git a/tools/internal/xi_stop.c b/tools/internal/xi_stop.c
index 5cd732df3a..1c10fe4eb8 100644
--- a/tools/internal/xi_stop.c
+++ b/tools/internal/xi_stop.c
@@ -19,7 +19,7 @@ static int stop_domain(int id)
int main(int argc, char **argv)
{
- int rc;
+ int rc, dom;
if ( argv[0] != NULL )
argv0 = argv[0];
@@ -30,7 +30,14 @@ int main(int argc, char **argv)
return 1;
}
- rc = stop_domain(atol(argv[1]));
+ dom = atoi(argv[1]);
+ if ( dom == 0 )
+ {
+ ERROR("Did you really mean domain 0?");
+ return 1;
+ }
+
+ rc = stop_domain(dom);
return (rc != 0) ? 1 : 0;
}
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c
index a125695e54..c3479b64c0 100644
--- a/xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c
+++ b/xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c
@@ -47,6 +47,12 @@ static void cleanup_module(void);
static struct list_head dev_list;
+/*
+ * Needed because network_close() is not properly implemented yet. So
+ * an open after a close needs to do much less than the initial open.
+ */
+static int opened_once_already = 0;
+
struct net_private
{
struct list_head list;
@@ -100,6 +106,13 @@ static int network_open(struct net_device *dev)
struct net_private *np = dev->priv;
int i, error = 0;
+ if ( opened_once_already )
+ {
+ memset(&np->stats, 0, sizeof(np->stats));
+ netif_start_queue(dev);
+ return 0;
+ }
+
np->rx_resp_cons = np->tx_resp_cons = np->tx_full = 0;
memset(&np->stats, 0, sizeof(np->stats));
spin_lock_init(&np->tx_lock);
@@ -150,6 +163,8 @@ static int network_open(struct net_device *dev)
MOD_INC_USE_COUNT;
+ opened_once_already = 1;
+
return 0;
fail:
@@ -228,15 +243,16 @@ static void network_alloc_rx_buffers(struct net_device *dev)
virt_to_machine(get_ppte(skb->head));
}
- np->net_idx->rx_req_prod = i;
-
- np->net_idx->rx_event = RX_RING_INC(np->rx_resp_cons);
-
/*
* We may have allocated buffers which have entries outstanding in
* the page update queue -- make sure we flush those first!
*/
flush_page_update_queue();
+
+ np->net_idx->rx_req_prod = i;
+
+ np->net_idx->rx_event = RX_RING_INC(np->rx_resp_cons);
+
HYPERVISOR_net_update();
}
@@ -385,9 +401,6 @@ int network_close(struct net_device *dev)
{
netif_stop_queue(dev);
- free_irq(NET_RX_IRQ, dev);
- free_irq(NET_TX_IRQ, dev);
-
/*
* XXXX This cannot be done safely until be have a proper interface
* for setting up and tearing down virtual interfaces on the fly.
@@ -395,12 +408,15 @@ int network_close(struct net_device *dev)
* no sensible way of retrieving them.
*/
#if 0
+ free_irq(NET_RX_IRQ, dev);
+ free_irq(NET_TX_IRQ, dev);
+
network_free_rx_buffers(dev);
kfree(np->net_ring->rx_ring);
kfree(np->net_ring->tx_ring);
-#endif
MOD_DEC_USE_COUNT;
+#endif
return 0;
}