Netdev List
 help / color / mirror / Atom feed
* Re: [PATCH] rdma/cm: Randomize local port allocation.
From: Cong Wang @ 2010-04-16  2:22 UTC (permalink / raw)
  To: Sean Hefty
  Cc: 'Tetsuo Handa', opurdila, eric.dumazet, netdev, nhorman,
	davem, ebiederm, linux-kernel, rolandd, linux-rdma
In-Reply-To: <5CE6BC7B954643FAAFFD2AD66F673CBD@amr.corp.intel.com>

Sean Hefty wrote:
> From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
> 
>> Randomize local port allocation in a way sctp_get_port_local() does.
>> Update rover at the end of loop since we're likely to pick a valid port
>> on the first try.
>>
>> Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
> Reviewed-by: Sean Hefty <sean.hefty@intel.com>
> 

Thanks, everyone!

> 
> I like this version, thanks!  I'm not sure which tree to merge it through.
> Are you needing this for 2.6.34, or is 2.6.35 okay?
> 

As soon as possible, so 2.6.34. :)

^ permalink raw reply

* Re: [PATCH] net: mac8390 - Sort out memory/MMIO accesses and casts (was: Re: drivers/net/mac8390.c: Remove useless memcpy casting)
From: Finn Thain @ 2010-04-16  2:14 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Joe Perches, David S. Miller, netdev, Linux Kernel Mailing List,
	Linux/m68k
In-Reply-To: <l2k10f740e81004151234t3004275az36e7873493067a8a@mail.gmail.com>


On Thu, 15 Apr 2010, Geert Uytterhoeven wrote:

> On Mon, Mar 8, 2010 at 18:16, Joe Perches <joe@perches.com> wrote:
>
> > Thanks, I'll submit a patch to fix it by tomorrow or so.
> 
> It hasn't been fixed yet.

Thanks for taking care of this, Geert.

> But here's a better solution. I do not have the hardware to test it, 
> though. Finn, does it {look OK,work}?

It looks fine. I can't test it right now, but I will do so when I get the 
opportunity.

Finn

^ permalink raw reply

* Re: [PATCH] ip: Fix ip_dev_loopback_xmit()
From: Changli Gao @ 2010-04-16  0:19 UTC (permalink / raw)
  To: David Miller; +Cc: eric.dumazet, eparis, netdev, therbert
In-Reply-To: <20100415.171548.179331927.davem@davemloft.net>

On Fri, Apr 16, 2010 at 8:15 AM, David Miller <davem@davemloft.net> wrote:
>
> The ->hard_start_xmit() method always executes with software
> interrupts disabled.
>

Oh, sorry. I traced to the wrong function.

-- 
Regards,
Changli Gao(xiaosuo@gmail.com)

^ permalink raw reply

* Re: [PATCH] ip: Fix ip_dev_loopback_xmit()
From: David Miller @ 2010-04-16  0:15 UTC (permalink / raw)
  To: xiaosuo; +Cc: eric.dumazet, eparis, netdev, therbert
In-Reply-To: <w2o412e6f7f1004151703xdcc4da16s4eb6308f2578b531@mail.gmail.com>

From: Changli Gao <xiaosuo@gmail.com>
Date: Fri, 16 Apr 2010 08:03:59 +0800

> On Fri, Apr 16, 2010 at 5:26 AM, David Miller <davem@davemloft.net> wrote:
>> From: Eric Dumazet <eric.dumazet@gmail.com>
>> Date: Thu, 15 Apr 2010 21:13:03 +0200
>>
>>> [PATCH] ip: Fix ip_dev_loopback_xmit()
>>
>> Applied to net-2.6, thanks Eric.
> 
> 
> Now, I am doubting the correctness of  the following comment:

The ->hard_start_xmit() method always executes with software
interrupts disabled.

^ permalink raw reply

* Re: [PATCH] ip: Fix ip_dev_loopback_xmit()
From: Changli Gao @ 2010-04-16  0:03 UTC (permalink / raw)
  To: David Miller; +Cc: eric.dumazet, eparis, netdev, therbert
In-Reply-To: <20100415.142641.125242830.davem@davemloft.net>

On Fri, Apr 16, 2010 at 5:26 AM, David Miller <davem@davemloft.net> wrote:
> From: Eric Dumazet <eric.dumazet@gmail.com>
> Date: Thu, 15 Apr 2010 21:13:03 +0200
>
>> [PATCH] ip: Fix ip_dev_loopback_xmit()
>
> Applied to net-2.6, thanks Eric.


Now, I am doubting the correctness of  the following comment:

/*
 * The higher levels take care of making this non-reentrant (it's
 * called with bh's disabled).
 */
static netdev_tx_t loopback_xmit(struct sk_buff *skb,
                                 struct net_device *dev)
{
        struct pcpu_lstats __percpu *pcpu_lstats;
        struct pcpu_lstats *lb_stats;
        int len;

        skb_orphan(skb);

        skb->protocol = eth_type_trans(skb, dev);

And these lines:

        /* it's OK to use per_cpu_ptr() because BHs are off */
        pcpu_lstats = (void __percpu __force *)dev->ml_priv;
        lb_stats = this_cpu_ptr(pcpu_lstats);

-- 
Regards,
Changli Gao(xiaosuo@gmail.com)

^ permalink raw reply

* Re: rps perfomance WAS(Re: rps: question
From: Changli Gao @ 2010-04-15 23:56 UTC (permalink / raw)
  To: hadi; +Cc: Rick Jones, David Miller, eric.dumazet, therbert, netdev, robert,
	andi
In-Reply-To: <1271362581.23780.12.camel@bigi>

On Fri, Apr 16, 2010 at 4:16 AM, jamal <hadi@cyberus.ca> wrote:
>
> Sounds interesting.
> Wikipedia information overload. Any arch description of the HP9000?
> Did your scheme use IPIs to message the other CPUs?
>

If you doubt the cost of smp_call_function_single(), how about having
a try with my another patch, which implements the similar of RPS, but
uses kernel threads instead, so no explicit IPI.

http://patchwork.ozlabs.org/patch/38319/


-- 
Regards,
Changli Gao(xiaosuo@gmail.com)

^ permalink raw reply

* Re: rps perfomance WAS(Re: rps: question
From: Changli Gao @ 2010-04-15 23:51 UTC (permalink / raw)
  To: hadi; +Cc: Eric Dumazet, Tom Herbert, netdev
In-Reply-To: <1271335844.23780.8.camel@bigi>

On Thu, Apr 15, 2010 at 8:50 PM, jamal <hadi@cyberus.ca> wrote:
> On Thu, 2010-04-15 at 20:32 +0800, Changli Gao wrote:
>
>> For historical reason, we use Linux-2.6.18. Our company have several
>> products with CPU Xen, P4, or i7. Some of them are SMP, Multi-Core and
>> Multi-Threaded.
>
> Thanks for sharing. How much more can you say? ;-> Do you have a paper
> or description of some sort somewhere?

On a dual 4-core Xeon, we use one core for NIC in internal side, one
core for NIC in the external side, one for inbound QoS, one for
outbound QoS, and the CPU cycles left are used by DPI(DFA), the total
throughput is about 3 Gbps with a polygraph test.

>
>> We use the similar mechanism like dynamic weighted
>> RPS. The total throughput is increased nearly linear with the number
>> of the worker threads(one worker thread per CPU).
>
> Other than the i7 - have you tried to run rps on on the P4?
>

No.


-- 
Regards,
Changli Gao(xiaosuo@gmail.com)

^ permalink raw reply

* Re: [PATCH net-next] net/l2tp/l2tp_debugfs.c: Convert NIPQUAD to %pI4
From: David Miller @ 2010-04-15 22:37 UTC (permalink / raw)
  To: jchapman; +Cc: joe, linux-kernel, netdev
In-Reply-To: <4BC75EA3.2070402@katalix.com>

From: James Chapman <jchapman@katalix.com>
Date: Thu, 15 Apr 2010 19:44:51 +0100

> Joe Perches wrote:
>> Signed-off-by: Joe Perches <joe@perches.com>
> Acked-by: James Chapman <jchapman@katalix.com>

Applied, thanks.

^ permalink raw reply

* Re: [net-next-2.6 PATCH 2/2] net: replace ipfragok with skb->local_df
From: David Miller @ 2010-04-15 22:33 UTC (permalink / raw)
  To: shanwei
  Cc: herbert, yinghai.lu, kuznet, pekkas, jmorris, yoshfuji, kaber,
	" <netdev
In-Reply-To: <4BC70EF1.6080400@cn.fujitsu.com>


Your netdev entry on the CC: list was literally:

	" <netdev@vger.kernel.org>,

which caused your patch to not make it netdev and therefore
it also didn't make it into patchwork.

Please resubmit your patches (both of them) with the CC:
list fixed up.

Thank you.

^ permalink raw reply

* Re: NULL pointer dereference panic in stable (2.6.33.2), amd64
From: David Miller @ 2010-04-15 21:33 UTC (permalink / raw)
  To: eric.dumazet; +Cc: krkumar2, netdev, nuclearcat
In-Reply-To: <1271364375.16881.3099.camel@edumazet-laptop>

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Thu, 15 Apr 2010 22:46:15 +0200

> Le jeudi 15 avril 2010 à 22:30 +0200, Eric Dumazet a écrit :
>>  
>> @@ -1938,6 +1928,8 @@ gso:
>>  		if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
>>  			skb_dst_drop(nskb);
>>  
>> +		skb_orphan(nskb);
>> +
>>  		rc = ops->ndo_start_xmit(nskb, dev);
>>  		if (unlikely(rc != NETDEV_TX_OK)) {
>>  			if (rc & ~NETDEV_TX_MASK)
> 
> Well, might need to test if skb is not shared before orphaning it
> 
> 	if (!skb_shared(skb))
> 		skb_orphan(nskb);

If it's not legal to skb_orphan() here then it would not be legal for
the drivers to unconditionally skb_orphan(), which they do.

So either your test is unnecessary, or we have a big existing problem
:-)


^ permalink raw reply

* Re: pull request: wireless-next-2.6 2010-04-15
From: David Miller @ 2010-04-15 21:31 UTC (permalink / raw)
  To: linville; +Cc: linux-wireless, netdev
In-Reply-To: <20100415205358.GA6659@tuxdriver.com>

From: "John W. Linville" <linville@tuxdriver.com>
Date: Thu, 15 Apr 2010 16:53:59 -0400

> Here is another huge dump of wireless bits intended for 2.6.35...  It is
> mostly drivers, and mostly the "usual suspects" of those -- ath5k,
> ath9k, iwlwifi, rt2x00, wl1271, and others.  There are also some
> infrastructure bits from Johannes and Jouni, including some tracing
> stuff.
> 
> Please let me know if there are problems!

Pulled, thanks John!

> P.S.  Please note the "for-davem" after the git url... :-)

Yep, saw it :-)

^ permalink raw reply

* Re: pull request: wireless-2.6 2010-04-15
From: David Miller @ 2010-04-15 21:29 UTC (permalink / raw)
  To: linville; +Cc: linux-wireless, netdev, linux-kernel
In-Reply-To: <20100415200331.GD3020@tuxdriver.com>

From: "John W. Linville" <linville@tuxdriver.com>
Date: Thu, 15 Apr 2010 16:03:31 -0400

> Another fix intended for 2.6.34...without it some firmware wierdness can
> induce the driver into hanging the box... :-(
> 
> Please let me know if there are problems!

Pulled, thanks.

^ permalink raw reply

* Re: [PATCH] ip: Fix ip_dev_loopback_xmit()
From: David Miller @ 2010-04-15 21:26 UTC (permalink / raw)
  To: eric.dumazet; +Cc: eparis, netdev, therbert
In-Reply-To: <1271358783.16881.2949.camel@edumazet-laptop>

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Thu, 15 Apr 2010 21:13:03 +0200

> [PATCH] ip: Fix ip_dev_loopback_xmit()

Applied to net-2.6, thanks Eric.

^ permalink raw reply

* Re: [PATCH 0/3]: fixes for multicast routing rules
From: David Miller @ 2010-04-15 21:14 UTC (permalink / raw)
  To: kaber; +Cc: netdev
In-Reply-To: <1271335678-20961-1-git-send-email-kaber@trash.net>

From: Patrick McHardy <kaber@trash.net>
Date: Thu, 15 Apr 2010 14:47:55 +0200

> the following three patches fix a few bugs introduced by the multicast routing
> rule patches:
 ...
> Please apply or pull from:
> 
> git://git.kernel.org/pub/scm/linux/kernel/git/kaber/ipmr-2.6.git master

Pulled, thanks a lot Patrick!

^ permalink raw reply

* pull request: wireless-next-2.6 2010-04-15
From: John W. Linville @ 2010-04-15 20:53 UTC (permalink / raw)
  To: davem; +Cc: linux-wireless, netdev

Dave,

Here is another huge dump of wireless bits intended for 2.6.35...  It is
mostly drivers, and mostly the "usual suspects" of those -- ath5k,
ath9k, iwlwifi, rt2x00, wl1271, and others.  There are also some
infrastructure bits from Johannes and Jouni, including some tracing
stuff.

Please let me know if there are problems!

Thanks,

John

P.S.  Please note the "for-davem" after the git url... :-)

---

The following changes since commit fea069152614cdeefba4b2bf80afcddb9c217fc8:
  David S. Miller (1):
        Merge branch 'vhost' of git://git.kernel.org/.../mst/vhost

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6.git for-davem

Bob Copeland (4):
      ath5k: correct channel setting for 2.5 mhz spacing
      ath5k: clean up queue manipulation
      ath5k: fix race condition in tx desc processing
      ath5k: add bounds check to pdadc table

Bruno Randolf (12):
      ath5k: remove static calibration interval variable
      ath5k: remove the use of SWI interrupt
      ath5k: optimize ath5k_hw_calibration_poll
      ath5k: move ath5k_hw_calibration_poll to base.c
      ath5k: keep beacon RSSI average
      ath5k: initialize default noise floor
      ath5k: simplify MIB counters
      ath5k: update phy errors codes
      ath5k: add capability flag for phyerror counters
      ath5k: Adaptive Noise Immunity (ANI) Implementation
      ath5k: Use high bitrates for ACK/CTS
      ath5k: treat RXORN as non-fatal

Christian Lamparter (2):
      ar9170usb: fix panic triggered by undersized rxstream buffer
      ar9170usb: add a couple more USB IDs

Daniel Mack (1):
      libertas/sdio: 8686: set ECSI bit for 1-bit transfers

Felix Fietkau (4):
      ath9k: split out access to tx status information
      ath9k: split out access to rx status information
      ath9k: allocate tx and rx status information on stack
      ath9k: fix compile error without debug enabled

Frans Pop (7):
      wireless: remove trailing space in messages
      wireless/prism54: remove trailing space in messages
      wireless/raylink: remove trailing space in messages
      wireless/libertas: remove trailing space in debugfs header
      wireless/ipw2x00: remove trailing space in messages
      iwlwifi: remove trailing space in messages
      wireless/ath: remove trailing space in messages

Gertjan van Wingerde (13):
      rt2x00: Disable auto wakeup before waking up device.
      rt2x00: Add wakeup interrupt handler to rt61pci.
      rt2x00: Add wakeup interrupt handler to rt2800pci.
      rt2x00: Enable powersaving by default again on rt2500usb.
      rt2x00: Let RF chipset decide the RF channel switch method to use in rt2800.
      rt2x00: Update rt2800 register definitions towards latest definitions.
      rt2x00: Align RT chipset definitions with vendor driver.
      rt2x00: Refactor rt2800 version constants.
      rt2x00: Align rt2800 register initialization with vendor driver.
      rt2x00: Finish rt3070 support in rt2800 register initialization.
      rt2x00: Add rt3071 support in rt2800 register initialization.
      rt2x00: Add rt3090 support in rt2800 register initialization.
      rt2x00: Add rt3390 support in rt2800 register initialization.

Grazvydas Ignotas (1):
      wl1251: don't require NVS data when EEPROM is used

Helmut Schaa (1):
      rt2x00: use rt2800_config_channel_rt3x for rt2872

Javier Cardona (1):
      mac80211: Moved mesh action codes to a more visible location

Jay Sternberg (1):
      iwlwifi: enable '6000 Series 2x2 AGN Gen2' adaptors

Joe Perches (1):
      include/net/iw_handler.h: Use SIOCIWFIRST not SIOCSIWCOMMIT in comment

Johannes Berg (14):
      iwlwifi: remove noise reporting
      mac80211: fix station destruction problem
      mac80211: remove irq disabling for sta lock
      mac80211: remove ieee80211_sta_stop_rx_ba_session
      mac80211: rename WLAN_STA_SUSPEND to WLAN_STA_BLOCK_BA
      mac80211: clean up/fix aggregation code
      mac80211: fix some RX aggregation locking
      mac80211: fix paged RX crypto
      mac80211: enhance tracing
      iwlwifi: make WEP key restoring explicit
      iwlwifi: remove wrong key use check
      iwlagn: simplify WEP key check
      iwlwifi: remove pointless sta_id invalid check
      iwlwifi: clean up last_phy_res

John W. Linville (6):
      Merge branch 'wireless-next-2.6' of git://git.kernel.org/.../iwlwifi/iwlwifi-2.6
      Merge branch 'master' of git://git.kernel.org/.../linville/wireless-2.6 into merge
      ath5k: fixup some merge damage for AR5211 IQ calibration
      Merge branch 'master' of git://git.kernel.org/.../linville/wireless-2.6
      Merge branch 'wireless-next-2.6' of git://git.kernel.org/.../iwlwifi/iwlwifi-2.6
      Merge branch 'master' of git://git.kernel.org/.../linville/wireless-next-2.6 into for-davem

Jouni Malinen (8):
      mac80211: Track Beacon signal strength and implement cqm events
      mac80211: Send deauth/disassoc prior to dropping STA entry
      mac80211: Fix BIP to be used only with group-addressed frames
      mac80211: Fix dropping of unprotected robust multicast frames
      ath9k: Do not indicate RX_FLAG_DECRYPTED for unprotected frames
      mac80211: Fix drop_unencrypted for MFP with hwaccel
      mac80211: Fix robust management frame handling (MFP)
      cfg80211: Add local-state-change-only auth/deauth/disassoc

Juuso Oikarinen (26):
      wl1271: Clean up RX rate reporting
      wl1271: Add TX rate reporting
      wl1271: Fix memory leaks in SPI initialization
      wl1271: Fix memory leak in scan command handling
      wl1271: Configure clock-request drive mode to open-drain
      wl1271: Fix memory leak in cmd_data_path
      wl1271: Update busyword checking mechanism
      wl1271: Remove device MAC-address randomization
      wl1271: Disable connection monitoring while not associated
      wl1271: Fix ad-hoc mode handling
      wl1271: Update beacon interval properly for ad-hoc
      wl1271: Fix memory leak in firmware crash scenario
      wl1271: Configure probe-request template when associated
      wl1271: Disconnect if PSM entry fails
      wl1271: Configure HW connection monitor
      wl1271: Add keep-alive frame template support
      wl1271: Enable hardware keep alive messages
      wl1271: Fix keep-alive related command error
      wl1271: Use minimum rate for each band for control messages
      wl1271: Configure rates for templates
      wl1271: Configure a higher listen interval to AP upon association
      wl1271: Fix debug prints for beacon-loss and psm-entry-fail scenarios
      wl1271: Fix tx queue flushing
      wl1271: Fix memory leaks on driver initialization
      wl1271: Go to ELP in idle
      wl1271: Add support for connection quality monitoring

Kalle Valo (1):
      wl1251: use DRIVER_NAME macro in wl1251_spi_driver

Luciano Coelho (6):
      wl1271: fix wl1271_spi driver name
      wl1271: wait for join command complete event
      wl1271: wait for disconnect command complete event
      wl1271: remove deprecated usage of RX status noise
      wl1271: fix sdio driver name in wl1271_sdio_driver
      wl1271: added missing command header in wl1271_cmd_disconnect

Luis Correia (1):
      rt2x00: remove MCU requests for SoC platforms

Luis R. Rodriguez (2):
      mac80211_hwsim: add sw_scan sw_scan_complete
      mac80211: fix typo for LDPC capability

Luis de Bethencourt (3):
      Net: wireless: ath: fix macros coding style issue in hw.c
      ath: fix code readability in regd.c
      ath: fix coding style/readability in ath/ar9170

Marco Porsch (1):
      nl80211: reenable station del for mesh

Ming Lei (4):
      ath9k-htc:respect usb buffer cacheline alignment in ath9k_hif_usb_alloc_rx_urbs
      ath9k-htc:respect usb buffer cacheline alignment in reg in path
      ath9k-htc:respect usb buffer cacheline alignment in reg out path
      ath9k-htc: fix lockdep warning and kernel warning after unplugging ar9271 usb device

Pavel Roskin (4):
      ath9k: rename symbols in enum ath9k_internal_frame_type to avoid confusion
      ath9k: move imask from sc to ah
      ath9k: remove ah->mask_reg, it's never used properly
      ath9k: simplify AR9220 fixup code for AR_AN_TOP2 register

Quintin Pitts (1):
      p54pci: prevent stuck rx-ring on slow system

Rafał Miłecki (6):
      b43: N-PHY: some dummy PHY rev 3 calls
      b43: N-PHY: use b43_phy_n_sfo_cfg rather than duplicating same fields
      b43: N-PHY: find table entry earlier for setting chanspec
      b43: N-PHY: prepare for rev3+ channel tables
      b43: N-PHY: fix value written on 2055 radio setup
      b43: N-PHY: fix copy&paste typo

Reinette Chatre (2):
      Revert "iwlwifi: fix build error for CONFIG_IWLAGN=n"
      iwlwifi: fix compile warnings when compiling without debug

Saravanan Dhanabal (3):
      wl1271: Fix msleep() delay while waiting for completion
      wl1271: Fix mac80211 configuration requests during WL1271_STATE_OFF
      wl1271: Fix mac80211 RTS threshold requests during WL1271_STATE_OFF

Stanislaw Gruszka (3):
      mac80211: explicitly disable/enable QoS
      iwlwifi: manage QoS by mac stack
      mac80211: enable QoS explicitly in AP mode

Sujith (15):
      ath9k_common: Move RX filter code to ath9k_htc
      ath9k_htc: Fix bug in aggregation initiation
      ath9k_htc: Fix watchdog pattern parsing
      ath9k_htc: Simplify RX URB management
      ath9k_htc: Handle TX queue overflow
      ath9k_htc: Initialize HW opmode
      ath9k_htc: Fix TKIP encryption
      ath: Add a bus type field
      ath9k_hw: Don't check devid for ath9k_htc
      ath9k_htc: Add TL-WN422G v2 product ID
      ath9k_htc: Protect RX stream variables
      ath9k_htc: Fix RX URB reference count
      ath9k_htc: Fix module unloading issue
      ath9k_htc: Use anchors for REGOUT pipe
      ath9k_htc: Fix HTC layer memleak

Teemu Paasikivi (3):
      wl1271: Warnings caused by wrong format specifiers fixed
      wl1271: Removed checking of PSM from handling BSS_LOST_EVENT
      mac80211: check whether scan is in progress before queueing scan_work

Vivek Natarajan (3):
      ath9k: Add support for newer AR9285 chipsets.
      ath9k_htc: Add support for power save.
      ath9k_htc: Configure the beacon timers once the scan is completed.

Wey-Yi Guy (28):
      iwlwifi: iwl_good_ack_health() only apply to AGN device
      iwlwifi: move ucode loading related code to separated file
      iwlwifi: code cleanup for "load ucode" function
      iwlwifi: move hcmd related code to separate file
      iwlwifi: move tx queue related code to separate file
      iwlwifi: move hw related defines to separate file
      iwlwifi: move ucode alive related code to separate file
      iwlwifi: move agn common code to iwlagn library file
      iwlwifi: each device has its own eeprom tx power version
      iwlwifi: move agn module parameter structure to common place
      iwlwifi: move agn only tx functions from iwlcore to iwlagn
      iwlwifi: move agn only rx functions from iwlcore to iwlagn
      iwlwifi: more clean up to move agn only rx functions from iwlcore to iwlagn
      iwlwifi: remove non-exist extern functions and structures
      iwlwifi: add missing email address information
      iwlwifi: Generic approach to measure temperature
      iwlwifi: remove "\n" from module parameter description
      iwlwifi: change spin_lock to spin_lock_irqsave
      iwlwifi: avoid device type checking in generic code
      iwlwifi: merge module parameters into single place
      iwlwifi: remove irrelevant comments
      iwlwifi: deprecate "iwl4965" alias support
      iwlwifi: code cleanup for generic defines
      iwlwifi: default max event log size
      iwlwifi: add more debug info in error event dump
      iwlwifi: update tx command response status
      iwlwifi: small changes in comments
      iwlwifi: fix compiler warning

Xose Vazquez Perez (5):
      wireless: rt2x00: rt2800usb: identify ids-chips
      wireless: rt2x00: rt2800usb: delete id
      wireless: rt2x00: rt2800pci: new id
      wireless: rt2x00: rt2800usb: new ids
      wireless: rt2x00: rt2800usb: identify Sitecom devices

Zhu Yi (6):
      mac80211: support paged rx SKBs
      iwlwifi: remove skb_linearize for rx frames
      ipw2200: restart adapter only when abort_scan doesn't work
      iwlwifi: clear rxq->queue in queue reset
      mac80211: delay skb linearising in rx decryption
      iwlwifi: avoid Tx queue memory allocation in interface down

 Documentation/feature-removal-schedule.txt      |   22 +-
 drivers/net/wireless/ath/ar9170/cmd.h           |    2 +-
 drivers/net/wireless/ath/ar9170/eeprom.h        |    4 +-
 drivers/net/wireless/ath/ar9170/hw.h            |    1 +
 drivers/net/wireless/ath/ar9170/main.c          |   13 +-
 drivers/net/wireless/ath/ar9170/usb.c           |   10 +
 drivers/net/wireless/ath/ath.h                  |   13 +-
 drivers/net/wireless/ath/ath5k/Makefile         |    1 +
 drivers/net/wireless/ath/ath5k/ani.c            |  744 ++++++++++++
 drivers/net/wireless/ath/ath5k/ani.h            |  104 ++
 drivers/net/wireless/ath/ath5k/ath5k.h          |   68 +-
 drivers/net/wireless/ath/ath5k/attach.c         |    2 +
 drivers/net/wireless/ath/ath5k/base.c           |  129 ++-
 drivers/net/wireless/ath/ath5k/base.h           |   21 +-
 drivers/net/wireless/ath/ath5k/caps.c           |    6 +
 drivers/net/wireless/ath/ath5k/debug.c          |  170 +++
 drivers/net/wireless/ath/ath5k/debug.h          |    2 +
 drivers/net/wireless/ath/ath5k/desc.c           |    1 +
 drivers/net/wireless/ath/ath5k/desc.h           |   35 +-
 drivers/net/wireless/ath/ath5k/pcu.c            |   44 +-
 drivers/net/wireless/ath/ath5k/phy.c            |   37 +-
 drivers/net/wireless/ath/ath5k/reg.h            |   40 +-
 drivers/net/wireless/ath/ath9k/ahb.c            |    1 +
 drivers/net/wireless/ath/ath9k/ath9k.h          |    4 -
 drivers/net/wireless/ath/ath9k/beacon.c         |   35 +-
 drivers/net/wireless/ath/ath9k/calib.c          |   59 +-
 drivers/net/wireless/ath/ath9k/common.c         |   85 +--
 drivers/net/wireless/ath/ath9k/common.h         |    4 -
 drivers/net/wireless/ath/ath9k/debug.c          |   39 +-
 drivers/net/wireless/ath/ath9k/debug.h          |    9 +-
 drivers/net/wireless/ath/ath9k/eeprom_4k.c      |    2 +-
 drivers/net/wireless/ath/ath9k/eeprom_9287.c    |    2 +-
 drivers/net/wireless/ath/ath9k/gpio.c           |   17 +-
 drivers/net/wireless/ath/ath9k/hif_usb.c        |  191 ++--
 drivers/net/wireless/ath/ath9k/hif_usb.h        |   10 +-
 drivers/net/wireless/ath/ath9k/htc.h            |   25 +-
 drivers/net/wireless/ath/ath9k/htc_drv_beacon.c |   41 +-
 drivers/net/wireless/ath/ath9k/htc_drv_init.c   |   12 +-
 drivers/net/wireless/ath/ath9k/htc_drv_main.c   |  149 +++-
 drivers/net/wireless/ath/ath9k/htc_drv_txrx.c   |  112 ++-
 drivers/net/wireless/ath/ath9k/htc_hst.c        |   35 +-
 drivers/net/wireless/ath/ath9k/hw.c             |  139 +--
 drivers/net/wireless/ath/ath9k/hw.h             |    5 +-
 drivers/net/wireless/ath/ath9k/initvals.h       |  109 ++-
 drivers/net/wireless/ath/ath9k/mac.c            |  149 ++--
 drivers/net/wireless/ath/ath9k/mac.h            |   14 +-
 drivers/net/wireless/ath/ath9k/main.c           |   60 +-
 drivers/net/wireless/ath/ath9k/pci.c            |    1 +
 drivers/net/wireless/ath/ath9k/phy.h            |   14 +-
 drivers/net/wireless/ath/ath9k/rc.h             |    6 +-
 drivers/net/wireless/ath/ath9k/recv.c           |   26 +-
 drivers/net/wireless/ath/ath9k/reg.h            |   13 +-
 drivers/net/wireless/ath/ath9k/virtual.c        |    2 +-
 drivers/net/wireless/ath/ath9k/wmi.c            |   10 +-
 drivers/net/wireless/ath/ath9k/xmit.c           |  113 +-
 drivers/net/wireless/ath/hw.c                   |    4 +-
 drivers/net/wireless/ath/regd.c                 |    3 +-
 drivers/net/wireless/b43/phy_n.c                |   54 +-
 drivers/net/wireless/b43/tables_nphy.c          |   20 +-
 drivers/net/wireless/b43/tables_nphy.h          |   28 +-
 drivers/net/wireless/ipw2x00/ipw2100.c          |   38 +-
 drivers/net/wireless/ipw2x00/ipw2200.c          |   87 +-
 drivers/net/wireless/iwlwifi/Makefile           |    2 +
 drivers/net/wireless/iwlwifi/iwl-1000.c         |   78 +-
 drivers/net/wireless/iwlwifi/iwl-3945-hw.h      |    5 -
 drivers/net/wireless/iwlwifi/iwl-3945-rs.c      |    4 +-
 drivers/net/wireless/iwlwifi/iwl-3945.c         |   79 +--
 drivers/net/wireless/iwlwifi/iwl-4965-hw.h      |   24 -
 drivers/net/wireless/iwlwifi/iwl-4965.c         |   62 +-
 drivers/net/wireless/iwlwifi/iwl-5000-hw.h      |   33 -
 drivers/net/wireless/iwlwifi/iwl-5000.c         | 1378 ++---------------------
 drivers/net/wireless/iwlwifi/iwl-6000.c         |  195 ++--
 drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c     |  274 +++++
 drivers/net/wireless/iwlwifi/iwl-agn-hw.h       |  118 ++
 drivers/net/wireless/iwlwifi/iwl-agn-ict.c      |   14 +-
 drivers/net/wireless/iwlwifi/iwl-agn-lib.c      | 1113 ++++++++++++++++++
 drivers/net/wireless/iwlwifi/iwl-agn-rs.c       |    6 +-
 drivers/net/wireless/iwlwifi/iwl-agn-tx.c       | 1333 ++++++++++++++++++++++
 drivers/net/wireless/iwlwifi/iwl-agn-ucode.c    |  416 +++++++
 drivers/net/wireless/iwlwifi/iwl-agn.c          |  204 +++--
 drivers/net/wireless/iwlwifi/iwl-agn.h          |  100 ++
 drivers/net/wireless/iwlwifi/iwl-calib.c        |    2 +-
 drivers/net/wireless/iwlwifi/iwl-commands.h     |  108 ++-
 drivers/net/wireless/iwlwifi/iwl-core.c         |  267 +----
 drivers/net/wireless/iwlwifi/iwl-core.h         |   31 +-
 drivers/net/wireless/iwlwifi/iwl-dev.h          |   76 +--
 drivers/net/wireless/iwlwifi/iwl-devtrace.c     |    1 +
 drivers/net/wireless/iwlwifi/iwl-eeprom.h       |   17 +-
 drivers/net/wireless/iwlwifi/iwl-hcmd.c         |    4 +-
 drivers/net/wireless/iwlwifi/iwl-io.h           |    2 +-
 drivers/net/wireless/iwlwifi/iwl-led.c          |    2 +-
 drivers/net/wireless/iwlwifi/iwl-power.c        |   10 +-
 drivers/net/wireless/iwlwifi/iwl-rx.c           |  758 +-------------
 drivers/net/wireless/iwlwifi/iwl-scan.c         |    9 +-
 drivers/net/wireless/iwlwifi/iwl-sta.c          |   48 +-
 drivers/net/wireless/iwlwifi/iwl-sta.h          |    2 +-
 drivers/net/wireless/iwlwifi/iwl-tx.c           | 1091 +------------------
 drivers/net/wireless/iwlwifi/iwl3945-base.c     |   30 +-
 drivers/net/wireless/libertas/debugfs.c         |    2 +-
 drivers/net/wireless/libertas/if_sdio.c         |   22 +
 drivers/net/wireless/mac80211_hwsim.c           |   45 +-
 drivers/net/wireless/p54/p54pci.c               |   26 +-
 drivers/net/wireless/p54/txrx.c                 |    2 +-
 drivers/net/wireless/prism54/islpci_dev.c       |   16 +-
 drivers/net/wireless/prism54/islpci_eth.c       |    8 +-
 drivers/net/wireless/prism54/islpci_mgt.c       |    8 +-
 drivers/net/wireless/prism54/oid_mgt.c          |    2 +-
 drivers/net/wireless/ray_cs.c                   |   12 +-
 drivers/net/wireless/rt2x00/rt2400pci.c         |    4 +
 drivers/net/wireless/rt2x00/rt2500pci.c         |    4 +
 drivers/net/wireless/rt2x00/rt2500usb.c         |    9 +-
 drivers/net/wireless/rt2x00/rt2800.h            |  108 ++-
 drivers/net/wireless/rt2x00/rt2800lib.c         |  467 ++++++---
 drivers/net/wireless/rt2x00/rt2800pci.c         |   31 +-
 drivers/net/wireless/rt2x00/rt2800usb.c         |   76 +-
 drivers/net/wireless/rt2x00/rt2x00.h            |   29 +-
 drivers/net/wireless/rt2x00/rt61pci.c           |   14 +
 drivers/net/wireless/rt2x00/rt73usb.c           |    6 +-
 drivers/net/wireless/wl12xx/wl1251_main.c       |    4 +-
 drivers/net/wireless/wl12xx/wl1251_spi.c        |    2 +-
 drivers/net/wireless/wl12xx/wl1271.h            |   19 +-
 drivers/net/wireless/wl12xx/wl1271_acx.c        |  146 +++-
 drivers/net/wireless/wl12xx/wl1271_acx.h        |   89 ++-
 drivers/net/wireless/wl12xx/wl1271_boot.c       |   15 +-
 drivers/net/wireless/wl12xx/wl1271_boot.h       |    7 +-
 drivers/net/wireless/wl12xx/wl1271_cmd.c        |  127 ++-
 drivers/net/wireless/wl12xx/wl1271_cmd.h        |   13 +-
 drivers/net/wireless/wl12xx/wl1271_conf.h       |  158 ++--
 drivers/net/wireless/wl12xx/wl1271_event.c      |   66 +-
 drivers/net/wireless/wl12xx/wl1271_event.h      |    8 +
 drivers/net/wireless/wl12xx/wl1271_init.c       |   53 +-
 drivers/net/wireless/wl12xx/wl1271_main.c       |  393 ++++++--
 drivers/net/wireless/wl12xx/wl1271_ps.c         |    6 +-
 drivers/net/wireless/wl12xx/wl1271_rx.c         |   83 +--
 drivers/net/wireless/wl12xx/wl1271_rx.h         |    2 +-
 drivers/net/wireless/wl12xx/wl1271_sdio.c       |    6 +-
 drivers/net/wireless/wl12xx/wl1271_spi.c        |   71 +-
 drivers/net/wireless/wl12xx/wl1271_tx.c         |   43 +-
 drivers/net/wireless/wl12xx/wl1271_tx.h         |    2 +
 include/linux/ieee80211.h                       |    3 +-
 include/linux/mmc/sdio.h                        |    2 +
 include/linux/nl80211.h                         |    8 +
 include/net/cfg80211.h                          |   11 +
 include/net/iw_handler.h                        |    2 +-
 include/net/mac80211.h                          |   10 +-
 net/mac80211/Kconfig                            |    8 +-
 net/mac80211/agg-rx.c                           |   72 +-
 net/mac80211/agg-tx.c                           |   14 +-
 net/mac80211/cfg.c                              |   13 +-
 net/mac80211/debugfs_netdev.c                   |   12 +
 net/mac80211/debugfs_sta.c                      |   12 +-
 net/mac80211/driver-trace.h                     |  275 +++++
 net/mac80211/ht.c                               |    3 +-
 net/mac80211/ieee80211_i.h                      |   21 +-
 net/mac80211/main.c                             |    2 +
 net/mac80211/mesh.c                             |    4 +-
 net/mac80211/mesh.h                             |    2 -
 net/mac80211/mesh_hwmp.c                        |    4 +-
 net/mac80211/mesh_plink.c                       |    2 +-
 net/mac80211/mlme.c                             |  106 ++-
 net/mac80211/pm.c                               |    2 +-
 net/mac80211/rx.c                               |   91 ++-
 net/mac80211/scan.c                             |    2 +
 net/mac80211/sta_info.c                         |   75 +-
 net/mac80211/sta_info.h                         |   10 +-
 net/mac80211/tx.c                               |    7 +-
 net/mac80211/util.c                             |   11 +-
 net/mac80211/work.c                             |    7 +-
 net/wireless/core.h                             |   15 +-
 net/wireless/mlme.c                             |   39 +-
 net/wireless/nl80211.c                          |   22 +-
 net/wireless/reg.c                              |    6 +-
 net/wireless/sme.c                              |   15 +-
 net/wireless/util.c                             |   24 +-
 174 files changed, 8596 insertions(+), 5612 deletions(-)
 create mode 100644 drivers/net/wireless/ath/ath5k/ani.c
 create mode 100644 drivers/net/wireless/ath/ath5k/ani.h
 create mode 100644 drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
 create mode 100644 drivers/net/wireless/iwlwifi/iwl-agn-hw.h
 create mode 100644 drivers/net/wireless/iwlwifi/iwl-agn-lib.c
 create mode 100644 drivers/net/wireless/iwlwifi/iwl-agn-tx.c
 create mode 100644 drivers/net/wireless/iwlwifi/iwl-agn-ucode.c

Omnibus patch available here:

	http://www.kernel.org/pub/linux/kernel/people/linville/wireless-next-2.6-2010-04-15.patch.bz2

-- 
John W. Linville		Someday the world will need a hero, and you
linville@tuxdriver.com			might be all we have.  Be ready.

^ permalink raw reply

* Re: NULL pointer dereference panic in stable (2.6.33.2), amd64
From: Eric Dumazet @ 2010-04-15 20:46 UTC (permalink / raw)
  To: David Miller; +Cc: krkumar2, netdev, nuclearcat
In-Reply-To: <1271363432.16881.3080.camel@edumazet-laptop>

Le jeudi 15 avril 2010 à 22:30 +0200, Eric Dumazet a écrit :
>  
> @@ -1938,6 +1928,8 @@ gso:
>  		if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
>  			skb_dst_drop(nskb);
>  
> +		skb_orphan(nskb);
> +
>  		rc = ops->ndo_start_xmit(nskb, dev);
>  		if (unlikely(rc != NETDEV_TX_OK)) {
>  			if (rc & ~NETDEV_TX_MASK)

Well, might need to test if skb is not shared before orphaning it

	if (!skb_shared(skb))
		skb_orphan(nskb);




^ permalink raw reply

* Re: NULL pointer dereference panic in stable (2.6.33.2), amd64
From: Eric Dumazet @ 2010-04-15 20:30 UTC (permalink / raw)
  To: David Miller; +Cc: krkumar2, netdev, nuclearcat
In-Reply-To: <20100415.020619.00349859.davem@davemloft.net>

Le jeudi 15 avril 2010 à 02:06 -0700, David Miller a écrit :
> From: Eric Dumazet <eric.dumazet@gmail.com>
> Date: Thu, 15 Apr 2010 10:51:47 +0200
> 
> > In any case, I think there is a fundamental problem with this sk
> > caching. Because one packet can travel in many stacked devices before
> > hitting the wire.
> > 
> > (bonding, vlan, ethernet) for example.
> > 
> > Socket cache is meaningfull for one level only...
> 
> We were talking the other day about that 'tun' change to orphan the
> SKB on TX, and I mentioned the possibility of just doing this in some
> generic location before we give the packet to the device ->xmit()
> method.
> 
> Such a scheme could help with this problem too.

Same thing we did with 

if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
	skb_dst_drop(skb);

in dev_hard_start_xmit() ?

Problem is this skb_tstamp_tx() thing....

One possibility would be to change skb_orphan() to let everything done
by destructor. 

One more argument would let destructor() know if this is the final
destructor() called from skb_release_head_state()

destructor() would be responsible to set skb->destructor and/or skb->sk
to NULL when possible. 


All normal destructors would not care of this 2nd argument and just do
what they actually do, plus setting skb->sk = NULL, skb->destructor =
NULL

Fast path would stay as today, no extra test.

Only tstamp users would need to setup another destructor, a bit more
complex (it would have to take a look at 2nd argument before really
doing the job)


Completely untested patch to get the idea :
(to be completed for the tstamp thing)


 include/linux/skbuff.h         |    8 +++-----
 include/net/sctp/sctp.h        |    2 +-
 include/net/sock.h             |    4 ++--
 net/caif/caif_socket.c         |    4 +++-
 net/core/dev.c                 |   26 +++++++++-----------------
 net/core/skbuff.c              |    2 +-
 net/core/sock.c                |    8 ++++++--
 net/l2tp/l2tp_core.c           |    4 +++-
 net/netfilter/nf_tproxy_core.c |    2 +-
 net/packet/af_packet.c         |    4 ++--
 net/unix/af_unix.c             |    4 ++--
 11 files changed, 33 insertions(+), 35 deletions(-)

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 38501d2..7dfd833 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -353,7 +353,7 @@ struct sk_buff {
 	kmemcheck_bitfield_end(flags1);
 	__be16			protocol;
 
-	void			(*destructor)(struct sk_buff *skb);
+	void			(*destructor)(struct sk_buff *skb, int final);
 #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
 	struct nf_conntrack	*nfct;
 	struct sk_buff		*nfct_reasm;
@@ -1407,15 +1407,13 @@ static inline void pskb_trim_unique(struct sk_buff *skb, unsigned int len)
  *	@skb: buffer to orphan
  *
  *	If a buffer currently has an owner then we call the owner's
- *	destructor function and make the @skb unowned. The buffer continues
+ *	destructor function. The buffer continues
  *	to exist but is no longer charged to its former owner.
  */
 static inline void skb_orphan(struct sk_buff *skb)
 {
 	if (skb->destructor)
-		skb->destructor(skb);
-	skb->destructor = NULL;
-	skb->sk		= NULL;
+		skb->destructor(skb, 0);
 }
 
 /**
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index 5915155..49e2162 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -130,7 +130,7 @@ int sctp_inet_listen(struct socket *sock, int backlog);
 void sctp_write_space(struct sock *sk);
 unsigned int sctp_poll(struct file *file, struct socket *sock,
 		poll_table *wait);
-void sctp_sock_rfree(struct sk_buff *skb);
+void sctp_sock_rfree(struct sk_buff *skb, int final);
 void sctp_copy_sock(struct sock *newsk, struct sock *sk,
 		    struct sctp_association *asoc);
 extern struct percpu_counter sctp_sockets_allocated;
diff --git a/include/net/sock.h b/include/net/sock.h
index 56df440..a042c9d 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -988,8 +988,8 @@ extern struct sk_buff		*sock_wmalloc(struct sock *sk,
 extern struct sk_buff		*sock_rmalloc(struct sock *sk,
 					      unsigned long size, int force,
 					      gfp_t priority);
-extern void			sock_wfree(struct sk_buff *skb);
-extern void			sock_rfree(struct sk_buff *skb);
+extern void			sock_wfree(struct sk_buff *skb, int final);
+extern void			sock_rfree(struct sk_buff *skb, int final);
 
 extern int			sock_setsockopt(struct socket *sock, int level,
 						int op, char __user *optval,
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
index cdf62b9..4e7276a 100644
--- a/net/caif/caif_socket.c
+++ b/net/caif/caif_socket.c
@@ -256,10 +256,12 @@ static void caif_sktflowctrl_cb(struct cflayer *layr,
 	}
 }
 
-static void skb_destructor(struct sk_buff *skb)
+static void skb_destructor(struct sk_buff *skb, int final)
 {
 	dbfs_atomic_inc(&cnt.skb_free);
 	dbfs_atomic_dec(&cnt.skb_in_use);
+	skb->sk = NULL;
+	skb->destructor = NULL;
 }
 
 
diff --git a/net/core/dev.c b/net/core/dev.c
index 876b111..9bffbe5 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1828,12 +1828,12 @@ static int illegal_highdma(struct net_device *dev, struct sk_buff *skb)
 }
 
 struct dev_gso_cb {
-	void (*destructor)(struct sk_buff *skb);
+	void (*destructor)(struct sk_buff *skb, int final);
 };
 
 #define DEV_GSO_CB(skb) ((struct dev_gso_cb *)(skb)->cb)
 
-static void dev_gso_skb_destructor(struct sk_buff *skb)
+static void dev_gso_skb_destructor(struct sk_buff *skb, int final)
 {
 	struct dev_gso_cb *cb;
 
@@ -1847,7 +1847,9 @@ static void dev_gso_skb_destructor(struct sk_buff *skb)
 
 	cb = DEV_GSO_CB(skb);
 	if (cb->destructor)
-		cb->destructor(skb);
+		cb->destructor(skb, final);
+	skb->sk = NULL;
+	skb->destructor = NULL;
 }
 
 /**
@@ -1904,23 +1906,11 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
 		if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
 			skb_dst_drop(skb);
 
+		skb_orphan(skb);
+
 		rc = ops->ndo_start_xmit(skb, dev);
 		if (rc == NETDEV_TX_OK)
 			txq_trans_update(txq);
-		/*
-		 * TODO: if skb_orphan() was called by
-		 * dev->hard_start_xmit() (for example, the unmodified
-		 * igb driver does that; bnx2 doesn't), then
-		 * skb_tx_software_timestamp() will be unable to send
-		 * back the time stamp.
-		 *
-		 * How can this be prevented? Always create another
-		 * reference to the socket before calling
-		 * dev->hard_start_xmit()? Prevent that skb_orphan()
-		 * does anything in dev->hard_start_xmit() by clearing
-		 * the skb destructor before the call and restoring it
-		 * afterwards, then doing the skb_orphan() ourselves?
-		 */
 		return rc;
 	}
 
@@ -1938,6 +1928,8 @@ gso:
 		if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
 			skb_dst_drop(nskb);
 
+		skb_orphan(nskb);
+
 		rc = ops->ndo_start_xmit(nskb, dev);
 		if (unlikely(rc != NETDEV_TX_OK)) {
 			if (rc & ~NETDEV_TX_MASK)
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index bdea0ef..90c171f 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -396,7 +396,7 @@ static void skb_release_head_state(struct sk_buff *skb)
 #endif
 	if (skb->destructor) {
 		WARN_ON(in_irq());
-		skb->destructor(skb);
+		skb->destructor(skb, 1);
 	}
 #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
 	nf_conntrack_put(skb->nfct);
diff --git a/net/core/sock.c b/net/core/sock.c
index 7effa1e..fcf67ea 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1259,7 +1259,7 @@ void __init sk_init(void)
 /*
  * Write buffer destructor automatically called from kfree_skb.
  */
-void sock_wfree(struct sk_buff *skb)
+void sock_wfree(struct sk_buff *skb, int final)
 {
 	struct sock *sk = skb->sk;
 	unsigned int len = skb->truesize;
@@ -1279,18 +1279,22 @@ void sock_wfree(struct sk_buff *skb)
 	 */
 	if (atomic_sub_and_test(len, &sk->sk_wmem_alloc))
 		__sk_free(sk);
+	skb->sk = NULL;
+	skb->destructor = NULL;
 }
 EXPORT_SYMBOL(sock_wfree);
 
 /*
  * Read buffer destructor automatically called from kfree_skb.
  */
-void sock_rfree(struct sk_buff *skb)
+void sock_rfree(struct sk_buff *skb, int final)
 {
 	struct sock *sk = skb->sk;
 
 	atomic_sub(skb->truesize, &sk->sk_rmem_alloc);
 	sk_mem_uncharge(skb->sk, skb->truesize);
+	skb->sk = NULL;
+	skb->destructor = NULL;
 }
 EXPORT_SYMBOL(sock_rfree);
 
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
index 98dfcce..a3b0a95 100644
--- a/net/l2tp/l2tp_core.c
+++ b/net/l2tp/l2tp_core.c
@@ -973,9 +973,11 @@ EXPORT_SYMBOL_GPL(l2tp_xmit_core);
 
 /* Automatically called when the skb is freed.
  */
-static void l2tp_sock_wfree(struct sk_buff *skb)
+static void l2tp_sock_wfree(struct sk_buff *skb, int final)
 {
 	sock_put(skb->sk);
+	skb->sk = NULL;
+	skb->destructor = NULL;
 }
 
 /* For data skbs that we transmit, we associate with the tunnel socket
diff --git a/net/netfilter/nf_tproxy_core.c b/net/netfilter/nf_tproxy_core.c
index 5490fc3..17dd2d9 100644
--- a/net/netfilter/nf_tproxy_core.c
+++ b/net/netfilter/nf_tproxy_core.c
@@ -55,7 +55,7 @@ nf_tproxy_get_sock_v4(struct net *net, const u8 protocol,
 EXPORT_SYMBOL_GPL(nf_tproxy_get_sock_v4);
 
 static void
-nf_tproxy_destructor(struct sk_buff *skb)
+nf_tproxy_destructor(struct sk_buff *skb, int final)
 {
 	struct sock *sk = skb->sk;
 
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index f162d59..dc8e843 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -808,7 +808,7 @@ ring_is_full:
 	goto drop_n_restore;
 }
 
-static void tpacket_destruct_skb(struct sk_buff *skb)
+static void tpacket_destruct_skb(struct sk_buff *skb, int final)
 {
 	struct packet_sock *po = pkt_sk(skb->sk);
 	void *ph;
@@ -823,7 +823,7 @@ static void tpacket_destruct_skb(struct sk_buff *skb)
 		__packet_set_status(po, ph, TP_STATUS_AVAILABLE);
 	}
 
-	sock_wfree(skb);
+	sock_wfree(skb, final);
 }
 
 static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 3d9122e..17fca55 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -1303,7 +1303,7 @@ static void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb)
 		unix_notinflight(scm->fp->fp[i]);
 }
 
-static void unix_destruct_fds(struct sk_buff *skb)
+static void unix_destruct_fds(struct sk_buff *skb, int final)
 {
 	struct scm_cookie scm;
 	memset(&scm, 0, sizeof(scm));
@@ -1312,7 +1312,7 @@ static void unix_destruct_fds(struct sk_buff *skb)
 	/* Alas, it calls VFS */
 	/* So fscking what? fput() had been SMP-safe since the last Summer */
 	scm_destroy(&scm);
-	sock_wfree(skb);
+	sock_wfree(skb, final);
 }
 
 static int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb)



^ permalink raw reply related

* Re: rps perfomance WAS(Re: rps: question
From: Rick Jones @ 2010-04-15 20:25 UTC (permalink / raw)
  To: hadi; +Cc: David Miller, eric.dumazet, therbert, netdev, robert, xiaosuo,
	andi
In-Reply-To: <1271362581.23780.12.camel@bigi>

jamal wrote:
> On Thu, 2010-04-15 at 09:41 -0700, Rick Jones wrote:
> 
> 
>>IPS (~= RPS) was running on shared FSB HP9000's.  Now, that was also a BSD 
>>networking stack with netisrq's and the like.  TOPS (~= RFS) was also run on 
>>shared FSB HP9000s, as well as CC-NUMA HP9000s and Integrity systems.  TOPS was 
>>implemented in a Streams-based stack tracing its history to a common ancestor 
>>with Solaris (Mentat).
> 
> 
> Sounds interesting.
> Wikipedia information overload. Any arch description of the HP9000? 

I should have been more specific - HP 9000 Model 800's :) PA-RISC based business 
computers running HP-UX.  In the case of IPS, HP-UX 10.20 ca 1995 or so.

> Did your scheme use IPIs to message the other CPUs?

Netisrs were kernel processes one per CPU (back then a core, a processor and a 
CPU were one and the same :), and while we didn't call them IPI's, yes, it was a 
"soft interrupt" directed at the given processor to launch the netisr if it 
wasn't already running.

TOPS was similar, but was with Streams and that did/does have some kernel 
processes not everything would happen as a kernel process.

rick jones

HP 3000 Model 900's - by and large the same PA-RISC hardware but running MPE/XL 
(later called MPE/iX)
HP 9000 Model 700's - PA-RISC based workstations
HP 9000 Model 300's - Moto 68K-based workstations (replaced by the 700s)

^ permalink raw reply

* Re: rps perfomance WAS(Re: rps: question
From: jamal @ 2010-04-15 20:16 UTC (permalink / raw)
  To: Rick Jones
  Cc: David Miller, eric.dumazet, therbert, netdev, robert, xiaosuo,
	andi
In-Reply-To: <4BC741AE.3000108@hp.com>

On Thu, 2010-04-15 at 09:41 -0700, Rick Jones wrote:

> IPS (~= RPS) was running on shared FSB HP9000's.  Now, that was also a BSD 
> networking stack with netisrq's and the like.  TOPS (~= RFS) was also run on 
> shared FSB HP9000s, as well as CC-NUMA HP9000s and Integrity systems.  TOPS was 
> implemented in a Streams-based stack tracing its history to a common ancestor 
> with Solaris (Mentat).

Sounds interesting.
Wikipedia information overload. Any arch description of the HP9000? 
Did your scheme use IPIs to message the other CPUs?

cheers,
jamal 


^ permalink raw reply

* pull request: wireless-2.6 2010-04-15
From: John W. Linville @ 2010-04-15 20:03 UTC (permalink / raw)
  To: davem; +Cc: linux-wireless, netdev, linux-kernel

Dave,

Another fix intended for 2.6.34...without it some firmware wierdness can
induce the driver into hanging the box... :-(

Please let me know if there are problems!

Thanks,

John

---

The following changes since commit 4eaa0e3c869acd5dbc7c2e3818a9ae9cbf221d27:
  Eric Dumazet (1):
        fib: suppress lockdep-RCU false positive in FIB trie.

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git master

Johannes Berg (1):
      iwlwifi: work around bogus active chains detection

 drivers/net/wireless/iwlwifi/iwl-calib.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/iwlwifi/iwl-calib.c b/drivers/net/wireless/iwlwifi/iwl-calib.c
index 845831a..64de42b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-calib.c
+++ b/drivers/net/wireless/iwlwifi/iwl-calib.c
@@ -807,6 +807,18 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv,
 		}
 	}
 
+	/*
+	 * The above algorithm sometimes fails when the ucode
+	 * reports 0 for all chains. It's not clear why that
+	 * happens to start with, but it is then causing trouble
+	 * because this can make us enable more chains than the
+	 * hardware really has.
+	 *
+	 * To be safe, simply mask out any chains that we know
+	 * are not on the device.
+	 */
+	active_chains &= priv->hw_params.valid_rx_ant;
+
 	num_tx_chains = 0;
 	for (i = 0; i < NUM_RX_CHAINS; i++) {
 		/* loops on all the bits of
-- 
John W. Linville		Someday the world will need a hero, and you
linville@tuxdriver.com			might be all we have.  Be ready.

^ permalink raw reply related

* [PATCH] rdma/cm: Randomize local port allocation.
From: Sean Hefty @ 2010-04-15 19:55 UTC (permalink / raw)
  To: 'Tetsuo Handa'
  Cc: amwang-H+wXaHxf7aLQT0dZR+AlfA, opurdila-+zzKsuq53OdBDgjK7y7TUQ,
	eric.dumazet-Re5JQEeQqe8AvxtiuMwx3w,
	netdev-u79uwXL29TY76Z2rM5mHXA, nhorman-2XuSBdqkA4R54TAoqtyWWQ,
	davem-fT/PcQaiUtIeIZ0/mPfg9Q, ebiederm-aS9lmoZGLiVWk0Htik3J/w,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	rolandd-FYB4Gu1CFyUAvxtiuMwx3w, linux-rdma-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <201004150229.o3F2T4dZ054768-etx+eQDEXHD7nzcFbJAaVXf5DAMn2ifp@public.gmane.org>

From: Tetsuo Handa <penguin-kernel-JPay3/Yim36HaxMnTkn67Xf5DAMn2ifp@public.gmane.org>

>Randomize local port allocation in a way sctp_get_port_local() does.
>Update rover at the end of loop since we're likely to pick a valid port
>on the first try.
>
>Signed-off-by: Tetsuo Handa <penguin-kernel-JPay3/Yim36HaxMnTkn67Xf5DAMn2ifp@public.gmane.org>
Reviewed-by: Sean Hefty <sean.hefty-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

>---

I like this version, thanks!  I'm not sure which tree to merge it through.
Are you needing this for 2.6.34, or is 2.6.35 okay?

> drivers/infiniband/core/cma.c |   70 +++++++++++++++--------------------------
>-
> 1 file changed, 25 insertions(+), 45 deletions(-)
>
>--- linux-2.6.34-rc4.orig/drivers/infiniband/core/cma.c
>+++ linux-2.6.34-rc4/drivers/infiniband/core/cma.c
>@@ -79,7 +79,6 @@ static DEFINE_IDR(sdp_ps);
> static DEFINE_IDR(tcp_ps);
> static DEFINE_IDR(udp_ps);
> static DEFINE_IDR(ipoib_ps);
>-static int next_port;
>
> struct cma_device {
> 	struct list_head	list;
>@@ -1970,47 +1969,33 @@ err1:
>
> static int cma_alloc_any_port(struct idr *ps, struct rdma_id_private *id_priv)
> {
>-	struct rdma_bind_list *bind_list;
>-	int port, ret, low, high;
>-
>-	bind_list = kzalloc(sizeof *bind_list, GFP_KERNEL);
>-	if (!bind_list)
>-		return -ENOMEM;
>-
>-retry:
>-	/* FIXME: add proper port randomization per like inet_csk_get_port */
>-	do {
>-		ret = idr_get_new_above(ps, bind_list, next_port, &port);
>-	} while ((ret == -EAGAIN) && idr_pre_get(ps, GFP_KERNEL));
>-
>-	if (ret)
>-		goto err1;
>+	static unsigned int last_used_port;
>+	int low, high, remaining;
>+	unsigned int rover;
>
> 	inet_get_local_port_range(&low, &high);
>-	if (port > high) {
>-		if (next_port != low) {
>-			idr_remove(ps, port);
>-			next_port = low;
>-			goto retry;
>-		}
>-		ret = -EADDRNOTAVAIL;
>-		goto err2;
>+	remaining = (high - low) + 1;
>+	rover = net_random() % remaining + low;
>+retry:
>+	if (last_used_port != rover &&
>+	    !idr_find(ps, (unsigned short) rover)) {
>+		int ret = cma_alloc_port(ps, id_priv, rover);
>+		/*
>+		 * Remember previously used port number in order to avoid
>+		 * re-using same port immediately after it is closed.
>+		 */
>+		if (!ret)
>+			last_used_port = rover;
>+		if (ret != -EADDRNOTAVAIL)
>+			return ret;
> 	}
>-
>-	if (port == high)
>-		next_port = low;
>-	else
>-		next_port = port + 1;
>-
>-	bind_list->ps = ps;
>-	bind_list->port = (unsigned short) port;
>-	cma_bind_port(bind_list, id_priv);
>-	return 0;
>-err2:
>-	idr_remove(ps, port);
>-err1:
>-	kfree(bind_list);
>-	return ret;
>+	if (--remaining) {
>+		rover++;
>+		if ((rover < low) || (rover > high))
>+			rover = low;
>+		goto retry;
>+	}
>+	return -EADDRNOTAVAIL;
> }
>
> static int cma_use_port(struct idr *ps, struct rdma_id_private *id_priv)
>@@ -2995,12 +2980,7 @@ static void cma_remove_one(struct ib_dev
>
> static int __init cma_init(void)
> {
>-	int ret, low, high, remaining;
>-
>-	get_random_bytes(&next_port, sizeof next_port);
>-	inet_get_local_port_range(&low, &high);
>-	remaining = (high - low) + 1;
>-	next_port = ((unsigned int) next_port % remaining) + low;
>+	int ret;
>
> 	cma_wq = create_singlethread_workqueue("rdma_cm");
> 	if (!cma_wq)

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply

* [PATCH Resubmission v2] drivers/net/usb: Add new driver ipheth
From: L. Alberto Giménez @ 2010-04-15 19:46 UTC (permalink / raw)
  Cc: dgiagio, dborca, David S. Miller, James Bottomley, Ralf Baechle,
	Greg Kroah-Hartman, Jonas Sjöquist, Torgny Johansson,
	Steve Glendinning, David Brownell, Omar Laazimani,
	Rémi Denis-Courmont, L. Alberto Giménez, netdev,
	linux-kernel, linux-usb
In-Reply-To: <1269984864-28159-1-git-send-email-agimenez@sysvalve.es>

From: dborca@yahoo.com

Add new driver to use tethering with an iPhone device. After initial submission,
apply fixes to fit the new driver into the kernel standards.

There are still a couple of minor (almost cosmetic-level) issues, but the driver
is fully functional right now.

Signed-off-by: L. Alberto Giménez <agimenez@sysvalve.es>
---
 drivers/net/Makefile     |    1 +
 drivers/net/usb/Kconfig  |   12 +
 drivers/net/usb/Makefile |    1 +
 drivers/net/usb/ipheth.c |  568 ++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 582 insertions(+), 0 deletions(-)
 create mode 100644 drivers/net/usb/ipheth.c

diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index a583b50..12b280a 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -273,6 +273,7 @@ obj-$(CONFIG_USB_RTL8150)       += usb/
 obj-$(CONFIG_USB_HSO)		+= usb/
 obj-$(CONFIG_USB_USBNET)        += usb/
 obj-$(CONFIG_USB_ZD1201)        += usb/
+obj-$(CONFIG_USB_IPHETH)        += usb/
 
 obj-y += wireless/
 obj-$(CONFIG_NET_TULIP) += tulip/
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index ba56ce4..63be4ca 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -385,4 +385,16 @@ config USB_CDC_PHONET
 	  cellular modem, as found on most Nokia handsets with the
 	  "PC suite" USB profile.
 
+config USB_IPHETH
+	tristate "Apple iPhone USB Ethernet driver"
+	default n
+	---help---
+	  Module used to share Internet connection (tethering) from your
+	  iPhone (Original, 3G and 3GS) to your system.
+	  Note that you need userspace libraries and programs that are needed
+	  to pair your device with your system and that understand the iPhone
+	  protocol.
+
+	  For more information: http://giagio.com/wiki/moin.cgi/iPhoneEthernetDriver
+
 endmenu
diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
index 82ea629..edb09c0 100644
--- a/drivers/net/usb/Makefile
+++ b/drivers/net/usb/Makefile
@@ -23,4 +23,5 @@ obj-$(CONFIG_USB_NET_MCS7830)	+= mcs7830.o
 obj-$(CONFIG_USB_USBNET)	+= usbnet.o
 obj-$(CONFIG_USB_NET_INT51X1)	+= int51x1.o
 obj-$(CONFIG_USB_CDC_PHONET)	+= cdc-phonet.o
+obj-$(CONFIG_USB_IPHETH)	+= ipheth.o
 
diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c
new file mode 100644
index 0000000..fd10331
--- /dev/null
+++ b/drivers/net/usb/ipheth.c
@@ -0,0 +1,568 @@
+/*
+ * ipheth.c - Apple iPhone USB Ethernet driver
+ *
+ * Copyright (c) 2009 Diego Giagio <diego@giagio.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of GIAGIO.COM nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * Alternatively, provided that this notice is retained in full, this
+ * software may be distributed under the terms of the GNU General
+ * Public License ("GPL") version 2, in which case the provisions of the
+ * GPL apply INSTEAD OF those given above.
+ *
+ * The provided data structures and external interfaces from this code
+ * are not restricted to be used by modules with a GPL compatible license.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ *
+ * Attention: iPhone device must be paired, otherwise it won't respond to our
+ * driver. For more info: http://giagio.com/wiki/moin.cgi/iPhoneEthernetDriver
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/usb.h>
+#include <linux/workqueue.h>
+
+#define USB_VENDOR_APPLE        0x05ac
+#define USB_PRODUCT_IPHONE      0x1290
+#define USB_PRODUCT_IPHONE_3G   0x1292
+#define USB_PRODUCT_IPHONE_3GS  0x1294
+
+#define IPHETH_USBINTF_CLASS    255
+#define IPHETH_USBINTF_SUBCLASS 253
+#define IPHETH_USBINTF_PROTO    1
+
+#define IPHETH_BUF_SIZE         1516
+#define IPHETH_TX_TIMEOUT       (5 * HZ)
+
+#define IPHETH_INTFNUM          2
+#define IPHETH_ALT_INTFNUM      1
+
+#define IPHETH_CTRL_ENDP        0x00
+#define IPHETH_CTRL_BUF_SIZE    0x40
+#define IPHETH_CTRL_TIMEOUT     (5 * HZ)
+
+#define IPHETH_CMD_GET_MACADDR   0x00
+#define IPHETH_CMD_CARRIER_CHECK 0x45
+
+#define IPHETH_CARRIER_CHECK_TIMEOUT round_jiffies_relative(1 * HZ)
+#define IPHETH_CARRIER_ON       0x04
+
+static struct usb_device_id ipheth_table[] = {
+	{ USB_DEVICE_AND_INTERFACE_INFO(
+		USB_VENDOR_APPLE, USB_PRODUCT_IPHONE,
+		IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
+		IPHETH_USBINTF_PROTO) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(
+		USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_3G,
+		IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
+		IPHETH_USBINTF_PROTO) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(
+		USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_3GS,
+		IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
+		IPHETH_USBINTF_PROTO) },
+	{ }
+};
+MODULE_DEVICE_TABLE(usb, ipheth_table);
+
+struct ipheth_device {
+	struct usb_device *udev;
+	struct usb_interface *intf;
+	struct net_device *net;
+	struct sk_buff *tx_skb;
+	struct urb *tx_urb;
+	struct urb *rx_urb;
+	unsigned char *tx_buf;
+	unsigned char *rx_buf;
+	unsigned char *ctrl_buf;
+	u8 bulk_in;
+	u8 bulk_out;
+	struct delayed_work carrier_work;
+};
+
+static int ipheth_rx_submit(struct ipheth_device *dev, gfp_t mem_flags);
+
+static int ipheth_alloc_urbs(struct ipheth_device *iphone)
+{
+	struct urb *tx_urb = NULL;
+	struct urb *rx_urb = NULL;
+	u8 *tx_buf = NULL;
+	u8 *rx_buf = NULL;
+
+	tx_urb = usb_alloc_urb(0, GFP_KERNEL);
+	if (tx_urb == NULL)
+		goto error;
+
+	rx_urb = usb_alloc_urb(0, GFP_KERNEL);
+	if (rx_urb == NULL)
+		goto error;
+
+	tx_buf = usb_buffer_alloc(iphone->udev,
+				  IPHETH_BUF_SIZE,
+				  GFP_KERNEL,
+				  &tx_urb->transfer_dma);
+	if (tx_buf == NULL)
+		goto error;
+
+	rx_buf = usb_buffer_alloc(iphone->udev,
+				  IPHETH_BUF_SIZE,
+				  GFP_KERNEL,
+				  &rx_urb->transfer_dma);
+	if (rx_buf == NULL)
+		goto error;
+
+
+	iphone->tx_urb = tx_urb;
+	iphone->rx_urb = rx_urb;
+	iphone->tx_buf = tx_buf;
+	iphone->rx_buf = rx_buf;
+	return 0;
+
+error:
+	usb_buffer_free(iphone->udev, IPHETH_BUF_SIZE, rx_buf,
+			rx_urb->transfer_dma);
+	usb_buffer_free(iphone->udev, IPHETH_BUF_SIZE, tx_buf,
+			tx_urb->transfer_dma);
+	usb_free_urb(rx_urb);
+	usb_free_urb(tx_urb);
+	return -ENOMEM;
+}
+
+static void ipheth_free_urbs(struct ipheth_device *iphone)
+{
+	usb_buffer_free(iphone->udev, IPHETH_BUF_SIZE, iphone->rx_buf,
+			iphone->rx_urb->transfer_dma);
+	usb_buffer_free(iphone->udev, IPHETH_BUF_SIZE, iphone->tx_buf,
+			iphone->tx_urb->transfer_dma);
+	usb_free_urb(iphone->rx_urb);
+	usb_free_urb(iphone->tx_urb);
+}
+
+static void ipheth_kill_urbs(struct ipheth_device *dev)
+{
+	usb_kill_urb(dev->tx_urb);
+	usb_kill_urb(dev->rx_urb);
+}
+
+static void ipheth_rcvbulk_callback(struct urb *urb)
+{
+	struct ipheth_device *dev;
+	struct sk_buff *skb;
+	int status;
+	char *buf;
+	int len;
+
+	dev = urb->context;
+	if (dev == NULL)
+		return;
+
+	status = urb->status;
+	switch (status) {
+	case -ENOENT:
+	case -ECONNRESET:
+	case -ESHUTDOWN:
+		return;
+	case 0:
+		break;
+	default:
+		err("%s: urb status: %d", __func__, urb->status);
+		return;
+	}
+
+	len = urb->actual_length;
+	buf = urb->transfer_buffer;
+
+	skb = dev_alloc_skb(NET_IP_ALIGN + len);
+	if (!skb) {
+		err("%s: dev_alloc_skb: -ENOMEM", __func__);
+		dev->net->stats.rx_dropped++;
+		return;
+	}
+
+	skb_reserve(skb, NET_IP_ALIGN);
+	memcpy(skb_put(skb, len), buf + NET_IP_ALIGN, len - NET_IP_ALIGN);
+	skb->dev = dev->net;
+	skb->protocol = eth_type_trans(skb, dev->net);
+
+	dev->net->stats.rx_packets++;
+	dev->net->stats.rx_bytes += len;
+
+	netif_rx(skb);
+	ipheth_rx_submit(dev, GFP_ATOMIC);
+}
+
+static void ipheth_sndbulk_callback(struct urb *urb)
+{
+	struct ipheth_device *dev;
+
+	dev = urb->context;
+	if (dev == NULL)
+		return;
+
+	if (urb->status != 0 &&
+	    urb->status != -ENOENT &&
+	    urb->status != -ECONNRESET &&
+	    urb->status != -ESHUTDOWN)
+		err("%s: urb status: %d", __func__, urb->status);
+
+	dev_kfree_skb_irq(dev->tx_skb);
+	netif_wake_queue(dev->net);
+}
+
+static int ipheth_carrier_set(struct ipheth_device *dev)
+{
+	struct usb_device *udev = dev->udev;
+	int retval;
+
+	retval = usb_control_msg(udev,
+			usb_rcvctrlpipe(udev, IPHETH_CTRL_ENDP),
+			IPHETH_CMD_CARRIER_CHECK, /* request */
+			0xc0, /* request type */
+			0x00, /* value */
+			0x02, /* index */
+			dev->ctrl_buf, IPHETH_CTRL_BUF_SIZE,
+			IPHETH_CTRL_TIMEOUT);
+	if (retval < 0) {
+		err("%s: usb_control_msg: %d", __func__, retval);
+		return retval;
+	}
+
+	if (dev->ctrl_buf[0] == IPHETH_CARRIER_ON)
+		netif_carrier_on(dev->net);
+	else
+		netif_carrier_off(dev->net);
+
+	return 0;
+}
+
+static void ipheth_carrier_check_work(struct work_struct *work)
+{
+	struct ipheth_device *dev = container_of(work, struct ipheth_device,
+						 carrier_work.work);
+
+	ipheth_carrier_set(dev);
+	schedule_delayed_work(&dev->carrier_work, IPHETH_CARRIER_CHECK_TIMEOUT);
+}
+
+static int ipheth_get_macaddr(struct ipheth_device *dev)
+{
+	struct usb_device *udev = dev->udev;
+	struct net_device *net = dev->net;
+	int retval;
+
+	retval = usb_control_msg(udev,
+				 usb_rcvctrlpipe(udev, IPHETH_CTRL_ENDP),
+				 IPHETH_CMD_GET_MACADDR, /* request */
+				 0xc0, /* request type */
+				 0x00, /* value */
+				 0x02, /* index */
+				 dev->ctrl_buf,
+				 IPHETH_CTRL_BUF_SIZE,
+				 IPHETH_CTRL_TIMEOUT);
+	if (retval < 0) {
+		err("%s: usb_control_msg: %d", __func__, retval);
+	} else if (retval < ETH_ALEN) {
+		err("%s: usb_control_msg: short packet: %d bytes",
+			__func__, retval);
+		retval = -EINVAL;
+	} else {
+		memcpy(net->dev_addr, dev->ctrl_buf, ETH_ALEN);
+		retval = 0;
+	}
+
+	return retval;
+}
+
+static int ipheth_rx_submit(struct ipheth_device *dev, gfp_t mem_flags)
+{
+	struct usb_device *udev = dev->udev;
+	int retval;
+
+	usb_fill_bulk_urb(dev->rx_urb, udev,
+			  usb_rcvbulkpipe(udev, dev->bulk_in),
+			  dev->rx_buf, IPHETH_BUF_SIZE,
+			  ipheth_rcvbulk_callback,
+			  dev);
+	dev->rx_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+
+	retval = usb_submit_urb(dev->rx_urb, mem_flags);
+	if (retval)
+		err("%s: usb_submit_urb: %d", __func__, retval);
+	return retval;
+}
+
+static int ipheth_open(struct net_device *net)
+{
+	struct ipheth_device *dev = netdev_priv(net);
+	struct usb_device *udev = dev->udev;
+	int retval = 0;
+
+	usb_set_interface(udev, IPHETH_INTFNUM, IPHETH_ALT_INTFNUM);
+
+	retval = ipheth_carrier_set(dev);
+	if (retval)
+		return retval;
+
+	retval = ipheth_rx_submit(dev, GFP_KERNEL);
+	if (retval)
+		return retval;
+
+	schedule_delayed_work(&dev->carrier_work, IPHETH_CARRIER_CHECK_TIMEOUT);
+	netif_start_queue(net);
+	return retval;
+}
+
+static int ipheth_close(struct net_device *net)
+{
+	struct ipheth_device *dev = netdev_priv(net);
+
+	cancel_delayed_work_sync(&dev->carrier_work);
+	netif_stop_queue(net);
+	return 0;
+}
+
+static int ipheth_tx(struct sk_buff *skb, struct net_device *net)
+{
+	struct ipheth_device *dev = netdev_priv(net);
+	struct usb_device *udev = dev->udev;
+	int retval;
+
+	/* Paranoid */
+	if (skb->len > IPHETH_BUF_SIZE) {
+		WARN(1, "%s: skb too large: %d bytes", __func__, skb->len);
+		dev->net->stats.tx_dropped++;
+		dev_kfree_skb_irq(skb);
+		return NETDEV_TX_OK;
+	}
+
+	memcpy(dev->tx_buf, skb->data, skb->len);
+	if (skb->len < IPHETH_BUF_SIZE)
+		memset(dev->tx_buf + skb->len, 0, IPHETH_BUF_SIZE - skb->len);
+
+	usb_fill_bulk_urb(dev->tx_urb, udev,
+			  usb_sndbulkpipe(udev, dev->bulk_out),
+			  dev->tx_buf, IPHETH_BUF_SIZE,
+			  ipheth_sndbulk_callback,
+			  dev);
+	dev->tx_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+
+	retval = usb_submit_urb(dev->tx_urb, GFP_ATOMIC);
+	if (retval) {
+		err("%s: usb_submit_urb: %d", __func__, retval);
+		dev->net->stats.tx_errors++;
+		dev_kfree_skb_irq(skb);
+	} else {
+		dev->tx_skb = skb;
+
+		dev->net->stats.tx_packets++;
+		dev->net->stats.tx_bytes += skb->len;
+		netif_stop_queue(net);
+	}
+
+	return NETDEV_TX_OK;
+}
+
+static void ipheth_tx_timeout(struct net_device *net)
+{
+	struct ipheth_device *dev = netdev_priv(net);
+
+	err("%s: TX timeout", __func__);
+	dev->net->stats.tx_errors++;
+	usb_unlink_urb(dev->tx_urb);
+}
+
+static struct net_device_stats *ipheth_stats(struct net_device *net)
+{
+	struct ipheth_device *dev = netdev_priv(net);
+	return &dev->net->stats;
+}
+
+static u32 ipheth_ethtool_op_get_link(struct net_device *net)
+{
+	struct ipheth_device *dev = netdev_priv(net);
+	return netif_carrier_ok(dev->net);
+}
+
+static struct ethtool_ops ops = {
+	.get_link = ipheth_ethtool_op_get_link
+};
+
+static const struct net_device_ops ipheth_netdev_ops = {
+	.ndo_open = &ipheth_open,
+	.ndo_stop = &ipheth_close,
+	.ndo_start_xmit = &ipheth_tx,
+	.ndo_tx_timeout = &ipheth_tx_timeout,
+	.ndo_get_stats = &ipheth_stats,
+};
+
+static struct device_type ipheth_type = {
+	.name	= "wwan",
+};
+
+static int ipheth_probe(struct usb_interface *intf,
+			const struct usb_device_id *id)
+{
+	struct usb_device *udev = interface_to_usbdev(intf);
+	struct usb_host_interface *hintf;
+	struct usb_endpoint_descriptor *endp;
+	struct ipheth_device *dev;
+	struct net_device *netdev;
+	int i;
+	int retval;
+
+	netdev = alloc_etherdev(sizeof(struct ipheth_device));
+	if (!netdev)
+		return -ENOMEM;
+
+	netdev->netdev_ops = &ipheth_netdev_ops;
+	netdev->watchdog_timeo = IPHETH_TX_TIMEOUT;
+	strcpy(netdev->name, "wwan%d");
+
+	dev = netdev_priv(netdev);
+	dev->udev = udev;
+	dev->net = netdev;
+	dev->intf = intf;
+
+	/* Set up endpoints */
+	hintf = usb_altnum_to_altsetting(intf, IPHETH_ALT_INTFNUM);
+	if (hintf == NULL) {
+		retval = -ENODEV;
+		err("Unable to find alternate settings interface");
+		goto err_endpoints;
+	}
+
+	for (i = 0; i < hintf->desc.bNumEndpoints; i++) {
+		endp = &hintf->endpoint[i].desc;
+		if (usb_endpoint_is_bulk_in(endp))
+			dev->bulk_in = endp->bEndpointAddress;
+		else if (usb_endpoint_is_bulk_out(endp))
+			dev->bulk_out = endp->bEndpointAddress;
+	}
+	if (!(dev->bulk_in && dev->bulk_out)) {
+		retval = -ENODEV;
+		err("Unable to find endpoints");
+		goto err_endpoints;
+	}
+
+	dev->ctrl_buf = kmalloc(IPHETH_CTRL_BUF_SIZE, GFP_KERNEL);
+	if (dev->ctrl_buf == NULL) {
+		retval = -ENOMEM;
+		goto err_alloc_ctrl_buf;
+	}
+
+	retval = ipheth_get_macaddr(dev);
+	if (retval)
+		goto err_get_macaddr;
+
+	INIT_DELAYED_WORK(&dev->carrier_work, ipheth_carrier_check_work);
+
+	retval = ipheth_alloc_urbs(dev);
+	if (retval) {
+		err("error allocating urbs: %d", retval);
+		goto err_alloc_urbs;
+	}
+
+	usb_set_intfdata(intf, dev);
+
+	SET_NETDEV_DEV(netdev, &intf->dev);
+	SET_ETHTOOL_OPS(netdev, &ops);
+	SET_NETDEV_DEVTYPE(netdev, &ipheth_type);
+
+	retval = register_netdev(netdev);
+	if (retval) {
+		err("error registering netdev: %d", retval);
+		retval = -EIO;
+		goto err_register_netdev;
+	}
+
+	dev_info(&intf->dev, "Apple iPhone USB Ethernet device attached\n");
+	return 0;
+
+err_register_netdev:
+	ipheth_free_urbs(dev);
+err_alloc_urbs:
+err_get_macaddr:
+err_alloc_ctrl_buf:
+	kfree(dev->ctrl_buf);
+err_endpoints:
+	free_netdev(netdev);
+	return retval;
+}
+
+static void ipheth_disconnect(struct usb_interface *intf)
+{
+	struct ipheth_device *dev;
+
+	dev = usb_get_intfdata(intf);
+	if (dev != NULL) {
+		unregister_netdev(dev->net);
+		ipheth_kill_urbs(dev);
+		ipheth_free_urbs(dev);
+		kfree(dev->ctrl_buf);
+		free_netdev(dev->net);
+	}
+	usb_set_intfdata(intf, NULL);
+	dev_info(&intf->dev, "Apple iPhone USB Ethernet now disconnected\n");
+}
+
+static struct usb_driver ipheth_driver = {
+	.name =		"ipheth",
+	.probe =	ipheth_probe,
+	.disconnect =	ipheth_disconnect,
+	.id_table =	ipheth_table,
+};
+
+static int __init ipheth_init(void)
+{
+	int retval;
+
+	retval = usb_register(&ipheth_driver);
+	if (retval) {
+		err("usb_register failed: %d", retval);
+		return retval;
+	}
+	return 0;
+}
+
+static void __exit ipheth_exit(void)
+{
+	usb_deregister(&ipheth_driver);
+}
+
+module_init(ipheth_init);
+module_exit(ipheth_exit);
+
+MODULE_AUTHOR("Diego Giagio <diego@giagio.com>");
+MODULE_DESCRIPTION("Apple iPhone USB Ethernet driver");
+MODULE_LICENSE("Dual BSD/GPL");
-- 
1.7.0

^ permalink raw reply related

* [PATCH] net: mac8390 - Sort out memory/MMIO accesses and casts (was: Re: drivers/net/mac8390.c: Remove useless memcpy casting)
From: Geert Uytterhoeven @ 2010-04-15 19:34 UTC (permalink / raw)
  To: Joe Perches, Finn Thain
  Cc: David S. Miller, netdev, Linux Kernel Mailing List, Linux/m68k

On Mon, Mar 8, 2010 at 18:16, Joe Perches <joe@perches.com> wrote:
> On Sun, 2010-03-07 at 10:19 +0100, Geert Uytterhoeven wrote:
>> ... hence you introduced 3 compiler warnings:
>>
>> drivers/net/mac8390.c:249: warning: passing argument 1 of
>> '__builtin_memcpy' makes pointer from integer without a cast
>> drivers/net/mac8390.c:254: warning: passing argument 1 of
>> 'word_memcpy_tocard' makes pointer from integer without a cast
>> drivers/net/mac8390.c:256: warning: passing argument 2 of
>> 'word_memcpy_fromcard' makes pointer from integer without a cast
>
> Thanks, I'll submit a patch to fix it by tomorrow or so.

It hasn't been fixed yet. But here's a better solution.
I do not have the hardware to test it, though.
Finn, does it {look OK,work}?

>From 7ef849741922afa7b613f271f414024c454a0d23 Mon Sep 17 00:00:00 2001
From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: Wed, 14 Apr 2010 18:48:50 +0200
Subject: [PATCH] net: mac8390 - Sort out memory/MMIO accesses and casts

commit 5c7fffd0e3b57cb63f50bbd710868f012d67654f ("drivers/net/mac8390.c: Remove
useless memcpy casting") removed too many casts, introducing the following
warnings:

| drivers/net/mac8390.c:248: warning: passing argument 1 of
'__builtin_memcpy' makes pointer from integer without a cast
| drivers/net/mac8390.c:253: warning: passing argument 1 of
'word_memcpy_tocard' makes pointer from integer without a cast
| drivers/net/mac8390.c:255: warning: passing argument 2 of
'word_memcpy_fromcard' makes pointer from integer without a cast

Instead of just readding the casts,
  - move all casts inside word_memcpy_{to,from}card(),
  - replace an incorrect memcpy() by memcpy_toio(),
  - add memcmp_withio() as a wrapper around memcmp(),
  - replace an incorrect memcpy_toio() by memcpy_fromio().

Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
 drivers/net/mac8390.c |   44 ++++++++++++++++++++++----------------------
 1 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/drivers/net/mac8390.c b/drivers/net/mac8390.c
index c8e68fd..8c96e9c 100644
--- a/drivers/net/mac8390.c
+++ b/drivers/net/mac8390.c
@@ -157,6 +157,8 @@ static void dayna_block_output(struct net_device
*dev, int count,
 #define memcpy_fromio(a, b, c)	memcpy((a), (void *)(b), (c))
 #define memcpy_toio(a, b, c)	memcpy((void *)(a), (b), (c))

+#define memcmp_withio(a, b, c)	memcmp((a), (void *)(b), (c))
+
 /* Slow Sane (16-bit chunk memory read/write) Cabletron uses this */
 static void slow_sane_get_8390_hdr(struct net_device *dev,
 				   struct e8390_pkt_hdr *hdr, int ring_page);
@@ -164,8 +166,8 @@ static void slow_sane_block_input(struct
net_device *dev, int count,
 				  struct sk_buff *skb, int ring_offset);
 static void slow_sane_block_output(struct net_device *dev, int count,
 				   const unsigned char *buf, int start_page);
-static void word_memcpy_tocard(void *tp, const void *fp, int count);
-static void word_memcpy_fromcard(void *tp, const void *fp, int count);
+static void word_memcpy_tocard(unsigned long tp, const void *fp, int count);
+static void word_memcpy_fromcard(void *tp, unsigned long fp, int count);

 static enum mac8390_type __init mac8390_ident(struct nubus_dev *dev)
 {
@@ -245,9 +247,9 @@ static enum mac8390_access __init
mac8390_testio(volatile unsigned long membase)
 	unsigned long outdata = 0xA5A0B5B0;
 	unsigned long indata =  0x00000000;
 	/* Try writing 32 bits */
-	memcpy(membase, &outdata, 4);
+	memcpy_toio(membase, &outdata, 4);
 	/* Now compare them */
-	if (memcmp((char *)&outdata, (char *)membase, 4) == 0)
+	if (memcmp_withio(&outdata, membase, 4) == 0)
 		return ACCESS_32;
 	/* Write 16 bit output */
 	word_memcpy_tocard(membase, &outdata, 4);
@@ -733,7 +735,7 @@ static void sane_get_8390_hdr(struct net_device *dev,
 			      struct e8390_pkt_hdr *hdr, int ring_page)
 {
 	unsigned long hdr_start = (ring_page - WD_START_PG)<<8;
-	memcpy_fromio((void *)hdr, (char *)dev->mem_start + hdr_start, 4);
+	memcpy_fromio(hdr, dev->mem_start + hdr_start, 4);
 	/* Fix endianness */
 	hdr->count = swab16(hdr->count);
 }
@@ -747,14 +749,13 @@ static void sane_block_input(struct net_device
*dev, int count,
 	if (xfer_start + count > ei_status.rmem_end) {
 		/* We must wrap the input move. */
 		int semi_count = ei_status.rmem_end - xfer_start;
-		memcpy_fromio(skb->data, (char *)dev->mem_start + xfer_base,
+		memcpy_fromio(skb->data, dev->mem_start + xfer_base,
 			      semi_count);
 		count -= semi_count;
-		memcpy_toio(skb->data + semi_count,
-			    (char *)ei_status.rmem_start, count);
-	} else {
-		memcpy_fromio(skb->data, (char *)dev->mem_start + xfer_base,
+		memcpy_fromio(skb->data + semi_count, ei_status.rmem_start,
 			      count);
+	} else {
+		memcpy_fromio(skb->data, dev->mem_start + xfer_base, count);
 	}
 }

@@ -763,7 +764,7 @@ static void sane_block_output(struct net_device
*dev, int count,
 {
 	long shmem = (start_page - WD_START_PG)<<8;

-	memcpy_toio((char *)dev->mem_start + shmem, buf, count);
+	memcpy_toio(dev->mem_start + shmem, buf, count);
 }

 /* dayna block input/output */
@@ -814,7 +815,7 @@ static void slow_sane_get_8390_hdr(struct net_device *dev,
 				   int ring_page)
 {
 	unsigned long hdr_start = (ring_page - WD_START_PG)<<8;
-	word_memcpy_fromcard(hdr, (char *)dev->mem_start + hdr_start, 4);
+	word_memcpy_fromcard(hdr, dev->mem_start + hdr_start, 4);
 	/* Register endianism - fix here rather than 8390.c */
 	hdr->count = (hdr->count&0xFF)<<8|(hdr->count>>8);
 }
@@ -828,15 +829,14 @@ static void slow_sane_block_input(struct
net_device *dev, int count,
 	if (xfer_start + count > ei_status.rmem_end) {
 		/* We must wrap the input move. */
 		int semi_count = ei_status.rmem_end - xfer_start;
-		word_memcpy_fromcard(skb->data,
-				     (char *)dev->mem_start + xfer_base,
+		word_memcpy_fromcard(skb->data, dev->mem_start + xfer_base,
 				     semi_count);
 		count -= semi_count;
 		word_memcpy_fromcard(skb->data + semi_count,
-				     (char *)ei_status.rmem_start, count);
+				     ei_status.rmem_start, count);
 	} else {
-		word_memcpy_fromcard(skb->data,
-				     (char *)dev->mem_start + xfer_base, count);
+		word_memcpy_fromcard(skb->data, dev->mem_start + xfer_base,
+				     count);
 	}
 }

@@ -845,12 +845,12 @@ static void slow_sane_block_output(struct
net_device *dev, int count,
 {
 	long shmem = (start_page - WD_START_PG)<<8;

-	word_memcpy_tocard((char *)dev->mem_start + shmem, buf, count);
+	word_memcpy_tocard(dev->mem_start + shmem, buf, count);
 }

-static void word_memcpy_tocard(void *tp, const void *fp, int count)
+static void word_memcpy_tocard(unsigned long tp, const void *fp, int count)
 {
-	volatile unsigned short *to = tp;
+	volatile unsigned short *to = (void *)tp;
 	const unsigned short *from = fp;

 	count++;
@@ -860,10 +860,10 @@ static void word_memcpy_tocard(void *tp, const
void *fp, int count)
 		*to++ = *from++;
 }

-static void word_memcpy_fromcard(void *tp, const void *fp, int count)
+static void word_memcpy_fromcard(void *tp, unsigned long fp, int count)
 {
 	unsigned short *to = tp;
-	const volatile unsigned short *from = fp;
+	const volatile unsigned short *from = (const void *)fp;

 	count++;
 	count /= 2;
-- 
1.6.0.4

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply related

* [PATCH] ip: Fix ip_dev_loopback_xmit()
From: Eric Dumazet @ 2010-04-15 19:13 UTC (permalink / raw)
  To: Eric Paris, David Miller; +Cc: netdev, Tom Herbert
In-Reply-To: <1271337401.16881.2563.camel@edumazet-laptop>

[PATCH] ip: Fix ip_dev_loopback_xmit()

Eric Paris got following trace with a linux-next kernel

[   14.203970] BUG: using smp_processor_id() in preemptible [00000000]
code: avahi-daemon/2093
[   14.204025] caller is netif_rx+0xfa/0x110
[   14.204035] Call Trace:
[   14.204064]  [<ffffffff81278fe5>] debug_smp_processor_id+0x105/0x110
[   14.204070]  [<ffffffff8142163a>] netif_rx+0xfa/0x110
[   14.204090]  [<ffffffff8145b631>] ip_dev_loopback_xmit+0x71/0xa0
[   14.204095]  [<ffffffff8145b892>] ip_mc_output+0x192/0x2c0
[   14.204099]  [<ffffffff8145d610>] ip_local_out+0x20/0x30
[   14.204105]  [<ffffffff8145d8ad>] ip_push_pending_frames+0x28d/0x3d0
[   14.204119]  [<ffffffff8147f1cc>] udp_push_pending_frames+0x14c/0x400
[   14.204125]  [<ffffffff814803fc>] udp_sendmsg+0x39c/0x790
[   14.204137]  [<ffffffff814891d5>] inet_sendmsg+0x45/0x80
[   14.204149]  [<ffffffff8140af91>] sock_sendmsg+0xf1/0x110
[   14.204189]  [<ffffffff8140dc6c>] sys_sendmsg+0x20c/0x380
[   14.204233]  [<ffffffff8100ad82>] system_call_fastpath+0x16/0x1b

While current linux-2.6 kernel doesnt emit this warning, bug is latent
and might cause unexpected failures.

ip_dev_loopback_xmit() runs in process context, preemption enabled, so
must call netif_rx_ni() instead of netif_rx(), to make sure that we
process pending software interrupt.

Same change for ip6_dev_loopback_xmit()

Reported-by: Eric Paris <eparis@redhat.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
---
 net/ipv4/ip_output.c  |    2 +-
 net/ipv6/ip6_output.c |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index c65f18e..d1bcc9f 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -120,7 +120,7 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb)
 	newskb->pkt_type = PACKET_LOOPBACK;
 	newskb->ip_summed = CHECKSUM_UNNECESSARY;
 	WARN_ON(!skb_dst(newskb));
-	netif_rx(newskb);
+	netif_rx_ni(newskb);
 	return 0;
 }
 
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 16c4391..65f9c37 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -108,7 +108,7 @@ static int ip6_dev_loopback_xmit(struct sk_buff *newskb)
 	newskb->ip_summed = CHECKSUM_UNNECESSARY;
 	WARN_ON(!skb_dst(newskb));
 
-	netif_rx(newskb);
+	netif_rx_ni(newskb);
 	return 0;
 }
 



^ permalink raw reply related

* Re: BUG: using smp_processor_id() in preemptible [00000000] code: avahi-daemon:  caller is netif_rx
From: Eric Dumazet @ 2010-04-15 19:07 UTC (permalink / raw)
  To: Eric Paris, David Miller; +Cc: netdev, Tom Herbert
In-Reply-To: <1271337401.16881.2563.camel@edumazet-laptop>

Le jeudi 15 avril 2010 à 15:16 +0200, Eric Dumazet a écrit :
> Le lundi 12 avril 2010 à 21:40 +0200, Eric Dumazet a écrit :
> > Good spot, RPS changed a bit netif_rx() requirements.
> > 
> > I would change ip_dev_loopback_xmit() to call netif_rx_ni() instead...
> > 
> > David, Tom ?
> > 
> > diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
> > index c65f18e..d1bcc9f 100644
> > --- a/net/ipv4/ip_output.c
> > +++ b/net/ipv4/ip_output.c
> > @@ -120,7 +120,7 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb)
> >  	newskb->pkt_type = PACKET_LOOPBACK;
> >  	newskb->ip_summed = CHECKSUM_UNNECESSARY;
> >  	WARN_ON(!skb_dst(newskb));
> > -	netif_rx(newskb);
> > +	netif_rx_ni(newskb);
> >  	return 0;
> >  }
> >  
> 
> After some confusion, it seems this was the right fix after all :)
> 
> [PATCH] ip: Fix ip_dev_loopback_xmit()
> 
> Eric Paris got following trace with a linux-next kernel
> 
> [   14.203970] BUG: using smp_processor_id() in preemptible [00000000]
> code: avahi-daemon/2093
> [   14.204025] caller is netif_rx+0xfa/0x110
> [   14.204035] Call Trace:
> [   14.204064]  [<ffffffff81278fe5>] debug_smp_processor_id+0x105/0x110
> [   14.204070]  [<ffffffff8142163a>] netif_rx+0xfa/0x110
> [   14.204090]  [<ffffffff8145b631>] ip_dev_loopback_xmit+0x71/0xa0
> [   14.204095]  [<ffffffff8145b892>] ip_mc_output+0x192/0x2c0
> [   14.204099]  [<ffffffff8145d610>] ip_local_out+0x20/0x30
> [   14.204105]  [<ffffffff8145d8ad>] ip_push_pending_frames+0x28d/0x3d0
> [   14.204119]  [<ffffffff8147f1cc>] udp_push_pending_frames+0x14c/0x400
> [   14.204125]  [<ffffffff814803fc>] udp_sendmsg+0x39c/0x790
> [   14.204137]  [<ffffffff814891d5>] inet_sendmsg+0x45/0x80
> [   14.204149]  [<ffffffff8140af91>] sock_sendmsg+0xf1/0x110
> [   14.204189]  [<ffffffff8140dc6c>] sys_sendmsg+0x20c/0x380
> [   14.204233]  [<ffffffff8100ad82>] system_call_fastpath+0x16/0x1b
> 
> While current linux-2.6 kernel doesnt emit this warning, bug is latent
> and might cause unexpected failures.
> 
> ip_dev_loopback_xmit() runs in process context, preemption enabled, so
> must call netif_rx_ni() instead of netif_rx(), to make sure that we
> process pending software interrupt.
> 
> Reported-by: Eric Paris <eparis@redhat.com>
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
> ---
> diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
> index c65f18e..d1bcc9f 100644
> --- a/net/ipv4/ip_output.c
> +++ b/net/ipv4/ip_output.c
> @@ -120,7 +120,7 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb)
>  	newskb->pkt_type = PACKET_LOOPBACK;
>  	newskb->ip_summed = CHECKSUM_UNNECESSARY;
>  	WARN_ON(!skb_dst(newskb));
> -	netif_rx(newskb);
> +	netif_rx_ni(newskb);
>  	return 0;
>  }
>  

Oops silly me, I forgot ipv6

updated patch in a couple of minutes





^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox