* RE: Bug#614622: linux-image-2.6.37-1-686: atl2 NIC claims NO CARRIER after suspend/resume; rmmod+insmod fixes the problem
From: Xiong Huang @ 2011-02-23 1:22 UTC (permalink / raw)
To: Ben Hutchings, Jay Cliburn, Chris Snook, Jie Yang
Cc: 614622@bugs.debian.org, netdev, Daniel Kahn Gillmor
In-Reply-To: <1298423651.2211.496.camel@localhost>
after the onboard NIC claims NO Carrier after resuming from suspend-to-RAM, how about it if unplug then re-plug the cable ?
best regards
Xiong
-----Original Message-----
From: netdev-owner@vger.kernel.org [mailto:netdev-owner@vger.kernel.org] On Behalf Of Ben Hutchings
Sent: Wednesday, February 23, 2011 9:14
To: Jay Cliburn; Chris Snook; Jie Yang
Cc: 614622@bugs.debian.org; netdev; Daniel Kahn Gillmor
Subject: Re: Bug#614622: linux-image-2.6.37-1-686: atl2 NIC claims NO CARRIER after suspend/resume; rmmod+insmod fixes the problem
This bug report was made against Debian's package of Linux 2.6.37:
On Tue, 2011-02-22 at 13:08 -0500, Daniel Kahn Gillmor wrote:
> Package: linux-2.6
> Version: 2.6.37-1
> Severity: normal
>
> I recently switched from 2.6.37-trunk-686 to 2.6.37-1-686.
>
> after the switch, i find that sometimes my atl2.ko-driven onboard NIC
> persistently claims NO CARRIER after resuming from suspend-to-RAM,
> even when plugged into a legitimate ethernet port. This is not
> entirely reliable, but maybe 50% of the time.
>
> if i remove and re-load atl2.ko, the interface can properly detect the
> ethernet.
>
> i'm happy to help debug this further if there is any information you
> want me to gather on this hardware. Please let me know.
I don't see any changes to this driver between 2.6.37-rc4 (the first version we built as '2.6.37-trunk-686') and 2.6.37, so I think Daniel just had good luck with the earlier versions.
> ** Kernel log:
[...]
> [67880.276036] PM: suspend of devices complete after 147.583 msecs
> [67880.292274] PM: late suspend of devices complete after 16.227 msecs
> [67880.292426] ACPI: Preparing to enter system sleep state S3
> [67880.316648] PM: Saving platform NVS memory [67880.357927] Disabling
> non-boot CPUs ...
> [67880.357927] Back to C!
> [67880.357927] PM: Restoring platform NVS memory [67880.357927] Force
> enabled HPET at resume [67880.357927] ACPI: Waking up from system
> sleep state S3 [67880.400865] HDA Intel 0000:00:1b.0: restoring config
> space at offset 0x1 (was 0x100006, writing 0x100002) [67880.400904]
> pci 0000:00:1c.0: restoring config space at offset 0x9 (was 0x1fff1,
> writing 0x3fc13fb1) [67880.400913] pci 0000:00:1c.0: restoring config
> space at offset 0x8 (was 0xfff0, writing 0x3fa03f90) [67880.400923]
> pci 0000:00:1c.0: restoring config space at offset 0x7 (was 0xf0,
> writing 0x1010) [67880.400937] pci 0000:00:1c.0: restoring config
> space at offset 0x1 (was 0x100104, writing 0x100107) [67880.400976]
> pci 0000:00:1c.1: restoring config space at offset 0x9 (was 0x1fff1,
> writing 0x3fe13fd1) [67880.400987] pci 0000:00:1c.1: restoring config
> space at offset 0x7 (was 0xf0, writing 0x2020) [67880.401001] pci
> 0000:00:1c.1: restoring config space at offset 0x1 (was 0x100106,
> writing 0x100107) [67880.401042] pci 0000:00:1c.2: restoring config
> space at offset 0x7 (was 0xf0, writing 0x3030) [67880.401056] pci
> 0000:00:1c.2: restoring config space at offset 0x1 (was 0x100106,
> writing 0x100107) [67880.401099] uhci_hcd 0000:00:1d.0: restoring
> config space at offset 0x1 (was 0x2800005, writing 0x2800001)
> [67880.401132] uhci_hcd 0000:00:1d.1: restoring config space at offset
> 0x1 (was 0x2800005, writing 0x2800001) [67880.401165] uhci_hcd
> 0000:00:1d.2: restoring config space at offset 0x1 (was 0x2800005,
> writing 0x2800001) [67880.401197] uhci_hcd 0000:00:1d.3: restoring
> config space at offset 0x1 (was 0x2800005, writing 0x2800001)
> [67880.401239] ehci_hcd 0000:00:1d.7: restoring config space at offset
> 0x1 (was 0x2900006, writing 0x2900002) [67880.401265] pci
> 0000:00:1e.0: restoring config space at offset 0xf (was 0x60000,
> writing 0x600ff) [67880.401538] PM: early resume of devices complete
> after 0.795 msecs [67880.406036] HDA Intel 0000:00:1b.0: PCI INT A ->
> GSI 16 (level, low) -> IRQ 16 [67880.406048] HDA Intel 0000:00:1b.0:
> setting latency timer to 64 [67880.406093] HDA Intel 0000:00:1b.0: irq
> 40 for MSI/MSI-X [67880.406136] pci 0000:00:1c.0: PCI INT A -> GSI 16
> (level, low) -> IRQ 16 [67880.406143] pci 0000:00:1c.0: setting
> latency timer to 64 [67880.406156] pci 0000:00:1c.1: PCI INT B -> GSI
> 17 (level, low) -> IRQ 17 [67880.406163] pci 0000:00:1c.1: setting
> latency timer to 64 [67880.406176] pci 0000:00:1c.2: PCI INT C -> GSI
> 18 (level, low) -> IRQ 18 [67880.406183] pci 0000:00:1c.2: setting
> latency timer to 64 [67880.406198] uhci_hcd 0000:00:1d.0: PCI INT A ->
> GSI 23 (level, low) -> IRQ 23 [67880.406208] uhci_hcd 0000:00:1d.0:
> setting latency timer to 64 [67880.406234] usb usb2: root hub lost
> power or was reset [67880.406253] uhci_hcd 0000:00:1d.1: PCI INT B ->
> GSI 19 (level, low) -> IRQ 19 [67880.406262] uhci_hcd 0000:00:1d.1:
> setting latency timer to 64 [67880.406287] usb usb3: root hub lost
> power or was reset [67880.406303] uhci_hcd 0000:00:1d.2: PCI INT C ->
> GSI 18 (level, low) -> IRQ 18 [67880.406313] uhci_hcd 0000:00:1d.2:
> setting latency timer to 64 [67880.406337] usb usb4: root hub lost
> power or was reset [67880.406354] uhci_hcd 0000:00:1d.3: PCI INT D ->
> GSI 16 (level, low) -> IRQ 16 [67880.406363] uhci_hcd 0000:00:1d.3:
> setting latency timer to 64 [67880.406387] usb usb5: root hub lost
> power or was reset [67880.406405] ehci_hcd 0000:00:1d.7: PCI INT A ->
> GSI 23 (level, low) -> IRQ 23 [67880.406415] ehci_hcd 0000:00:1d.7:
> setting latency timer to 64 [67880.406486] pci 0000:00:1e.0: setting
> latency timer to 64 [67880.406505] ata_piix 0000:00:1f.2: PCI INT B ->
> GSI 19 (level, low) -> IRQ 19 [67880.406513] ata_piix 0000:00:1f.2:
> setting latency timer to 64 [67880.406543] atl2 0000:03:00.0: PCI INT
> A -> GSI 17 (level, low) -> IRQ 17 [67880.406551] atl2 0000:03:00.0:
> setting latency timer to 64 [67880.411177] i915 0000:00:02.0: PCI INT
> A -> GSI 16 (level, low) -> IRQ 16 [67880.411186] i915 0000:00:02.0: setting latency timer to 64 [67880.413110] sd 0:0:0:0: [sda] Starting disk [67880.652031] usb 1-5: reset high speed USB device using ehci_hcd and address 2 [67880.896031] usb 1-8: reset high speed USB device using ehci_hcd and address 3 [67882.532200] ata1.00: ACPI cmd ef/03:45:00:00:00:a0 (SET FEATURES) filtered out [67882.532209] ata1.00: ACPI cmd ef/03:0c:00:00:00:a0 (SET FEATURES) filtered out [67882.548191] ata1.00: configured for UDMA/133 [67882.548697] PM: resume of devices complete after 2147.034 msecs [67882.549278] PM: Finishing wakeup.
> [67882.549283] Restarting tasks ... done.
> [67882.549761] video LNXVIDEO:00: Restoring backlight state
> [67882.980083] usb 3-2: new low speed USB device using uhci_hcd and
> address 5 [67883.150414] atl2 0000:03:00.0: irq 41 for MSI/MSI-X
> [67883.151364] ADDRCONF(NETDEV_UP): eth0: link is not ready
> [67883.159163] usb 3-2: New USB device found, idVendor=0973,
> idProduct=0001 [67883.159174] usb 3-2: New USB device strings: Mfr=1,
> Product=2, SerialNumber=0 [67883.159181] usb 3-2: Product:
> SchlumbergerSema Cryptoflex e-gate [67883.159187] usb 3-2:
> Manufacturer: SchlumbergerSema
I assume this is where Daniel reloads the driver:
> [67977.344181] atl2 0000:03:00.0: PCI INT A disabled [67977.379792]
> Atheros(R) L2 Ethernet Driver - version 2.2.3 [67977.379802] Copyright
> (c) 2007 Atheros Corporation.
> [67977.379870] atl2 0000:03:00.0: PCI INT A -> GSI 17 (level, low) ->
> IRQ 17 [67977.379892] atl2 0000:03:00.0: setting latency timer to 64
> [67993.948723] atl2 0000:03:00.0: irq 41 for MSI/MSI-X [67993.949268]
> ADDRCONF(NETDEV_UP): eth0: link is not ready [67994.154327] atl2: eth0
> NIC Link is Up<100 Mbps Full Duplex> [67994.154739]
> ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[...]
> ** PCI devices:
[...]
> 03:00.0 Ethernet controller [0200]: Atheros Communications L2 Fast Ethernet [1969:2048] (rev a0)
> Subsystem: ASUSTeK Computer Inc. Device [1043:8233]
> Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
> Latency: 0, Cache Line Size: 16 bytes
> Interrupt: pin A routed to IRQ 41
> Region 0: Memory at fbfc0000 (64-bit, non-prefetchable) [size=256K]
> Expansion ROM at fbfa0000 [disabled] [size=128K]
> Capabilities: <access denied>
> Kernel driver in use: atl2
[...]
Ben.
--
Ben Hutchings
Once a job is fouled up, anything done to improve it makes it worse.
^ permalink raw reply
* Re: TX VLAN acceleration on bridges broken in 2.6.37?
From: Jesse Gross @ 2011-02-23 1:32 UTC (permalink / raw)
To: Jan Niehusmann; +Cc: linux-kernel, netdev
In-Reply-To: <20110221232902.GA3440@x61s.reliablesolutions.de>
On Mon, Feb 21, 2011 at 3:29 PM, Jan Niehusmann <jan@gondor.com> wrote:
> With the following configuration, sending vlan tagged traffic from a
> bridged interface doesn't work in 2.6.37.
> The same configuration does work with 2.6.36:
>
> - bridge br0 with physical interface eth0
> - eth0 being an e1000e device (don't know if that's important)
> - vlan interface br0.10
> - (on 2.6.37) tx vlan acceleration active on br0 (default)
>
> Networking on br0.10 doesn't work, and tcpdump on eth0 shows packets
> sent on br0.10 as untagged, instead of vlan 10 tagged.
>
> After turning vlan tx offloading off with 'ethtool -K br0 txvlan off',
> everything works as expected, again.
>
> The workaround is made permanent by reverting "bridge: Add support for
> TX vlan offload.", 361ff8a6cf90d62c0071b7e532e37369bfd3ae77, turning
> of the feature on bridges completely.
I tested this at one point and it worked but it sounds like something
broke after that. It's probably fairly simple, so I'd rather just fix
the problem instead of reverting the commit. I'm just coming back
from vacation and am trying to catch up but I'll try to look at it in
the next couple of days.
^ permalink raw reply
* Bug#614622: linux-image-2.6.37-1-686: atl2 NIC claims NO CARRIER after suspend/resume; rmmod+insmod fixes the problem
From: Daniel Kahn Gillmor @ 2011-02-23 1:34 UTC (permalink / raw)
To: Xiong Huang
Cc: Ben Hutchings, Jay Cliburn, Chris Snook, Jie Yang,
614622@bugs.debian.org, netdev
In-Reply-To: <0FBC7C9C2640634A8B837C2EFFCFF32F01837E4A48@SHEXMB-01.global.atheros.com>
[-- Attachment #1: Type: text/plain, Size: 605 bytes --]
Hi Xiong,
On 02/22/2011 08:22 PM, Xiong Huang wrote:
> after the onboard NIC claims NO Carrier after resuming from suspend-to-RAM, how about it if unplug then re-plug the cable ?
i've tried that, and it is not sufficient to remove the NO CARRIER flag
from the output of "ip link". I've also tried power-cycling the 10/100
miniswitch on the other end of the ethernet cable, but no luck there either.
So far, the only thing i've found that clears the NO CARRIER state is to
remove and re-insert atl2.ko.
I remain open to other suggestions. And thanks for the speedy followup!
--dkg
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 1030 bytes --]
^ permalink raw reply
* Re: 2.6.37 regression: adding main interface to a bridge breaks vlan interface RX
From: Jesse Gross @ 2011-02-23 1:35 UTC (permalink / raw)
To: chriss; +Cc: netdev
In-Reply-To: <loom.20110214T141934-88@post.gmane.org>
On Mon, Feb 14, 2011 at 5:22 AM, chriss <mail_to_chriss@gmx.net> wrote:
> Nicolas de Pesloüan <nicolas.2p.debian <at> gmail.com> writes:
>
>> I think you should have a look at ebtables command, in particular, the
> BROUTING chain of broute
>> table. If this chain ask the packet to be dropped, then bridge will ignore it
> and give a chance to
>> the upper layer to use it. Upper layer might be IP, or in your particular
> setup, VLAN.
>>
>> HTH,
>>
>> Nicolas.
>
> Thank you very much for the ebtables hint.
>
> I also tried to add the vlan to my bridge device but only droping the vlan
> tagged paket with ebtables got it working.
>
> I'm not sure if this is the wanted behavior for bridging vlan actions.
> ..or my network setup is just to ..f%%%'ed up?!
It should work even without ebtables (running vlan on top of bridge,
not side by side). I'll try to look at this in the next couple of
days.
^ permalink raw reply
* RE: Bug#614622: linux-image-2.6.37-1-686: atl2 NIC claims NO CARRIER after suspend/resume; rmmod+insmod fixes the problem
From: Xiong Huang @ 2011-02-23 1:38 UTC (permalink / raw)
To: Daniel Kahn Gillmor
Cc: Ben Hutchings, Jay Cliburn, Chris Snook, 614622@bugs.debian.org,
Cloud Ren, netdev
In-Reply-To: <4D64643C.1020001@fifthhorseman.net>
Hi Daniel
What I mean is to check if the cable link (you can check the peer link LED if your onboard NIC haven't) is ON.
If the cable link is ON, we may focus on software layer :)
Thanks
Xiong
-----Original Message-----
From: Daniel Kahn Gillmor [mailto:dkg@fifthhorseman.net]
Sent: Wednesday, February 23, 2011 9:35
To: Xiong Huang
Cc: Ben Hutchings; Jay Cliburn; Chris Snook; Jie Yang; 614622@bugs.debian.org; netdev
Subject: Re: Bug#614622: linux-image-2.6.37-1-686: atl2 NIC claims NO CARRIER after suspend/resume; rmmod+insmod fixes the problem
Hi Xiong,
On 02/22/2011 08:22 PM, Xiong Huang wrote:
> after the onboard NIC claims NO Carrier after resuming from suspend-to-RAM, how about it if unplug then re-plug the cable ?
i've tried that, and it is not sufficient to remove the NO CARRIER flag from the output of "ip link". I've also tried power-cycling the 10/100 miniswitch on the other end of the ethernet cable, but no luck there either.
So far, the only thing i've found that clears the NO CARRIER state is to remove and re-insert atl2.ko.
I remain open to other suggestions. And thanks for the speedy followup!
--dkg
^ permalink raw reply
* Re: [PATCH v2] ipvs: unify the formula to estimate the overhead of processing connections
From: Wensong Zhang @ 2011-02-23 1:56 UTC (permalink / raw)
To: Simon Horman
Cc: Changli Gao, David S. Miller, Patrick McHardy, Julian Anastasov,
netdev, lvs-devel, netfilter-devel
In-Reply-To: <20110222055553.GA4192@verge.net.au>
Sure, I am ok with this patch. Thanks!
On Tue, Feb 22, 2011 at 1:56 PM, Simon Horman <horms@verge.net.au> wrote:
> On Sat, Feb 19, 2011 at 05:32:28PM +0800, Changli Gao wrote:
>> lc and wlc use the same formula, but lblc and lblcr use another one. There
>> is no reason for using two different formulas for the lc variants.
>>
>> The formula used by lc is used by all the lc variants in this patch.
>
> Wensong, are you ok with this version of the patch?
>
>>
>> Signed-off-by: Changli Gao <xiaosuo@gmail.com>
>> ---
>> v2: use ip_vs_dest_conn_overhead() instead.
>> include/net/ip_vs.h | 14 ++++++++++++++
>> net/netfilter/ipvs/ip_vs_lblc.c | 13 +++----------
>> net/netfilter/ipvs/ip_vs_lblcr.c | 25 +++++++------------------
>> net/netfilter/ipvs/ip_vs_lc.c | 18 +-----------------
>> net/netfilter/ipvs/ip_vs_wlc.c | 20 ++------------------
>> 5 files changed, 27 insertions(+), 63 deletions(-)
>> diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
>> index 5d75fea..e80ffb7 100644
>> --- a/include/net/ip_vs.h
>> +++ b/include/net/ip_vs.h
>> @@ -1241,6 +1241,20 @@ static inline void ip_vs_conn_drop_conntrack(struct ip_vs_conn *cp)
>> /* CONFIG_IP_VS_NFCT */
>> #endif
>>
>> +static inline unsigned int
>> +ip_vs_dest_conn_overhead(struct ip_vs_dest *dest)
>> +{
>> + /*
>> + * We think the overhead of processing active connections is 256
>> + * times higher than that of inactive connections in average. (This
>> + * 256 times might not be accurate, we will change it later) We
>> + * use the following formula to estimate the overhead now:
>> + * dest->activeconns*256 + dest->inactconns
>> + */
>> + return (atomic_read(&dest->activeconns) << 8) +
>> + atomic_read(&dest->inactconns);
>> +}
>> +
>> #endif /* __KERNEL__ */
>>
>> #endif /* _NET_IP_VS_H */
>> diff --git a/net/netfilter/ipvs/ip_vs_lblc.c b/net/netfilter/ipvs/ip_vs_lblc.c
>> index 00b5ffa..58ae403 100644
>> --- a/net/netfilter/ipvs/ip_vs_lblc.c
>> +++ b/net/netfilter/ipvs/ip_vs_lblc.c
>> @@ -389,12 +389,7 @@ __ip_vs_lblc_schedule(struct ip_vs_service *svc)
>> int loh, doh;
>>
>> /*
>> - * We think the overhead of processing active connections is fifty
>> - * times higher than that of inactive connections in average. (This
>> - * fifty times might not be accurate, we will change it later.) We
>> - * use the following formula to estimate the overhead:
>> - * dest->activeconns*50 + dest->inactconns
>> - * and the load:
>> + * We use the following formula to estimate the load:
>> * (dest overhead) / dest->weight
>> *
>> * Remember -- no floats in kernel mode!!!
>> @@ -410,8 +405,7 @@ __ip_vs_lblc_schedule(struct ip_vs_service *svc)
>> continue;
>> if (atomic_read(&dest->weight) > 0) {
>> least = dest;
>> - loh = atomic_read(&least->activeconns) * 50
>> - + atomic_read(&least->inactconns);
>> + loh = ip_vs_dest_conn_overhead(least);
>> goto nextstage;
>> }
>> }
>> @@ -425,8 +419,7 @@ __ip_vs_lblc_schedule(struct ip_vs_service *svc)
>> if (dest->flags & IP_VS_DEST_F_OVERLOAD)
>> continue;
>>
>> - doh = atomic_read(&dest->activeconns) * 50
>> - + atomic_read(&dest->inactconns);
>> + doh = ip_vs_dest_conn_overhead(dest);
>> if (loh * atomic_read(&dest->weight) >
>> doh * atomic_read(&least->weight)) {
>> least = dest;
>> diff --git a/net/netfilter/ipvs/ip_vs_lblcr.c b/net/netfilter/ipvs/ip_vs_lblcr.c
>> index bfa25f1..2ddefe8 100644
>> --- a/net/netfilter/ipvs/ip_vs_lblcr.c
>> +++ b/net/netfilter/ipvs/ip_vs_lblcr.c
>> @@ -178,8 +178,7 @@ static inline struct ip_vs_dest *ip_vs_dest_set_min(struct ip_vs_dest_set *set)
>>
>> if ((atomic_read(&least->weight) > 0)
>> && (least->flags & IP_VS_DEST_F_AVAILABLE)) {
>> - loh = atomic_read(&least->activeconns) * 50
>> - + atomic_read(&least->inactconns);
>> + loh = ip_vs_dest_conn_overhead(least);
>> goto nextstage;
>> }
>> }
>> @@ -192,8 +191,7 @@ static inline struct ip_vs_dest *ip_vs_dest_set_min(struct ip_vs_dest_set *set)
>> if (dest->flags & IP_VS_DEST_F_OVERLOAD)
>> continue;
>>
>> - doh = atomic_read(&dest->activeconns) * 50
>> - + atomic_read(&dest->inactconns);
>> + doh = ip_vs_dest_conn_overhead(dest);
>> if ((loh * atomic_read(&dest->weight) >
>> doh * atomic_read(&least->weight))
>> && (dest->flags & IP_VS_DEST_F_AVAILABLE)) {
>> @@ -228,8 +226,7 @@ static inline struct ip_vs_dest *ip_vs_dest_set_max(struct ip_vs_dest_set *set)
>> list_for_each_entry(e, &set->list, list) {
>> most = e->dest;
>> if (atomic_read(&most->weight) > 0) {
>> - moh = atomic_read(&most->activeconns) * 50
>> - + atomic_read(&most->inactconns);
>> + moh = ip_vs_dest_conn_overhead(most);
>> goto nextstage;
>> }
>> }
>> @@ -239,8 +236,7 @@ static inline struct ip_vs_dest *ip_vs_dest_set_max(struct ip_vs_dest_set *set)
>> nextstage:
>> list_for_each_entry(e, &set->list, list) {
>> dest = e->dest;
>> - doh = atomic_read(&dest->activeconns) * 50
>> - + atomic_read(&dest->inactconns);
>> + doh = ip_vs_dest_conn_overhead(dest);
>> /* moh/mw < doh/dw ==> moh*dw < doh*mw, where mw,dw>0 */
>> if ((moh * atomic_read(&dest->weight) <
>> doh * atomic_read(&most->weight))
>> @@ -563,12 +559,7 @@ __ip_vs_lblcr_schedule(struct ip_vs_service *svc)
>> int loh, doh;
>>
>> /*
>> - * We think the overhead of processing active connections is fifty
>> - * times higher than that of inactive connections in average. (This
>> - * fifty times might not be accurate, we will change it later.) We
>> - * use the following formula to estimate the overhead:
>> - * dest->activeconns*50 + dest->inactconns
>> - * and the load:
>> + * We use the following formula to estimate the load:
>> * (dest overhead) / dest->weight
>> *
>> * Remember -- no floats in kernel mode!!!
>> @@ -585,8 +576,7 @@ __ip_vs_lblcr_schedule(struct ip_vs_service *svc)
>>
>> if (atomic_read(&dest->weight) > 0) {
>> least = dest;
>> - loh = atomic_read(&least->activeconns) * 50
>> - + atomic_read(&least->inactconns);
>> + loh = ip_vs_dest_conn_overhead(least);
>> goto nextstage;
>> }
>> }
>> @@ -600,8 +590,7 @@ __ip_vs_lblcr_schedule(struct ip_vs_service *svc)
>> if (dest->flags & IP_VS_DEST_F_OVERLOAD)
>> continue;
>>
>> - doh = atomic_read(&dest->activeconns) * 50
>> - + atomic_read(&dest->inactconns);
>> + doh = ip_vs_dest_conn_overhead(dest);
>> if (loh * atomic_read(&dest->weight) >
>> doh * atomic_read(&least->weight)) {
>> least = dest;
>> diff --git a/net/netfilter/ipvs/ip_vs_lc.c b/net/netfilter/ipvs/ip_vs_lc.c
>> index 4f69db1..160cb80 100644
>> --- a/net/netfilter/ipvs/ip_vs_lc.c
>> +++ b/net/netfilter/ipvs/ip_vs_lc.c
>> @@ -22,22 +22,6 @@
>>
>> #include <net/ip_vs.h>
>>
>> -
>> -static inline unsigned int
>> -ip_vs_lc_dest_overhead(struct ip_vs_dest *dest)
>> -{
>> - /*
>> - * We think the overhead of processing active connections is 256
>> - * times higher than that of inactive connections in average. (This
>> - * 256 times might not be accurate, we will change it later) We
>> - * use the following formula to estimate the overhead now:
>> - * dest->activeconns*256 + dest->inactconns
>> - */
>> - return (atomic_read(&dest->activeconns) << 8) +
>> - atomic_read(&dest->inactconns);
>> -}
>> -
>> -
>> /*
>> * Least Connection scheduling
>> */
>> @@ -62,7 +46,7 @@ ip_vs_lc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
>> if ((dest->flags & IP_VS_DEST_F_OVERLOAD) ||
>> atomic_read(&dest->weight) == 0)
>> continue;
>> - doh = ip_vs_lc_dest_overhead(dest);
>> + doh = ip_vs_dest_conn_overhead(dest);
>> if (!least || doh < loh) {
>> least = dest;
>> loh = doh;
>> diff --git a/net/netfilter/ipvs/ip_vs_wlc.c b/net/netfilter/ipvs/ip_vs_wlc.c
>> index bbddfdb..db751f5 100644
>> --- a/net/netfilter/ipvs/ip_vs_wlc.c
>> +++ b/net/netfilter/ipvs/ip_vs_wlc.c
>> @@ -27,22 +27,6 @@
>>
>> #include <net/ip_vs.h>
>>
>> -
>> -static inline unsigned int
>> -ip_vs_wlc_dest_overhead(struct ip_vs_dest *dest)
>> -{
>> - /*
>> - * We think the overhead of processing active connections is 256
>> - * times higher than that of inactive connections in average. (This
>> - * 256 times might not be accurate, we will change it later) We
>> - * use the following formula to estimate the overhead now:
>> - * dest->activeconns*256 + dest->inactconns
>> - */
>> - return (atomic_read(&dest->activeconns) << 8) +
>> - atomic_read(&dest->inactconns);
>> -}
>> -
>> -
>> /*
>> * Weighted Least Connection scheduling
>> */
>> @@ -71,7 +55,7 @@ ip_vs_wlc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
>> if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) &&
>> atomic_read(&dest->weight) > 0) {
>> least = dest;
>> - loh = ip_vs_wlc_dest_overhead(least);
>> + loh = ip_vs_dest_conn_overhead(least);
>> goto nextstage;
>> }
>> }
>> @@ -85,7 +69,7 @@ ip_vs_wlc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
>> list_for_each_entry_continue(dest, &svc->destinations, n_list) {
>> if (dest->flags & IP_VS_DEST_F_OVERLOAD)
>> continue;
>> - doh = ip_vs_wlc_dest_overhead(dest);
>> + doh = ip_vs_dest_conn_overhead(dest);
>> if (loh * atomic_read(&dest->weight) >
>> doh * atomic_read(&least->weight)) {
>> least = dest;
>>
>
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: Bug#614622: linux-image-2.6.37-1-686: atl2 NIC claims NO CARRIER after suspend/resume; rmmod+insmod fixes the problem
From: Daniel Kahn Gillmor @ 2011-02-23 1:57 UTC (permalink / raw)
To: Xiong Huang
Cc: Ben Hutchings, Jay Cliburn, Chris Snook, 614622@bugs.debian.org,
Cloud Ren, netdev
In-Reply-To: <0FBC7C9C2640634A8B837C2EFFCFF32F01837E4A63@SHEXMB-01.global.atheros.com>
[-- Attachment #1: Type: text/plain, Size: 590 bytes --]
Hi Xiong--
On 02/22/2011 08:38 PM, Xiong Huang wrote:
> What I mean is to check if the cable link (you can check the peer link LED if your onboard NIC haven't) is ON.
> If the cable link is ON, we may focus on software layer :)
the peer (mini-switch) link LED stays off, regardless of unplug/replug
of the cable, power-cycling the mini-switch, or of tweaking the
interface via:
ip link set eth0 down
ip link set eth0 up
However, the peer link LED turns on immediately when i do:
modprobe -v -r atl2
modprobe -v atl2
hope this is useful info,
--dkg
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 1030 bytes --]
^ permalink raw reply
* Re: Bug#614622: linux-image-2.6.37-1-686: atl2 NIC claims NO CARRIER after suspend/resume; rmmod+insmod fixes the problem
From: Daniel Kahn Gillmor @ 2011-02-23 2:06 UTC (permalink / raw)
To: Ben Hutchings; +Cc: Jay Cliburn, Chris Snook, Jie Yang, 614622, netdev
In-Reply-To: <1298423651.2211.496.camel@localhost>
[-- Attachment #1: Type: text/plain, Size: 947 bytes --]
On 02/22/2011 08:14 PM, Ben Hutchings wrote:
> This bug report was made against Debian's package of Linux 2.6.37:
[...]
> I don't see any changes to this driver between 2.6.37-rc4 (the first
> version we built as '2.6.37-trunk-686') and 2.6.37, so I think Daniel
> just had good luck with the earlier versions.
I was running 2.6.37-1~experimental.1, fwiw, since 2011-01-09. I don't
think that was based off of rc4, because i was running
2.6.37~rc5-1~experimental.3 before that since 2010-12-16.
so the dates are:
2010-12-16: start running 2.6.37~rc5-1~experimental.3
2011-01-09: start running 2.6.37-1~experimental.1
2011-02-17: start running 2.6.37-1
I run this machine every day, connect it to multiple wired networks, and
have a usage pattern of suspend-to-ram at least twice a day. I never
saw this problem until i was running 2.6.37-1.
I don't think i was simply lucky with the previous versions.
--dkg
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 1030 bytes --]
^ permalink raw reply
* [PATCH 3/4] net: Fix ETHTOOL_GFEATURES compatibility
From: Michał Mirosław @ 2011-02-23 2:52 UTC (permalink / raw)
To: netdev; +Cc: Ben Hutchings, David Miller
In-Reply-To: <cover.1298429033.git.mirq-linux@rere.qmqm.pl>
Implement getting rx checksum state for not updated drivers.
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
net/core/ethtool.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 66cdc76..69a3edc 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -168,6 +168,18 @@ EXPORT_SYMBOL(ethtool_ntuple_flush);
#define ETHTOOL_DEV_FEATURE_WORDS 1
+static void ethtool_get_features_compat(struct net_device *dev,
+ struct ethtool_get_features_block *features)
+{
+ if (!dev->ethtool_ops)
+ return;
+
+ /* getting RX checksum */
+ if (dev->ethtool_ops->get_rx_csum)
+ if (dev->ethtool_ops->get_rx_csum(dev))
+ features[0].active |= NETIF_F_RXCSUM;
+}
+
static int ethtool_get_features(struct net_device *dev, void __user *useraddr)
{
struct ethtool_gfeatures cmd = {
@@ -185,6 +197,8 @@ static int ethtool_get_features(struct net_device *dev, void __user *useraddr)
u32 __user *sizeaddr;
u32 copy_size;
+ ethtool_get_features_compat(dev, features);
+
sizeaddr = useraddr + offsetof(struct ethtool_gfeatures, size);
if (get_user(copy_size, sizeaddr))
return -EFAULT;
--
1.7.2.3
^ permalink raw reply related
* [PATCH 0/4] Fixes for unified offload configuration
From: Michał Mirosław @ 2011-02-23 2:52 UTC (permalink / raw)
To: netdev; +Cc: Ben Hutchings, David Miller
this series contains couple of fixes to ethtool unification work in net-next.
patches 1 and 2 (resend):
fix following message at device registration:
(unregistered net_device): features changed: 0x00011065 -> 0x00015065
patches 3 and 4:
implement compatibility fallback in ethtool_{g,s}features for drivers
not converted to new offload setting scheme.
only compile tested for now as my test box has some hardware issues lately.
best regards,
michał mirosław
michał Mirosław (4):
Fix "(unregistered net_device): Features changed" message
net: avoid initial "Features changed" message
net: Fix ETHTOOL_GFEATURES compatibility
net: Implement SFEATURES compatibility for not updated drivers
include/linux/ethtool.h | 5 +++
net/core/dev.c | 12 ++++---
net/core/ethtool.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 87 insertions(+), 5 deletions(-)
--
1.7.2.3
^ permalink raw reply
* [PATCH 2/4] net: avoid initial "Features changed" message
From: Michał Mirosław @ 2011-02-23 2:52 UTC (permalink / raw)
To: netdev; +Cc: Ben Hutchings, David Miller
In-Reply-To: <cover.1298429033.git.mirq-linux@rere.qmqm.pl>
Avoid "Features changed" message and ndo_set_features call on device
registration caused by automatic enabling of GSO and GRO. Driver should
have enabled hardware offloads it set in features, so the ndo_set_features()
is not needed at registration time.
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
net/core/dev.c | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index 77e5edb..69a3c08 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5476,12 +5476,14 @@ int register_netdevice(struct net_device *dev)
* software offloads (GSO and GRO).
*/
dev->hw_features |= NETIF_F_SOFT_FEATURES;
- dev->wanted_features = (dev->features & dev->hw_features)
- | NETIF_F_SOFT_FEATURES;
+ dev->features |= NETIF_F_SOFT_FEATURES;
+ dev->wanted_features = dev->features & dev->hw_features;
/* Avoid warning from netdev_fix_features() for GSO without SG */
- if (!(dev->wanted_features & NETIF_F_SG))
+ if (!(dev->wanted_features & NETIF_F_SG)) {
dev->wanted_features &= ~NETIF_F_GSO;
+ dev->features &= ~NETIF_F_GSO;
+ }
/* Enable GRO and NETIF_F_HIGHDMA for vlans by default,
* vlan_dev_init() will do the dev->features check, so these features
--
1.7.2.3
^ permalink raw reply related
* [PATCH 1/4] Fix "(unregistered net_device): Features changed" message
From: Michał Mirosław @ 2011-02-23 2:52 UTC (permalink / raw)
To: netdev; +Cc: Ben Hutchings, David Miller
In-Reply-To: <cover.1298429033.git.mirq-linux@rere.qmqm.pl>
Fix netdev_update_features() messages on register time by moving
the call further in register_netdevice(). When
netdev->reg_state != NETREG_REGISTERED, netdev_name() returns
"(unregistered netdevice)" even if the dev's name is already filled.
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
net/core/dev.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index 578415c..77e5edb 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5483,8 +5483,6 @@ int register_netdevice(struct net_device *dev)
if (!(dev->wanted_features & NETIF_F_SG))
dev->wanted_features &= ~NETIF_F_GSO;
- netdev_update_features(dev);
-
/* Enable GRO and NETIF_F_HIGHDMA for vlans by default,
* vlan_dev_init() will do the dev->features check, so these features
* are enabled only if supported by underlying device.
@@ -5501,6 +5499,8 @@ int register_netdevice(struct net_device *dev)
goto err_uninit;
dev->reg_state = NETREG_REGISTERED;
+ netdev_update_features(dev);
+
/*
* Default initial state at registry is that the
* device is present.
--
1.7.2.3
^ permalink raw reply related
* [PATCH 4/4] net: Implement SFEATURES compatibility for not updated drivers
From: Michał Mirosław @ 2011-02-23 2:52 UTC (permalink / raw)
To: netdev; +Cc: Ben Hutchings, David Miller
In-Reply-To: <cover.1298429033.git.mirq-linux@rere.qmqm.pl>
Use discrete setting ops for not updated drivers. This will not make
them conform to full G/SFEATURES semantics, though.
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
include/linux/ethtool.h | 5 ++++
net/core/ethtool.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 66 insertions(+), 0 deletions(-)
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index 54d776c..aac3e2e 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -591,6 +591,9 @@ struct ethtool_sfeatures {
* Probably there are other device-specific constraints on some features
* in the set. When %ETHTOOL_F_UNSUPPORTED is set, .valid is considered
* here as though ignored bits were cleared.
+ * %ETHTOOL_F_COMPAT - some or all changes requested were made by calling
+ * compatibility functions. Requested offload state cannot be properly
+ * managed by kernel.
*
* Meaning of bits in the masks are obtained by %ETHTOOL_GSSET_INFO (number of
* bits in the arrays - always multiple of 32) and %ETHTOOL_GSTRINGS commands
@@ -600,10 +603,12 @@ struct ethtool_sfeatures {
enum ethtool_sfeatures_retval_bits {
ETHTOOL_F_UNSUPPORTED__BIT,
ETHTOOL_F_WISH__BIT,
+ ETHTOOL_F_COMPAT__BIT,
};
#define ETHTOOL_F_UNSUPPORTED (1 << ETHTOOL_F_UNSUPPORTED__BIT)
#define ETHTOOL_F_WISH (1 << ETHTOOL_F_WISH__BIT)
+#define ETHTOOL_F_COMPAT (1 << ETHTOOL_F_COMPAT__BIT)
#ifdef __KERNEL__
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 69a3edc..c1a71bb 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -178,6 +178,64 @@ static void ethtool_get_features_compat(struct net_device *dev,
if (dev->ethtool_ops->get_rx_csum)
if (dev->ethtool_ops->get_rx_csum(dev))
features[0].active |= NETIF_F_RXCSUM;
+
+ /* mark legacy-changeable features */
+ if (dev->ethtool_ops->set_sg)
+ features[0].available |= NETIF_F_SG;
+ if (dev->ethtool_ops->set_tx_csum)
+ features[0].available |= NETIF_F_ALL_CSUM;
+ if (dev->ethtool_ops->set_tso)
+ features[0].available |= NETIF_F_ALL_TSO;
+ if (dev->ethtool_ops->set_rx_csum)
+ features[0].available |= NETIF_F_RXCSUM;
+ if (dev->ethtool_ops->set_flags)
+ features[0].available |= flags_dup_features;
+}
+
+static int ethtool_set_feature_compat(struct net_device *dev,
+ int (*legacy_set)(struct net_device *, u32),
+ struct ethtool_set_features_block *features, u32 mask)
+{
+ u32 do_set;
+
+ if (!legacy_set)
+ return 0;
+
+ if (!(features[0].valid & mask))
+ return 0;
+
+ features[0].valid &= ~mask;
+
+ do_set = !!(features[0].requested & mask);
+
+ if (legacy_set(dev, do_set) < 0)
+ netdev_info(dev,
+ "Legacy feature change (%s) failed for 0x%08x\n",
+ do_set ? "set" : "clear", mask);
+
+ return 1;
+}
+
+static int ethtool_set_features_compat(struct net_device *dev,
+ struct ethtool_set_features_block *features)
+{
+ int compat;
+
+ if (!dev->ethtool_ops)
+ return 0;
+
+ compat = ethtool_set_feature_compat(dev, dev->ethtool_ops->set_sg,
+ features, NETIF_F_SG);
+ compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_tx_csum,
+ features, NETIF_F_ALL_CSUM);
+ compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_tso,
+ features, NETIF_F_ALL_TSO);
+ compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_rx_csum,
+ features, NETIF_F_RXCSUM);
+ compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_flags,
+ features, flags_dup_features);
+
+ return compat;
}
static int ethtool_get_features(struct net_device *dev, void __user *useraddr)
@@ -234,6 +292,9 @@ static int ethtool_set_features(struct net_device *dev, void __user *useraddr)
if (features[0].valid & ~NETIF_F_ETHTOOL_BITS)
return -EINVAL;
+ if (ethtool_set_features_compat(dev, features))
+ ret |= ETHTOOL_F_COMPAT;
+
if (features[0].valid & ~dev->hw_features) {
features[0].valid &= dev->hw_features;
ret |= ETHTOOL_F_UNSUPPORTED;
--
1.7.2.3
^ permalink raw reply related
* Re: [PATCH ethtool 2/3] ethtool: Regularise handling of offload flags
From: Michał Mirosław @ 2011-02-23 3:03 UTC (permalink / raw)
To: Ben Hutchings; +Cc: netdev
In-Reply-To: <1298307548.2608.50.camel@bwh-desktop>
On Mon, Feb 21, 2011 at 04:59:08PM +0000, Ben Hutchings wrote:
> Use the new ETHTOOL_{G,S}FEATURES operations where available, and
> use the new structure and netif feature flags in any case.
[...]
> --- a/ethtool.c
> +++ b/ethtool.c
[...]
> static int do_soffload(int fd, struct ifreq *ifr)
> {
> + struct {
> + struct ethtool_gfeatures cmd;
> + struct ethtool_get_features_block data[1];
> + } get_features;
> + struct {
> + struct ethtool_sfeatures cmd;
> + struct ethtool_set_features_block data[1];
> + } set_features;
> struct ethtool_value eval;
> int err, changed = 0;
> + u32 value;
> + int i;
[-]
> + get_features.cmd.cmd = ETHTOOL_GFEATURES;
> + get_features.cmd.size = ARRAY_SIZE(get_features.data);
> + ifr->ifr_data = (caddr_t)&get_features;
> + err = ioctl(fd, SIOCETHTOOL, ifr);
> + if (err == 0) {
> + set_features.cmd.cmd = ETHTOOL_SFEATURES;
> + set_features.cmd.size = ARRAY_SIZE(set_features.data);
> + set_features.data[0] = off_features;
> +
> + for (i = 0; i < ARRAY_SIZE(off_feature_def); i++) {
> + value = off_feature_def[i].value;
> + if (!(off_features.valid & value))
> + continue;
> + if (!(get_features.data[0].available & value)) {
> + /* None of these features can be changed */
> + fprintf(stderr,
> + "Cannot set device %s settings: "
> + "Operation not supported\n",
> + off_feature_def[i].long_name);
> + } else if (off_features.requested & value) {
> + /* Some of these features can be
> + * enabled; mask out any that cannot
> + */
> + set_features.data[0].requested &=
> + ~(value &
> + ~get_features.data[0].available);
> + }
> }
[-]
> + ifr->ifr_data = (caddr_t)&set_features;
> + err = ioctl(fd, SIOCETHTOOL, ifr);
> + if (err < 0) {
> + perror("Cannot set device offload settings");
> + return 1;
> }
[-]
> + changed = !!set_features.data[0].valid;
[-]
> + if (err & ETHTOOL_F_WISH)
> + fprintf(stderr,
> + "Cannot set device offload settings: "
> + "Some requested features depend on others "
> + "that are not currently enabled\n");
> +
> + /* ETHTOOL_F_UNSUPPORTED should never be set as we
> + * checked for unsupported flags above. Treat any
> + * other warning flags as unknown.
> + */
> + if (err & ~ETHTOOL_F_WISH)
> + fprintf(stderr,
> + "Cannot set device offload settings: "
> + "warning flags %#x",
> + err & ~ETHTOOL_F_WISH);
> + } else if (errno != EOPNOTSUPP && errno != EPERM) {
> + perror("Cannot get device offload settings");
> + return 1;
> + } else {
> + for (i = 0; i < ARRAY_SIZE(off_feature_def); i++) {
> + if (!off_feature_def[i].cmd)
> + continue;
> + if (off_features.valid & off_feature_def[i].value) {
> + changed = 1;
> + eval.cmd = off_feature_def[i].cmd + 1;
> + eval.data = !!(off_features.requested &
> + off_feature_def[i].value);
> + ifr->ifr_data = (caddr_t)&eval;
> + err = send_ioctl(fd, ifr);
> + if (err) {
> + fprintf(stderr,
> + "Cannot set device %s settings: %m\n",
> + off_feature_def[i].long_name);
> + return 1;
> + }
> + }
> }
[-]
> + if (off_features.valid & flags_dup_features) {
> + changed = 1;
> + eval.cmd = ETHTOOL_GFLAGS;
> + eval.data = 0;
> + ifr->ifr_data = (caddr_t)&eval;
> + err = ioctl(fd, SIOCETHTOOL, ifr);
> + if (err) {
> + perror("Cannot get device flag settings");
> + return 91;
> + }
[-]
> + eval.cmd = ETHTOOL_SFLAGS;
> + eval.data &= ~(off_features.valid & flags_dup_features);
> + eval.data |= (off_features.requested &
> + flags_dup_features);
> +
> + err = ioctl(fd, SIOCETHTOOL, ifr);
> + if (err) {
> + perror("Cannot set device flag settings");
> + return 92;
> + }
> }
> }
I noticed that you assumed that ETHTOOL_SFEATURES can change all features
changeable. This was not the case for drivers not yet converted to
ndo_fix_features() as there could be features changeable only by old ops.
I implemented the kernel part for fixing that in patches sent earlier today.
This introduces ETHTOOL_F_COMPAT bit that indicates when the compatibility
fallback was used (requested features are not fully saved by kernel in
that case).
Best Regards,
Michał Mirosław
^ permalink raw reply
* [PATCH 00/20] Const'ify flowi args in xfrm and flow cache.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
This series walks the dependency chain marking flowi arguments
as const, when possible, in the xfrm layer.
Then at the end we are able to thus use const flowi objects in
the flow cache as well.
Signed-off-by: David S. Miller <davem@davemloft.net>
^ permalink raw reply
* [PATCH 01/20] xfrm: Mark flowi arg const in key extraction helpers.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
Signed-off-by: David S. Miller <davem@davemloft.net>
---
include/net/xfrm.h | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 1f6e8a0..2de3dae 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -790,7 +790,7 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
}
static __inline__
-__be16 xfrm_flowi_sport(struct flowi *fl)
+__be16 xfrm_flowi_sport(const struct flowi *fl)
{
__be16 port;
switch(fl->proto) {
@@ -817,7 +817,7 @@ __be16 xfrm_flowi_sport(struct flowi *fl)
}
static __inline__
-__be16 xfrm_flowi_dport(struct flowi *fl)
+__be16 xfrm_flowi_dport(const struct flowi *fl)
{
__be16 port;
switch(fl->proto) {
@@ -1127,7 +1127,7 @@ static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir,
#endif
static __inline__
-xfrm_address_t *xfrm_flowi_daddr(struct flowi *fl, unsigned short family)
+xfrm_address_t *xfrm_flowi_daddr(const struct flowi *fl, unsigned short family)
{
switch (family){
case AF_INET:
@@ -1139,7 +1139,7 @@ xfrm_address_t *xfrm_flowi_daddr(struct flowi *fl, unsigned short family)
}
static __inline__
-xfrm_address_t *xfrm_flowi_saddr(struct flowi *fl, unsigned short family)
+xfrm_address_t *xfrm_flowi_saddr(const struct flowi *fl, unsigned short family)
{
switch (family){
case AF_INET:
@@ -1151,7 +1151,7 @@ xfrm_address_t *xfrm_flowi_saddr(struct flowi *fl, unsigned short family)
}
static __inline__
-void xfrm_flowi_addr_get(struct flowi *fl,
+void xfrm_flowi_addr_get(const struct flowi *fl,
xfrm_address_t *saddr, xfrm_address_t *daddr,
unsigned short family)
{
@@ -1204,7 +1204,7 @@ xfrm_state_addr_check(struct xfrm_state *x,
}
static __inline__ int
-xfrm_state_addr_flow_check(struct xfrm_state *x, struct flowi *fl,
+xfrm_state_addr_flow_check(struct xfrm_state *x, const struct flowi *fl,
unsigned short family)
{
switch (family) {
--
1.7.4.1
^ permalink raw reply related
* [PATCH 02/20] xfrm: Mark flowi arg to ->get_tos() const.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
Signed-off-by: David S. Miller <davem@davemloft.net>
---
include/net/xfrm.h | 2 +-
net/ipv4/xfrm4_policy.c | 2 +-
net/ipv6/xfrm6_policy.c | 2 +-
net/xfrm/xfrm_policy.c | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 2de3dae..2c0927b 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -273,7 +273,7 @@ struct xfrm_policy_afinfo {
void (*decode_session)(struct sk_buff *skb,
struct flowi *fl,
int reverse);
- int (*get_tos)(struct flowi *fl);
+ int (*get_tos)(const struct flowi *fl);
int (*init_path)(struct xfrm_dst *path,
struct dst_entry *dst,
int nfheader_len);
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
index 19fbdec..ef12e68 100644
--- a/net/ipv4/xfrm4_policy.c
+++ b/net/ipv4/xfrm4_policy.c
@@ -56,7 +56,7 @@ static int xfrm4_get_saddr(struct net *net,
return 0;
}
-static int xfrm4_get_tos(struct flowi *fl)
+static int xfrm4_get_tos(const struct flowi *fl)
{
return IPTOS_RT_MASK & fl->fl4_tos; /* Strip ECN bits */
}
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
index 834dc02..753e9a1 100644
--- a/net/ipv6/xfrm6_policy.c
+++ b/net/ipv6/xfrm6_policy.c
@@ -67,7 +67,7 @@ static int xfrm6_get_saddr(struct net *net,
return 0;
}
-static int xfrm6_get_tos(struct flowi *fl)
+static int xfrm6_get_tos(const struct flowi *fl)
{
return 0;
}
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index 7a8e2c7..f8ccb97 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -1256,7 +1256,7 @@ xfrm_tmpl_resolve(struct xfrm_policy **pols, int npols, struct flowi *fl,
* still valid.
*/
-static inline int xfrm_get_tos(struct flowi *fl, int family)
+static inline int xfrm_get_tos(const struct flowi *fl, int family)
{
struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(family);
int tos;
--
1.7.4.1
^ permalink raw reply related
* [PATCH 03/20] xfrm: Mark flowi arg to ->fill_dst() const.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
Signed-off-by: David S. Miller <davem@davemloft.net>
---
include/net/xfrm.h | 2 +-
net/ipv4/xfrm4_policy.c | 2 +-
net/ipv6/xfrm6_policy.c | 2 +-
net/xfrm/xfrm_policy.c | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 2c0927b..c77407f 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -279,7 +279,7 @@ struct xfrm_policy_afinfo {
int nfheader_len);
int (*fill_dst)(struct xfrm_dst *xdst,
struct net_device *dev,
- struct flowi *fl);
+ const struct flowi *fl);
};
extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo);
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
index ef12e68..1e9844d 100644
--- a/net/ipv4/xfrm4_policy.c
+++ b/net/ipv4/xfrm4_policy.c
@@ -68,7 +68,7 @@ static int xfrm4_init_path(struct xfrm_dst *path, struct dst_entry *dst,
}
static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
- struct flowi *fl)
+ const struct flowi *fl)
{
struct rtable *rt = (struct rtable *)xdst->route;
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
index 753e9a1..f2fa904 100644
--- a/net/ipv6/xfrm6_policy.c
+++ b/net/ipv6/xfrm6_policy.c
@@ -87,7 +87,7 @@ static int xfrm6_init_path(struct xfrm_dst *path, struct dst_entry *dst,
}
static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
- struct flowi *fl)
+ const struct flowi *fl)
{
struct rt6_info *rt = (struct rt6_info*)xdst->route;
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index f8ccb97..fa0b7f3 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -1369,7 +1369,7 @@ static inline int xfrm_init_path(struct xfrm_dst *path, struct dst_entry *dst,
}
static inline int xfrm_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
- struct flowi *fl)
+ const struct flowi *fl)
{
struct xfrm_policy_afinfo *afinfo =
xfrm_policy_get_afinfo(xdst->u.dst.ops->family);
--
1.7.4.1
^ permalink raw reply related
* [PATCH 4/20] xfrm: Mark flowi arg to ->init_tempsel() const.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
Signed-off-by: David S. Miller <davem@davemloft.net>
---
include/net/xfrm.h | 3 ++-
net/ipv4/xfrm4_state.c | 2 +-
net/ipv6/xfrm6_state.c | 2 +-
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index c77407f..614c296 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -300,7 +300,8 @@ struct xfrm_state_afinfo {
const struct xfrm_type *type_map[IPPROTO_MAX];
struct xfrm_mode *mode_map[XFRM_MODE_MAX];
int (*init_flags)(struct xfrm_state *x);
- void (*init_tempsel)(struct xfrm_selector *sel, struct flowi *fl);
+ void (*init_tempsel)(struct xfrm_selector *sel,
+ const struct flowi *fl);
void (*init_temprop)(struct xfrm_state *x, struct xfrm_tmpl *tmpl,
xfrm_address_t *daddr, xfrm_address_t *saddr);
int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n);
diff --git a/net/ipv4/xfrm4_state.c b/net/ipv4/xfrm4_state.c
index 4794762..19eb560 100644
--- a/net/ipv4/xfrm4_state.c
+++ b/net/ipv4/xfrm4_state.c
@@ -21,7 +21,7 @@ static int xfrm4_init_flags(struct xfrm_state *x)
}
static void
-__xfrm4_init_tempsel(struct xfrm_selector *sel, struct flowi *fl)
+__xfrm4_init_tempsel(struct xfrm_selector *sel, const struct flowi *fl)
{
sel->daddr.a4 = fl->fl4_dst;
sel->saddr.a4 = fl->fl4_src;
diff --git a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c
index a67575d..68a14c0 100644
--- a/net/ipv6/xfrm6_state.c
+++ b/net/ipv6/xfrm6_state.c
@@ -20,7 +20,7 @@
#include <net/addrconf.h>
static void
-__xfrm6_init_tempsel(struct xfrm_selector *sel, struct flowi *fl)
+__xfrm6_init_tempsel(struct xfrm_selector *sel, const struct flowi *fl)
{
/* Initialize temporary selector matching only
* to current session. */
--
1.7.4.1
^ permalink raw reply related
* [PATCH 5/20] xfrm: Mark flowi arg to xfrm_type->reject() const.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
Signed-off-by: David S. Miller <davem@davemloft.net>
---
include/net/xfrm.h | 3 ++-
net/ipv6/mip6.c | 3 ++-
net/xfrm/xfrm_policy.c | 2 +-
3 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 614c296..cbe0003 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -334,7 +334,8 @@ struct xfrm_type {
void (*destructor)(struct xfrm_state *);
int (*input)(struct xfrm_state *, struct sk_buff *skb);
int (*output)(struct xfrm_state *, struct sk_buff *pskb);
- int (*reject)(struct xfrm_state *, struct sk_buff *, struct flowi *);
+ int (*reject)(struct xfrm_state *, struct sk_buff *,
+ const struct flowi *);
int (*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **);
/* Estimate maximal size of result of transformation of a dgram */
u32 (*get_mtu)(struct xfrm_state *, int size);
diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c
index d6e9599..f3e3ca9 100644
--- a/net/ipv6/mip6.c
+++ b/net/ipv6/mip6.c
@@ -203,7 +203,8 @@ static inline int mip6_report_rl_allow(struct timeval *stamp,
return allow;
}
-static int mip6_destopt_reject(struct xfrm_state *x, struct sk_buff *skb, struct flowi *fl)
+static int mip6_destopt_reject(struct xfrm_state *x, struct sk_buff *skb,
+ const struct flowi *fl)
{
struct net *net = xs_net(x);
struct inet6_skb_parm *opt = (struct inet6_skb_parm *)skb->cb;
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index fa0b7f3..ccd47cf 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -1907,7 +1907,7 @@ int xfrm_lookup(struct net *net, struct dst_entry **dst_p, struct flowi *fl,
EXPORT_SYMBOL(xfrm_lookup);
static inline int
-xfrm_secpath_reject(int idx, struct sk_buff *skb, struct flowi *fl)
+xfrm_secpath_reject(int idx, struct sk_buff *skb, const struct flowi *fl)
{
struct xfrm_state *x;
--
1.7.4.1
^ permalink raw reply related
* [PATCH 06/20] xfrm: Mark token args to addr_match() const.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
Also, make it return a real bool.
Signed-off-by: David S. Miller <davem@davemloft.net>
---
include/net/xfrm.h | 13 +++++++------
1 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index cbe0003..2328532 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -765,10 +765,11 @@ static inline void xfrm_state_hold(struct xfrm_state *x)
atomic_inc(&x->refcnt);
}
-static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
+static inline bool addr_match(const void *token1, const void *token2,
+ int prefixlen)
{
- __be32 *a1 = token1;
- __be32 *a2 = token2;
+ const __be32 *a1 = token1;
+ const __be32 *a2 = token2;
int pdw;
int pbi;
@@ -777,7 +778,7 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
if (pdw)
if (memcmp(a1, a2, pdw << 2))
- return 0;
+ return false;
if (pbi) {
__be32 mask;
@@ -785,10 +786,10 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
mask = htonl((0xffffffff) << (32 - pbi));
if ((a1[pdw] ^ a2[pdw]) & mask)
- return 0;
+ return false;
}
- return 1;
+ return true;
}
static __inline__
--
1.7.4.1
^ permalink raw reply related
* [PATCH 07/20] xfrm: Mark flowi arg to xfrm_selector_match() const.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
Signed-off-by: David S. Miller <davem@davemloft.net>
---
include/net/xfrm.h | 3 ++-
net/xfrm/xfrm_policy.c | 8 ++++----
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 2328532..b965ad7 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -843,7 +843,8 @@ __be16 xfrm_flowi_dport(const struct flowi *fl)
return port;
}
-extern int xfrm_selector_match(struct xfrm_selector *sel, struct flowi *fl,
+extern int xfrm_selector_match(struct xfrm_selector *sel,
+ const struct flowi *fl,
unsigned short family);
#ifdef CONFIG_SECURITY_NETWORK_XFRM
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index ccd47cf..71e6dc2 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -58,7 +58,7 @@ static struct xfrm_policy *__xfrm_policy_unlink(struct xfrm_policy *pol,
int dir);
static inline int
-__xfrm4_selector_match(struct xfrm_selector *sel, struct flowi *fl)
+__xfrm4_selector_match(struct xfrm_selector *sel, const struct flowi *fl)
{
return addr_match(&fl->fl4_dst, &sel->daddr, sel->prefixlen_d) &&
addr_match(&fl->fl4_src, &sel->saddr, sel->prefixlen_s) &&
@@ -69,7 +69,7 @@ __xfrm4_selector_match(struct xfrm_selector *sel, struct flowi *fl)
}
static inline int
-__xfrm6_selector_match(struct xfrm_selector *sel, struct flowi *fl)
+__xfrm6_selector_match(struct xfrm_selector *sel, const struct flowi *fl)
{
return addr_match(&fl->fl6_dst, &sel->daddr, sel->prefixlen_d) &&
addr_match(&fl->fl6_src, &sel->saddr, sel->prefixlen_s) &&
@@ -79,8 +79,8 @@ __xfrm6_selector_match(struct xfrm_selector *sel, struct flowi *fl)
(fl->oif == sel->ifindex || !sel->ifindex);
}
-int xfrm_selector_match(struct xfrm_selector *sel, struct flowi *fl,
- unsigned short family)
+int xfrm_selector_match(struct xfrm_selector *sel, const struct flowi *fl,
+ unsigned short family)
{
switch (family) {
case AF_INET:
--
1.7.4.1
^ permalink raw reply related
* [PATCH 08/20] xfrm: Mark flowi arg to security_xfrm_state_pol_flow_match() const.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
Signed-off-by: David S. Miller <davem@davemloft.net>
---
include/linux/security.h | 7 ++++---
security/capability.c | 2 +-
security/security.c | 3 ++-
security/selinux/include/xfrm.h | 2 +-
security/selinux/xfrm.c | 2 +-
5 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/include/linux/security.h b/include/linux/security.h
index b2b7f97..9b5f184 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -1623,7 +1623,7 @@ struct security_operations {
int (*xfrm_policy_lookup) (struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir);
int (*xfrm_state_pol_flow_match) (struct xfrm_state *x,
struct xfrm_policy *xp,
- struct flowi *fl);
+ const struct flowi *fl);
int (*xfrm_decode_session) (struct sk_buff *skb, u32 *secid, int ckall);
#endif /* CONFIG_SECURITY_NETWORK_XFRM */
@@ -2761,7 +2761,8 @@ int security_xfrm_state_delete(struct xfrm_state *x);
void security_xfrm_state_free(struct xfrm_state *x);
int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir);
int security_xfrm_state_pol_flow_match(struct xfrm_state *x,
- struct xfrm_policy *xp, struct flowi *fl);
+ struct xfrm_policy *xp,
+ const struct flowi *fl);
int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid);
void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl);
@@ -2813,7 +2814,7 @@ static inline int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_s
}
static inline int security_xfrm_state_pol_flow_match(struct xfrm_state *x,
- struct xfrm_policy *xp, struct flowi *fl)
+ struct xfrm_policy *xp, const struct flowi *fl)
{
return 1;
}
diff --git a/security/capability.c b/security/capability.c
index 2a5df2b..b8eeaee 100644
--- a/security/capability.c
+++ b/security/capability.c
@@ -760,7 +760,7 @@ static int cap_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 sk_sid, u8 dir)
static int cap_xfrm_state_pol_flow_match(struct xfrm_state *x,
struct xfrm_policy *xp,
- struct flowi *fl)
+ const struct flowi *fl)
{
return 1;
}
diff --git a/security/security.c b/security/security.c
index 7b7308a..8ef1f7d 100644
--- a/security/security.c
+++ b/security/security.c
@@ -1233,7 +1233,8 @@ int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir)
}
int security_xfrm_state_pol_flow_match(struct xfrm_state *x,
- struct xfrm_policy *xp, struct flowi *fl)
+ struct xfrm_policy *xp,
+ const struct flowi *fl)
{
return security_ops->xfrm_state_pol_flow_match(x, xp, fl);
}
diff --git a/security/selinux/include/xfrm.h b/security/selinux/include/xfrm.h
index 13128f9..b43813c 100644
--- a/security/selinux/include/xfrm.h
+++ b/security/selinux/include/xfrm.h
@@ -19,7 +19,7 @@ void selinux_xfrm_state_free(struct xfrm_state *x);
int selinux_xfrm_state_delete(struct xfrm_state *x);
int selinux_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir);
int selinux_xfrm_state_pol_flow_match(struct xfrm_state *x,
- struct xfrm_policy *xp, struct flowi *fl);
+ struct xfrm_policy *xp, const struct flowi *fl);
/*
* Extract the security blob from the sock (it's actually on the socket)
diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c
index fff78d3..c43ab54 100644
--- a/security/selinux/xfrm.c
+++ b/security/selinux/xfrm.c
@@ -112,7 +112,7 @@ int selinux_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir)
*/
int selinux_xfrm_state_pol_flow_match(struct xfrm_state *x, struct xfrm_policy *xp,
- struct flowi *fl)
+ const struct flowi *fl)
{
u32 state_sid;
int rc;
--
1.7.4.1
^ permalink raw reply related
* [PATCH 09/20] xfrm: Mark flowi arg to xfrm_state_look_at() const.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
Signed-off-by: David S. Miller <davem@davemloft.net>
---
net/xfrm/xfrm_state.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index 220ebc0..bffe83d 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -746,7 +746,7 @@ static void xfrm_hash_grow_check(struct net *net, int have_hash_collision)
}
static void xfrm_state_look_at(struct xfrm_policy *pol, struct xfrm_state *x,
- struct flowi *fl, unsigned short family,
+ const struct flowi *fl, unsigned short family,
xfrm_address_t *daddr, xfrm_address_t *saddr,
struct xfrm_state **best, int *acq_in_progress,
int *error)
--
1.7.4.1
^ permalink raw reply related
* [PATCH 10/20] xfrm: Mark flowi arg to xfrm_init_tempstate() const.
From: David Miller @ 2011-02-23 3:54 UTC (permalink / raw)
To: netdev
Signed-off-by: David S. Miller <davem@davemloft.net>
---
net/xfrm/xfrm_state.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index bffe83d..674f278 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -656,7 +656,7 @@ void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si)
EXPORT_SYMBOL(xfrm_sad_getinfo);
static int
-xfrm_init_tempstate(struct xfrm_state *x, struct flowi *fl,
+xfrm_init_tempstate(struct xfrm_state *x, const struct flowi *fl,
struct xfrm_tmpl *tmpl,
xfrm_address_t *daddr, xfrm_address_t *saddr,
unsigned short family)
--
1.7.4.1
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox