ia64/linux-2.6.18-xen.hg

view drivers/net/hp.c @ 897:329ea0ccb344

balloon: try harder to balloon up under memory pressure.

Currently if the balloon driver is unable to increase the guest's
reservation it assumes the failure was due to reaching its full
allocation, gives up on the ballooning operation and records the limit
it reached as the "hard limit". The driver will not try again until
the target is set again (even to the same value).

However it is possible that ballooning has in fact failed due to
memory pressure in the host and therefore it is desirable to keep
attempting to reach the target in case memory becomes available. The
most likely scenario is that some guests are ballooning down while
others are ballooning up and therefore there is temporary memory
pressure while things stabilise. You would not expect a well behaved
toolstack to ask a domain to balloon to more than its allocation nor
would you expect it to deliberately over-commit memory by setting
balloon targets which exceed the total host memory.

This patch drops the concept of a hard limit and causes the balloon
driver to retry increasing the reservation on a timer in the same
manner as when decreasing the reservation.

Also if we partially succeed in increasing the reservation
(i.e. receive less pages than we asked for) then we may as well keep
those pages rather than returning them to Xen.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
author Keir Fraser <keir.fraser@citrix.com>
date Fri Jun 05 14:01:20 2009 +0100 (2009-06-05)
parents 831230e53067
children
line source
1 /* hp.c: A HP LAN ethernet driver for linux. */
2 /*
3 Written 1993-94 by Donald Becker.
5 Copyright 1993 United States Government as represented by the
6 Director, National Security Agency.
8 This software may be used and distributed according to the terms
9 of the GNU General Public License, incorporated herein by reference.
11 The author may be reached as becker@scyld.com, or C/O
12 Scyld Computing Corporation
13 410 Severn Ave., Suite 210
14 Annapolis MD 21403
16 This is a driver for the HP PC-LAN adaptors.
18 Sources:
19 The Crynwr packet driver.
20 */
22 static const char version[] =
23 "hp.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
26 #include <linux/module.h>
27 #include <linux/kernel.h>
28 #include <linux/errno.h>
29 #include <linux/ioport.h>
30 #include <linux/netdevice.h>
31 #include <linux/etherdevice.h>
32 #include <linux/init.h>
33 #include <linux/delay.h>
35 #include <asm/system.h>
36 #include <asm/io.h>
38 #include "8390.h"
40 #define DRV_NAME "hp"
42 /* A zero-terminated list of I/O addresses to be probed. */
43 static unsigned int hppclan_portlist[] __initdata =
44 { 0x300, 0x320, 0x340, 0x280, 0x2C0, 0x200, 0x240, 0};
46 #define HP_IO_EXTENT 32
48 #define HP_DATAPORT 0x0c /* "Remote DMA" data port. */
49 #define HP_ID 0x07
50 #define HP_CONFIGURE 0x08 /* Configuration register. */
51 #define HP_RUN 0x01 /* 1 == Run, 0 == reset. */
52 #define HP_IRQ 0x0E /* Mask for software-configured IRQ line. */
53 #define HP_DATAON 0x10 /* Turn on dataport */
54 #define NIC_OFFSET 0x10 /* Offset the 8390 registers. */
56 #define HP_START_PG 0x00 /* First page of TX buffer */
57 #define HP_8BSTOP_PG 0x80 /* Last page +1 of RX ring */
58 #define HP_16BSTOP_PG 0xFF /* Same, for 16 bit cards. */
60 static int hp_probe1(struct net_device *dev, int ioaddr);
62 static int hp_open(struct net_device *dev);
63 static int hp_close(struct net_device *dev);
64 static void hp_reset_8390(struct net_device *dev);
65 static void hp_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
66 int ring_page);
67 static void hp_block_input(struct net_device *dev, int count,
68 struct sk_buff *skb , int ring_offset);
69 static void hp_block_output(struct net_device *dev, int count,
70 const unsigned char *buf, int start_page);
72 static void hp_init_card(struct net_device *dev);
74 /* The map from IRQ number to HP_CONFIGURE register setting. */
75 /* My default is IRQ5 0 1 2 3 4 5 6 7 8 9 10 11 */
76 static char irqmap[16] __initdata= { 0, 0, 4, 6, 8,10, 0,14, 0, 4, 2,12,0,0,0,0};
79 /* Probe for an HP LAN adaptor.
80 Also initialize the card and fill in STATION_ADDR with the station
81 address. */
83 static int __init do_hp_probe(struct net_device *dev)
84 {
85 int i;
86 int base_addr = dev->base_addr;
87 int irq = dev->irq;
89 SET_MODULE_OWNER(dev);
91 if (base_addr > 0x1ff) /* Check a single specified location. */
92 return hp_probe1(dev, base_addr);
93 else if (base_addr != 0) /* Don't probe at all. */
94 return -ENXIO;
96 for (i = 0; hppclan_portlist[i]; i++) {
97 if (hp_probe1(dev, hppclan_portlist[i]) == 0)
98 return 0;
99 dev->irq = irq;
100 }
102 return -ENODEV;
103 }
105 #ifndef MODULE
106 struct net_device * __init hp_probe(int unit)
107 {
108 struct net_device *dev = alloc_ei_netdev();
109 int err;
111 if (!dev)
112 return ERR_PTR(-ENOMEM);
114 sprintf(dev->name, "eth%d", unit);
115 netdev_boot_setup_check(dev);
117 err = do_hp_probe(dev);
118 if (err)
119 goto out;
120 return dev;
121 out:
122 free_netdev(dev);
123 return ERR_PTR(err);
124 }
125 #endif
127 static int __init hp_probe1(struct net_device *dev, int ioaddr)
128 {
129 int i, retval, board_id, wordmode;
130 const char *name;
131 static unsigned version_printed;
133 if (!request_region(ioaddr, HP_IO_EXTENT, DRV_NAME))
134 return -EBUSY;
136 /* Check for the HP physical address, 08 00 09 xx xx xx. */
137 /* This really isn't good enough: we may pick up HP LANCE boards
138 also! Avoid the lance 0x5757 signature. */
139 if (inb(ioaddr) != 0x08
140 || inb(ioaddr+1) != 0x00
141 || inb(ioaddr+2) != 0x09
142 || inb(ioaddr+14) == 0x57) {
143 retval = -ENODEV;
144 goto out;
145 }
147 /* Set up the parameters based on the board ID.
148 If you have additional mappings, please mail them to me -djb. */
149 if ((board_id = inb(ioaddr + HP_ID)) & 0x80) {
150 name = "HP27247";
151 wordmode = 1;
152 } else {
153 name = "HP27250";
154 wordmode = 0;
155 }
157 if (ei_debug && version_printed++ == 0)
158 printk(version);
160 printk("%s: %s (ID %02x) at %#3x,", dev->name, name, board_id, ioaddr);
162 for(i = 0; i < ETHER_ADDR_LEN; i++)
163 printk(" %2.2x", dev->dev_addr[i] = inb(ioaddr + i));
165 /* Snarf the interrupt now. Someday this could be moved to open(). */
166 if (dev->irq < 2) {
167 int irq_16list[] = { 11, 10, 5, 3, 4, 7, 9, 0};
168 int irq_8list[] = { 7, 5, 3, 4, 9, 0};
169 int *irqp = wordmode ? irq_16list : irq_8list;
170 do {
171 int irq = *irqp;
172 if (request_irq (irq, NULL, 0, "bogus", NULL) != -EBUSY) {
173 unsigned long cookie = probe_irq_on();
174 /* Twinkle the interrupt, and check if it's seen. */
175 outb_p(irqmap[irq] | HP_RUN, ioaddr + HP_CONFIGURE);
176 outb_p( 0x00 | HP_RUN, ioaddr + HP_CONFIGURE);
177 if (irq == probe_irq_off(cookie) /* It's a good IRQ line! */
178 && request_irq (irq, ei_interrupt, 0, DRV_NAME, dev) == 0) {
179 printk(" selecting IRQ %d.\n", irq);
180 dev->irq = *irqp;
181 break;
182 }
183 }
184 } while (*++irqp);
185 if (*irqp == 0) {
186 printk(" no free IRQ lines.\n");
187 retval = -EBUSY;
188 goto out;
189 }
190 } else {
191 if (dev->irq == 2)
192 dev->irq = 9;
193 if ((retval = request_irq(dev->irq, ei_interrupt, 0, DRV_NAME, dev))) {
194 printk (" unable to get IRQ %d.\n", dev->irq);
195 goto out;
196 }
197 }
199 /* Set the base address to point to the NIC, not the "real" base! */
200 dev->base_addr = ioaddr + NIC_OFFSET;
201 dev->open = &hp_open;
202 dev->stop = &hp_close;
203 #ifdef CONFIG_NET_POLL_CONTROLLER
204 dev->poll_controller = ei_poll;
205 #endif
207 ei_status.name = name;
208 ei_status.word16 = wordmode;
209 ei_status.tx_start_page = HP_START_PG;
210 ei_status.rx_start_page = HP_START_PG + TX_PAGES;
211 ei_status.stop_page = wordmode ? HP_16BSTOP_PG : HP_8BSTOP_PG;
213 ei_status.reset_8390 = &hp_reset_8390;
214 ei_status.get_8390_hdr = &hp_get_8390_hdr;
215 ei_status.block_input = &hp_block_input;
216 ei_status.block_output = &hp_block_output;
217 hp_init_card(dev);
219 retval = register_netdev(dev);
220 if (retval)
221 goto out1;
222 return 0;
223 out1:
224 free_irq(dev->irq, dev);
225 out:
226 release_region(ioaddr, HP_IO_EXTENT);
227 return retval;
228 }
230 static int
231 hp_open(struct net_device *dev)
232 {
233 ei_open(dev);
234 return 0;
235 }
237 static int
238 hp_close(struct net_device *dev)
239 {
240 ei_close(dev);
241 return 0;
242 }
244 static void
245 hp_reset_8390(struct net_device *dev)
246 {
247 int hp_base = dev->base_addr - NIC_OFFSET;
248 int saved_config = inb_p(hp_base + HP_CONFIGURE);
250 if (ei_debug > 1) printk("resetting the 8390 time=%ld...", jiffies);
251 outb_p(0x00, hp_base + HP_CONFIGURE);
252 ei_status.txing = 0;
253 /* Pause just a few cycles for the hardware reset to take place. */
254 udelay(5);
256 outb_p(saved_config, hp_base + HP_CONFIGURE);
257 udelay(5);
259 if ((inb_p(hp_base+NIC_OFFSET+EN0_ISR) & ENISR_RESET) == 0)
260 printk("%s: hp_reset_8390() did not complete.\n", dev->name);
262 if (ei_debug > 1) printk("8390 reset done (%ld).", jiffies);
263 return;
264 }
266 static void
267 hp_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
268 {
269 int nic_base = dev->base_addr;
270 int saved_config = inb_p(nic_base - NIC_OFFSET + HP_CONFIGURE);
272 outb_p(saved_config | HP_DATAON, nic_base - NIC_OFFSET + HP_CONFIGURE);
273 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base);
274 outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
275 outb_p(0, nic_base + EN0_RCNTHI);
276 outb_p(0, nic_base + EN0_RSARLO); /* On page boundary */
277 outb_p(ring_page, nic_base + EN0_RSARHI);
278 outb_p(E8390_RREAD+E8390_START, nic_base);
280 if (ei_status.word16)
281 insw(nic_base - NIC_OFFSET + HP_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
282 else
283 insb(nic_base - NIC_OFFSET + HP_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr));
285 outb_p(saved_config & (~HP_DATAON), nic_base - NIC_OFFSET + HP_CONFIGURE);
286 }
288 /* Block input and output, similar to the Crynwr packet driver. If you are
289 porting to a new ethercard look at the packet driver source for hints.
290 The HP LAN doesn't use shared memory -- we put the packet
291 out through the "remote DMA" dataport. */
293 static void
294 hp_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
295 {
296 int nic_base = dev->base_addr;
297 int saved_config = inb_p(nic_base - NIC_OFFSET + HP_CONFIGURE);
298 int xfer_count = count;
299 char *buf = skb->data;
301 outb_p(saved_config | HP_DATAON, nic_base - NIC_OFFSET + HP_CONFIGURE);
302 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base);
303 outb_p(count & 0xff, nic_base + EN0_RCNTLO);
304 outb_p(count >> 8, nic_base + EN0_RCNTHI);
305 outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
306 outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
307 outb_p(E8390_RREAD+E8390_START, nic_base);
308 if (ei_status.word16) {
309 insw(nic_base - NIC_OFFSET + HP_DATAPORT,buf,count>>1);
310 if (count & 0x01)
311 buf[count-1] = inb(nic_base - NIC_OFFSET + HP_DATAPORT), xfer_count++;
312 } else {
313 insb(nic_base - NIC_OFFSET + HP_DATAPORT, buf, count);
314 }
315 /* This is for the ALPHA version only, remove for later releases. */
316 if (ei_debug > 0) { /* DMA termination address check... */
317 int high = inb_p(nic_base + EN0_RSARHI);
318 int low = inb_p(nic_base + EN0_RSARLO);
319 int addr = (high << 8) + low;
320 /* Check only the lower 8 bits so we can ignore ring wrap. */
321 if (((ring_offset + xfer_count) & 0xff) != (addr & 0xff))
322 printk("%s: RX transfer address mismatch, %#4.4x vs. %#4.4x (actual).\n",
323 dev->name, ring_offset + xfer_count, addr);
324 }
325 outb_p(saved_config & (~HP_DATAON), nic_base - NIC_OFFSET + HP_CONFIGURE);
326 }
328 static void
329 hp_block_output(struct net_device *dev, int count,
330 const unsigned char *buf, int start_page)
331 {
332 int nic_base = dev->base_addr;
333 int saved_config = inb_p(nic_base - NIC_OFFSET + HP_CONFIGURE);
335 outb_p(saved_config | HP_DATAON, nic_base - NIC_OFFSET + HP_CONFIGURE);
336 /* Round the count up for word writes. Do we need to do this?
337 What effect will an odd byte count have on the 8390?
338 I should check someday. */
339 if (ei_status.word16 && (count & 0x01))
340 count++;
341 /* We should already be in page 0, but to be safe... */
342 outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base);
344 #ifdef NE8390_RW_BUGFIX
345 /* Handle the read-before-write bug the same way as the
346 Crynwr packet driver -- the NatSemi method doesn't work. */
347 outb_p(0x42, nic_base + EN0_RCNTLO);
348 outb_p(0, nic_base + EN0_RCNTHI);
349 outb_p(0xff, nic_base + EN0_RSARLO);
350 outb_p(0x00, nic_base + EN0_RSARHI);
351 #define NE_CMD 0x00
352 outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
353 /* Make certain that the dummy read has occurred. */
354 inb_p(0x61);
355 inb_p(0x61);
356 #endif
358 outb_p(count & 0xff, nic_base + EN0_RCNTLO);
359 outb_p(count >> 8, nic_base + EN0_RCNTHI);
360 outb_p(0x00, nic_base + EN0_RSARLO);
361 outb_p(start_page, nic_base + EN0_RSARHI);
363 outb_p(E8390_RWRITE+E8390_START, nic_base);
364 if (ei_status.word16) {
365 /* Use the 'rep' sequence for 16 bit boards. */
366 outsw(nic_base - NIC_OFFSET + HP_DATAPORT, buf, count>>1);
367 } else {
368 outsb(nic_base - NIC_OFFSET + HP_DATAPORT, buf, count);
369 }
371 /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here -- it's broken! */
373 /* This is for the ALPHA version only, remove for later releases. */
374 if (ei_debug > 0) { /* DMA termination address check... */
375 int high = inb_p(nic_base + EN0_RSARHI);
376 int low = inb_p(nic_base + EN0_RSARLO);
377 int addr = (high << 8) + low;
378 if ((start_page << 8) + count != addr)
379 printk("%s: TX Transfer address mismatch, %#4.4x vs. %#4.4x.\n",
380 dev->name, (start_page << 8) + count, addr);
381 }
382 outb_p(saved_config & (~HP_DATAON), nic_base - NIC_OFFSET + HP_CONFIGURE);
383 return;
384 }
386 /* This function resets the ethercard if something screws up. */
387 static void __init
388 hp_init_card(struct net_device *dev)
389 {
390 int irq = dev->irq;
391 NS8390_init(dev, 0);
392 outb_p(irqmap[irq&0x0f] | HP_RUN,
393 dev->base_addr - NIC_OFFSET + HP_CONFIGURE);
394 return;
395 }
397 #ifdef MODULE
398 #define MAX_HP_CARDS 4 /* Max number of HP cards per module */
399 static struct net_device *dev_hp[MAX_HP_CARDS];
400 static int io[MAX_HP_CARDS];
401 static int irq[MAX_HP_CARDS];
403 module_param_array(io, int, NULL, 0);
404 module_param_array(irq, int, NULL, 0);
405 MODULE_PARM_DESC(io, "I/O base address(es)");
406 MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
407 MODULE_DESCRIPTION("HP PC-LAN ISA ethernet driver");
408 MODULE_LICENSE("GPL");
410 /* This is set up so that only a single autoprobe takes place per call.
411 ISA device autoprobes on a running machine are not recommended. */
412 int __init
413 init_module(void)
414 {
415 struct net_device *dev;
416 int this_dev, found = 0;
418 for (this_dev = 0; this_dev < MAX_HP_CARDS; this_dev++) {
419 if (io[this_dev] == 0) {
420 if (this_dev != 0) break; /* only autoprobe 1st one */
421 printk(KERN_NOTICE "hp.c: Presently autoprobing (not recommended) for a single card.\n");
422 }
423 dev = alloc_ei_netdev();
424 if (!dev)
425 break;
426 dev->irq = irq[this_dev];
427 dev->base_addr = io[this_dev];
428 if (do_hp_probe(dev) == 0) {
429 dev_hp[found++] = dev;
430 continue;
431 }
432 free_netdev(dev);
433 printk(KERN_WARNING "hp.c: No HP card found (i/o = 0x%x).\n", io[this_dev]);
434 break;
435 }
436 if (found)
437 return 0;
438 return -ENXIO;
439 }
441 static void cleanup_card(struct net_device *dev)
442 {
443 free_irq(dev->irq, dev);
444 release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT);
445 }
447 void
448 cleanup_module(void)
449 {
450 int this_dev;
452 for (this_dev = 0; this_dev < MAX_HP_CARDS; this_dev++) {
453 struct net_device *dev = dev_hp[this_dev];
454 if (dev) {
455 unregister_netdev(dev);
456 cleanup_card(dev);
457 free_netdev(dev);
458 }
459 }
460 }
461 #endif /* MODULE */