diff options
author | smh22@boulderdash.cl.cam.ac.uk <smh22@boulderdash.cl.cam.ac.uk> | 2003-02-14 12:00:08 +0000 |
---|---|---|
committer | smh22@boulderdash.cl.cam.ac.uk <smh22@boulderdash.cl.cam.ac.uk> | 2003-02-14 12:00:08 +0000 |
commit | ce495752c7c35c6c9f9d2cdf47094cf18dbfd3f6 (patch) | |
tree | ef015409827b05c8034c626585975d4fa401c710 | |
parent | c5ba4c88f655e0ca2c727956bf51dfc06e58b442 (diff) | |
download | xen-ce495752c7c35c6c9f9d2cdf47094cf18dbfd3f6.tar.gz xen-ce495752c7c35c6c9f9d2cdf47094cf18dbfd3f6.tar.bz2 xen-ce495752c7c35c6c9f9d2cdf47094cf18dbfd3f6.zip |
bitkeeper revision 1.22.5.2 (3e4cda483kJoy5YzPXw3Pl7VBmCgGg)
compile-time support (!) for mounting local root
-rw-r--r-- | .rootkeys | 1 | ||||
-rw-r--r-- | xen-2.4.16/common/domain.c | 4 | ||||
-rw-r--r-- | xenolinux-2.4.16-sparse/arch/xeno/drivers/block/block.c | 392 |
3 files changed, 4 insertions, 393 deletions
@@ -275,7 +275,6 @@ 3ddb79b8L4xnwrcvWk6nAbgKVbNkSA xenolinux-2.4.16-sparse/arch/xeno/config.in 3ddb79b7v_Be34as7_mlzFlw65hOjQ xenolinux-2.4.16-sparse/arch/xeno/defconfig 3ddb79b7KUvtx0knQJoRaBDZQeNidg xenolinux-2.4.16-sparse/arch/xeno/drivers/block/Makefile -3ddb79b6Rc0uAOGFthIFxq1KGWZ_Iw xenolinux-2.4.16-sparse/arch/xeno/drivers/block/block.c 3e4a8cb7JECr--r1ipnrkd7NKdbUqQ xenolinux-2.4.16-sparse/arch/xeno/drivers/block/xl_block.c 3e4a8cb7SLWsLTXQjv7ng6-3hL4pCA xenolinux-2.4.16-sparse/arch/xeno/drivers/block/xl_block_test.c 3ddb79b7LLVJBGynxHSOh9A9l97sug xenolinux-2.4.16-sparse/arch/xeno/drivers/console/Makefile diff --git a/xen-2.4.16/common/domain.c b/xen-2.4.16/common/domain.c index 61323d764d..234c3e910f 100644 --- a/xen-2.4.16/common/domain.c +++ b/xen-2.4.16/common/domain.c @@ -760,7 +760,11 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params) unsigned char nfsroot[70]; snprintf(nfsroot, 70, opt_nfsroot, dom); snprintf(boot, 200, +#if 1 " root=/dev/nfs ip=%s:%s:%s:%s::eth0:off nfsroot=%s", +#else + " ro root=/dev/xhda7 ip=%s:%s:%s:%s::eth0:off arfle=%s", +#endif quad_to_str(opt_ipbase + dom, ipbase), quad_to_str(opt_nfsserv, nfsserv), quad_to_str(opt_gateway, gateway), diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/block/block.c b/xenolinux-2.4.16-sparse/arch/xeno/drivers/block/block.c deleted file mode 100644 index bf7d416dff..0000000000 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/block/block.c +++ /dev/null @@ -1,392 +0,0 @@ -/****************************************************************************** - * block.c - * - * Virtual block driver for XenoLinux. - * - * adapted from network.c - */ - -#include <linux/config.h> -#include <linux/module.h> - -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/slab.h> -#include <linux/string.h> -#include <linux/errno.h> - -#include <asm/hypervisor-ifs/block.h> - -#ifdef UNDEFINED - -#include <linux/netdevice.h> -#include <linux/inetdevice.h> -#include <linux/etherdevice.h> -#include <linux/skbuff.h> -#include <linux/init.h> - -#include <net/sock.h> - -#define BLK_TX_IRQ _EVENT_BLK_TX -#define BLK_RX_IRQ _EVENT_BLK_RX - -#define TX_MAX_ENTRIES (TX_RING_SIZE - 2) -#define RX_MAX_ENTRIES (RX_RING_SIZE - 2) - -#define TX_RING_INC(_i) (((_i)+1) & (TX_RING_SIZE-1)) -#define RX_RING_INC(_i) (((_i)+1) & (RX_RING_SIZE-1)) -#define TX_RING_ADD(_i,_j) (((_i)+(_j)) & (TX_RING_SIZE-1)) -#define RX_RING_ADD(_i,_j) (((_i)+(_j)) & (RX_RING_SIZE-1)) - -#define RX_BUF_SIZE 1600 /* Ethernet MTU + plenty of slack! */ - - - -int network_probe(struct net_device *dev); -static int network_open(struct net_device *dev); -static int network_start_xmit(struct sk_buff *skb, struct net_device *dev); -static int network_close(struct net_device *dev); -static struct net_device_stats *network_get_stats(struct net_device *dev); -static void network_rx_int(int irq, void *dev_id, struct pt_regs *ptregs); -static void network_tx_int(int irq, void *dev_id, struct pt_regs *ptregs); -static void network_tx_buf_gc(struct net_device *dev); -static void network_alloc_rx_buffers(struct net_device *dev); -static void network_free_rx_buffers(struct net_device *dev); - -static struct net_device dev_net_xeno; - -/* - * RX RING: RX_IDX <= rx_cons <= rx_prod - * TX RING: TX_IDX <= tx_cons <= tx_prod - * (*_IDX allocated privately here, *_cons & *_prod shared with hypervisor) - */ -struct net_private -{ - struct net_device_stats stats; - struct sk_buff **tx_skb_ring; - struct sk_buff **rx_skb_ring; - atomic_t tx_entries; - unsigned int rx_idx, tx_idx, tx_full; - net_ring_t *net_ring; - spinlock_t tx_lock; -}; - - -int __init network_probe(struct net_device *dev) -{ - SET_MODULE_OWNER(dev); - - memcpy(dev->dev_addr, "\xFE\xFD\x00\x00\x00\x00", 6); - - dev->open = network_open; - dev->hard_start_xmit = network_start_xmit; - dev->stop = network_close; - dev->get_stats = network_get_stats; - - ether_setup(dev); - - return 0; -} - - -static int network_open(struct net_device *dev) -{ - struct net_private *np; - int error; - - np = kmalloc(sizeof(struct net_private), GFP_KERNEL); - if ( np == NULL ) - { - printk(KERN_WARNING "%s: No memory for private data\n", dev->name); - return -ENOMEM; - } - memset(np, 0, sizeof(struct net_private)); - dev->priv = np; - - spin_lock_init(&np->tx_lock); - - atomic_set(&np->tx_entries, 0); - - np->net_ring = start_info.net_rings; - np->net_ring->tx_prod = np->net_ring->tx_cons = np->net_ring->tx_event = 0; - np->net_ring->rx_prod = np->net_ring->rx_cons = np->net_ring->rx_event = 0; - np->net_ring->tx_ring = NULL; - np->net_ring->rx_ring = NULL; - - np->tx_skb_ring = kmalloc(TX_RING_SIZE * sizeof(struct sk_buff *), - GFP_KERNEL); - np->rx_skb_ring = kmalloc(RX_RING_SIZE * sizeof(struct sk_buff *), - GFP_KERNEL); - np->net_ring->tx_ring = kmalloc(TX_RING_SIZE * sizeof(tx_entry_t), - GFP_KERNEL); - np->net_ring->rx_ring = kmalloc(RX_RING_SIZE * sizeof(rx_entry_t), - GFP_KERNEL); - if ( (np->tx_skb_ring == NULL) || (np->rx_skb_ring == NULL) || - (np->net_ring->tx_ring == NULL) || (np->net_ring->rx_ring == NULL) ) - { - printk(KERN_WARNING "%s; Could not allocate ring memory\n", dev->name); - error = -ENOBUFS; - goto fail; - } - - network_alloc_rx_buffers(dev); - - error = request_irq(NET_RX_IRQ, network_rx_int, 0, "net-rx", dev); - if ( error ) - { - printk(KERN_WARNING "%s: Could not allocate receive interrupt\n", - dev->name); - goto fail; - } - - error = request_irq(NET_TX_IRQ, network_tx_int, 0, "net-tx", dev); - if ( error ) - { - printk(KERN_WARNING "%s: Could not allocate transmit interrupt\n", - dev->name); - free_irq(NET_RX_IRQ, dev); - goto fail; - } - - printk("XenoLinux Virtual Network Driver installed as %s\n", dev->name); - - netif_start_queue(dev); - - MOD_INC_USE_COUNT; - - return 0; - - fail: - if ( np->net_ring->rx_ring ) kfree(np->net_ring->rx_ring); - if ( np->net_ring->tx_ring ) kfree(np->net_ring->tx_ring); - if ( np->rx_skb_ring ) kfree(np->rx_skb_ring); - if ( np->tx_skb_ring ) kfree(np->tx_skb_ring); - kfree(np); - return error; -} - - -static void network_tx_buf_gc(struct net_device *dev) -{ - unsigned int i; - struct net_private *np = dev->priv; - struct sk_buff *skb; - unsigned long flags; - - spin_lock_irqsave(&np->tx_lock, flags); - - for ( i = np->tx_idx; i != np->net_ring->tx_cons; i = TX_RING_INC(i) ) - { - skb = np->tx_skb_ring[i]; - dev_kfree_skb_any(skb); - atomic_dec(&np->tx_entries); - } - - np->tx_idx = i; - - if ( np->tx_full && (atomic_read(&np->tx_entries) < TX_MAX_ENTRIES) ) - { - np->tx_full = 0; - netif_wake_queue(dev); - } - - spin_unlock_irqrestore(&np->tx_lock, flags); -} - - -static void network_alloc_rx_buffers(struct net_device *dev) -{ - unsigned int i; - struct net_private *np = dev->priv; - struct sk_buff *skb; - unsigned int end = RX_RING_ADD(np->rx_idx, RX_MAX_ENTRIES); - - for ( i = np->net_ring->rx_prod; i != end; i = RX_RING_INC(i) ) - { - skb = dev_alloc_skb(RX_BUF_SIZE); - if ( skb == NULL ) break; - skb->dev = dev; - skb_reserve(skb, 2); /* word align the IP header */ - np->rx_skb_ring[i] = skb; - np->net_ring->rx_ring[i].addr = (unsigned long)skb->data; - np->net_ring->rx_ring[i].size = RX_BUF_SIZE - 16; /* arbitrary */ - } - - np->net_ring->rx_prod = i; - - np->net_ring->rx_event = RX_RING_INC(np->rx_idx); - - HYPERVISOR_net_update(); -} - - -static void network_free_rx_buffers(struct net_device *dev) -{ - unsigned int i; - struct net_private *np = dev->priv; - struct sk_buff *skb; - - for ( i = np->rx_idx; i != np->net_ring->rx_prod; i = RX_RING_INC(i) ) - { - skb = np->rx_skb_ring[i]; - dev_kfree_skb(skb); - } -} - - -static int network_start_xmit(struct sk_buff *skb, struct net_device *dev) -{ - unsigned int i; - struct net_private *np = (struct net_private *)dev->priv; - - if ( np->tx_full ) - { - printk(KERN_WARNING "%s: full queue wasn't stopped!\n", dev->name); - netif_stop_queue(dev); - return -ENOBUFS; - } - - i = np->net_ring->tx_prod; - np->tx_skb_ring[i] = skb; - np->net_ring->tx_ring[i].addr = (unsigned long)skb->data; - np->net_ring->tx_ring[i].size = skb->len; - np->net_ring->tx_prod = TX_RING_INC(i); - atomic_inc(&np->tx_entries); - - np->stats.tx_bytes += skb->len; - np->stats.tx_packets++; - - spin_lock_irq(&np->tx_lock); - if ( atomic_read(&np->tx_entries) >= TX_MAX_ENTRIES ) - { - np->tx_full = 1; - netif_stop_queue(dev); - np->net_ring->tx_event = TX_RING_ADD(np->tx_idx, - atomic_read(&np->tx_entries) >> 1); - } - else - { - /* Avoid unnecessary tx interrupts. */ - np->net_ring->tx_event = TX_RING_INC(np->net_ring->tx_prod); - } - spin_unlock_irq(&np->tx_lock); - - /* Must do this after setting tx_event: race with updates of tx_cons. */ - network_tx_buf_gc(dev); - - HYPERVISOR_net_update(); - - return 0; -} - - -static void network_rx_int(int irq, void *dev_id, struct pt_regs *ptregs) -{ - unsigned int i; - struct net_device *dev = (struct net_device *)dev_id; - struct net_private *np = dev->priv; - struct sk_buff *skb; - - again: - for ( i = np->rx_idx; i != np->net_ring->rx_cons; i = RX_RING_INC(i) ) - { - skb = np->rx_skb_ring[i]; - skb_put(skb, np->net_ring->rx_ring[i].size); - skb->protocol = eth_type_trans(skb, dev); - np->stats.rx_packets++; - np->stats.rx_bytes += np->net_ring->rx_ring[i].size; - netif_rx(skb); - dev->last_rx = jiffies; - } - - np->rx_idx = i; - - network_alloc_rx_buffers(dev); - - /* Deal with hypervisor racing our resetting of rx_event. */ - smp_mb(); - if ( np->net_ring->rx_cons != i ) goto again; -} - - -static void network_tx_int(int irq, void *dev_id, struct pt_regs *ptregs) -{ - struct net_device *dev = (struct net_device *)dev_id; - network_tx_buf_gc(dev); -} - - -static int network_close(struct net_device *dev) -{ - struct net_private *np = dev->priv; - - netif_stop_queue(dev); - 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); - kfree(np->rx_skb_ring); - kfree(np->tx_skb_ring); - kfree(np); - MOD_DEC_USE_COUNT; - return 0; -} - - -static struct net_device_stats *network_get_stats(struct net_device *dev) -{ - struct net_private *np = (struct net_private *)dev->priv; - return &np->stats; -} - - -static int __init init_module(void) -{ - memset(&dev_net_xeno, 0, sizeof(dev_net_xeno)); - strcpy(dev_net_xeno.name, "eth%d"); - dev_net_xeno.init = network_probe; - return (register_netdev(&dev_net_xeno) != 0) ? -EIO : 0; -} - - -static void __exit cleanup_module(void) -{ - unregister_netdev(&dev_net_xeno); -} - -#endif /* UNDEFINED */ - - -static void block_initialize(void) -{ - blk_ring_t *blk_ring = start_info.blk_ring; - - if ( blk_ring == NULL ) return; - - blk_ring->tx_prod = blk_ring->tx_cons = blk_ring->tx_event = 0; - blk_ring->rx_prod = blk_ring->rx_cons = blk_ring->rx_event = 0; - blk_ring->tx_ring = NULL; - blk_ring->rx_ring = NULL; -} - - -/* - * block_setup initialized the xeno block device driver - */ - -static int __init init_module(void) -{ - block_initialize(); - printk("XenoLinux Virtual Block Device Driver installed\n"); - return 0; -} - -static void __exit cleanup_module(void) -{ - printk("XenoLinux Virtual Block Device Driver uninstalled\n"); -} - -module_init(init_module); -module_exit(cleanup_module); - |