aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation')
-rw-r--r--Documentation/RCU/rculist_nulls.txt167
-rw-r--r--Documentation/feature-removal-schedule.txt7
-rw-r--r--Documentation/networking/README.ipw22002
-rw-r--r--Documentation/networking/bonding.txt68
-rw-r--r--Documentation/networking/dccp.txt7
-rw-r--r--Documentation/networking/ip-sysctl.txt6
-rw-r--r--Documentation/networking/regulatory.txt22
-rw-r--r--Documentation/rfkill.txt20
8 files changed, 261 insertions, 38 deletions
diff --git a/Documentation/RCU/rculist_nulls.txt b/Documentation/RCU/rculist_nulls.txt
new file mode 100644
index 000000000000..239f542d48ba
--- /dev/null
+++ b/Documentation/RCU/rculist_nulls.txt
@@ -0,0 +1,167 @@
1Using hlist_nulls to protect read-mostly linked lists and
2objects using SLAB_DESTROY_BY_RCU allocations.
3
4Please read the basics in Documentation/RCU/listRCU.txt
5
6Using special makers (called 'nulls') is a convenient way
7to solve following problem :
8
9A typical RCU linked list managing objects which are
10allocated with SLAB_DESTROY_BY_RCU kmem_cache can
11use following algos :
12
131) Lookup algo
14--------------
15rcu_read_lock()
16begin:
17obj = lockless_lookup(key);
18if (obj) {
19 if (!try_get_ref(obj)) // might fail for free objects
20 goto begin;
21 /*
22 * Because a writer could delete object, and a writer could
23 * reuse these object before the RCU grace period, we
24 * must check key after geting the reference on object
25 */
26 if (obj->key != key) { // not the object we expected
27 put_ref(obj);
28 goto begin;
29 }
30}
31rcu_read_unlock();
32
33Beware that lockless_lookup(key) cannot use traditional hlist_for_each_entry_rcu()
34but a version with an additional memory barrier (smp_rmb())
35
36lockless_lookup(key)
37{
38 struct hlist_node *node, *next;
39 for (pos = rcu_dereference((head)->first);
40 pos && ({ next = pos->next; smp_rmb(); prefetch(next); 1; }) &&
41 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; });
42 pos = rcu_dereference(next))
43 if (obj->key == key)
44 return obj;
45 return NULL;
46
47And note the traditional hlist_for_each_entry_rcu() misses this smp_rmb() :
48
49 struct hlist_node *node;
50 for (pos = rcu_dereference((head)->first);
51 pos && ({ prefetch(pos->next); 1; }) &&
52 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; });
53 pos = rcu_dereference(pos->next))
54 if (obj->key == key)
55 return obj;
56 return NULL;
57}
58
59Quoting Corey Minyard :
60
61"If the object is moved from one list to another list in-between the
62 time the hash is calculated and the next field is accessed, and the
63 object has moved to the end of a new list, the traversal will not
64 complete properly on the list it should have, since the object will
65 be on the end of the new list and there's not a way to tell it's on a
66 new list and restart the list traversal. I think that this can be
67 solved by pre-fetching the "next" field (with proper barriers) before
68 checking the key."
69
702) Insert algo :
71----------------
72
73We need to make sure a reader cannot read the new 'obj->obj_next' value
74and previous value of 'obj->key'. Or else, an item could be deleted
75from a chain, and inserted into another chain. If new chain was empty
76before the move, 'next' pointer is NULL, and lockless reader can
77not detect it missed following items in original chain.
78
79/*
80 * Please note that new inserts are done at the head of list,
81 * not in the middle or end.
82 */
83obj = kmem_cache_alloc(...);
84lock_chain(); // typically a spin_lock()
85obj->key = key;
86atomic_inc(&obj->refcnt);
87/*
88 * we need to make sure obj->key is updated before obj->next
89 */
90smp_wmb();
91hlist_add_head_rcu(&obj->obj_node, list);
92unlock_chain(); // typically a spin_unlock()
93
94
953) Remove algo
96--------------
97Nothing special here, we can use a standard RCU hlist deletion.
98But thanks to SLAB_DESTROY_BY_RCU, beware a deleted object can be reused
99very very fast (before the end of RCU grace period)
100
101if (put_last_reference_on(obj) {
102 lock_chain(); // typically a spin_lock()
103 hlist_del_init_rcu(&obj->obj_node);
104 unlock_chain(); // typically a spin_unlock()
105 kmem_cache_free(cachep, obj);
106}
107
108
109
110--------------------------------------------------------------------------
111With hlist_nulls we can avoid extra smp_rmb() in lockless_lookup()
112and extra smp_wmb() in insert function.
113
114For example, if we choose to store the slot number as the 'nulls'
115end-of-list marker for each slot of the hash table, we can detect
116a race (some writer did a delete and/or a move of an object
117to another chain) checking the final 'nulls' value if
118the lookup met the end of chain. If final 'nulls' value
119is not the slot number, then we must restart the lookup at
120the begining. If the object was moved to same chain,
121then the reader doesnt care : It might eventually
122scan the list again without harm.
123
124
1251) lookup algo
126
127 head = &table[slot];
128 rcu_read_lock();
129begin:
130 hlist_nulls_for_each_entry_rcu(obj, node, head, member) {
131 if (obj->key == key) {
132 if (!try_get_ref(obj)) // might fail for free objects
133 goto begin;
134 if (obj->key != key) { // not the object we expected
135 put_ref(obj);
136 goto begin;
137 }
138 goto out;
139 }
140/*
141 * if the nulls value we got at the end of this lookup is
142 * not the expected one, we must restart lookup.
143 * We probably met an item that was moved to another chain.
144 */
145 if (get_nulls_value(node) != slot)
146 goto begin;
147 obj = NULL;
148
149out:
150 rcu_read_unlock();
151
1522) Insert function :
153--------------------
154
155/*
156 * Please note that new inserts are done at the head of list,
157 * not in the middle or end.
158 */
159obj = kmem_cache_alloc(cachep);
160lock_chain(); // typically a spin_lock()
161obj->key = key;
162atomic_set(&obj->refcnt, 1);
163/*
164 * insert obj in RCU way (readers might be traversing chain)
165 */
166hlist_nulls_add_head_rcu(&obj->obj_node, list);
167unlock_chain(); // typically a spin_unlock()
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt
index c28a2ac88f9d..77eb6b129dde 100644
--- a/Documentation/feature-removal-schedule.txt
+++ b/Documentation/feature-removal-schedule.txt
@@ -120,13 +120,6 @@ Who: Christoph Hellwig <hch@lst.de>
120 120
121--------------------------- 121---------------------------
122 122
123What: eepro100 network driver
124When: January 2007
125Why: replaced by the e100 driver
126Who: Adrian Bunk <bunk@stusta.de>
127
128---------------------------
129
130What: Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports 123What: Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports
131 (temporary transition config option provided until then) 124 (temporary transition config option provided until then)
132 The transition config option will also be removed at the same time. 125 The transition config option will also be removed at the same time.
diff --git a/Documentation/networking/README.ipw2200 b/Documentation/networking/README.ipw2200
index 4f2a40f1dbc6..80c728522c4c 100644
--- a/Documentation/networking/README.ipw2200
+++ b/Documentation/networking/README.ipw2200
@@ -147,7 +147,7 @@ Where the supported parameter are:
147 driver. If disabled, the driver will not attempt to scan 147 driver. If disabled, the driver will not attempt to scan
148 for and associate to a network until it has been configured with 148 for and associate to a network until it has been configured with
149 one or more properties for the target network, for example configuring 149 one or more properties for the target network, for example configuring
150 the network SSID. Default is 1 (auto-associate) 150 the network SSID. Default is 0 (do not auto-associate)
151 151
152 Example: % modprobe ipw2200 associate=0 152 Example: % modprobe ipw2200 associate=0
153 153
diff --git a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt
index 688dfe1e6b70..5ede7473b425 100644
--- a/Documentation/networking/bonding.txt
+++ b/Documentation/networking/bonding.txt
@@ -194,6 +194,48 @@ or, for backwards compatibility, the option value. E.g.,
194 194
195 The parameters are as follows: 195 The parameters are as follows:
196 196
197ad_select
198
199 Specifies the 802.3ad aggregation selection logic to use. The
200 possible values and their effects are:
201
202 stable or 0
203
204 The active aggregator is chosen by largest aggregate
205 bandwidth.
206
207 Reselection of the active aggregator occurs only when all
208 slaves of the active aggregator are down or the active
209 aggregator has no slaves.
210
211 This is the default value.
212
213 bandwidth or 1
214
215 The active aggregator is chosen by largest aggregate
216 bandwidth. Reselection occurs if:
217
218 - A slave is added to or removed from the bond
219
220 - Any slave's link state changes
221
222 - Any slave's 802.3ad association state changes
223
224 - The bond's adminstrative state changes to up
225
226 count or 2
227
228 The active aggregator is chosen by the largest number of
229 ports (slaves). Reselection occurs as described under the
230 "bandwidth" setting, above.
231
232 The bandwidth and count selection policies permit failover of
233 802.3ad aggregations when partial failure of the active aggregator
234 occurs. This keeps the aggregator with the highest availability
235 (either in bandwidth or in number of ports) active at all times.
236
237 This option was added in bonding version 3.4.0.
238
197arp_interval 239arp_interval
198 240
199 Specifies the ARP link monitoring frequency in milliseconds. 241 Specifies the ARP link monitoring frequency in milliseconds.
@@ -551,6 +593,16 @@ num_grat_arp
551 affects only the active-backup mode. This option was added for 593 affects only the active-backup mode. This option was added for
552 bonding version 3.3.0. 594 bonding version 3.3.0.
553 595
596num_unsol_na
597
598 Specifies the number of unsolicited IPv6 Neighbor Advertisements
599 to be issued after a failover event. One unsolicited NA is issued
600 immediately after the failover.
601
602 The valid range is 0 - 255; the default value is 1. This option
603 affects only the active-backup mode. This option was added for
604 bonding version 3.4.0.
605
554primary 606primary
555 607
556 A string (eth0, eth2, etc) specifying which slave is the 608 A string (eth0, eth2, etc) specifying which slave is the
@@ -922,17 +974,19 @@ USERCTL=no
922NETMASK, NETWORK and BROADCAST) to match your network configuration. 974NETMASK, NETWORK and BROADCAST) to match your network configuration.
923 975
924 For later versions of initscripts, such as that found with Fedora 976 For later versions of initscripts, such as that found with Fedora
9257 and Red Hat Enterprise Linux version 5 (or later), it is possible, and, 9777 (or later) and Red Hat Enterprise Linux version 5 (or later), it is possible,
926indeed, preferable, to specify the bonding options in the ifcfg-bond0 978and, indeed, preferable, to specify the bonding options in the ifcfg-bond0
927file, e.g. a line of the format: 979file, e.g. a line of the format:
928 980
929BONDING_OPTS="mode=active-backup arp_interval=60 arp_ip_target=+192.168.1.254" 981BONDING_OPTS="mode=active-backup arp_interval=60 arp_ip_target=192.168.1.254"
930 982
931 will configure the bond with the specified options. The options 983 will configure the bond with the specified options. The options
932specified in BONDING_OPTS are identical to the bonding module parameters 984specified in BONDING_OPTS are identical to the bonding module parameters
933except for the arp_ip_target field. Each target should be included as a 985except for the arp_ip_target field when using versions of initscripts older
934separate option and should be preceded by a '+' to indicate it should be 986than and 8.57 (Fedora 8) and 8.45.19 (Red Hat Enterprise Linux 5.2). When
935added to the list of queried targets, e.g., 987using older versions each target should be included as a separate option and
988should be preceded by a '+' to indicate it should be added to the list of
989queried targets, e.g.,
936 990
937 arp_ip_target=+192.168.1.1 arp_ip_target=+192.168.1.2 991 arp_ip_target=+192.168.1.1 arp_ip_target=+192.168.1.2
938 992
@@ -940,7 +994,7 @@ added to the list of queried targets, e.g.,
940options via BONDING_OPTS, it is not necessary to edit /etc/modules.conf or 994options via BONDING_OPTS, it is not necessary to edit /etc/modules.conf or
941/etc/modprobe.conf. 995/etc/modprobe.conf.
942 996
943 For older versions of initscripts that do not support 997 For even older versions of initscripts that do not support
944BONDING_OPTS, it is necessary to edit /etc/modules.conf (or 998BONDING_OPTS, it is necessary to edit /etc/modules.conf (or
945/etc/modprobe.conf, depending upon your distro) to load the bonding module 999/etc/modprobe.conf, depending upon your distro) to load the bonding module
946with your desired options when the bond0 interface is brought up. The 1000with your desired options when the bond0 interface is brought up. The
diff --git a/Documentation/networking/dccp.txt b/Documentation/networking/dccp.txt
index 39131a3c78f8..43df4487379b 100644
--- a/Documentation/networking/dccp.txt
+++ b/Documentation/networking/dccp.txt
@@ -57,6 +57,10 @@ can be set before calling bind().
57DCCP_SOCKOPT_GET_CUR_MPS is read-only and retrieves the current maximum packet 57DCCP_SOCKOPT_GET_CUR_MPS is read-only and retrieves the current maximum packet
58size (application payload size) in bytes, see RFC 4340, section 14. 58size (application payload size) in bytes, see RFC 4340, section 14.
59 59
60DCCP_SOCKOPT_AVAILABLE_CCIDS is also read-only and returns the list of CCIDs
61supported by the endpoint (see include/linux/dccp.h for symbolic constants).
62The caller needs to provide a sufficiently large (> 2) array of type uint8_t.
63
60DCCP_SOCKOPT_SERVER_TIMEWAIT enables the server (listening socket) to hold 64DCCP_SOCKOPT_SERVER_TIMEWAIT enables the server (listening socket) to hold
61timewait state when closing the connection (RFC 4340, 8.3). The usual case is 65timewait state when closing the connection (RFC 4340, 8.3). The usual case is
62that the closing server sends a CloseReq, whereupon the client holds timewait 66that the closing server sends a CloseReq, whereupon the client holds timewait
@@ -121,9 +125,6 @@ send_ndp = 1
121send_ackvec = 1 125send_ackvec = 1
122 Whether or not to send Ack Vector options (sec. 11.5). 126 Whether or not to send Ack Vector options (sec. 11.5).
123 127
124ack_ratio = 2
125 The default Ack Ratio (sec. 11.3) to use.
126
127tx_ccid = 2 128tx_ccid = 2
128 Default CCID for the sender-receiver half-connection. 129 Default CCID for the sender-receiver half-connection.
129 130
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
index d84932650fd3..c7712787933c 100644
--- a/Documentation/networking/ip-sysctl.txt
+++ b/Documentation/networking/ip-sysctl.txt
@@ -27,6 +27,12 @@ min_adv_mss - INTEGER
27 The advertised MSS depends on the first hop route MTU, but will 27 The advertised MSS depends on the first hop route MTU, but will
28 never be lower than this setting. 28 never be lower than this setting.
29 29
30rt_cache_rebuild_count - INTEGER
31 The per net-namespace route cache emergency rebuild threshold.
32 Any net-namespace having its route cache rebuilt due to
33 a hash bucket chain being too long more than this many times
34 will have its route caching disabled
35
30IP Fragmentation: 36IP Fragmentation:
31 37
32ipfrag_high_thresh - INTEGER 38ipfrag_high_thresh - INTEGER
diff --git a/Documentation/networking/regulatory.txt b/Documentation/networking/regulatory.txt
index a96989a8ff35..dcf31648414a 100644
--- a/Documentation/networking/regulatory.txt
+++ b/Documentation/networking/regulatory.txt
@@ -131,11 +131,13 @@ are expected to do this during initialization.
131 131
132 r = zd_reg2alpha2(mac->regdomain, alpha2); 132 r = zd_reg2alpha2(mac->regdomain, alpha2);
133 if (!r) 133 if (!r)
134 regulatory_hint(hw->wiphy, alpha2, NULL); 134 regulatory_hint(hw->wiphy, alpha2);
135 135
136Example code - drivers providing a built in regulatory domain: 136Example code - drivers providing a built in regulatory domain:
137-------------------------------------------------------------- 137--------------------------------------------------------------
138 138
139[NOTE: This API is not currently available, it can be added when required]
140
139If you have regulatory information you can obtain from your 141If you have regulatory information you can obtain from your
140driver and you *need* to use this we let you build a regulatory domain 142driver and you *need* to use this we let you build a regulatory domain
141structure and pass it to the wireless core. To do this you should 143structure and pass it to the wireless core. To do this you should
@@ -167,7 +169,6 @@ struct ieee80211_regdomain mydriver_jp_regdom = {
167 169
168Then in some part of your code after your wiphy has been registered: 170Then in some part of your code after your wiphy has been registered:
169 171
170 int r;
171 struct ieee80211_regdomain *rd; 172 struct ieee80211_regdomain *rd;
172 int size_of_regd; 173 int size_of_regd;
173 int num_rules = mydriver_jp_regdom.n_reg_rules; 174 int num_rules = mydriver_jp_regdom.n_reg_rules;
@@ -178,17 +179,12 @@ Then in some part of your code after your wiphy has been registered:
178 179
179 rd = kzalloc(size_of_regd, GFP_KERNEL); 180 rd = kzalloc(size_of_regd, GFP_KERNEL);
180 if (!rd) 181 if (!rd)
181 return -ENOMEM; 182 return -ENOMEM;
182 183
183 memcpy(rd, &mydriver_jp_regdom, sizeof(struct ieee80211_regdomain)); 184 memcpy(rd, &mydriver_jp_regdom, sizeof(struct ieee80211_regdomain));
184 185
185 for (i=0; i < num_rules; i++) { 186 for (i=0; i < num_rules; i++)
186 memcpy(&rd->reg_rules[i], &mydriver_jp_regdom.reg_rules[i], 187 memcpy(&rd->reg_rules[i],
187 sizeof(struct ieee80211_reg_rule)); 188 &mydriver_jp_regdom.reg_rules[i],
188 } 189 sizeof(struct ieee80211_reg_rule));
189 r = regulatory_hint(hw->wiphy, NULL, rd); 190 regulatory_struct_hint(rd);
190 if (r) {
191 kfree(rd);
192 return r;
193 }
194
diff --git a/Documentation/rfkill.txt b/Documentation/rfkill.txt
index b65f0799df48..4d3ee317a4a3 100644
--- a/Documentation/rfkill.txt
+++ b/Documentation/rfkill.txt
@@ -191,12 +191,20 @@ Userspace input handlers (uevents) or kernel input handlers (rfkill-input):
191 to tell the devices registered with the rfkill class to change 191 to tell the devices registered with the rfkill class to change
192 their state (i.e. translates the input layer event into real 192 their state (i.e. translates the input layer event into real
193 action). 193 action).
194
194 * rfkill-input implements EPO by handling EV_SW SW_RFKILL_ALL 0 195 * rfkill-input implements EPO by handling EV_SW SW_RFKILL_ALL 0
195 (power off all transmitters) in a special way: it ignores any 196 (power off all transmitters) in a special way: it ignores any
196 overrides and local state cache and forces all transmitters to the 197 overrides and local state cache and forces all transmitters to the
197 RFKILL_STATE_SOFT_BLOCKED state (including those which are already 198 RFKILL_STATE_SOFT_BLOCKED state (including those which are already
198 supposed to be BLOCKED). Note that the opposite event (power on all 199 supposed to be BLOCKED).
199 transmitters) is handled normally. 200 * rfkill EPO will remain active until rfkill-input receives an
201 EV_SW SW_RFKILL_ALL 1 event. While the EPO is active, transmitters
202 are locked in the blocked state (rfkill will refuse to unblock them).
203 * rfkill-input implements different policies that the user can
204 select for handling EV_SW SW_RFKILL_ALL 1. It will unlock rfkill,
205 and either do nothing (leave transmitters blocked, but now unlocked),
206 restore the transmitters to their state before the EPO, or unblock
207 them all.
200 208
201Userspace uevent handler or kernel platform-specific drivers hooked to the 209Userspace uevent handler or kernel platform-specific drivers hooked to the
202rfkill notifier chain: 210rfkill notifier chain:
@@ -331,11 +339,9 @@ class to get a sysfs interface :-)
331correct event for your switch/button. These events are emergency power-off 339correct event for your switch/button. These events are emergency power-off
332events when they are trying to turn the transmitters off. An example of an 340events when they are trying to turn the transmitters off. An example of an
333input device which SHOULD generate *_RFKILL_ALL events is the wireless-kill 341input device which SHOULD generate *_RFKILL_ALL events is the wireless-kill
334switch in a laptop which is NOT a hotkey, but a real switch that kills radios 342switch in a laptop which is NOT a hotkey, but a real sliding/rocker switch.
335in hardware, even if the O.S. has gone to lunch. An example of an input device 343An example of an input device which SHOULD NOT generate *_RFKILL_ALL events by
336which SHOULD NOT generate *_RFKILL_ALL events by default, is any sort of hot 344default, is any sort of hot key that is type-specific (e.g. the one for WLAN).
337key that does nothing by itself, as well as any hot key that is type-specific
338(e.g. the one for WLAN).
339 345
340 346
3413.1 Guidelines for wireless device drivers 3473.1 Guidelines for wireless device drivers