ia64/linux-2.6.18-xen.hg

view drivers/net/ibmveth.h @ 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 /**************************************************************************/
2 /* */
3 /* IBM eServer i/[Series Virtual Ethernet Device Driver */
4 /* Copyright (C) 2003 IBM Corp. */
5 /* Dave Larson (larson1@us.ibm.com) */
6 /* Santiago Leon (santil@us.ibm.com) */
7 /* */
8 /* This program is free software; you can redistribute it and/or modify */
9 /* it under the terms of the GNU General Public License as published by */
10 /* the Free Software Foundation; either version 2 of the License, or */
11 /* (at your option) any later version. */
12 /* */
13 /* This program is distributed in the hope that it will be useful, */
14 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
15 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
16 /* GNU General Public License for more details. */
17 /* */
18 /* You should have received a copy of the GNU General Public License */
19 /* along with this program; if not, write to the Free Software */
20 /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 */
21 /* USA */
22 /* */
23 /**************************************************************************/
25 #ifndef _IBMVETH_H
26 #define _IBMVETH_H
28 #define IbmVethMaxSendFrags 6
30 /* constants for H_MULTICAST_CTRL */
31 #define IbmVethMcastReceptionModifyBit 0x80000UL
32 #define IbmVethMcastReceptionEnableBit 0x20000UL
33 #define IbmVethMcastFilterModifyBit 0x40000UL
34 #define IbmVethMcastFilterEnableBit 0x10000UL
36 #define IbmVethMcastEnableRecv (IbmVethMcastReceptionModifyBit | IbmVethMcastReceptionEnableBit)
37 #define IbmVethMcastDisableRecv (IbmVethMcastReceptionModifyBit)
38 #define IbmVethMcastEnableFiltering (IbmVethMcastFilterModifyBit | IbmVethMcastFilterEnableBit)
39 #define IbmVethMcastDisableFiltering (IbmVethMcastFilterModifyBit)
40 #define IbmVethMcastAddFilter 0x1UL
41 #define IbmVethMcastRemoveFilter 0x2UL
42 #define IbmVethMcastClearFilterTable 0x3UL
44 /* hcall numbers */
45 #define H_VIO_SIGNAL 0x104
46 #define H_REGISTER_LOGICAL_LAN 0x114
47 #define H_FREE_LOGICAL_LAN 0x118
48 #define H_ADD_LOGICAL_LAN_BUFFER 0x11C
49 #define H_SEND_LOGICAL_LAN 0x120
50 #define H_MULTICAST_CTRL 0x130
51 #define H_CHANGE_LOGICAL_LAN_MAC 0x14C
52 #define H_FREE_LOGICAL_LAN_BUFFER 0x1D4
54 /* hcall macros */
55 #define h_register_logical_lan(ua, buflst, rxq, fltlst, mac) \
56 plpar_hcall_norets(H_REGISTER_LOGICAL_LAN, ua, buflst, rxq, fltlst, mac)
58 #define h_free_logical_lan(ua) \
59 plpar_hcall_norets(H_FREE_LOGICAL_LAN, ua)
61 #define h_add_logical_lan_buffer(ua, buf) \
62 plpar_hcall_norets(H_ADD_LOGICAL_LAN_BUFFER, ua, buf)
64 #define h_send_logical_lan(ua, buf1, buf2, buf3, buf4, buf5, buf6, correlator) \
65 plpar_hcall_8arg_2ret(H_SEND_LOGICAL_LAN, ua, buf1, buf2, buf3, buf4, buf5, buf6, correlator, &correlator)
67 #define h_multicast_ctrl(ua, cmd, mac) \
68 plpar_hcall_norets(H_MULTICAST_CTRL, ua, cmd, mac)
70 #define h_change_logical_lan_mac(ua, mac) \
71 plpar_hcall_norets(H_CHANGE_LOGICAL_LAN_MAC, ua, mac)
73 #define h_free_logical_lan_buffer(ua, bufsize) \
74 plpar_hcall_norets(H_FREE_LOGICAL_LAN_BUFFER, ua, bufsize)
76 #define IbmVethNumBufferPools 5
77 #define IBMVETH_BUFF_OH 22 /* Overhead: 14 ethernet header + 8 opaque handle */
78 #define IBMVETH_MAX_MTU 68
79 #define IBMVETH_MAX_POOL_COUNT 4096
80 #define IBMVETH_MAX_BUF_SIZE (1024 * 128)
82 static int pool_size[] = { 512, 1024 * 2, 1024 * 16, 1024 * 32, 1024 * 64 };
83 static int pool_count[] = { 256, 768, 256, 256, 256 };
84 static int pool_active[] = { 1, 1, 0, 0, 0};
86 #define IBM_VETH_INVALID_MAP ((u16)0xffff)
88 struct ibmveth_buff_pool {
89 u32 size;
90 u32 index;
91 u32 buff_size;
92 u32 threshold;
93 atomic_t available;
94 u32 consumer_index;
95 u32 producer_index;
96 u16 *free_map;
97 dma_addr_t *dma_addr;
98 struct sk_buff **skbuff;
99 int active;
100 struct kobject kobj;
101 };
103 struct ibmveth_rx_q {
104 u64 index;
105 u64 num_slots;
106 u64 toggle;
107 dma_addr_t queue_dma;
108 u32 queue_len;
109 struct ibmveth_rx_q_entry *queue_addr;
110 };
112 struct ibmveth_adapter {
113 struct vio_dev *vdev;
114 struct net_device *netdev;
115 struct net_device_stats stats;
116 unsigned int mcastFilterSize;
117 unsigned long mac_addr;
118 unsigned long liobn;
119 void * buffer_list_addr;
120 void * filter_list_addr;
121 dma_addr_t buffer_list_dma;
122 dma_addr_t filter_list_dma;
123 struct ibmveth_buff_pool rx_buff_pool[IbmVethNumBufferPools];
124 struct ibmveth_rx_q rx_queue;
125 int pool_config;
127 /* adapter specific stats */
128 u64 replenish_task_cycles;
129 u64 replenish_no_mem;
130 u64 replenish_add_buff_failure;
131 u64 replenish_add_buff_success;
132 u64 rx_invalid_buffer;
133 u64 rx_no_buffer;
134 u64 tx_multidesc_send;
135 u64 tx_linearized;
136 u64 tx_linearize_failed;
137 u64 tx_map_failed;
138 u64 tx_send_failed;
139 spinlock_t stats_lock;
140 };
142 struct ibmveth_buf_desc_fields {
143 u32 valid : 1;
144 u32 toggle : 1;
145 u32 reserved : 6;
146 u32 length : 24;
147 u32 address;
148 };
150 union ibmveth_buf_desc {
151 u64 desc;
152 struct ibmveth_buf_desc_fields fields;
153 };
155 struct ibmveth_rx_q_entry {
156 u16 toggle : 1;
157 u16 valid : 1;
158 u16 reserved : 14;
159 u16 offset;
160 u32 length;
161 u64 correlator;
162 };
164 #endif /* _IBMVETH_H */