3.4.66-stable review
Subsystems (41)
Greg Kroah-Hartman
maintainercover 3.4.66-stable review
This is the start of the stable review cycle for the 3.4.66 release. There are 48 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun Oct 13 19:35:35 UTC 2013. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.66-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 3.4.66-rc1
Theodore Ts'o <[email protected]>
ext4: avoid hang when mounting non-journal filesystems with orphan list
Josef Bacik <[email protected]>
Btrfs: change how we queue blocks for backref checking
Chris Metcalf <[email protected]>
tile: use a more conservative __my_cpu_offset in CONFIG_PREEMPT
Lv Zheng <[email protected]>
ACPI / IPMI: Fix atomic context requirement of ipmi_msg_handler()
David Rientjes <[email protected]>
mm, show_mem: suppress page counts in non-blockable contexts
Ian Abbott <[email protected]>
staging: comedi: ni_65xx: (bug fix) confine insn_bits to one subdevice
Michael Grzeschik <[email protected]>
dmaengine: imx-dma: fix slow path issue in prep_dma_cyclic
Michael Grzeschik <[email protected]>
dmaengine: imx-dma: fix callback path in tasklet
Michael Grzeschik <[email protected]>
dmaengine: imx-dma: fix lockdep issue between irqhandler and tasklet
Christian Lamparter <[email protected]>
p54usb: add USB ID for Corega WLUSB2GTST USB adapter
Larry Finger <[email protected]>
rtlwifi: Align private space in rtl_priv struct
Jack Wang <[email protected]>
ib_srpt: always set response for task management
Nicholas Bellinger <[email protected]>
ib_srpt: Destroy cm_id before destroying QP.
Michal Malý <[email protected]>
USB: serial: option: Ignore card reader interface on Huawei E1750
Tetsuo Handa <[email protected]>
kernel/kmod.c: check for NULL in call_usermodehelper_exec()
Kirill Tkhai <[email protected]>
sparc32: Fix exit flag passed from traced sys_sigreturn
Kirill Tkhai <[email protected]>
sparc64: Fix not SRA'ed %o5 in 32-bit traced syscall
David S. Miller <[email protected]>
sparc64: Fix off by one in trampoline TLB mapping installation loop.
Kirill Tkhai <[email protected]>
sparc64: Remove RWSEM export leftovers
Kirill Tkhai <[email protected]>
sparc64: Fix ITLB handler of null page
David S. Miller <[email protected]>
esp_scsi: Fix tag state corruption when autosensing.
Andre Guedes <[email protected]>
Bluetooth: Fix encryption key size for peripheral role
Andre Guedes <[email protected]>
Bluetooth: Fix security level for peripheral role
Paul E. McKenney <[email protected]>
powerpc: Restore registers on error exit from csum_partial_copy_generic()
Paul E. McKenney <[email protected]>
powerpc: Fix parameter clobber in csum_partial_copy_generic()
Prarit Bhargava <[email protected]>
powerpc/vio: Fix modalias_show return values
Nishanth Aravamudan <[email protected]>
powerpc/iommu: Use GFP_KERNEL instead of GFP_ATOMIC in iommu_init_table()
Dan Carpenter <[email protected]>
ASoC: 88pm860x: array overflow in snd_soc_put_volsw_2r_st()
Dan Carpenter <[email protected]>
ASoC: max98095: a couple array underflows
Ricardo Ribalda <[email protected]>
ll_temac: Reset dma descriptors indexes on ndo_open
Salam Noureddine <[email protected]>
ipv6 mcast: use in6_dev_put in timer handlers instead of __in6_dev_put
Salam Noureddine <[email protected]>
ipv4 igmp: use in_dev_put in timer handlers instead of __in_dev_put
Neil Horman <[email protected]>
bonding: Fix broken promiscuity reference counting issue
Peter Korsgaard <[email protected]>
dm9601: fix IFF_ALLMULTI handling
Roger Luethi <[email protected]>
via-rhine: fix VLAN priority field (PCP, IEEE 802.1p)
Hannes Frederic Sowa <[email protected]>
ipv6: udp packets following an UFO enqueued packet need also be handled by UFO
Ansis Atteka <[email protected]>
ip: generate unique IP identificator if local fragmentation is allowed
Ansis Atteka <[email protected]>
ip: use ip_hdr() in __ip_make_skb() to retrieve IP header
Herbert Xu <[email protected]>
bridge: Clamp forward_delay when enabling STP
Chris Healy <[email protected]>
resubmit bridge: fix message_age_timer calculation
Daniel Borkmann <[email protected]>
net: sctp: fix ipv6 ipsec encryption bug in sctp_v6_xmit
Nikolay Aleksandrov <[email protected]>
netpoll: fix NULL pointer dereference in netpoll_cleanup
Eric Dumazet <[email protected]>
net: flow_dissector: fix thoff for IPPROTO_AH
Daniel Borkmann <[email protected]>
net: sctp: fix smatch warning in sctp_send_asconf_del_ip
Dave Jones <[email protected]>
caif: Add missing braces to multiline if in cfctrl_linkup_request
Claudiu Manoil <[email protected]>
gianfar: Change default HW Tx queue scheduling mode
Dan Carpenter <[email protected]>
cciss: fix info leak in cciss_ioctl32_passthru()
Dan Carpenter <[email protected]>
cpqarray: fix info leak in ida_locked_ioctl()
-------------
Diffstat:
Makefile | 4 +- arch/arm/mm/init.c | 3 ++ arch/ia64/mm/contig.c | 2 + arch/ia64/mm/discontig.c | 2 + arch/parisc/mm/init.c | 2 + arch/powerpc/kernel/iommu.c | 2 +- arch/powerpc/kernel/vio.c | 12 ++++-- arch/powerpc/lib/checksum_64.S | 58 +++++++++++++++++++++-------- arch/sparc/kernel/entry.S | 2 +- arch/sparc/kernel/ktlb.S | 3 +- arch/sparc/kernel/syscalls.S | 8 ++-- arch/sparc/kernel/trampoline_64.S | 2 - arch/sparc/lib/ksyms.c | 9 ----- arch/tile/include/asm/percpu.h | 34 +++++++++++++++-- arch/unicore32/mm/init.c | 3 ++ drivers/acpi/acpi_ipmi.c | 24 +++++++----- drivers/block/cciss.c | 1 + drivers/block/cpqarray.c | 1 + drivers/dma/imx-dma.c | 31 ++++++++------- drivers/infiniband/ulp/srpt/ib_srpt.c | 14 +++---- drivers/net/bonding/bond_main.c | 13 +++++-- drivers/net/ethernet/freescale/gianfar.c | 11 +++++- drivers/net/ethernet/freescale/gianfar.h | 11 +++++- drivers/net/ethernet/via/via-rhine.c | 9 ++++- drivers/net/ethernet/xilinx/ll_temac_main.c | 6 +++ drivers/net/ppp/pptp.c | 2 +- drivers/net/usb/dm9601.c | 2 +- drivers/net/wireless/p54/p54usb.c | 1 + drivers/net/wireless/rtlwifi/wifi.h | 2 +- drivers/scsi/esp_scsi.c | 14 ++++--- drivers/scsi/esp_scsi.h | 1 + drivers/staging/comedi/drivers/ni_65xx.c | 26 ++++++------- drivers/usb/serial/option.c | 3 ++ fs/btrfs/relocation.c | 14 +++---- fs/ext4/namei.c | 3 +- include/linux/mm.h | 3 +- include/net/ip.h | 12 ++++-- include/net/ipip.h | 2 +- kernel/kmod.c | 4 ++ lib/show_mem.c | 3 ++ mm/page_alloc.c | 7 ++++ net/bluetooth/hci_event.c | 6 ++- net/bridge/br_private.h | 1 + net/bridge/br_stp.c | 23 ++++++++---- net/bridge/br_stp_if.c | 12 +++++- net/caif/cfctrl.c | 3 +- net/core/flow_dissector.c | 4 +- net/core/netpoll.c | 9 ++--- net/ipv4/igmp.c | 8 ++-- net/ipv4/inetpeer.c | 4 +- net/ipv4/ip_output.c | 8 ++-- net/ipv4/ipmr.c | 2 +- net/ipv4/raw.c | 2 +- net/ipv4/xfrm4_mode_tunnel.c | 2 +- net/ipv6/ip6_output.c | 53 +++++++++++--------------- net/ipv6/mcast.c | 4 +- net/netfilter/ipvs/ip_vs_xmit.c | 2 +- net/sctp/ipv6.c | 42 +++++++-------------- net/sctp/socket.c | 3 ++ sound/soc/codecs/88pm860x-codec.c | 3 ++ sound/soc/codecs/max98095.c | 4 +- 61 files changed, 342 insertions(+), 219 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/48 cpqarray: fix info leak in ida_locked_ioctl()
3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 627aad1c01da6f881e7f98d71fd928ca0c316b1a upstream.
The pciinfo struct has a two byte hole after ->dev_fn so stack information could be leaked to the user.
This was assigned CVE-2013-2147.
--- drivers/block/cpqarray.c | 1 + 1 file changed, 1 insertion(+)
drivers/block/cpqarray.c +1 -0
@@ -1195,6 +1195,7 @@ out_passthru:ida_pci_info_struct pciinfo;if (!arg)return -EINVAL ; +memset (&pciinfo,0 ,sizeof (pciinfo)); pciinfo.bus = host->pci_dev->bus->number; pciinfo.dev_fn = host->pci_dev->devfn; pciinfo.board_id = host->board_id;
Greg Kroah-Hartman
maintainerPATCH 2/48 cciss: fix info leak in cciss_ioctl32_passthru()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 58f09e00ae095e46ef9edfcf3a5fd9ccdfad065e upstream.
The arg64 struct has a hole after ->buf_size which isn't cleared. Or if any of the calls to copy_from_user() fail then that would cause an information leak as well.
This was assigned CVE-2013-2147.
--- drivers/block/cciss.c | 1 + 1 file changed, 1 insertion(+)
drivers/block/cciss.c +1 -0
@@ -1186,6 +1186,7 @@ static int cciss_ioctl32_passthru(structint err;u32 cp; +memset (&arg64,0 ,sizeof (arg64)); err =0 ; err |= copy_from_user(&arg64.LUN_info, &arg32->LUN_info,
Greg Kroah-Hartman
maintainerPATCH 3/48 gianfar: Change default HW Tx queue scheduling mode
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Manoil <[email protected]>
commit b98b8babd6e3370fadb7c6eaacb00eb2f6344a6c upstream.
This is primarily to address transmission timeout occurrences, when multiple H/W Tx queues are being used concurrently. Because in the priority scheduling mode the controller does not service the Tx queues equally (but in ascending index order), Tx timeouts are being triggered rightaway for a basic test with multiple simultaneous connections like:
iperf -c <server_ip> -n 100M -P 8
resulting in kernel trace:
NETDEV WATCHDOG: eth1 (fsl-gianfar): transmit queue <X> timed out
------------[ cut here ]------------ WARNING: at net/sched/sch_generic.c:255
...
and controller reset during intense traffic, and possibly further complications.
This patch changes the default H/W Tx scheduling setting (TXSCHED) for multi-queue devices, from priority scheduling mode to a weighted round robin mode with equal weights for all H/W Tx queues, and addresses the issue above.
--- drivers/net/ethernet/freescale/gianfar.c | 11 ++++++++++- drivers/net/ethernet/freescale/gianfar.h | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-)
drivers/net/ethernet/freescale/gianfar.c +10 -1
@@ -394,7 +394,13 @@ static void gfar_init_mac(struct net_devif (ndev->features &NETIF_F_IP_CSUM ) tctrl |=TCTRL_INIT_CSUM ; - tctrl |=TCTRL_TXSCHED_PRIO ; +if (priv->prio_sched_en) + tctrl |=TCTRL_TXSCHED_PRIO ; +else { + tctrl |=TCTRL_TXSCHED_WRRS ; +gfar_write (®s->tr03wt,DEFAULT_WRRS_WEIGHT ); +gfar_write (®s->tr47wt,DEFAULT_WRRS_WEIGHT ); + }gfar_write (®s->tctrl, tctrl);
@@ -1153,6 +1159,9 @@ static int gfar_probe(struct platform_de priv->rx_filer_enable =1 ;/* Enable most messages by default */ priv->msg_enable = (NETIF_MSG_IFUP <<1 ) -1 ; +/* use pritority h/w tx queue scheduling for single queue devices */ +if (priv->num_tx_queues ==1 ) + priv->prio_sched_en =1 ;/* Carrier starts down, phylib will bring it up */ netif_carrier_off (dev);
drivers/net/ethernet/freescale/gianfar.h +10 -1
@@ -301,8 +301,16 @@ extern const char gfar_driver_version[];#define TCTRL_TFCPAUSE 0x00000008#define TCTRL_TXSCHED_MASK 0x00000006#define TCTRL_TXSCHED_INIT 0x00000000 +/* priority scheduling */ #define TCTRL_TXSCHED_PRIO 0x00000002 +/* weighted round-robin scheduling (WRRS) */ #define TCTRL_TXSCHED_WRRS 0x00000004 +/* default WRRS weight and policy setting, +* tailored to the tr03wt and tr47wt registers: +* equal weight for all Tx Qs, measured in 64byte units +*/ +#define DEFAULT_WRRS_WEIGHT 0x18181818 +#define TCTRL_INIT_CSUM (TCTRL_TUCSEN | TCTRL_IPCSEN)#define IEVENT_INIT_CLEAR 0xffffffff
@@ -1098,7 +1106,8 @@ struct gfar_private { extended_hash:1, bd_stash_en:1, rx_filer_enable:1, - wol_en:1; /* Wake-on-LAN enabled */ + wol_en:1, /* Wake-on-LAN enabled */ + prio_sched_en:1; /* Enable priorty based Tx scheduling in Hw */unsigned short padding;/* PHY stuff */
Greg Kroah-Hartman
maintainerPATCH 4/48 caif: Add missing braces to multiline if in cfctrl_linkup_request
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Jones <[email protected]>
[ Upstream commit 0c1db731bfcf3a9fd6c58132134f8b0f423552f0 ]
The indentation here implies this was meant to be a multi-line if.
Introduced several years back in commit c85c2951d4da1236e32f1858db418221e624aba5 ("caif: Handle dev_queue_xmit errors.")
--- net/caif/cfctrl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/caif/cfctrl.c +2 -1
@@ -288,9 +288,10 @@ int cfctrl_linkup_request(struct cflayer count =cfctrl_cancel_req (&cfctrl->serv.layer, user_layer); -if (count !=1 ) +if (count !=1 ) {pr_err ("Could not remove request (%d)" , count);return -ENODEV ; + } }return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 5/48 net: sctp: fix smatch warning in sctp_send_asconf_del_ip
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 88362ad8f9a6cea787420b57cc27ccacef000dbe ]
This was originally reported in [1] and posted by Neil Horman [2], he said:
Fix up a missed null pointer check in the asconf code. If we don't find a local address, but we pass in an address length of more than 1, we may dereference a NULL laddr pointer. Currently this can't happen, as the only users of the function pass in the value 1 as the addrcnt parameter, but its not hot path, and it doesn't hurt to check for NULL should that ever be the case.
The callpath from sctp_asconf_mgmt() looks okay. But this could be triggered from sctp_setsockopt_bindx() call with SCTP_BINDX_REM_ADDR and addrcnt > 1 while passing all possible addresses from the bind list to SCTP_BINDX_REM_ADDR so that we do *not* find a single address in the association's bind address list that is not in the packed array of addresses. If this happens when we have an established association with ASCONF-capable peers, then we could get a NULL pointer dereference as we only check for laddr == NULL && addrcnt == 1 and call later sctp_make_asconf_update_ip() with NULL laddr.
BUT: this actually won't happen as sctp_bindx_rem() will catch such a case and return with an error earlier. As this is incredably unintuitive and error prone, add a check to catch at least future bugs here. As Neil says, its not hot path. Introduced by 8a07eb0a5 ("sctp: Add ASCONF operation on the single-homed host").
[1] http://www.spinics.net/lists/linux-sctp/msg02132.html
[2] http://www.spinics.net/lists/linux-sctp/msg02133.html
--- net/sctp/socket.c | 3 +++ 1 file changed, 3 insertions(+)
net/sctp/socket.c +3 -0
@@ -814,6 +814,9 @@ static int sctp_send_asconf_del_ip(struc goto skip_mkasconf; } +if (laddr ==NULL ) +return -EINVAL ; +/* We do not need RCU protection throughout this loop * because this is done under a socket lock from the * setsockopt call.
Greg Kroah-Hartman
maintainerPATCH 6/48 net: flow_dissector: fix thoff for IPPROTO_AH
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit b86783587b3d1d552326d955acee37eac48800f1 ]
In commit 8ed781668dd49 ("flow_keys: include thoff into flow_keys for later usage"), we missed that existing code was using nhoff as a temporary variable that could not always contain transport header offset.
This is not a problem for TCP/UDP because port offset (@poff) is 0 for these protocols.
--- net/core/flow_dissector.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/core/flow_dissector.c +2 -2
@@ -133,8 +133,8 @@ ipv6:if (poff >=0 ) {__be32 *ports, _ports; - nhoff += poff; - ports =skb_header_pointer (skb, nhoff,sizeof (_ports), &_ports); + ports =skb_header_pointer (skb, nhoff + poff, +sizeof (_ports), &_ports);if (ports) flow->ports = *ports; }
Greg Kroah-Hartman
maintainerPATCH 7/48 netpoll: fix NULL pointer dereference in netpoll_cleanup
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikolay Aleksandrov <[email protected]>
[ Upstream commit d0fe8c888b1fd1a2f84b9962cabcb98a70988aec ]
I've been hitting a NULL ptr deref while using netconsole because the np->dev check and the pointer manipulation in netpoll_cleanup are done without rtnl and the following sequence happens when having a netconsole over a vlan and we remove the vlan while disabling the netconsole:
CPU 1 CPU2 removes vlan and calls the notifier enters store_enabled(), calls netdev_cleanup which checks np->dev and then waits for rtnl executes the netconsole netdev release notifier making np->dev == NULL and releases rtnl
continues to dereference a member ofnp->dev which at this point is == NULL
--- net/core/netpoll.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
net/core/netpoll.c +4 -5
@@ -920,15 +920,14 @@ EXPORT_SYMBOL_GPL(__netpoll_cleanup);void netpoll_cleanup (struct netpoll *np) { -if (!np->dev) -return ; -rtnl_lock (); +if (!np->dev) + goto out;__netpoll_cleanup (np); -rtnl_unlock (); -dev_put (np->dev); np->dev =NULL ; +out: +rtnl_unlock (); }EXPORT_SYMBOL (netpoll_cleanup);
Greg Kroah-Hartman
maintainerPATCH 8/48 net: sctp: fix ipv6 ipsec encryption bug in sctp_v6_xmit
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 95ee62083cb6453e056562d91f597552021e6ae7 ]
Alan Chester reported an issue with IPv6 on SCTP that IPsec traffic is not being encrypted, whereas on IPv4 it is. Setting up an AH + ESP transport does not seem to have the desired effect:
SCTP + IPv4:
22:14:20.809645 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto AH (51), length 116)
192.168.0.2 > 192.168.0.5: AH(spi=0x00000042,sumlen=16,seq=0x1): ESP(spi=0x00000044,seq=0x1), length 72
22:14:20.813270 IP (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto AH (51), length 340)
192.168.0.5 > 192.168.0.2: AH(spi=0x00000043,sumlen=16,seq=0x1):SCTP + IPv6:
22:31:19.215029 IP6 (class 0x02, hlim 64, next-header SCTP (132) payload length: 364)
fe80::222:15ff:fe87:7fc.3333 > fe80::92e6:baff:fe0d:5a54.36767: sctp
1) [INIT ACK] [init tag: 747759530] [rwnd: 62464] [OS: 10] [MIS: 10]
Moreover, Alan says:
This problem was seen with both Racoon and Racoon2. Other people have seen this with OpenSwan. When IPsec is configured to encrypt all upper layer protocols the SCTP connection does not initialize. After using Wireshark to follow packets, this is because the SCTP packet leaves Box A unencrypted and Box B believes all upper layer protocols are to be encrypted so it drops this packet, causing the SCTP connection to fail to initialize. When IPsec is configured to encrypt just SCTP, the SCTP packets are observed unencrypted.
In fact, using socat sctp6-listen:3333 - on one end and transferring "plaintext" string on the other end, results in cleartext on the wire where SCTP eventually does not report any errors, thus in the latter case that Alan reports, the non-paranoid user might think he's communicating over an encrypted transport on SCTP although he's not (tcpdump ... -X):
...
0x0030: 5d70 8e1a 0003 001a 177d eb6c 0000 0000 ]p.......}.l.... 0x0040: 0000 0000 706c 6169 6e74 6578 740a 0000 ....plaintext...
Only in /proc/net/xfrm_stat we can see XfrmInTmplMismatch increasing on the receiver side. Initial follow-up analysis from Alan's bug report was done by Alexey Dobriyan. Also thanks to Vlad Yasevich for feedback on this.
SCTP has its own implementation of sctp_v6_xmit() not calling inet6_csk_xmit(). This has the implication that it probably never really got updated along with changes in inet6_csk_xmit() and therefore does not seem to invoke xfrm handlers.
SCTP's IPv4 xmit however, properly calls ip_queue_xmit() to do the work. Since a call to inet6_csk_xmit() would solve this problem, but result in unecessary route lookups, let us just use the cached flowi6 instead that we got through sctp_v6_get_dst(). Since all SCTP packets are being sent through sctp_packet_transmit(), we do the route lookup / flow caching in sctp_transport_route(), hold it in tp->dst and skb_dst_set() right after that. If we would alter fl6->daddr in sctp_v6_xmit() to np->opt->srcrt, we possibly could run into the same effect of not having xfrm layer pick it up, hence, use fl6_update_dst() in sctp_v6_get_dst() instead to get the correct source routed dst entry, which we assign to the skb.
Also source address routing example from 625034113 ("sctp: fix sctp to work with ipv6 source address routing") still works with this patch! Nevertheless, in RFC5095 it is actually 'recommended' to not use that anyway due to traffic amplification [1]. So it seems we're not supposed to do that anyway in sctp_v6_xmit(). Moreover, if we overwrite the flow destination here, the lower IPv6 layer will be unable to put the correct destination address into IP header, as routing header is added in ipv6_push_nfrag_opts() but then probably with wrong final destination. Things aside, result of this patch is that we do not have any XfrmInTmplMismatch increase plus on the wire with this patch it now looks like:
SCTP + IPv6:
08:17:47.074080 IP6 2620:52:0:102f:7a2b:cbff:fe27:1b0a > 2620:52:0:102f:213:72ff:fe32:7eba:
AH(spi=0x00005fb4,seq=0x1): ESP(spi=0x00005fb5,seq=0x1), length 72
08:17:47.074264 IP6 2620:52:0:102f:213:72ff:fe32:7eba > 2620:52:0:102f:7a2b:cbff:fe27:1b0a:
AH(spi=0x00003d54,seq=0x1): ESP(spi=0x00003d55,seq=0x1), length 296This fixes Kernel Bugzilla 24412. This security issue seems to be present since 2.6.18 kernels. Lets just hope some big passive adversary in the wild didn't have its fun with that. lksctp-tools IPv6 regression test suite passes as well with this patch.
[1] http://www.secdev.org/conf/IPv6_RH_security-csw07.pdf
--- net/sctp/ipv6.c | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-)
net/sctp/ipv6.c +13 -29
@@ -205,45 +205,24 @@ out:in6_dev_put (idev); } -/* Based on tcp_v6_xmit() in tcp_ipv6.c. */ static int sctp_v6_xmit (struct sk_buff *skb,struct sctp_transport *transport) {struct sock *sk = skb->sk;struct ipv6_pinfo *np =inet6_sk (sk); -struct flowi6 fl6; - -memset (&fl6,0 ,sizeof (fl6)); - - fl6.flowi6_proto = sk->sk_protocol; - -/* Fill in the dest address from the route entry passed with the skb -* and the source address from the transport. -*/ - fl6.daddr = transport->ipaddr.v6.sin6_addr; - fl6.saddr = transport->saddr.v6.sin6_addr; - - fl6.flowlabel = np->flow_label; -IP6_ECN_flow_xmit (sk, fl6.flowlabel); -if (ipv6_addr_type (&fl6.saddr) &IPV6_ADDR_LINKLOCAL ) - fl6.flowi6_oif = transport->saddr.v6.sin6_scope_id; -else - fl6.flowi6_oif = sk->sk_bound_dev_if; - -if (np->opt && np->opt->srcrt) { -struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt; - fl6.daddr = *rt0->addr; - } +struct flowi6 *fl6 = &transport->fl.u.ip6;SCTP_DEBUG_PRINTK ("%s: skb:%p, len:%d, src:%pI6 dst:%pI6\n" , __func__, skb, skb->len, - &fl6.saddr, &fl6.daddr); + &fl6->saddr, &fl6->daddr); -SCTP_INC_STATS (SCTP_MIB_OUTSCTPPACKS ); +IP6_ECN_flow_xmit (sk, fl6->flowlabel);if (!(transport->param_flags &SPP_PMTUD_ENABLE )) skb->local_df =1 ; -return ip6_xmit (sk, skb, &fl6, np->opt, np->tclass); +SCTP_INC_STATS (SCTP_MIB_OUTSCTPPACKS ); + +return ip6_xmit (sk, skb, fl6, np->opt, np->tclass); }/* Returns the dst cache entry for the given source and destination ip
@@ -256,10 +235,12 @@ static void sctp_v6_get_dst(struct sctp_struct dst_entry *dst =NULL ;struct flowi6 *fl6 = &fl->u.ip6;struct sctp_bind_addr *bp; +struct ipv6_pinfo *np =inet6_sk (sk);struct sctp_sockaddr_entry *laddr;union sctp_addr *baddr =NULL ;union sctp_addr *daddr = &t->ipaddr;union sctp_addr dst_saddr; +struct in6_addr *final_p, final;__u8 matchlen =0 ;__u8 bmatchlen;sctp_scope_t scope;
@@ -282,7 +263,8 @@ static void sctp_v6_get_dst(struct sctp_SCTP_DEBUG_PRINTK ("SRC=%pI6 - " , &fl6->saddr); } - dst =ip6_dst_lookup_flow (sk, fl6,NULL , false); + final_p =fl6_update_dst (fl6, np->opt, &final); + dst =ip6_dst_lookup_flow (sk, fl6, final_p, false);if (!asoc || saddr) goto out;
@@ -333,10 +315,12 @@ static void sctp_v6_get_dst(struct sctp_ } }rcu_read_unlock (); +if (baddr) { fl6->saddr = baddr->v6.sin6_addr; fl6->fl6_sport = baddr->v6.sin6_port; - dst =ip6_dst_lookup_flow (sk, fl6,NULL , false); + final_p =fl6_update_dst (fl6, np->opt, &final); + dst =ip6_dst_lookup_flow (sk, fl6, final_p, false); } out:
Greg Kroah-Hartman
maintainerPATCH 9/48 resubmit bridge: fix message_age_timer calculation
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Healy <[email protected]>
[ Upstream commit 9a0620133ccce9dd35c00a96405c8d80938c2cc0 ]
This changes the message_age_timer calculation to use the BPDU's max age as opposed to the local bridge's max age. This is in accordance with section 8.6.2.3.2 Step 2 of the 802.1D-1998 sprecification.
With the current implementation, when running with very large bridge diameters, convergance will not always occur even if a root bridge is configured to have a longer max age.
Tested successfully on bridge diameters of ~200.
--- net/bridge/br_stp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bridge/br_stp.c +1 -1
@@ -189,7 +189,7 @@ static void br_record_config_information p->designated_age = jiffies - bpdu->message_age;mod_timer (&p->message_age_timer, jiffies - + (p->br->max_age - bpdu->message_age)); + + (bpdu->max_age - bpdu->message_age)); }/* called under bridge lock */
Greg Kroah-Hartman
maintainerPATCH 10/48 bridge: Clamp forward_delay when enabling STP
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
[ Upstream commit be4f154d5ef0ca147ab6bcd38857a774133f5450 ]
At some point limits were added to forward_delay. However, the limits are only enforced when STP is enabled. This created a scenario where you could have a value outside the allowed range while STP is disabled, which then stuck around even after STP is enabled.
This patch fixes this by clamping the value when we enable STP.
I had to move the locking around a bit to ensure that there is no window where someone could insert a value outside the range while we're in the middle of enabling STP.
--- net/bridge/br_private.h | 1 + net/bridge/br_stp.c | 21 +++++++++++++++------ net/bridge/br_stp_if.c | 12 ++++++++++-- 3 files changed, 26 insertions(+), 8 deletions(-)
net/bridge/br_private.h +1 -0
@@ -501,6 +501,7 @@ extern struct net_bridge_port *br_get_poextern void br_init_port (struct net_bridge_port *p);extern void br_become_designated_port (struct net_bridge_port *p); +extern void __br_set_forward_delay (struct net_bridge *br,unsigned long t);extern int br_set_forward_delay (struct net_bridge *br,unsigned long x);extern int br_set_hello_time (struct net_bridge *br,unsigned long x);extern int br_set_max_age (struct net_bridge *br,unsigned long x);
net/bridge/br_stp.c +15 -6
@@ -517,18 +517,27 @@ int br_set_max_age(struct net_bridge *br } +void __br_set_forward_delay (struct net_bridge *br,unsigned long t) +{ + br->bridge_forward_delay = t; +if (br_is_root_bridge (br)) + br->forward_delay = br->bridge_forward_delay; +} +int br_set_forward_delay (struct net_bridge *br,unsigned long val) {unsigned long t =clock_t_to_jiffies (val); +int err = -ERANGE ; +spin_lock_bh (&br->lock);if (br->stp_enabled !=BR_NO_STP && (t <BR_MIN_FORWARD_DELAY || t >BR_MAX_FORWARD_DELAY )) -return -ERANGE ; + goto unlock; -spin_lock_bh (&br->lock); - br->bridge_forward_delay = t; -if (br_is_root_bridge (br)) - br->forward_delay = br->bridge_forward_delay; +__br_set_forward_delay (br, t); + err =0 ; + +unlock:spin_unlock_bh (&br->lock); -return 0 ; +return err; }
net/bridge/br_stp_if.c +10 -2
@@ -129,6 +129,14 @@ static void br_stp_start(struct net_bridchar *envp[] = {NULL }; r =call_usermodehelper (BR_STP_PROG , argv, envp,UMH_WAIT_PROC ); + +spin_lock_bh (&br->lock); + +if (br->bridge_forward_delay <BR_MIN_FORWARD_DELAY ) +__br_set_forward_delay (br,BR_MIN_FORWARD_DELAY ); +else if (br->bridge_forward_delay <BR_MAX_FORWARD_DELAY ) +__br_set_forward_delay (br,BR_MAX_FORWARD_DELAY ); +if (r ==0 ) { br->stp_enabled =BR_USER_STP ;br_debug (br,"userspace STP started\n" );
@@ -137,10 +145,10 @@ static void br_stp_start(struct net_bridbr_debug (br,"using kernel STP\n" );/* To start timers on any ports left in blocking */ -spin_lock_bh (&br->lock);br_port_state_selection (br); -spin_unlock_bh (&br->lock); } + +spin_unlock_bh (&br->lock); }static void br_stp_stop (struct net_bridge *br)
Greg Kroah-Hartman
maintainerPATCH 11/48 ip: use ip_hdr() in __ip_make_skb() to retrieve IP header
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ansis Atteka <[email protected]>
[ Upstream commit 749154aa56b57652a282cbde57a57abc278d1205 ]
skb->data already points to IP header, but for the sake of consistency we can also use ip_hdr() to retrieve it.
--- net/ipv4/ip_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/ip_output.c +1 -1
@@ -1342,7 +1342,7 @@ struct sk_buff *__ip_make_skb(struct socelse ttl =ip_select_ttl (inet, &rt->dst); - iph = (struct iphdr *)skb->data; + iph =ip_hdr (skb); iph->version =4 ; iph->ihl =5 ; iph->tos = inet->tos;
Greg Kroah-Hartman
maintainerPATCH 12/48 ip: generate unique IP identificator if local fragmentation is allowed
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ansis Atteka <[email protected]>
[ Upstream commit 703133de331a7a7df47f31fb9de51dc6f68a9de8 ]
If local fragmentation is allowed, then ip_select_ident() and ip_select_ident_more() need to generate unique IDs to ensure correct defragmentation on the peer.
For example, if IPsec (tunnel mode) has to encrypt large skbs that have local_df bit set, then all IP fragments that belonged to different ESP datagrams would have used the same identificator. If one of these IP fragments would get lost or reordered, then peer could possibly stitch together wrong IP fragments that did not belong to the same datagram. This would lead to a packet loss or data corruption.
--- drivers/net/ppp/pptp.c | 2 +- include/net/ip.h | 12 ++++++++---- include/net/ipip.h | 2 +- net/ipv4/igmp.c | 4 ++-- net/ipv4/inetpeer.c | 4 ++-- net/ipv4/ip_output.c | 6 +++--- net/ipv4/ipmr.c | 2 +- net/ipv4/raw.c | 2 +- net/ipv4/xfrm4_mode_tunnel.c | 2 +- net/netfilter/ipvs/ip_vs_xmit.c | 2 +- 10 files changed, 21 insertions(+), 17 deletions(-)
drivers/net/ppp/pptp.c +1 -1
@@ -281,7 +281,7 @@ static int pptp_xmit(struct ppp_channelnf_reset (skb); skb->ip_summed =CHECKSUM_NONE ; -ip_select_ident (iph, &rt->dst,NULL ); +ip_select_ident (skb, &rt->dst,NULL );ip_send_check (iph);ip_local_out (skb);
include/net/ip.h +8 -4
@@ -266,9 +266,11 @@ int ip_dont_fragment(struct sock *sk, stextern void __ip_select_ident (struct iphdr *iph,struct dst_entry *dst,int more); -static inline void ip_select_ident (struct iphdr *iph,struct dst_entry *dst,struct sock *sk) +static inline void ip_select_ident (struct sk_buff *skb,struct dst_entry *dst,struct sock *sk) { -if (iph->frag_off &htons (IP_DF )) { +struct iphdr *iph =ip_hdr (skb); + +if ((iph->frag_off &htons (IP_DF )) && !skb->local_df) {/* This is only to work around buggy Windows95/2000 * VJ compression implementations. If the ID field * does not change, they drop every other packet in
@@ -280,9 +282,11 @@ static inline void ip_select_ident(struc__ip_select_ident (iph, dst,0 ); } -static inline void ip_select_ident_more (struct iphdr *iph,struct dst_entry *dst,struct sock *sk,int more) +static inline void ip_select_ident_more (struct sk_buff *skb,struct dst_entry *dst,struct sock *sk,int more) { -if (iph->frag_off &htons (IP_DF )) { +struct iphdr *iph =ip_hdr (skb); + +if ((iph->frag_off &htons (IP_DF )) && !skb->local_df) {if (sk &&inet_sk (sk)->inet_daddr) { iph->id =htons (inet_sk (sk)->inet_id);inet_sk (sk)->inet_id +=1 + more;
include/net/ipip.h +1 -1
@@ -50,7 +50,7 @@ struct ip_tunnel_prl_entry {int pkt_len = skb->len -skb_transport_offset (skb); \ \ skb->ip_summed =CHECKSUM_NONE ; \ -ip_select_ident (iph, &rt->dst,NULL ); \ +ip_select_ident (skb, &rt->dst,NULL ); \ \ err =ip_local_out (skb); \if (likely (net_xmit_eval (err) ==0 )) { \
net/ipv4/igmp.c +2 -2
@@ -343,7 +343,7 @@ static struct sk_buff *igmpv3_newpack(st pip->saddr = fl4.saddr; pip->protocol =IPPROTO_IGMP ; pip->tot_len =0 ;/* filled in later */ -ip_select_ident (pip, &rt->dst,NULL ); +ip_select_ident (skb, &rt->dst,NULL ); ((u8 *)&pip[1 ])[0 ] =IPOPT_RA ; ((u8 *)&pip[1 ])[1 ] =4 ; ((u8 *)&pip[1 ])[2 ] =0 ;
@@ -687,7 +687,7 @@ static int igmp_send_report(struct in_de iph->daddr = dst; iph->saddr = fl4.saddr; iph->protocol =IPPROTO_IGMP ; -ip_select_ident (iph, &rt->dst,NULL ); +ip_select_ident (skb, &rt->dst,NULL ); ((u8 *)&iph[1 ])[0 ] =IPOPT_RA ; ((u8 *)&iph[1 ])[1 ] =4 ; ((u8 *)&iph[1 ])[2 ] =0 ;
net/ipv4/inetpeer.c +2 -2
@@ -32,8 +32,8 @@* At the moment of writing this notes identifier of IP packets is generated * to be unpredictable using this code only for packets subjected * (actually or potentially) to defragmentation. I.e. DF packets less than -* PMTU in size uses a constant ID and do not use this code (see -* ip_select_ident() in include/net/ip.h). +* PMTU in size when local fragmentation is disabled use a constant ID and do +* not use this code (see ip_select_ident() in include/net/ip.h). * * Route cache entries hold references to our nodes. * New cache entries get references via lookup by destination IP address in
net/ipv4/ip_output.c +3 -3
@@ -161,7 +161,7 @@ int ip_build_and_send_pkt(struct sk_buff iph->daddr = (opt && opt->opt.srr ? opt->opt.faddr : daddr); iph->saddr = saddr; iph->protocol = sk->sk_protocol; -ip_select_ident (iph, &rt->dst, sk); +ip_select_ident (skb, &rt->dst, sk);if (opt && opt->opt.optlen) { iph->ihl += opt->opt.optlen>>2 ;
@@ -403,7 +403,7 @@ packet_routed:ip_options_build (skb, &inet_opt->opt, inet->inet_daddr, rt,0 ); } -ip_select_ident_more (iph, &rt->dst, sk, +ip_select_ident_more (skb, &rt->dst, sk, (skb_shinfo (skb)->gso_segs ?:1 ) -1 ); skb->priority = sk->sk_priority;
@@ -1347,7 +1347,7 @@ struct sk_buff *__ip_make_skb(struct soc iph->ihl =5 ; iph->tos = inet->tos; iph->frag_off = df; -ip_select_ident (iph, &rt->dst, sk); +ip_select_ident (skb, &rt->dst, sk); iph->ttl = ttl; iph->protocol = sk->sk_protocol;ip_copy_addrs (iph, fl4);
net/ipv4/ipmr.c +1 -1
@@ -1573,7 +1573,7 @@ static void ip_encap(struct sk_buff *skb iph->protocol =IPPROTO_IPIP ; iph->ihl =5 ; iph->tot_len =htons (skb->len); -ip_select_ident (iph,skb_dst (skb),NULL ); +ip_select_ident (skb,skb_dst (skb),NULL );ip_send_check (iph);memset (&(IPCB (skb)->opt),0 ,sizeof (IPCB (skb)->opt));
net/ipv4/raw.c +1 -1
@@ -384,7 +384,7 @@ static int raw_send_hdrinc(struct sock * iph->check =0 ; iph->tot_len =htons (length);if (!iph->id) -ip_select_ident (iph, &rt->dst,NULL ); +ip_select_ident (skb, &rt->dst,NULL ); iph->check =ip_fast_csum ((unsigned char *)iph, iph->ihl); }
net/ipv4/xfrm4_mode_tunnel.c +1 -1
@@ -54,7 +54,7 @@ static int xfrm4_mode_tunnel_output(stru top_iph->frag_off = (flags &XFRM_STATE_NOPMTUDISC ) ?0 : (XFRM_MODE_SKB_CB (skb)->frag_off &htons (IP_DF )); -ip_select_ident (top_iph, dst->child,NULL ); +ip_select_ident (skb, dst->child,NULL ); top_iph->ttl =ip4_dst_hoplimit (dst->child);
net/netfilter/ipvs/ip_vs_xmit.c +1 -1
@@ -853,7 +853,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, s iph->daddr = cp->daddr.ip; iph->saddr = saddr; iph->ttl = old_iph->ttl; -ip_select_ident (iph, &rt->dst,NULL ); +ip_select_ident (skb, &rt->dst,NULL );/* Another hack: avoid icmp_send in ip_fragment */ skb->local_df =1 ;
Greg Kroah-Hartman
maintainerPATCH 13/48 ipv6: udp packets following an UFO enqueued packet need also be handled by UFO
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hannes Frederic Sowa <[email protected]>
[ Upstream commit 2811ebac2521ceac84f2bdae402455baa6a7fb47 ]
In the following scenario the socket is corked:
If the first UDP packet is larger then the mtu we try to append it to the write queue via ip6_ufo_append_data. A following packet, which is smaller than the mtu would be appended to the already queued up gso-skb via plain ip6_append_data. This causes random memory corruptions.
In ip6_ufo_append_data we also have to be careful to not queue up the same skb multiple times. So setup the gso frame only when no first skb is available.
This also fixes a shortcoming where we add the current packet's length to cork->length but return early because of a packet > mtu with dontfrag set (instead of sutracting it again).
Found with trinity.
--- net/ipv6/ip6_output.c | 53 ++++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 31 deletions(-)
net/ipv6/ip6_output.c +22 -31
@@ -1128,6 +1128,8 @@ static inline int ip6_ufo_append_data(st* udp datagram */ if ((skb =skb_peek_tail (&sk->sk_write_queue)) ==NULL ) { +struct frag_hdr fhdr; + skb =sock_alloc_send_skb (sk, hh_len + fragheaderlen + transhdrlen +20 , (flags &MSG_DONTWAIT ), &err);
@@ -1148,12 +1150,6 @@ static inline int ip6_ufo_append_data(st skb->ip_summed =CHECKSUM_PARTIAL ; skb->csum =0 ; - } - - err =skb_append_datato_frags (sk,skb, getfrag, from, - (length - transhdrlen)); -if (!err) { -struct frag_hdr fhdr;/* Specify the length of each IPv6 datagram fragment. * It has to be a multiple of 8.
@@ -1164,15 +1160,10 @@ static inline int ip6_ufo_append_data(stipv6_select_ident (&fhdr, rt);skb_shinfo (skb)->ip6_frag_id = fhdr.identification;__skb_queue_tail (&sk->sk_write_queue, skb); - -return 0 ; } -/* There is not enough support do UPD LSO, -* so follow normal path -*/ -kfree_skb (skb); -return err; +return skb_append_datato_frags (sk, skb, getfrag, from, + (length - transhdrlen)); } static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src,
@@ -1345,27 +1336,27 @@ int ip6_append_data(struct sock *sk, int* --yoshfuji */ - cork->length += length; -if (length > mtu) { -int proto = sk->sk_protocol; -if (dontfrag && (proto ==IPPROTO_UDP || proto ==IPPROTO_RAW )){ -ipv6_local_rxpmtu (sk, fl6, mtu-exthdrlen); -return -EMSGSIZE ; - } - -if (proto ==IPPROTO_UDP && - (rt->dst.dev->features &NETIF_F_UFO )) { +if ((length > mtu) && dontfrag && (sk->sk_protocol ==IPPROTO_UDP || + sk->sk_protocol ==IPPROTO_RAW )) { +ipv6_local_rxpmtu (sk, fl6, mtu-exthdrlen); +return -EMSGSIZE ; + } - err =ip6_ufo_append_data (sk, getfrag, from, length, - hh_len, fragheaderlen, - transhdrlen, mtu, flags, rt); -if (err) - goto error; -return 0 ; - } + skb =skb_peek_tail (&sk->sk_write_queue); + cork->length += length; +if (((length > mtu) || + (skb &&skb_is_gso (skb))) && + (sk->sk_protocol ==IPPROTO_UDP ) && + (rt->dst.dev->features &NETIF_F_UFO )) { + err =ip6_ufo_append_data (sk, getfrag, from, length, + hh_len, fragheaderlen, + transhdrlen, mtu, flags, rt); +if (err) + goto error; +return 0 ; } -if ((skb =skb_peek_tail (&sk->sk_write_queue)) ==NULL ) +if (!skb) goto alloc_new_skb;while (length >0 ) {
Greg Kroah-Hartman
maintainerPATCH 14/48 via-rhine: fix VLAN priority field (PCP, IEEE 802.1p)
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roger Luethi <[email protected]>
[ Upstream commit 207070f5221e2a901d56a49df9cde47d9b716cd7 ]
Outgoing packets sent by via-rhine have their VLAN PCP field off by one (when hardware acceleration is enabled). The TX descriptor expects only VID and PCP (without a CFI/DEI bit).
Peter Boström noticed and reported the bug.
--- drivers/net/ethernet/via/via-rhine.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/ethernet/via/via-rhine.c +7 -2
@@ -32,7 +32,7 @@#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt#define DRV_NAME "via-rhine" -#define DRV_VERSION "1.5.0" +#define DRV_VERSION "1.5.1"#define DRV_RELDATE "2010-10-09"#include <linux/types.h>
@@ -1684,7 +1684,12 @@ static netdev_tx_t rhine_start_tx(structcpu_to_le32 (TXDESC | (skb->len >=ETH_ZLEN ? skb->len :ETH_ZLEN ));if (unlikely (vlan_tx_tag_present (skb))) { - rp->tx_ring[entry].tx_status =cpu_to_le32 ((vlan_tx_tag_get (skb)) <<16 ); +u16 vid_pcp =vlan_tx_tag_get (skb); + +/* drop CFI/DEI bit, register needs VID and PCP */ + vid_pcp = (vid_pcp &VLAN_VID_MASK ) | + ((vid_pcp &VLAN_PRIO_MASK ) >>1 ); + rp->tx_ring[entry].tx_status =cpu_to_le32 ((vid_pcp) <<16 );/* request tagging */ rp->tx_ring[entry].desc_length |=cpu_to_le32 (0x020000 ); }
Greg Kroah-Hartman
maintainerPATCH 15/48 dm9601: fix IFF_ALLMULTI handling
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Korsgaard <[email protected]>
[ Upstream commit bf0ea6380724beb64f27a722dfc4b0edabff816e ]
Pass-all-multicast is controlled by bit 3 in RX control, not bit 2 (pass undersized frames).
--- drivers/net/usb/dm9601.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/usb/dm9601.c +1 -1
@@ -384,7 +384,7 @@ static void dm9601_set_multicast(struct rx_ctl |=0x02 ; }else if (net->flags &IFF_ALLMULTI ||netdev_mc_count (net) >DM_MAX_MCAST ) { - rx_ctl |=0x04 ; + rx_ctl |=0x08 ; }else if (!netdev_mc_empty (net)) {struct netdev_hw_addr *ha;
Greg Kroah-Hartman
maintainerPATCH 16/48 bonding: Fix broken promiscuity reference counting issue
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Neil Horman <[email protected]>
[ Upstream commit 5a0068deb611109c5ba77358be533f763f395ee4 ]
Recently grabbed this report:
https://bugzilla.redhat.com/show_bug.cgi?id=1005567
Of an issue in which the bonding driver, with an attached vlan encountered the following errors when bond0 was taken down and back up:
dummy1: promiscuity touches roof, set promiscuity failed. promiscuity feature of device might be broken.
The error occurs because, during __bond_release_one, if we release our last slave, we take on a random mac address and issue a NETDEV_CHANGEADDR notification. With an attached vlan, the vlan may see that the vlan and bond mac address were in sync, but no longer are. This triggers a call to dev_uc_add and dev_set_rx_mode, which enables IFF_PROMISC on the bond device. Then, when we complete __bond_release_one, we use the current state of the bond flags to determine if we should decrement the promiscuity of the releasing slave. But since the bond changed promiscuity state during the release operation, we incorrectly decrement the slave promisc count when it wasn't in promiscuous mode to begin with, causing the above error
Fix is pretty simple, just cache the bonding flags at the start of the function and use those when determining the need to set promiscuity.
This is also needed for the ALLMULTI flag
--- drivers/net/bonding/bond_main.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/net/bonding/bond_main.c +10 -3
@@ -1933,6 +1933,7 @@ int bond_release(struct net_device *bondstruct bonding *bond =netdev_priv (bond_dev);struct slave *slave, *oldcurrent;struct sockaddr addr; +int old_flags = bond_dev->flags;netdev_features_t old_features = bond_dev->features;/* slave is not a slave or master is not master of this slave */
@@ -2066,12 +2067,18 @@ int bond_release(struct net_device *bond* already taken care of above when we detached the slave */ if (!USES_PRIMARY (bond->params.mode)) { -/* unset promiscuity level from slave */ -if (bond_dev->flags &IFF_PROMISC ) +/* unset promiscuity level from slave +* NOTE: The NETDEV_CHANGEADDR call above may change the value +* of the IFF_PROMISC flag in the bond_dev, but we need the +* value of that flag before that change, as that was the value +* when this slave was attached, so we cache at the start of the +* function and use it here. Same goes for ALLMULTI below +*/ +if (old_flags &IFF_PROMISC )dev_set_promiscuity (slave_dev,-1 );/* unset allmulti level from slave */ -if (bond_dev->flags &IFF_ALLMULTI ) +if (old_flags &IFF_ALLMULTI )dev_set_allmulti (slave_dev,-1 );/* flush master's mc_list from slave */
Greg Kroah-Hartman
maintainerPATCH 17/48 ipv4 igmp: use in_dev_put in timer handlers instead of __in_dev_put
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Salam Noureddine <[email protected]>
[ Upstream commit e2401654dd0f5f3fb7a8d80dad9554d73d7ca394 ]
It is possible for the timer handlers to run after the call to ip_mc_down so use in_dev_put instead of __in_dev_put in the handler function in order to do proper cleanup when the refcnt reaches 0. Otherwise, the refcnt can reach zero without the in_device being destroyed and we end up leaking a reference to the net_device and see messages like the following,
unregister_netdevice: waiting for eth0 to become free. Usage count = 1
Tested on linux-3.4.43.
--- net/ipv4/igmp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/igmp.c +2 -2
@@ -709,7 +709,7 @@ static void igmp_gq_timer_expire(unsigne in_dev->mr_gq_running =0 ;igmpv3_send_report (in_dev,NULL ); -__in_dev_put (in_dev); +in_dev_put (in_dev); }static void igmp_ifc_timer_expire (unsigned long data)
@@ -721,7 +721,7 @@ static void igmp_ifc_timer_expire(unsign in_dev->mr_ifc_count--;igmp_ifc_start_timer (in_dev, IGMP_Unsolicited_Report_Interval); } -__in_dev_put (in_dev); +in_dev_put (in_dev); }static void igmp_ifc_event (struct in_device *in_dev)
Greg Kroah-Hartman
maintainerPATCH 18/48 ipv6 mcast: use in6_dev_put in timer handlers instead of __in6_dev_put
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Salam Noureddine <[email protected]>
[ Upstream commit 9260d3e1013701aa814d10c8fc6a9f92bd17d643 ]
It is possible for the timer handlers to run after the call to ipv6_mc_down so use in6_dev_put instead of __in6_dev_put in the handler function in order to do proper cleanup when the refcnt reaches 0. Otherwise, the refcnt can reach zero without the inet6_dev being destroyed and we end up leaking a reference to the net_device and see messages like the following,
unregister_netdevice: waiting for eth0 to become free. Usage count = 1
Tested on linux-3.4.43.
--- net/ipv6/mcast.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv6/mcast.c +2 -2
@@ -2149,7 +2149,7 @@ static void mld_gq_timer_expire(unsigned idev->mc_gq_running =0 ;mld_send_report (idev,NULL ); -__in6_dev_put (idev); +in6_dev_put (idev); }static void mld_ifc_timer_expire (unsigned long data)
@@ -2162,7 +2162,7 @@ static void mld_ifc_timer_expire(unsigneif (idev->mc_ifc_count)mld_ifc_start_timer (idev, idev->mc_maxdelay); } -__in6_dev_put (idev); +in6_dev_put (idev); }static void mld_ifc_event (struct inet6_dev *idev)
Greg Kroah-Hartman
maintainerPATCH 19/48 ll_temac: Reset dma descriptors indexes on ndo_open
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ricardo Ribalda <[email protected]>
[ Upstream commit 7167cf0e8cd10287b7912b9ffcccd9616f382922 ]
The dma descriptors indexes are only initialized on the probe function.
If a packet is on the buffer when temac_stop is called, the dma descriptors indexes can be left on a incorrect state where no other package can be sent.
So an interface could be left in an usable state after ifdow/ifup.
This patch makes sure that the descriptors indexes are in a proper status when the device is open.
--- drivers/net/ethernet/xilinx/ll_temac_main.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/ethernet/xilinx/ll_temac_main.c +6 -0
@@ -308,6 +308,12 @@ static int temac_dma_bd_init(struct net_ lp->rx_bd_p + (sizeof(*lp->rx_bd_v) * (RX_BD_NUM - 1))); lp->dma_out (lp,TX_CURDESC_PTR , lp->tx_bd_p); +/* Init descriptor indexes */ + lp->tx_bd_ci =0 ; + lp->tx_bd_next =0 ; + lp->tx_bd_tail =0 ; + lp->rx_bd_ci =0 ; +return 0 ; out:
Greg Kroah-Hartman
maintainerPATCH 20/48 ASoC: max98095: a couple array underflows
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit f8d7b13e14357ed19d2ca2799539600418dc3939 upstream.
The ->put() function are called from snd_ctl_elem_write() with user supplied data. The limit checks here could underflow leading to a crash.
--- sound/soc/codecs/max98095.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/codecs/max98095.c +2 -2
@@ -1860,7 +1860,7 @@ static int max98095_put_eq_enum(struct sstruct max98095_pdata *pdata = max98095->pdata;int channel =max98095_get_eq_channel (kcontrol->id.name);struct max98095_cdata *cdata; -int sel = ucontrol->value.integer.value[0 ]; +unsigned int sel = ucontrol->value.integer.value[0 ];struct max98095_eq_cfg *coef_set;int fs, best, best_val, i;int regmask, regsave;
@@ -2013,7 +2013,7 @@ static int max98095_put_bq_enum(struct sstruct max98095_pdata *pdata = max98095->pdata;int channel =max98095_get_bq_channel (codec, kcontrol->id.name);struct max98095_cdata *cdata; -int sel = ucontrol->value.integer.value[0 ]; +unsigned int sel = ucontrol->value.integer.value[0 ];struct max98095_biquad_cfg *coef_set;int fs, best, best_val, i;int regmask, regsave;
Greg Kroah-Hartman
maintainerPATCH 21/48 ASoC: 88pm860x: array overflow in snd_soc_put_volsw_2r_st()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit d967967e8d1116fb38bad25e58714b5dddd03cca upstream.
This is called from snd_ctl_elem_write() with user supplied data so we need to add some bounds checking.
--- sound/soc/codecs/88pm860x-codec.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/codecs/88pm860x-codec.c +3 -0
@@ -351,6 +351,9 @@ static int snd_soc_put_volsw_2r_st(struc val = ucontrol->value.integer.value[0 ]; val2 = ucontrol->value.integer.value[1 ]; +if (val >=ARRAY_SIZE (st_table) || val2 >=ARRAY_SIZE (st_table)) +return -EINVAL ; + err =snd_soc_update_bits (codec, reg,0x3f , st_table[val].m);if (err <0 )return err;
Greg Kroah-Hartman
maintainerPATCH 22/48 powerpc/iommu: Use GFP_KERNEL instead of GFP_ATOMIC in iommu_init_table()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nishanth Aravamudan <[email protected]>
commit 1cf389df090194a0976dc867b7fffe99d9d490cb upstream.
Under heavy (DLPAR?) stress, we tripped this panic() in arch/powerpc/kernel/iommu.c::iommu_init_table():
page = alloc_pages_node(nid, GFP_ATOMIC, get_order(sz));
if (!page)
panic("iommu_init_table: Can't allocate %ld bytes\n", sz);Before the panic() we got a page allocation failure for an order-2 allocation. There appears to be memory free, but perhaps not in the ATOMIC context. I looked through all the call-sites of iommu_init_table() and didn't see any obvious reason to need an ATOMIC allocation. Most call-sites in fact have an explicit GFP_KERNEL allocation shortly before the call to iommu_init_table(), indicating we are not in an atomic context. There is some indirection for some paths, but I didn't see any locks indicating that GFP_KERNEL is inappropriate.
With this change under the same conditions, we have not been able to reproduce the panic.
--- arch/powerpc/kernel/iommu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kernel/iommu.c +1 -1
@@ -501,7 +501,7 @@ struct iommu_table *iommu_init_table(str/* number of bytes needed for the bitmap */ sz = (tbl->it_size +7 ) >>3 ; - page =alloc_pages_node (nid,GFP_ATOMIC ,get_order (sz)); + page =alloc_pages_node (nid,GFP_KERNEL ,get_order (sz));if (!page)panic ("iommu_init_table: Can't allocate %ld bytes\n" , sz); tbl->it_map =page_address (page);
Greg Kroah-Hartman
maintainerPATCH 23/48 powerpc/vio: Fix modalias_show return values
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Prarit Bhargava <[email protected]>
commit e82b89a6f19bae73fb064d1b3dd91fcefbb478f4 upstream.
modalias_show() should return an empty string on error, not -ENODEV.
This causes the following false and annoying error:
Quoted 1 line
find
/sys/devices-name modalias -print0 | xargs -0 cat >/dev/null
cat: /sys/devices/vio/4000/modalias: No such device
cat: /sys/devices/vio/4001/modalias: No such device
cat: /sys/devices/vio/4002/modalias: No such device
cat: /sys/devices/vio/4004/modalias: No such device
cat: /sys/devices/vio/modalias: No such device
--- arch/powerpc/kernel/vio.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
arch/powerpc/kernel/vio.c +8 -4
@@ -1341,11 +1341,15 @@ static ssize_t modalias_show(struct deviconst char *cp; dn = dev->of_node; -if (!dn) -return -ENODEV ; +if (!dn) { +strcat (buf,"\n" ); +return strlen (buf); + } cp =of_get_property (dn,"compatible" ,NULL ); -if (!cp) -return -ENODEV ; +if (!cp) { +strcat (buf,"\n" ); +return strlen (buf); + }return sprintf (buf,"vio:T%sS%s\n" , vio_dev->type, cp); }
Greg Kroah-Hartman
maintainerPATCH 24/48 powerpc: Fix parameter clobber in csum_partial_copy_generic()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Paul E. McKenney" <[email protected]>
commit d9813c3681a36774b254c0cdc9cce53c9e22c756 upstream.
The csum_partial_copy_generic() uses register r7 to adjust the remaining bytes to process. Unfortunately, r7 also holds a parameter, namely the address of the flag to set in case of access exceptions while reading the source buffer. Lacking a quantum implementation of PowerPC, this commit instead uses register r9 to do the adjusting, leaving r7's pointer uncorrupted.
--- arch/powerpc/lib/checksum_64.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/lib/checksum_64.S +2 -2
@@ -272,8 +272,8 @@ _GLOBAL(csum_partial_copy_generic) rldicl. r6,r3,64-1,64-2 /* r6 = (r3 & 0x3) >> 1 */ beq .Lcopy_aligned - li r7,4 - sub r6,r7,r6 + li r9,4 + sub r6,r9,r6 mtctr r6 1:
Greg Kroah-Hartman
maintainerPATCH 25/48 powerpc: Restore registers on error exit from csum_partial_copy_generic()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Paul E. McKenney" <[email protected]>
commit 8f21bd0090052e740944f9397e2be5ac7957ded7 upstream.
The csum_partial_copy_generic() function saves the PowerPC non-volatile r14, r15, and r16 registers for the main checksum-and-copy loop. Unfortunately, it fails to restore them upon error exit from this loop, which results in silent corruption of these registers in the presumably rare event of an access exception within that loop.
This commit therefore restores these register on error exit from the loop.
--- arch/powerpc/lib/checksum_64.S | 54 ++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 14 deletions(-)
arch/powerpc/lib/checksum_64.S +40 -14
@@ -229,19 +229,35 @@ _GLOBAL(csum_partial) blr - .macro source + .macro srcnr 100: .section __ex_table,"a" .align 3 - .llong 100b,.Lsrc_error + .llong 100b,.Lsrc_error_nr .previous .endm - .macro dest + .macro source +150: + .section __ex_table,"a" + .align 3 + .llong 150b,.Lsrc_error + .previous + .endm + + .macro dstnr 200: .section __ex_table,"a" .align 3 - .llong 200b,.Ldest_error + .llong 200b,.Ldest_error_nr + .previous + .endm + + .macro dest +250: + .section __ex_table,"a" + .align 3 + .llong 250b,.Ldest_error .previous .endm
@@ -277,11 +293,11 @@ _GLOBAL(csum_partial_copy_generic) mtctr r6 1: -source; lhz r6,0(r3) /* align to doubleword */ +srcnr; lhz r6,0(r3) /* align to doubleword */ subi r5,r5,2 addi r3,r3,2 adde r0,r0,r6 -dest; sth r6,0(r4) +dstnr; sth r6,0(r4) addi r4,r4,2 bdnz 1b
@@ -395,10 +411,10 @@ dest; std r16,56(r4) mtctr r6 3: -source; ld r6,0(r3) +srcnr; ld r6,0(r3) addi r3,r3,8 adde r0,r0,r6 -dest; std r6,0(r4) +dstnr; std r6,0(r4) addi r4,r4,8 bdnz 3b
@@ -408,10 +424,10 @@ dest; std r6,0(r4) srdi. r6,r5,2 beq .Lcopy_tail_halfword -source; lwz r6,0(r3) +srcnr; lwz r6,0(r3) addi r3,r3,4 adde r0,r0,r6 -dest; stw r6,0(r4) +dstnr; stw r6,0(r4) addi r4,r4,4 subi r5,r5,4
@@ -419,10 +435,10 @@ dest; stw r6,0(r4) srdi. r6,r5,1 beq .Lcopy_tail_byte -source; lhz r6,0(r3) +srcnr; lhz r6,0(r3) addi r3,r3,2 adde r0,r0,r6 -dest; sth r6,0(r4) +dstnr; sth r6,0(r4) addi r4,r4,2 subi r5,r5,2
@@ -430,10 +446,10 @@ dest; sth r6,0(r4) andi. r6,r5,1 beq .Lcopy_finish -source; lbz r6,0(r3) +srcnr; lbz r6,0(r3) sldi r9,r6,8 /* Pad the byte out to 16 bits */ adde r0,r0,r9 -dest; stb r6,0(r4) +dstnr; stb r6,0(r4) .Lcopy_finish: addze r0,r0 /* add in final carry */
@@ -443,6 +459,11 @@ dest; stb r6,0(r4) blr .Lsrc_error: + ld r14,STK_REG(R14)(r1) + ld r15,STK_REG(R15)(r1) + ld r16,STK_REG(R16)(r1) + addi r1,r1,STACKFRAMESIZE +.Lsrc_error_nr: cmpdi 0,r7,0 beqlr li r6,-EFAULT
@@ -450,6 +471,11 @@ dest; stb r6,0(r4) blr .Ldest_error: + ld r14,STK_REG(R14)(r1) + ld r15,STK_REG(R15)(r1) + ld r16,STK_REG(R16)(r1) + addi r1,r1,STACKFRAMESIZE +.Ldest_error_nr: cmpdi 0,r8,0 beqlr li r6,-EFAULT
Greg Kroah-Hartman
maintainerPATCH 26/48 Bluetooth: Fix security level for peripheral role
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andre Guedes <[email protected]>
commit f8776218e8546397be64ad2bc0ebf4748522d6e3 upstream.
While playing the peripheral role, the host gets a LE Long Term Key Request Event from the controller when a connection is established with a bonded device. The host then informs the LTK which should be used for the connection. Once the link is encrypted, the host gets an Encryption Change Event.
Therefore we should set conn->pending_sec_level instead of conn-> sec_level in hci_le_ltk_request_evt. This way, conn->sec_level is properly updated in hci_encrypt_change_evt.
Moreover, since we have a LTK associated to the device, we have at least BT_SECURITY_MEDIUM security level.
--- net/bluetooth/hci_event.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/bluetooth/hci_event.c +3 -1
@@ -3375,7 +3375,9 @@ static inline void hci_le_ltk_request_ev cp.handle =cpu_to_le16 (conn->handle);if (ltk->authenticated) - conn->sec_level =BT_SECURITY_HIGH ; + conn->pending_sec_level =BT_SECURITY_HIGH ; +else + conn->pending_sec_level =BT_SECURITY_MEDIUM ;hci_send_cmd (hdev,HCI_OP_LE_LTK_REPLY ,sizeof (cp), &cp);
Greg Kroah-Hartman
maintainerPATCH 27/48 Bluetooth: Fix encryption key size for peripheral role
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andre Guedes <[email protected]>
commit 89cbb4da0abee2f39d75f67f9fd57f7410c8b65c upstream.
This patch fixes the connection encryption key size information when the host is playing the peripheral role. We should set conn->enc_key_ size in hci_le_ltk_request_evt, otherwise it is left uninitialized.
--- net/bluetooth/hci_event.c | 2 ++ 1 file changed, 2 insertions(+)
net/bluetooth/hci_event.c +2 -0
@@ -3379,6 +3379,8 @@ static inline void hci_le_ltk_request_evelse conn->pending_sec_level =BT_SECURITY_MEDIUM ; + conn->enc_key_size = ltk->enc_size; +hci_send_cmd (hdev,HCI_OP_LE_LTK_REPLY ,sizeof (cp), &cp);if (ltk->type &HCI_SMP_STK ) {
Greg Kroah-Hartman
maintainerPATCH 28/48 esp_scsi: Fix tag state corruption when autosensing.
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 21af8107f27878813d0364733c0b08813c2c192a ]
Meelis Roos reports a crash in esp_free_lun_tag() in the presense of a disk which has died.
The issue is that when we issue an autosense command, we do so by hijacking the original command that caused the check-condition.
When we do so we clear out the ent->tag[] array when we issue it via find_and_prep_issuable_command(). This is so that the autosense command is forced to be issued non-tagged.
That is problematic, because it is the value of ent->tag[] which determines whether we issued the original scsi command as tagged vs. non-tagged (see esp_alloc_lun_tag()).
And that, in turn, is what trips up the sanity checks in esp_free_lun_tag(). That function needs the original ->tag[] values in order to free up the tag slot properly.
Fix this by remembering the original command's tag values, and having esp_alloc_lun_tag() and esp_free_lun_tag() use them.
--- drivers/scsi/esp_scsi.c | 14 ++++++++------ drivers/scsi/esp_scsi.h | 1 + 2 files changed, 9 insertions(+), 6 deletions(-)
drivers/scsi/esp_scsi.c +8 -6
@@ -530,7 +530,7 @@ static int esp_need_to_nego_sync(structstatic int esp_alloc_lun_tag (struct esp_cmd_entry *ent,struct esp_lun_data *lp) { -if (!ent->tag[0 ]) { +if (!ent->orig_tag[0 ]) {/* Non-tagged, slot already taken? */ if (lp->non_tagged_cmd)return -EBUSY ;
@@ -564,9 +564,9 @@ static int esp_alloc_lun_tag(struct esp_return -EBUSY ; } -BUG_ON (lp->tagged_cmds[ent->tag[1 ]]); +BUG_ON (lp->tagged_cmds[ent->orig_tag[1 ]]); - lp->tagged_cmds[ent->tag[1 ]] = ent; + lp->tagged_cmds[ent->orig_tag[1 ]] = ent; lp->num_tagged++;return 0 ;
@@ -575,9 +575,9 @@ static int esp_alloc_lun_tag(struct esp_static void esp_free_lun_tag (struct esp_cmd_entry *ent,struct esp_lun_data *lp) { -if (ent->tag[0 ]) { -BUG_ON (lp->tagged_cmds[ent->tag[1 ]] != ent); - lp->tagged_cmds[ent->tag[1 ]] =NULL ; +if (ent->orig_tag[0 ]) { +BUG_ON (lp->tagged_cmds[ent->orig_tag[1 ]] != ent); + lp->tagged_cmds[ent->orig_tag[1 ]] =NULL ; lp->num_tagged--; }else {BUG_ON (lp->non_tagged_cmd != ent);
@@ -667,6 +667,8 @@ static struct esp_cmd_entry *find_and_pr ent->tag[0 ] =0 ; ent->tag[1 ] =0 ; } + ent->orig_tag[0 ] = ent->tag[0 ]; + ent->orig_tag[1 ] = ent->tag[1 ];if (esp_alloc_lun_tag (ent, lp) <0 )continue ;
drivers/scsi/esp_scsi.h +1 -0
@@ -271,6 +271,7 @@ struct esp_cmd_entry {#define ESP_CMD_FLAG_AUTOSENSE 0x04/* Doing automatic REQUEST_SENSE */ u8 tag[2 ]; +u8 orig_tag[2 ];u8 status;u8 message;
Greg Kroah-Hartman
maintainerPATCH 29/48 sparc64: Fix ITLB handler of null page
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill Tkhai <[email protected]>
[ Upstream commit 1c2696cdaad84580545a2e9c0879ff597880b1a9 ]
1)Use kvmap_itlb_longpath instead of kvmap_dtlb_longpath.
2)Handle page #0 only, don't handle page #1: bleu -> blu
(KERNBASE is 0x400000, so #1 does not exist too. But everything
is possible in the future. Fix to not to have problems later.)
3)Remove unused kvmap_itlb_nonlinear.
--- arch/sparc/kernel/ktlb.S | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/sparc/kernel/ktlb.S +1 -2
@@ -25,11 +25,10 @@ kvmap_itlb: */ kvmap_itlb_4v: -kvmap_itlb_nonlinear: /* Catch kernel NULL pointer calls. */ sethi %hi(PAGE_SIZE), %g5 cmp %g4, %g5 - bleu,pn %xcc, kvmap_dtlb_longpath + blu,pn %xcc, kvmap_itlb_longpath nop KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_itlb_load)
Greg Kroah-Hartman
maintainerPATCH 30/48 sparc64: Remove RWSEM export leftovers
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill Tkhai <[email protected]>
[ Upstream commit 61d9b9355b0d427bd1e732bd54628ff9103e496f ]
The functions
__down_read __down_read_trylock __down_write __down_write_trylock __up_read __up_write __downgrade_write
are implemented inline, so remove corresponding EXPORT_SYMBOLs (They lead to compile errors on RT kernel).
--- arch/sparc/lib/ksyms.c | 9 --------- 1 file changed, 9 deletions(-)
arch/sparc/lib/ksyms.c +0 -9
@@ -125,15 +125,6 @@ EXPORT_SYMBOL(___copy_from_user);EXPORT_SYMBOL (___copy_in_user);EXPORT_SYMBOL (__clear_user); -/* RW semaphores */ -EXPORT_SYMBOL (__down_read); -EXPORT_SYMBOL (__down_read_trylock); -EXPORT_SYMBOL (__down_write); -EXPORT_SYMBOL (__down_write_trylock); -EXPORT_SYMBOL (__up_read); -EXPORT_SYMBOL (__up_write); -EXPORT_SYMBOL (__downgrade_write); -/* Atomic counter implementation. */ EXPORT_SYMBOL (atomic_add);EXPORT_SYMBOL (atomic_add_ret);
Greg Kroah-Hartman
maintainerPATCH 31/48 sparc64: Fix off by one in trampoline TLB mapping installation loop.
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 63d499662aeec1864ec36d042aca8184ea6a938e ]
--- arch/sparc/kernel/trampoline_64.S | 2 -- 1 file changed, 2 deletions(-)
arch/sparc/kernel/trampoline_64.S +0 -2
@@ -131,7 +131,6 @@ startup_continue: clr %l5 sethi %hi(num_kernel_image_mappings), %l6 lduw [%l6 + %lo(num_kernel_image_mappings)], %l6 - add %l6, 1, %l6 mov 15, %l7 BRANCH_IF_ANY_CHEETAH(g1,g5,2f)
@@ -224,7 +223,6 @@ niagara_lock_tlb: clr %l5 sethi %hi(num_kernel_image_mappings), %l6 lduw [%l6 + %lo(num_kernel_image_mappings)], %l6 - add %l6, 1, %l6 1: mov HV_FAST_MMU_MAP_PERM_ADDR, %o5
Greg Kroah-Hartman
maintainerPATCH 32/48 sparc64: Fix not SRAed %o5 in 32-bit traced syscall
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill Tkhai <[email protected]>
[ Upstream commit ab2abda6377723e0d5fbbfe5f5aa16a5523344d1 ]
(From v1 to v2: changed comment)
On the way linux_sparc_syscall32->linux_syscall_trace32->goto 2f, register %o5 doesn't clear its second 32-bit.
Fix that.
--- arch/sparc/kernel/syscalls.S | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/sparc/kernel/syscalls.S +4 -4
@@ -147,7 +147,7 @@ linux_syscall_trace32: srl %i4, 0, %o4 srl %i1, 0, %o1 srl %i2, 0, %o2 - ba,pt %xcc, 2f + ba,pt %xcc, 5f srl %i3, 0, %o3 linux_syscall_trace:
@@ -177,13 +177,13 @@ linux_sparc_syscall32: srl %i1, 0, %o1 ! IEU0 Group ldx [%g6 + TI_FLAGS], %l0 ! Load - srl %i5, 0, %o5 ! IEU1 + srl %i3, 0, %o3 ! IEU0 srl %i2, 0, %o2 ! IEU0 Group andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0 bne,pn %icc, linux_syscall_trace32 ! CTI mov %i0, %l5 ! IEU1 - call %l7 ! CTI Group brk forced - srl %i3, 0, %o3 ! IEU0 +5: call %l7 ! CTI Group brk forced + srl %i5, 0, %o5 ! IEU1 ba,a,pt %xcc, 3f /* Linux native system calls enter here... */
Greg Kroah-Hartman
maintainerPATCH 33/48 sparc32: Fix exit flag passed from traced sys_sigreturn
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill Tkhai <[email protected]>
[ Upstream commit 7a3b0f89e3fea680f93932691ca41a68eee7ab5e ]
Pass 1 in %o1 to indicate that syscall_trace accounts exit.
--- arch/sparc/kernel/entry.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/sparc/kernel/entry.S +1 -1
@@ -1177,7 +1177,7 @@ sys_sigreturn: nop call syscall_trace - nop + mov 1, %o1 1: /* We don't want to muck with user registers like a
Greg Kroah-Hartman
maintainerPATCH 34/48 kernel/kmod.c: check for NULL in call_usermodehelper_exec()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit 4c1c7be95c345cf2ad537a0c48e9aeadc7304527 upstream.
If /proc/sys/kernel/core_pattern contains only "|", a NULL pointer dereference happens upon core dump because argv_split("") returns argv[0] == NULL.
This bug was once fixed by commit 264b83c07a84 ("usermodehelper: check subprocess_info->path != NULL") but was by error reintroduced by commit 7f57cfa4e2aa ("usermodehelper: kill the sub_info->path[0] check").
This bug seems to exist since 2.6.19 (the version which core dump to pipe was added). Depending on kernel version and config, some side effect might happen immediately after this oops (e.g. kernel panic with 2.6.32-358.18.1.el6).
--- kernel/kmod.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/kmod.c +4 -0
@@ -540,6 +540,10 @@ int call_usermodehelper_exec(struct subpDECLARE_COMPLETION_ONSTACK (done);int retval =0 ; +if (!sub_info->path) { +call_usermodehelper_freeinfo (sub_info); +return -EINVAL ; + }helper_lock ();if (!sub_info->path) { retval = -EINVAL ;
Re: [ 34/48] kernel/kmod.c: check for NULL in call_usermodehelper_exec()
Quoted 1 line · Greg Kroah-Hartman
3.4-stable review patch. If anyone has any objections, please let me know.
3.4-stable doesn't need this patch because commit 264b83c07a84 ("usermodehelper: check subprocess_info->path != NULL") already fixed it.
Greg KH
maintainerRe: [ 34/48] kernel/kmod.c: check for NULL in call_usermodehelper_exec()
Quoted 5 lines · Tetsuo Handa
Quoted 1 line · Greg Kroah-Hartman
3.4-stable review patch. If anyone has any objections, please let me know.
3.4-stable doesn't need this patch because commit
264b83c07a84("usermodehelper: checksubprocess_info->path!= NULL") already fixed it.
Thanks for pointing this out for 3.0, 3.4, and 3.10, I totally got it wrong there, despite you telling me this before. I've now dropped it from those three kernels.
thanks again,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 35/48 USB: serial: option: Ignore card reader interface on Huawei E1750
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Malý <[email protected]>
commit eb2addd4044b4b2ce77693bde5bc810536dd96ee upstream.
Hi,
my Huawei 3G modem has an embedded Smart Card reader which causes trouble when the modem is being detected (a bunch of "<warn> (ttyUSBx):
open blocked by driver for more than 7 seconds!" in messages.log). This trivial patch corrects the problem for me. The modem identifies itself as "12d1:1406 Huawei Technologies Co., Ltd. E1750" in lsusb although the description on the body says "Model E173u-1"
--- drivers/usb/serial/option.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/option.c +3 -0
@@ -81,6 +81,7 @@ static void option_instat_callback(struc#define HUAWEI_VENDOR_ID 0x12D1#define HUAWEI_PRODUCT_E173 0x140C +#define HUAWEI_PRODUCT_E1750 0x1406#define HUAWEI_PRODUCT_K4505 0x1464#define HUAWEI_PRODUCT_K3765 0x1465#define HUAWEI_PRODUCT_K4605 0x14C6
@@ -581,6 +582,8 @@ static const struct usb_device_id option { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c23, USB_CLASS_COMM, 0x02, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1750, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t) &net_intf2_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1441, USB_CLASS_COMM, 0x02, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1442, USB_CLASS_COMM, 0x02, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff),
Greg Kroah-Hartman
maintainerPATCH 36/48 ib_srpt: Destroy cm_id before destroying QP.
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit 0b41d6ca616ddeb3b6c0a80e8770b6f53cd42806 upstream.
This patch fixes a bug where ib_destroy_cm_id() was incorrectly being called after srpt_destroy_ch_ib() had destroyed the active QP.
This would result in the following failed SRP_LOGIN_REQ messages:
Received SRP_LOGIN_REQ with i_port_id 0x0:0x2590ffff1762bd, t_port_id 0x2c903009f8f40:0x2c903009f8f40 and it_iu_len 260 on port 1 (guid=0xfe80000000000000:0x2c903009f8f41) Received SRP_LOGIN_REQ with i_port_id 0x0:0x2590ffff1758f9, t_port_id 0x2c903009f8f40:0x2c903009f8f40 and it_iu_len 260 on port 2 (guid=0xfe80000000000000:0x2c903009f8f42) Received SRP_LOGIN_REQ with i_port_id 0x0:0x2590ffff175941, t_port_id 0x2c903009f8f40:0x2c903009f8f40 and it_iu_len 260 on port 2 (guid=0xfe80000000000000:0x2c90300a3cfb2) Received SRP_LOGIN_REQ with i_port_id 0x0:0x2590ffff176299, t_port_id 0x2c903009f8f40:0x2c903009f8f40 and it_iu_len 260 on port 1 (guid=0xfe80000000000000:0x2c90300a3cfb1) mlx4_core 0000:84:00.0: command 0x19 failed: fw status = 0x9
rejected SRP_LOGIN_REQ because creating a new RDMA channel failed.
Received SRP_LOGIN_REQ with i_port_id 0x0:0x2590ffff176299, t_port_id 0x2c903009f8f40:0x2c903009f8f40 and it_iu_len 260 on port 1 (guid=0xfe80000000000000:0x2c90300a3cfb1) mlx4_core 0000:84:00.0: command 0x19 failed: fw status = 0x9
rejected SRP_LOGIN_REQ because creating a new RDMA channel failed.
Received SRP_LOGIN_REQ with i_port_id 0x0:0x2590ffff176299, t_port_id 0x2c903009f8f40:0x2c903009f8f40 and it_iu_len 260 on port 1 (guid=0xfe80000000000000:0x2c90300a3cfb1)
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +2 -2
@@ -2373,6 +2373,8 @@ static void srpt_release_channel_work(sttransport_deregister_session (ch->sess); ch->sess =NULL ; +ib_destroy_cm_id (ch->cm_id); +srpt_destroy_ch_ib (ch); srpt_free_ioctx_ring((struct srpt_ioctx **)ch->ioctx_ring,
@@ -2383,8 +2385,6 @@ static void srpt_release_channel_work(stlist_del (&ch->list);spin_unlock_irq (&sdev->spinlock); -ib_destroy_cm_id (ch->cm_id); -if (ch->release_done)complete (ch->release_done);
Greg Kroah-Hartman
maintainerPATCH 37/48 ib_srpt: always set response for task management
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jack Wang <[email protected]>
commit c807f64340932e19f0d2ac9b30c8381e1f60663a upstream.
The SRP specification requires:
"Response data shall be provided in any SRP_RSP response that is sent in
response to an SRP_TSK_MGMT request (see 6.7). The information in the RSP_CODE field (see table 24) shall indicate the completion status of the task management function."
So fix this to avoid the SRP initiator interprets task management functions that succeeded as failed.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +4 -6
@@ -1610,7 +1610,7 @@ static int srpt_build_tskmgmt_rsp(structint resp_data_len;int resp_len; - resp_data_len = (rsp_code ==SRP_TSK_MGMT_SUCCESS ) ?0 :4 ; + resp_data_len =4 ; resp_len =sizeof (*srp_rsp) + resp_data_len; srp_rsp = ioctx->ioctx.buf;
@@ -1622,11 +1622,9 @@ static int srpt_build_tskmgmt_rsp(struct + atomic_xchg(&ch->req_lim_delta, 0)); srp_rsp->tag = tag; -if (rsp_code !=SRP_TSK_MGMT_SUCCESS ) { - srp_rsp->flags |=SRP_RSP_FLAG_RSPVALID ; - srp_rsp->resp_data_len =cpu_to_be32 (resp_data_len); - srp_rsp->data[3 ] = rsp_code; - } + srp_rsp->flags |=SRP_RSP_FLAG_RSPVALID ; + srp_rsp->resp_data_len =cpu_to_be32 (resp_data_len); + srp_rsp->data[3 ] = rsp_code;return resp_len; }
Greg Kroah-Hartman
maintainerPATCH 38/48 rtlwifi: Align private space in rtl_priv struct
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit 60ce314d1750fef843e9db70050e09e49f838b69 upstream.
The private array at the end of the rtl_priv struct is not aligned. On ARM architecture, this causes an alignment trap and is fixed by aligning that array with __align(sizeof(void *)). That should properly align that space according to the requirements of all architectures.
--- drivers/net/wireless/rtlwifi/wifi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/rtlwifi/wifi.h +1 -1
@@ -1638,7 +1638,7 @@ struct rtl_priv {that it points to the data allocated beyond this structure like: rtl_pci_priv or rtl_usb_priv */ -u8 priv[0 ]; +u8 priv[0 ]__aligned(sizeof(void *)) ; };#define rtl_priv (hw) (((struct rtl_priv *)(hw)->priv))
Greg Kroah-Hartman
maintainerPATCH 39/48 p54usb: add USB ID for Corega WLUSB2GTST USB adapter
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Lamparter <[email protected]>
commit 1e43692cdb7cc445d6347d8a5207d9cef0c71434 upstream.
Added USB ID for Corega WLUSB2GTST USB adapter.
--- drivers/net/wireless/p54/p54usb.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/p54/p54usb.c +1 -0
@@ -83,6 +83,7 @@ static struct usb_device_id p54u_table[] {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */ {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */ {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */ + {USB_DEVICE(0x07aa, 0x0020)}, /* Corega WLUSB2GTST USB */ {USB_DEVICE(0x0803, 0x4310)}, /* Zoom 4410a */ {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */ {USB_DEVICE(0x083a, 0x4531)}, /* T-Com Sinus 154 data II */
Greg Kroah-Hartman
maintainerPATCH 40/48 dmaengine: imx-dma: fix lockdep issue between irqhandler and tasklet
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Grzeschik <[email protected]>
commit 5a276fa6bdf82fd442046969603968c83626ce0b upstream.
The tasklet and irqhandler are using spin_lock while other routines are using spin_lock_irqsave/restore. This leads to lockdep issues as described bellow. This patch is changing the code to use spinlock_irq_save/restore in both code pathes.
As imxdma_xfer_desc always gets called with spin_lock_irqsave lock held, this patch also removes the spare call inside the routine to avoid double locking.
[ 403.358162] =================================
[ 403.362549] [ INFO: inconsistent lock state ]
[ 403.366945] 3.10.0-20130823+ #904 Not tainted
[ 403.371331] ---------------------------------
[ 403.375721] inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage.
[ 403.381769] swapper/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
[ 403.386762] (&(&imxdma->lock)->rlock){?.-...}, at: [<c019d77c>] imxdma_tasklet+0x20/0x134
[ 403.395201] {IN-HARDIRQ-W} state was registered at:
[ 403.400108] [<c004b264>] mark_lock+0x2a0/0x6b4
[ 403.404798] [<c004d7c8>] __lock_acquire+0x650/0x1a64
[ 403.410004] [<c004f15c>] lock_acquire+0x94/0xa8
[ 403.414773] [<c02f74e4>] _raw_spin_lock+0x54/0x8c
[ 403.419720] [<c019d094>] dma_irq_handler+0x78/0x254
[ 403.424845] [<c0061124>] handle_irq_event_percpu+0x38/0x1b4
[ 403.430670] [<c00612e4>] handle_irq_event+0x44/0x64
[ 403.435789] [<c0063a70>] handle_level_irq+0xd8/0xf0
[ 403.440903] [<c0060a20>] generic_handle_irq+0x28/0x38
[ 403.446194] [<c0009cc4>] handle_IRQ+0x68/0x8c
[ 403.450789] [<c0008714>] avic_handle_irq+0x3c/0x48
[ 403.455811] [<c0008f84>] __irq_svc+0x44/0x74
[ 403.460314] [<c0040b04>] cpu_startup_entry+0x88/0xf4
[ 403.465525] [<c02f00d0>] rest_init+0xb8/0xe0
[ 403.470045] [<c03e07dc>] start_kernel+0x28c/0x2d4
[ 403.474986] [<a0008040>] 0xa0008040
[ 403.478709] irq event stamp: 50854
[ 403.482140] hardirqs last enabled at (50854): [<c001c6b8>] tasklet_action+0x38/0xdc
[ 403.489954] hardirqs last disabled at (50853): [<c001c6a0>] tasklet_action+0x20/0xdc
[ 403.497761] softirqs last enabled at (50850): [<c001bc64>] _local_bh_enable+0x14/0x18
[ 403.505741] softirqs last disabled at (50851): [<c001c268>] irq_exit+0x88/0xdc
[ 403.513026]
[ 403.513026] other info that might help us debug this:
[ 403.519593] Possible unsafe locking scenario:
[ 403.519593]
[ 403.525548] CPU0
[ 403.528020] ----
[ 403.530491] lock(&(&imxdma->lock)->rlock);
[ 403.534828] <Interrupt>
[ 403.537474] lock(&(&imxdma->lock)->rlock);
[ 403.541983]
[ 403.541983] *** DEADLOCK ***
[ 403.541983]
[ 403.547951] no locks held by swapper/0.
[ 403.551813]
[ 403.551813] stack backtrace:
[ 403.556222] CPU: 0 PID: 0 Comm: swapper Not tainted 3.10.0-20130823+ #904
[ 403.563039] Backtrace:
[ 403.565581] [<c000b98c>] (dump_backtrace+0x0/0x10c) from [<c000bb28>] (show_stack+0x18/0x1c)
[ 403.574054] r6:00000000 r5:c05c51d8 r4:c040bd58 r3:00200000
[ 403.579872] [<c000bb10>] (show_stack+0x0/0x1c) from [<c02f398c>] (dump_stack+0x20/0x28)
[ 403.587955] [<c02f396c>] (dump_stack+0x0/0x28) from [<c02f29c8>] (print_usage_bug.part.28+0x224/0x28c)
[ 403.597340] [<c02f27a4>] (print_usage_bug.part.28+0x0/0x28c) from [<c004b404>] (mark_lock+0x440/0x6b4)
[ 403.606682] r8:c004a41c r7:00000000 r6:c040bd58 r5:c040c040 r4:00000002
[ 403.613566] [<c004afc4>] (mark_lock+0x0/0x6b4) from [<c004d844>] (__lock_acquire+0x6cc/0x1a64)
[ 403.622244] [<c004d178>] (__lock_acquire+0x0/0x1a64) from [<c004f15c>] (lock_acquire+0x94/0xa8)
[ 403.631010] [<c004f0c8>] (lock_acquire+0x0/0xa8) from [<c02f74e4>] (_raw_spin_lock+0x54/0x8c)
[ 403.639614] [<c02f7490>] (_raw_spin_lock+0x0/0x8c) from [<c019d77c>] (imxdma_tasklet+0x20/0x134)
[ 403.648434] r6:c3847010 r5:c040e890 r4:c38470d4
[ 403.653194] [<c019d75c>] (imxdma_tasklet+0x0/0x134) from [<c001c70c>] (tasklet_action+0x8c/0xdc)
[ 403.662013] r8:c0599160 r7:00000000 r6:00000000 r5:c040e890 r4:c3847114 r3:c019d75c
[ 403.670042] [<c001c680>] (tasklet_action+0x0/0xdc) from [<c001bd4c>] (__do_softirq+0xe4/0x1f0)
[ 403.678687] r7:00000101 r6:c0402000 r5:c059919c r4:00000001
[ 403.684498] [<c001bc68>] (__do_softirq+0x0/0x1f0) from [<c001c268>] (irq_exit+0x88/0xdc)
[ 403.692652] [<c001c1e0>] (irq_exit+0x0/0xdc) from [<c0009cc8>] (handle_IRQ+0x6c/0x8c)
[ 403.700514] r4:00000030 r3:00000110
[ 403.704192] [<c0009c5c>] (handle_IRQ+0x0/0x8c) from [<c0008714>] (avic_handle_irq+0x3c/0x48)
[ 403.712664] r5:c0403f28 r4:c0593ebc
[ 403.716343] [<c00086d8>] (avic_handle_irq+0x0/0x48) from [<c0008f84>] (__irq_svc+0x44/0x74)
[ 403.724733] Exception stack(0xc0403f28 to 0xc0403f70)
[ 403.729841] 3f20: 00000001 00000004 00000000 20000013 c0402000 c04104a8
[ 403.738078] 3f40: 00000002 c0b69620 a0004000 41069264 a03fb5f4 c0403f7c c0403f40 c0403f70
[ 403.746301] 3f60: c004b92c c0009e74 20000013 ffffffff
[ 403.751383] r6:ffffffff r5:20000013 r4:c0009e74 r3:c004b92c
[ 403.757210] [<c0009e30>] (arch_cpu_idle+0x0/0x4c) from [<c0040b04>] (cpu_startup_entry+0x88/0xf4)
[ 403.766161] [<c0040a7c>] (cpu_startup_entry+0x0/0xf4) from [<c02f00d0>] (rest_init+0xb8/0xe0)
[ 403.774753] [<c02f0018>] (rest_init+0x0/0xe0) from [<c03e07dc>] (start_kernel+0x28c/0x2d4)
[ 403.783051] r6:c03fc484 r5:ffffffff r4:c040a0e0
[ 403.787797] [<c03e0550>] (start_kernel+0x0/0x2d4) from [<a0008040>] (0xa0008040)--- drivers/dma/imx-dma.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
drivers/dma/imx-dma.c +8 -11
@@ -373,17 +373,18 @@ static void dma_irq_handle_channel(strucstruct imxdma_engine *imxdma = imxdmac->imxdma;int chno = imxdmac->channel;struct imxdma_desc *desc; +unsigned long flags; -spin_lock (&imxdma->lock); +spin_lock_irqsave (&imxdma->lock, flags);if (list_empty (&imxdmac->ld_active)) { -spin_unlock (&imxdma->lock); +spin_unlock_irqrestore (&imxdma->lock, flags); goto out; } desc =list_first_entry (&imxdmac->ld_active, struct imxdma_desc, node); -spin_unlock (&imxdma->lock); +spin_unlock_irqrestore (&imxdma->lock, flags);if (desc->sg) {u32 tmp;
@@ -455,7 +456,6 @@ static int imxdma_xfer_desc(struct imxdm {struct imxdma_channel *imxdmac =to_imxdma_chan (d->desc.chan);struct imxdma_engine *imxdma = imxdmac->imxdma; -unsigned long flags;int slot =-1 ;int i;
@@ -463,7 +463,6 @@ static int imxdma_xfer_desc(struct imxdmswitch (d->type) {case IMXDMA_DESC_INTERLEAVED :/* Try to get a free 2D slot */ -spin_lock_irqsave (&imxdma->lock, flags);for (i =0 ; i <IMX_DMA_2D_SLOTS ; i++) { if ((imxdma->slots_2d[i].count > 0) && ((imxdma->slots_2d[i].xsr != d->x) ||
@@ -473,10 +472,8 @@ static int imxdma_xfer_desc(struct imxdm slot = i;break ; } -if (slot <0 ) { -spin_unlock_irqrestore (&imxdma->lock, flags); +if (slot <0 )return -EBUSY ; - } imxdma->slots_2d[slot].xsr = d->x; imxdma->slots_2d[slot].ysr = d->y;
@@ -485,7 +482,6 @@ static int imxdma_xfer_desc(struct imxdm imxdmac->slot_2d = slot; imxdmac->enabled_2d = true; -spin_unlock_irqrestore (&imxdma->lock, flags);if (slot ==IMX_DMA_2D_SLOT_A ) { d->config_mem &= ~CCR_MSEL_B ;
@@ -561,8 +557,9 @@ static void imxdma_tasklet(unsigned longstruct imxdma_channel *imxdmac = (void *)data;struct imxdma_engine *imxdma = imxdmac->imxdma;struct imxdma_desc *desc; +unsigned long flags; -spin_lock (&imxdma->lock); +spin_lock_irqsave (&imxdma->lock, flags);if (list_empty (&imxdmac->ld_active)) {/* Someone might have called terminate all */
@@ -599,7 +596,7 @@ static void imxdma_tasklet(unsigned long __func__, imxdmac->channel); } out: -spin_unlock (&imxdma->lock); +spin_unlock_irqrestore (&imxdma->lock, flags); } static int imxdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
Greg Kroah-Hartman
maintainerPATCH 41/48 dmaengine: imx-dma: fix callback path in tasklet
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Grzeschik <[email protected]>
commit fcaaba6c7136fe47e5a13352f99a64b019b6d2c5 upstream.
We need to free the ld_active list head before jumping into the callback routine. Otherwise the callback could run into issue_pending and change our ld_active list head we just going to free. This will run the channel list into an currupted and undefined state.
--- drivers/dma/imx-dma.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/dma/imx-dma.c +6 -4
@@ -563,13 +563,11 @@ static void imxdma_tasklet(unsigned longif (list_empty (&imxdmac->ld_active)) {/* Someone might have called terminate all */ - goto out; +spin_unlock_irqrestore (&imxdma->lock, flags); +return ; } desc = list_first_entry(&imxdmac->ld_active, struct imxdma_desc, node); -if (desc->desc.callback) - desc->desc.callback (desc->desc.callback_param); -/* If we are dealing with a cyclic descriptor keep it on ld_active * and dont mark the descripor as complete. * Only in non-cyclic cases it would be marked as complete
@@ -597,6 +595,10 @@ static void imxdma_tasklet(unsigned long } out:spin_unlock_irqrestore (&imxdma->lock, flags); + +if (desc->desc.callback) + desc->desc.callback (desc->desc.callback_param); + } static int imxdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
Greg Kroah-Hartman
maintainerPATCH 42/48 dmaengine: imx-dma: fix slow path issue in prep_dma_cyclic
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Grzeschik <[email protected]>
commit edc530fe7ee5a562680615d2e7cd205879c751a7 upstream.
When perparing cyclic_dma buffers by the sound layer, it will dump the following lockdep trace. The leading snd_pcm_action_single get called with read_lock_irq called. To fix this, we change the kcalloc call from GFP_KERNEL to GFP_ATOMIC.
WARNING: at kernel/lockdep.c:2740 lockdep_trace_alloc+0xcc/0x114() DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags)) Modules linked in: CPU: 0 PID: 832 Comm: aplay Not tainted 3.11.0-20130823+ #903 Backtrace: [<c000b98c>] (dump_backtrace+0x0/0x10c) from [<c000bb28>] (show_stack+0x18/0x1c) r6:c004c090 r5:00000009 r4:c2e0bd18 r3:00404000 [<c000bb10>] (show_stack+0x0/0x1c) from [<c02f397c>] (dump_stack+0x20/0x28) [<c02f395c>] (dump_stack+0x0/0x28) from [<c001531c>] (warn_slowpath_common+0x54/0x70) [<c00152c8>] (warn_slowpath_common+0x0/0x70) from [<c00153dc>] (warn_slowpath_fmt+0x38/0x40) r8:00004000 r7:a3b90000 r6:000080d0 r5:60000093 r4:c2e0a000 r3:00000009 [<c00153a4>] (warn_slowpath_fmt+0x0/0x40) from [<c004c090>] (lockdep_trace_alloc+0xcc/0x114) r3:c03955d8 r2:c03907db [<c004bfc4>] (lockdep_trace_alloc+0x0/0x114) from [<c008f16c>] (__kmalloc+0x34/0x118) r6:000080d0 r5:c3800120 r4:000080d0 r3:c040a0f8 [<c008f138>] (__kmalloc+0x0/0x118) from [<c019c95c>] (imxdma_prep_dma_cyclic+0x64/0x168) r7:a3b90000 r6:00000004 r5:c39d8420 r4:c3847150 [<c019c8f8>] (imxdma_prep_dma_cyclic+0x0/0x168) from [<c024618c>] (snd_dmaengine_pcm_trigger+0xa8/0x160) [<c02460e4>] (snd_dmaengine_pcm_trigger+0x0/0x160) from [<c0241fa8>] (soc_pcm_trigger+0x90/0xb4) r8:c058c7b0 r7:c3b8140c r6:c39da560 r5:00000001 r4:c3b81000 [<c0241f18>] (soc_pcm_trigger+0x0/0xb4) from [<c022ece4>] (snd_pcm_do_start+0x2c/0x38) r7:00000000 r6:00000003 r5:c058c7b0 r4:c3b81000 [<c022ecb8>] (snd_pcm_do_start+0x0/0x38) from [<c022e958>] (snd_pcm_action_single+0x40/0x6c) [<c022e918>] (snd_pcm_action_single+0x0/0x6c) from [<c022ea64>] (snd_pcm_action_lock_irq+0x7c/0x9c) r7:00000003 r6:c3b810f0 r5:c3b810f0 r4:c3b81000 [<c022e9e8>] (snd_pcm_action_lock_irq+0x0/0x9c) from [<c023009c>] (snd_pcm_common_ioctl1+0x7f8/0xfd0) r8:c3b7f888 r7:005407b8 r6:c2c991c0 r5:c3b81000 r4:c3b81000 r3:00004142 [<c022f8a4>] (snd_pcm_common_ioctl1+0x0/0xfd0) from [<c023117c>] (snd_pcm_playback_ioctl1+0x464/0x488) [<c0230d18>] (snd_pcm_playback_ioctl1+0x0/0x488) from [<c02311d4>] (snd_pcm_playback_ioctl+0x34/0x40) r8:c3b7f888 r7:00004142 r6:00000004 r5:c2c991c0 r4:005407b8 [<c02311a0>] (snd_pcm_playback_ioctl+0x0/0x40) from [<c00a14a4>] (vfs_ioctl+0x30/0x44) [<c00a1474>] (vfs_ioctl+0x0/0x44) from [<c00a1fe8>] (do_vfs_ioctl+0x55c/0x5c0) [<c00a1a8c>] (do_vfs_ioctl+0x0/0x5c0) from [<c00a208c>] (SyS_ioctl+0x40/0x68) [<c00a204c>] (SyS_ioctl+0x0/0x68) from [<c0009380>] (ret_fast_syscall+0x0/0x44) r8:c0009544 r7:00000036 r6:bedeaa58 r5:00000000 r4:000000c0
--- drivers/dma/imx-dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/imx-dma.c +1 -1
@@ -822,7 +822,7 @@ static struct dma_async_tx_descriptor *ikfree (imxdmac->sg_list); imxdmac->sg_list =kcalloc (periods +1 , -sizeof (struct scatterlist ),GFP_KERNEL ); +sizeof (struct scatterlist ),GFP_ATOMIC );if (!imxdmac->sg_list)return NULL ;
Greg Kroah-Hartman
maintainerPATCH 43/48 staging: comedi: ni_65xx: (bug fix) confine insn_bits to one subdevice
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Abbott <[email protected]>
commit 677a31565692d596ef42ea589b53ba289abf4713 upstream.
The insn_bits handler ni_65xx_dio_insn_bits() has a for loop that currently writes (optionally) and reads back up to 5 "ports" consisting of 8 channels each. It reads up to 32 1-bit channels but can only read and write a whole port at once - it needs to handle up to 5 ports as the first channel it reads might not be aligned on a port boundary. It breaks out of the loop early if the next port it handles is beyond the final port on the card. It also breaks out early on the 5th port in the loop if the first channel was aligned. Unfortunately, it doesn't check that the current port it is dealing with belongs to the comedi subdevice the insn_bits handler is acting on. That's a bug.
Redo the for loop to terminate after the final port belonging to the subdevice, changing the loop variable in the process to simplify things a bit. The for loop could now try and handle more than 5 ports if the subdevice has more than 40 channels, but the test if (bitshift >= 32) ensures it will break out early after 4 or 5 ports (depending on whether the first channel is aligned on a port boundary). (bitshift will be between -7 and 7 inclusive on the first iteration, increasing by 8 for each subsequent operation.)
--- drivers/staging/comedi/drivers/ni_65xx.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-)
drivers/staging/comedi/drivers/ni_65xx.c +11 -15
@@ -411,29 +411,25 @@ static int ni_65xx_dio_insn_bits(structstruct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { - unsigned base_bitfield_channel; -const unsigned max_ports_per_bitfield =5 ; + int base_bitfield_channel;unsigned read_bits =0 ; -unsigned j; +int last_port_offset =ni_65xx_port_by_channel (s->n_chan -1 ); +int port_offset; +if (insn->n !=2 )return -EINVAL ; base_bitfield_channel =CR_CHAN (insn->chanspec); -for (j =0 ; j < max_ports_per_bitfield; ++j) { -const unsigned port_offset = -ni_65xx_port_by_channel (base_bitfield_channel) + j; -const unsigned port = -sprivate (s)->base_port + port_offset; -unsigned base_port_channel; +for (port_offset =ni_65xx_port_by_channel (base_bitfield_channel); + port_offset <= last_port_offset; port_offset++) { +unsigned port =sprivate (s)->base_port + port_offset; +int base_port_channel = port_offset * ni_65xx_channels_per_port;unsigned port_mask, port_data, port_read_bits; -int bitshift; -if (port >=ni_65xx_total_num_ports (board (dev))) +int bitshift = base_port_channel - base_bitfield_channel; + +if (bitshift >=32 )break ; - base_port_channel = port_offset * ni_65xx_channels_per_port; port_mask = data[0 ]; port_data = data[1 ]; - bitshift = base_port_channel - base_bitfield_channel; -if (bitshift >=32 || bitshift <=-32 ) -break ;if (bitshift >0 ) { port_mask >>= bitshift; port_data >>= bitshift;
Greg Kroah-Hartman
maintainerPATCH 44/48 mm, show_mem: suppress page counts in non-blockable contexts
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Rientjes <[email protected]>
commit 4b59e6c4730978679b414a8da61514a2518da512 upstream.
On large systems with a lot of memory, walking all RAM to determine page types may take a half second or even more.
In non-blockable contexts, the page allocator will emit a page allocation failure warning unless __GFP_NOWARN is specified. In such contexts, irqs are typically disabled and such a lengthy delay may even result in NMI watchdog timeouts.
To fix this, suppress the page walk in such contexts when printing the page allocation failure warning.
--- arch/arm/mm/init.c | 3 +++ arch/ia64/mm/contig.c | 2 ++ arch/ia64/mm/discontig.c | 2 ++ arch/parisc/mm/init.c | 2 ++ arch/unicore32/mm/init.c | 3 +++ include/linux/mm.h | 3 ++- lib/show_mem.c | 3 +++ mm/page_alloc.c | 7 +++++++ 8 files changed, 24 insertions(+), 1 deletion(-)
arch/arm/mm/init.c +3 -0
@@ -98,6 +98,9 @@ void show_mem(unsigned int filter)printk ("Mem-info:\n" );show_free_areas (filter); +if (filter &SHOW_MEM_FILTER_PAGE_COUNT ) +return ; + for_each_bank (i, mi) {struct membank *bank = &mi->bank[i];unsigned int pfn1, pfn2;
arch/ia64/mm/contig.c +2 -0
@@ -47,6 +47,8 @@ void show_mem(unsigned int filter)printk (KERN_INFO "Mem-info:\n" );show_free_areas (filter);printk (KERN_INFO "Node memory in pages:\n" ); +if (filter &SHOW_MEM_FILTER_PAGE_COUNT ) +return ;for_each_online_pgdat (pgdat) {unsigned long present;unsigned long flags;
arch/ia64/mm/discontig.c +2 -0
@@ -623,6 +623,8 @@ void show_mem(unsigned int filter)printk (KERN_INFO "Mem-info:\n" );show_free_areas (filter); +if (filter &SHOW_MEM_FILTER_PAGE_COUNT ) +return ;printk (KERN_INFO "Node memory in pages:\n" );for_each_online_pgdat (pgdat) {unsigned long present;
arch/parisc/mm/init.c +2 -0
@@ -685,6 +685,8 @@ void show_mem(unsigned int filter)printk (KERN_INFO "Mem-info:\n" );show_free_areas (filter); +if (filter &SHOW_MEM_FILTER_PAGE_COUNT ) +return ;#ifndef CONFIG_DISCONTIGMEM i = max_mapnr;while (i-- >0 ) {
arch/unicore32/mm/init.c +3 -0
@@ -66,6 +66,9 @@ void show_mem(unsigned int filter)printk (KERN_DEFAULT "Mem-info:\n" );show_free_areas (filter); +if (filter &SHOW_MEM_FILTER_PAGE_COUNT ) +return ; +for_each_bank (i, mi) {struct membank *bank = &mi->bank[i];unsigned int pfn1, pfn2;
include/linux/mm.h +2 -1
@@ -866,7 +866,8 @@ extern void pagefault_out_of_memory(void* Flags passed to show_mem() and show_free_areas() to suppress output in * various contexts. */ -#define SHOW_MEM_FILTER_NODES (0x0001u)/* filter disallowed nodes */ +#define SHOW_MEM_FILTER_NODES (0x0001u)/* disallowed nodes */ +#define SHOW_MEM_FILTER_PAGE_COUNT (0x0002u)/* page type count */ extern void show_free_areas (unsigned int flags);extern bool skip_free_areas_node (unsigned int flags,int nid);
lib/show_mem.c +3 -0
@@ -18,6 +18,9 @@ void show_mem(unsigned int filter)printk ("Mem-Info:\n" );show_free_areas (filter); +if (filter &SHOW_MEM_FILTER_PAGE_COUNT ) +return ; +for_each_online_pgdat (pgdat) {unsigned long i, flags;
mm/page_alloc.c +7 -0
@@ -1885,6 +1885,13 @@ void warn_alloc_failed(gfp_t gfp_mask, ireturn ;/* +* Walking all memory to count page types is very expensive and should +* be inhibited in non-blockable contexts. +*/ +if (!(gfp_mask & __GFP_WAIT)) + filter |=SHOW_MEM_FILTER_PAGE_COUNT ; + +/* * This documents exceptions given to allocations in certain * contexts that are allowed to allocate outside current's set * of allowed nodes.
Greg Kroah-Hartman
maintainerPATCH 45/48 ACPI / IPMI: Fix atomic context requirement of ipmi_msg_handler()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lv Zheng <[email protected]>
commit 06a8566bcf5cf7db9843a82cde7a33c7bf3947d9 upstream.
This patch fixes the issues indicated by the test results that ipmi_msg_handler() is invoked in atomic context.
BUG: scheduling while atomic: kipmi0/18933/0x10000100 Modules linked in: ipmi_si acpi_ipmi ... CPU: 3 PID: 18933 Comm: kipmi0 Tainted: G AW 3.10.0-rc7+ #2 Hardware name: QCI QSSC-S4R/QSSC-S4R, BIOS QSSC-S4R.QCI.01.00.0027.070120100606 07/01/2010 ffff8838245eea00 ffff88103fc63c98 ffffffff814c4a1e ffff88103fc63ca8 ffffffff814bfbab ffff88103fc63d28 ffffffff814c73e0 ffff88103933cbd4 0000000000000096 ffff88103fc63ce8 ffff88102f618000 ffff881035c01fd8 Call Trace: <IRQ> [<ffffffff814c4a1e>] dump_stack+0x19/0x1b [<ffffffff814bfbab>] __schedule_bug+0x46/0x54 [<ffffffff814c73e0>] __schedule+0x83/0x59c [<ffffffff81058853>] __cond_resched+0x22/0x2d [<ffffffff814c794b>] _cond_resched+0x14/0x1d [<ffffffff814c6d82>] mutex_lock+0x11/0x32 [<ffffffff8101e1e9>] ? __default_send_IPI_dest_field.constprop.0+0x53/0x58 [<ffffffffa09e3f9c>] ipmi_msg_handler+0x23/0x166 [ipmi_si] [<ffffffff812bf6e4>] deliver_response+0x55/0x5a [<ffffffff812c0fd4>] handle_new_recv_msgs+0xb67/0xc65 [<ffffffff81007ad1>] ? read_tsc+0x9/0x19 [<ffffffff814c8620>] ? _raw_spin_lock_irq+0xa/0xc [<ffffffffa09e1128>] ipmi_thread+0x5c/0x146 [ipmi_si] ...
Also Tony Camuso says:
We were getting occasional "Scheduling while atomic" call traces during boot on some systems. Problem was first seen on a Cisco C210 but we were able to reproduce it on a Cisco c220m3. Setting CONFIG_LOCKDEP and LOCKDEP_SUPPORT to 'y' exposed a lockdep around tx_msg_lock in acpi_ipmi.c struct acpi_ipmi_device.
=================================
[ INFO: inconsistent lock state ]
2.6.32-415.el6.x86_64-debug-splck #1
---------------------------------
inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
ksoftirqd/3/17 [HC0[0]:SC1[1]:HE1:SE0] takes:
(&ipmi_device->tx_msg_lock){+.?...}, at: [<ffffffff81337a27>] ipmi_msg_handler+0x71/0x126
{SOFTIRQ-ON-W} state was registered at:
[<ffffffff810ba11c>] __lock_acquire+0x63c/0x1570 [<ffffffff810bb0f4>] lock_acquire+0xa4/0x120 [<ffffffff815581cc>] __mutex_lock_common+0x4c/0x400 [<ffffffff815586ea>] mutex_lock_nested+0x4a/0x60 [<ffffffff8133789d>] acpi_ipmi_space_handler+0x11b/0x234 [<ffffffff81321c62>] acpi_ev_address_space_dispatch+0x170/0x1be
The fix implemented by this change has been tested by Tony:
Tested the patch in a boot loop with lockdep debug enabled and never saw the problem in over 400 reboots.
--- drivers/acpi/acpi_ipmi.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-)
drivers/acpi/acpi_ipmi.c +14 -10
@@ -39,6 +39,7 @@#include <linux/ipmi.h> #include <linux/device.h> #include <linux/pnp.h> +#include <linux/spinlock.h> MODULE_AUTHOR ("Zhao Yakui" );MODULE_DESCRIPTION ("ACPI IPMI Opregion driver" );
@@ -57,7 +58,7 @@ struct acpi_ipmi_device {struct list_head head;/* the IPMI request message list */ struct list_head tx_msg_list; -struct mutex tx_msg_lock; +spinlock_t tx_msg_lock;acpi_handle handle;struct pnp_dev *pnp_dev;ipmi_user_t user_interface;
@@ -147,6 +148,7 @@ static void acpi_format_ipmi_msg(structstruct kernel_ipmi_msg *msg;struct acpi_ipmi_buffer *buffer;struct acpi_ipmi_device *device; +unsigned long flags; msg = &tx_msg->tx_message;/*
@@ -177,10 +179,10 @@ static void acpi_format_ipmi_msg(struct/* Get the msgid */ device = tx_msg->device; -mutex_lock (&device->tx_msg_lock); +spin_lock_irqsave (&device->tx_msg_lock, flags); device->curr_msgid++; tx_msg->tx_msgid = device->curr_msgid; -mutex_unlock (&device->tx_msg_lock); +spin_unlock_irqrestore (&device->tx_msg_lock, flags); } static void acpi_format_ipmi_response(struct acpi_ipmi_msg *msg,
@@ -242,6 +244,7 @@ static void ipmi_msg_handler(struct ipmiint msg_found =0 ;struct acpi_ipmi_msg *tx_msg;struct pnp_dev *pnp_dev = ipmi_device->pnp_dev; +unsigned long flags;if (msg->user != ipmi_device->user_interface) { dev_warn(&pnp_dev->dev, "Unexpected response is returned. "
@@ -250,7 +253,7 @@ static void ipmi_msg_handler(struct ipmiipmi_free_recv_msg (msg);return ; } -mutex_lock (&ipmi_device->tx_msg_lock); +spin_lock_irqsave (&ipmi_device->tx_msg_lock, flags);list_for_each_entry (tx_msg, &ipmi_device->tx_msg_list, head) {if (msg->msgid == tx_msg->tx_msgid) { msg_found =1 ;
@@ -258,7 +261,7 @@ static void ipmi_msg_handler(struct ipmi } } -mutex_unlock (&ipmi_device->tx_msg_lock); +spin_unlock_irqrestore (&ipmi_device->tx_msg_lock, flags);if (!msg_found) {dev_warn (&pnp_dev->dev,"Unexpected response (msg id %ld) is " "returned.\n" , msg->msgid);
@@ -378,6 +381,7 @@ acpi_ipmi_space_handler(u32 function, acstruct acpi_ipmi_device *ipmi_device = handler_context;int err, rem_time;acpi_status status; +unsigned long flags;/* * IPMI opregion message. * IPMI message is firstly written to the BMC and system software
@@ -395,9 +399,9 @@ acpi_ipmi_space_handler(u32 function, acreturn AE_NO_MEMORY ;acpi_format_ipmi_msg (tx_msg, address, value); -mutex_lock (&ipmi_device->tx_msg_lock); +spin_lock_irqsave (&ipmi_device->tx_msg_lock, flags);list_add_tail (&tx_msg->head, &ipmi_device->tx_msg_list); -mutex_unlock (&ipmi_device->tx_msg_lock); +spin_unlock_irqrestore (&ipmi_device->tx_msg_lock, flags); err = ipmi_request_settime(ipmi_device->user_interface, &tx_msg->addr, tx_msg->tx_msgid,
@@ -413,9 +417,9 @@ acpi_ipmi_space_handler(u32 function, ac status =AE_OK ; end_label: -mutex_lock (&ipmi_device->tx_msg_lock); +spin_lock_irqsave (&ipmi_device->tx_msg_lock, flags);list_del (&tx_msg->head); -mutex_unlock (&ipmi_device->tx_msg_lock); +spin_unlock_irqrestore (&ipmi_device->tx_msg_lock, flags);kfree (tx_msg);return status; }
@@ -457,7 +461,7 @@ static void acpi_add_ipmi_device(structINIT_LIST_HEAD (&ipmi_device->head); -mutex_init (&ipmi_device->tx_msg_lock); +spin_lock_init (&ipmi_device->tx_msg_lock);INIT_LIST_HEAD (&ipmi_device->tx_msg_list);ipmi_install_space_handler (ipmi_device);
Greg Kroah-Hartman
maintainerPATCH 46/48 tile: use a more conservative __my_cpu_offset in CONFIG_PREEMPT
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Metcalf <[email protected]>
commit f862eefec0b68e099a9fa58d3761ffb10bad97e1 upstream.
It turns out the kernel relies on barrier() to force a reload of the percpu offset value. Since we can't easily modify the definition of barrier() to include "tp" as an output register, we instead provide a definition of __my_cpu_offset as extended assembly that includes a fake stack read to hazard against barrier(), forcing gcc to know that it must reread "tp" and recompute anything based on "tp" after a barrier.
This fixes observed hangs in the slub allocator when we are looping on a percpu cmpxchg_double.
A similar fix for ARMv7 was made in June in change 509eb76ebf97.
--- arch/tile/include/asm/percpu.h | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-)
arch/tile/include/asm/percpu.h +31 -3
@@ -15,9 +15,37 @@#ifndef _ASM_TILE_PERCPU_H#define _ASM_TILE_PERCPU_H -registerunsigned long __my_cpu_offset __asm__("tp" ); -#define __my_cpu_offset __my_cpu_offset -#define set_my_cpu_offset (tp) (__my_cpu_offset = (tp)) +registerunsigned long my_cpu_offset_reg asm("tp" ); + +#ifdef CONFIG_PREEMPT +/* +* For full preemption, we can't just use the register variable +* directly, since we need barrier() to hazard against it, causing the +* compiler to reload anything computed from a previous "tp" value. +* But we also don't want to use volatile asm, since we'd like the +* compiler to be able to cache the value across multiple percpu reads. +* So we use a fake stack read as a hazard against barrier(). +* The 'U' constraint is like 'm' but disallows postincrement. +*/ +static inline unsigned long __my_cpu_offset (void ) +{ +unsigned long tp; + registerunsigned long *sp asm("sp" ); + asm("move %0, tp" :"=r" (tp) :"U" (*sp)); +return tp; +} +#define __my_cpu_offset __my_cpu_offset() +#else +/* +* We don't need to hazard against barrier() since "tp" doesn't ever +* change with PREEMPT_NONE, and with PREEMPT_VOLUNTARY it only +* changes at function call points, at which we are already re-reading +* the value of "tp" due to "my_cpu_offset_reg" being a global variable. +*/ +#define __my_cpu_offset my_cpu_offset_reg +#endif + +#define set_my_cpu_offset (tp) (my_cpu_offset_reg = (tp))#include <asm-generic/percpu.h>
Greg Kroah-Hartman
maintainerPATCH 47/48 Btrfs: change how we queue blocks for backref checking
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josef Bacik <[email protected]>
commit b6c60c8018c4e9beb2f83fc82c09f9d033766571 upstream.
Previously we only added blocks to the list to have their backrefs checked if the level of the block is right above the one we are searching for. This is because we want to make sure we don't add the entire path up to the root to the lists to make sure we process things one at a time. This assumes that if any blocks in the path to the root are going to be not checked (shared in other words) then they will be in the level right above the current block on up. This isn't quite right though since we can have blocks higher up the list that are shared because they are attached to a reloc root. But we won't add this block to be checked and then later on we will BUG_ON(!upper->checked). So instead keep track of wether or not we've queued a block to be checked in this current search, and if we haven't go ahead and queue it to be checked. This patch fixed the panic I was seeing where we BUG_ON(!upper->checked). Thanks,
--- fs/btrfs/relocation.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
fs/btrfs/relocation.c +7 -7
@@ -684,6 +684,7 @@ struct backref_node *build_backref_tree(int cowonly;int ret;int err =0 ; +bool need_check = true; path1 =btrfs_alloc_path (); path2 =btrfs_alloc_path ();
@@ -906,6 +907,7 @@ again: cur->bytenr); lower = cur; + need_check = true;for (; level <BTRFS_MAX_LEVEL ; level++) {if (!path2->nodes[level]) { BUG_ON(btrfs_root_bytenr(&root->root_item) !=
@@ -949,14 +951,12 @@ again:/* * add the block to pending list if we -* need check its backrefs. only block -* at 'cur->level + 1' is added to the -* tail of pending list. this guarantees -* we check backrefs from lower level -* blocks to upper level blocks. +* need check its backrefs, we only do this once +* while walking up a tree as we will catch +* anything else later on. */ -if (!upper->checked && - level == cur->level +1 ) { +if (!upper->checked && need_check) { + need_check = false;list_add_tail (&edge->list[UPPER ], &list); }else
Greg Kroah-Hartman
maintainerPATCH 48/48 ext4: avoid hang when mounting non-journal filesystems with orphan list
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Theodore Ts'o <[email protected]>
commit 0e9a9a1ad619e7e987815d20262d36a2f95717ca upstream.
When trying to mount a file system which does not contain a journal, but which does have a orphan list containing an inode which needs to be truncated, the mount call with hang forever in ext4_orphan_cleanup() because ext4_orphan_del() will return immediately without removing the inode from the orphan list, leading to an uninterruptible loop in kernel code which will busy out one of the CPU's on the system.
This can be trivially reproduced by trying to mount the file system found in tests/f_orphan_extents_inode/image.gz from the e2fsprogs source tree. If a malicious user were to put this on a USB stick, and mount it on a Linux desktop which has automatic mounts enabled, this could be considered a potential denial of service attack. (Not a big deal in practice, but professional paranoids worry about such things, and have even been known to allocate CVE numbers for such problems.)
-js: This is a fix for CVE-2013-2015.
--- fs/ext4/namei.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/ext4/namei.c +2 -1
@@ -2054,7 +2054,8 @@ int ext4_orphan_del(handle_t *handle, stint err =0 ;/* ext4_handle_valid() assumes a valid handle_t pointer */ -if (handle && !ext4_handle_valid (handle)) +if (handle && !ext4_handle_valid (handle) && + !(EXT4_SB (inode->i_sb)->s_mount_state &EXT4_ORPHAN_FS ))return 0 ;mutex_lock (&EXT4_SB (inode->i_sb)->s_orphan_lock);
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.66 release. There are 48 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 7 lines
Responses should be made by Sun Oct 13 19:35:35 UTC 2013. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.66-rc1.gzand the diffstat can be found below.
Less than perfect test results:
total: 103 pass: 83 skipped: 10 fail: 10
New failures appear to be due to:
'powerpc: Restore registers on error exit from csum_partial_copy_generic()'.
which causes six of the powerpc builds to fail.
qemu tests all pass.
Guenter
Greg Kroah-Hartman
maintainerQuoted 13 lines · Guenter Roeck
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.66 release. There are 48 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 7 lines
Responses should be made by Sun Oct 13 19:35:35 UTC 2013. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.66-rc1.gzand the diffstat can be found below.
Quoted 6 lines
Less than perfect test results:
total: 103 pass: 83 skipped: 10 fail: 10New failures appear to be due to:
'powerpc: Restore registers on error exit fromcsum_partial_copy_generic()'.
which causes six of the powerpc builds to fail.
Ick, that also looks to break the 3.0 build. I'll go drop it from both trees and do a -rc2 release, thanks for letting me know.
greg k-h
Quoted 17 lines · Greg Kroah-Hartman
Quoted 16 lines · Guenter Roeck
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.66 release. There are 48 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 7 lines
Responses should be made by Sun Oct 13 19:35:35 UTC 2013. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.66-rc1.gzand the diffstat can be found below.
Less than perfect test results:
total: 103 pass: 83 skipped: 10 fail: 10
Quoted 7 lines
Quoted 3 lines
New failures appear to be due to:
'powerpc: Restore registers on error exit fromcsum_partial_copy_generic()'.
which causes six of the powerpc builds to fail.Ick, that also looks to break the 3.0 build. I'll go drop it from both trees and do a -rc2 release, thanks for letting me know.
-rc2 looks better:
total: 103 pass: 89 skipped: 10 fail: 4
qemu tests all pass.
This matches previous results.
Please see http://server.roeck-us.net:8010/builders for details.
Thanks,
Guenter
Greg Kroah-Hartman
maintainerQuoted 26 lines · Guenter Roeck
Quoted 17 lines · Greg Kroah-Hartman
Quoted 16 lines · Guenter Roeck
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.66 release. There are 48 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 7 lines
Responses should be made by Sun Oct 13 19:35:35 UTC 2013. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.66-rc1.gzand the diffstat can be found below.
Less than perfect test results:
total: 103 pass: 83 skipped: 10 fail: 10Quoted 7 lines
Quoted 3 lines
New failures appear to be due to:
'powerpc: Restore registers on error exit fromcsum_partial_copy_generic()'.
which causes six of the powerpc builds to fail.Ick, that also looks to break the 3.0 build. I'll go drop it from both trees and do a -rc2 release, thanks for letting me know.
Quoted 6 lines
-rc2 looks better:
total: 103 pass: 89 skipped: 10 fail: 4qemu tests all pass.
This matches previous results.
Thanks for testing -rc2 and letting me know.
greg k-h
Quoted 13 lines · Guenter Roeck
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.66 release. There are 48 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 7 lines
Responses should be made by Sun Oct 13 19:35:35 UTC 2013. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.66-rc1.gzand the diffstat can be found below.
Quoted 8 lines
Less than perfect test results:
total: 103 pass: 83 skipped: 10 fail: 10New failures appear to be due to:
'powerpc: Restore registers on error exit fromcsum_partial_copy_generic()'.
which causes six of the powerpc builds to fail.qemu tests all pass.
I just hit this with 3.2 and I think (not yet verified) that this patch can be backported by changing STK_REG(R14) etc. to STK_REG(r14) (lower-case 'r'). The register ID macros were changed in Linux 3.6 so anything earlier would need that change.
Ben.
Signature · 3 lines
Ben Hutchings
Horngren's Observation:
Among economists, the real world is often a special case.Greg Kroah-Hartman
maintainerQuoted 11 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.66 release. There are 48 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun Oct 13 19:35:35 UTC 2013. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.66-rc1.gzand the diffstat can be found below.
Due to a powerpc build error, there is now a -rc2 release:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.66-rc2.gz
thanks,
greg k-h