diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-07-17 13:33:02 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-07-17 13:33:02 +0000 |
commit | 0657eaa748d04883fe9deef188165ecc53fd3d08 (patch) | |
tree | 8472196cf5c94cd36345c53eac0a3af8a1b752dc | |
parent | fa3e395ae6efa68851e7a0bb50ee791c74ca491d (diff) | |
download | xen-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.c | 8 | ||||
-rw-r--r-- | tools/internal/xi_destroy.c | 11 | ||||
-rw-r--r-- | tools/internal/xi_start.c | 11 | ||||
-rw-r--r-- | tools/internal/xi_stop.c | 11 | ||||
-rw-r--r-- | xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c | 32 |
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; } |