3.14.5-stable review
Greg Kroah-Hartman
maintainercover 3.14.5-stable review
This is the start of the stable review cycle for the 3.14.5 release. There are 140 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 Sat May 31 04:30:12 UTC 2014. 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.14.5-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 3.14.5-rc1
Eric Dumazet <[email protected]>
net-gro: reset skb->truesize in napi_reuse_skb()
Li RongQing <[email protected]>
ipv4: initialise the itag variable in __mkroute_input
Eric Dumazet <[email protected]>
ipv6: gro: fix CHECKSUM_COMPLETE support
Cong Wang <[email protected]>
net_sched: fix an oops in tcindex filter
Steffen Klassert <[email protected]>
ip_tunnel: Initialize the fallback device properly
Antonio Quartulli <[email protected]>
batman-adv: fix local TT check for outgoing arp requests in DAT
Antonio Quartulli <[email protected]>
batman-adv: increase orig refcount when storing ref in gw_node
Antonio Quartulli <[email protected]>
batman-adv: fix reference counting imbalance while sending fragment
Marek Lindner <[email protected]>
batman-adv: fix indirect hard_iface NULL dereference
Eric Dumazet <[email protected]>
net: gro: make sure skb->cb[] initial content has not to be zero
Nikolay Aleksandrov <[email protected]>
bonding: fix out of range parameters for bond_intmax_tbl
Guenter Roeck <[email protected]>
net: phy: Don't call phy_resume if phy_init_hw failed
Cong Wang <[email protected]>
rtnetlink: wait for unregistering devices in rtnl_link_unregister()
Hannes Frederic Sowa <[email protected]>
ipv6: fix calculation of option len in ip6_append_data
Hannes Frederic Sowa <[email protected]>
net: avoid dependency of net_get_random_once on nop patching
Heiko Carstens <[email protected]>
net: filter: s390: fix JIT address randomization
Alexei Starovoitov <[email protected]>
net: filter: x86: fix JIT address randomization
Simon Wunderlich <[email protected]>
batman-adv: fix removing neigh_ifinfo
Simon Wunderlich <[email protected]>
batman-adv: always run purge_orig_neighbors
Simon Wunderlich <[email protected]>
batman-adv: fix neigh reference imbalance
Simon Wunderlich <[email protected]>
batman-adv: fix neigh_ifinfo imbalance
Duan Jiong <[email protected]>
neigh: set nud_state to NUD_INCOMPLETE when probing router reachability
Susant Sahani <[email protected]>
ip6_tunnel: fix potential NULL pointer dereference
Nikolay Aleksandrov <[email protected]>
sfc: fix calling of free_irq with already free vector
Peter Christensen <[email protected]>
macvlan: Don't propagate IFF_ALLMULTI changes on down interfaces.
Bjørn Mork <[email protected]>
net: cdc_mbim: handle unaccelerated VLAN tagged frames
Sergey Popovich <[email protected]>
ipv4: fib_semantics: increment fib_info_cnt after fib_info allocation
Florian Westphal <[email protected]>
net: ipv6: send pkttoobig immediately if orig frag size > mtu
Florian Westphal <[email protected]>
net: ipv4: ip_forward: fix inverted local_df test
Bjørn Mork <[email protected]>
net: cdc_mbim: __vlan_find_dev_deep need rcu_read_lock
Timo Teräs <[email protected]>
ipv4: ip_tunnels: disable cache for nbma gre tunnels
Ying Cai <[email protected]>
ip_tunnel: Set network header properly for IP_ECN_decapsulate()
Eyal Perry <[email protected]>
net/mlx4_core: Don't issue PCIe speed/width checks for VFs
Bjørn Mork <[email protected]>
net: cdc_ncm: fix buffer overflow
Andy King <[email protected]>
vsock: Make transport the proto owner
John Fastabend <[email protected]>
net: sched: lock imbalance in hhf qdisc
Liu Yu <[email protected]>
tcp_cubic: fix the range of delayed_ack
Vlad Yasevich <[email protected]>
Revert "macvlan : fix checksums error when we are in bridge mode"
Vlad Yasevich <[email protected]>
mactap: Fix checksum errors for non-gso packets in bridge mode
Karl Heiss <[email protected]>
net: sctp: Don't transition to PF state when transport has exhausted 'Path.Max.Retrans'.
Oliver Hartkopp <[email protected]>
slip: fix spinlock variant
Bjørn Mork <[email protected]>
net: qmi_wwan: add a number of Dell devices
Bjørn Mork <[email protected]>
net: qmi_wwan: add a number of CMOTech devices
Bjørn Mork <[email protected]>
net: qmi_wwan: add Alcatel L800MA
Bjørn Mork <[email protected]>
net: qmi_wwan: add Olivetti Olicard 500
Bjørn Mork <[email protected]>
net: qmi_wwan: add Sierra Wireless MC7305/MC7355
Bjørn Mork <[email protected]>
net: qmi_wwan: add Sierra Wireless MC73xx
Bjørn Mork <[email protected]>
net: qmi_wwan: add Sierra Wireless EM7355
Xufeng Zhang <[email protected]>
sctp: reset flowi4_oif parameter on route lookup
Toshiaki Makita <[email protected]>
bridge: Handle IFLA_ADDRESS correctly when creating bridge device
Kumar Sundararajan <[email protected]>
ipv6: fib: fix fib dump restart
David Gibson <[email protected]>
rtnetlink: Only supply IFLA_VF_PORTS information when RTEXT_FILTER_VF is set
David Gibson <[email protected]>
rtnetlink: Warn when interface's information won't fit in our packet
Andrew Lutomirski <[email protected]>
net: Fix ns_capable check in sock_diag_put_filterinfo
Vlad Yasevich <[email protected]>
net: sctp: cache auth_enable per endpoint
Ivan Vecera <[email protected]>
tg3: update rx_jumbo_pending ring param only when jumbo frames are enabled
Vlad Yasevich <[email protected]>
macvlan: Fix lockdep warnings with stacked macvlan devices
Vlad Yasevich <[email protected]>
vlan: Fix lockdep warning with stacked vlan devices.
Vlad Yasevich <[email protected]>
net: Allow for more then a single subclass for netif_addr_lock
Vlad Yasevich <[email protected]>
net: Find the nesting level of a given device by type.
dingtianhong <[email protected]>
vlan: Fix lockdep warning when vlan dev handle notification
Nicolas Dichtel <[email protected]>
ip6_gre: don't allow to remove the fb_tunnel_dev
Vlad Yasevich <[email protected]>
net: Start with correct mac_len in skb_network_protocol
Daniel Borkmann <[email protected]>
Revert "net: sctp: Fix a_rwnd/rwnd management to reflect real state of the receiver's buffer"
Mathias Krause <[email protected]>
filter: prevent nla extensions to peek beyond the end of the message
Julian Anastasov <[email protected]>
ipv4: return valid RTA_IIF on ip route get
Wang, Xiaoming <[email protected]>
net: ipv4: current group_info should be put after using.
Nicolas Dichtel <[email protected]>
vti: don't allow to add the same tunnel twice
Nicolas Dichtel <[email protected]>
gre: don't allow to add the same tunnel twice
Eric Dumazet <[email protected]>
ipv6: Limit mtu to 65575 bytes
Toshiaki Makita <[email protected]>
bridge: Fix double free and memory leak around br_allowed_ingress
Thomas Richter <[email protected]>
bonding: Remove debug_fs files when module init fails
Florian Westphal <[email protected]>
net: core: don't account for udp header size when computing seglen
Dmitry Petukhov <[email protected]>
l2tp: take PMTU from tunnel UDP socket
Daniel Borkmann <[email protected]>
net: sctp: test if association is dead in sctp_wake_up_waiters
Daniel Borkmann <[email protected]>
net: sctp: wake up all assocs if sndbuf policy is per socket
Steven Rostedt <[email protected]>
drm/i915: Do not dereference pointers from ring buffer in evict event
Jani Nikula <[email protected]>
drm/i915/tv: fix gen4 composite s-video tv-out
Alex Deucher <[email protected]>
drm/radeon: fix typo in spectre_golden_registers
Alex Deucher <[email protected]>
drm/radeon: fix endian swap on hawaii clear state buffer setup
Alex Deucher <[email protected]>
drm/radeon: call drm_edid_to_eld when we update the edid
Christian König <[email protected]>
drm/radeon: clear needs_reset flag if IB test fails
Maarten Lankhorst <[email protected]>
drm/qxl: unset a pointer in sync_obj_unref
Thomas Hellstrom <[email protected]>
drm/vmwgfx: Make sure user-space can't DMA across buffer object boundaries v2
Thomas Hellstrom <[email protected]>
drm/vmwgfx: Fix query buffer locking order violation
Christopher Friedt <[email protected]>
drm/vmwgfx: correct fb_fix_screeninfo.line_length
Eliad Peller <[email protected]>
wl18xx: align event mailbox with current fw
Thomas Bächler <[email protected]>
fs: Don't return 0 from get_anon_bdev
Chris Mason <[email protected]>
mlx4_en: don't use napi_synchronize inside mlx4_en_netpoll
Tony Lindgren <[email protected]>
serial: omap: Fix missing pm_runtime_resume handling by simplifying code
Bjørn Mork <[email protected]>
usb: option: add and update a number of CMOTech devices
Bjørn Mork <[email protected]>
usb: option: add Alcatel L800MA
Bjørn Mork <[email protected]>
usb: option: add Olivetti Olicard 500
Bjørn Mork <[email protected]>
usb: qcserial: add Sierra Wireless MC7305/MC7355
Bjørn Mork <[email protected]>
usb: qcserial: add Sierra Wireless MC73xx
Bjørn Mork <[email protected]>
usb: qcserial: add Sierra Wireless EM7355
Johan Hovold <[email protected]>
USB: io_ti: fix firmware download on big-endian machines
Johan Hovold <[email protected]>
USB: serial: fix sysfs-attribute removal deadlock
Johan Hovold <[email protected]>
Revert "USB: serial: add usbid for dell wwan card to sierra.c"
Daniele Palmas <[email protected]>
usb: option driver, add support for Telit UE910v2
Michele Baldessari <[email protected]>
USB: serial: ftdi_sio: add id for Brainboxes serial cards
Johan Hovold <[email protected]>
USB: usb_wwan: fix handling of missing bulk endpoints
Tristan Bruns <[email protected]>
USB: cp210x: Add 8281 (Nanotec Plug & Drive)
Michael Ulbricht <[email protected]>
USB: cdc-acm: Remove Motorola/Telit H24 serial interfaces from ACM driver
Mel Gorman <[email protected]>
mm: use paravirt friendly ops for NUMA hinting ptes
Mizuma, Masayoshi <[email protected]>
mm/hugetlb.c: add cond_resched_lock() in return_unused_surplus_pages()
Kirill A. Shutemov <[email protected]>
thp: close race between split and zap huge pages
Peter Foley <[email protected]>
init/Kconfig: move the trusted keyring config option to general setup
Steven Rostedt (Red Hat) <[email protected]>
tracing: Use rcu_dereference_sched() for trace event triggers
zhangwei(Jovi) <[email protected]>
tracing/uprobes: Fix uprobe_cpu_buffer memory leak
NeilBrown <[email protected]>
md/raid1: r1buf_pool_alloc: free allocate pages when subsequent allocation fails.
Hans de Goede <[email protected]>
HID: add NO_INIT_REPORTS quirk for Synaptics Touch Pad V 103S
Benjamin Tissoires <[email protected]>
HID: core: do not scan constant input report
Derya <[email protected]>
Revert "HID: microsoft: Add ID's for Surface Type/Touch Cover 2"
Vladimir Murzin <[email protected]>
xen/events/fifo: correctly align bitops
Konrad Rzeszutek Wilk <[email protected]>
xen/spinlock: Don't enable them unconditionally.
Sachin Prabhu <[email protected]>
cifs: Wait for writebacks to complete before attempting write.
Al Viro <[email protected]>
don't bother with {get,put}_write_access() on non-regular files
John David Anglin <[email protected]>
parisc: remove _STK_LIM_MAX override
Helge Deller <[email protected]>
parisc: fix epoll_pwait syscall on compat kernel
Helge Deller <[email protected]>
parisc: change value of SHMLBA from 0x00400000 to PAGE_SIZE
Viresh Kumar <[email protected]>
tick-sched: Check tick_nohz_enabled in tick_nohz_switch_to_nohz()
Viresh Kumar <[email protected]>
tick-sched: Don't call update_wall_time() when delta is lesser than tick_period
Viresh Kumar <[email protected]>
tick-common: Fix wrong check in tick_check_replacement()
Jani Nikula <[email protected]>
drm/i915: restore QUIRK_NO_PCH_PWM_ENABLE
Ilya Dryomov <[email protected]>
rbd: fix error paths in rbd_img_request_fill()
Steven Rostedt (Red Hat) <[email protected]>
tracepoint: Do not waste memory on mods with no tracepoints
Peter Zijlstra <[email protected]>
x86,preempt: Fix preemption for i386
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: set names cannot be larger than 15 bytes
Thomas Graf <[email protected]>
netfilter: Can't fail and free after table replacement
Roman Pen <[email protected]>
blktrace: fix accounting of partially completed requests
Andrey Vagin <[email protected]>
netfilter: nf_conntrack: reserve two bytes for nf_ct_ext->len
Patrick McHardy <[email protected]>
netfilter: nf_tables: fix nft_cmp_fast failure on big endian for size < 4
Richard Guy Briggs <[email protected]>
audit: convert PPIDs to the inital PID namespace.
Richard Guy Briggs <[email protected]>
pid: get pid_t ppid of task in init_pid_ns
Steven Rostedt <[email protected]>
tools lib traceevent: Fix memory leak in pretty_print()
Marcelo Tosatti <[email protected]>
KVM: x86: remove WARN_ON from get_kernel_ns()
Dan Carpenter <[email protected]>
SCSI: megaraid: missing bounds check in mimd_to_kioc()
James Bottomley <[email protected]>
SCSI: dual scan thread bug fix
James Bottomley <[email protected]>
scsi: fix our current target reap infrastructure
-------------
Diffstat:
Makefile | 4 +- arch/parisc/include/asm/shmparam.h | 5 +- arch/parisc/include/uapi/asm/resource.h | 1 - arch/parisc/kernel/cache.c | 3 +- arch/parisc/kernel/sys_parisc.c | 14 ++-- arch/parisc/kernel/syscall_table.S | 2 +- arch/s390/net/bpf_jit_comp.c | 2 +- arch/x86/include/asm/preempt.h | 12 +++ arch/x86/kvm/x86.c | 1 - arch/x86/net/bpf_jit_comp.c | 2 +- arch/x86/xen/spinlock.c | 5 +- block/blk-core.c | 2 +- drivers/block/rbd.c | 2 +- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/i915_trace.h | 4 +- drivers/gpu/drm/i915/intel_display.c | 16 ++++ drivers/gpu/drm/i915/intel_panel.c | 4 + drivers/gpu/drm/i915/intel_tv.c | 9 +- drivers/gpu/drm/qxl/qxl_ttm.c | 1 + drivers/gpu/drm/radeon/cik.c | 6 +- drivers/gpu/drm/radeon/radeon_display.c | 1 + drivers/gpu/drm/radeon/radeon_ring.c | 1 + drivers/gpu/drm/vmwgfx/vmwgfx_context.c | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 22 +++++ drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 5 +- drivers/hid/hid-core.c | 5 +- drivers/hid/hid-ids.h | 3 +- drivers/hid/hid-microsoft.c | 4 - drivers/hid/usbhid/hid-quirks.c | 1 + drivers/md/raid1.c | 17 +++- drivers/net/bonding/bond_main.c | 1 + drivers/net/bonding/bond_options.c | 1 + drivers/net/ethernet/broadcom/tg3.c | 4 +- drivers/net/ethernet/mellanox/mlx4/en_cq.c | 1 - drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 6 +- drivers/net/ethernet/mellanox/mlx4/main.c | 3 +- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 - drivers/net/ethernet/sfc/nic.c | 14 ++-- drivers/net/macvlan.c | 21 +++-- drivers/net/macvtap.c | 9 ++ drivers/net/phy/phy_device.c | 4 +- drivers/net/slip/slip.c | 6 +- drivers/net/usb/cdc_mbim.c | 57 +++++++++---- drivers/net/usb/cdc_ncm.c | 2 +- drivers/net/usb/qmi_wwan.c | 28 +++++++ drivers/net/wireless/ti/wl18xx/event.h | 20 +++++ drivers/scsi/megaraid/megaraid_mm.c | 2 + drivers/scsi/scsi_scan.c | 112 ++++++++++++++++--------- drivers/scsi/scsi_sysfs.c | 20 +++-- drivers/tty/serial/omap-serial.c | 29 ++++--- drivers/usb/class/cdc-acm.c | 28 +++++-- drivers/usb/serial/cp210x.c | 1 + drivers/usb/serial/ftdi_sio.c | 33 ++++++++ drivers/usb/serial/ftdi_sio_ids.h | 37 ++++++++ drivers/usb/serial/io_ti.c | 50 +++++++---- drivers/usb/serial/option.c | 83 +++++++++++++++++- drivers/usb/serial/qcserial.c | 9 ++ drivers/usb/serial/sierra.c | 1 - drivers/usb/serial/usb-serial.c | 4 +- drivers/usb/serial/usb_wwan.c | 9 +- drivers/xen/events/events_fifo.c | 41 ++++++--- fs/cifs/cifsfs.c | 14 +++- fs/cifs/cifsglob.h | 8 ++ fs/cifs/cifsproto.h | 3 + fs/cifs/file.c | 31 ++++++- fs/cifs/misc.c | 74 +++++++++++++++- fs/cifs/smb1ops.c | 11 +++ fs/cifs/smb2misc.c | 18 +++- fs/cifs/smb2ops.c | 14 ++++ fs/file_table.c | 4 +- fs/open.c | 26 ++---- fs/super.c | 5 +- include/asm-generic/pgtable.h | 31 +++++-- include/linux/if_macvlan.h | 1 + include/linux/if_vlan.h | 3 +- include/linux/net.h | 15 +--- include/linux/netdevice.h | 18 +++- include/linux/preempt.h | 2 + include/linux/rtnetlink.h | 5 ++ include/linux/sched.h | 20 ++++- include/linux/sock_diag.h | 2 +- include/linux/thread_info.h | 2 - include/net/af_vsock.h | 6 +- include/net/ip6_route.h | 5 ++ include/net/netfilter/nf_conntrack_extend.h | 4 +- include/net/netfilter/nf_tables_core.h | 10 +++ include/net/sctp/structs.h | 18 +++- include/scsi/scsi_device.h | 3 +- include/trace/events/block.h | 33 +++++++- init/Kconfig | 24 +++--- kernel/audit.c | 4 +- kernel/auditsc.c | 2 +- kernel/time/tick-common.c | 2 +- kernel/time/tick-sched.c | 5 +- kernel/trace/blktrace.c | 20 +++-- kernel/trace/trace_events_trigger.c | 2 +- kernel/trace/trace_uprobe.c | 6 ++ kernel/tracepoint.c | 6 ++ mm/huge_memory.c | 13 ++- mm/hugetlb.c | 1 + net/8021q/vlan.c | 1 + net/8021q/vlan_dev.c | 13 +-- net/batman-adv/bat_iv_ogm.c | 2 + net/batman-adv/distributed-arp-table.c | 3 +- net/batman-adv/fragmentation.c | 11 ++- net/batman-adv/gateway_client.c | 11 ++- net/batman-adv/originator.c | 62 ++++++++++++-- net/bridge/br_input.c | 2 +- net/bridge/br_netlink.c | 15 ++++ net/bridge/br_vlan.c | 7 +- net/bridge/netfilter/ebtables.c | 5 +- net/core/dev.c | 56 ++++++++++++- net/core/filter.c | 6 +- net/core/neighbour.c | 4 +- net/core/net_namespace.c | 2 +- net/core/rtnetlink.c | 66 ++++++++++++--- net/core/skbuff.c | 16 ++-- net/core/sock_diag.c | 4 +- net/core/utils.c | 8 +- net/ipv4/fib_semantics.c | 2 +- net/ipv4/ip_forward.c | 4 +- net/ipv4/ip_gre.c | 2 +- net/ipv4/ip_tunnel.c | 6 +- net/ipv4/ip_vti.c | 2 +- net/ipv4/netfilter/arp_tables.c | 6 +- net/ipv4/netfilter/ip_tables.c | 6 +- net/ipv4/ping.c | 15 +++- net/ipv4/route.c | 4 +- net/ipv4/tcp_cubic.c | 2 +- net/ipv6/ip6_fib.c | 3 +- net/ipv6/ip6_gre.c | 10 +++ net/ipv6/ip6_offload.c | 6 +- net/ipv6/ip6_output.c | 8 +- net/ipv6/ip6_tunnel.c | 2 +- net/ipv6/netfilter/ip6_tables.c | 6 +- net/ipv6/route.c | 5 +- net/ipv6/tcpv6_offload.c | 2 +- net/l2tp/l2tp_ppp.c | 4 +- net/netfilter/nf_tables_api.c | 3 +- net/netfilter/nf_tables_core.c | 3 +- net/netfilter/nft_cmp.c | 2 +- net/packet/diag.c | 2 +- net/sched/cls_tcindex.c | 30 ++++--- net/sched/sch_hhf.c | 11 +-- net/sctp/associola.c | 82 ++++++++++++++---- net/sctp/auth.c | 17 ++-- net/sctp/endpointola.c | 3 +- net/sctp/protocol.c | 7 +- net/sctp/sm_make_chunk.c | 32 +++---- net/sctp/sm_sideeffect.c | 7 +- net/sctp/sm_statefuns.c | 8 +- net/sctp/socket.c | 102 +++++++++++++++------- net/sctp/sysctl.c | 36 +++++++- net/sctp/ulpevent.c | 8 +- net/vmw_vsock/af_vsock.c | 47 +++++------ tools/lib/traceevent/event-parse.c | 1 + 156 files changed, 1546 insertions(+), 509 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/140 scsi: fix our current target reap infrastructure
3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Bottomley <[email protected]>
commit e63ed0d7a98014fdfc2cfeb3f6dada313dcabb59 upstream.
This patch eliminates the reap_ref and replaces it with a proper kref. On last put of this kref, the target is removed from visibility in sysfs. The final call to scsi_target_reap() for the device is done from __scsi_remove_device() and only if the device was made visible. This ensures that the target disappears as soon as the last device is gone rather than waiting until final release of the device (which is often too long).
--- drivers/scsi/scsi_scan.c | 99 +++++++++++++++++++++++++++------------------ drivers/scsi/scsi_sysfs.c | 20 ++++++--- include/scsi/scsi_device.h | 3 - 3 files changed, 75 insertions(+), 47 deletions(-)
drivers/scsi/scsi_scan.c +60 -39
@@ -371,6 +371,31 @@ static struct scsi_target *__scsi_find_t }/** +* scsi_target_reap_ref_release - remove target from visibility +* @kref: the reap_ref in the target being released +* +* Called on last put of reap_ref, which is the indication that no device +* under this target is visible anymore, so render the target invisible in +* sysfs. Note: we have to be in user context here because the target reaps +* should be done in places where the scsi device visibility is being removed. +*/ +static void scsi_target_reap_ref_release (struct kref *kref) +{ +struct scsi_target *starget + = container_of(kref, struct scsi_target, reap_ref); + +transport_remove_device (&starget->dev); +device_del (&starget->dev); + starget->state =STARGET_DEL ; +scsi_target_destroy (starget); +} + +static void scsi_target_reap_ref_put (struct scsi_target *starget) +{ +kref_put (&starget->reap_ref, scsi_target_reap_ref_release); +} + +/** * scsi_alloc_target - allocate a new or find an existing target * @parent: parent of the target (need not be a scsi host) * @channel: target channel number (zero if no channels)
@@ -392,7 +417,7 @@ static struct scsi_target *scsi_alloc_ta + shost->transportt->target_size;struct scsi_target *starget;struct scsi_target *found_target; -int error; +int error, ref_got; starget =kzalloc (size,GFP_KERNEL );if (!starget) {
@@ -401,7 +426,7 @@ static struct scsi_target *scsi_alloc_ta } dev = &starget->dev;device_initialize (dev); - starget->reap_ref =1 ; +kref_init (&starget->reap_ref); dev->parent =get_device (parent);dev_set_name (dev,"target%d:%d:%d" , shost->host_no, channel, id); dev->bus = &scsi_bus_type;
@@ -441,29 +466,36 @@ static struct scsi_target *scsi_alloc_tareturn starget; found: - found_target->reap_ref++; +/* +* release routine already fired if kref is zero, so if we can still +* take the reference, the target must be alive. If we can't, it must +* be dying and we need to wait for a new target +*/ + ref_got =kref_get_unless_zero (&found_target->reap_ref); +spin_unlock_irqrestore (shost->host_lock, flags); -if (found_target->state !=STARGET_DEL ) { +if (ref_got) {put_device (dev);return found_target; } -/* Unfortunately, we found a dying target; need to -* wait until it's dead before we can get a new one */ +/* +* Unfortunately, we found a dying target; need to wait until it's +* dead before we can get a new one. There is an anomaly here. We +* *should* call scsi_target_reap() to balance the kref_get() of the +* reap_ref above. However, since the target being released, it's +* already invisible and the reap_ref is irrelevant. If we call +* scsi_target_reap() we might spuriously do another device_del() on +* an already invisible target. +*/ put_device (&found_target->dev); -flush_scheduled_work (); +/* +* length of time is irrelevant here, we just want to yield the CPU +* for a tick to avoid busy waiting for the target to die. +*/ +msleep (1 ); goto retry; } -static void scsi_target_reap_usercontext (struct work_struct *work) -{ -struct scsi_target *starget = - container_of(work, struct scsi_target, ew.work); - -transport_remove_device (&starget->dev); -device_del (&starget->dev); -scsi_target_destroy (starget); -} -/** * scsi_target_reap - check to see if target is in use and destroy if not * @starget: target to be checked
@@ -474,28 +506,11 @@ static void scsi_target_reap_usercontext*/ void scsi_target_reap (struct scsi_target *starget) { -struct Scsi_Host *shost =dev_to_shost (starget->dev.parent); -unsigned long flags; -enum scsi_target_state state; -int empty =0 ; - -spin_lock_irqsave (shost->host_lock, flags); - state = starget->state; -if (--starget->reap_ref ==0 &&list_empty (&starget->devices)) { - empty =1 ; - starget->state =STARGET_DEL ; - } -spin_unlock_irqrestore (shost->host_lock, flags); - -if (!empty) -return ; - -BUG_ON (state ==STARGET_DEL ); -if (state ==STARGET_CREATED ) +BUG_ON (starget->state ==STARGET_DEL ); +if (starget->state ==STARGET_CREATED )scsi_target_destroy (starget);else -execute_in_process_context (scsi_target_reap_usercontext, - &starget->ew); +scsi_target_reap_ref_put (starget); }/**
@@ -1532,6 +1547,10 @@ struct scsi_device *__scsi_add_device(st }mutex_unlock (&shost->scan_mutex);scsi_autopm_put_target (starget); +/* +* paired with scsi_alloc_target(). Target will be destroyed unless +* scsi_probe_and_add_lun made an underlying device visible +*/ scsi_target_reap (starget);put_device (&starget->dev);
@@ -1612,8 +1631,10 @@ static void __scsi_scan_target(struct de out_reap:scsi_autopm_put_target (starget); -/* now determine if the target has any children at all -* and if not, nuke it */ +/* +* paired with scsi_alloc_target(): determine if the target has +* any children at all and if not, nuke it +*/ scsi_target_reap (starget);put_device (&starget->dev);
drivers/scsi/scsi_sysfs.c +14 -6
@@ -383,17 +383,14 @@ static void scsi_device_dev_release_user {struct scsi_device *sdev;struct device *parent; -struct scsi_target *starget;struct list_head *this, *tmp;unsigned long flags; sdev = container_of(work, struct scsi_device, ew.work); parent = sdev->sdev_gendev.parent; - starget =to_scsi_target (parent);spin_lock_irqsave (sdev->host->host_lock, flags); - starget->reap_ref++;list_del (&sdev->siblings);list_del (&sdev->same_target_siblings);list_del (&sdev->starved_entry);
@@ -413,8 +410,6 @@ static void scsi_device_dev_release_user/* NULL queue means the device can't be used */ sdev->request_queue =NULL ; -scsi_target_reap (scsi_target (sdev)); -kfree (sdev->inquiry);kfree (sdev);
@@ -1071,6 +1066,13 @@ void __scsi_remove_device(struct scsi_de sdev->host->hostt->slave_destroy (sdev);transport_destroy_device (dev); +/* +* Paired with the kref_get() in scsi_sysfs_initialize(). We have +* remoed sysfs visibility from the device, so make the target +* invisible if this was the last device underneath it. +*/ +scsi_target_reap (scsi_target (sdev)); +put_device (dev); }
@@ -1133,7 +1135,7 @@ void scsi_remove_target(struct device *dcontinue ;if (starget->dev.parent == dev || &starget->dev == dev) {/* assuming new targets arrive at the end */ - starget->reap_ref++; +kref_get (&starget->reap_ref);spin_unlock_irqrestore (shost->host_lock, flags);if (last)scsi_target_reap (last);
@@ -1217,6 +1219,12 @@ void scsi_sysfs_device_initialize(structlist_add_tail (&sdev->same_target_siblings, &starget->devices);list_add_tail (&sdev->siblings, &shost->__devices);spin_unlock_irqrestore (shost->host_lock, flags); +/* +* device can now only be removed via __scsi_remove_device() so hold +* the target. Target will be held in CREATED state until something +* beneath it becomes visible (in which case it moves to RUNNING) +*/ +kref_get (&starget->reap_ref); }int scsi_is_sdev_device (const struct device *dev)
include/scsi/scsi_device.h +1 -2
@@ -257,7 +257,7 @@ struct scsi_target {struct list_head siblings;struct list_head devices;struct device dev; -unsigned int reap_ref;/* protected by the host lock */ +struct kref reap_ref;/* last put renders target invisible */ unsigned int channel;unsigned int id;/* target id ... replace * scsi_device.id eventually */
@@ -284,7 +284,6 @@ struct scsi_target {#define SCSI_DEFAULT_TARGET_BLOCKED 3char scsi_level; -struct execute_work ew;enum scsi_target_state state;void *hostdata;/* available to low-level driver */ unsigned long starget_data[0 ];/* for the transport */
Greg Kroah-Hartman
maintainerPATCH 2/140 SCSI: dual scan thread bug fix
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Bottomley <[email protected]>
commit f2495e228fce9f9cec84367547813cbb0d6db15a upstream.
In the highly unusual case where two threads are running concurrently through the scanning code scanning the same target, we run into the situation where one may allocate the target while the other is still using it. In this case, because the reap checks for STARGET_CREATED and kills the target without reference counting, the second thread will do the wrong thing on reap.
Fix this by reference counting even creates and doing the STARGET_CREATED check in the final put.
--- drivers/scsi/scsi_scan.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
drivers/scsi/scsi_scan.c +16 -7
@@ -320,6 +320,7 @@ static void scsi_target_destroy(struct sstruct Scsi_Host *shost =dev_to_shost (dev->parent);unsigned long flags; + starget->state =STARGET_DEL ;transport_destroy_device (dev);spin_lock_irqsave (shost->host_lock, flags);if (shost->hostt->target_destroy)
@@ -384,9 +385,15 @@ static void scsi_target_reap_ref_releasestruct scsi_target *starget = container_of(kref, struct scsi_target, reap_ref); -transport_remove_device (&starget->dev); -device_del (&starget->dev); - starget->state =STARGET_DEL ; +/* +* if we get here and the target is still in the CREATED state that +* means it was allocated but never made visible (because a scan +* turned up no LUNs), so don't call device_del() on it. +*/ +if (starget->state !=STARGET_CREATED ) { +transport_remove_device (&starget->dev); +device_del (&starget->dev); + }scsi_target_destroy (starget); }
@@ -506,11 +513,13 @@ static struct scsi_target *scsi_alloc_ta*/ void scsi_target_reap (struct scsi_target *starget) { +/* +* serious problem if this triggers: STARGET_DEL is only set in the if +* the reap_ref drops to zero, so we're trying to do another final put +* on an already released kref +*/ BUG_ON (starget->state ==STARGET_DEL ); -if (starget->state ==STARGET_CREATED ) -scsi_target_destroy (starget); -else -scsi_target_reap_ref_put (starget); +scsi_target_reap_ref_put (starget); }/**
Greg Kroah-Hartman
maintainerPATCH 3/140 SCSI: megaraid: missing bounds check in mimd_to_kioc()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 3de2260140417759c669d391613d583baf03b0cf upstream.
pthru32->dataxferlen comes from the user so we need to check that it's not too large so we don't overflow the buffer.
--- drivers/scsi/megaraid/megaraid_mm.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/megaraid/megaraid_mm.c +2 -0
@@ -486,6 +486,8 @@ mimd_to_kioc(mimd_t __user *umimd, mraid pthru32->dataxferaddr = kioc->buf_paddr;if (kioc->data_dir &UIOC_WR ) { +if (pthru32->dataxferlen > kioc->xferlen) +return -EINVAL ;if (copy_from_user (kioc->buf_vaddr, kioc->user_data, pthru32->dataxferlen)) {return (-EFAULT );
Greg Kroah-Hartman
maintainerPATCH 4/140 KVM: x86: remove WARN_ON from get_kernel_ns()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcelo Tosatti <[email protected]>
commit b351c39cc9e0151cee9b8d52a1e714928faabb38 upstream.
Function and callers can be preempted.
https://bugzilla.kernel.org/show_bug.cgi?id=73721
--- arch/x86/kvm/x86.c | 1 - 1 file changed, 1 deletion(-)
arch/x86/kvm/x86.c +0 -1
@@ -1109,7 +1109,6 @@ static inline u64 get_kernel_ns(void) {struct timespec ts; -WARN_ON (preemptible ());ktime_get_ts (&ts);monotonic_to_bootbased (&ts);return timespec_to_ns (&ts);
Greg Kroah-Hartman
maintainerPATCH 5/140 tools lib traceevent: Fix memory leak in pretty_print()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit de04f8657de9d3351a2d5880f1f7080b23b798cf upstream.
Commit 12e55569a244 "tools lib traceevent: Use helper trace-seq in print functions like kernel does" added a extra trace_seq helper to process string arguments like the kernel does it. But the difference between the kernel and the userspace library is that the kernel's trace_seq structure has a static allocated buffer. The userspace one has a dynamically allocated one. It requires a trace_seq_destroy(), otherwise it produces a nasty memory leak.
--- tools/lib/traceevent/event-parse.c | 1 + 1 file changed, 1 insertion(+)
tools/lib/traceevent/event-parse.c +1 -0
@@ -4321,6 +4321,7 @@ static void pretty_print(struct trace_se format, len_arg, arg);trace_seq_terminate (&p);trace_seq_puts (s, p.buffer); +trace_seq_destroy (&p); arg = arg->next;break ;default :
Greg Kroah-Hartman
maintainerPATCH 6/140 pid: get pid_t ppid of task in init_pid_ns
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Guy Briggs <[email protected]>
commit ad36d28293936b03d6b7996e9d6aadfd73c0eb08 upstream.
Added the functions task_ppid_nr_ns() and task_ppid_nr() to abstract the lookup of the PPID (real_parent's pid_t) of a process, including rcu locking, in the arbitrary and init_pid_ns.
This provides an alternative to sys_getppid(), which is relative to the child process' pid namespace.
(informed by ebiederman's 6c621b7e)
--- include/linux/sched.h | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
include/linux/sched.h +19 -1
@@ -1688,6 +1688,24 @@ static inline pid_t task_tgid_vnr(struct } +static int pid_alive (const struct task_struct *p); +static inline pid_t task_ppid_nr_ns (const struct task_struct *tsk,struct pid_namespace *ns) +{ +pid_t pid =0 ; + +rcu_read_lock (); +if (pid_alive (tsk)) + pid =task_tgid_nr_ns (rcu_dereference (tsk->real_parent), ns); +rcu_read_unlock (); + +return pid; +} + +static inline pid_t task_ppid_nr (const struct task_struct *tsk) +{ +return task_ppid_nr_ns (tsk, &init_pid_ns); +} +static inline pid_t task_pgrp_nr_ns (struct task_struct *tsk,struct pid_namespace *ns) {
@@ -1727,7 +1745,7 @@ static inline pid_t task_pgrp_nr(struct* * Return: 1 if the process is alive. 0 otherwise. */ -static inline int pid_alive (struct task_struct *p) +static inline int pid_alive (const struct task_struct *p) {return p->pids[PIDTYPE_PID ].pid !=NULL ; }
Greg Kroah-Hartman
maintainerPATCH 7/140 audit: convert PPIDs to the inital PID namespace.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Guy Briggs <[email protected]>
commit c92cdeb45eea38515e82187f48c2e4f435fb4e25 upstream.
sys_getppid() returns the parent pid of the current process in its own pid namespace. Since audit filters are based in the init pid namespace, a process could avoid a filter or trigger an unintended one by being in an alternate pid namespace or log meaningless information.
Switch to task_ppid_nr() for PPIDs to anchor all audit filters in the init_pid_ns.
(informed by ebiederman's 6c621b7e)
--- kernel/audit.c | 4 ++-- kernel/auditsc.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
kernel/audit.c +2 -2
@@ -1829,10 +1829,10 @@ void audit_log_task_info(struct audit_buspin_unlock_irq (&tsk->sighand->siglock); audit_log_format(ab, - " ppid=%ld pid=%d auid=%u uid=%u gid=%u" + " ppid=%d pid=%d auid=%u uid=%u gid=%u" " euid=%u suid=%u fsuid=%u" " egid=%u sgid=%u fsgid=%u tty=%s ses=%u", - sys_getppid(), + task_ppid_nr(tsk), tsk->pid, from_kuid(&init_user_ns, audit_get_loginuid(tsk)), from_kuid(&init_user_ns, cred->uid),
kernel/auditsc.c +1 -1
@@ -459,7 +459,7 @@ static int audit_filter_rules(struct tascase AUDIT_PPID :if (ctx) {if (!ctx->ppid) - ctx->ppid =sys_getppid (); + ctx->ppid =task_ppid_nr (tsk); result =audit_comparator (ctx->ppid, f->op, f->val); }break ;
Greg Kroah-Hartman
maintainerPATCH 8/140 netfilter: nf_tables: fix nft_cmp_fast failure on big endian for size < 4
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patrick McHardy <[email protected]>
commit b855d416dc17061ebb271ea7ef1201d100531770 upstream.
nft_cmp_fast is used for equality comparisions of size <= 4. For comparisions of size < 4 byte a mask is calculated that is applied to both the data from userspace (during initialization) and the register value (during runtime). Both values are stored using (in effect) memcpy to a memory area that is then interpreted as u32 by nft_cmp_fast.
This works fine on little endian since smaller types have the same base address, however on big endian this is not true and the smaller types are interpreted as a big number with trailing zero bytes.
The mask therefore must not include the lower bytes, but the higher bytes on big endian. Add a helper function that does a cpu_to_le32 to switch the bytes on big endian. Since we're dealing with a mask of just consequitive bits, this works out fine.
--- include/net/netfilter/nf_tables_core.h | 10 ++++++++++ net/netfilter/nf_tables_core.c | 3 +-- net/netfilter/nft_cmp.c | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-)
include/net/netfilter/nf_tables_core.h +10 -0
@@ -13,6 +13,16 @@ struct nft_cmp_fast_expr {u8 len; }; +/* Calculate the mask for the nft_cmp_fast expression. On big endian the +* mask needs to include the *upper* bytes when interpreting that data as +* something smaller than the full u32, therefore a cpu_to_le32 is done. +*/ +static inline u32 nft_cmp_fast_mask (unsigned int len) +{ + return cpu_to_le32(~0U >> (FIELD_SIZEOF(struct nft_cmp_fast_expr, + data) * BITS_PER_BYTE - len)); +} +extern const struct nft_expr_ops nft_cmp_fast_ops;int nft_cmp_module_init (void );
net/netfilter/nf_tables_core.c +1 -2
@@ -25,9 +25,8 @@ static void nft_cmp_fast_eval(const stru struct nft_data data[NFT_REG_MAX + 1]) {const struct nft_cmp_fast_expr *priv =nft_expr_priv (expr); -u32 mask; +u32 mask =nft_cmp_fast_mask (priv->len); - mask = ~0U >> (sizeof (priv->data) *BITS_PER_BYTE - priv->len);if ((data[priv->sreg].data[0 ] & mask) == priv->data)return ; data[NFT_REG_VERDICT ].verdict =NFT_BREAK ;
net/netfilter/nft_cmp.c +1 -1
@@ -128,7 +128,7 @@ static int nft_cmp_fast_init(const strucBUG_ON (err <0 ); desc.len *=BITS_PER_BYTE ; - mask = ~0U >> (sizeof (priv->data) *BITS_PER_BYTE - desc.len); + mask =nft_cmp_fast_mask (desc.len); priv->data = data.data[0 ] & mask; priv->len = desc.len;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 9/140 netfilter: nf_conntrack: reserve two bytes for nf_ct_ext->len
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Vagin <[email protected]>
commit 223b02d923ecd7c84cf9780bb3686f455d279279 upstream.
"len" contains sizeof(nf_ct_ext) and size of extensions. In a worst case it can contain all extensions. Bellow you can find sizes for all types of extensions. Their sum is definitely bigger than 256.
nf_ct_ext_types[0]->len = 24
nf_ct_ext_types[1]->len = 32
nf_ct_ext_types[2]->len = 24
nf_ct_ext_types[3]->len = 32
nf_ct_ext_types[4]->len = 152
nf_ct_ext_types[5]->len = 2
nf_ct_ext_types[6]->len = 16
nf_ct_ext_types[7]->len = 8
I have seen "len" up to 280 and my host has crashes w/o this patch.
The right way to fix this problem is reducing the size of the ecache extension (4) and Florian is going to do this, but these changes will be quite large to be appropriate for a stable tree.
--- include/net/netfilter/nf_conntrack_extend.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/net/netfilter/nf_conntrack_extend.h +2 -2
@@ -47,8 +47,8 @@ enum nf_ct_ext_id {/* Extensions: optional stuff which isn't permanently in struct. */ struct nf_ct_ext {struct rcu_head rcu; -u8 offset[NF_CT_EXT_NUM ]; -u8 len; +u16 offset[NF_CT_EXT_NUM ]; +u16 len;char data[0 ]; };
Greg Kroah-Hartman
maintainerPATCH 10/140 blktrace: fix accounting of partially completed requests
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roman Pen <[email protected]>
commit af5040da01ef980670b3741b3e10733ee3e33566 upstream.
trace_block_rq_complete does not take into account that request can be partially completed, so we can get the following incorrect output of blkparser:
C R 232 + 240 [0] C R 240 + 232 [0] C R 248 + 224 [0] C R 256 + 216 [0]
but should be:
C R 232 + 8 [0] C R 240 + 8 [0] C R 248 + 8 [0] C R 256 + 8 [0]
Also, the whole output summary statistics of completed requests and final throughput will be incorrect.
This patch takes into account real completion size of the request and fixes wrong completion accounting.
--- block/blk-core.c | 2 +- include/trace/events/block.h | 33 ++++++++++++++++++++++++++++++--- kernel/trace/blktrace.c | 20 +++++++++++--------- 3 files changed, 42 insertions(+), 13 deletions(-)
block/blk-core.c +1 -1
@@ -2353,7 +2353,7 @@ bool blk_update_request(struct request *if (!req->bio)return false; -trace_block_rq_complete (req->q, req); +trace_block_rq_complete (req->q, req, nr_bytes);/* * For fs requests, rq is just carrier of independent bio's
include/trace/events/block.h +30 -3
@@ -132,6 +132,7 @@ DEFINE_EVENT(block_rq_with_error, block_* block_rq_complete - block IO operation completed by device driver * @q: queue containing the block operation request * @rq: block operations request +* @nr_bytes: number of completed bytes * * The block_rq_complete tracepoint event indicates that some portion * of operation request has been completed by the device driver. If
@@ -139,11 +140,37 @@ DEFINE_EVENT(block_rq_with_error, block_* do for the request. If @rq->bio is non-NULL then there is * additional work required to complete the request. */ -DEFINE_EVENT (block_rq_with_error, block_rq_complete, +TRACE_EVENT (block_rq_complete, - TP_PROTO(struct request_queue *q, struct request *rq), + TP_PROTO(struct request_queue *q, struct request *rq, + unsigned int nr_bytes), -TP_ARGS (q, rq) +TP_ARGS (q, rq, nr_bytes), + +TP_STRUCT__entry ( + __field( dev_t, dev ) + __field( sector_t, sector ) + __field( unsigned int, nr_sector ) + __field( int, errors ) + __array( char, rwbs, RWBS_LEN ) +__dynamic_array ( char, cmd,blk_cmd_buf_len (rq) ) + ), + +TP_fast_assign ( + __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; + __entry->sector = blk_rq_pos(rq); + __entry->nr_sector = nr_bytes >> 9; + __entry->errors = rq->errors; + + blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); + blk_dump_cmd(__get_str(cmd), rq); + ), + +TP_printk ("%d,%d %s (%s) %llu + %u [%d]" , +MAJOR (__entry->dev),MINOR (__entry->dev), + __entry->rwbs,__get_str (cmd), + (unsigned long long )__entry->sector, + __entry->nr_sector, __entry->errors) ); DECLARE_EVENT_CLASS(block_rq,
kernel/trace/blktrace.c +11 -9
@@ -702,6 +702,7 @@ void blk_trace_shutdown(struct request_q* blk_add_trace_rq - Add a trace for a request oriented action * @q: queue the io is for * @rq: the source request +* @nr_bytes: number of completed bytes * @what: the action * * Description:
@@ -709,7 +710,7 @@ void blk_trace_shutdown(struct request_q* **/ static void blk_add_trace_rq (struct request_queue *q,struct request *rq, -u32 what) +unsigned int nr_bytes,u32 what) {struct blk_trace *bt = q->blk_trace;
@@ -718,11 +719,11 @@ static void blk_add_trace_rq(struct requif (rq->cmd_type ==REQ_TYPE_BLOCK_PC ) { what |=BLK_TC_ACT (BLK_TC_PC ); -__blk_add_trace (bt,0 ,blk_rq_bytes (rq), rq->cmd_flags, +__blk_add_trace (bt,0 , nr_bytes, rq->cmd_flags, what, rq->errors, rq->cmd_len, rq->cmd); }else { what |=BLK_TC_ACT (BLK_TC_FS ); -__blk_add_trace (bt,blk_rq_pos (rq),blk_rq_bytes (rq), +__blk_add_trace (bt,blk_rq_pos (rq), nr_bytes, rq->cmd_flags, what, rq->errors,0 ,NULL ); } }
@@ -730,33 +731,34 @@ static void blk_add_trace_rq(struct requstatic void blk_add_trace_rq_abort (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_ABORT ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_ABORT ); }static void blk_add_trace_rq_insert (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_INSERT ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_INSERT ); }static void blk_add_trace_rq_issue (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_ISSUE ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_ISSUE ); }static void blk_add_trace_rq_requeue (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_REQUEUE ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_REQUEUE ); }static void blk_add_trace_rq_complete (void *ignore,struct request_queue *q, -struct request *rq) +struct request *rq, +unsigned int nr_bytes) { -blk_add_trace_rq (q, rq,BLK_TA_COMPLETE ); +blk_add_trace_rq (q, rq, nr_bytes,BLK_TA_COMPLETE ); }/**
Greg Kroah-Hartman
maintainerPATCH 11/140 netfilter: Cant fail and free after table replacement
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Graf <[email protected]>
commit c58dd2dd443c26d856a168db108a0cd11c285bf3 upstream.
All xtables variants suffer from the defect that the copy_to_user() to copy the counters to user memory may fail after the table has already been exchanged and thus exposed. Return an error at this point will result in freeing the already exposed table. Any subsequent packet processing will result in a kernel panic.
We can't copy the counters before exposing the new tables as we want provide the counter state after the old table has been unhooked. Therefore convert this into a silent error.
--- net/bridge/netfilter/ebtables.c | 5 ++--- net/ipv4/netfilter/arp_tables.c | 6 ++++-- net/ipv4/netfilter/ip_tables.c | 6 ++++-- net/ipv6/netfilter/ip6_tables.c | 6 ++++-- 4 files changed, 14 insertions(+), 9 deletions(-)
net/bridge/netfilter/ebtables.c +2 -3
@@ -1044,10 +1044,9 @@ static int do_replace_finish(struct netif (repl->num_counters &©_to_user (repl->counters, counterstmp, repl->num_counters *sizeof (struct ebt_counter ))) { - ret = -EFAULT ; +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("ebtables: counters copy to user failed while replacing table\n" ); } -else - ret =0 ;/* decrease module count and free resources */ EBT_ENTRY_ITERATE(table->entries, table->entries_size,
net/ipv4/netfilter/arp_tables.c +4 -2
@@ -1044,8 +1044,10 @@ static int __do_replace(struct net *net,xt_free_table_info (oldinfo);if (copy_to_user (counters_ptr, counters, -sizeof (struct xt_counters ) * num_counters) !=0 ) - ret = -EFAULT ; +sizeof (struct xt_counters ) * num_counters) !=0 ) { +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("arptables: counters copy to user failed while replacing table\n" ); + }vfree (counters);xt_table_unlock (t);return ret;
net/ipv4/netfilter/ip_tables.c +4 -2
@@ -1231,8 +1231,10 @@ __do_replace(struct net *net, const charxt_free_table_info (oldinfo);if (copy_to_user (counters_ptr, counters, -sizeof (struct xt_counters ) * num_counters) !=0 ) - ret = -EFAULT ; +sizeof (struct xt_counters ) * num_counters) !=0 ) { +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("iptables: counters copy to user failed while replacing table\n" ); + }vfree (counters);xt_table_unlock (t);return ret;
net/ipv6/netfilter/ip6_tables.c +4 -2
@@ -1241,8 +1241,10 @@ __do_replace(struct net *net, const charxt_free_table_info (oldinfo);if (copy_to_user (counters_ptr, counters, -sizeof (struct xt_counters ) * num_counters) !=0 ) - ret = -EFAULT ; +sizeof (struct xt_counters ) * num_counters) !=0 ) { +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("ip6tables: counters copy to user failed while replacing table\n" ); + }vfree (counters);xt_table_unlock (t);return ret;
Greg Kroah-Hartman
maintainerPATCH 12/140 netfilter: nf_tables: set names cannot be larger than 15 bytes
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
commit a9bdd8365684810e3de804f8c51e52c26a5eccbb upstream.
Currently, nf_tables trims off the set name if it exceeeds 15 bytes, so explicitly reject set names that are too large.
--- net/netfilter/nf_tables_api.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/netfilter/nf_tables_api.c +2 -1
@@ -1934,7 +1934,8 @@ static const struct nft_set_ops *nft_selstatic const struct nla_policy nft_set_policy[NFTA_SET_MAX +1 ] = { [NFTA_SET_TABLE ] = { .type =NLA_STRING }, - [NFTA_SET_NAME ] = { .type =NLA_STRING }, + [NFTA_SET_NAME ] = { .type =NLA_STRING , + .len =IFNAMSIZ -1 }, [NFTA_SET_FLAGS ] = { .type =NLA_U32 }, [NFTA_SET_KEY_TYPE ] = { .type =NLA_U32 }, [NFTA_SET_KEY_LEN ] = { .type =NLA_U32 },
Greg Kroah-Hartman
maintainerPATCH 13/140 x86,preempt: Fix preemption for i386
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
Many people reported preemption/reschedule problems with i386 kernels for .13 and .14. After Michele bisected this to a combination of
3e8e42c69bb ("sched: Revert need_resched() to look at TIF_NEED_RESCHED") ded79754754 ("irq: Force hardirq exit's softirq processing on its own stack")
it finally dawned on me that i386's current_thread_info() was to blame.
When we are on interrupt/exception stacks, we fail to observe the right TIF_NEED_RESCHED bit and therefore the PREEMPT_NEED_RESCHED folding malfunctions.
Current upstream fixes this by making i386 behave the same as x86_64 already did:
2432e1364bbe ("x86: Nuke the supervisor_stack field in i386 thread_info") b807902a88c4 ("x86: Nuke GET_THREAD_INFO_WITH_ESP() macro for i386") 0788aa6a23cb ("x86: Prepare removal of previous_esp from i386 thread_info structure") 198d208df437 ("x86: Keep thread_info on thread stack in x86_32")
However, that is far too much to stuff into -stable. Therefore I propose we merge the below patch which uses task_thread_info(current) for tif_need_resched() instead of the ESP based current_thread_info().
This makes sure we always observe the one true TIF_NEED_RESCHED bit and things will work as expected again.
--- arch/x86/include/asm/preempt.h | 12 ++++++++++++ include/linux/preempt.h | 2 ++ include/linux/thread_info.h | 2 -- 3 files changed, 14 insertions(+), 2 deletions(-)
arch/x86/include/asm/preempt.h +12 -0
@@ -5,6 +5,18 @@#include <asm/percpu.h> #include <linux/thread_info.h> +#ifdef CONFIG_X86_32 +/* +* i386's current_thread_info() depends on ESP and for interrupt/exception +* stacks this doesn't yield the actual task thread_info. +* +* We hard rely on the fact that all the TIF_NEED_RESCHED bits are +* the same, therefore use the slightly more expensive version below. +*/ +#undef tif_need_resched +#define tif_need_resched () test_tsk_thread_flag(current, TIF_NEED_RESCHED) +#endif +DECLARE_PER_CPU (int, __preempt_count);/*
include/linux/preempt.h +2 -0
@@ -15,6 +15,8 @@*/ #define PREEMPT_NEED_RESCHED 0x80000000 +#define tif_need_resched () test_thread_flag(TIF_NEED_RESCHED) +#include <asm/preempt.h> #if defined(CONFIG_DEBUG_PREEMPT ) || defined(CONFIG_PREEMPT_TRACER )
include/linux/thread_info.h +0 -2
@@ -118,8 +118,6 @@ static inline __deprecated void set_need*/ } -#define tif_need_resched () test_thread_flag(TIF_NEED_RESCHED) -#if definedTIF_RESTORE_SIGMASK && !definedHAVE_SET_RESTORE_SIGMASK /* * An arch can define its own version of set_restore_sigmask() to get the
Greg Kroah-Hartman
maintainerPATCH 14/140 tracepoint: Do not waste memory on mods with no tracepoints
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Steven Rostedt (Red Hat)" <[email protected]>
commit 7dec935a3aa04412cba2cebe1524ae0d34a30c24 upstream.
No reason to allocate tp_module structures for modules that have no tracepoints. This just wastes memory.
--- kernel/tracepoint.c | 6 ++++++ 1 file changed, 6 insertions(+)
kernel/tracepoint.c +6 -0
@@ -641,6 +641,9 @@ static int tracepoint_module_coming(strustruct tp_module *tp_mod, *iter;int ret =0 ; +if (!mod->num_tracepoints) +return 0 ; +/* * We skip modules that taint the kernel, especially those with different * module headers (for forced load), to make sure we don't cause a crash.
@@ -684,6 +687,9 @@ static int tracepoint_module_going(struc {struct tp_module *pos; +if (!mod->num_tracepoints) +return 0 ; +mutex_lock (&tracepoints_mutex);tracepoint_update_probe_range (mod->tracepoints_ptrs, mod->tracepoints_ptrs + mod->num_tracepoints);
Greg Kroah-Hartman
maintainerPATCH 15/140 rbd: fix error paths in rbd_img_request_fill()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilya Dryomov <[email protected]>
commit 42dd037c08c7cd6e3e9af7824b0c1d063f838885 upstream.
Doing rbd_obj_request_put() in rbd_img_request_fill() error paths is not only insufficient, but also triggers an rbd_assert() in rbd_obj_request_destroy():
Assertion failure in rbd_obj_request_destroy() at line 1867:
rbd_assert(obj_request->img_request == NULL);
rbd_img_obj_request_add() adds obj_requests to the img_request, the opposite is rbd_img_obj_request_del(). Use it.
--- drivers/block/rbd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/block/rbd.c +1 -1
@@ -2253,7 +2253,7 @@ out_partial:rbd_obj_request_put (obj_request); out_unwind:for_each_obj_request_safe (img_request, obj_request, next_obj_request) -rbd_obj_request_put (obj_request); +rbd_img_obj_request_del (img_request, obj_request);return -ENOMEM ; }
Greg Kroah-Hartman
maintainerPATCH 1/1 drm/i915: restore QUIRK_NO_PCH_PWM_ENABLE
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
This reverts the bisected regressing
commit bc0bb9fd1c7810407ab810d204bbaecb255fddde
Author: Jani Nikula <[email protected]> Date: Thu Nov 14 12:14:29 2013 +0200
drm/i915: remove QUIRK_NO_PCH_PWM_ENABLE
restoring QUIRK_NO_PCH_PWM_ENABLE for a couple of Dell XPS models which broke in 3.14.
There is no such revert upstream. We have root caused and fixed the issue upstream, without the quirk, with:
commit 39fbc9c8f6765959b55e0b127dd5c57df5a47d67
Author: Jani Nikula <[email protected]> Date: Wed Apr 9 11:22:06 2014 +0300
drm/i915: check VBT for supported backlight type
and
commit c675949ec58ca50d5a3ae3c757892f1560f6e896
Author: Jani Nikula <[email protected]> Date: Wed Apr 9 11:31:37 2014 +0300
drm/i915: do not setup backlight if not available according to VBT
While the commits are within the stable rules otherwise, and fix more machines than just the regressed Dell XPS models, we feel backporting them to stable may be too risky. The revert is limited to the broken machines, and the impact should be effectively the same as what the upstream commits do more generally.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76276
--- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/intel_display.c | 16 ++++++++++++++++ drivers/gpu/drm/i915/intel_panel.c | 4 ++++ 3 files changed, 21 insertions(+)
drivers/gpu/drm/i915/i915_drv.h +1 -0
@@ -734,6 +734,7 @@ enum intel_sbi_destination {#define QUIRK_PIPEA_FORCE (1<<0)#define QUIRK_LVDS_SSC_DISABLE (1<<1)#define QUIRK_INVERT_BRIGHTNESS (1<<2) +#define QUIRK_NO_PCH_PWM_ENABLE (1<<3)struct intel_fbdev ;struct intel_fbc_work ;
drivers/gpu/drm/i915/intel_display.c +16 -0
@@ -10771,6 +10771,17 @@ static void quirk_invert_brightness(struDRM_INFO ("applying inverted panel brightness quirk\n" ); } +/* +* Some machines (Dell XPS13) suffer broken backlight controls if +* BLM_PCH_PWM_ENABLE is set. +*/ +static void quirk_no_pcm_pwm_enable (struct drm_device *dev) +{ +struct drm_i915_private *dev_priv = dev->dev_private; + dev_priv->quirks |=QUIRK_NO_PCH_PWM_ENABLE ; +DRM_INFO ("applying no-PCH_PWM_ENABLE quirk\n" ); +} +struct intel_quirk {int device;int subsystem_vendor;
@@ -10839,6 +10850,11 @@ static struct intel_quirk intel_quirks[]/* Acer Aspire 4736Z */ { 0x2a42, 0x1025, 0x0260, quirk_invert_brightness }, + +/* Dell XPS13 HD Sandy Bridge */ + { 0x0116, 0x1028, 0x052e, quirk_no_pcm_pwm_enable }, +/* Dell XPS13 HD and XPS13 FHD Ivy Bridge */ + { 0x0166, 0x1028, 0x058b, quirk_no_pcm_pwm_enable }, };static void intel_init_quirks (struct drm_device *dev)
drivers/gpu/drm/i915/intel_panel.c +4 -0
@@ -671,6 +671,10 @@ static void pch_enable_backlight(struct pch_ctl2 = panel->backlight.max <<16 ;I915_WRITE (BLC_PWM_PCH_CTL2 , pch_ctl2); +/* XXX: transitional */ +if (dev_priv->quirks &QUIRK_NO_PCH_PWM_ENABLE ) +return ; + pch_ctl1 =0 ;if (panel->backlight.active_low_pwm) pch_ctl1 |=BLM_PCH_POLARITY ;
Greg Kroah-Hartman
maintainerPATCH 17/140 tick-common: Fix wrong check in tick_check_replacement()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
commit 521c42990e9d561ed5ed9f501f07639d0512b3c9 upstream.
tick_check_replacement() returns if a replacement of clock_event_device is possible or not. It does this as the first check:
if (tick_check_percpu(curdev, newdev, smp_processor_id())) return false;
Thats wrong. tick_check_percpu() returns true when the device is useable. Check for false instead.
[ tglx: Massaged changelog ]
--- kernel/time/tick-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/time/tick-common.c +1 -1
@@ -276,7 +276,7 @@ static bool tick_check_preferred(structbool tick_check_replacement (struct clock_event_device *curdev,struct clock_event_device *newdev) { -if (tick_check_percpu (curdev, newdev,smp_processor_id ())) +if (!tick_check_percpu (curdev, newdev,smp_processor_id ()))return false;return tick_check_preferred (curdev, newdev);
Greg Kroah-Hartman
maintainerPATCH 18/140 tick-sched: Dont call update_wall_time() when delta is lesser than tick_period
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
commit 03e6bdc5c4d0fc166bfd5d3cf749a5a0c1b5b1bd upstream.
In tick_do_update_jiffies64() we are processing ticks only if delta is greater than tick_period. This is what we are supposed to do here and it broke a bit with this patch:
commit 47a1b796 (tick/timekeeping: Call update_wall_time outside the jiffies lock)
With above patch, we might end up calling update_wall_time() even if delta is found to be smaller that tick_period. Fix this by returning when the delta is less than tick period.
[ tglx: Made it a 3 liner and massaged changelog ]
--- kernel/time/tick-sched.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/time/tick-sched.c +3 -0
@@ -84,6 +84,9 @@ static void tick_do_update_jiffies64(kti/* Keep the tick_next_period variable up to date */ tick_next_period =ktime_add (last_jiffies_update, tick_period); + }else { +write_sequnlock (&jiffies_lock); +return ; }write_sequnlock (&jiffies_lock);update_wall_time ();
Greg Kroah-Hartman
maintainerPATCH 19/140 tick-sched: Check tick_nohz_enabled in tick_nohz_switch_to_nohz()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
commit 27630532ef5ead28b98cfe28d8f95222ef91c2b7 upstream.
Since commit d689fe222 (NOHZ: Check for nohz active instead of nohz enabled) the tick_nohz_switch_to_nohz() function returns because it checks for the tick_nohz_active flag. This can't be set, because the function itself sets it.
Undo the change in tick_nohz_switch_to_nohz().
--- kernel/time/tick-sched.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/time/tick-sched.c +1 -1
@@ -970,7 +970,7 @@ static void tick_nohz_switch_to_nohz(voistruct tick_sched *ts = &__get_cpu_var (tick_cpu_sched);ktime_t next; -if (!tick_nohz_active) +if (!tick_nohz_enabled)return ;local_irq_disable ();
Greg Kroah-Hartman
maintainerPATCH 20/140 parisc: change value of SHMLBA from 0x00400000 to PAGE_SIZE
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
commit 0ef36bd2b37815719e31a72d2beecc28ca8ecd26 upstream.
On parisc, SHMLBA was defined to 0x00400000 (4MB) to reflect that we need to take care of our caches for shared mappings. But actually, we can map a file at any multiple address of PAGE_SIZE, so let us correct that now with a value of PAGE_SIZE for SHMLBA. Instead we now take care of this cache colouring via the constant SHM_COLOUR while we map shared pages.
--- arch/parisc/include/asm/shmparam.h | 5 ++--- arch/parisc/kernel/cache.c | 3 ++- arch/parisc/kernel/sys_parisc.c | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-)
arch/parisc/include/asm/shmparam.h +2 -3
@@ -1,8 +1,7 @@#ifndef _ASMPARISC_SHMPARAM_H#define _ASMPARISC_SHMPARAM_H -#define __ARCH_FORCE_SHMLBA 1 - -#define SHMLBA 0x00400000/* attach addr needs to be 4 Mb aligned */ +#define SHMLBA PAGE_SIZE/* attach addr a multiple of this */ +#define SHM_COLOUR 0x00400000/* shared mappings colouring */ #endif /* _ASMPARISC_SHMPARAM_H */
arch/parisc/kernel/cache.c +2 -1
@@ -323,7 +323,8 @@ void flush_dcache_page(struct page *page* specifically accesses it, of course) */ flush_tlb_page (mpnt, addr); -if (old_addr ==0 || (old_addr & (SHMLBA -1 )) != (addr & (SHMLBA -1 ))) { +if (old_addr ==0 || (old_addr & (SHM_COLOUR -1 )) + != (addr & (SHM_COLOUR -1 ))) {__flush_cache_page (mpnt, addr,page_to_phys (page));if (old_addr)printk (KERN_ERR "INEQUIVALENT ALIASES 0x%lx and 0x%lx in file %s\n" , old_addr, addr, mpnt->vm_file ? (char *)mpnt->vm_file->f_path.dentry->d_name.name :"(null)" );
arch/parisc/kernel/sys_parisc.c +7 -7
@@ -45,7 +45,7 @@static int get_offset (unsigned int last_mmap) { -return (last_mmap & (SHMLBA -1 )) >>PAGE_SHIFT ; +return (last_mmap & (SHM_COLOUR -1 )) >>PAGE_SHIFT ; } static unsigned long shared_align_offset(unsigned int last_mmap,
@@ -57,8 +57,8 @@ static unsigned long shared_align_offsetstatic inline unsigned long COLOR_ALIGN (unsigned long addr,unsigned int last_mmap,unsigned long pgoff) { -unsigned long base = (addr+SHMLBA -1 ) & ~(SHMLBA -1 ); -unsigned long off = (SHMLBA -1 ) & +unsigned long base = (addr+SHM_COLOUR -1 ) & ~(SHM_COLOUR -1 ); +unsigned long off = (SHM_COLOUR -1 ) & (shared_align_offset (last_mmap, pgoff) <<PAGE_SHIFT );return base + off;
@@ -101,7 +101,7 @@ unsigned long arch_get_unmapped_area(strif (flags &MAP_FIXED ) {if ((flags &MAP_SHARED ) && last_mmap && (addr -shared_align_offset (last_mmap, pgoff)) - & (SHMLBA -1 )) + & (SHM_COLOUR -1 ))return -EINVAL ; goto found_addr; }
@@ -122,7 +122,7 @@ unsigned long arch_get_unmapped_area(str info.length = len; info.low_limit = mm->mmap_legacy_base; info.high_limit =mmap_upper_limit (); - info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA -1 )) :0 ; + info.align_mask = last_mmap ? (PAGE_MASK & (SHM_COLOUR -1 )) :0 ; info.align_offset =shared_align_offset (last_mmap, pgoff); addr =vm_unmapped_area (&info);
@@ -161,7 +161,7 @@ arch_get_unmapped_area_topdown(struct fiif (flags &MAP_FIXED ) {if ((flags &MAP_SHARED ) && last_mmap && (addr -shared_align_offset (last_mmap, pgoff)) - & (SHMLBA -1 )) + & (SHM_COLOUR -1 ))return -EINVAL ; goto found_addr; }
@@ -182,7 +182,7 @@ arch_get_unmapped_area_topdown(struct fi info.length = len; info.low_limit =PAGE_SIZE ; info.high_limit = mm->mmap_base; - info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA -1 )) :0 ; + info.align_mask = last_mmap ? (PAGE_MASK & (SHM_COLOUR -1 )) :0 ; info.align_offset =shared_align_offset (last_mmap, pgoff); addr =vm_unmapped_area (&info);if (!(addr & ~PAGE_MASK ))
Greg Kroah-Hartman
maintainerPATCH 21/140 parisc: fix epoll_pwait syscall on compat kernel
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
commit ab3e55b119c9653b19ea4edffb86f04db867ac98 upstream.
This bug was detected with the libio-epoll-perl debian package where the test case IO-Ppoll-compat.t failed.
--- arch/parisc/kernel/syscall_table.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/parisc/kernel/syscall_table.S +1 -1
@@ -392,7 +392,7 @@ ENTRY_COMP(vmsplice) ENTRY_COMP(move_pages) /* 295 */ ENTRY_SAME(getcpu) - ENTRY_SAME(epoll_pwait) + ENTRY_COMP(epoll_pwait) ENTRY_COMP(statfs64) ENTRY_COMP(fstatfs64) ENTRY_COMP(kexec_load) /* 300 */
Greg Kroah-Hartman
maintainerPATCH 22/140 parisc: remove _STK_LIM_MAX override
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: John David Anglin <[email protected]>
commit e0d8898d76a785453bfaf6cd08b830a7d5189f78 upstream.
There are only a couple of architectures that override _STK_LIM_MAX to a non-infinity value. This changes the stack allocation semantics in subtle ways. For example, GNU make changes its stack allocation to the hard maximum defined by _STK_LIM_MAX. As a results, threads executed by processes running under make are allocated a stack size of _STK_LIM_MAX rather than a sensible default value. This causes various thread stress tests to fail when they can't muster more than about 50 threads.
The attached change implements the default behavior used by the majority of architectures.
--- arch/parisc/include/uapi/asm/resource.h | 1 - 1 file changed, 1 deletion(-)
arch/parisc/include/uapi/asm/resource.h +0 -1
@@ -1,7 +1,6 @@#ifndef _ASM_PARISC_RESOURCE_H#define _ASM_PARISC_RESOURCE_H -#define _STK_LIM_MAX 10 * _STK_LIM#include <asm-generic/resource.h> #endif
Greg Kroah-Hartman
maintainerPATCH 23/140 dont bother with {get,put}_write_access() on non-regular files
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit dd20908a8a06b22c171f6c3fcdbdbd65bed07505 upstream.
it's pointless and actually leads to wrong behaviour in at least one moderately convoluted case (pipe(), close one end, try to get to another via /proc/*/fd and run into ETXTBUSY).
--- fs/file_table.c | 4 ++-- fs/open.c | 26 +++++++------------------- 2 files changed, 9 insertions(+), 21 deletions(-)
fs/file_table.c +2 -2
@@ -209,10 +209,10 @@ static void drop_file_write_access(strucstruct dentry *dentry = file->f_path.dentry;struct inode *inode = dentry->d_inode; -put_write_access (inode); -if (special_file (inode->i_mode))return ; + +put_write_access (inode);if (file_check_writeable (file) !=0 )return ;__mnt_drop_write (mnt);
fs/open.c +7 -19
@@ -641,23 +641,12 @@ out:static inline int __get_file_write_access (struct inode *inode,struct vfsmount *mnt) { -int error; - error =get_write_access (inode); +int error =get_write_access (inode);if (error)return error; -/* -* Do not take mount writer counts on -* special files since no writes to -* the mount itself will occur. -*/ -if (!special_file (inode->i_mode)) { -/* -* Balanced in __fput() -*/ - error =__mnt_want_write (mnt); -if (error) -put_write_access (inode); - } + error =__mnt_want_write (mnt); +if (error) +put_write_access (inode);return error; }
@@ -690,12 +679,11 @@ static int do_dentry_open(struct file *fpath_get (&f->f_path); inode = f->f_inode = f->f_path.dentry->d_inode; -if (f->f_mode &FMODE_WRITE ) { +if (f->f_mode &FMODE_WRITE && !special_file (inode->i_mode)) { error =__get_file_write_access (inode, f->f_path.mnt);if (error) goto cleanup_file; -if (!special_file (inode->i_mode)) -file_take_write (f); +file_take_write (f); } f->f_mapping = inode->i_mapping;
@@ -742,7 +730,6 @@ static int do_dentry_open(struct file *f cleanup_all:fops_put (f->f_op);if (f->f_mode &FMODE_WRITE ) { -put_write_access (inode);if (!special_file (inode->i_mode)) {/* * We don't consider this a real
@@ -750,6 +737,7 @@ cleanup_all:* because it all happenend right * here, so just reset the state. */ +put_write_access (inode);file_reset_write (f);__mnt_drop_write (f->f_path.mnt); }
Greg Kroah-Hartman
maintainerPATCH 24/140 cifs: Wait for writebacks to complete before attempting write.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sachin Prabhu <[email protected]>
commit c11f1df5003d534fd067f0168bfad7befffb3b5c upstream.
Problem reported in Red Hat bz 1040329 for strict writes where we cache only when we hold oplock and write direct to the server when we don't.
When we receive an oplock break, we first change the oplock value for the inode in cifsInodeInfo->oplock to indicate that we no longer hold the oplock before we enqueue a task to flush changes to the backing device. Once we have completed flushing the changes, we return the oplock to the server.
There are 2 ways here where we can have data corruption
1) While we flush changes to the backing device as part of the oplock break, we can have processes write to the file. These writes check for the oplock, find none and attempt to write directly to the server. These direct writes made while we are flushing from cache could be overwritten by data being flushed from the cache causing data corruption.
2) While a thread runs in cifs_strict_writev, the machine could receive and process an oplock break after the thread has checked the oplock and found that it allows us to cache and before we have made changes to the cache. In that case, we end up with a dirty page in cache when we shouldn't have any. This will be flushed later and will overwrite all subsequent writes to the part of the file represented by this page.
Before making any writes to the server, we need to confirm that we are not in the process of flushing data to the server and if we are, we should wait until the process is complete before we attempt the write. We should also wait for existing writes to complete before we process an oplock break request which changes oplock values.
We add a version specific downgrade_oplock() operation to allow for differences in the oplock values set for the different smb versions.
--- fs/cifs/cifsfs.c | 14 +++++++++ fs/cifs/cifsglob.h | 8 +++++ fs/cifs/cifsproto.h | 3 ++ fs/cifs/file.c | 31 +++++++++++++++++++-- fs/cifs/misc.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++-- fs/cifs/smb1ops.c | 11 +++++++ fs/cifs/smb2misc.c | 18 ++++++++++-- fs/cifs/smb2ops.c | 14 +++++++++ 8 files changed, 164 insertions(+), 9 deletions(-)
fs/cifs/cifsfs.c +13 -1
@@ -253,6 +253,11 @@ cifs_alloc_inode(struct super_block *sb)cifs_set_oplock_level (cifs_inode,0 ); cifs_inode->delete_pending = false; cifs_inode->invalid_mapping = false; +clear_bit (CIFS_INODE_PENDING_OPLOCK_BREAK , &cifs_inode->flags); +clear_bit (CIFS_INODE_PENDING_WRITERS , &cifs_inode->flags); +clear_bit (CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 , &cifs_inode->flags); +spin_lock_init (&cifs_inode->writers_lock); + cifs_inode->writers =0 ; cifs_inode->vfs_inode.i_blkbits =14 ;/* 2**14 = CIFS_MAX_MSGSIZE */ cifs_inode->server_eof =0 ; cifs_inode->uniqueid =0 ;
@@ -731,19 +736,26 @@ static ssize_t cifs_file_aio_write(struc unsigned long nr_segs, loff_t pos) {struct inode *inode =file_inode (iocb->ki_filp); +struct cifsInodeInfo *cinode =CIFS_I (inode);ssize_t written;int rc; + written =cifs_get_writer (cinode); +if (written) +return written; + written =generic_file_aio_write (iocb, iov, nr_segs, pos);if (CIFS_CACHE_WRITE (CIFS_I (inode))) -return written; + goto out; rc =filemap_fdatawrite (inode->i_mapping);if (rc)cifs_dbg (FYI ,"cifs_file_aio_write: %d rc on %p inode\n" , rc, inode); +out: +cifs_put_writer (cinode);return written; }
fs/cifs/cifsglob.h +8 -0
@@ -228,6 +228,8 @@ struct smb_version_operations {/* verify the message */ int (*check_message)(char *,unsigned int );bool (*is_oplock_break)(char *,struct TCP_Server_Info *); +void (*downgrade_oplock)(struct TCP_Server_Info *, +struct cifsInodeInfo *,bool );/* process transaction2 response */ bool (*check_trans2)(struct mid_q_entry *,struct TCP_Server_Info *,char *,int );
@@ -1113,6 +1115,12 @@ struct cifsInodeInfo {unsigned int epoch;/* used to track lease state changes */ bool delete_pending;/* DELETE_ON_CLOSE is set */ bool invalid_mapping;/* pagecache is invalid */ +unsigned long flags; +#define CIFS_INODE_PENDING_OPLOCK_BREAK (0)/* oplock break in progress */ +#define CIFS_INODE_PENDING_WRITERS (1)/* Writes in progress */ +#define CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 (2)/* Downgrade oplock to L2 */ +spinlock_t writers_lock; +unsigned int writers;/* Number of writers on this inode */ unsigned long time;/* jiffies of last update of inode */ u64 server_eof;/* current file size on server -- protected by i_lock */ u64 uniqueid;/* server inode number */
fs/cifs/cifsproto.h +3 -0
@@ -127,6 +127,9 @@ extern u64 cifs_UnixTimeToNT(struct timeextern struct timespec cnvrtDosUnixTm (__le16 le_date,__le16 le_time,int offset);extern void cifs_set_oplock_level (struct cifsInodeInfo *cinode,__u32 oplock); +extern int cifs_get_writer (struct cifsInodeInfo *cinode); +extern void cifs_put_writer (struct cifsInodeInfo *cinode); +extern void cifs_done_oplock_break (struct cifsInodeInfo *cinode);extern int cifs_unlock_range (struct cifsFileInfo *cfile,struct file_lock *flock,const unsigned int xid);extern int cifs_push_mandatory_locks (struct cifsFileInfo *cfile);
fs/cifs/file.c +28 -3
@@ -2608,12 +2608,20 @@ cifs_strict_writev(struct kiocb *iocb, cstruct cifs_tcon *tcon =tlink_tcon (cfile->tlink);ssize_t written; + written =cifs_get_writer (cinode); +if (written) +return written; +if (CIFS_CACHE_WRITE (cinode)) {if (cap_unix (tcon->ses) && (CIFS_UNIX_FCNTL_CAP &le64_to_cpu (tcon->fsUnixInfo.Capability)) - && ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) -return generic_file_aio_write (iocb, iov, nr_segs, pos); -return cifs_writev (iocb, iov, nr_segs, pos); + && ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) { + written =generic_file_aio_write ( + iocb, iov, nr_segs, pos); + goto out; + } + written =cifs_writev (iocb, iov, nr_segs, pos); + goto out; }/* * For non-oplocked files in strict cache mode we need to write the data
@@ -2633,6 +2641,8 @@ cifs_strict_writev(struct kiocb *iocb, c inode); cinode->oplock =0 ; } +out: +cifs_put_writer (cinode);return written; }
@@ -3644,6 +3654,13 @@ static int cifs_launder_page(struct pagereturn rc; } +static int +cifs_pending_writers_wait (void *unused) +{ +schedule (); +return 0 ; +} +void cifs_oplock_break (struct work_struct *work) { struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo,
@@ -3651,8 +3668,15 @@ void cifs_oplock_break(struct work_strucstruct inode *inode = cfile->dentry->d_inode;struct cifsInodeInfo *cinode =CIFS_I (inode);struct cifs_tcon *tcon =tlink_tcon (cfile->tlink); +struct TCP_Server_Info *server = tcon->ses->server;int rc =0 ; +wait_on_bit (&cinode->flags,CIFS_INODE_PENDING_WRITERS , + cifs_pending_writers_wait,TASK_UNINTERRUPTIBLE ); + + server->ops->downgrade_oplock (server, cinode, +test_bit (CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 , &cinode->flags)); +if (!CIFS_CACHE_WRITE (cinode) &&CIFS_CACHE_READ (cinode) &&cifs_has_mand_locks (cinode)) { cifs_dbg(FYI, "Reset oplock to None for inode=%p due to mand locks\n",
@@ -3689,6 +3713,7 @@ void cifs_oplock_break(struct work_struc cinode);cifs_dbg (FYI ,"Oplock release rc = %d\n" , rc); } +cifs_done_oplock_break (cinode); }/*
fs/cifs/misc.c +72 -2
86 lines not on this page · raw message
fs/cifs/smb1ops.c +11 -0
@@ -372,6 +372,16 @@ coalesce_t2(char *second_buf, struct smbreturn 0 ; } +static void +cifs_downgrade_oplock (struct TCP_Server_Info *server, +struct cifsInodeInfo *cinode,bool set_level2) +{ +if (set_level2) +cifs_set_oplock_level (cinode,OPLOCK_READ ); +else +cifs_set_oplock_level (cinode,0 ); +} +static bool cifs_check_trans2 (struct mid_q_entry *mid,struct TCP_Server_Info *server,char *buf,int malformed)
@@ -1019,6 +1029,7 @@ struct smb_version_operations smb1_opera .clear_stats = cifs_clear_stats, .print_stats = cifs_print_stats, .is_oplock_break = is_valid_oplock_break, + .downgrade_oplock = cifs_downgrade_oplock, .check_trans2 = cifs_check_trans2, .need_neg = cifs_need_neg, .negotiate = cifs_negotiate,
fs/cifs/smb2misc.c +15 -3
@@ -575,9 +575,21 @@ smb2_is_valid_oplock_break(char *buffer,else cfile->oplock_break_cancelled = false; - server->ops->set_oplock_level (cinode, - rsp->OplockLevel ?SMB2_OPLOCK_LEVEL_II :0 , -0 ,NULL ); +set_bit (CIFS_INODE_PENDING_OPLOCK_BREAK , + &cinode->flags); + +/* +* Set flag if the server downgrades the oplock +* to L2 else clear. +*/ +if (rsp->OplockLevel) +set_bit ( +CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 , + &cinode->flags); +else +clear_bit ( +CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 , + &cinode->flags);queue_work (cifsiod_wq, &cfile->oplock_break);
fs/cifs/smb2ops.c +14 -0
@@ -905,6 +905,17 @@ smb2_query_symlink(const unsigned int xi }static void +smb2_downgrade_oplock (struct TCP_Server_Info *server, +struct cifsInodeInfo *cinode,bool set_level2) +{ +if (set_level2) + server->ops->set_oplock_level (cinode,SMB2_OPLOCK_LEVEL_II , +0 ,NULL ); +else + server->ops->set_oplock_level (cinode,0 ,0 ,NULL ); +} + +static void smb2_set_oplock_level (struct cifsInodeInfo *cinode,__u32 oplock,unsigned int epoch,bool *purge_cache) {
@@ -1110,6 +1121,7 @@ struct smb_version_operations smb20_oper .clear_stats = smb2_clear_stats, .print_stats = smb2_print_stats, .is_oplock_break = smb2_is_valid_oplock_break, + .downgrade_oplock = smb2_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize,
@@ -1184,6 +1196,7 @@ struct smb_version_operations smb21_oper .clear_stats = smb2_clear_stats, .print_stats = smb2_print_stats, .is_oplock_break = smb2_is_valid_oplock_break, + .downgrade_oplock = smb2_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize,
@@ -1259,6 +1272,7 @@ struct smb_version_operations smb30_oper .print_stats = smb2_print_stats, .dump_share_caps = smb2_dump_share_caps, .is_oplock_break = smb2_is_valid_oplock_break, + .downgrade_oplock = smb2_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize,
Greg Kroah-Hartman
maintainerPATCH 25/140 xen/spinlock: Dont enable them unconditionally.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Rzeszutek Wilk <[email protected]>
commit e0fc17a936334c08b2729fff87168c03fdecf5b6 upstream.
The git commit a945928ea2709bc0e8e8165d33aed855a0110279 ('xen: Do not enable spinlocks before jump_label_init() has executed') was added to deal with the jump machinery. Earlier the code that turned on the jump label was only called by Xen specific functions. But now that it had been moved to the initcall machinery it gets called on Xen, KVM, and baremetal - ouch!. And the detection machinery to only call it on Xen wasn't remembered in the heat of merge window excitement.
This means that the slowpath is enabled on baremetal while it should not be.
--- arch/x86/xen/spinlock.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/x86/xen/spinlock.c +4 -1
@@ -274,7 +274,7 @@ void __init xen_init_spinlocks(void)printk (KERN_DEBUG "xen: PV spinlocks disabled\n" );return ; } - +printk (KERN_DEBUG "xen: PV spinlocks enabled\n" ); pv_lock_ops.lock_spinning =PV_CALLEE_SAVE (xen_lock_spinning); pv_lock_ops.unlock_kick = xen_unlock_kick; }
@@ -290,6 +290,9 @@ static __init int xen_init_spinlocks_jumif (!xen_pvspin)return 0 ; +if (!xen_domain ()) +return 0 ; +static_key_slow_inc (¶virt_ticketlocks_enabled);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 26/140 xen/events/fifo: correctly align bitops
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Murzin <[email protected]>
commit 05a812ac474d0d6aef6d54b66bb08b81abde79c6 upstream.
FIFO event channels require bitops on 32-bit aligned values (the event words). Linux's bitops require unsigned long alignment which may be 64-bits.
On arm64 an incorrectly unaligned access will fault.
Fix this by aligning the bitops along with an adjustment for bit position and using an unsigned long for the local copy of the ready word.
--- drivers/xen/events/events_fifo.c | 41 ++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-)
drivers/xen/events/events_fifo.c +30 -11
@@ -66,7 +66,22 @@ static DEFINE_PER_CPU(struct evtchn_fifostatic event_word_t *event_array[MAX_EVENT_ARRAY_PAGES ]__read_mostly ;static unsigned event_array_pages__read_mostly ; +/* +* sync_set_bit() and friends must be unsigned long aligned on non-x86 +* platforms. +*/ +#if !defined(CONFIG_X86 ) &&BITS_PER_LONG >32 + +#define BM (w) (unsigned long *)((unsigned long)w & ~0x7UL) +#define EVTCHN_FIFO_BIT (b, w) \ + (((unsigned long)w & 0x4UL) ? (EVTCHN_FIFO_ ##b + 32) : EVTCHN_FIFO_ ##b) + +#else +#define BM (w) ((unsigned long *)(w)) +#define EVTCHN_FIFO_BIT (b, w) EVTCHN_FIFO_ ##b + +#endif static inline event_word_t *event_word_from_port (unsigned port) {
@@ -161,33 +176,38 @@ static void evtchn_fifo_bind_to_cpu(strustatic void evtchn_fifo_clear_pending (unsigned port) {event_word_t *word =event_word_from_port (port); -sync_clear_bit (EVTCHN_FIFO_PENDING ,BM (word)); +sync_clear_bit (EVTCHN_FIFO_BIT (PENDING , word),BM (word)); }static void evtchn_fifo_set_pending (unsigned port) {event_word_t *word =event_word_from_port (port); -sync_set_bit (EVTCHN_FIFO_PENDING ,BM (word)); +sync_set_bit (EVTCHN_FIFO_BIT (PENDING , word),BM (word)); }static bool evtchn_fifo_is_pending (unsigned port) {event_word_t *word =event_word_from_port (port); -return sync_test_bit (EVTCHN_FIFO_PENDING ,BM (word)); +return sync_test_bit (EVTCHN_FIFO_BIT (PENDING , word),BM (word)); }static bool evtchn_fifo_test_and_set_mask (unsigned port) {event_word_t *word =event_word_from_port (port); -return sync_test_and_set_bit (EVTCHN_FIFO_MASKED ,BM (word)); +return sync_test_and_set_bit (EVTCHN_FIFO_BIT (MASKED , word),BM (word)); }static void evtchn_fifo_mask (unsigned port) {event_word_t *word =event_word_from_port (port); -sync_set_bit (EVTCHN_FIFO_MASKED ,BM (word)); +sync_set_bit (EVTCHN_FIFO_BIT (MASKED , word),BM (word)); } +static bool evtchn_fifo_is_masked (unsigned port) +{ +event_word_t *word =event_word_from_port (port); +return sync_test_bit (EVTCHN_FIFO_BIT (MASKED , word),BM (word)); +}/* * Clear MASKED, spinning if BUSY is set. */
@@ -211,7 +231,7 @@ static void evtchn_fifo_unmask(unsignedBUG_ON (!irqs_disabled ());clear_masked (word); -if (sync_test_bit (EVTCHN_FIFO_PENDING ,BM (word))) { +if (evtchn_fifo_is_pending (port)) {struct evtchn_unmask unmask = { .port = port }; (void )HYPERVISOR_event_channel_op (EVTCHNOP_unmask, &unmask); }
@@ -247,7 +267,7 @@ static void handle_irq_for_port(unsignedstatic void consume_one_event (unsigned cpu,struct evtchn_fifo_control_block *control_block, -unsigned priority,uint32_t *ready) +unsigned priority,unsigned long *ready) {struct evtchn_fifo_queue *q = &per_cpu (cpu_queue, cpu);uint32_t head;
@@ -277,10 +297,9 @@ static void consume_one_event(unsigned c* copy of the ready word. */ if (head ==0 ) -clear_bit (priority,BM (ready)); +clear_bit (priority, ready); -if (sync_test_bit (EVTCHN_FIFO_PENDING ,BM (word)) - && !sync_test_bit (EVTCHN_FIFO_MASKED ,BM (word))) +if (evtchn_fifo_is_pending (port) && !evtchn_fifo_is_masked (port))handle_irq_for_port (port); q->head[priority] = head;
@@ -289,7 +308,7 @@ static void consume_one_event(unsigned cstatic void evtchn_fifo_handle_events (unsigned cpu) {struct evtchn_fifo_control_block *control_block; -uint32_t ready; +unsigned long ready;unsigned q; control_block =per_cpu (cpu_control_block, cpu);
Greg Kroah-Hartman
maintainerPATCH 27/140 Revert "HID: microsoft: Add IDs for Surface Type/Touch Cover 2"
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Derya <[email protected]>
commit f3b0cbce01cd5c242b420d986b208d306bdc5083 upstream.
This reverts commit 117309c51dca42121f70cacec801511b76acf75c.
The MS Surface Pro 2 has an USB composite device with 3 interfaces
- interface 0 - sensor hub
- interface 1 - wacom digitizer
- interface 2 - the keyboard cover, if one is attached
This USB composite device changes it product id dependent on if and which keyboard cover is attached. Adding the covers to hid_have_special_driver prevents loading the right hid drivers for the other two interfaces, all 3 get loaded with hid-microsoft. We don't even need hid-microsoft for the keyboards. We have to revert this to load the right hid modules for each interface.
--- drivers/hid/hid-core.c | 2 -- drivers/hid/hid-ids.h | 2 -- drivers/hid/hid-microsoft.c | 4 ---- 3 files changed, 8 deletions(-)
drivers/hid/hid-core.c +0 -2
@@ -1780,8 +1780,6 @@ static const struct hid_device_id hid_ha { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) }, - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2) }, - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2) }, { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) }, { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) }, { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1) },
drivers/hid/hid-ids.h +0 -2
@@ -624,8 +624,6 @@#define USB_DEVICE_ID_MS_PRESENTER_8K_USB 0x0713#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K 0x0730#define USB_DEVICE_ID_MS_COMFORT_MOUSE_4500 0x076c -#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7 -#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9#define USB_VENDOR_ID_MOJO 0x8282#define USB_DEVICE_ID_RETRO_ADAPTER 0x3201
drivers/hid/hid-microsoft.c +0 -4
@@ -208,10 +208,6 @@ static const struct hid_device_id ms_dev .driver_data = MS_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500), .driver_data = MS_DUPLICATE_USAGES }, - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2), - .driver_data = 0 }, - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2), - .driver_data = 0 }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT), .driver_data = MS_PRESENTER },
Greg Kroah-Hartman
maintainerPATCH 28/140 HID: core: do not scan constant input report
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Tissoires <[email protected]>
commit e24d0d399b2fce71b627043e900ef28283850482 upstream.
The Microsoft Surface Type/Touch Cover 2 is a fancy device which advertised itself as a multitouch device but with constant input reports. This way, hid_scan_report() gives the group MULTITOUCH to it, but hid-multitouch can not handle it due to the constant collection ignored by hid-input.
To prevent such crap in the future, and while we do not fix this particular device, make the scan_report coherent with hid-input.c, and ignore constant input reports.
--- drivers/hid/hid-core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/hid/hid-core.c +3 -0
@@ -718,6 +718,9 @@ static int hid_scan_main(struct hid_parscase HID_MAIN_ITEM_TAG_END_COLLECTION :break ;case HID_MAIN_ITEM_TAG_INPUT : +/* ignore constant inputs, they will be ignored by hid-input */ +if (data &HID_MAIN_ITEM_CONSTANT ) +break ;for (i =0 ; i < parser->local.usage_index; i++)hid_scan_input_usage (parser, parser->local.usage[i]);break ;
Greg Kroah-Hartman
maintainerPATCH 29/140 HID: add NO_INIT_REPORTS quirk for Synaptics Touch Pad V 103S
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 2f433083e854ec72c19dc9b0e1cebcc8e230fd75 upstream.
This touchpad seriously dislikes init reports, not only timeing out, but also refusing to work after this.
--- drivers/hid/hid-ids.h | 1 + drivers/hid/usbhid/hid-quirks.c | 1 + 2 files changed, 2 insertions(+)
drivers/hid/hid-ids.h +1 -0
@@ -828,6 +828,7 @@#define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10#define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3#define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3 +#define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710#define USB_VENDOR_ID_THINGM 0x27b8#define USB_DEVICE_ID_BLINK1 0x01ed
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -119,6 +119,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS2, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_HD, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_QUAD_HD, HID_QUIRK_NO_INIT_REPORTS }, + { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP_V103, HID_QUIRK_NO_INIT_REPORTS }, { 0, 0 } };
Greg Kroah-Hartman
maintainerPATCH 30/140 md/raid1: r1buf_pool_alloc: free allocate pages when subsequent allocation fails.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit da1aab3dca9aa88ae34ca392470b8943159e25fe upstream.
When performing a user-request check/repair (MD_RECOVERY_REQUEST is set) on a raid1, we allocate multiple bios each with their own set of pages.
If the page allocations for one bio fails, we currently do *not* free the pages allocated for the previous bios, nor do we free the bio itself.
This patch frees all the already-allocate pages, and makes sure that all the bios are freed as well.
This bug can cause a memory leak which can ultimately OOM a machine. It was introduced in 3.10-rc1.
--- drivers/md/raid1.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/md/raid1.c +13 -4
@@ -97,6 +97,7 @@ static void * r1buf_pool_alloc(gfp_t gfpstruct pool_info *pi = data;struct r1bio *r1_bio;struct bio *bio; +int need_pages;int i, j; r1_bio =r1bio_pool_alloc (gfp_flags, pi);
@@ -119,15 +120,15 @@ static void * r1buf_pool_alloc(gfp_t gfp* RESYNC_PAGES for each bio. */ if (test_bit (MD_RECOVERY_REQUESTED , &pi->mddev->recovery)) - j = pi->raid_disks; + need_pages = pi->raid_disks;else - j =1 ; -while (j--) { + need_pages =1 ; +for (j =0 ; j < need_pages; j++) { bio = r1_bio->bios[j]; bio->bi_vcnt =RESYNC_PAGES ;if (bio_alloc_pages (bio, gfp_flags)) - goto out_free_bio; + goto out_free_pages; }/* If not user-requests, copy the page pointers to all bios */ if (!test_bit (MD_RECOVERY_REQUESTED , &pi->mddev->recovery)) {
@@ -141,6 +142,14 @@ static void * r1buf_pool_alloc(gfp_t gfpreturn r1_bio; +out_free_pages: +while (--j >=0 ) { +struct bio_vec *bv; + +bio_for_each_segment_all (bv, r1_bio->bios[j], i) +__free_page (bv->bv_page); + } + out_free_bio:while (++j < pi->raid_disks)bio_put (r1_bio->bios[j]);
Greg Kroah-Hartman
maintainerPATCH 31/140 tracing/uprobes: Fix uprobe_cpu_buffer memory leak
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "zhangwei(Jovi)" <[email protected]>
commit 6ea6215fe394e320468589d9bba464a48f6d823a upstream.
Forgot to free uprobe_cpu_buffer percpu page in uprobe_buffer_disable().
--- kernel/trace/trace_uprobe.c | 6 ++++++ 1 file changed, 6 insertions(+)
kernel/trace/trace_uprobe.c +6 -0
@@ -728,9 +728,15 @@ static int uprobe_buffer_enable(void)static void uprobe_buffer_disable (void ) { +int cpu; +BUG_ON (!mutex_is_locked (&event_mutex));if (--uprobe_buffer_refcnt ==0 ) { +for_each_possible_cpu (cpu) +free_page ((unsigned long )per_cpu_ptr (uprobe_cpu_buffer, + cpu)->buf); +free_percpu (uprobe_cpu_buffer); uprobe_cpu_buffer =NULL ; }
Greg Kroah-Hartman
maintainerPATCH 32/140 tracing: Use rcu_dereference_sched() for trace event triggers
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Steven Rostedt (Red Hat)" <[email protected]>
commit 561a4fe851ccab9dd0d14989ab566f9392d9f8b5 upstream.
As trace event triggers are now part of the mainline kernel, I added my trace event trigger tests to my test suite I run on all my kernels. Now these tests get run under different config options, and one of those options is CONFIG_PROVE_RCU, which checks under lockdep that the rcu locking primitives are being used correctly. This triggered the following splat:
===============================
[ INFO: suspicious RCU usage. ]
3.15.0-rc2-test+ #11 Not tainted
-------------------------------kernel/trace/trace_events_trigger.c:80 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
rcu_scheduler_active = 1, debug_locks = 0
4 locks held by swapper/1/0:
#0: ((&(&j_cdbs->work)->timer)){..-...}, at: [<ffffffff8104d2cc>] call_timer_fn+0x5/0x1be
#1: (&(&pool->lock)->rlock){-.-...}, at: [<ffffffff81059856>] __queue_work+0x140/0x283
#2: (&p->pi_lock){-.-.-.}, at: [<ffffffff8106e961>] try_to_wake_up+0x2e/0x1e8
#3: (&rq->lock){-.-.-.}, at: [<ffffffff8106ead3>] try_to_wake_up+0x1a0/0x1e8stack backtrace: CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.15.0-rc2-test+ #11 Hardware name: /DG965MQ, BIOS MQ96510J.86A.0372.2006.0605.1717 06/05/2006 0000000000000001 ffff88007e083b98 ffffffff819f53a5 0000000000000006 ffff88007b0942c0 ffff88007e083bc8 ffffffff81081307 ffff88007ad96d20 0000000000000000 ffff88007af2d840 ffff88007b2e701c ffff88007e083c18 Call Trace: <IRQ> [<ffffffff819f53a5>] dump_stack+0x4f/0x7c [<ffffffff81081307>] lockdep_rcu_suspicious+0x107/0x110 [<ffffffff810ee51c>] event_triggers_call+0x99/0x108 [<ffffffff810e8174>] ftrace_event_buffer_commit+0x42/0xa4 [<ffffffff8106aadc>] ftrace_raw_event_sched_wakeup_template+0x71/0x7c [<ffffffff8106bcbf>] ttwu_do_wakeup+0x7f/0xff [<ffffffff8106bd9b>] ttwu_do_activate.constprop.126+0x5c/0x61 [<ffffffff8106eadf>] try_to_wake_up+0x1ac/0x1e8 [<ffffffff8106eb77>] wake_up_process+0x36/0x3b [<ffffffff810575cc>] wake_up_worker+0x24/0x26 [<ffffffff810578bc>] insert_work+0x5c/0x65 [<ffffffff81059982>] __queue_work+0x26c/0x283 [<ffffffff81059999>] ? __queue_work+0x283/0x283 [<ffffffff810599b7>] delayed_work_timer_fn+0x1e/0x20 [<ffffffff8104d3a6>] call_timer_fn+0xdf/0x1be^M [<ffffffff8104d2cc>] ? call_timer_fn+0x5/0x1be [<ffffffff81059999>] ? __queue_work+0x283/0x283 [<ffffffff8104d823>] run_timer_softirq+0x1a4/0x22f^M [<ffffffff8104696d>] __do_softirq+0x17b/0x31b^M [<ffffffff81046d03>] irq_exit+0x42/0x97 [<ffffffff81a08db6>] smp_apic_timer_interrupt+0x37/0x44 [<ffffffff81a07a2f>] apic_timer_interrupt+0x6f/0x80 <EOI> [<ffffffff8100a5d8>] ? default_idle+0x21/0x32 [<ffffffff8100a5d6>] ? default_idle+0x1f/0x32 [<ffffffff8100ac10>] arch_cpu_idle+0xf/0x11 [<ffffffff8107b3a4>] cpu_startup_entry+0x1a3/0x213 [<ffffffff8102a23c>] start_secondary+0x212/0x219
The cause is that the triggers are protected by rcu_read_lock_sched() but the data is dereferenced with rcu_dereference() which expects it to be protected with rcu_read_lock(). The proper reference should be rcu_dereference_sched().
--- kernel/trace/trace_events_trigger.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace_events_trigger.c +1 -1
@@ -77,7 +77,7 @@ event_triggers_call(struct ftrace_event_ data->ops->func (data);continue ; } - filter =rcu_dereference (data->filter); + filter =rcu_dereference_sched (data->filter);if (filter && !filter_match_preds (filter, rec))continue ;if (data->cmd_ops->post_trigger) {
Greg Kroah-Hartman
maintainerPATCH 33/140 init/Kconfig: move the trusted keyring config option to general setup
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Foley <[email protected]>
commit 82c04ff89eba09d0e46e3f3649c6d3aa18e764a0 upstream.
The SYSTEM_TRUSTED_KEYRING config option is not in any menu, causing it to show up in the toplevel of the kernel configuration. Fix this by moving it under the General Setup menu.
--- init/Kconfig | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
init/Kconfig +12 -12
@@ -1621,6 +1621,18 @@ config MMAP_ALLOW_UNINITIALIZED See Documentation/nommu-mmap.txt for more information. +config SYSTEM_TRUSTED_KEYRING + bool "Provide system-wide ring of trusted keys" + depends on KEYS + help + Provide a system keyring to which trusted keys can be added. Keys in + the keyring are considered to be trusted. Keys may be added at will + by the kernel from compiled-in data and from hardware key stores, but + userspace may only add extra keys if those keys can be verified by + keys already in the keyring. + + Keys in this keyring are used by module signature checking. + config PROFILING bool "Profiling support" help
@@ -1656,18 +1668,6 @@ config BASE_SMALL default 0 if BASE_FULL default 1 if !BASE_FULL -config SYSTEM_TRUSTED_KEYRING - bool "Provide system-wide ring of trusted keys" - depends on KEYS - help - Provide a system keyring to which trusted keys can be added. Keys in - the keyring are considered to be trusted. Keys may be added at will - by the kernel from compiled-in data and from hardware key stores, but - userspace may only add extra keys if those keys can be verified by - keys already in the keyring. - - Keys in this keyring are used by module signature checking. - menuconfig MODULES bool "Enable loadable module support" option modules
Greg Kroah-Hartman
maintainerPATCH 34/140 thp: close race between split and zap huge pages
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Kirill A. Shutemov" <[email protected]>
commit b5a8cad376eebbd8598642697e92a27983aee802 upstream.
Sasha Levin has reported two THP BUGs[1][2]. I believe both of them have the same root cause. Let's look to them one by one.
The first bug[1] is "kernel BUG at mm/huge_memory.c:1829!". It's BUG_ON(mapcount != page_mapcount(page)) in __split_huge_page(). From my testing I see that page_mapcount() is higher than mapcount here.
I think it happens due to race between zap_huge_pmd() and page_check_address_pmd(). page_check_address_pmd() misses PMD which is under zap:
CPU0 CPU1
zap_huge_pmd()
pmdp_get_and_clear()
__split_huge_page()
anon_vma_interval_tree_foreach()
__split_huge_page_splitting()
page_check_address_pmd()
mm_find_pmd()
/*
* We check if PMD present without taking ptl: no
* serialization against zap_huge_pmd(). We miss this PMD,
* it's not accounted to 'mapcount' in __split_huge_page().
*/
pmd_present(pmd) == 0 BUG_ON(mapcount != page_mapcount(page)) // CRASH!!!
page_remove_rmap(page) atomic_add_negative(-1, &page->_mapcount)
The second bug[2] is "kernel BUG at mm/huge_memory.c:1371!". It's VM_BUG_ON_PAGE(!PageHead(page), page) in zap_huge_pmd().
This happens in similar way:
CPU0 CPU1
zap_huge_pmd()
pmdp_get_and_clear()
page_remove_rmap(page)
atomic_add_negative(-1, &page->_mapcount)
__split_huge_page()
anon_vma_interval_tree_foreach()
__split_huge_page_splitting()
page_check_address_pmd()
mm_find_pmd()
pmd_present(pmd) == 0 /* The same comment as above */ /*
* No crash this time since we already decremented page->_mapcount in
* zap_huge_pmd().
*/
BUG_ON(mapcount != page_mapcount(page))
/*
* We split the compound page here into small pages without
* serialization against zap_huge_pmd()
*/
__split_huge_page_refcount()
VM_BUG_ON_PAGE(!PageHead(page), page); // CRASH!!!
So my understanding the problem is pmd_present() check in mm_find_pmd() without taking page table lock.
The bug was introduced by me commit with commit 117b0791ac42. Sorry for that. :(
Let's open code mm_find_pmd() in page_check_address_pmd() and do the check under page table lock.
Note that __page_check_address() does the same for PTE entires if sync != 0.
I've stress tested split and zap code paths for 36+ hours by now and don't see crashes with the patch applied. Before it took <20 min to trigger the first bug and few hours for second one (if we ignore first).
[1] https://lkml.kernel.org/g/<[email protected]>
[2] https://lkml.kernel.org/g/<[email protected]>
--- mm/huge_memory.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
mm/huge_memory.c +10 -3
@@ -1611,16 +1611,23 @@ pmd_t *page_check_address_pmd(struct pagenum page_check_address_pmd_flag flag, spinlock_t **ptl) { + pgd_t *pgd; +pud_t *pud;pmd_t *pmd;if (address & ~HPAGE_PMD_MASK )return NULL ; - pmd =mm_find_pmd (mm, address); -if (!pmd) + pgd =pgd_offset (mm, address); +if (!pgd_present (*pgd))return NULL ; + pud =pud_offset (pgd, address); +if (!pud_present (*pud)) +return NULL ; + pmd =pmd_offset (pud, address); + *ptl =pmd_lock (mm, pmd); -if (pmd_none (*pmd)) +if (!pmd_present (*pmd)) goto unlock;if (pmd_page (*pmd) != page) goto unlock;
Greg Kroah-Hartman
maintainerPATCH 35/140 mm/hugetlb.c: add cond_resched_lock() in return_unused_surplus_pages()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Mizuma, Masayoshi" <[email protected]>
commit 7848a4bf51b34f41fcc9bd77e837126d99ae84e3 upstream.
soft lockup in freeing gigantic hugepage fixed in commit 55f67141a892 "mm:
hugetlb: fix softlockup when a large number of hugepages are freed." can happen in return_unused_surplus_pages(), so let's fix it.
--- mm/hugetlb.c | 1 + 1 file changed, 1 insertion(+)
mm/hugetlb.c +1 -0
@@ -1134,6 +1134,7 @@ static void return_unused_surplus_pages(while (nr_pages--) {if (!free_pool_huge_page (h, &node_states[N_MEMORY ],1 ))break ; +cond_resched_lock (&hugetlb_lock); } }
Greg Kroah-Hartman
maintainerPATCH 36/140 mm: use paravirt friendly ops for NUMA hinting ptes
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mel Gorman <[email protected]>
commit 29c7787075c92ca8af353acd5301481e6f37082f upstream.
David Vrabel identified a regression when using automatic NUMA balancing under Xen whereby page table entries were getting corrupted due to the use of native PTE operations. Quoting him
Xen PV guest page tables require that their entries use machine addresses if the preset bit (_PAGE_PRESENT) is set, and (for successful migration) non-present PTEs must use pseudo-physical addresses. This is because on migration MFNs in present PTEs are translated to PFNs (canonicalised) so they may be translated back to the new MFN in the destination domain (uncanonicalised).
pte_mknonnuma(), pmd_mknonnuma(), pte_mknuma() and pmd_mknuma() set and clear the _PAGE_PRESENT bit using pte_set_flags(), pte_clear_flags(), etc.
In a Xen PV guest, these functions must translate MFNs to PFNs when clearing _PAGE_PRESENT and translate PFNs to MFNs when setting _PAGE_PRESENT.
His suggested fix converted p[te|md]_[set|clear]_flags to using paravirt-friendly ops but this is overkill. He suggested an alternative of using p[te|md]_modify in the NUMA page table operations but this is does more work than necessary and would require looking up a VMA for protections.
This patch modifies the NUMA page table operations to use paravirt friendly operations to set/clear the flags of interest. Unfortunately this will take a performance hit when updating the PTEs on CONFIG_PARAVIRT but I do not see a way around it that does not break Xen.
--- include/asm-generic/pgtable.h | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-)
include/asm-generic/pgtable.h +23 -8
@@ -680,24 +680,35 @@ static inline int pmd_numa(pmd_t pmd)#ifndef pte_mknonnumastatic inline pte_t pte_mknonnuma (pte_t pte) { - pte =pte_clear_flags (pte, _PAGE_NUMA); -return pte_set_flags (pte, _PAGE_PRESENT|_PAGE_ACCESSED); +pteval_t val =pte_val (pte); + + val &= ~_PAGE_NUMA; + val |= (_PAGE_PRESENT|_PAGE_ACCESSED); +return __pte (val); }#endif #ifndef pmd_mknonnumastatic inline pmd_t pmd_mknonnuma (pmd_t pmd) { - pmd =pmd_clear_flags (pmd, _PAGE_NUMA); -return pmd_set_flags (pmd, _PAGE_PRESENT|_PAGE_ACCESSED); +pmdval_t val =pmd_val (pmd); + + val &= ~_PAGE_NUMA; + val |= (_PAGE_PRESENT|_PAGE_ACCESSED); + +return __pmd (val); }#endif #ifndef pte_mknumastatic inline pte_t pte_mknuma (pte_t pte) { - pte =pte_set_flags (pte, _PAGE_NUMA); -return pte_clear_flags (pte, _PAGE_PRESENT); +pteval_t val =pte_val (pte); + + val &= ~_PAGE_PRESENT; + val |= _PAGE_NUMA; + +return __pte (val); }#endif
@@ -716,8 +727,12 @@ static inline void ptep_set_numa(struct#ifndef pmd_mknumastatic inline pmd_t pmd_mknuma (pmd_t pmd) { - pmd =pmd_set_flags (pmd, _PAGE_NUMA); -return pmd_clear_flags (pmd, _PAGE_PRESENT); +pmdval_t val =pmd_val (pmd); + + val &= ~_PAGE_PRESENT; + val |= _PAGE_NUMA; + +return __pmd (val); }#endif
Greg Kroah-Hartman
maintainerPATCH 37/140 USB: cdc-acm: Remove Motorola/Telit H24 serial interfaces from ACM driver
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ulbricht <[email protected]>
commit 895d240d1db0b2736d779200788e4c4aea28a0c6 upstream.
By specifying NO_UNION_NORMAL the ACM driver does only use the first two USB interfaces (modem data & control). The AT Port, Diagnostic and NMEA interfaces are left to the USB serial driver.
--- drivers/usb/class/cdc-acm.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
drivers/usb/class/cdc-acm.c +21 -7
@@ -1652,13 +1652,27 @@ static const struct usb_device_id acm_id },/* Motorola H24 HSPA module: */ { USB_DEVICE(0x22b8, 0x2d91) }, /* modem */ - { USB_DEVICE(0x22b8, 0x2d92) }, /* modem + diagnostics */ - { USB_DEVICE(0x22b8, 0x2d93) }, /* modem + AT port */ - { USB_DEVICE(0x22b8, 0x2d95) }, /* modem + AT port + diagnostics */ - { USB_DEVICE(0x22b8, 0x2d96) }, /* modem + NMEA */ - { USB_DEVICE(0x22b8, 0x2d97) }, /* modem + diagnostics + NMEA */ - { USB_DEVICE(0x22b8, 0x2d99) }, /* modem + AT port + NMEA */ - { USB_DEVICE(0x22b8, 0x2d9a) }, /* modem + AT port + diagnostics + NMEA */ + { USB_DEVICE(0x22b8, 0x2d92), /* modem + diagnostics */ + .driver_info =NO_UNION_NORMAL ,/* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d93), /* modem + AT port */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d95), /* modem + AT port + diagnostics */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d96), /* modem + NMEA */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d97), /* modem + diagnostics + NMEA */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d99), /* modem + AT port + NMEA */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d9a), /* modem + AT port + diagnostics + NMEA */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on
Greg Kroah-Hartman
maintainerPATCH 38/140 USB: cp210x: Add 8281 (Nanotec Plug & Drive)
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tristan Bruns <[email protected]>
commit 72b3007951010ce1bbf950e23b19d9839fa905a5 upstream.
--- drivers/usb/serial/cp210x.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/cp210x.c +1 -0
@@ -104,6 +104,7 @@ static const struct usb_device_id id_tab { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */ { USB_DEVICE(0x10C4, 0x822B) }, /* Modem EDGE(GSM) Comander 2 */ { USB_DEVICE(0x10C4, 0x826B) }, /* Cygnal Integrated Products, Inc., Fasttrax GPS demonstration module */ + { USB_DEVICE(0x10C4, 0x8281) }, /* Nanotec Plug & Drive */ { USB_DEVICE(0x10C4, 0x8293) }, /* Telegesis ETRX2USB */ { USB_DEVICE(0x10C4, 0x82F9) }, /* Procyon AVS */ { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */
Greg Kroah-Hartman
maintainerPATCH 39/140 USB: usb_wwan: fix handling of missing bulk endpoints
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit bd73bd8831696f189a479a0712ae95208e513d7e upstream.
Fix regression introduced by commit 8e493ca1767d ("USB: usb_wwan: fix bulk-urb allocation") by making sure to require both bulk-in and out endpoints during port probe.
The original option driver (which usb_wwan is based on) was written under the assumption that either endpoint could be missing, but evidently this cannot have been tested properly. Specifically, it would handle opening a device without bulk-in (but would blow up during resume which was implemented later), but not a missing bulk-out in write() (although it is handled in some places such as write_room()).
Fortunately (?), the driver also got the test for missing endpoints wrong so the urbs were in fact always allocated, although they would be initialised using the wrong endpoint address (0) and any submission of such an urb would fail.
The commit mentioned above fixed the test for missing endpoints but thereby exposed the other bugs which would now generate null-pointer exceptions rather than failed urb submissions.
The regression was introduced in v3.7, but the offending commit was also marked for stable.
--- drivers/usb/serial/usb_wwan.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/usb/serial/usb_wwan.c +3 -6
@@ -466,6 +466,9 @@ int usb_wwan_port_probe(struct usb_seriaint err;int i; +if (!port->bulk_in_size || !port->bulk_out_size) +return -ENODEV ; + portdata =kzalloc (sizeof (*portdata),GFP_KERNEL );if (!portdata)return -ENOMEM ;
@@ -473,9 +476,6 @@ int usb_wwan_port_probe(struct usb_seriainit_usb_anchor (&portdata->delayed);for (i =0 ; i <N_IN_URB ; i++) { -if (!port->bulk_in_size) -break ; - buffer = (u8 *)__get_free_page (GFP_KERNEL );if (!buffer) goto bail_out_error;
@@ -489,9 +489,6 @@ int usb_wwan_port_probe(struct usb_seria }for (i =0 ; i <N_OUT_URB ; i++) { -if (!port->bulk_out_size) -break ; - buffer =kmalloc (OUT_BUFLEN ,GFP_KERNEL );if (!buffer) goto bail_out_error2;
Greg Kroah-Hartman
maintainerPATCH 40/140 USB: serial: ftdi_sio: add id for Brainboxes serial cards
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michele Baldessari <[email protected]>
commit efe26e16b1d93ac0085e69178cc18811629e8fc5 upstream.
Custom VID/PIDs for Brainboxes cards as reported in
https://bugzilla.redhat.com/show_bug.cgi?id=1071914
--- drivers/usb/serial/ftdi_sio.c | 33 +++++++++++++++++++++++++++++++++ drivers/usb/serial/ftdi_sio_ids.h | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+)
drivers/usb/serial/ftdi_sio.c +33 -0
@@ -909,6 +909,39 @@ static const struct usb_device_id id_tab { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) },/* Cressi Devices */ { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) }, +/* Brainboxes Devices */ + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_001_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_012_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_023_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_034_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_101_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_3_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_4_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_5_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_6_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_7_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_8_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_257_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_3_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_4_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_313_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_324_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_357_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_3_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) }, { } /* Terminating entry */ };
drivers/usb/serial/ftdi_sio_ids.h +37 -0
@@ -1326,3 +1326,40 @@* Manufacturer: Cressi */ #define FTDI_CRESSI_PID 0x87d0 + +/* +* Brainboxes devices +*/ +#define BRAINBOXES_VID 0x05d1 +#define BRAINBOXES_VX_001_PID 0x1001/* VX-001 ExpressCard 1 Port RS232 */ +#define BRAINBOXES_VX_012_PID 0x1002/* VX-012 ExpressCard 2 Port RS232 */ +#define BRAINBOXES_VX_023_PID 0x1003/* VX-023 ExpressCard 1 Port RS422/485 */ +#define BRAINBOXES_VX_034_PID 0x1004/* VX-034 ExpressCard 2 Port RS422/485 */ +#define BRAINBOXES_US_101_PID 0x1011/* US-101 1xRS232 */ +#define BRAINBOXES_US_324_PID 0x1013/* US-324 1xRS422/485 1Mbaud */ +#define BRAINBOXES_US_606_1_PID 0x2001/* US-606 6 Port RS232 Serial Port 1 and 2 */ +#define BRAINBOXES_US_606_2_PID 0x2002/* US-606 6 Port RS232 Serial Port 3 and 4 */ +#define BRAINBOXES_US_606_3_PID 0x2003/* US-606 6 Port RS232 Serial Port 4 and 6 */ +#define BRAINBOXES_US_701_1_PID 0x2011/* US-701 4xRS232 1Mbaud Port 1 and 2 */ +#define BRAINBOXES_US_701_2_PID 0x2012/* US-701 4xRS422 1Mbaud Port 3 and 4 */ +#define BRAINBOXES_US_279_1_PID 0x2021/* US-279 8xRS422 1Mbaud Port 1 and 2 */ +#define BRAINBOXES_US_279_2_PID 0x2022/* US-279 8xRS422 1Mbaud Port 3 and 4 */ +#define BRAINBOXES_US_279_3_PID 0x2023/* US-279 8xRS422 1Mbaud Port 5 and 6 */ +#define BRAINBOXES_US_279_4_PID 0x2024/* US-279 8xRS422 1Mbaud Port 7 and 8 */ +#define BRAINBOXES_US_346_1_PID 0x3011/* US-346 4xRS422/485 1Mbaud Port 1 and 2 */ +#define BRAINBOXES_US_346_2_PID 0x3012/* US-346 4xRS422/485 1Mbaud Port 3 and 4 */ +#define BRAINBOXES_US_257_PID 0x5001/* US-257 2xRS232 1Mbaud */ +#define BRAINBOXES_US_313_PID 0x6001/* US-313 2xRS422/485 1Mbaud */ +#define BRAINBOXES_US_357_PID 0x7001/* US_357 1xRS232/422/485 */ +#define BRAINBOXES_US_842_1_PID 0x8001/* US-842 8xRS422/485 1Mbaud Port 1 and 2 */ +#define BRAINBOXES_US_842_2_PID 0x8002/* US-842 8xRS422/485 1Mbaud Port 3 and 4 */ +#define BRAINBOXES_US_842_3_PID 0x8003/* US-842 8xRS422/485 1Mbaud Port 5 and 6 */ +#define BRAINBOXES_US_842_4_PID 0x8004/* US-842 8xRS422/485 1Mbaud Port 7 and 8 */ +#define BRAINBOXES_US_160_1_PID 0x9001/* US-160 16xRS232 1Mbaud Port 1 and 2 */ +#define BRAINBOXES_US_160_2_PID 0x9002/* US-160 16xRS232 1Mbaud Port 3 and 4 */ +#define BRAINBOXES_US_160_3_PID 0x9003/* US-160 16xRS232 1Mbaud Port 5 and 6 */ +#define BRAINBOXES_US_160_4_PID 0x9004/* US-160 16xRS232 1Mbaud Port 7 and 8 */ +#define BRAINBOXES_US_160_5_PID 0x9005/* US-160 16xRS232 1Mbaud Port 9 and 10 */ +#define BRAINBOXES_US_160_6_PID 0x9006/* US-160 16xRS232 1Mbaud Port 11 and 12 */ +#define BRAINBOXES_US_160_7_PID 0x9007/* US-160 16xRS232 1Mbaud Port 13 and 14 */ +#define BRAINBOXES_US_160_8_PID 0x9008/* US-160 16xRS232 1Mbaud Port 15 and 16 */
Greg Kroah-Hartman
maintainerPATCH 41/140 usb: option driver, add support for Telit UE910v2
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniele Palmas <[email protected]>
commit d6de486bc22255779bd54b0fceb4c240962bf146 upstream.
option driver, added VID/PID for Telit UE910v2 modem
--- drivers/usb/serial/option.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/serial/option.c +2 -0
@@ -243,6 +243,7 @@ static void option_instat_callback(struc#define TELIT_PRODUCT_CC864_DUAL 0x1005#define TELIT_PRODUCT_CC864_SINGLE 0x1006#define TELIT_PRODUCT_DE910_DUAL 0x1010 +#define TELIT_PRODUCT_UE910_V2 0x1012#define TELIT_PRODUCT_LE920 0x1200/* ZTE PRODUCTS */
@@ -1041,6 +1042,7 @@ static const struct usb_device_id option { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UE910_V2) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), .driver_info = (kernel_ulong_t)&telit_le920_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */
Greg Kroah-Hartman
maintainerPATCH 42/140 Revert "USB: serial: add usbid for dell wwan card to sierra.c"
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 2e01280d2801c72878cf3a7119eac30077b463d5 upstream.
This reverts commit 1ebca9dad5abe8b2ed4dbd186cd657fb47c1f321.
This device was erroneously added to the sierra driver even though it's not a Sierra device and was already handled by the option driver.
--- drivers/usb/serial/sierra.c | 1 - 1 file changed, 1 deletion(-)
drivers/usb/serial/sierra.c +0 -1
@@ -291,7 +291,6 @@ static const struct usb_device_id id_tab { USB_DEVICE(0x0f3d, 0x68A3), /* Airprime/Sierra Wireless Direct IP modems */ .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist }, - { USB_DEVICE(0x413C, 0x08133) }, /* Dell Computer Corp. Wireless 5720 VZW Mobile Broadband (EVDO Rev-A) Minicard GPS Port */ { } };
Greg Kroah-Hartman
maintainerPATCH 43/140 USB: serial: fix sysfs-attribute removal deadlock
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 10164c2ad6d2c16809f6c09e278f946e47801b3a upstream.
Fix driver new_id sysfs-attribute removal deadlock by making sure to not hold any locks that the attribute operations grab when removing the attribute.
Specifically, usb_serial_deregister holds the table mutex when deregistering the driver, which includes removing the new_id attribute. This can lead to a deadlock as writing to new_id increments the attribute's active count before trying to grab the same mutex in usb_serial_probe.
The deadlock can easily be triggered by inserting a sleep in usb_serial_deregister and writing the id of an unbound device to new_id during module unload.
As the table mutex (in this case) is used to prevent subdriver unload during probe, it should be sufficient to only hold the lock while manipulating the usb-serial driver list during deregister. A racing probe will then either fail to find a matching subdriver or fail to get the corresponding module reference.
Since v3.15-rc1 this also triggers the following lockdep warning:
======================================================
[ INFO: possible circular locking dependency detected ]
3.15.0-rc2 #123 Tainted: G W
-------------------------------------------------------
modprobe/190 is trying to acquire lock:
(s_active#4){++++.+}, at: [<c0167aa0>] kernfs_remove_by_name_ns+0x4c/0x94
but task is already holding lock:
(table_lock){+.+.+.}, at: [<bf004d84>] usb_serial_deregister+0x3c/0x78 [usbserial]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (table_lock){+.+.+.}:
[<c0075f84>] __lock_acquire+0x1694/0x1ce4
[<c0076de8>] lock_acquire+0xb4/0x154
[<c03af3cc>] _raw_spin_lock+0x4c/0x5c
[<c02bbc24>] usb_store_new_id+0x14c/0x1ac
[<bf007eb4>] new_id_store+0x68/0x70 [usbserial]
[<c025f568>] drv_attr_store+0x30/0x3c
[<c01690e0>] sysfs_kf_write+0x5c/0x60
[<c01682c0>] kernfs_fop_write+0xd4/0x194
[<c010881c>] vfs_write+0xbc/0x198
[<c0108e4c>] SyS_write+0x4c/0xa0
[<c000f880>] ret_fast_syscall+0x0/0x48-> #0 (s_active#4){++++.+}:
[<c03a7a28>] print_circular_bug+0x68/0x2f8
[<c0076218>] __lock_acquire+0x1928/0x1ce4
[<c0076de8>] lock_acquire+0xb4/0x154
[<c0166b70>] __kernfs_remove+0x254/0x310
[<c0167aa0>] kernfs_remove_by_name_ns+0x4c/0x94
[<c0169fb8>] remove_files.isra.1+0x48/0x84
[<c016a2fc>] sysfs_remove_group+0x58/0xac
[<c016a414>] sysfs_remove_groups+0x34/0x44
[<c02623b8>] driver_remove_groups+0x1c/0x20
[<c0260e9c>] bus_remove_driver+0x3c/0xe4
[<c026235c>] driver_unregister+0x38/0x58
[<bf007fb4>] usb_serial_bus_deregister+0x84/0x88 [usbserial]
[<bf004db4>] usb_serial_deregister+0x6c/0x78 [usbserial]
[<bf005330>] usb_serial_deregister_drivers+0x2c/0x4c [usbserial]
[<bf016618>] usb_serial_module_exit+0x14/0x1c [sierra]
[<c009d6cc>] SyS_delete_module+0x184/0x210
[<c000f880>] ret_fast_syscall+0x0/0x48other info that might help us debug this:
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(table_lock);
lock(s_active#4);
lock(table_lock); lock(s_active#4);
*** DEADLOCK ***
1 lock held by modprobe/190:
#0: (table_lock){+.+.+.}, at: [<bf004d84>] usb_serial_deregister+0x3c/0x78 [usbserial]
stack backtrace: CPU: 0 PID: 190 Comm: modprobe Tainted: G W 3.15.0-rc2 #123 [<c0015e10>] (unwind_backtrace) from [<c0013728>] (show_stack+0x20/0x24) [<c0013728>] (show_stack) from [<c03a9a54>] (dump_stack+0x24/0x28) [<c03a9a54>] (dump_stack) from [<c03a7cac>] (print_circular_bug+0x2ec/0x2f8) [<c03a7cac>] (print_circular_bug) from [<c0076218>] (__lock_acquire+0x1928/0x1ce4) [<c0076218>] (__lock_acquire) from [<c0076de8>] (lock_acquire+0xb4/0x154) [<c0076de8>] (lock_acquire) from [<c0166b70>] (__kernfs_remove+0x254/0x310) [<c0166b70>] (__kernfs_remove) from [<c0167aa0>] (kernfs_remove_by_name_ns+0x4c/0x94) [<c0167aa0>] (kernfs_remove_by_name_ns) from [<c0169fb8>] (remove_files.isra.1+0x48/0x84) [<c0169fb8>] (remove_files.isra.1) from [<c016a2fc>] (sysfs_remove_group+0x58/0xac) [<c016a2fc>] (sysfs_remove_group) from [<c016a414>] (sysfs_remove_groups+0x34/0x44) [<c016a414>] (sysfs_remove_groups) from [<c02623b8>] (driver_remove_groups+0x1c/0x20) [<c02623b8>] (driver_remove_groups) from [<c0260e9c>] (bus_remove_driver+0x3c/0xe4) [<c0260e9c>] (bus_remove_driver) from [<c026235c>] (driver_unregister+0x38/0x58) [<c026235c>] (driver_unregister) from [<bf007fb4>] (usb_serial_bus_deregister+0x84/0x88 [usbserial]) [<bf007fb4>] (usb_serial_bus_deregister [usbserial]) from [<bf004db4>] (usb_serial_deregister+0x6c/0x78 [usbserial]) [<bf004db4>] (usb_serial_deregister [usbserial]) from [<bf005330>] (usb_serial_deregister_drivers+0x2c/0x4c [usbserial]) [<bf005330>] (usb_serial_deregister_drivers [usbserial]) from [<bf016618>] (usb_serial_module_exit+0x14/0x1c [sierra]) [<bf016618>] (usb_serial_module_exit [sierra]) from [<c009d6cc>] (SyS_delete_module+0x184/0x210) [<c009d6cc>] (SyS_delete_module) from [<c000f880>] (ret_fast_syscall+0x0/0x48)
--- drivers/usb/serial/usb-serial.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/serial/usb-serial.c +3 -1
@@ -1348,10 +1348,12 @@ static int usb_serial_register(struct usstatic void usb_serial_deregister (struct usb_serial_driver *device) {pr_info ("USB Serial deregistering driver %s\n" , device->description); +mutex_lock (&table_lock);list_del (&device->driver_list); -usb_serial_bus_deregister (device);mutex_unlock (&table_lock); + +usb_serial_bus_deregister (device); }/**
Greg Kroah-Hartman
maintainerPATCH 44/140 USB: io_ti: fix firmware download on big-endian machines
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 5509076d1b4485ce9fb07705fcbcd2695907ab5b upstream.
During firmware download the device expects memory addresses in big-endian byte order. As the wIndex parameter which hold the address is sent in little-endian byte order regardless of host byte order, we need to use swab16 rather than cpu_to_be16.
Also make sure to handle the struct ti_i2c_desc size parameter which is returned in little-endian byte order.
--- drivers/usb/serial/io_ti.c | 50 +++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 17 deletions(-)
drivers/usb/serial/io_ti.c +33 -17
@@ -28,6 +28,7 @@#include <linux/spinlock.h> #include <linux/mutex.h> #include <linux/serial.h> +#include <linux/swab.h> #include <linux/kfifo.h> #include <linux/ioctl.h> #include <linux/firmware.h>
@@ -280,7 +281,7 @@ static int read_download_mem(struct usb_ {int status =0 ;__u8 read_length; -__be16 be_start_address; +u16 be_start_address;dev_dbg (&dev->dev,"%s - @ %x for %d\n" , __func__, start_address, length);
@@ -296,10 +297,14 @@ static int read_download_mem(struct usb_if (read_length >1 ) {dev_dbg (&dev->dev,"%s - @ %x for %d\n" , __func__, start_address, read_length); } - be_start_address =cpu_to_be16 (start_address); +/* +* NOTE: Must use swab as wIndex is sent in little-endian +* byte order regardless of host byte order. +*/ + be_start_address =swab16 ((u16 )start_address); status =ti_vread_sync (dev,UMPC_MEMORY_READ , (__u16 )address_type, - (__force __u16 )be_start_address, + be_start_address, buffer, read_length);if (status) {
@@ -394,7 +399,7 @@ static int write_i2c_mem(struct edgeportstruct device *dev = &serial->serial->dev->dev;int status =0 ;int write_length; -__be16 be_start_address; +u16 be_start_address;/* We can only send a maximum of 1 aligned byte page at a time */
@@ -409,11 +414,16 @@ static int write_i2c_mem(struct edgeport __func__, start_address, write_length);usb_serial_debug_data (dev, __func__, write_length, buffer); -/* Write first page */ - be_start_address =cpu_to_be16 (start_address); +/* +* Write first page. +* +* NOTE: Must use swab as wIndex is sent in little-endian byte order +* regardless of host byte order. +*/ + be_start_address =swab16 ((u16 )start_address); status =ti_vsend_sync (serial->serial->dev,UMPC_MEMORY_WRITE , (__u16 )address_type, - (__force __u16 )be_start_address, + be_start_address, buffer, write_length);if (status) {dev_dbg (dev,"%s - ERROR %d\n" , __func__, status);
@@ -436,11 +446,16 @@ static int write_i2c_mem(struct edgeport __func__, start_address, write_length);usb_serial_debug_data (dev, __func__, write_length, buffer); -/* Write next page */ - be_start_address =cpu_to_be16 (start_address); +/* +* Write next page. +* +* NOTE: Must use swab as wIndex is sent in little-endian byte +* order regardless of host byte order. +*/ + be_start_address =swab16 ((u16 )start_address); status =ti_vsend_sync (serial->serial->dev,UMPC_MEMORY_WRITE , (__u16 )address_type, - (__force __u16 )be_start_address, + be_start_address, buffer, write_length);if (status) {dev_err (dev,"%s - ERROR %d\n" , __func__, status);
@@ -585,8 +600,8 @@ static int get_descriptor_addr(struct edif (rom_desc->Type == desc_type)return start_address; - start_address = start_address +sizeof (struct ti_i2c_desc ) - + rom_desc->Size; + start_address = start_address +sizeof (struct ti_i2c_desc ) + +le16_to_cpu (rom_desc->Size); }while ((start_address <TI_MAX_I2C_SIZE ) && rom_desc->Type);
@@ -599,7 +614,7 @@ static int valid_csum(struct ti_i2c_desc__u16 i;__u8 cs =0 ; -for (i =0 ; i < rom_desc->Size; i++) +for (i =0 ; i <le16_to_cpu (rom_desc->Size); i++) cs = (__u8)(cs + buffer[i]);if (cs != rom_desc->CheckSum) {
@@ -650,7 +665,7 @@ static int check_i2c_image(struct edgepobreak ;if ((start_address +sizeof (struct ti_i2c_desc ) + - rom_desc->Size) >TI_MAX_I2C_SIZE ) { +le16_to_cpu (rom_desc->Size)) >TI_MAX_I2C_SIZE ) { status = -ENODEV ;dev_dbg (dev,"%s - structure too big, erroring out.\n" , __func__);break ;
@@ -665,7 +680,8 @@ static int check_i2c_image(struct edgepo/* Read the descriptor data */ status =read_rom (serial, start_address +sizeof (struct ti_i2c_desc ), - rom_desc->Size, buffer); +le16_to_cpu (rom_desc->Size), + buffer);if (status)break ;
@@ -674,7 +690,7 @@ static int check_i2c_image(struct edgepobreak ; } start_address = start_address +sizeof (struct ti_i2c_desc ) + - rom_desc->Size; +le16_to_cpu (rom_desc->Size); }while ((rom_desc->Type !=I2C_DESC_TYPE_ION ) && (start_address <TI_MAX_I2C_SIZE ));
@@ -712,7 +728,7 @@ static int get_manuf_info(struct edgepor/* Read the descriptor data */ status =read_rom (serial, start_address+sizeof (struct ti_i2c_desc ), - rom_desc->Size, buffer); +le16_to_cpu (rom_desc->Size), buffer);if (status) goto exit;
Greg Kroah-Hartman
maintainerPATCH 45/140 usb: qcserial: add Sierra Wireless EM7355
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjørn Mork <[email protected]>
commit a00986f81182a69dee4d2c48e8c19805bdf0f790 upstream.
--- drivers/usb/serial/qcserial.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/qcserial.c +3 -0
@@ -139,6 +139,9 @@ static const struct usb_device_id id_tab {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)}, /* Sierra Wireless EM7700 Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)}, /* Sierra Wireless EM7700 NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)}, /* Sierra Wireless EM7700 Modem */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 0)}, /* Sierra Wireless EM7355 Device Management */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 2)}, /* Sierra Wireless EM7355 NMEA */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 3)}, /* Sierra Wireless EM7355 Modem */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 0)}, /* Netgear AirCard 340U Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 2)}, /* Netgear AirCard 340U NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 3)}, /* Netgear AirCard 340U Modem */
Greg Kroah-Hartman
maintainerPATCH 46/140 usb: qcserial: add Sierra Wireless MC73xx
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjørn Mork <[email protected]>
commit 70a3615fc07c2330ed7c1e922f3c44f4a67c0762 upstream.
--- drivers/usb/serial/qcserial.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/qcserial.c +3 -0
@@ -136,6 +136,9 @@ static const struct usb_device_id id_tab {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 0)}, /* Sierra Wireless MC7710 Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 2)}, /* Sierra Wireless MC7710 NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 3)}, /* Sierra Wireless MC7710 Modem */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 0)}, /* Sierra Wireless MC73xx Device Management */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 2)}, /* Sierra Wireless MC73xx NMEA */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 3)}, /* Sierra Wireless MC73xx Modem */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)}, /* Sierra Wireless EM7700 Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)}, /* Sierra Wireless EM7700 NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)}, /* Sierra Wireless EM7700 Modem */
Greg Kroah-Hartman
maintainerPATCH 47/140 usb: qcserial: add Sierra Wireless MC7305/MC7355
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjørn Mork <[email protected]>
commit bce4f588f19d59fc07fadfeb0b2a3a06c942827a upstream.
--- drivers/usb/serial/qcserial.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/qcserial.c +3 -0
@@ -145,6 +145,9 @@ static const struct usb_device_id id_tab {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 0)}, /* Sierra Wireless EM7355 Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 2)}, /* Sierra Wireless EM7355 NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 3)}, /* Sierra Wireless EM7355 Modem */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 0)}, /* Sierra Wireless MC7305/MC7355 Device Management */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 2)}, /* Sierra Wireless MC7305/MC7355 NMEA */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 3)}, /* Sierra Wireless MC7305/MC7355 Modem */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 0)}, /* Netgear AirCard 340U Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 2)}, /* Netgear AirCard 340U NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 3)}, /* Netgear AirCard 340U Modem */
Greg Kroah-Hartman
maintainerPATCH 48/140 usb: option: add Olivetti Olicard 500
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjørn Mork <[email protected]>
commit 533b3994610f316e5cd61b56d0c4daa15c830f89 upstream.
Device interface layout:
0: ff/ff/ff - serial
1: ff/ff/ff - serial AT+PPP
2: 08/06/50 - storage
3: ff/ff/ff - serial
4: ff/ff/ff - QMI/wwan
--- drivers/usb/serial/option.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/serial/option.c +4 -0
@@ -349,6 +349,7 @@ static void option_instat_callback(struc#define OLIVETTI_PRODUCT_OLICARD100 0xc000#define OLIVETTI_PRODUCT_OLICARD145 0xc003#define OLIVETTI_PRODUCT_OLICARD200 0xc005 +#define OLIVETTI_PRODUCT_OLICARD500 0xc00b/* Celot products */ #define CELOT_VENDOR_ID 0x211f
@@ -1545,6 +1546,9 @@ static const struct usb_device_id option { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200), .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, + { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD500), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist + }, { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) },
Greg Kroah-Hartman
maintainerPATCH 49/140 usb: option: add Alcatel L800MA
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjørn Mork <[email protected]>
commit dd6b48ecec2ea7d15f28d5e5474388681899a5e1 upstream.
Device interface layout:
0: ff/ff/ff - serial
1: ff/00/00 - serial AT+PPP
2: ff/ff/ff - QMI/wwan
3: 08/06/50 - storage
--- drivers/usb/serial/option.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/option.c +3 -0
@@ -287,6 +287,7 @@ static void option_instat_callback(struc#define ALCATEL_PRODUCT_X060S_X200 0x0000#define ALCATEL_PRODUCT_X220_X500D 0x0017#define ALCATEL_PRODUCT_L100V 0x011e +#define ALCATEL_PRODUCT_L800MA 0x0203#define PIRELLI_VENDOR_ID 0x1266#define PIRELLI_PRODUCT_C100_1 0x1002
@@ -1501,6 +1502,8 @@ static const struct usb_device_id option .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L100V), .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L800MA), + .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14),
Greg Kroah-Hartman
maintainerPATCH 50/140 usb: option: add and update a number of CMOTech devices
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjørn Mork <[email protected]>
commit 34f972d6156fe9eea2ab7bb418c71f9d1d5c8e7b upstream.
A number of older CMOTech modems are based on Qualcomm chips. The blacklisted interfaces are QMI/wwan.
--- drivers/usb/serial/option.c | 74 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 4 deletions(-)
drivers/usb/serial/option.c +70 -4
@@ -234,8 +234,31 @@ static void option_instat_callback(struc#define QUALCOMM_VENDOR_ID 0x05C6#define CMOTECH_VENDOR_ID 0x16d8 -#define CMOTECH_PRODUCT_6008 0x6008 -#define CMOTECH_PRODUCT_6280 0x6280 +#define CMOTECH_PRODUCT_6001 0x6001 +#define CMOTECH_PRODUCT_CMU_300 0x6002 +#define CMOTECH_PRODUCT_6003 0x6003 +#define CMOTECH_PRODUCT_6004 0x6004 +#define CMOTECH_PRODUCT_6005 0x6005 +#define CMOTECH_PRODUCT_CGU_628A 0x6006 +#define CMOTECH_PRODUCT_CHE_628S 0x6007 +#define CMOTECH_PRODUCT_CMU_301 0x6008 +#define CMOTECH_PRODUCT_CHU_628 0x6280 +#define CMOTECH_PRODUCT_CHU_628S 0x6281 +#define CMOTECH_PRODUCT_CDU_680 0x6803 +#define CMOTECH_PRODUCT_CDU_685A 0x6804 +#define CMOTECH_PRODUCT_CHU_720S 0x7001 +#define CMOTECH_PRODUCT_7002 0x7002 +#define CMOTECH_PRODUCT_CHU_629K 0x7003 +#define CMOTECH_PRODUCT_7004 0x7004 +#define CMOTECH_PRODUCT_7005 0x7005 +#define CMOTECH_PRODUCT_CGU_629 0x7006 +#define CMOTECH_PRODUCT_CHU_629S 0x700a +#define CMOTECH_PRODUCT_CHU_720I 0x7211 +#define CMOTECH_PRODUCT_7212 0x7212 +#define CMOTECH_PRODUCT_7213 0x7213 +#define CMOTECH_PRODUCT_7251 0x7251 +#define CMOTECH_PRODUCT_7252 0x7252 +#define CMOTECH_PRODUCT_7253 0x7253#define TELIT_VENDOR_ID 0x1bc7#define TELIT_PRODUCT_UC864E 0x1003
@@ -504,6 +527,10 @@ static const struct option_blacklist_inf .reserved = BIT(1) | BIT(2), }; +static const struct option_blacklist_info net_intf0_blacklist = { + .reserved =BIT (0 ), +}; +static const struct option_blacklist_info net_intf1_blacklist = { .reserved =BIT (1 ), };
@@ -1037,8 +1064,47 @@ static const struct usb_device_id option { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ - { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ - { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6004) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6005) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CGU_628A) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHE_628S), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_301), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_628), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_628S) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU_680) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU_685A) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_720S), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7002), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_629K), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7004), + .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7005) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CGU_629), + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_629S), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_720I), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7212), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7213), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7251), + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7252), + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7253), + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) },
Greg Kroah-Hartman
maintainerPATCH 51/140 serial: omap: Fix missing pm_runtime_resume handling by simplifying code
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
commit d758c9c1b36b4d9a141c2146c70398d756167ed1 upstream.
The lack of pm_runtime_resume handling for the device state leads into device wake-up interrupts not working after a while for runtime PM.
Also, serial-omap is confused about the use of device_may_wakeup. The checks for device_may_wakeup should only be done for suspend and resume, not for pm_runtime_suspend and pm_runtime_resume. The wake-up events for PM runtime should always be enabled.
The lack of pm_runtime_resume handling leads into device wake-up interrupts not working after a while for runtime PM.
Rather than try to patch over the issue of adding complex tests to the pm_runtime_resume, let's fix the issues properly:
1. Make serial_omap_enable_wakeup deal with all internal PM state handling so we don't need to test for up->wakeups_enabled elsewhere.
Later on once omap3 boots in device tree only mode we can also remove the up->wakeups_enabled flag and rely on the wake-up interrupt enable/disable state alone.
2. Do the device_may_wakeup checks in suspend and resume only, for runtime PM the wake-up events need to be always enabled.
3. Finally just call serial_omap_enable_wakeup and make sure we call it also in pm_runtime_resume.
4. Note that we also have to use disable_irq_nosync as serial_omap_irq calls pm_runtime_get_sync.
--- drivers/tty/serial/omap-serial.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-)
drivers/tty/serial/omap-serial.c +17 -12
@@ -225,14 +225,19 @@ static inline void serial_omap_enable_waif (enable)enable_irq (up->wakeirq);else -disable_irq (up->wakeirq); +disable_irq_nosync (up->wakeirq); }static void serial_omap_enable_wakeup (struct uart_omap_port *up,bool enable) {struct omap_uart_port_info *pdata =dev_get_platdata (up->dev); +if (enable == up->wakeups_enabled) +return ; +serial_omap_enable_wakeirq (up, enable); + up->wakeups_enabled = enable; +if (!pdata || !pdata->enable_wakeup)return ;
@@ -1488,6 +1493,11 @@ static int serial_omap_suspend(struct deuart_suspend_port (&serial_omap_reg, &up->port);flush_work (&up->qos_work); +if (device_may_wakeup (dev)) +serial_omap_enable_wakeup (up, true); +else +serial_omap_enable_wakeup (up, false); +return 0 ; }
@@ -1495,6 +1505,9 @@ static int serial_omap_resume(struct dev {struct uart_omap_port *up =dev_get_drvdata (dev); +if (device_may_wakeup (dev)) +serial_omap_enable_wakeup (up, false); +uart_resume_port (&serial_omap_reg, &up->port);return 0 ;
@@ -1870,17 +1883,7 @@ static int serial_omap_runtime_suspend(s up->context_loss_cnt =serial_omap_get_context_loss_count (up); -if (device_may_wakeup (dev)) { -if (!up->wakeups_enabled) { -serial_omap_enable_wakeup (up, true); - up->wakeups_enabled = true; - } - }else { -if (up->wakeups_enabled) { -serial_omap_enable_wakeup (up, false); - up->wakeups_enabled = false; - } - } +serial_omap_enable_wakeup (up, true); up->latency =PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE ;schedule_work (&up->qos_work);
@@ -1894,6 +1897,8 @@ static int serial_omap_runtime_resume(stint loss_cnt =serial_omap_get_context_loss_count (up); +serial_omap_enable_wakeup (up, false); +if (loss_cnt <0 ) {dev_dbg (dev,"serial_omap_get_context_loss_count failed : %d\n" , loss_cnt);
Greg Kroah-Hartman
maintainerPATCH 52/140 mlx4_en: dont use napi_synchronize inside mlx4_en_netpoll
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit c98235cb8584a72e95786e17d695a8e5fafcd766 upstream.
The mlx4 driver is triggering schedules while atomic inside mlx4_en_netpoll:
spin_lock_irqsave(&cq->lock, flags); napi_synchronize(&cq->napi); ^^^^^ msleep here mlx4_en_process_rx_cq(dev, cq, 0); spin_unlock_irqrestore(&cq->lock, flags);
This was part of a patch by Alexander Guller from Mellanox in 2011, but it still isn't upstream.
--- drivers/net/ethernet/mellanox/mlx4/en_cq.c | 1 - drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 6 +----- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 - 3 files changed, 1 insertion(+), 7 deletions(-)
drivers/net/ethernet/mellanox/mlx4/en_cq.c +0 -1
@@ -66,7 +66,6 @@ int mlx4_en_create_cq(struct mlx4_en_pri cq->ring = ring; cq->is_tx = mode; -spin_lock_init (&cq->lock);/* Allocate HW buffers on provided NUMA node. * dev->numa_node is used in mtt range allocation flow.
drivers/net/ethernet/mellanox/mlx4/en_netdev.c +1 -5
@@ -1315,15 +1315,11 @@ static void mlx4_en_netpoll(struct net_d {struct mlx4_en_priv *priv =netdev_priv (dev);struct mlx4_en_cq *cq; -unsigned long flags;int i;for (i =0 ; i < priv->rx_ring_num; i++) { cq = priv->rx_cq[i]; -spin_lock_irqsave (&cq->lock, flags); -napi_synchronize (&cq->napi); -mlx4_en_process_rx_cq (dev, cq,0 ); -spin_unlock_irqrestore (&cq->lock, flags); +napi_schedule (&cq->napi); } }#endif
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +0 -1
@@ -309,7 +309,6 @@ struct mlx4_en_cq {struct mlx4_cq mcq;struct mlx4_hwq_resources wqres;int ring; -spinlock_t lock;struct net_device *dev;struct napi_struct napi;int size;
Greg Kroah-Hartman
maintainerPATCH 53/140 fs: Dont return 0 from get_anon_bdev
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Thomas=20B=C3=A4chler?= <[email protected]>
commit a2a4dc494a7b7135f460e38e788c4a58f65e4ac3 upstream.
Commit 9e30cc9595303b27b48 removed an internal mount. This has the side-effect that rootfs now has FSID 0. Many userspace utilities assume that st_dev in struct stat is never 0, so this change breaks a number of tools in early userspace.
Since we don't know how many userspace programs are affected, make sure that FSID is at least 1.
References: http://article.gmane.org/gmane.linux.kernel/1666905
References: http://permalink.gmane.org/gmane.linux.utilities.util-linux-ng/8557
--- fs/super.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/super.c +4 -1
@@ -802,7 +802,10 @@ void emergency_remount(void)static DEFINE_IDA (unnamed_dev_ida);static DEFINE_SPINLOCK (unnamed_dev_lock);/* protects the above */ -static int unnamed_dev_start =0 ;/* don't bother trying below it */ +/* Many userspace utilities consider an FSID of 0 invalid. +* Always return at least 1 from get_anon_bdev. +*/ +static int unnamed_dev_start =1 ;int get_anon_bdev (dev_t *p) {
Greg Kroah-Hartman
maintainerPATCH 54/140 wl18xx: align event mailbox with current fw
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eliad Peller <[email protected]>
commit c0da71ff4d2cbf113465bff9a7c413154be25a89 upstream.
Some fields are missing from the event mailbox
struct definitions, which cause issues when
trying to handle some events.
Add the missing fields in order to align the
struct size (without adding actual support
for the new fields).
--- drivers/net/wireless/ti/wl18xx/event.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
drivers/net/wireless/ti/wl18xx/event.h +20 -0
@@ -68,6 +68,26 @@ struct wl18xx_event_mailbox {/* bitmap of inactive stations (by HLID) */ __le32 inactive_sta_bitmap; + +/* rx BA win size indicated by RX_BA_WIN_SIZE_CHANGE_EVENT_ID */ +u8 rx_ba_role_id; +u8 rx_ba_link_id; +u8 rx_ba_win_size; +u8 padding; + +/* smart config */ +u8 sc_ssid_len; +u8 sc_pwd_len; +u8 sc_token_len; +u8 padding1; +u8 sc_ssid[32 ]; +u8 sc_pwd[32 ]; +u8 sc_token[32 ]; + +/* smart config sync channel */ +u8 sc_sync_channel; +u8 sc_sync_band; +u8 padding2[2 ]; } __packed; int wl18xx_wait_for_event(struct wl1271 *wl, enum wlcore_wait_event event,
Greg Kroah-Hartman
maintainerPATCH 55/140 drm/vmwgfx: correct fb_fix_screeninfo.line_length
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christopher Friedt <[email protected]>
commit aa6de142c901cd2d90ef08db30ae87da214bedcc upstream.
Previously, the vmwgfx_fb driver would allow users to call FBIOSET_VINFO, but it would not adjust the FINFO properly, resulting in distorted screen rendering. The patch corrects that behaviour.
See https://bugs.gentoo.org/show_bug.cgi?id=494794 for examples.
--- drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/vmwgfx/vmwgfx_fb.c +4 -1
@@ -147,7 +147,7 @@ static int vmw_fb_check_var(struct fb_va }if (!vmw_kms_validate_mode_vram (vmw_priv, - info->fix.line_length, + var->xres * var->bits_per_pixel/8 , var->yoffset + var->yres)) {DRM_ERROR ("Requested geom can not fit in framebuffer\n" );return -EINVAL ;
@@ -162,6 +162,8 @@ static int vmw_fb_set_par(struct fb_infostruct vmw_private *vmw_priv = par->vmw_priv;int ret; + info->fix.line_length = info->var.xres * info->var.bits_per_pixel/8 ; + ret =vmw_kms_write_svga (vmw_priv, info->var.xres, info->var.yres, info->fix.line_length, par->bpp, par->depth);
@@ -177,6 +179,7 @@ static int vmw_fb_set_par(struct fb_infovmw_write (vmw_priv,SVGA_REG_DISPLAY_POSITION_Y , info->var.yoffset);vmw_write (vmw_priv,SVGA_REG_DISPLAY_WIDTH , info->var.xres);vmw_write (vmw_priv,SVGA_REG_DISPLAY_HEIGHT , info->var.yres); +vmw_write (vmw_priv,SVGA_REG_BYTES_PER_LINE , info->fix.line_length);vmw_write (vmw_priv,SVGA_REG_DISPLAY_ID ,SVGA_ID_INVALID ); }
Greg Kroah-Hartman
maintainerPATCH 56/140 drm/vmwgfx: Fix query buffer locking order violation
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Hellstrom <[email protected]>
commit c8e5e010ef12df6707a1d711a5279a22f67a355e upstream.
The query buffers were reserved while holding the binding mutex, which caused a circular locking dependency.
--- drivers/gpu/drm/vmwgfx/vmwgfx_context.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/vmwgfx/vmwgfx_context.c +1 -1
@@ -117,10 +117,10 @@ static void vmw_hw_context_destroy(struc (void )vmw_context_binding_state_kill (&container_of(res, struct vmw_user_context, res)->cbs); (void )vmw_gb_context_destroy (res); +mutex_unlock (&dev_priv->binding_mutex);if (dev_priv->pinned_bo !=NULL && !dev_priv->query_cid_valid)__vmw_execbuf_release_pinned_bo (dev_priv,NULL ); -mutex_unlock (&dev_priv->binding_mutex);mutex_unlock (&dev_priv->cmdbuf_mutex);return ; }
Greg Kroah-Hartman
maintainerPATCH 57/140 drm/vmwgfx: Make sure user-space cant DMA across buffer object boundaries v2
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Hellstrom <[email protected]>
commit cbd75e97a525e3819c02dc18bc2d67aa544c9e45 upstream.
We already check that the buffer object we're accessing is registered with the file. Now also make sure that we can't DMA across buffer object boundaries.
v2: Code commenting update.
--- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +22 -0
@@ -1214,14 +1214,36 @@ static int vmw_cmd_dma(struct vmw_privatSVGA3dCmdSurfaceDMA dma; } *cmd;int ret; +SVGA3dCmdSurfaceDMASuffix *suffix; +uint32_t bo_size; cmd = container_of(header, struct vmw_dma_cmd, header); + suffix = (SVGA3dCmdSurfaceDMASuffix *)((unsigned long ) &cmd->dma + + header->size -sizeof (*suffix)); + +/* Make sure device and verifier stays in sync. */ +if (unlikely (suffix->suffixSize !=sizeof (*suffix))) { +DRM_ERROR ("Invalid DMA suffix size.\n" ); +return -EINVAL ; + } + ret =vmw_translate_guest_ptr (dev_priv, sw_context, &cmd->dma.guest.ptr, &vmw_bo);if (unlikely (ret !=0 ))return ret; +/* Make sure DMA doesn't cross BO boundaries. */ + bo_size = vmw_bo->base.num_pages *PAGE_SIZE ; +if (unlikely (cmd->dma.guest.ptr.offset > bo_size)) { +DRM_ERROR ("Invalid DMA offset.\n" ); +return -EINVAL ; + } + + bo_size -= cmd->dma.guest.ptr.offset; +if (unlikely (suffix->maximumOffset > bo_size)) + suffix->maximumOffset = bo_size; + ret =vmw_cmd_res_check (dev_priv, sw_context, vmw_res_surface, user_surface_converter, &cmd->dma.host.sid,NULL );
Greg Kroah-Hartman
maintainerPATCH 58/140 drm/qxl: unset a pointer in sync_obj_unref
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maarten Lankhorst <[email protected]>
commit 41ccec352f3c823931a7d9d2a9c7880c14d7415a upstream.
This fixes a BUG_ON(bo->sync_obj != NULL); in ttm_bo_release_list.
--- drivers/gpu/drm/qxl/qxl_ttm.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/qxl/qxl_ttm.c +1 -0
@@ -433,6 +433,7 @@ static int qxl_sync_obj_flush(void *syncstatic void qxl_sync_obj_unref (void **sync_obj) { + *sync_obj =NULL ; }static void *qxl_sync_obj_ref (void *sync_obj)
Greg Kroah-Hartman
maintainerPATCH 59/140 drm/radeon: clear needs_reset flag if IB test fails
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian König <[email protected]>
commit 06a139f7a0885fa2c84962300edd181821ddc2c9 upstream.
If the IB test fails we don't want to reset the card over and over again, just accept that it isn't working.
--- drivers/gpu/drm/radeon/radeon_ring.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/radeon/radeon_ring.c +1 -0
@@ -257,6 +257,7 @@ int radeon_ib_ring_tests(struct radeon_d r =radeon_ib_test (rdev, i, ring);if (r) { ring->ready = false; + rdev->needs_reset = false;if (i ==RADEON_RING_TYPE_GFX_INDEX ) {/* oh, oh, that's really bad */
Greg Kroah-Hartman
maintainerPATCH 60/140 drm/radeon: call drm_edid_to_eld when we update the edid
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 16086279353cbfecbb3ead474072dced17b97ddc upstream.
This needs to be done to update some of the fields in the connector structure used by the audio code.
Noticed by several users on irc.
--- drivers/gpu/drm/radeon/radeon_display.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/radeon/radeon_display.c +1 -0
@@ -792,6 +792,7 @@ int radeon_ddc_get_modes(struct radeon_cif (radeon_connector->edid) {drm_mode_connector_update_edid_property (&radeon_connector->base, radeon_connector->edid); ret =drm_add_edid_modes (&radeon_connector->base, radeon_connector->edid); +drm_edid_to_eld (&radeon_connector->base, radeon_connector->edid);return ret; }drm_mode_connector_update_edid_property (&radeon_connector->base,NULL );
Greg Kroah-Hartman
maintainerPATCH 61/140 drm/radeon: fix endian swap on hawaii clear state buffer setup
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit a8947f576728a66bd3aac629bd8ca021a010c808 upstream.
Need to swap on BE.
--- drivers/gpu/drm/radeon/cik.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/radeon/cik.c +2 -2
@@ -6521,8 +6521,8 @@ void cik_get_csb_buffer(struct radeon_de buffer[count++] =cpu_to_le32 (0x00000000 );break ;case CHIP_HAWAII : - buffer[count++] =0x3a00161a ; - buffer[count++] =0x0000002e ; + buffer[count++] =cpu_to_le32 (0x3a00161a ); + buffer[count++] =cpu_to_le32 (0x0000002e );break ;default : buffer[count++] =cpu_to_le32 (0x00000000 );
Greg Kroah-Hartman
maintainerPATCH 62/140 drm/radeon: fix typo in spectre_golden_registers
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit f1553174a207f68a4ec19d436003097e0a4dc405 upstream.
--- drivers/gpu/drm/radeon/cik.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/radeon/cik.c +1 -1
@@ -1095,7 +1095,7 @@ static const u32 spectre_golden_register0x8a14 ,0xf000003f ,0x00000007 ,0x8b24 ,0xffffffff ,0x00ffffff ,0x28350 ,0x3f3f3fff ,0x00000082 , -0x28355 ,0x0000003f ,0x00000000 , +0x28354 ,0x0000003f ,0x00000000 ,0x3e78 ,0x00000001 ,0x00000002 ,0x913c ,0xffff03df ,0x00000004 , 0xc768, 0x00000008, 0x00000008,
Greg Kroah-Hartman
maintainerPATCH 63/140 drm/i915/tv: fix gen4 composite s-video tv-out
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
commit e1f23f3dd817f53f622e486913ac662add46eeed upstream.
This is *not* bisected, but the likely regression is
commit c35614380d5c956bfda20eab2755b2f5a7d6f1e7
Author: Zhao Yakui <[email protected]> Date: Tue Nov 24 09:48:48 2009 +0800
drm/i915: Don't set up the TV port if it isn't in the BIOS table.
The commit does not check for all TV device types that might be present in the VBT, disabling TV out for the missing ones. Add composite S-video.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73362
--- drivers/gpu/drm/i915/intel_tv.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/intel_tv.c +7 -2
@@ -1536,9 +1536,14 @@ static int tv_is_present_in_vbt(struct d/* * If the device type is not TV, continue. */ -if (p_child->old.device_type !=DEVICE_TYPE_INT_TV && - p_child->old.device_type !=DEVICE_TYPE_TV ) +switch (p_child->old.device_type) { +case DEVICE_TYPE_INT_TV : +case DEVICE_TYPE_TV : +case DEVICE_TYPE_TV_SVIDEO_COMPOSITE : +break ; +default :continue ; + }/* Only when the addin_offset is non-zero, it is regarded * as present. */
Greg Kroah-Hartman
maintainerPATCH 64/140 drm/i915: Do not dereference pointers from ring buffer in evict event
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit 9297ebf29ad9118edd6c0fedc84f03e35028827d upstream.
The TP_printk() should never dereference any pointers, because the ring buffer can be read at some unknown time in the future. If a device no longer exists, it can cause a kernel oops. This also makes this event useless when saving the ring buffer in userspaces tools such as perf and trace-cmd.
The i915_gem_evict_vm dereferences the vm pointer which may also not exist when the ring buffer is read sometime in the future.
--- drivers/gpu/drm/i915/i915_trace.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_trace.h +3 -1
@@ -238,14 +238,16 @@ TRACE_EVENT(i915_gem_evict_vm,TP_ARGS (vm),TP_STRUCT__entry ( + __field(u32, dev)__field (struct i915_address_space *,vm ) ),TP_fast_assign ( + __entry->dev = vm->dev->primary->index; __entry->vm = vm; ), -TP_printk ("dev=%d, vm=%p" , __entry->vm->dev->primary->index, __entry->vm) +TP_printk ("dev=%d, vm=%p" , __entry->dev, __entry->vm) ); TRACE_EVENT(i915_gem_ring_sync_to,
Greg Kroah-Hartman
maintainerPATCH 65/140 net: sctp: wake up all assocs if sndbuf policy is per socket
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 52c35befb69b005c3fc5afdaae3a5717ad013411 ]
SCTP charges chunks for wmem accounting via skb->truesize in sctp_set_owner_w(), and sctp_wfree() respectively as the reverse operation. If a sender runs out of wmem, it needs to wait via sctp_wait_for_sndbuf(), and gets woken up by a call to __sctp_write_space() mostly via sctp_wfree().
__sctp_write_space() is being called per association. Although we assign sk->sk_write_space() to sctp_write_space(), which is then being done per socket, it is only used if send space is increased per socket option (SO_SNDBUF), as SOCK_USE_WRITE_QUEUE is set and therefore not invoked in sock_wfree().
Commit 4c3a5bdae293 ("sctp: Don't charge for data in sndbuf again when transmitting packet") fixed an issue where in case sctp_packet_transmit() manages to queue up more than sndbuf bytes, sctp_wait_for_sndbuf() will never be woken up again unless it is interrupted by a signal. However, a still remaining issue is that if net.sctp.sndbuf_policy=0, that is accounting per socket, and one-to-many sockets are in use, the reclaimed write space from sctp_wfree() is 'unfairly' handed back on the server to the association that is the lucky one to be woken up again via __sctp_write_space(), while the remaining associations are never be woken up again (unless by a signal).
The effect disappears with net.sctp.sndbuf_policy=1, that is wmem accounting per association, as it guarantees a fair share of wmem among associations.
Therefore, if we have reclaimed memory in case of per socket accounting, wake all related associations to a socket in a fair manner, that is, traverse the socket association list starting from the current neighbour of the association and issue a __sctp_write_space() to everyone until we end up waking ourselves. This guarantees that no association is preferred over another and even if more associations are taken into the one-to-many session, all receivers will get messages from the server and are not stalled forever on high load. This setting still leaves the advantage of per socket accounting in touch as an association can still use up global limits if unused by others.
--- net/sctp/socket.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-)
net/sctp/socket.c +35 -1
@@ -6593,6 +6593,40 @@ static void __sctp_write_space(struct sc } } +static void sctp_wake_up_waiters (struct sock *sk, +struct sctp_association *asoc) +{ +struct sctp_association *tmp = asoc; + +/* We do accounting for the sndbuf space per association, +* so we only need to wake our own association. +*/ +if (asoc->ep->sndbuf_policy) +return __sctp_write_space (asoc); + +/* Accounting for the sndbuf space is per socket, so we +* need to wake up others, try to be fair and in case of +* other associations, let them have a go first instead +* of just doing a sctp_write_space() call. +* +* Note that we reach sctp_wake_up_waiters() only when +* associations free up queued chunks, thus we are under +* lock and the list of associations on a socket is +* guaranteed not to change. +*/ +for (tmp =list_next_entry (tmp, asocs);1 ; + tmp =list_next_entry (tmp, asocs)) { +/* Manually skip the head element. */ +if (&tmp->asocs == &((sctp_sk (sk))->ep->asocs)) +continue ; +/* Wake up association. */ +__sctp_write_space (tmp); +/* We've reached the end. */ +if (tmp == asoc) +break ; + } +} +/* Do accounting for the sndbuf space. * Decrement the used sndbuf space of the corresponding association by the * data size which was just transmitted(freed).
@@ -6620,7 +6654,7 @@ static void sctp_wfree(struct sk_buff *ssk_mem_uncharge (sk, skb->truesize);sock_wfree (skb); -__sctp_write_space (asoc); +sctp_wake_up_waiters (sk, asoc);sctp_association_put (asoc); }
Greg Kroah-Hartman
maintainerPATCH 66/140 net: sctp: test if association is dead in sctp_wake_up_waiters
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 1e1cdf8ac78793e0875465e98a648df64694a8d0 ]
In function sctp_wake_up_waiters(), we need to involve a test if the association is declared dead. If so, we don't have any reference to a possible sibling association anymore and need to invoke sctp_write_space() instead, and normally walk the socket's associations and notify them of new wmem space. The reason for special casing is that otherwise, we could run into the following issue when a sctp_primitive_SEND() call from sctp_sendmsg() fails, and tries to flush an association's outq, i.e. in the following way:
sctp_association_free()
`-> list_del(&asoc->asocs) <-- poisons list pointer
asoc->base.dead = true
sctp_outq_free(&asoc->outqueue)
`-> __sctp_outq_teardown()
`-> sctp_chunk_free()
`-> consume_skb()
`-> sctp_wfree()
`-> sctp_wake_up_waiters() <-- dereferences poisoned pointers
if asoc->ep->sndbuf_policy=0Therefore, only walk the list in an 'optimized' way if we find that the current association is still active. We could also use list_del_init() in addition when we call sctp_association_free(), but as Vlad suggests, we want to trap such bugs and thus leave it poisoned as is.
Why is it safe to resolve the issue by testing for asoc->base.dead? Parallel calls to sctp_sendmsg() are protected under socket lock, that is lock_sock()/release_sock(). Only within that path under lock held, we're setting skb/chunk owner via sctp_set_owner_w(). Eventually, chunks are freed directly by an association still under that lock. So when traversing association list on destruction time from sctp_wake_up_waiters() via sctp_wfree(), a different CPU can't be running sctp_wfree() while another one calls sctp_association_free() as both happens under the same lock. Therefore, this can also not race with setting/testing against asoc->base.dead as we are guaranteed for this to happen in order, under lock. Further, Vlad says: the times we check asoc->base.dead is when we've cached an association pointer for later processing. In between cache and processing, the association may have been freed and is simply still around due to reference counts. We check asoc->base.dead under a lock, so it should always be safe to check and not race against sctp_association_free(). Stress-testing seems fine now, too.
--- net/sctp/socket.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/sctp/socket.c +6 -0
@@ -6604,6 +6604,12 @@ static void sctp_wake_up_waiters(structif (asoc->ep->sndbuf_policy)return __sctp_write_space (asoc); +/* If association goes down and is just flushing its +* outq, then just normally notify others. +*/ +if (asoc->base.dead) +return sctp_write_space (sk); +/* Accounting for the sndbuf space is per socket, so we * need to wake up others, try to be fair and in case of * other associations, let them have a go first instead
Greg Kroah-Hartman
maintainerPATCH 67/140 l2tp: take PMTU from tunnel UDP socket
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Petukhov <[email protected]>
[ Upstream commit f34c4a35d87949fbb0e0f31eba3c054e9f8199ba ]
When l2tp driver tries to get PMTU for the tunnel destination, it uses the pointer to struct sock that represents PPPoX socket, while it should use the pointer that represents UDP socket of the tunnel.
--- net/l2tp/l2tp_ppp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/l2tp/l2tp_ppp.c +2 -2
@@ -756,9 +756,9 @@ static int pppol2tp_connect(struct socke session->deref = pppol2tp_session_sock_put;/* If PMTU discovery was enabled, use the MTU that was discovered */ - dst =sk_dst_get (sk); + dst =sk_dst_get (tunnel->sock);if (dst !=NULL ) { -u32 pmtu =dst_mtu (__sk_dst_get (sk)); +u32 pmtu =dst_mtu (__sk_dst_get (tunnel->sock));if (pmtu !=0 ) session->mtu = session->mru = pmtu -PPPOL2TP_HEADER_OVERHEAD ;
Greg Kroah-Hartman
maintainerPATCH 68/140 net: core: dont account for udp header size when computing seglen
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit 6d39d589bb76ee8a1c6cde6822006ae0053decff ]
In case of tcp, gso_size contains the tcpmss.
For UFO (udp fragmentation offloading) skbs, gso_size is the fragment payload size, i.e. we must not account for udp header size.
Otherwise, when using virtio drivers, a to-be-forwarded UFO GSO packet will be needlessly fragmented in the forward path, because we think its individual segments are too large for the outgoing link.
--- net/core/skbuff.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
net/core/skbuff.c +7 -5
@@ -3951,12 +3951,14 @@ EXPORT_SYMBOL_GPL(skb_scrub_packet);unsigned int skb_gso_transport_seglen (const struct sk_buff *skb) {const struct skb_shared_info *shinfo =skb_shinfo (skb); -unsigned int hdr_len;if (likely (shinfo->gso_type & (SKB_GSO_TCPV4 |SKB_GSO_TCPV6 ))) - hdr_len =tcp_hdrlen (skb); -else - hdr_len =sizeof (struct udphdr ); -return hdr_len + shinfo->gso_size; +return tcp_hdrlen (skb) + shinfo->gso_size; + +/* UFO sets gso_size to the size of the fragmentation +* payload, i.e. the size of the L4 (UDP) header is already +* accounted for. +*/ +return shinfo->gso_size; }EXPORT_SYMBOL_GPL (skb_gso_transport_seglen);
Greg Kroah-Hartman
maintainerPATCH 69/140 bonding: Remove debug_fs files when module init fails
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Richter <[email protected]>
[ Upstream commit db29868653394937037d71dc3545768302dda643 ]
Remove the bonding debug_fs entries when the module initialization fails. The debug_fs
entries should be removed together with all other already allocated resources.
--- drivers/net/bonding/bond_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/bonding/bond_main.c +1 -0
@@ -4536,6 +4536,7 @@ static int __init bonding_init(void) out:return res; err: +bond_destroy_debugfs ();bond_netlink_fini (); err_link:unregister_pernet_subsys (&bond_net_ops);
Greg Kroah-Hartman
maintainerPATCH 70/140 bridge: Fix double free and memory leak around br_allowed_ingress
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Toshiaki Makita <[email protected]>
[ Upstream commit eb7076182d1ae4bc4641534134ed707100d76acc ]
br_allowed_ingress() has two problems.
1. If br_allowed_ingress() is called by br_handle_frame_finish() and vlan_untag() in br_allowed_ingress() fails, skb will be freed by both vlan_untag() and br_handle_frame_finish().
2. If br_allowed_ingress() is called by br_dev_xmit() and br_allowed_ingress() fails, the skb will not be freed.
Fix these two problems by freeing the skb in br_allowed_ingress() if it fails.
--- net/bridge/br_input.c | 2 +- net/bridge/br_vlan.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-)
net/bridge/br_input.c +1 -1
@@ -73,7 +73,7 @@ int br_handle_frame_finish(struct sk_buf goto drop;if (!br_allowed_ingress (p->br,nbp_get_vlan_info (p), skb, &vid)) - goto drop; + goto out;/* insert into forwarding database after filtering to avoid spoofing */ br = p->br;
net/bridge/br_vlan.c +4 -3
@@ -170,7 +170,7 @@ bool br_allowed_ingress(struct net_bridg* rejected. */ if (!v) -return false; + goto drop;/* If vlan tx offload is disabled on bridge device and frame was * sent from vlan device on the bridge device, it does not have
@@ -193,7 +193,7 @@ bool br_allowed_ingress(struct net_bridg* vlan untagged or priority-tagged traffic belongs to. */ if (pvid ==VLAN_N_VID ) -return false; + goto drop;/* PVID is set on this port. Any untagged or priority-tagged * ingress frame is considered to belong to this vlan.
@@ -216,7 +216,8 @@ bool br_allowed_ingress(struct net_bridg/* Frame had a valid vlan tag. See if vlan is allowed */ if (test_bit (*vid, v->vlan_bitmap))return true; - +drop: +kfree_skb (skb);return false; }
Greg Kroah-Hartman
maintainerPATCH 71/140 ipv6: Limit mtu to 65575 bytes
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 30f78d8ebf7f514801e71b88a10c948275168518 ]
Francois reported that setting big mtu on loopback device could prevent tcp sessions making progress.
We do not support (yet ?) IPv6 Jumbograms and cook corrupted packets.
We must limit the IPv6 MTU to (65535 + 40) bytes in theory.
Tested:
ifconfig lo mtu 70000
netperf -H ::1
Before patch : Throughput : 0.05 Mbits
After patch : Throughput : 35484 Mbits
--- include/net/ip6_route.h | 5 +++++ net/ipv6/route.c | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-)
include/net/ip6_route.h +5 -0
@@ -32,6 +32,11 @@ struct route_info {#define RT6_LOOKUP_F_SRCPREF_PUBLIC 0x00000010#define RT6_LOOKUP_F_SRCPREF_COA 0x00000020 +/* We do not (yet ?) support IPv6 jumbograms (RFC 2675) +* Unlike IPv4, hdr->seg_len doesn't include the IPv6 header +*/ +#define IP6_MAX_MTU (0xFFFF + sizeof(struct ipv6hdr)) +/* * rt6_srcprefs2flags() and rt6_flags2srcprefs() translate * between IPV6_ADDR_PREFERENCES socket option values
net/ipv6/route.c +3 -2
@@ -1342,7 +1342,7 @@ static unsigned int ip6_mtu(const structunsigned int mtu =dst_metric_raw (dst,RTAX_MTU );if (mtu) -return mtu; + goto out; mtu =IPV6_MIN_MTU ;
@@ -1352,7 +1352,8 @@ static unsigned int ip6_mtu(const struct mtu = idev->cnf.mtu6;rcu_read_unlock (); -return mtu; +out: + return min_t(unsigned int, mtu, IP6_MAX_MTU); }static struct dst_entry *icmp6_dst_gc_list;
Greg Kroah-Hartman
maintainerPATCH 72/140 gre: dont allow to add the same tunnel twice
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Dichtel <[email protected]>
[ Upstream commit 5a4552752d8f7f4cef1d98775ece7adb7616fde2 ]
Before the patch, it was possible to add two times the same tunnel:
ip l a gre1 type gre remote 10.16.0.121 local 10.16.0.249 ip l a gre2 type gre remote 10.16.0.121 local 10.16.0.249
It was possible, because ip_tunnel_newlink() calls ip_tunnel_find() with the argument dev->type, which was set only later (when calling ndo_init handler in register_netdevice()). Let's set this type in the setup handler, which is called before newlink handler.
Introduced by commit c54419321455 ("GRE: Refactor GRE tunneling code.").
--- net/ipv4/ip_gre.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/ip_gre.c +1 -1
@@ -463,6 +463,7 @@ static const struct net_device_ops ipgrestatic void ipgre_tunnel_setup (struct net_device *dev) { dev->netdev_ops = &ipgre_netdev_ops; + dev->type =ARPHRD_IPGRE ;ip_tunnel_setup (dev, ipgre_net_id); }
@@ -501,7 +502,6 @@ static int ipgre_tunnel_init(struct net_memcpy (dev->dev_addr, &iph->saddr,4 );memcpy (dev->broadcast, &iph->daddr,4 ); - dev->type =ARPHRD_IPGRE ; dev->flags =IFF_NOARP ; dev->priv_flags &= ~IFF_XMIT_DST_RELEASE ; dev->addr_len =4 ;
Greg Kroah-Hartman
maintainerPATCH 73/140 vti: dont allow to add the same tunnel twice
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Dichtel <[email protected]>
[ Upstream commit 8d89dcdf80d88007647945a753821a06eb6cc5a5 ]
Before the patch, it was possible to add two times the same tunnel:
ip l a vti1 type vti remote 10.16.0.121 local 10.16.0.249 key 41 ip l a vti2 type vti remote 10.16.0.121 local 10.16.0.249 key 41
It was possible, because ip_tunnel_newlink() calls ip_tunnel_find() with the argument dev->type, which was set only later (when calling ndo_init handler in register_netdevice()). Let's set this type in the setup handler, which is called before newlink handler.
Introduced by commit b9959fd3b0fa ("vti: switch to new ip tunnel code").
--- net/ipv4/ip_vti.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/ip_vti.c +1 -1
@@ -207,6 +207,7 @@ static const struct net_device_ops vti_nstatic void vti_tunnel_setup (struct net_device *dev) { dev->netdev_ops = &vti_netdev_ops; + dev->type =ARPHRD_TUNNEL ;ip_tunnel_setup (dev, vti_net_id); }
@@ -218,7 +219,6 @@ static int vti_tunnel_init(struct net_dememcpy (dev->dev_addr, &iph->saddr,4 );memcpy (dev->broadcast, &iph->daddr,4 ); - dev->type =ARPHRD_TUNNEL ; dev->hard_header_len =LL_MAX_HEADER +sizeof (struct iphdr ); dev->mtu =ETH_DATA_LEN ; dev->flags =IFF_NOARP ;
Greg Kroah-Hartman
maintainerPATCH 74/140 net: ipv4: current group_info should be put after using.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Wang, Xiaoming" <[email protected]>
[ Upstream commit b04c46190219a4f845e46a459e3102137b7f6cac ]
Plug a group_info refcount leak in ping_init. group_info is only needed during initialization and the code failed to release the reference on exit. While here move grabbing the reference to a place where it is actually needed.
--- net/ipv4/ping.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
net/ipv4/ping.c +11 -4
@@ -252,26 +252,33 @@ int ping_init_sock(struct sock *sk) {struct net *net =sock_net (sk);kgid_t group =current_egid (); -struct group_info *group_info =get_current_groups (); -int i, j, count = group_info->ngroups; +struct group_info *group_info; +int i, j, count;kgid_t low, high; +int ret =0 ;inet_get_ping_group_range_net (net, &low, &high);if (gid_lte (low, group) &&gid_lte (group, high))return 0 ; + group_info =get_current_groups (); + count = group_info->ngroups;for (i =0 ; i < group_info->nblocks; i++) {int cp_count =min_t (int,NGROUPS_PER_BLOCK , count);for (j =0 ; j < cp_count; j++) {kgid_t gid = group_info->blocks[i][j];if (gid_lte (low, gid) &&gid_lte (gid, high)) -return 0 ; + goto out_release_group; } count -= cp_count; } -return -EACCES ; + ret = -EACCES ; + +out_release_group: +put_group_info (group_info); +return ret; }EXPORT_SYMBOL_GPL (ping_init_sock);
Greg Kroah-Hartman
maintainerPATCH 75/140 ipv4: return valid RTA_IIF on ip route get
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Julian Anastasov <[email protected]>
[ Upstream commit 91146153da2feab18efab2e13b0945b6bb704ded ]
Extend commit 13378cad02afc2adc6c0e07fca03903c7ada0b37 ("ipv4: Change rt->rt_iif encoding.") from 3.6 to return valid RTA_IIF on 'ip route get ... iif DEVICE' instead of rt_iif 0 which is displayed as 'iif *'.
inet_iif is not appropriate to use because skb_iif is not set. Use the skb->dev->ifindex instead.
--- net/ipv4/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/route.c +1 -1
@@ -2364,7 +2364,7 @@ static int rt_fill_info(struct net *net, } } else#endif -if (nla_put_u32 (skb,RTA_IIF , rt->rt_iif)) +if (nla_put_u32 (skb,RTA_IIF , skb->dev->ifindex)) goto nla_put_failure; }
Greg Kroah-Hartman
maintainerPATCH 76/140 filter: prevent nla extensions to peek beyond the end of the message
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Krause <[email protected]>
[ Upstream commit 05ab8f2647e4221cbdb3856dd7d32bd5407316b3 ]
The BPF_S_ANC_NLATTR and BPF_S_ANC_NLATTR_NEST extensions fail to check for a minimal message length before testing the supplied offset to be within the bounds of the message. This allows the subtraction of the nla header to underflow and therefore -- as the data type is unsigned -- allowing far to big offset and length values for the search of the netlink attribute.
The remainder calculation for the BPF_S_ANC_NLATTR_NEST extension is also wrong. It has the minuend and subtrahend mixed up, therefore calculates a huge length value, allowing to overrun the end of the message while looking for the netlink attribute.
The following three BPF snippets will trigger the bugs when attached to a UNIX datagram socket and parsing a message with length 1, 2 or 3.
,-[ PoC for missing size check in BPF_S_ANC_NLATTR ]--
| ld #0x87654321 | ldx #42 | ld #nla | ret a
`---
,-[ PoC for the same bug in BPF_S_ANC_NLATTR_NEST ]--
| ld #0x87654321 | ldx #42 | ld #nlan | ret a
`---
,-[ PoC for wrong remainder calculation in BPF_S_ANC_NLATTR_NEST ]--
| ; (needs a fake netlink header at offset 0) | ld #0 | ldx #42 | ld #nlan | ret a
`---
Fix the first issue by ensuring the message length fulfills the minimal size constrains of a nla header. Fix the second bug by getting the math for the remainder calculation right.
--- net/core/filter.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/core/filter.c +5 -1
@@ -355,6 +355,8 @@ load_b:if (skb_is_nonlinear (skb))return 0 ; +if (skb->len <sizeof (struct nlattr )) +return 0 ;if (A > skb->len -sizeof (struct nlattr ))return 0 ;
@@ -371,11 +373,13 @@ load_b:if (skb_is_nonlinear (skb))return 0 ; +if (skb->len <sizeof (struct nlattr )) +return 0 ;if (A > skb->len -sizeof (struct nlattr ))return 0 ; nla = (struct nlattr *)&skb->data[A ]; -if (nla->nla_len >A - skb->len) +if (nla->nla_len > skb->len -A )return 0 ; nla =nla_find_nested (nla,X );
Greg Kroah-Hartman
maintainerPATCH 77/140 Revert "net: sctp: Fix a_rwnd/rwnd management to reflect real state of the receivers buffer"
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 362d52040c71f6e8d8158be48c812d7729cb8df1 ]
This reverts commit ef2820a735f7 ("net: sctp: Fix a_rwnd/rwnd management to reflect real state of the receiver's buffer") as it introduced a serious performance regression on SCTP over IPv4 and IPv6, though a not as dramatic on the latter. Measurements are on 10Gbit/s with ixgbe NICs.
Current state:
[root@Lab200slot2 ~]# iperf3 --sctp -4 -c 192.168.241.3 -V -l 1452 -t 60 iperf version 3.0.1 (10 January 2014)
Linux Lab200slot2 3.14.0 #1 SMP Thu Apr 3 23:18:29 EDT 2014 x86_64
Time: Fri, 11 Apr 2014 17:56:21 GMT
Connecting to host 192.168.241.3, port 5201
Cookie: Lab200slot2.1397238981.812898.548918 [ 4] local 192.168.241.2 port 38616 connected to 192.168.241.3 port 5201 Starting Test: protocol: SCTP, 1 streams, 1452 byte blocks, omitting 0 seconds, 60 second test [ ID] Interval Transfer Bandwidth [ 4] 0.00-1.09 sec 20.8 MBytes 161 Mbits/sec [ 4] 1.09-2.13 sec 10.8 MBytes 86.8 Mbits/sec [ 4] 2.13-3.15 sec 3.57 MBytes 29.5 Mbits/sec [ 4] 3.15-4.16 sec 4.33 MBytes 35.7 Mbits/sec [ 4] 4.16-6.21 sec 10.4 MBytes 42.7 Mbits/sec [ 4] 6.21-6.21 sec 0.00 Bytes 0.00 bits/sec [ 4] 6.21-7.35 sec 34.6 MBytes 253 Mbits/sec [ 4] 7.35-11.45 sec 22.0 MBytes 45.0 Mbits/sec [ 4] 11.45-11.45 sec 0.00 Bytes 0.00 bits/sec [ 4] 11.45-11.45 sec 0.00 Bytes 0.00 bits/sec [ 4] 11.45-11.45 sec 0.00 Bytes 0.00 bits/sec [ 4] 11.45-12.51 sec 16.0 MBytes 126 Mbits/sec [ 4] 12.51-13.59 sec 20.3 MBytes 158 Mbits/sec [ 4] 13.59-14.65 sec 13.4 MBytes 107 Mbits/sec [ 4] 14.65-16.79 sec 33.3 MBytes 130 Mbits/sec [ 4] 16.79-16.79 sec 0.00 Bytes 0.00 bits/sec [ 4] 16.79-17.82 sec 5.94 MBytes 48.7 Mbits/sec
(etc)
[root@Lab200slot2 ~]# iperf3 --sctp -6 -c 2001:db8:0:f101::1 -V -l 1400 -t 60 iperf version 3.0.1 (10 January 2014)
Linux Lab200slot2 3.14.0 #1 SMP Thu Apr 3 23:18:29 EDT 2014 x86_64
Time: Fri, 11 Apr 2014 19:08:41 GMT
Connecting to host 2001:db8:0:f101::1, port 5201
Cookie: Lab200slot2.1397243321.714295.2b3f7c [ 4] local 2001:db8:0:f101::2 port 55804 connected to 2001:db8:0:f101::1 port 5201 Starting Test: protocol: SCTP, 1 streams, 1400 byte blocks, omitting 0 seconds, 60 second test [ ID] Interval Transfer Bandwidth [ 4] 0.00-1.00 sec 169 MBytes 1.42 Gbits/sec [ 4] 1.00-2.00 sec 201 MBytes 1.69 Gbits/sec [ 4] 2.00-3.00 sec 188 MBytes 1.58 Gbits/sec [ 4] 3.00-4.00 sec 174 MBytes 1.46 Gbits/sec [ 4] 4.00-5.00 sec 165 MBytes 1.39 Gbits/sec [ 4] 5.00-6.00 sec 199 MBytes 1.67 Gbits/sec [ 4] 6.00-7.00 sec 163 MBytes 1.36 Gbits/sec [ 4] 7.00-8.00 sec 174 MBytes 1.46 Gbits/sec [ 4] 8.00-9.00 sec 193 MBytes 1.62 Gbits/sec [ 4] 9.00-10.00 sec 196 MBytes 1.65 Gbits/sec [ 4] 10.00-11.00 sec 157 MBytes 1.31 Gbits/sec [ 4] 11.00-12.00 sec 175 MBytes 1.47 Gbits/sec [ 4] 12.00-13.00 sec 192 MBytes 1.61 Gbits/sec [ 4] 13.00-14.00 sec 199 MBytes 1.67 Gbits/sec
(etc)
After patch:
[root@Lab200slot2 ~]# iperf3 --sctp -4 -c 192.168.240.3 -V -l 1452 -t 60 iperf version 3.0.1 (10 January 2014)
Linux Lab200slot2 3.14.0+ #1 SMP Mon Apr 14 12:06:40 EDT 2014 x86_64
Time: Mon, 14 Apr 2014 16:40:48 GMT
Connecting to host 192.168.240.3, port 5201
Cookie: Lab200slot2.1397493648.413274.65e131 [ 4] local 192.168.240.2 port 50548 connected to 192.168.240.3 port 5201 Starting Test: protocol: SCTP, 1 streams, 1452 byte blocks, omitting 0 seconds, 60 second test [ ID] Interval Transfer Bandwidth [ 4] 0.00-1.00 sec 240 MBytes 2.02 Gbits/sec [ 4] 1.00-2.00 sec 239 MBytes 2.01 Gbits/sec [ 4] 2.00-3.00 sec 240 MBytes 2.01 Gbits/sec [ 4] 3.00-4.00 sec 239 MBytes 2.00 Gbits/sec [ 4] 4.00-5.00 sec 245 MBytes 2.05 Gbits/sec [ 4] 5.00-6.00 sec 240 MBytes 2.01 Gbits/sec [ 4] 6.00-7.00 sec 240 MBytes 2.02 Gbits/sec [ 4] 7.00-8.00 sec 239 MBytes 2.01 Gbits/sec
With the reverted patch applied, the SCTP/IPv4 performance is back to normal on latest upstream for IPv4 and IPv6 and has same throughput as 3.4.2 test kernel, steady and interval reports are smooth again.
--- include/net/sctp/structs.h | 14 +++++++ net/sctp/associola.c | 82 +++++++++++++++++++++++++++++++++++---------- net/sctp/sm_statefuns.c | 2 - net/sctp/socket.c | 6 +++ net/sctp/ulpevent.c | 8 +--- 5 files changed, 87 insertions(+), 25 deletions(-)
include/net/sctp/structs.h +13 -1
@@ -1653,6 +1653,17 @@ struct sctp_association {/* This is the last advertised value of rwnd over a SACK chunk. */ __u32 a_rwnd; +/* Number of bytes by which the rwnd has slopped. The rwnd is allowed +* to slop over a maximum of the association's frag_point. +*/ +__u32 rwnd_over; + +/* Keeps treack of rwnd pressure. This happens when we have +* a window, but not recevie buffer (i.e small packets). This one +* is releases slowly (1 PMTU at a time ). +*/ +__u32 rwnd_press; +/* This is the sndbuf size in use for the association. * This corresponds to the sndbuf size for the association, * as specified in the sk->sndbuf.
@@ -1881,7 +1892,8 @@ void sctp_assoc_update(struct sctp_assoc__u32 sctp_association_get_next_tsn (struct sctp_association *);void sctp_assoc_sync_pmtu (struct sock *,struct sctp_association *); -void sctp_assoc_rwnd_update (struct sctp_association *,bool ); +void sctp_assoc_rwnd_increase (struct sctp_association *,unsigned int ); +void sctp_assoc_rwnd_decrease (struct sctp_association *,unsigned int );void sctp_assoc_set_primary (struct sctp_association *,struct sctp_transport *); void sctp_assoc_del_nonprimary_peers(struct sctp_association *,
net/sctp/associola.c +65 -17
106 lines not on this page · raw message
net/sctp/sm_statefuns.c +1 -1
@@ -6178,7 +6178,7 @@ static int sctp_eat_data(const struct sc* PMTU. In cases, such as loopback, this might be a rather * large spill over. */ -if ((!chunk->data_accepted) && (!asoc->rwnd || +if ((!chunk->data_accepted) && (!asoc->rwnd || asoc->rwnd_over || (datalen > asoc->rwnd + asoc->frag_point))) {/* If this is the next TSN, consider reneging to make
net/sctp/socket.c +6 -0
@@ -2115,6 +2115,12 @@ static int sctp_recvmsg(struct kiocb *iosctp_skb_pull (skb, copied);skb_queue_head (&sk->sk_receive_queue, skb); +/* When only partial message is copied to the user, increase +* rwnd by that amount. If all the data in the skb is read, +* rwnd is updated when the event is freed. +*/ +if (!sctp_ulpevent_is_notification (event)) +sctp_assoc_rwnd_increase (event->asoc, copied); goto out; }else if ((event->msg_flags &MSG_NOTIFICATION ) || (event->msg_flags &MSG_EOR ))
net/sctp/ulpevent.c +2 -6
@@ -989,7 +989,7 @@ static void sctp_ulpevent_receive_data(s skb =sctp_event2skb (event);/* Set the owner and charge rwnd for bytes received. */ sctp_ulpevent_set_owner (event, asoc); -sctp_assoc_rwnd_update (asoc, false); +sctp_assoc_rwnd_decrease (asoc,skb_headlen (skb));if (!skb->data_len)return ;
@@ -1011,7 +1011,6 @@ static void sctp_ulpevent_release_data(s {struct sk_buff *skb, *frag;unsigned int len; -struct sctp_association *asoc;/* Current stack structures assume that the rcv buffer is * per socket. For UDP style sockets this is not true as
@@ -1036,11 +1035,8 @@ static void sctp_ulpevent_release_data(s } done: - asoc = event->asoc; -sctp_association_hold (asoc); +sctp_assoc_rwnd_increase (event->asoc, len);sctp_ulpevent_release_owner (event); -sctp_assoc_rwnd_update (asoc, true); -sctp_association_put (asoc); }static void sctp_ulpevent_release_frag_data (struct sctp_ulpevent *event)
Greg Kroah-Hartman
maintainerPATCH 78/140 net: Start with correct mac_len in skb_network_protocol
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Yasevich <[email protected]>
[ Upstream commit 1e785f48d29a09b6cf96db7b49b6320dada332e1 ]
Sometimes, when the packet arrives at skb_mac_gso_segment() its skb->mac_len already accounts for some of the mac lenght headers in the packet. This seems to happen when forwarding through and OpenSSL tunnel.
When we start looking for any vlan headers in skb_network_protocol() we seem to ignore any of the already known mac headers and start with an ETH_HLEN. This results in an incorrect offset, dropped TSO frames and general slowness of the connection.
We can start counting from the known skb->mac_len and return at least that much if all mac level headers are known and accounted for.
--- net/core/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/dev.c +1 -1
@@ -2289,7 +2289,7 @@ EXPORT_SYMBOL(skb_checksum_help);__be16 skb_network_protocol (struct sk_buff *skb,int *depth) {__be16 type = skb->protocol; -int vlan_depth =ETH_HLEN ; +int vlan_depth = skb->mac_len;/* Tunnel gso handlers can set protocol to ethernet. */ if (type ==htons (ETH_P_TEB )) {
Greg Kroah-Hartman
maintainerPATCH 79/140 ip6_gre: dont allow to remove the fb_tunnel_dev
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Dichtel <[email protected]>
[ Upstream commit 54d63f787b652755e66eb4dd8892ee6d3f5197fc ]
It's possible to remove the FB tunnel with the command 'ip link del ip6gre0' but this is unsafe, the module always supposes that this device exists. For example, ip6gre_tunnel_lookup() may use it unconditionally.
Let's add a rtnl handler for dellink, which will never remove the FB tunnel (we let ip6gre_destroy_tunnels() do the job).
Introduced by commit c12b395a4664 ("gre: Support GRE over IPv6").
--- net/ipv6/ip6_gre.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
net/ipv6/ip6_gre.c +10 -0
@@ -1566,6 +1566,15 @@ static int ip6gre_changelink(struct net_return 0 ; } +static void ip6gre_dellink (struct net_device *dev,struct list_head *head) +{ +struct net *net =dev_net (dev); +struct ip6gre_net *ign =net_generic (net, ip6gre_net_id); + +if (dev != ign->fb_tunnel_dev) +unregister_netdevice_queue (dev, head); +} +static size_t ip6gre_get_size (const struct net_device *dev) {return
@@ -1643,6 +1652,7 @@ static struct rtnl_link_ops ip6gre_link_ .validate = ip6gre_tunnel_validate, .newlink = ip6gre_newlink, .changelink = ip6gre_changelink, + .dellink = ip6gre_dellink, .get_size = ip6gre_get_size, .fill_info = ip6gre_fill_info, };
Greg Kroah-Hartman
maintainerPATCH 80/140 vlan: Fix lockdep warning when vlan dev handle notification
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: dingtianhong <[email protected]>
[ Upstream commit dc8eaaa006350d24030502a4521542e74b5cb39f ]
When I open the LOCKDEP config and run these steps:
modprobe 8021q
vconfig add eth2 20
vconfig add eth2.20 30
ifconfig eth2 xx.xx.xx.xx
then the Call Trace happened:
[32524.386288] =============================================
[32524.386293] [ INFO: possible recursive locking detected ]
[32524.386298] 3.14.0-rc2-0.7-default+ #35 Tainted: G O
[32524.386302] ---------------------------------------------
[32524.386306] ifconfig/3103 is trying to acquire lock:
[32524.386310] (&vlan_netdev_addr_lock_key/1){+.....}, at: [<ffffffff814275f4>] dev_mc_sync+0x64/0xb0
[32524.386326]
[32524.386326] but task is already holding lock:
[32524.386330] (&vlan_netdev_addr_lock_key/1){+.....}, at: [<ffffffff8141af83>] dev_set_rx_mode+0x23/0x40
[32524.386341]
[32524.386341] other info that might help us debug this:
[32524.386345] Possible unsafe locking scenario:
[32524.386345]
[32524.386350] CPU0
[32524.386352] ----
[32524.386354] lock(&vlan_netdev_addr_lock_key/1);
[32524.386359] lock(&vlan_netdev_addr_lock_key/1);
[32524.386364]
[32524.386364] *** DEADLOCK ***
[32524.386364]
[32524.386368] May be due to missing lock nesting notation
[32524.386368]
[32524.386373] 2 locks held by ifconfig/3103:
[32524.386376] #0: (rtnl_mutex){+.+.+.}, at: [<ffffffff81431d42>] rtnl_lock+0x12/0x20
[32524.386387] #1: (&vlan_netdev_addr_lock_key/1){+.....}, at: [<ffffffff8141af83>] dev_set_rx_mode+0x23/0x40
[32524.386398]
[32524.386398] stack backtrace:
[32524.386403] CPU: 1 PID: 3103 Comm: ifconfig Tainted: G O 3.14.0-rc2-0.7-default+ #35
[32524.386409] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007
[32524.386414] ffffffff81ffae40 ffff8800d9625ae8 ffffffff814f68a2 ffff8800d9625bc8
[32524.386421] ffffffff810a35fb ffff8800d8a8d9d0 00000000d9625b28 ffff8800d8a8e5d0
[32524.386428] 000003cc00000000 0000000000000002 ffff8800d8a8e5f8 0000000000000000
[32524.386435] Call Trace:
[32524.386441] [<ffffffff814f68a2>] dump_stack+0x6a/0x78
[32524.386448] [<ffffffff810a35fb>] __lock_acquire+0x7ab/0x1940
[32524.386454] [<ffffffff810a323a>] ? __lock_acquire+0x3ea/0x1940
[32524.386459] [<ffffffff810a4874>] lock_acquire+0xe4/0x110
[32524.386464] [<ffffffff814275f4>] ? dev_mc_sync+0x64/0xb0
[32524.386471] [<ffffffff814fc07a>] _raw_spin_lock_nested+0x2a/0x40
[32524.386476] [<ffffffff814275f4>] ? dev_mc_sync+0x64/0xb0
[32524.386481] [<ffffffff814275f4>] dev_mc_sync+0x64/0xb0
[32524.386489] [<ffffffffa0500cab>] vlan_dev_set_rx_mode+0x2b/0x50 [8021q]
[32524.386495] [<ffffffff8141addf>] __dev_set_rx_mode+0x5f/0xb0
[32524.386500] [<ffffffff8141af8b>] dev_set_rx_mode+0x2b/0x40
[32524.386506] [<ffffffff8141b3cf>] __dev_open+0xef/0x150
[32524.386511] [<ffffffff8141b177>] __dev_change_flags+0xa7/0x190
[32524.386516] [<ffffffff8141b292>] dev_change_flags+0x32/0x80
[32524.386524] [<ffffffff8149ca56>] devinet_ioctl+0x7d6/0x830
[32524.386532] [<ffffffff81437b0b>] ? dev_ioctl+0x34b/0x660
[32524.386540] [<ffffffff814a05b0>] inet_ioctl+0x80/0xa0
[32524.386550] [<ffffffff8140199d>] sock_do_ioctl+0x2d/0x60
[32524.386558] [<ffffffff81401a52>] sock_ioctl+0x82/0x2a0
[32524.386568] [<ffffffff811a7123>] do_vfs_ioctl+0x93/0x590
[32524.386578] [<ffffffff811b2705>] ? rcu_read_lock_held+0x45/0x50
[32524.386586] [<ffffffff811b39e5>] ? __fget_light+0x105/0x110
[32524.386594] [<ffffffff811a76b1>] SyS_ioctl+0x91/0xb0
[32524.386604] [<ffffffff815057e2>] system_call_fastpath+0x16/0x1b========================================================================
The reason is that all of the addr_lock_key for vlan dev have the same class, so if we change the status for vlan dev, the vlan dev and its real dev will hold the same class of addr_lock_key together, so the warning happened.
we should distinguish the lock depth for vlan dev and its real dev.
v1->v2: Convert the vlan_netdev_addr_lock_key to an array of eight elements, which
could support to add 8 vlan id on a same vlan dev, I think it is enough for current scene, because a netdev's name is limited to IFNAMSIZ which could not hold 8 vlan id, and the vlan dev would not meet the same class key with its real dev.
The new function vlan_dev_get_lockdep_subkey() will return the subkey and make the vlan dev could get a suitable class key.
v2->v3: According David's suggestion, I use the subclass to distinguish the lock key for vlan dev
and its real dev, but it make no sense, because the difference for subclass in the lock_class_key doesn't mean that the difference class for lock_key, so I use lock_depth to distinguish the different depth for every vlan dev, the same depth of the vlan dev could have the same lock_class_key, I import the MAX_LOCK_DEPTH from the include/linux/sched.h, I think it is enough here, the lockdep should never exceed that value.
v3->v4: Add a huge array of locking keys will waste static kernel memory and is not a appropriate method,
we could use _nested() variants to fix the problem, calculate the depth for every vlan dev, and use the depth as the subclass for addr_lock_key.
--- net/8021q/vlan_dev.c | 46 +++++++++++++++++++++++++++++++++++++++++----- net/core/dev.c | 1 + 2 files changed, 42 insertions(+), 5 deletions(-)
net/8021q/vlan_dev.c +41 -5
@@ -493,10 +493,48 @@ static void vlan_dev_change_rx_flags(str } } +static int vlan_calculate_locking_subclass (struct net_device *real_dev) +{ +int subclass =0 ; + +while (is_vlan_dev (real_dev)) { + subclass++; + real_dev =vlan_dev_priv (real_dev)->real_dev; + } + +return subclass; +} + +static void vlan_dev_mc_sync (struct net_device *to,struct net_device *from) +{ +int err =0 , subclass; + + subclass =vlan_calculate_locking_subclass (to); + +spin_lock_nested (&to->addr_list_lock, subclass); + err =__hw_addr_sync (&to->mc, &from->mc, to->addr_len); +if (!err) +__dev_set_rx_mode (to); +spin_unlock (&to->addr_list_lock); +} + +static void vlan_dev_uc_sync (struct net_device *to,struct net_device *from) +{ +int err =0 , subclass; + + subclass =vlan_calculate_locking_subclass (to); + +spin_lock_nested (&to->addr_list_lock, subclass); + err =__hw_addr_sync (&to->uc, &from->uc, to->addr_len); +if (!err) +__dev_set_rx_mode (to); +spin_unlock (&to->addr_list_lock); +} +static void vlan_dev_set_rx_mode (struct net_device *vlan_dev) { -dev_mc_sync (vlan_dev_priv (vlan_dev)->real_dev, vlan_dev); -dev_uc_sync (vlan_dev_priv (vlan_dev)->real_dev, vlan_dev); +vlan_dev_mc_sync (vlan_dev_priv (vlan_dev)->real_dev, vlan_dev); +vlan_dev_uc_sync (vlan_dev_priv (vlan_dev)->real_dev, vlan_dev); }/*
@@ -608,9 +646,7 @@ static int vlan_dev_init(struct net_deviSET_NETDEV_DEVTYPE (dev, &vlan_type); -if (is_vlan_dev (real_dev)) - subclass =1 ; - + subclass =vlan_calculate_locking_subclass (dev);vlan_dev_set_lockdep_class (dev, subclass); vlan_dev_priv(dev)->vlan_pcpu_stats = alloc_percpu(struct vlan_pcpu_stats);
net/core/dev.c +1 -0
@@ -5219,6 +5219,7 @@ void __dev_set_rx_mode(struct net_deviceif (ops->ndo_set_rx_mode) ops->ndo_set_rx_mode (dev); } +EXPORT_SYMBOL (__dev_set_rx_mode);void dev_set_rx_mode (struct net_device *dev) {
Greg Kroah-Hartman
maintainerPATCH 81/140 net: Find the nesting level of a given device by type.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Yasevich <[email protected]>
[ Upstream commit 4085ebe8c31face855fd01ee40372cb4aab1df3a ]
Multiple devices in the kernel can be stacked/nested and they need to know their nesting level for the purposes of lockdep. This patch provides a generic function that determines a nesting level of a particular device by its type (ex: vlan, macvlan, etc). We only care about nesting of the same type of devices.
For example:
eth0 <- vlan0.10 <- macvlan0 <- vlan1.20
The nesting level of vlan1.20 would be 1, since there is another vlan in the stack under it.
--- include/linux/netdevice.h | 10 +++++++++ net/core/dev.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+)
include/linux/netdevice.h +10 -0
@@ -2988,6 +2988,14 @@ void *netdev_lower_get_next_private_rcu(priv ; \ priv = netdev_lower_get_next_private_rcu(dev, &(iter))) +void *netdev_lower_get_next (struct net_device *dev, +struct list_head **iter); +#define netdev_for_each_lower_dev (dev, ldev, iter) \ + for (iter = &(dev)->adj_list.lower, \ + ldev = netdev_lower_get_next(dev, &(iter)); \ + ldev; \ + ldev = netdev_lower_get_next(dev, &(iter))) +void *netdev_adjacent_get_private (struct list_head *adj_list);void *netdev_lower_get_first_private_rcu (struct net_device *dev);struct net_device *netdev_master_upper_dev_get (struct net_device *dev);
@@ -3003,6 +3011,8 @@ void netdev_upper_dev_unlink(struct net_void netdev_adjacent_rename_links (struct net_device *dev,char *oldname);void *netdev_lower_dev_get_private (struct net_device *dev,struct net_device *lower_dev); +int dev_get_nest_level (struct net_device *dev, +bool (*type_check)(struct net_device *dev));int skb_checksum_help (struct sk_buff *skb);struct sk_buff *__skb_gso_segment (struct sk_buff *skb,netdev_features_t features,bool tx_path);
net/core/dev.c +50 -0
62 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 82/140 net: Allow for more then a single subclass for netif_addr_lock
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Yasevich <[email protected]>
[ Upstream commit 25175ba5c9bff9aaf0229df34bb5d54c81633ec3 ]
Currently netif_addr_lock_nested assumes that there can be only a single nesting level between 2 devices. However, if we have multiple devices of the same type stacked, this fails. For example:
eth0 <-- vlan0.10 <-- vlan0.10.20
A more complicated configuration may stack more then one type of device in different order.
Ex:
eth0 <-- vlan0.10 <-- macvlan0 <-- vlan1.10.20 <-- macvlan1
This patch adds an ndo_* function that allows each stackable device to report its nesting level. If the device doesn't provide this function default subclass of 1 is used.
--- include/linux/netdevice.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
include/linux/netdevice.h +7 -1
@@ -1145,6 +1145,7 @@ struct net_device_ops {netdev_tx_t (*ndo_dfwd_start_xmit) (struct sk_buff *skb,struct net_device *dev,void *priv); +int (*ndo_get_lock_subclass)(struct net_device *dev); };/*
@@ -2861,7 +2862,12 @@ static inline void netif_addr_lock(strucstatic inline void netif_addr_lock_nested (struct net_device *dev) { -spin_lock_nested (&dev->addr_list_lock,SINGLE_DEPTH_NESTING ); +int subclass =SINGLE_DEPTH_NESTING ; + +if (dev->netdev_ops->ndo_get_lock_subclass) + subclass = dev->netdev_ops->ndo_get_lock_subclass (dev); + +spin_lock_nested (&dev->addr_list_lock, subclass); }static inline void netif_addr_lock_bh (struct net_device *dev)
Greg Kroah-Hartman
maintainerPATCH 83/140 vlan: Fix lockdep warning with stacked vlan devices.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Yasevich <[email protected]>
[ Upstream commit d38569ab2bba6e6b3233acfc3a84cdbcfbd1f79f ]
This reverts commit dc8eaaa006350d24030502a4521542e74b5cb39f.
vlan: Fix lockdep warning when vlan dev handle notification
Instead we use the new new API to find the lock subclass of our vlan device. This way we can support configurations where vlans are interspersed with other devices:
bond -> vlan -> macvlan -> vlan
--- include/linux/if_vlan.h | 3 +- net/8021q/vlan.c | 1 net/8021q/vlan_dev.c | 53 +++++++++--------------------------------------- net/core/dev.c | 1 4 files changed, 13 insertions(+), 45 deletions(-)
include/linux/if_vlan.h +2 -1
@@ -73,7 +73,7 @@ static inline struct vlan_ethhdr *vlan_e/* found in socket.c */ extern void vlan_ioctl_set (int (*hook)(struct net *,void __user *)); -static inline int is_vlan_dev (struct net_device *dev) +static inline bool is_vlan_dev (struct net_device *dev) {return dev->priv_flags &IFF_802_1Q_VLAN ; }
@@ -158,6 +158,7 @@ struct vlan_dev_priv {#ifdef CONFIG_NET_POLL_CONTROLLER struct netpoll *netpoll;#endif +unsigned int nest_level; };static inline struct vlan_dev_priv *vlan_dev_priv (const struct net_device *dev)
net/8021q/vlan.c +1 -0
@@ -169,6 +169,7 @@ int register_vlan_dev(struct net_deviceif (err <0 ) goto out_uninit_mvrp; + vlan->nest_level =dev_get_nest_level (real_dev, is_vlan_dev) +1 ; err =register_netdevice (dev);if (err <0 ) goto out_uninit_mvrp;
net/8021q/vlan_dev.c +10 -43
85 lines not on this page · raw message
net/core/dev.c +0 -1
@@ -5269,7 +5269,6 @@ void __dev_set_rx_mode(struct net_deviceif (ops->ndo_set_rx_mode) ops->ndo_set_rx_mode (dev); } -EXPORT_SYMBOL (__dev_set_rx_mode);void dev_set_rx_mode (struct net_device *dev) {
Greg Kroah-Hartman
maintainerPATCH 84/140 macvlan: Fix lockdep warnings with stacked macvlan devices
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Yasevich <[email protected]>
[ Upstream commit c674ac30c549596295eb0a5af7f4714c0b905b6f ]
Macvlan devices try to avoid stacking, but that's not always successfull or even desired. As an example, the following configuration is perefectly legal and valid:
eth0 <--- macvlan0 <---- vlan0.10 <--- macvlan1
However, this configuration produces the following lockdep trace:
[ 115.620418] ======================================================
[ 115.620477] [ INFO: possible circular locking dependency detected ]
[ 115.620516] 3.15.0-rc1+ #24 Not tainted
[ 115.620540] -------------------------------------------------------
[ 115.620577] ip/1704 is trying to acquire lock:
[ 115.620604] (&vlan_netdev_addr_lock_key/1){+.....}, at: [<ffffffff815df49c>] dev_uc_sync+0x3c/0x80
[ 115.620686]
but task is already holding lock:
[ 115.620723] (&macvlan_netdev_addr_lock_key){+.....}, at: [<ffffffff815da5be>] dev_set_rx_mode+0x1e/0x40
[ 115.620795]which lock already depends on the new lock.
[ 115.620853]
the existing dependency chain (in reverse order) is:
[ 115.620894]
-> #1 (&macvlan_netdev_addr_lock_key){+.....}:
[ 115.620935] [<ffffffff810d57f2>] lock_acquire+0xa2/0x130
[ 115.620974] [<ffffffff816f62e7>] _raw_spin_lock_nested+0x37/0x50
[ 115.621019] [<ffffffffa07296c3>] vlan_dev_set_rx_mode+0x53/0x110 [8021q]
[ 115.621066] [<ffffffff815da557>] __dev_set_rx_mode+0x57/0xa0
[ 115.621105] [<ffffffff815da5c6>] dev_set_rx_mode+0x26/0x40
[ 115.621143] [<ffffffff815da6be>] __dev_open+0xde/0x140
[ 115.621174] [<ffffffff815da9ad>] __dev_change_flags+0x9d/0x170
[ 115.621174] [<ffffffff815daaa9>] dev_change_flags+0x29/0x60
[ 115.621174] [<ffffffff815e7f11>] do_setlink+0x321/0x9a0
[ 115.621174] [<ffffffff815ea59f>] rtnl_newlink+0x51f/0x730
[ 115.621174] [<ffffffff815e6e75>] rtnetlink_rcv_msg+0x95/0x250
[ 115.621174] [<ffffffff81608b19>] netlink_rcv_skb+0xa9/0xc0
[ 115.621174] [<ffffffff815e6dca>] rtnetlink_rcv+0x2a/0x40
[ 115.621174] [<ffffffff81608150>] netlink_unicast+0xf0/0x1c0
[ 115.621174] [<ffffffff8160851f>] netlink_sendmsg+0x2ff/0x740
[ 115.621174] [<ffffffff815bc9db>] sock_sendmsg+0x8b/0xc0
[ 115.621174] [<ffffffff815bd4b9>] ___sys_sendmsg+0x369/0x380
[ 115.621174] [<ffffffff815bdbb2>] __sys_sendmsg+0x42/0x80
[ 115.621174] [<ffffffff815bdc02>] SyS_sendmsg+0x12/0x20
[ 115.621174] [<ffffffff816ffd69>] system_call_fastpath+0x16/0x1b
[ 115.621174]
-> #0 (&vlan_netdev_addr_lock_key/1){+.....}:
[ 115.621174] [<ffffffff810d4d43>] __lock_acquire+0x1773/0x1a60
[ 115.621174] [<ffffffff810d57f2>] lock_acquire+0xa2/0x130
[ 115.621174] [<ffffffff816f62e7>] _raw_spin_lock_nested+0x37/0x50
[ 115.621174] [<ffffffff815df49c>] dev_uc_sync+0x3c/0x80
[ 115.621174] [<ffffffffa0696d2a>] macvlan_set_mac_lists+0xca/0x110 [macvlan]
[ 115.621174] [<ffffffff815da557>] __dev_set_rx_mode+0x57/0xa0
[ 115.621174] [<ffffffff815da5c6>] dev_set_rx_mode+0x26/0x40
[ 115.621174] [<ffffffff815da6be>] __dev_open+0xde/0x140
[ 115.621174] [<ffffffff815da9ad>] __dev_change_flags+0x9d/0x170
[ 115.621174] [<ffffffff815daaa9>] dev_change_flags+0x29/0x60
[ 115.621174] [<ffffffff815e7f11>] do_setlink+0x321/0x9a0
[ 115.621174] [<ffffffff815ea59f>] rtnl_newlink+0x51f/0x730
[ 115.621174] [<ffffffff815e6e75>] rtnetlink_rcv_msg+0x95/0x250
[ 115.621174] [<ffffffff81608b19>] netlink_rcv_skb+0xa9/0xc0
[ 115.621174] [<ffffffff815e6dca>] rtnetlink_rcv+0x2a/0x40
[ 115.621174] [<ffffffff81608150>] netlink_unicast+0xf0/0x1c0
[ 115.621174] [<ffffffff8160851f>] netlink_sendmsg+0x2ff/0x740
[ 115.621174] [<ffffffff815bc9db>] sock_sendmsg+0x8b/0xc0
[ 115.621174] [<ffffffff815bd4b9>] ___sys_sendmsg+0x369/0x380
[ 115.621174] [<ffffffff815bdbb2>] __sys_sendmsg+0x42/0x80
[ 115.621174] [<ffffffff815bdc02>] SyS_sendmsg+0x12/0x20
[ 115.621174] [<ffffffff816ffd69>] system_call_fastpath+0x16/0x1b
[ 115.621174]other info that might help us debug this:
[ 115.621174] Possible unsafe locking scenario:
[ 115.621174] CPU0 CPU1 [ 115.621174] ---- ---- [ 115.621174] lock(&macvlan_netdev_addr_lock_key); [ 115.621174] lock(&vlan_netdev_addr_lock_key/1); [ 115.621174] lock(&macvlan_netdev_addr_lock_key); [ 115.621174] lock(&vlan_netdev_addr_lock_key/1); [ 115.621174] *** DEADLOCK ***
[ 115.621174] 2 locks held by ip/1704:
[ 115.621174] #0: (rtnl_mutex){+.+.+.}, at: [<ffffffff815e6dbb>] rtnetlink_rcv+0x1b/0x40
[ 115.621174] #1: (&macvlan_netdev_addr_lock_key){+.....}, at: [<ffffffff815da5be>] dev_set_rx_mode+0x1e/0x40
[ 115.621174]
stack backtrace:
[ 115.621174] CPU: 3 PID: 1704 Comm: ip Not tainted 3.15.0-rc1+ #24
[ 115.621174] Hardware name: Hewlett-Packard HP xw8400 Workstation/0A08h, BIOS 786D5 v02.38 10/25/2010
[ 115.621174] ffffffff82339ae0 ffff880465f79568 ffffffff816ee20c ffffffff82339ae0
[ 115.621174] ffff880465f795a8 ffffffff816e9e1b ffff880465f79600 ffff880465b019c8
[ 115.621174] 0000000000000001 0000000000000002 ffff880465b019c8 ffff880465b01230
[ 115.621174] Call Trace:
[ 115.621174] [<ffffffff816ee20c>] dump_stack+0x4d/0x66
[ 115.621174] [<ffffffff816e9e1b>] print_circular_bug+0x200/0x20e
[ 115.621174] [<ffffffff810d4d43>] __lock_acquire+0x1773/0x1a60
[ 115.621174] [<ffffffff810d3172>] ? trace_hardirqs_on_caller+0xb2/0x1d0
[ 115.621174] [<ffffffff810d57f2>] lock_acquire+0xa2/0x130
[ 115.621174] [<ffffffff815df49c>] ? dev_uc_sync+0x3c/0x80
[ 115.621174] [<ffffffff816f62e7>] _raw_spin_lock_nested+0x37/0x50
[ 115.621174] [<ffffffff815df49c>] ? dev_uc_sync+0x3c/0x80
[ 115.621174] [<ffffffff815df49c>] dev_uc_sync+0x3c/0x80
[ 115.621174] [<ffffffffa0696d2a>] macvlan_set_mac_lists+0xca/0x110 [macvlan]
[ 115.621174] [<ffffffff815da557>] __dev_set_rx_mode+0x57/0xa0
[ 115.621174] [<ffffffff815da5c6>] dev_set_rx_mode+0x26/0x40
[ 115.621174] [<ffffffff815da6be>] __dev_open+0xde/0x140
[ 115.621174] [<ffffffff815da9ad>] __dev_change_flags+0x9d/0x170
[ 115.621174] [<ffffffff815daaa9>] dev_change_flags+0x29/0x60
[ 115.621174] [<ffffffff811e1db1>] ? mem_cgroup_bad_page_check+0x21/0x30
[ 115.621174] [<ffffffff815e7f11>] do_setlink+0x321/0x9a0
[ 115.621174] [<ffffffff810d394c>] ? __lock_acquire+0x37c/0x1a60
[ 115.621174] [<ffffffff815ea59f>] rtnl_newlink+0x51f/0x730
[ 115.621174] [<ffffffff815ea169>] ? rtnl_newlink+0xe9/0x730
[ 115.621174] [<ffffffff815e6e75>] rtnetlink_rcv_msg+0x95/0x250
[ 115.621174] [<ffffffff810d329d>] ? trace_hardirqs_on+0xd/0x10
[ 115.621174] [<ffffffff815e6dbb>] ? rtnetlink_rcv+0x1b/0x40
[ 115.621174] [<ffffffff815e6de0>] ? rtnetlink_rcv+0x40/0x40
[ 115.621174] [<ffffffff81608b19>] netlink_rcv_skb+0xa9/0xc0
[ 115.621174] [<ffffffff815e6dca>] rtnetlink_rcv+0x2a/0x40
[ 115.621174] [<ffffffff81608150>] netlink_unicast+0xf0/0x1c0
[ 115.621174] [<ffffffff8160851f>] netlink_sendmsg+0x2ff/0x740
[ 115.621174] [<ffffffff815bc9db>] sock_sendmsg+0x8b/0xc0
[ 115.621174] [<ffffffff8119d4af>] ? might_fault+0x5f/0xb0
[ 115.621174] [<ffffffff8119d4f8>] ? might_fault+0xa8/0xb0
[ 115.621174] [<ffffffff8119d4af>] ? might_fault+0x5f/0xb0
[ 115.621174] [<ffffffff815cb51e>] ? verify_iovec+0x5e/0xe0
[ 115.621174] [<ffffffff815bd4b9>] ___sys_sendmsg+0x369/0x380
[ 115.621174] [<ffffffff816faa0d>] ? __do_page_fault+0x11d/0x570
[ 115.621174] [<ffffffff810cfe9f>] ? up_read+0x1f/0x40
[ 115.621174] [<ffffffff816fab04>] ? __do_page_fault+0x214/0x570
[ 115.621174] [<ffffffff8120a10b>] ? mntput_no_expire+0x6b/0x1c0
[ 115.621174] [<ffffffff8120a0b7>] ? mntput_no_expire+0x17/0x1c0
[ 115.621174] [<ffffffff8120a284>] ? mntput+0x24/0x40
[ 115.621174] [<ffffffff815bdbb2>] __sys_sendmsg+0x42/0x80
[ 115.621174] [<ffffffff815bdc02>] SyS_sendmsg+0x12/0x20
[ 115.621174] [<ffffffff816ffd69>] system_call_fastpath+0x16/0x1bFix this by correctly providing macvlan lockdep class.
--- drivers/net/macvlan.c | 12 ++++++++++-- include/linux/if_macvlan.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-)
drivers/net/macvlan.c +10 -2
@@ -518,6 +518,11 @@ static struct lock_class_key macvlan_net#define MACVLAN_STATE_MASK \ ((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT)) +static int macvlan_get_nest_level (struct net_device *dev) +{ +return ((struct macvlan_dev *)netdev_priv (dev))->nest_level; +} +static void macvlan_set_lockdep_class_one (struct net_device *dev,struct netdev_queue *txq,void *_unused)
@@ -528,8 +533,9 @@ static void macvlan_set_lockdep_class_onstatic void macvlan_set_lockdep_class (struct net_device *dev) { -lockdep_set_class (&dev->addr_list_lock, - &macvlan_netdev_addr_lock_key); +lockdep_set_class_and_subclass (&dev->addr_list_lock, + &macvlan_netdev_addr_lock_key, +macvlan_get_nest_level (dev));netdev_for_each_tx_queue (dev, macvlan_set_lockdep_class_one,NULL ); }
@@ -731,6 +737,7 @@ static const struct net_device_ops macvl .ndo_fdb_add = macvlan_fdb_add, .ndo_fdb_del = macvlan_fdb_del, .ndo_fdb_dump = ndo_dflt_fdb_dump, + .ndo_get_lock_subclass = macvlan_get_nest_level, };void macvlan_common_setup (struct net_device *dev)
@@ -859,6 +866,7 @@ int macvlan_common_newlink(struct net *s vlan->dev = dev; vlan->port = port; vlan->set_features =MACVLAN_FEATURES ; + vlan->nest_level =dev_get_nest_level (lowerdev, netif_is_macvlan) +1 ; vlan->mode =MACVLAN_MODE_VEPA ;if (data && data[IFLA_MACVLAN_MODE ])
include/linux/if_macvlan.h +1 -0
@@ -56,6 +56,7 @@ struct macvlan_dev {int numqueues;netdev_features_t tap_features;int minor; +int nest_level; }; static inline void macvlan_count_rx(const struct macvlan_dev *vlan,
Greg Kroah-Hartman
maintainerPATCH 85/140 tg3: update rx_jumbo_pending ring param only when jumbo frames are enabled
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Vecera <[email protected]>
The patch fixes a problem with dropped jumbo frames after usage of 'ethtool -G ... rx'.
Scenario:
1. ip link set eth0 up
2. ethtool -G eth0 rx N # <- This zeroes rx-jumbo
3. ip link set mtu 9000 dev eth0
The ethtool command set rx_jumbo_pending to zero so any received jumbo packets are dropped and you need to use 'ethtool -G eth0 rx-jumbo N' to workaround the issue.
The patch changes the logic so rx_jumbo_pending value is changed only if jumbo frames are enabled (MTU > 1500).
--- drivers/net/ethernet/broadcom/tg3.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/tg3.c +3 -1
@@ -12294,7 +12294,9 @@ static int tg3_set_ringparam(struct net_if (tg3_flag (tp,MAX_RXPEND_64 ) && tp->rx_pending >63 ) tp->rx_pending =63 ; - tp->rx_jumbo_pending = ering->rx_jumbo_pending; + +if (tg3_flag (tp,JUMBO_RING_ENABLE )) + tp->rx_jumbo_pending = ering->rx_jumbo_pending;for (i =0 ; i < tp->irq_max; i++) tp->napi[i].tx_pending = ering->tx_pending;
Greg Kroah-Hartman
maintainerPATCH 86/140 net: sctp: cache auth_enable per endpoint
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Yasevich <[email protected]>
[ Upstream commit b14878ccb7fac0242db82720b784ab62c467c0dc ]
Currently, it is possible to create an SCTP socket, then switch auth_enable via sysctl setting to 1 and crash the system on connect:
Oops[#1]:
CPU: 0 PID: 0 Comm: swapper Not tainted 3.14.1-mipsgit-20140415 #1 task: ffffffff8056ce80 ti: ffffffff8055c000 task.ti: ffffffff8055c000 [...] Call Trace: [<ffffffff8043c4e8>] sctp_auth_asoc_set_default_hmac+0x68/0x80 [<ffffffff8042b300>] sctp_process_init+0x5e0/0x8a4 [<ffffffff8042188c>] sctp_sf_do_5_1B_init+0x234/0x34c [<ffffffff804228c8>] sctp_do_sm+0xb4/0x1e8 [<ffffffff80425a08>] sctp_endpoint_bh_rcv+0x1c4/0x214 [<ffffffff8043af68>] sctp_rcv+0x588/0x630 [<ffffffff8043e8e8>] sctp6_rcv+0x10/0x24 [<ffffffff803acb50>] ip6_input+0x2c0/0x440 [<ffffffff8030fc00>] __netif_receive_skb_core+0x4a8/0x564 [<ffffffff80310650>] process_backlog+0xb4/0x18c [<ffffffff80313cbc>] net_rx_action+0x12c/0x210 [<ffffffff80034254>] __do_softirq+0x17c/0x2ac [<ffffffff800345e0>] irq_exit+0x54/0xb0 [<ffffffff800075a4>] ret_from_irq+0x0/0x4 [<ffffffff800090ec>] rm7k_wait_irqoff+0x24/0x48 [<ffffffff8005e388>] cpu_startup_entry+0xc0/0x148 [<ffffffff805a88b0>] start_kernel+0x37c/0x398 Code: dd0900b8 000330f8 0126302d <dcc60000> 50c0fff1 0047182a a48306a0 03e00008 00000000 ---[ end trace b530b0551467f2fd ]--- Kernel panic - not syncing: Fatal exception in interrupt
What happens while auth_enable=0 in that case is, that ep->auth_hmacs is initialized to NULL in sctp_auth_init_hmacs() when endpoint is being created.
After that point, if an admin switches over to auth_enable=1, the machine can crash due to NULL pointer dereference during reception of an INIT chunk. When we enter sctp_process_init() via sctp_sf_do_5_1B_init() in order to respond to an INIT chunk, the INIT verification succeeds and while we walk and process all INIT params via sctp_process_param() we find that net->sctp.auth_enable is set, therefore do not fall through, but invoke sctp_auth_asoc_set_default_hmac() instead, and thus, dereference what we have set to NULL during endpoint initialization phase.
The fix is to make auth_enable immutable by caching its value during endpoint initialization, so that its original value is being carried along until destruction. The bug seems to originate from the very first days.
Fix in joint work with Daniel Borkmann.
--- include/net/sctp/structs.h | 4 ++- net/sctp/auth.c | 17 +++++--------- net/sctp/endpointola.c | 3 +- net/sctp/sm_make_chunk.c | 32 ++++++++++++++------------ net/sctp/sm_statefuns.c | 6 ++--- net/sctp/socket.c | 54 +++++++++++++++++++++------------------------ net/sctp/sysctl.c | 36 +++++++++++++++++++++++++++++- 7 files changed, 92 insertions(+), 60 deletions(-)
include/net/sctp/structs.h +3 -1
@@ -1241,6 +1241,7 @@ struct sctp_endpoint {/* SCTP-AUTH: endpoint shared keys */ struct list_head endpoint_shared_keys;__u16 active_key_id; +__u8 auth_enable; };/* Recover the outter endpoint structure. */
@@ -1269,7 +1270,8 @@ struct sctp_endpoint *sctp_endpoint_is_mint sctp_has_association (struct net *net,const union sctp_addr *laddr,const union sctp_addr *paddr); -int sctp_verify_init (struct net *net,const struct sctp_association *asoc, +int sctp_verify_init (struct net *net,const struct sctp_endpoint *ep, +const struct sctp_association *asoc,sctp_cid_t ,sctp_init_chunk_t *peer_init,struct sctp_chunk *chunk,struct sctp_chunk **err_chunk); int sctp_process_init(struct sctp_association *, struct sctp_chunk *chunk,
net/sctp/auth.c +6 -11
@@ -386,14 +386,13 @@ nomem:*/ int sctp_auth_asoc_init_active_key (struct sctp_association *asoc,gfp_t gfp) { -struct net *net =sock_net (asoc->base.sk);struct sctp_auth_bytes *secret;struct sctp_shared_key *ep_key;/* If we don't support AUTH, or peer is not capable * we don't need to do anything. */ -if (!net->sctp.auth_enable || !asoc->peer.auth_capable) +if (!asoc->ep->auth_enable || !asoc->peer.auth_capable)return 0 ;/* If the key_id is non-zero and we couldn't find an
@@ -440,16 +439,16 @@ struct sctp_shared_key *sctp_auth_get_sh*/ int sctp_auth_init_hmacs (struct sctp_endpoint *ep,gfp_t gfp) { -struct net *net =sock_net (ep->base.sk);struct crypto_hash *tfm =NULL ;__u16 id; -/* if the transforms are already allocted, we are done */ -if (!net->sctp.auth_enable) { +/* If AUTH extension is disabled, we are done */ +if (!ep->auth_enable) { ep->auth_hmacs =NULL ;return 0 ; } +/* If the transforms are already allocated, we are done */ if (ep->auth_hmacs)return 0 ;
@@ -665,12 +664,10 @@ static int __sctp_auth_cid(sctp_cid_t ch/* Check if peer requested that this chunk is authenticated */ int sctp_auth_send_cid (sctp_cid_t chunk,const struct sctp_association *asoc) { -struct net *net;if (!asoc)return 0 ; - net =sock_net (asoc->base.sk); -if (!net->sctp.auth_enable || !asoc->peer.auth_capable) +if (!asoc->ep->auth_enable || !asoc->peer.auth_capable)return 0 ;return __sctp_auth_cid (chunk, asoc->peer.peer_chunks);
@@ -679,12 +676,10 @@ int sctp_auth_send_cid(sctp_cid_t chunk,/* Check if we requested that peer authenticate this chunk. */ int sctp_auth_recv_cid (sctp_cid_t chunk,const struct sctp_association *asoc) { -struct net *net;if (!asoc)return 0 ; - net =sock_net (asoc->base.sk); -if (!net->sctp.auth_enable) +if (!asoc->ep->auth_enable)return 0 ; return __sctp_auth_cid(chunk,
net/sctp/endpointola.c +2 -1
@@ -68,7 +68,8 @@ static struct sctp_endpoint *sctp_endpoiif (!ep->digest)return NULL ; -if (net->sctp.auth_enable) { + ep->auth_enable = net->sctp.auth_enable; +if (ep->auth_enable) {/* Allocate space for HMACS and CHUNKS authentication * variables. There are arrays that we encode directly * into parameters to make the rest of the operations easier.
net/sctp/sm_make_chunk.c +17 -15
@@ -219,6 +219,7 @@ struct sctp_chunk *sctp_make_init(const gfp_t gfp, int vparam_len) {struct net *net =sock_net (asoc->base.sk); +struct sctp_endpoint *ep = asoc->ep;sctp_inithdr_t init;union sctp_params addrs;size_t chunksize;
@@ -278,7 +279,7 @@ struct sctp_chunk *sctp_make_init(const chunksize += vparam_len;/* Account for AUTH related parameters */ -if (net->sctp.auth_enable) { +if (ep->auth_enable) {/* Add random parameter length*/ chunksize +=sizeof (asoc->c.auth_random);
@@ -363,7 +364,7 @@ struct sctp_chunk *sctp_make_init(const }/* Add SCTP-AUTH chunks to the parameter list */ -if (net->sctp.auth_enable) { +if (ep->auth_enable) {sctp_addto_chunk (retval,sizeof (asoc->c.auth_random), asoc->c.auth_random);if (auth_hmacs)
@@ -2010,7 +2011,7 @@ static void sctp_process_ext_param(struc/* if the peer reports AUTH, assume that he * supports AUTH. */ -if (net->sctp.auth_enable) +if (asoc->ep->auth_enable) asoc->peer.auth_capable =1 ;break ;case SCTP_CID_ASCONF :
@@ -2102,6 +2103,7 @@ static sctp_ierror_t sctp_process_unk_pa* SCTP_IERROR_NO_ERROR - continue with the chunk */ static sctp_ierror_t sctp_verify_param(struct net *net, + const struct sctp_endpoint *ep, const struct sctp_association *asoc, union sctp_params param, sctp_cid_t cid,
@@ -2152,7 +2154,7 @@ static sctp_ierror_t sctp_verify_param(s goto fallthrough;case SCTP_PARAM_RANDOM : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fallthrough;/* SCTP-AUTH: Secion 6.1
@@ -2169,7 +2171,7 @@ static sctp_ierror_t sctp_verify_param(sbreak ;case SCTP_PARAM_CHUNKS : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fallthrough;/* SCTP-AUTH: Section 3.2
@@ -2185,7 +2187,7 @@ static sctp_ierror_t sctp_verify_param(sbreak ;case SCTP_PARAM_HMAC_ALGO : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fallthrough; hmacs = (struct sctp_hmac_algo_param *)param.p;
@@ -2220,10 +2222,9 @@ fallthrough: }/* Verify the INIT packet before we process it. */ -int sctp_verify_init (struct net *net,const struct sctp_association *asoc, -sctp_cid_t cid, -sctp_init_chunk_t *peer_init, -struct sctp_chunk *chunk, +int sctp_verify_init (struct net *net,const struct sctp_endpoint *ep, +const struct sctp_association *asoc,sctp_cid_t cid, +sctp_init_chunk_t *peer_init,struct sctp_chunk *chunk,struct sctp_chunk **errp) {union sctp_params param;
@@ -2264,8 +2265,8 @@ int sctp_verify_init(struct net *net, co/* Verify all the variable length parameters */ sctp_walk_params(param, peer_init, init_hdr.params) { - - result =sctp_verify_param (net, asoc, param, cid, chunk, errp); + result =sctp_verify_param (net, ep, asoc, param, cid, + chunk, errp);switch (result) {case SCTP_IERROR_ABORT :case SCTP_IERROR_NOMEM :
@@ -2497,6 +2498,7 @@ static int sctp_process_param(struct sctstruct sctp_af *af;union sctp_addr_param *addr_param;struct sctp_transport *t; +struct sctp_endpoint *ep = asoc->ep;/* We maintain all INIT parameters in network byte order all the * time. This allows us to not worry about whether the parameters
@@ -2636,7 +2638,7 @@ do_addr_param: goto fall_through;case SCTP_PARAM_RANDOM : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fall_through;/* Save peer's random parameter */
@@ -2649,7 +2651,7 @@ do_addr_param:break ;case SCTP_PARAM_HMAC_ALGO : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fall_through;/* Save peer's HMAC list */
@@ -2665,7 +2667,7 @@ do_addr_param:break ;case SCTP_PARAM_CHUNKS : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fall_through; asoc->peer.peer_chunks = kmemdup(param.p,
net/sctp/sm_statefuns.c +3 -3
@@ -357,7 +357,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(/* Verify the INIT chunk before processing it. */ err_chunk =NULL ; -if (!sctp_verify_init (net, asoc, chunk->chunk_hdr->type, +if (!sctp_verify_init (net, ep, asoc, chunk->chunk_hdr->type, (sctp_init_chunk_t *)chunk->chunk_hdr, chunk, &err_chunk)) {/* This chunk contains fatal error. It is to be discarded.
@@ -524,7 +524,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(s/* Verify the INIT chunk before processing it. */ err_chunk =NULL ; -if (!sctp_verify_init (net, asoc, chunk->chunk_hdr->type, +if (!sctp_verify_init (net, ep, asoc, chunk->chunk_hdr->type, (sctp_init_chunk_t *)chunk->chunk_hdr, chunk, &err_chunk)) {
@@ -1430,7 +1430,7 @@ static sctp_disposition_t sctp_sf_do_une/* Verify the INIT chunk before processing it. */ err_chunk =NULL ; -if (!sctp_verify_init (net, asoc, chunk->chunk_hdr->type, +if (!sctp_verify_init (net, ep, asoc, chunk->chunk_hdr->type, (sctp_init_chunk_t *)chunk->chunk_hdr, chunk, &err_chunk)) {/* This chunk contains fatal error. It is to be discarded.
net/sctp/socket.c +26 -28
188 lines not on this page · raw message
net/sctp/sysctl.c +35 -1
@@ -64,6 +64,9 @@ static int proc_sctp_do_rto_min(struct cstatic int proc_sctp_do_rto_max (struct ctl_table *ctl,int write,void __user *buffer,size_t *lenp,loff_t *ppos); +static int proc_sctp_do_auth (struct ctl_table *ctl,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos);static struct ctl_table sctp_table[] = { {
@@ -266,7 +269,7 @@ static struct ctl_table sctp_net_table[] .data = &init_net.sctp.auth_enable, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec, + .proc_handler = proc_sctp_do_auth, }, { .procname = "addr_scope_policy",
@@ -400,6 +403,37 @@ static int proc_sctp_do_rto_max(struct creturn ret; } +static int proc_sctp_do_auth (struct ctl_table *ctl,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos) +{ +struct net *net = current->nsproxy->net_ns; +struct ctl_table tbl; +int new_value, ret; + +memset (&tbl,0 ,sizeof (struct ctl_table )); + tbl.maxlen =sizeof (unsigned int ); + +if (write) + tbl.data = &new_value; +else + tbl.data = &net->sctp.auth_enable; + + ret =proc_dointvec (&tbl, write, buffer, lenp, ppos); + +if (write) { +struct sock *sk = net->sctp.ctl_sock; + + net->sctp.auth_enable = new_value; +/* Update the value in the control socket */ +lock_sock (sk); +sctp_sk (sk)->ep->auth_enable = new_value; +release_sock (sk); + } + +return ret; +} +int sctp_sysctl_net_register (struct net *net) {struct ctl_table *table = sctp_net_table;
Greg Kroah-Hartman
maintainerPATCH 87/140 net: Fix ns_capable check in sock_diag_put_filterinfo
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Lutomirski <[email protected]>
[ Upstream commit 78541c1dc60b65ecfce5a6a096fc260219d6784e ]
The caller needs capabilities on the namespace being queried, not on their own namespace. This is a security bug, although it likely has only a minor impact.
--- include/linux/sock_diag.h | 2 +- net/core/sock_diag.c | 4 ++-- net/packet/diag.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-)
include/linux/sock_diag.h +1 -1
@@ -23,7 +23,7 @@ int sock_diag_check_cookie(void *sk, __uvoid sock_diag_save_cookie (void *sk,__u32 *cookie);int sock_diag_put_meminfo (struct sock *sk,struct sk_buff *skb,int attr); -int sock_diag_put_filterinfo (struct user_namespace *user_ns,struct sock *sk, +int sock_diag_put_filterinfo (struct sock *sk,struct sk_buff *skb,int attrtype);#endif
net/core/sock_diag.c +2 -2
@@ -49,7 +49,7 @@ int sock_diag_put_meminfo(struct sock *s }EXPORT_SYMBOL_GPL (sock_diag_put_meminfo); -int sock_diag_put_filterinfo (struct user_namespace *user_ns,struct sock *sk, +int sock_diag_put_filterinfo (struct sock *sk,struct sk_buff *skb,int attrtype) {struct nlattr *attr;
@@ -57,7 +57,7 @@ int sock_diag_put_filterinfo(struct userunsigned int len;int err =0 ; -if (!ns_capable (user_ns,CAP_NET_ADMIN )) { +if (!ns_capable (sock_net (sk)->user_ns,CAP_NET_ADMIN )) {nla_reserve (skb, attrtype,0 );return 0 ; }
net/packet/diag.c +1 -1
@@ -172,7 +172,7 @@ static int sk_diag_fill(struct sock *sk, goto out_nlmsg_trim;if ((req->pdiag_show &PACKET_SHOW_FILTER ) && -sock_diag_put_filterinfo (user_ns, sk, skb,PACKET_DIAG_FILTER )) +sock_diag_put_filterinfo (sk, skb,PACKET_DIAG_FILTER )) goto out_nlmsg_trim;return nlmsg_end (skb, nlh);
Greg Kroah-Hartman
maintainerPATCH 88/140 rtnetlink: Warn when interfaces information wont fit in our packet
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Gibson <[email protected]>
[ Upstream commit 973462bbde79bb827824c73b59027a0aed5c9ca6 ]
Without IFLA_EXT_MASK specified, the information reported for a single interface in response to RTM_GETLINK is expected to fit within a netlink packet of NLMSG_GOODSIZE.
If it doesn't, however, things will go badly wrong, When listing all interfaces, netlink_dump() will incorrectly treat -EMSGSIZE on the first message in a packet as the end of the listing and omit information for that interface and all subsequent ones. This can cause getifaddrs(3) to enter an infinite loop.
This patch won't fix the problem, but it will WARN_ON() making it easier to track down what's going wrong.
--- net/core/rtnetlink.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
net/core/rtnetlink.c +12 -5
@@ -1130,6 +1130,7 @@ static int rtnl_dump_ifinfo(struct sk_bustruct hlist_head *head;struct nlattr *tb[IFLA_MAX +1 ];u32 ext_filter_mask =0 ; +int err; s_h = cb->args[0 ]; s_idx = cb->args[1 ];
@@ -1150,11 +1151,17 @@ static int rtnl_dump_ifinfo(struct sk_buhlist_for_each_entry_rcu (dev, head, index_hlist) {if (idx < s_idx) goto cont; -if (rtnl_fill_ifinfo (skb, dev,RTM_NEWLINK , -NETLINK_CB (cb->skb).portid, - cb->nlh->nlmsg_seq,0 , -NLM_F_MULTI , - ext_filter_mask) <=0 ) + err =rtnl_fill_ifinfo (skb, dev,RTM_NEWLINK , +NETLINK_CB (cb->skb).portid, + cb->nlh->nlmsg_seq,0 , +NLM_F_MULTI , + ext_filter_mask); +/* If we ran out of room on the first message, +* we're in trouble +*/ +WARN_ON ((err == -EMSGSIZE ) && (skb->len ==0 )); + +if (err <=0 ) goto out;nl_dump_check_consistent (cb,nlmsg_hdr (skb));
Greg Kroah-Hartman
maintainerPATCH 89/140 rtnetlink: Only supply IFLA_VF_PORTS information when RTEXT_FILTER_VF is set
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Gibson <[email protected]>
[ Upstream commit c53864fd60227de025cb79e05493b13f69843971 ]
Since 115c9b81928360d769a76c632bae62d15206a94a (rtnetlink: Fix problem with buffer allocation), RTM_NEWLINK messages only contain the IFLA_VFINFO_LIST attribute if they were solicited by a GETLINK message containing an IFLA_EXT_MASK attribute with the RTEXT_FILTER_VF flag.
That was done because some user programs broke when they received more data than expected - because IFLA_VFINFO_LIST contains information for each VF it can become large if there are many VFs.
However, the IFLA_VF_PORTS attribute, supplied for devices which implement ndo_get_vf_port (currently the 'enic' driver only), has the same problem. It supplies per-VF information and can therefore become large, but it is not currently conditional on the IFLA_EXT_MASK value.
Worse, it interacts badly with the existing EXT_MASK handling. When IFLA_EXT_MASK is not supplied, the buffer for netlink replies is fixed at NLMSG_GOODSIZE. If the information for IFLA_VF_PORTS exceeds this, then rtnl_fill_ifinfo() returns -EMSGSIZE on the first message in a packet. netlink_dump() will misinterpret this as having finished the listing and omit data for this interface and all subsequent ones. That can cause getifaddrs(3) to enter an infinite loop.
This patch addresses the problem by only supplying IFLA_VF_PORTS when IFLA_EXT_MASK is supplied with the RTEXT_FILTER_VF flag set.
--- net/core/rtnetlink.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
net/core/rtnetlink.c +10 -6
@@ -774,7 +774,8 @@ static inline int rtnl_vfinfo_size(constreturn 0 ; } -static size_t rtnl_port_size (const struct net_device *dev) +static size_t rtnl_port_size (const struct net_device *dev, +u32 ext_filter_mask) {size_t port_size =nla_total_size (4 )/* PORT_VF */ +nla_total_size (PORT_PROFILE_MAX )/* PORT_PROFILE */
@@ -790,7 +791,8 @@ static size_t rtnl_port_size(const strucsize_t port_self_size =nla_total_size (sizeof (struct nlattr )) + port_size; -if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent) +if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent || + !(ext_filter_mask &RTEXT_FILTER_VF ))return 0 ;if (dev_num_vf (dev->dev.parent)) return port_self_size + vf_ports_size +
@@ -825,7 +827,7 @@ static noinline size_t if_nlmsg_size(con +nla_total_size (ext_filter_mask &RTEXT_FILTER_VF ?4 :0 )/* IFLA_NUM_VF */ +rtnl_vfinfo_size (dev, ext_filter_mask)/* IFLA_VFINFO_LIST */ - +rtnl_port_size (dev)/* IFLA_VF_PORTS + IFLA_PORT_SELF */ + +rtnl_port_size (dev, ext_filter_mask)/* IFLA_VF_PORTS + IFLA_PORT_SELF */ +rtnl_link_get_size (dev)/* IFLA_LINKINFO */ +rtnl_link_get_af_size (dev)/* IFLA_AF_SPEC */ +nla_total_size (MAX_PHYS_PORT_ID_LEN );/* IFLA_PHYS_PORT_ID */
@@ -887,11 +889,13 @@ static int rtnl_port_self_fill(struct skreturn 0 ; } -static int rtnl_port_fill (struct sk_buff *skb,struct net_device *dev) +static int rtnl_port_fill (struct sk_buff *skb,struct net_device *dev, +u32 ext_filter_mask) {int err; -if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent) +if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent || + !(ext_filter_mask &RTEXT_FILTER_VF ))return 0 ; err =rtnl_port_self_fill (skb, dev);
@@ -1076,7 +1080,7 @@ static int rtnl_fill_ifinfo(struct sk_bunla_nest_end (skb, vfinfo); } -if (rtnl_port_fill (skb, dev)) +if (rtnl_port_fill (skb, dev, ext_filter_mask)) goto nla_put_failure;if (dev->rtnl_link_ops ||rtnl_have_link_slave_info (dev)) {
Greg Kroah-Hartman
maintainerPATCH 90/140 ipv6: fib: fix fib dump restart
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kumar Sundararajan <[email protected]>
[ Upstream commit 1c2658545816088477e91860c3a645053719cb54 ]
When the ipv6 fib changes during a table dump, the walk is restarted and the number of nodes dumped are skipped. But the existing code doesn't advance to the next node after a node is skipped. This can cause the dump to loop or produce lots of duplicates when the fib is modified during the dump.
This change advances the walk to the next node if the current node is skipped after a restart.
--- net/ipv6/ip6_fib.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv6/ip6_fib.c +2 -1
@@ -1418,7 +1418,7 @@ static int fib6_walk_continue(struct fibif (w->skip) { w->skip--; -continue ; + goto skip; } err = w->func (w);
@@ -1428,6 +1428,7 @@ static int fib6_walk_continue(struct fib w->count++;continue ; } +skip: w->state =FWS_U ;case FWS_U :if (fn == w->root)
Greg Kroah-Hartman
maintainerPATCH 91/140 bridge: Handle IFLA_ADDRESS correctly when creating bridge device
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Toshiaki Makita <[email protected]>
[ Upstream commit 30313a3d5794472c3548d7288e306a5492030370 ]
When bridge device is created with IFLA_ADDRESS, we are not calling br_stp_change_bridge_id(), which leads to incorrect local fdb management and bridge id calculation, and prevents us from receiving frames on the bridge device.
--- net/bridge/br_netlink.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
net/bridge/br_netlink.c +15 -0
@@ -445,6 +445,20 @@ static int br_validate(struct nlattr *tbreturn 0 ; } +static int br_dev_newlink (struct net *src_net,struct net_device *dev, +struct nlattr *tb[],struct nlattr *data[]) +{ +struct net_bridge *br =netdev_priv (dev); + +if (tb[IFLA_ADDRESS ]) { +spin_lock_bh (&br->lock); +br_stp_change_bridge_id (br,nla_data (tb[IFLA_ADDRESS ])); +spin_unlock_bh (&br->lock); + } + +return register_netdevice (dev); +} +static size_t br_get_link_af_size (const struct net_device *dev) {struct net_port_vlans *pv;
@@ -473,6 +487,7 @@ struct rtnl_link_ops br_link_ops __read_ .priv_size = sizeof(struct net_bridge), .setup = br_dev_setup, .validate = br_validate, + .newlink = br_dev_newlink, .dellink = br_dev_delete, };
Greg Kroah-Hartman
maintainerPATCH 92/140 sctp: reset flowi4_oif parameter on route lookup
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xufeng Zhang <[email protected]>
[ Upstream commit 85350871317a5adb35519d9dc6fc9e80809d42ad ]
commit 813b3b5db83 (ipv4: Use caller's on-stack flowi as-is in output route lookups.) introduces another regression which is very similar to the problem of commit e6b45241c (ipv4: reset flowi parameters on route connect) wants to fix:
Before we call ip_route_output_key() in sctp_v4_get_dst() to get a dst that matches a bind address as the source address, we have already called this function previously and the flowi parameters have been initialized including flowi4_oif, so when we call this function again, the process in __ip_route_output_key() will be different because of the setting of flowi4_oif, and we'll get a networking device which corresponds to the inputted flowi4_oif as the output device, this is wrong because we'll never hit this place if the previously returned source address of dst match one of the bound addresses.
To reproduce this problem, a vlan setting is enough:
# ifconfig eth0 up # route del default # vconfig add eth0 2 # vconfig add eth0 3 # ifconfig eth0.2 10.0.1.14 netmask 255.255.255.0 # route add default gw 10.0.1.254 dev eth0.2 # ifconfig eth0.3 10.0.0.14 netmask 255.255.255.0 # ip rule add from 10.0.0.14 table 4 # ip route add table 4 default via 10.0.0.254 src 10.0.0.14 dev eth0.3 # sctp_darn -H 10.0.0.14 -P 36422 -h 10.1.4.134 -p 36422 -s -I You'll detect that all the flow are routed to eth0.2(10.0.1.254).
--- net/sctp/protocol.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
net/sctp/protocol.c +6 -1
@@ -491,8 +491,13 @@ static void sctp_v4_get_dst(struct sctp_continue ;if ((laddr->state ==SCTP_ADDR_SRC ) && (AF_INET == laddr->a.sa.sa_family)) { - fl4->saddr = laddr->a.v4.sin_addr.s_addr; fl4->fl4_sport = laddr->a.v4.sin_port; +flowi4_update_output (fl4, + asoc->base.sk->sk_bound_dev_if, +RT_CONN_FLAGS (asoc->base.sk), + daddr->v4.sin_addr.s_addr, + laddr->a.v4.sin_addr.s_addr); + rt =ip_route_output_key (sock_net (sk), fl4);if (!IS_ERR (rt)) { dst = &rt->dst;
Greg Kroah-Hartman
maintainerPATCH 93/140 net: qmi_wwan: add Sierra Wireless EM7355
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit b85f5deaf052340021d025e120a9858f084a1d79 ]
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -724,6 +724,7 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ {QMI_FIXED_INTF(0x1199, 0x68a2, 19)}, /* Sierra Wireless MC7710 in QMI mode */ {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ + {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */ {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
Greg Kroah-Hartman
maintainerPATCH 94/140 net: qmi_wwan: add Sierra Wireless MC73xx
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit 1c138607a7be64074d7fba68d0d533ec38f9d17b ]
--- drivers/net/usb/qmi_wwan.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/usb/qmi_wwan.c +3 -0
@@ -723,6 +723,9 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ {QMI_FIXED_INTF(0x1199, 0x68a2, 19)}, /* Sierra Wireless MC7710 in QMI mode */ + {QMI_FIXED_INTF(0x1199, 0x68c0, 8)}, /* Sierra Wireless MC73xx */ + {QMI_FIXED_INTF(0x1199, 0x68c0, 10)}, /* Sierra Wireless MC73xx */ + {QMI_FIXED_INTF(0x1199, 0x68c0, 11)}, /* Sierra Wireless MC73xx */ {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */
Greg Kroah-Hartman
maintainerPATCH 95/140 net: qmi_wwan: add Sierra Wireless MC7305/MC7355
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit 9214224e43e4264b02686ea8b455f310935607b5 ]
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -728,6 +728,7 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x1199, 0x68c0, 11)}, /* Sierra Wireless MC73xx */ {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ + {QMI_FIXED_INTF(0x1199, 0x9041, 8)}, /* Sierra Wireless MC7305/MC7355 */ {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */ {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
Greg Kroah-Hartman
maintainerPATCH 96/140 net: qmi_wwan: add Olivetti Olicard 500
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit efc0b25c3add97717ece57bf5319792ca98f348e ]
Device interface layout:
0: ff/ff/ff - serial
1: ff/ff/ff - serial AT+PPP
2: 08/06/50 - storage
3: ff/ff/ff - serial
4: ff/ff/ff - QMI/wwan
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -736,6 +736,7 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */ {QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */ {QMI_FIXED_INTF(0x0b3c, 0xc005, 6)}, /* Olivetti Olicard 200 */ + {QMI_FIXED_INTF(0x0b3c, 0xc00b, 4)}, /* Olivetti Olicard 500 */ {QMI_FIXED_INTF(0x1e2d, 0x0060, 4)}, /* Cinterion PLxx */ {QMI_FIXED_INTF(0x1e2d, 0x0053, 4)}, /* Cinterion PHxx,PXxx */
Greg Kroah-Hartman
maintainerPATCH 97/140 net: qmi_wwan: add Alcatel L800MA
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit 75573660c47a0db7cc931dcf154945610e02130a ]
Device interface layout:
0: ff/ff/ff - serial
1: ff/00/00 - serial AT+PPP
2: ff/ff/ff - QMI/wwan
3: 08/06/50 - storage
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -731,6 +731,7 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x1199, 0x9041, 8)}, /* Sierra Wireless MC7305/MC7355 */ {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */ {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ + {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
Greg Kroah-Hartman
maintainerPATCH 98/140 net: qmi_wwan: add a number of CMOTech devices
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit 41be7d90993b1502d445bfc59e58348c258ce66a ]
A number of older CMOTech modems are based on Qualcomm chips and exporting a QMI/wwan function.
--- drivers/net/usb/qmi_wwan.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/net/usb/qmi_wwan.c +16 -0
@@ -662,6 +662,22 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ + {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ + {QMI_FIXED_INTF(0x16d8, 0x6007, 0)}, /* CMOTech CHE-628S */ + {QMI_FIXED_INTF(0x16d8, 0x6008, 0)}, /* CMOTech CMU-301 */ + {QMI_FIXED_INTF(0x16d8, 0x6280, 0)}, /* CMOTech CHU-628 */ + {QMI_FIXED_INTF(0x16d8, 0x7001, 0)}, /* CMOTech CHU-720S */ + {QMI_FIXED_INTF(0x16d8, 0x7002, 0)}, /* CMOTech 7002 */ + {QMI_FIXED_INTF(0x16d8, 0x7003, 4)}, /* CMOTech CHU-629K */ + {QMI_FIXED_INTF(0x16d8, 0x7004, 3)}, /* CMOTech 7004 */ + {QMI_FIXED_INTF(0x16d8, 0x7006, 5)}, /* CMOTech CGU-629 */ + {QMI_FIXED_INTF(0x16d8, 0x700a, 4)}, /* CMOTech CHU-629S */ + {QMI_FIXED_INTF(0x16d8, 0x7211, 0)}, /* CMOTech CHU-720I */ + {QMI_FIXED_INTF(0x16d8, 0x7212, 0)}, /* CMOTech 7212 */ + {QMI_FIXED_INTF(0x16d8, 0x7213, 0)}, /* CMOTech 7213 */ + {QMI_FIXED_INTF(0x16d8, 0x7251, 1)}, /* CMOTech 7251 */ + {QMI_FIXED_INTF(0x16d8, 0x7252, 1)}, /* CMOTech 7252 */ + {QMI_FIXED_INTF(0x16d8, 0x7253, 1)}, /* CMOTech 7253 */ {QMI_FIXED_INTF(0x19d2, 0x0002, 1)}, {QMI_FIXED_INTF(0x19d2, 0x0012, 1)}, {QMI_FIXED_INTF(0x19d2, 0x0017, 3)},
Greg Kroah-Hartman
maintainerPATCH 99/140 net: qmi_wwan: add a number of Dell devices
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit 6f10c5d1b1aeddb63d33070abb8bc5a177beeb1f ]
Dan writes:
"The Dell drivers use the same configuration for PIDs:
81A2: Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card 81A3: Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card 81A4: Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card 81A8: Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card 81A9: Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card
These devices are all clearly Sierra devices, but are also definitely Gobi-based. The A8 might be the MC7700/7710 and A9 is likely a MC7750.
Quoted 1 line
Quoted 1 line
From DellGobi5kSetup.exe from the Dell drivers:
usbif0: serial/firmware loader?
usbif2: nmea
usbif3: modem/ppp
usbif8: net/QMI"
--- drivers/net/usb/qmi_wwan.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/usb/qmi_wwan.c +5 -0
@@ -756,6 +756,11 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x0b3c, 0xc00b, 4)}, /* Olivetti Olicard 500 */ {QMI_FIXED_INTF(0x1e2d, 0x0060, 4)}, /* Cinterion PLxx */ {QMI_FIXED_INTF(0x1e2d, 0x0053, 4)}, /* Cinterion PHxx,PXxx */ + {QMI_FIXED_INTF(0x413c, 0x81a2, 8)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */ + {QMI_FIXED_INTF(0x413c, 0x81a3, 8)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card */ + {QMI_FIXED_INTF(0x413c, 0x81a4, 8)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ + {QMI_FIXED_INTF(0x413c, 0x81a8, 8)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card */ + {QMI_FIXED_INTF(0x413c, 0x81a9, 8)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card *//* 4. Gobi 1000 devices */ {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
Greg Kroah-Hartman
maintainerPATCH 100/140 slip: fix spinlock variant
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Hartkopp <[email protected]>
[ Upstream commit ddcde142bed44490e338ed1124cb149976d355bb ]
With commit cc9fa74e2a ("slip/slcan: added locking in wakeup function") a formerly missing locking was added to slip.c and slcan.c by Andre Naujoks.
Alexander Stein contributed the fix 367525c8c2 ("can: slcan: Fix spinlock variant") as the kernel lock debugging advised to use spin_lock_bh() instead of just using spin_lock().
This fix has to be applied to the same code section in slip.c for the same reason too.
--- drivers/net/slip/slip.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/slip/slip.c +3 -3
@@ -429,13 +429,13 @@ static void slip_write_wakeup(struct ttyif (!sl || sl->magic !=SLIP_MAGIC || !netif_running (sl->dev))return ; -spin_lock (&sl->lock); +spin_lock_bh (&sl->lock);if (sl->xleft <=0 ) {/* Now serial buffer is almost free & we can start * transmission of another packet */ sl->dev->stats.tx_packets++;clear_bit (TTY_DO_WRITE_WAKEUP , &tty->flags); -spin_unlock (&sl->lock); +spin_unlock_bh (&sl->lock);sl_unlock (sl);return ; }
@@ -443,7 +443,7 @@ static void slip_write_wakeup(struct tty actual = tty->ops->write (tty, sl->xhead, sl->xleft); sl->xleft -= actual; sl->xhead += actual; -spin_unlock (&sl->lock); +spin_unlock_bh (&sl->lock); }static void sl_tx_timeout (struct net_device *dev)
Greg Kroah-Hartman
maintainerPATCH 101/140 net: sctp: Dont transition to PF state when transport has exhausted Path.Max.Retrans.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karl Heiss <[email protected]>
[ Upstream commit 8c2eab9097dba50bcd73ed4632baccc3f34857f9 ]
Don't transition to the PF state on every strike after 'Path.Max.Retrans'. Per draft-ietf-tsvwg-sctp-failover-03 Section 5.1.6:
Additional (PMR - PFMR) consecutive timeouts on a PF destination confirm the path failure, upon which the destination transitions to the Inactive state. As described in [RFC4960], the sender (i) SHOULD notify ULP about this state transition, and (ii) transmit heartbeats to the Inactive destination at a lower frequency as described in Section 8.3 of [RFC4960].
This also prevents sending SCTP_ADDR_UNREACHABLE to the user as the state bounces between SCTP_INACTIVE and SCTP_PF for each subsequent strike.
--- net/sctp/sm_sideeffect.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/sctp/sm_sideeffect.c +3 -4
@@ -496,11 +496,10 @@ static void sctp_do_8_2_transport_strike/* If the transport error count is greater than the pf_retrans * threshold, and less than pathmaxrtx, and if the current state -* is not SCTP_UNCONFIRMED, then mark this transport as Partially -* Failed, see SCTP Quick Failover Draft, section 5.1 +* is SCTP_ACTIVE, then mark this transport as Partially Failed, +* see SCTP Quick Failover Draft, section 5.1 */ -if ((transport->state !=SCTP_PF ) && - (transport->state !=SCTP_UNCONFIRMED ) && +if ((transport->state ==SCTP_ACTIVE ) && (asoc->pf_retrans < transport->pathmaxrxt) && (transport->error_count > asoc->pf_retrans)) {
Greg Kroah-Hartman
maintainerPATCH 102/140 mactap: Fix checksum errors for non-gso packets in bridge mode
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Yasevich <[email protected]>
[ Upstream commit cbdb04279ccaefcc702c8757757eea8ed76e50cf ]
The following is a problematic configuration:
VM1: virtio-net device connected to macvtap0@eth0
VM2: e1000 device connect to macvtap1@eth0
The problem is is that virtio-net supports checksum offloading and thus sends the packets to the host with CHECKSUM_PARTIAL set. On the other hand, e1000 does not support any acceleration.
For small TCP packets (and this includes the 3-way handshake), e1000 ends up receiving packets that only have a partial checksum set. This causes TCP to fail checksum validation and to drop packets. As a result tcp connections can not be established.
Commit 3e4f8b787370978733ca6cae452720a4f0c296b8
macvtap: Perform GSO on forwarding path.
fixes this issue for large packets wthat will end up undergoing GSO. This commit adds a check for the non-GSO case and attempts to compute the checksum for partially checksummed packets in the non-GSO case.
--- drivers/net/macvtap.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/macvtap.c +9 -0
@@ -322,6 +322,15 @@ static rx_handler_result_t macvtap_handl segs = nskb; } }else { +/* If we receive a partial checksum and the tap side +* doesn't support checksum offload, compute the checksum. +* Note: it doesn't matter which checksum feature to +* check, we either support them all or none. +*/ +if (skb->ip_summed ==CHECKSUM_PARTIAL && + !(features &NETIF_F_ALL_CSUM ) && +skb_checksum_help (skb)) + goto drop;skb_queue_tail (&q->sk.sk_receive_queue, skb); }
Greg Kroah-Hartman
maintainerPATCH 103/140 Revert "macvlan : fix checksums error when we are in bridge mode"
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Yasevich <[email protected]>
[ Upstream commit f114890cdf84d753f6b41cd0cc44ba51d16313da ]
This reverts commit 12a2856b604476c27d85a5f9a57ae1661fc46019. The commit above doesn't appear to be necessary any more as the checksums appear to be correctly computed/validated.
Additionally the above commit breaks kvm configurations where one VM is using a device that support checksum offload (virtio) and the other VM does not.
In this case, packets leaving virtio device will have CHECKSUM_PARTIAL set. The packets is forwarded to a macvtap that has offload features turned off. Since we use CHECKSUM_UNNECESSARY, the host does does not update the checksum and thus a bad checksum is passed up to the guest.
--- drivers/net/macvlan.c | 3 --- 1 file changed, 3 deletions(-)
drivers/net/macvlan.c +0 -3
@@ -263,11 +263,9 @@ static int macvlan_queue_xmit(struct sk_const struct macvlan_dev *vlan =netdev_priv (dev);const struct macvlan_port *port = vlan->port;const struct macvlan_dev *dest; -__u8 ip_summed = skb->ip_summed;if (vlan->mode ==MACVLAN_MODE_BRIDGE ) {const struct ethhdr *eth = (void *)skb->data; - skb->ip_summed =CHECKSUM_UNNECESSARY ;/* send to other bridge ports directly */ if (is_multicast_ether_addr (eth->h_dest)) {
@@ -285,7 +283,6 @@ static int macvlan_queue_xmit(struct sk_ } xmit_world: - skb->ip_summed = ip_summed; skb->dev = vlan->lowerdev;return dev_queue_xmit (skb); }
Greg Kroah-Hartman
maintainerPATCH 104/140 tcp_cubic: fix the range of delayed_ack
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liu Yu <[email protected]>
[ Upstream commit 0cda345d1b2201dd15591b163e3c92bad5191745 ]
commit b9f47a3aaeab (tcp_cubic: limit delayed_ack ratio to prevent divide error) try to prevent divide error, but there is still a little chance that delayed_ack can reach zero. In case the param cnt get negative value, then ratio+cnt would overflow and may happen to be zero. As a result, min(ratio, ACK_RATIO_LIMIT) will calculate to be zero.
In some old kernels, such as 2.6.32, there is a bug that would pass negative param, which then ultimately leads to this divide error.
commit 5b35e1e6e9c (tcp: fix tcp_trim_head() to adjust segment count with skb MSS) fixed the negative param issue. However, it's safe that we fix the range of delayed_ack as well, to make sure we do not hit a divide by zero.
--- net/ipv4/tcp_cubic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_cubic.c +1 -1
@@ -409,7 +409,7 @@ static void bictcp_acked(struct sock *sk ratio -= ca->delayed_ack >>ACK_RATIO_SHIFT ; ratio += cnt; - ca->delayed_ack =min (ratio,ACK_RATIO_LIMIT ); + ca->delayed_ack =clamp (ratio,1U ,ACK_RATIO_LIMIT ); }/* Some calls are for duplicates without timetamps */
Greg Kroah-Hartman
maintainerPATCH 105/140 net: sched: lock imbalance in hhf qdisc
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Fastabend <[email protected]>
[ Upstream commit f6a082fed1e6407c2f4437d0d963b1bcbe5f9f58 ]
hhf_change() takes the sch_tree_lock and releases it but misses the error cases. Fix the missed case here.
To reproduce try a command like this,
# tc qdisc change dev p3p2 root hhf quantum 40960 non_hh_weight 300000
--- net/sched/sch_hhf.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
net/sched/sch_hhf.c +6 -5
@@ -553,11 +553,6 @@ static int hhf_change(struct Qdisc *sch,if (err <0 )return err; -sch_tree_lock (sch); - -if (tb[TCA_HHF_BACKLOG_LIMIT ]) - sch->limit =nla_get_u32 (tb[TCA_HHF_BACKLOG_LIMIT ]); -if (tb[TCA_HHF_QUANTUM ]) new_quantum =nla_get_u32 (tb[TCA_HHF_QUANTUM ]);
@@ -567,6 +562,12 @@ static int hhf_change(struct Qdisc *sch, non_hh_quantum = (u64 )new_quantum * new_hhf_non_hh_weight;if (non_hh_quantum >INT_MAX )return -EINVAL ; + +sch_tree_lock (sch); + +if (tb[TCA_HHF_BACKLOG_LIMIT ]) + sch->limit =nla_get_u32 (tb[TCA_HHF_BACKLOG_LIMIT ]); + q->quantum = new_quantum; q->hhf_non_hh_weight = new_hhf_non_hh_weight;
Greg Kroah-Hartman
maintainerPATCH 106/140 vsock: Make transport the proto owner
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy King <[email protected]>
[ Upstream commit 2c4a336e0a3e203fab6aa8d8f7bb70a0ad968a6b ]
Right now the core vsock module is the owner of the proto family. This means there's nothing preventing the transport module from unloading if there are open sockets, which results in a panic. Fix that by allowing the transport to be the owner, which will refcount it properly.
Includes version bump to 1.0.1.0-k
Passes checkpatch this time, I swear...
--- include/net/af_vsock.h | 6 +++++- net/vmw_vsock/af_vsock.c | 47 ++++++++++++++++++++++------------------------- 2 files changed, 27 insertions(+), 26 deletions(-)
include/net/af_vsock.h +5 -1
@@ -155,7 +155,11 @@ struct vsock_transport {/**** CORE ****/ -int vsock_core_init (const struct vsock_transport *t); +int __vsock_core_init (const struct vsock_transport *t,struct module *owner); +static inline int vsock_core_init (const struct vsock_transport *t) +{ +return __vsock_core_init (t,THIS_MODULE ); +}void vsock_core_exit (void );/**** UTILS ****/
net/vmw_vsock/af_vsock.c +22 -25
72 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 107/140 net: cdc_ncm: fix buffer overflow
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit 9becd707841207652449a8dfd90fe9c476d88546 ]
Commit 4d619f625a60 ("net: cdc_ncm: no point in filling up the NTBs if we send ZLPs") changed the padding logic for devices with the ZLP flag set. This meant that frames of any size will be sent without additional padding, except for the single byte added if the size is a multiple of the USB packet size. But if the unpadded size is identical to the maximum frame size, and the maximum size is a multiplum of the USB packet size, then this one-byte padding will overflow the buffer.
Prevent padding if already at maximum frame size, letting usbnet transmit a ZLP instead in this case.
Reported by: Yu-an Shih <[email protected]>
--- drivers/net/usb/cdc_ncm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/usb/cdc_ncm.c +1 -1
@@ -768,7 +768,7 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev skb_out->len > CDC_NCM_MIN_TX_PKT)memset (skb_put (skb_out, ctx->tx_max - skb_out->len),0 , ctx->tx_max - skb_out->len); - else if ((skb_out->len % dev->maxpacket) == 0) + else if (skb_out->len < ctx->tx_max && (skb_out->len % dev->maxpacket) == 0) *skb_put(skb_out, 1) = 0; /* force short packet *//* set final frame length */
Greg Kroah-Hartman
maintainerPATCH 108/140 net/mlx4_core: Dont issue PCIe speed/width checks for VFs
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eyal Perry <[email protected]>
[ Upstream commit 83d3459a5928f18c9344683e31bc2a7c3c25562a ]
Carrying out PCI speed/width checks through pcie_get_minimum_link() on VFs yield wrong results, so remove them.
--- drivers/net/ethernet/mellanox/mlx4/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx4/main.c +2 -1
@@ -2399,7 +2399,8 @@ slave_start:* No return code for this call, just warn the user in case of PCI * express device capabilities are under-satisfied by the bus. */ -mlx4_check_pcie_caps (dev); +if (!mlx4_is_slave (dev)) +mlx4_check_pcie_caps (dev);/* In master functions, the communication channel must be initialized * after obtaining its address from fw */
Greg Kroah-Hartman
maintainerPATCH 109/140 ip_tunnel: Set network header properly for IP_ECN_decapsulate()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ying Cai <[email protected]>
[ Upstream commit e96f2e7c430014eff52c93cabef1ad4f42ed0db1 ]
In ip_tunnel_rcv(), set skb->network_header to inner IP header before IP_ECN_decapsulate().
Without the fix, IP_ECN_decapsulate() takes outer IP header as inner IP header, possibly causing error messages or packet drops.
Note that this skb_reset_network_header() call was in this spot when the original feature for checking consistency of ECN bits through tunnels was added in eccc1bb8d4b4 ("tunnel: drop packet if ECN present with not-ECT"). It was only removed from this spot in 3d7b46cd20e3 ("ip_tunnel: push generic protocol handling to ip_tunnel module.").
--- net/ipv4/ip_tunnel.c | 2 ++ 1 file changed, 2 insertions(+)
net/ipv4/ip_tunnel.c +2 -0
@@ -438,6 +438,8 @@ int ip_tunnel_rcv(struct ip_tunnel *tunn tunnel->i_seqno =ntohl (tpi->seq) +1 ; } +skb_reset_network_header (skb); + err =IP_ECN_decapsulate (iph, skb);if (unlikely (err)) {if (log_ecn_error)
Greg Kroah-Hartman
maintainerPATCH 110/140 ipv4: ip_tunnels: disable cache for nbma gre tunnels
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <[email protected]>
[ Upstream commit 22fb22eaebf4d16987f3fd9c3484c436ee0badf2 ]
The connected check fails to check for ip_gre nbma mode tunnels properly. ip_gre creates temporary tnl_params with daddr specified to pass-in the actual target on per-packet basis from neighbor layer. Detect these tunnels by inspecting the actual tunnel configuration.
Minimal test case:
ip route add 192.168.1.1/32 via 10.0.0.1
ip route add 192.168.1.2/32 via 10.0.0.2
ip tunnel add nbma0 mode gre key 1 tos c0
ip addr add 172.17.0.0/16 dev nbma0
ip link set nbma0 up
ip neigh add 172.17.0.1 lladdr 192.168.1.1 dev nbma0 ip neigh add 172.17.0.2 lladdr 192.168.1.2 dev nbma0 ping 172.17.0.1
ping 172.17.0.2
The second ping should be going to 192.168.1.2 and head 10.0.0.2; but cached gre tunnel level route is used and it's actually going to 192.168.1.1 via 10.0.0.1.
The lladdr's need to go to separate dst for the bug to trigger. Test case uses separate route entries, but this can also happen when the route entry is same: if there is a nexthop exception or the GRE tunnel is IPsec'ed in which case the dst points to xfrm bundle unique to the gre lladdr.
--- net/ipv4/ip_tunnel.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv4/ip_tunnel.c +2 -1
@@ -536,9 +536,10 @@ void ip_tunnel_xmit(struct sk_buff *skb,unsigned int max_headroom;/* The extra header space needed */ __be32 dst;int err; -bool connected = true; +bool connected; inner_iph = (const struct iphdr *)skb_inner_network_header (skb); + connected = (tunnel->parms.iph.daddr !=0 ); dst = tnl_params->daddr;if (dst ==0 ) {
Greg Kroah-Hartman
maintainerPATCH 111/140 net: cdc_mbim: __vlan_find_dev_deep need rcu_read_lock
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit 4f4178f3bb1f470d7fb863ec531e08e20a0fd51c ]
Fixes this warning introduced by commit 5b8f15f78e6f ("net: cdc_mbim: handle IPv6 Neigbor Solicitations"):
===============================
[ INFO: suspicious RCU usage. ]
3.15.0-rc3 #213 Tainted: G W O
-------------------------------net/8021q/vlan_core.c:69 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
rcu_scheduler_active = 1, debug_locks = 1
no locks held by ksoftirqd/0/3.
stack backtrace: CPU: 0 PID: 3 Comm: ksoftirqd/0 Tainted: G W O 3.15.0-rc3 #213 Hardware name: LENOVO 2776LEG/2776LEG, BIOS 6EET55WW (3.15 ) 12/19/2011 0000000000000001 ffff880232533bf0 ffffffff813a5ee6 0000000000000006 ffff880232530090 ffff880232533c20 ffffffff81076b94 0000000000000081 0000000000000000 ffff8802085ac000 ffff88007fc8ea00 ffff880232533c50 Call Trace: [<ffffffff813a5ee6>] dump_stack+0x4e/0x68 [<ffffffff81076b94>] lockdep_rcu_suspicious+0xfa/0x103 [<ffffffff813978a6>] __vlan_find_dev_deep+0x54/0x94 [<ffffffffa04a1938>] cdc_mbim_rx_fixup+0x379/0x66a [cdc_mbim] [<ffffffff813ab76f>] ? _raw_spin_unlock_irqrestore+0x3a/0x49 [<ffffffff81079671>] ? trace_hardirqs_on_caller+0x192/0x1a1 [<ffffffffa059bd10>] usbnet_bh+0x59/0x287 [usbnet] [<ffffffff8104067d>] tasklet_action+0xbb/0xcd [<ffffffff81040057>] __do_softirq+0x14c/0x30d [<ffffffff81040237>] run_ksoftirqd+0x1f/0x50 [<ffffffff8105f13e>] smpboot_thread_fn+0x172/0x18e [<ffffffff8105efcc>] ? SyS_setgroups+0xdf/0xdf [<ffffffff810594b0>] kthread+0xb5/0xbd [<ffffffff813a84b1>] ? __wait_for_common+0x13b/0x170 [<ffffffff810593fb>] ? __kthread_parkme+0x5c/0x5c [<ffffffff813b147c>] ret_from_fork+0x7c/0xb0 [<ffffffff810593fb>] ? __kthread_parkme+0x5c/0x5c
--- drivers/net/usb/cdc_mbim.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
drivers/net/usb/cdc_mbim.c +13 -5
@@ -204,17 +204,23 @@ static void do_neigh_solicit(struct usbnreturn ;/* need to send the NA on the VLAN dev, if any */ -if (tci) +rcu_read_lock (); +if (tci) { netdev =__vlan_find_dev_deep (dev->net,htons (ETH_P_8021Q ), tci); -else +if (!netdev) { +rcu_read_unlock (); +return ; + } + }else { netdev = dev->net; -if (!netdev) -return ; + } +dev_hold (netdev); +rcu_read_unlock (); in6_dev =in6_dev_get (netdev);if (!in6_dev) -return ; + goto out; is_router = !!in6_dev->cnf.forwarding;in6_dev_put (in6_dev);
@@ -224,6 +230,8 @@ static void do_neigh_solicit(struct usbn true/* solicited */ , false/* override */ , true /* inc_opt */); +out: +dev_put (netdev); }static bool is_neigh_solicit (u8 *buf,size_t len)
Greg Kroah-Hartman
maintainerPATCH 112/140 net: ipv4: ip_forward: fix inverted local_df test
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit ca6c5d4ad216d5942ae544bbf02503041bd802aa ]
local_df means 'ignore DF bit if set', so if its set we're allowed to perform ip fragmentation.
This wasn't noticed earlier because the output path also drops such skbs (and emits needed icmp error) and because netfilter ip defrag did not set local_df until couple of days ago.
Only difference is that DF-packets-larger-than MTU now discarded earlier (f.e. we avoid pointless netfilter postrouting trip).
While at it, drop the repeated test ip_exceeds_mtu, checking it once is enough...
--- net/ipv4/ip_forward.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/ip_forward.c +2 -2
@@ -42,12 +42,12 @@static bool ip_may_fragment (const struct sk_buff *skb) {return unlikely ((ip_hdr (skb)->frag_off &htons (IP_DF )) ==0 ) || - !skb->local_df; + skb->local_df; }static bool ip_exceeds_mtu (const struct sk_buff *skb,unsigned int mtu) { -if (skb->len <= mtu || skb->local_df) +if (skb->len <= mtu)return false;if (skb_is_gso (skb) &&skb_gso_network_seglen (skb) <= mtu)
Greg Kroah-Hartman
maintainerPATCH 113/140 net: ipv6: send pkttoobig immediately if orig frag size > mtu
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit 418a31561d594a2b636c1e2fa94ecd9e1245abb1 ]
If conntrack defragments incoming ipv6 frags it stores largest original frag size in ip6cb and sets ->local_df.
We must thus first test the largest original frag size vs. mtu, and not vice versa.
Without this patch PKTTOOBIG is still generated in ip6_fragment() later in the stack, but
1) IPSTATS_MIB_INTOOBIGERRORS won't increment
2) packet did (needlessly) traverse netfilter postrouting hook.
--- net/ipv6/ip6_output.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/ipv6/ip6_output.c +5 -1
@@ -344,12 +344,16 @@ static unsigned int ip6_dst_mtu_forward(static bool ip6_pkt_too_big (const struct sk_buff *skb,unsigned int mtu) { -if (skb->len <= mtu || skb->local_df) +if (skb->len <= mtu)return false; +/* ipv6 conntrack defrag sets max_frag_size + local_df */ if (IP6CB (skb)->frag_max_size &&IP6CB (skb)->frag_max_size > mtu)return true; +if (skb->local_df) +return false; +if (skb_is_gso (skb) &&skb_gso_network_seglen (skb) <= mtu)return false;
Greg Kroah-Hartman
maintainerPATCH 114/140 ipv4: fib_semantics: increment fib_info_cnt after fib_info allocation
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Popovich <[email protected]>
[ Upstream commit aeefa1ecfc799b0ea2c4979617f14cecd5cccbfd ]
Increment fib_info_cnt in fib_create_info() right after successfuly alllocating fib_info structure, overwise fib_metrics allocation failure leads to fib_info_cnt incorrectly decremented in free_fib_info(), called on error path from fib_create_info().
--- net/ipv4/fib_semantics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/fib_semantics.c +1 -1
@@ -820,13 +820,13 @@ struct fib_info *fib_create_info(struct fi =kzalloc (sizeof (*fi)+nhs*sizeof (struct fib_nh ),GFP_KERNEL );if (fi ==NULL ) goto failure; + fib_info_cnt++;if (cfg->fc_mx) { fi->fib_metrics =kzalloc (sizeof (u32) *RTAX_MAX ,GFP_KERNEL );if (!fi->fib_metrics) goto failure; }else fi->fib_metrics = (u32 *) dst_default_metrics; - fib_info_cnt++; fi->fib_net =hold_net (net); fi->fib_protocol = cfg->fc_protocol;
Greg Kroah-Hartman
maintainerPATCH 115/140 net: cdc_mbim: handle unaccelerated VLAN tagged frames
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit 6b5eeb7f874b689403e52a646e485d0191ab9507 ]
This driver maps 802.1q VLANs to MBIM sessions. The mapping is based on a bogus assumption that all tagged frames will use the acceleration API because we enable NETIF_F_HW_VLAN_CTAG_TX. This fails for e.g. frames tagged in userspace using packet sockets. Such frames will erroneously be considered as untagged and silently dropped based on not being IP.
Fix by falling back to looking into the ethernet header for a tag if no accelerated tag was found.
--- drivers/net/usb/cdc_mbim.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-)
drivers/net/usb/cdc_mbim.c +28 -11
@@ -120,6 +120,16 @@ static void cdc_mbim_unbind(struct usbnecdc_ncm_unbind (dev, intf); } +/* verify that the ethernet protocol is IPv4 or IPv6 */ +static bool is_ip_proto (__be16 proto) +{ +switch (proto) { +case htons (ETH_P_IP ): +case htons (ETH_P_IPV6 ): +return true; + } +return false; +}static struct sk_buff *cdc_mbim_tx_fixup (struct usbnet *dev,struct sk_buff *skb,gfp_t flags) {
@@ -128,6 +138,7 @@ static struct sk_buff *cdc_mbim_tx_fixupstruct cdc_ncm_ctx *ctx = info->ctx;__le32 sign =cpu_to_le32 (USB_CDC_MBIM_NDP16_IPS_SIGN );u16 tci =0 ; +bool is_ip;u8 *c;if (!ctx)
@@ -137,25 +148,32 @@ static struct sk_buff *cdc_mbim_tx_fixupif (skb->len <=ETH_HLEN ) goto error; +/* Some applications using e.g. packet sockets will +* bypass the VLAN acceleration and create tagged +* ethernet frames directly. We primarily look for +* the accelerated out-of-band tag, but fall back if +* required +*/ +skb_reset_mac_header (skb); +if (vlan_get_tag (skb, &tci) <0 && skb->len >VLAN_ETH_HLEN && +__vlan_get_tag (skb, &tci) ==0 ) { + is_ip =is_ip_proto (vlan_eth_hdr (skb)->h_vlan_encapsulated_proto); +skb_pull (skb,VLAN_ETH_HLEN ); + }else { + is_ip =is_ip_proto (eth_hdr (skb)->h_proto); +skb_pull (skb,ETH_HLEN ); + } +/* mapping VLANs to MBIM sessions: * no tag => IPS session <0> * 1 - 255 => IPS session <vlanid> * 256 - 511 => DSS session <vlanid - 256> * 512 - 4095 => unsupported, drop */ -vlan_get_tag (skb, &tci); -switch (tci &0x0f00 ) {case 0x0000 :/* VLAN ID 0 - 255 */ -/* verify that datagram is IPv4 or IPv6 */ -skb_reset_mac_header (skb); -switch (eth_hdr (skb)->h_proto) { -case htons (ETH_P_IP ): -case htons (ETH_P_IPV6 ): -break ; -default : +if (!is_ip) goto error; - } c = (u8 *)&sign; c[3 ] = tci;break ;
@@ -169,7 +187,6 @@ static struct sk_buff *cdc_mbim_tx_fixup "unsupported tci=0x%04x\n", tci); goto error; } -skb_pull (skb,ETH_HLEN ); }spin_lock_bh (&ctx->mtx);
Greg Kroah-Hartman
maintainerPATCH 116/140 macvlan: Dont propagate IFF_ALLMULTI changes on down interfaces.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Christensen <[email protected]>
[ Upstream commit bbeb0eadcf9fe74fb2b9b1a6fea82cd538b1e556 ]
Clearing the IFF_ALLMULTI flag on a down interface could cause an allmulti overflow on the underlying interface.
Attempting the set IFF_ALLMULTI on the underlying interface would cause an error and the log message:
"allmulti touches root, set allmulti failed."
--- drivers/net/macvlan.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/macvlan.c +4 -2
@@ -458,8 +458,10 @@ static void macvlan_change_rx_flags(strustruct macvlan_dev *vlan =netdev_priv (dev);struct net_device *lowerdev = vlan->lowerdev; -if (change &IFF_ALLMULTI ) -dev_set_allmulti (lowerdev, dev->flags &IFF_ALLMULTI ?1 :-1 ); +if (dev->flags &IFF_UP ) { +if (change &IFF_ALLMULTI ) +dev_set_allmulti (lowerdev, dev->flags &IFF_ALLMULTI ?1 :-1 ); + } }static void macvlan_set_mac_lists (struct net_device *dev)
Greg Kroah-Hartman
maintainerPATCH 117/140 sfc: fix calling of free_irq with already free vector
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikolay Aleksandrov <[email protected]>
[ Upstream commit 1c3639005f48492e5f2d965779efd814e80f8b15 ]
If the sfc driver is in legacy interrupt mode (either explicitly by using interrupt_mode module param or by falling back to it) it will hit a warning at kernel/irq/manage.c because it will try to free an irq which wasn't allocated by it in the first place because the MSI(X) irqs are zero and it'll try to free them unconditionally. So fix it by checking if we're in legacy mode and freeing the appropriate irqs.
--- drivers/net/ethernet/sfc/nic.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/net/ethernet/sfc/nic.c +8 -6
@@ -156,13 +156,15 @@ void efx_nic_fini_interrupt(struct efx_n efx->net_dev->rx_cpu_rmap =NULL ;#endif -/* Disable MSI/MSI-X interrupts */ -efx_for_each_channel (channel, efx) -free_irq (channel->irq, &efx->msi_context[channel->channel]); - -/* Disable legacy interrupt */ -if (efx->legacy_irq) +if (EFX_INT_MODE_USE_MSI (efx)) { +/* Disable MSI/MSI-X interrupts */ +efx_for_each_channel (channel, efx) +free_irq (channel->irq, + &efx->msi_context[channel->channel]); + }else { +/* Disable legacy interrupt */ free_irq (efx->legacy_irq, efx); + } }/* Register dump */
Greg Kroah-Hartman
maintainerPATCH 118/140 ip6_tunnel: fix potential NULL pointer dereference
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Susant Sahani <[email protected]>
[ Upstream commit c8965932a2e3b70197ec02c6741c29460279e2a8 ]
The function ip6_tnl_validate assumes that the rtnl attribute IFLA_IPTUN_PROTO always be filled . If this attribute is not filled by the userspace application kernel get crashed with NULL pointer dereference. This patch fixes the potential kernel crash when IFLA_IPTUN_PROTO is missing .
--- net/ipv6/ip6_tunnel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/ip6_tunnel.c +1 -1
@@ -1564,7 +1564,7 @@ static int ip6_tnl_validate(struct nlatt {u8 proto; -if (!data) +if (!data || !data[IFLA_IPTUN_PROTO ])return 0 ; proto =nla_get_u8 (data[IFLA_IPTUN_PROTO ]);
Greg Kroah-Hartman
maintainerPATCH 119/140 neigh: set nud_state to NUD_INCOMPLETE when probing router reachability
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duan Jiong <[email protected]>
[ Upstream commit 2176d5d41891753774f648b67470398a5acab584 ]
Since commit 7e98056964("ipv6: router reachability probing"), a router falls into NUD_FAILED will be probed.
Now if function rt6_select() selects a router which neighbour state is NUD_FAILED, and at the same time function rt6_probe() changes the neighbour state to NUD_PROBE, then function dst_neigh_output() can directly send packets, but actually the neighbour still is unreachable. If we set nud_state to NUD_INCOMPLETE instead NUD_PROBE, packets will not be sent out until the neihbour is reachable.
In addition, because the route should be probes with a single NS, so we must set neigh->probes to neigh_max_probes(), then the neigh timer timeout and function neigh_timer_handler() will not send other NS Messages.
--- net/core/neighbour.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/core/neighbour.c +2 -2
@@ -1247,8 +1247,8 @@ void __neigh_set_probe_once(struct neigh neigh->updated = jiffies;if (!(neigh->nud_state &NUD_FAILED ))return ; - neigh->nud_state =NUD_PROBE ; -atomic_set (&neigh->probes,NEIGH_VAR (neigh->parms,UCAST_PROBES )); + neigh->nud_state =NUD_INCOMPLETE ; +atomic_set (&neigh->probes,neigh_max_probes (neigh));neigh_add_timer (neigh, jiffies +NEIGH_VAR (neigh->parms,RETRANS_TIME )); }
Greg Kroah-Hartman
maintainerPATCH 120/140 batman-adv: fix neigh_ifinfo imbalance
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Wunderlich <[email protected]>
[ Upstream commit c1e517fbbcdb13f50662af4edc11c3251fe44f86 ]
The neigh_ifinfo object must be freed if it has been used in batadv_iv_ogm_process_per_outif().
This is a regression introduced by 89652331c00f43574515059ecbf262d26d885717 ("batman-adv: split tq information in neigh_node struct")
--- net/batman-adv/bat_iv_ogm.c | 2 ++ 1 file changed, 2 insertions(+)
net/batman-adv/bat_iv_ogm.c +2 -0
@@ -1545,6 +1545,8 @@ out_neigh:if ((orig_neigh_node) && (!is_single_hop_neigh))batadv_orig_node_free_ref (orig_neigh_node); out: +if (router_ifinfo) +batadv_neigh_ifinfo_free_ref (router_ifinfo);if (router)batadv_neigh_node_free_ref (router);if (router_router)
Greg Kroah-Hartman
maintainerPATCH 121/140 batman-adv: fix neigh reference imbalance
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Wunderlich <[email protected]>
[ Upstream commit 000c8dff97311357535d64539e58990526e4de70 ]
When an interface is removed from batman-adv, the orig_ifinfo of a orig_node may be removed without releasing the router first. This will prevent the reference for the neighbor pointed at by the orig_ifinfo->router to be released, and this leak may result in reference leaks for the interface used by this neighbor. Fix that.
This is a regression introduced by7351a4822d42827ba0110677c0cbad88a3d52585
("batman-adv: split out router from orig_node").
--- net/batman-adv/originator.c | 5 +++++ 1 file changed, 5 insertions(+)
net/batman-adv/originator.c +5 -0
@@ -500,12 +500,17 @@ batadv_neigh_node_get(const struct batadstatic void batadv_orig_ifinfo_free_rcu (struct rcu_head *rcu) {struct batadv_orig_ifinfo *orig_ifinfo; +struct batadv_neigh_node *router; orig_ifinfo = container_of(rcu, struct batadv_orig_ifinfo, rcu);if (orig_ifinfo->if_outgoing !=BATADV_IF_DEFAULT )batadv_hardif_free_ref_now (orig_ifinfo->if_outgoing); +/* this is the last reference to this object */ + router =rcu_dereference_protected (orig_ifinfo->router, true); +if (router) +batadv_neigh_node_free_ref_now (router);kfree (orig_ifinfo); }
Greg Kroah-Hartman
maintainerPATCH 122/140 batman-adv: always run purge_orig_neighbors
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Wunderlich <[email protected]>
[ Upstream commit 7b955a9fc164487d7c51acb9787f6d1b01b35ef6 ]
The current code will not execute batadv_purge_orig_neighbors() when an orig_ifinfo has already been purged. However we need to run it in any case. Fix that.
This is a regression introduced by7351a4822d42827ba0110677c0cbad88a3d52585
("batman-adv: split out router from orig_node")
--- net/batman-adv/originator.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/batman-adv/originator.c +4 -4
@@ -857,7 +857,7 @@ static bool batadv_purge_orig_node(struc {struct batadv_neigh_node *best_neigh_node;struct batadv_hard_iface *hard_iface; -bool changed; +bool changed_ifinfo, changed_neigh;if (batadv_has_timed_out (orig_node->last_seen,2 *BATADV_PURGE_TIMEOUT )) {
@@ -867,10 +867,10 @@ static bool batadv_purge_orig_node(struc jiffies_to_msecs(orig_node->last_seen));return true; } - changed =batadv_purge_orig_ifinfo (bat_priv, orig_node); - changed = changed ||batadv_purge_orig_neighbors (bat_priv, orig_node); + changed_ifinfo =batadv_purge_orig_ifinfo (bat_priv, orig_node); + changed_neigh =batadv_purge_orig_neighbors (bat_priv, orig_node); -if (!changed) +if (!changed_ifinfo && !changed_neigh)return false;/* first for NULL ... */
Greg Kroah-Hartman
maintainerPATCH 123/140 batman-adv: fix removing neigh_ifinfo
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Wunderlich <[email protected]>
[ Upstream commit 709de13f0c532fe9c468c094aff069a725ed57fe ]
When an interface is removed separately, all neighbors need to be checked if they have a neigh_ifinfo structure for that particular interface. If that is the case, remove that ifinfo so any references to a hard interface can be freed.
This is a regression introduced by 89652331c00f43574515059ecbf262d26d885717 ("batman-adv: split tq information in neigh_node struct")
--- net/batman-adv/originator.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+)
net/batman-adv/originator.c +46 -0
@@ -702,6 +702,47 @@ free_orig_node: }/** +* batadv_purge_neigh_ifinfo - purge obsolete ifinfo entries from neighbor +* @bat_priv: the bat priv with all the soft interface information +* @neigh: orig node which is to be checked +*/ +static void +batadv_purge_neigh_ifinfo (struct batadv_priv *bat_priv, +struct batadv_neigh_node *neigh) +{ +struct batadv_neigh_ifinfo *neigh_ifinfo; +struct batadv_hard_iface *if_outgoing; +struct hlist_node *node_tmp; + +spin_lock_bh (&neigh->ifinfo_lock); + +/* for all ifinfo objects for this neighinator */ +hlist_for_each_entry_safe (neigh_ifinfo, node_tmp, + &neigh->ifinfo_list, list) { + if_outgoing = neigh_ifinfo->if_outgoing; + +/* always keep the default interface */ +if (if_outgoing ==BATADV_IF_DEFAULT ) +continue ; + +/* don't purge if the interface is not (going) down */ +if ((if_outgoing->if_status !=BATADV_IF_INACTIVE ) && + (if_outgoing->if_status !=BATADV_IF_NOT_IN_USE ) && + (if_outgoing->if_status !=BATADV_IF_TO_BE_REMOVED )) +continue ; + +batadv_dbg (BATADV_DBG_BATMAN , bat_priv, +"neighbor/ifinfo purge: neighbor %pM, iface: %s\n" , + neigh->addr, if_outgoing->net_dev->name); + +hlist_del_rcu (&neigh_ifinfo->list); +batadv_neigh_ifinfo_free_ref (neigh_ifinfo); + } + +spin_unlock_bh (&neigh->ifinfo_lock); +} + +/** * batadv_purge_orig_ifinfo - purge obsolete ifinfo entries from originator * @bat_priv: the bat priv with all the soft interface information * @orig_node: orig node which is to be checked
@@ -800,6 +841,11 @@ batadv_purge_orig_neighbors(struct batadhlist_del_rcu (&neigh_node->list);batadv_neigh_node_free_ref (neigh_node); + }else { +/* only necessary if not the whole neighbor is to be +* deleted, but some interface has been removed. +*/ +batadv_purge_neigh_ifinfo (bat_priv, neigh_node); } }
Greg Kroah-Hartman
maintainerPATCH 124/140 net: filter: x86: fix JIT address randomization
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexei Starovoitov <[email protected]>
[ Upstream commit 773cd38f40b8834be991dbfed36683acc1dd41ee ]
bpf_alloc_binary() adds 128 bytes of room to JITed program image and rounds it up to the nearest page size. If image size is close to page size (like 4000), it is rounded to two pages:round_up(4000 + 4 + 128) == 8192
then 'hole' is computed as 8192 - (4000 + 4) = 4188
If prandom_u32() % hole selects a number >= PAGE_SIZE - sizeof(*header) then kernel will crash during bpf_jit_free():
kernel BUG at arch/x86/mm/pageattr.c:887!
Call Trace: [<ffffffff81037285>] change_page_attr_set_clr+0x135/0x460 [<ffffffff81694cc0>] ? _raw_spin_unlock_irq+0x30/0x50 [<ffffffff810378ff>] set_memory_rw+0x2f/0x40 [<ffffffffa01a0d8d>] bpf_jit_free_deferred+0x2d/0x60 [<ffffffff8106bf98>] process_one_work+0x1d8/0x6a0 [<ffffffff8106bf38>] ? process_one_work+0x178/0x6a0 [<ffffffff8106c90c>] worker_thread+0x11c/0x370
since bpf_jit_free() does:
unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK; struct bpf_binary_header *header = (void *)addr;
to compute start address of 'bpf_binary_header'
and header->pages will pass junk to:
set_memory_rw(addr, header->pages);
Fix it by making sure that &header->image[prandom_u32() % hole] and &header are in the same page
--- arch/x86/net/bpf_jit_comp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/net/bpf_jit_comp.c +1 -1
@@ -171,7 +171,7 @@ static struct bpf_binary_header *bpf_allmemset (header,0xcc , sz);/* fill whole space with int3 instructions */ header->pages = sz /PAGE_SIZE ; - hole = sz - (proglen +sizeof (*header)); + hole =min (sz - (proglen +sizeof (*header)),PAGE_SIZE -sizeof (*header));/* insert a random number of int3 instructions before BPF code */ *image_ptr = &header->image[prandom_u32 () % hole];
Greg Kroah-Hartman
maintainerPATCH 125/140 net: filter: s390: fix JIT address randomization
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
[ Upstream commit e84d2f8d2ae33c8215429824e1ecf24cbca9645e ]
This is the s390 variant of Alexei's JIT bug fix. (patch description below stolen from Alexei's patch)
bpf_alloc_binary() adds 128 bytes of room to JITed program image and rounds it up to the nearest page size. If image size is close to page size (like 4000), it is rounded to two pages:round_up(4000 + 4 + 128) == 8192
then 'hole' is computed as 8192 - (4000 + 4) = 4188
If prandom_u32() % hole selects a number >= PAGE_SIZE - sizeof(*header) then kernel will crash during bpf_jit_free():
kernel BUG at arch/x86/mm/pageattr.c:887!
Call Trace: [<ffffffff81037285>] change_page_attr_set_clr+0x135/0x460 [<ffffffff81694cc0>] ? _raw_spin_unlock_irq+0x30/0x50 [<ffffffff810378ff>] set_memory_rw+0x2f/0x40 [<ffffffffa01a0d8d>] bpf_jit_free_deferred+0x2d/0x60 [<ffffffff8106bf98>] process_one_work+0x1d8/0x6a0 [<ffffffff8106bf38>] ? process_one_work+0x178/0x6a0 [<ffffffff8106c90c>] worker_thread+0x11c/0x370
since bpf_jit_free() does:
unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK; struct bpf_binary_header *header = (void *)addr;
to compute start address of 'bpf_binary_header'
and header->pages will pass junk to:
set_memory_rw(addr, header->pages);
Fix it by making sure that &header->image[prandom_u32() % hole] and &header are in the same page.
--- arch/s390/net/bpf_jit_comp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/net/bpf_jit_comp.c +1 -1
@@ -811,7 +811,7 @@ static struct bpf_binary_header *bpf_allreturn NULL ;memset (header,0 , sz); header->pages = sz /PAGE_SIZE ; - hole = sz - (bpfsize +sizeof (*header)); + hole =min (sz - (bpfsize +sizeof (*header)),PAGE_SIZE -sizeof (*header));/* Insert random number of illegal instructions before BPF code * and make sure the first instruction starts at an even address. */
Greg Kroah-Hartman
maintainerPATCH 126/140 net: avoid dependency of net_get_random_once on nop patching
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hannes Frederic Sowa <[email protected]>
[ Upstream commit 3d4405226d27b3a215e4d03cfa51f536244e5de7 ]
net_get_random_once depends on the static keys infrastructure to patch up the branch to the slow path during boot. This was realized by abusing the static keys api and defining a new initializer to not enable the call site while still indicating that the branch point should get patched up. This was needed to have the fast path considered likely by gcc.
The static key initialization during boot up normally walks through all the registered keys and either patches in ideal nops or enables the jump site but omitted that step on x86 if ideal nops where already placed at static_key branch points. Thus net_get_random_once branches not always became active.
This patch switches net_get_random_once to the ordinary static_key api and thus places the kernel fast path in the - by gcc considered - unlikely path. Microbenchmarks on Intel and AMD x86-64 showed that the unlikely path actually beats the likely path in terms of cycle cost and that different nop patterns did not make much difference, thus this switch should not be noticeable.
--- include/linux/net.h | 15 ++++----------- net/core/utils.c | 8 ++++---- 2 files changed, 8 insertions(+), 15 deletions(-)
include/linux/net.h +4 -11
@@ -248,24 +248,17 @@ do { \bool __net_get_random_once (void *buf,int nbytes,bool *done,struct static_key *done_key); -#ifdef HAVE_JUMP_LABEL -#define ___NET_RANDOM_STATIC_KEY_INIT ((struct static_key) \ - { .enabled = ATOMIC_INIT(0), .entries = (void *)1 }) -#else /* !HAVE_JUMP_LABEL */ -#define ___NET_RANDOM_STATIC_KEY_INIT STATIC_KEY_INIT_FALSE -#endif /* HAVE_JUMP_LABEL */ -#define net_get_random_once (buf, nbytes) \ ({ \ bool ___ret = false; \ static bool ___done = false; \ - static struct static_key ___done_key = \ - ___NET_RANDOM_STATIC_KEY_INIT; \ - if (!static_key_true(&___done_key)) \ + static struct static_key ___once_key = \ + STATIC_KEY_INIT_TRUE; \ + if (static_key_true(&___once_key)) \ ___ret = __net_get_random_once(buf, \ nbytes, \ &___done, \ - &___done_key); \ + &___once_key); \ ___ret; \ })
net/core/utils.c +4 -4
@@ -348,8 +348,8 @@ static void __net_random_once_deferred(s {struct __net_random_once_work *work = container_of(w, struct __net_random_once_work, work); -if (!static_key_enabled (work->key)) -static_key_slow_inc (work->key); +BUG_ON (!static_key_enabled (work->key)); +static_key_slow_dec (work->key);kfree (work); }
@@ -367,7 +367,7 @@ static void __net_random_once_disable_ju }bool __net_get_random_once (void *buf,int nbytes,bool *done, -struct static_key *done_key) +struct static_key *once_key) {static DEFINE_SPINLOCK (lock);unsigned long flags;
@@ -382,7 +382,7 @@ bool __net_get_random_once(void *buf, in *done = true;spin_unlock_irqrestore (&lock, flags); -__net_random_once_disable_jump (done_key); +__net_random_once_disable_jump (once_key);return true; }
Greg Kroah-Hartman
maintainerPATCH 127/140 ipv6: fix calculation of option len in ip6_append_data
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hannes Frederic Sowa <[email protected]>
[ Upstream commit 3a1cebe7e05027a1c96f2fc1a8eddf5f19b78f42 ]
tot_len does specify the size of struct ipv6_txoptions. We need opt_flen + opt_nflen to calculate the overall length of additional ipv6 extensions.
I found this while auditing the ipv6 output path for a memory corruption reported by Alexey Preobrazhensky while he fuzzed an instrumented AddressSanitizer kernel with trinity. This may or may not be the cause of the original bug.
--- net/ipv6/ip6_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/ip6_output.c +1 -1
@@ -1229,7 +1229,7 @@ int ip6_append_data(struct sock *sk, intunsigned int maxnonfragsize, headersize; headersize =sizeof (struct ipv6hdr ) + - (opt ? opt->tot_len :0 ) + + (opt ? opt->opt_flen + opt->opt_nflen :0 ) + (dst_allfrag (&rt->dst) ?sizeof (struct frag_hdr ) :0 ) + rt->rt6i_nfheader_len;
Greg Kroah-Hartman
maintainerPATCH 128/140 rtnetlink: wait for unregistering devices in rtnl_link_unregister()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
[ Upstream commit 200b916f3575bdf11609cb447661b8d5957b0bbf ]
From: Cong Wang <[email protected]>
commit 50624c934db18ab90 (net: Delay default_device_exit_batch until no devices are unregistering) introduced rtnl_lock_unregistering() for default_device_exit_batch(). Same race could happen we when rmmod a driver which calls rtnl_link_unregister() as we call dev->destructor without rtnl lock.
For long term, I think we should clean up the mess of netdev_run_todo() and net namespce exit code.
--- include/linux/rtnetlink.h | 5 +++++ net/core/dev.c | 2 +- net/core/net_namespace.c | 2 +- net/core/rtnetlink.c | 33 ++++++++++++++++++++++++++++++++- 4 files changed, 39 insertions(+), 3 deletions(-)
include/linux/rtnetlink.h +5 -0
@@ -4,6 +4,7 @@#include <linux/mutex.h> #include <linux/netdevice.h> +#include <linux/wait.h> #include <uapi/linux/rtnetlink.h> extern int rtnetlink_send (struct sk_buff *skb,struct net *net,u32 pid,u32 group,int echo);
@@ -22,6 +23,10 @@ extern void rtnl_lock(void);extern void rtnl_unlock (void );extern int rtnl_trylock (void );extern int rtnl_is_locked (void ); + +extern wait_queue_head_t netdev_unregistering_wq; +extern struct mutex net_mutex; +#ifdef CONFIG_PROVE_LOCKING extern int lockdep_rtnl_is_held (void );#else
net/core/dev.c +1 -1
@@ -5573,7 +5573,7 @@ static int dev_new_index(struct net *net/* Delayed registration/unregisteration */ static LIST_HEAD (net_todo_list); -static DECLARE_WAIT_QUEUE_HEAD (netdev_unregistering_wq); +DECLARE_WAIT_QUEUE_HEAD (netdev_unregistering_wq);static void net_set_todo (struct net_device *dev) {
net/core/net_namespace.c +1 -1
@@ -24,7 +24,7 @@static LIST_HEAD (pernet_list);static struct list_head *first_device = &pernet_list; -static DEFINE_MUTEX (net_mutex); +DEFINE_MUTEX (net_mutex);LIST_HEAD (net_namespace_list);EXPORT_SYMBOL_GPL (net_namespace_list);
net/core/rtnetlink.c +32 -1
@@ -353,15 +353,46 @@ void __rtnl_link_unregister(struct rtnl_ }EXPORT_SYMBOL_GPL (__rtnl_link_unregister); +/* Return with the rtnl_lock held when there are no network +* devices unregistering in any network namespace. +*/ +static void rtnl_lock_unregistering_all (void ) +{ +struct net *net; +bool unregistering; +DEFINE_WAIT (wait); + +for (;;) { +prepare_to_wait (&netdev_unregistering_wq, &wait, +TASK_UNINTERRUPTIBLE ); + unregistering = false; +rtnl_lock (); +for_each_net (net) { +if (net->dev_unreg_count >0 ) { + unregistering = true; +break ; + } + } +if (!unregistering) +break ; +__rtnl_unlock (); +schedule (); + } +finish_wait (&netdev_unregistering_wq, &wait); +} +/** * rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink. * @ops: struct rtnl_link_ops * to unregister */ void rtnl_link_unregister (struct rtnl_link_ops *ops) { -rtnl_lock (); +/* Close the race with cleanup_net() */ +mutex_lock (&net_mutex); +rtnl_lock_unregistering_all ();__rtnl_link_unregister (ops);rtnl_unlock (); +mutex_unlock (&net_mutex); }EXPORT_SYMBOL_GPL (rtnl_link_unregister);
Greg Kroah-Hartman
maintainerPATCH 129/140 net: phy: Dont call phy_resume if phy_init_hw failed
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit b394745df2d9d4c30bf1bcc55773bec6f3bc7c67 ]
After the call to phy_init_hw failed in phy_attach_direct, phy_detach is called to detach the phy device from its network device. If the attached driver is a generic phy driver, this also detaches the driver. Subsequently phy_resume is called, which assumes without checking that a driver is attached to the device. This will result in a crash such as
Unable to handle kernel paging request for data at address 0xffffffffffffff90 Faulting instruction address: 0xc0000000003a0e18 Oops: Kernel access of bad area, sig: 11 [#1] ... NIP [c0000000003a0e18] .phy_attach_direct+0x68/0x17c LR [c0000000003a0e6c] .phy_attach_direct+0xbc/0x17c Call Trace: [c0000003fc0475d0] [c0000000003a0e6c] .phy_attach_direct+0xbc/0x17c (unreliable) [c0000003fc047670] [c0000000003a0ff8] .phy_connect_direct+0x28/0x98 [c0000003fc047700] [c0000000003f0074] .of_phy_connect+0x4c/0xa4
Only call phy_resume if phy_init_hw was successful.
--- drivers/net/phy/phy_device.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/phy/phy_device.c +2 -2
@@ -613,8 +613,8 @@ int phy_attach_direct(struct net_device err =phy_init_hw (phydev);if (err)phy_detach (phydev); - -phy_resume (phydev); +else +phy_resume (phydev);return err; }
Greg Kroah-Hartman
maintainerPATCH 130/140 bonding: fix out of range parameters for bond_intmax_tbl
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikolay Aleksandrov <[email protected]>
[ Upstream commit 81c708068dfedece038e07d818ba68333d8d885d ]
I've missed to add a NULL entry to the bond_intmax_tbl when I introduced it with the conversion of arp_interval so add it now.
--- drivers/net/bonding/bond_options.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/bonding/bond_options.c +1 -0
@@ -70,6 +70,7 @@ static struct bond_opt_value bond_fail_ostatic struct bond_opt_value bond_intmax_tbl[] = { {"off" ,0 ,BOND_VALFLAG_DEFAULT }, {"maxval" ,INT_MAX ,BOND_VALFLAG_MAX }, + {NULL ,-1 ,0 } };static struct bond_opt_value bond_lacp_rate_tbl[] = {
Greg Kroah-Hartman
maintainerPATCH 131/140 net: gro: make sure skb->cb[] initial content has not to be zero
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 29e98242783ed3ba569797846a606ba66f781625 ]
Starting from linux-3.13, GRO attempts to build full size skbs.
Problem is the commit assumed one particular field in skb->cb[] was clean, but it is not the case on some stacked devices.
Timo reported a crash in case traffic is decrypted before reaching a GRE device.
Fix this by initializing NAPI_GRO_CB(skb)->last at the right place, this also removes one conditional.
Thanks a lot to Timo for providing full reports and bisecting this.
--- net/core/dev.c | 1 + net/core/skbuff.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-)
net/core/dev.c +1 -0
@@ -3944,6 +3944,7 @@ static enum gro_result dev_gro_receive(s }NAPI_GRO_CB (skb)->count =1 ;NAPI_GRO_CB (skb)->age = jiffies; +NAPI_GRO_CB (skb)->last = skb;skb_shinfo (skb)->gso_size =skb_gro_len (skb); skb->next = napi->gro_list; napi->gro_list = skb;
net/core/skbuff.c +2 -2
@@ -3076,7 +3076,7 @@ int skb_gro_receive(struct sk_buff **heaif (unlikely (p->len + len >=65536 ))return -E2BIG ; - lp =NAPI_GRO_CB (p)->last ?: p; + lp =NAPI_GRO_CB (p)->last; pinfo =skb_shinfo (lp);if (headlen <= offset) {
@@ -3192,7 +3192,7 @@ merge:__skb_pull (skb, offset); -if (!NAPI_GRO_CB (p)->last) +if (NAPI_GRO_CB (p)->last == p)skb_shinfo (p)->frag_list = skb;else NAPI_GRO_CB (p)->last->next = skb;
Greg Kroah-Hartman
maintainerPATCH 132/140 batman-adv: fix indirect hard_iface NULL dereference
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Lindner <[email protected]>
[ Upstream commit 16a4142363b11952d3aa76ac78004502c0c2fe6e ]
If hard_iface is NULL and goto out is made batadv_hardif_free_ref() doesn't check for NULL before dereferencing it to get to refcount.
Introduced in cb1c92ec37fb70543d133a1fa7d9b54d6f8a1ecd ("batman-adv: add debugfs support to view multiif tables").
--- net/batman-adv/originator.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/batman-adv/originator.c +2 -1
@@ -1074,7 +1074,8 @@ int batadv_orig_hardif_seq_print_text(st bat_priv->bat_algo_ops->bat_orig_print (bat_priv, seq, hard_iface); out: -batadv_hardif_free_ref (hard_iface); +if (hard_iface) +batadv_hardif_free_ref (hard_iface);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 133/140 batman-adv: fix reference counting imbalance while sending fragment
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antonio Quartulli <[email protected]>
[ Upstream commit be181015a189cd141398b761ba4e79d33fe69949 ]
In the new fragmentation code the batadv_frag_send_packet() function obtains a reference to the primary_if, but it does not release it upon return.
This reference imbalance prevents the primary_if (and then the related netdevice) to be properly released on shut down.
Fix this by releasing the primary_if in batadv_frag_send_packet().
Introduced by ee75ed88879af88558818a5c6609d85f60ff0df4 ("batman-adv: Fragment and send skbs larger than mtu")
--- net/batman-adv/fragmentation.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
net/batman-adv/fragmentation.c +8 -3
@@ -418,12 +418,13 @@ bool batadv_frag_send_packet(struct sk_b struct batadv_neigh_node *neigh_node) {struct batadv_priv *bat_priv; -struct batadv_hard_iface *primary_if; +struct batadv_hard_iface *primary_if =NULL ;struct batadv_frag_packet frag_header;struct sk_buff *skb_fragment;unsigned mtu = neigh_node->if_incoming->net_dev->mtu;unsigned header_size =sizeof (frag_header);unsigned max_fragment_size, max_packet_size; +bool ret = false;/* To avoid merge and refragmentation at next-hops we never send * fragments larger than BATADV_FRAG_MAX_FRAG_SIZE
@@ -483,7 +484,11 @@ bool batadv_frag_send_packet(struct sk_b skb->len + ETH_HLEN);batadv_send_skb_packet (skb, neigh_node->if_incoming, neigh_node->addr); -return true; + ret = true; + out_err: -return false; +if (primary_if) +batadv_hardif_free_ref (primary_if); + +return ret; }
Greg Kroah-Hartman
maintainerPATCH 134/140 batman-adv: increase orig refcount when storing ref in gw_node
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antonio Quartulli <[email protected]>
[ Upstream commit 377fe0f968b30a1a714fab53a908061914f30e26 ]
A pointer to the orig_node representing a bat-gateway is stored in the gw_node->orig_node member, but the refcount for such orig_node is never increased.
This leads to memory faults when gw_node->orig_node is accessed and the originator has already been freed.
Fix this by increasing the refcount on gw_node creation and decreasing it on gw_node free.
--- net/batman-adv/gateway_client.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
net/batman-adv/gateway_client.c +9 -2
@@ -42,8 +42,10 @@static void batadv_gw_node_free_ref (struct batadv_gw_node *gw_node) { -if (atomic_dec_and_test (&gw_node->refcount)) +if (atomic_dec_and_test (&gw_node->refcount)) { +batadv_orig_node_free_ref (gw_node->orig_node);kfree_rcu (gw_node, rcu); + } } static struct batadv_gw_node *
@@ -408,9 +410,14 @@ static void batadv_gw_node_add(struct baif (gateway->bandwidth_down ==0 )return ; +if (!atomic_inc_not_zero (&orig_node->refcount)) +return ; + gw_node =kzalloc (sizeof (*gw_node),GFP_ATOMIC ); -if (!gw_node) +if (!gw_node) { +batadv_orig_node_free_ref (orig_node);return ; + }INIT_HLIST_NODE (&gw_node->list); gw_node->orig_node = orig_node;
Greg Kroah-Hartman
maintainerPATCH 135/140 batman-adv: fix local TT check for outgoing arp requests in DAT
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antonio Quartulli <[email protected]>
[ Upstream commit cc2f33860cea0e48ebec096130bd0f7c4bf6e0bc ]
Change introduced by 88e48d7b3340ef07b108eb8a8b3813dd093cc7f7 ("batman-adv: make DAT drop ARP requests targeting local clients") implements a check that prevents DAT from using the caching mechanism when the client that is supposed to provide a reply to an arp request is local.
However change brought by be1db4f6615b5e6156c807ea8985171c215c2d57 ("batman-adv: make the Distributed ARP Table vlan aware") has not converted the above check into its vlan aware version thus making it useless when the local client is behind a vlan.
Fix the behaviour by properly specifying the vlan when checking for a client being local or not.
--- net/batman-adv/distributed-arp-table.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
net/batman-adv/distributed-arp-table.c +1 -2
@@ -940,8 +940,7 @@ bool batadv_dat_snoop_outgoing_arp_reque* additional DAT answer may trigger kernel warnings about * a packet coming from the wrong port. */ -if (batadv_is_my_client (bat_priv, dat_entry->mac_addr, -BATADV_NO_FLAGS )) { +if (batadv_is_my_client (bat_priv, dat_entry->mac_addr, vid)) { ret = true; goto out; }
Greg Kroah-Hartman
maintainerPATCH 136/140 ip_tunnel: Initialize the fallback device properly
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steffen Klassert <[email protected]>
[ Upstream commit 78ff4be45a4c51d8fb21ad92e4fabb467c6c3eeb ]
We need to initialize the fallback device to have a correct mtu set on this device. Otherwise the mtu is set to null and the device is unusable.
--- net/ipv4/ip_tunnel.c | 1 + 1 file changed, 1 insertion(+)
net/ipv4/ip_tunnel.c +1 -0
@@ -875,6 +875,7 @@ int ip_tunnel_init_net(struct net *net,*/ if (!IS_ERR (itn->fb_tunnel_dev)) { itn->fb_tunnel_dev->features |=NETIF_F_NETNS_LOCAL ; + itn->fb_tunnel_dev->mtu =ip_tunnel_bind_dev (itn->fb_tunnel_dev);ip_tunnel_add (itn,netdev_priv (itn->fb_tunnel_dev)); }rtnl_unlock ();
Greg Kroah-Hartman
maintainerPATCH 137/140 net_sched: fix an oops in tcindex filter
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
[ Upstream commit bf63ac73b3e132e6bf0c8798aba7b277c3316e19 ]
Kelly reported the following crash:
IP: [<ffffffff817a993d>] tcf_action_exec+0x46/0x90
PGD 3009067 PUD 300c067 PMD 11ff30067 PTE 800000011634b060
Oops: 0000 [#1] SMP DEBUG_PAGEALLOC
CPU: 1 PID: 639 Comm: dhclient Not tainted 3.15.0-rc4+ #342
Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
task: ffff8801169ecd00 ti: ffff8800d21b8000 task.ti: ffff8800d21b8000
RIP: 0010:[<ffffffff817a993d>] [<ffffffff817a993d>] tcf_action_exec+0x46/0x90
RSP: 0018:ffff8800d21b9b90 EFLAGS: 00010283
RAX: 00000000ffffffff RBX: ffff88011634b8e8 RCX: ffff8800cf7133d8
RDX: ffff88011634b900 RSI: ffff8800cf7133e0 RDI: ffff8800d210f840
RBP: ffff8800d21b9bb0 R08: ffffffff8287bf60 R09: 0000000000000001
R10: ffff8800d2b22b24 R11: 0000000000000001 R12: ffff8800d210f840
R13: ffff8800d21b9c50 R14: ffff8800cf7133e0 R15: ffff8800cad433d8
FS: 00007f49723e1840(0000) GS:ffff88011a800000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffff88011634b8f0 CR3: 00000000ce469000 CR4: 00000000000006e0
Stack:
ffff8800d2170188 ffff8800d210f840 ffff8800d2171b90 0000000000000000
ffff8800d21b9be8 ffffffff817c55bb ffff8800d21b9c50 ffff8800d2171b90
ffff8800d210f840 ffff8800d21b0300 ffff8800d21b9c50 ffff8800d21b9c18
Call Trace:
[<ffffffff817c55bb>] tcindex_classify+0x88/0x9b
[<ffffffff817a7f7d>] tc_classify_compat+0x3e/0x7b
[<ffffffff817a7fdf>] tc_classify+0x25/0x9f
[<ffffffff817b0e68>] htb_enqueue+0x55/0x27a
[<ffffffff817b6c2e>] dsmark_enqueue+0x165/0x1a4
[<ffffffff81775642>] __dev_queue_xmit+0x35e/0x536
[<ffffffff8177582a>] dev_queue_xmit+0x10/0x12
[<ffffffff818f8ecd>] packet_sendmsg+0xb26/0xb9a
[<ffffffff810b1507>] ? __lock_acquire+0x3ae/0xdf3
[<ffffffff8175cf08>] __sock_sendmsg_nosec+0x25/0x27
[<ffffffff8175d916>] sock_aio_write+0xd0/0xe7
[<ffffffff8117d6b8>] do_sync_write+0x59/0x78
[<ffffffff8117d84d>] vfs_write+0xb5/0x10a
[<ffffffff8117d96a>] SyS_write+0x49/0x7f
[<ffffffff8198e212>] system_call_fastpath+0x16/0x1bThis is because we memcpy struct tcindex_filter_result which contains struct tcf_exts, obviously struct list_head can not be simply copied. This is a regression introduced by commit 33be627159913b094bb578 (net_sched: act: use standard struct list_head).
It's not very easy to fix it as the code is a mess:
if (old_r)
memcpy(&cr, r, sizeof(cr));
else {
memset(&cr, 0, sizeof(cr));
tcf_exts_init(&cr.exts, TCA_TCINDEX_ACT, TCA_TCINDEX_POLICE);
}
...
tcf_exts_change(tp, &cr.exts, &e);
...
memcpy(r, &cr, sizeof(cr));the above code should equal to:
tcindex_filter_result_init(&cr);
if (old_r)
cr.res = r->res;
...
if (old_r)
tcf_exts_change(tp, &r->exts, &e);
else
tcf_exts_change(tp, &cr.exts, &e);
...
r->res = cr.res;after this change, since there is no need to copy struct tcf_exts.
And it also fixes other places zero'ing struct's contains struct tcf_exts.
--- net/sched/cls_tcindex.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-)
net/sched/cls_tcindex.c +20 -10
@@ -188,6 +188,12 @@ static const struct nla_policy tcindex_p [TCA_TCINDEX_CLASSID] = { .type = NLA_U32 }, }; +static void tcindex_filter_result_init (struct tcindex_filter_result *r) +{ +memset (r,0 ,sizeof (*r)); +tcf_exts_init (&r->exts,TCA_TCINDEX_ACT ,TCA_TCINDEX_POLICE ); +} + static int tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base, u32 handle, struct tcindex_data *p,
@@ -207,15 +213,11 @@ tcindex_set_parms(struct net *net, strucreturn err;memcpy (&cp, p,sizeof (cp)); -memset (&new_filter_result,0 ,sizeof (new_filter_result)); -tcf_exts_init (&new_filter_result.exts,TCA_TCINDEX_ACT ,TCA_TCINDEX_POLICE ); +tcindex_filter_result_init (&new_filter_result); +tcindex_filter_result_init (&cr);if (old_r) -memcpy (&cr, r,sizeof (cr)); -else { -memset (&cr,0 ,sizeof (cr)); -tcf_exts_init (&cr.exts,TCA_TCINDEX_ACT ,TCA_TCINDEX_POLICE ); - } + cr.res = r->res;if (tb[TCA_TCINDEX_HASH ]) cp.hash =nla_get_u32 (tb[TCA_TCINDEX_HASH ]);
@@ -267,9 +269,14 @@ tcindex_set_parms(struct net *net, struc err = -ENOMEM ;if (!cp.perfect && !cp.h) {if (valid_perfect_hash (&cp)) { +int i; + cp.perfect =kcalloc (cp.hash,sizeof (*r),GFP_KERNEL );if (!cp.perfect) goto errout; +for (i =0 ; i < cp.hash; i++) +tcf_exts_init (&cp.perfect[i].exts,TCA_TCINDEX_ACT , +TCA_TCINDEX_POLICE ); balloc =1 ; }else { cp.h =kcalloc (cp.hash,sizeof (f),GFP_KERNEL );
@@ -295,14 +302,17 @@ tcindex_set_parms(struct net *net, structcf_bind_filter (tp, &cr.res, base); } -tcf_exts_change (tp, &cr.exts, &e); +if (old_r) +tcf_exts_change (tp, &r->exts, &e); +else +tcf_exts_change (tp, &cr.exts, &e);tcf_tree_lock (tp);if (old_r && old_r != r) -memset (old_r,0 ,sizeof (*old_r)); +tcindex_filter_result_init (old_r);memcpy (p, &cp,sizeof (cp)); -memcpy (r, &cr,sizeof (cr)); + r->res = cr.res;if (r == &new_filter_result) {struct tcindex_filter **fp;
Greg Kroah-Hartman
maintainerPATCH 138/140 ipv6: gro: fix CHECKSUM_COMPLETE support
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 4de462ab63e23953fd05da511aeb460ae10cc726 ]
When GRE support was added in linux-3.14, CHECKSUM_COMPLETE handling broke on GRE+IPv6 because we did not update/use the appropriate csum :
GRO layer is supposed to use/update NAPI_GRO_CB(skb)->csum instead of skb->csum
Tested using a GRE tunnel and IPv6 traffic. GRO aggregation now happens at the first level (ethernet device) instead of being done in gre tunnel. Native IPv6+TCP is still properly aggregated.
--- net/ipv6/ip6_offload.c | 6 +----- net/ipv6/tcpv6_offload.c | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-)
net/ipv6/ip6_offload.c +1 -5
@@ -196,7 +196,6 @@ static struct sk_buff **ipv6_gro_receiveunsigned int off;u16 flush =1 ;int proto; -__wsum csum; off =skb_gro_offset (skb); hlen = off +sizeof (*iph);
@@ -264,13 +263,10 @@ static struct sk_buff **ipv6_gro_receiveNAPI_GRO_CB (skb)->flush |= flush; - csum = skb->csum; -skb_postpull_rcsum (skb, iph,skb_network_header_len (skb)); +skb_gro_postpull_rcsum (skb, iph, nlen); pp = ops->callbacks.gro_receive (head, skb); - skb->csum = csum; - out_unlock:rcu_read_unlock ();
net/ipv6/tcpv6_offload.c +1 -1
@@ -42,7 +42,7 @@ static struct sk_buff **tcp6_gro_receiveif (NAPI_GRO_CB (skb)->flush) goto skip_csum; - wsum = skb->csum; + wsum =NAPI_GRO_CB (skb)->csum;switch (skb->ip_summed) {case CHECKSUM_NONE :
Greg Kroah-Hartman
maintainerPATCH 139/140 ipv4: initialise the itag variable in __mkroute_input
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li RongQing <[email protected]>
[ Upstream commit fbdc0ad095c0a299e9abf5d8ac8f58374951149a ]
the value of itag is a random value from stack, and may not be initiated by fib_validate_source, which called fib_combine_itag if CONFIG_IP_ROUTE_CLASSID is not set
This will make the cached dst uncertainty
--- net/ipv4/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/route.c +1 -1
@@ -1526,7 +1526,7 @@ static int __mkroute_input(struct sk_bufstruct in_device *out_dev;unsigned int flags =0 ;bool do_cache; -u32 itag; +u32 itag =0 ;/* get a working reference to the output device */ out_dev =__in_dev_get_rcu (FIB_RES_DEV (*res));
Greg Kroah-Hartman
maintainerPATCH 140/140 net-gro: reset skb->truesize in napi_reuse_skb()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit e33d0ba8047b049c9262fdb1fcafb93cb52ceceb ]
Recycling skb always had been very tough...
This time it appears GRO layer can accumulate skb->truesize adjustments made by drivers when they attach a fragment to skb.
skb_gro_receive() can only subtract from skb->truesize the used part of a fragment.
I spotted this problem seeing TcpExtPruneCalled and TcpExtTCPRcvCollapsed that were unexpected with a recent kernel, where TCP receive window should be sized properly to accept traffic coming from a driver not overshooting skb->truesize.
--- net/core/dev.c | 1 + 1 file changed, 1 insertion(+)
net/core/dev.c +1 -0
@@ -4051,6 +4051,7 @@ static void napi_reuse_skb(struct napi_s skb->vlan_tci =0 ; skb->dev = napi->dev; skb->skb_iif =0 ; + skb->truesize =SKB_TRUESIZE (skb_end_offset (skb)); napi->skb = skb; }
Quoted 5 lines · On Wed, 28 May 2014 21:32:19 -0700 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 3.14.5 release. There are 140 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 Sat May 31 04:30:12 UTC 2014. 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.14.5-rc1.gzand the diffstat can be found below.
Hi Greg,
I notice that the patch in commit cc13b1d1500656a2 (see below for comment) is missing. I was hoping it would be in 3.14.5. Is there a reason I missed out?
Thanks,
NeilBrown
commit cc13b1d1500656a20e41960668f3392dda9fa6e2
Author: NeilBrown <[email protected]> Date: Mon May 5 13:34:37 2014 +1000
md/raid10: call wait_barrier() for each request submitted.
wait_barrier() includes a counter, so we must call it precisely once (unless balanced by allow_barrier()) for each request submitted.
Since
commit 20d0189b1012a37d2533a87fb451f7852f2418d1
block: Introduce new bio_split()
in 3.14-rc1, we don't call it for the extra requests generated when we need to split a bio.
When this happens the counter goes negative, any resync/recovery will never start, and "mdadm --stop" will hang.
Greg Kroah-Hartman
maintainerQuoted 11 lines · NeilBrown
Quoted 8 lines · On Wed, 28 May 2014 21:32:19 -0700 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 3.14.5 release. There are 140 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 Sat May 31 04:30:12 UTC 2014. Anything received after that time might be too late.
Quoted 8 lines
Quoted 4 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.14.5-rc1.gzand the diffstat can be found below.
Hi Greg,
I notice that the patch in commitcc13b1d1500656a2(see below for comment) is missing. I was hoping it would be in 3.14.5. Is there a reason I missed out?
227 patches marked for stable inclusion "missed out" as I just didn't get to them yet. So don't worry, you are in good company, I'll get to them eventually, but 140 patches seemed like a good cut off for this release.
thanks,
greg k-h
Quoted 9 lines · Greg Kroah-Hartman
Quoted 8 lines · NeilBrown
Quoted 5 lines · On Wed, 28 May 2014 21:32:19 -0700 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 3.14.5 release. There are 140 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 8 lines
Quoted 8 lines
Quoted 7 lines
Responses should be made by Sat May 31 04:30:12 UTC 2014. 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.14.5-rc1.gzand the diffstat can be found below.
Compiled and booted on my test systems. No dmesg regressions.
-- Shuah
Signature · 4 lines
Shuah Khan Senior Linux Kernel Developer - Open Source Group Samsung Research America(Silicon Valley) [email protected] | (970) 672-0658
Greg Kroah-Hartman
maintainerQuoted 13 lines · Shuah Khan
Quoted 12 lines · Greg Kroah-Hartman
Quoted 11 lines · NeilBrown
Quoted 8 lines · On Wed, 28 May 2014 21:32:19 -0700 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 3.14.5 release. There are 140 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 Sat May 31 04:30:12 UTC 2014. Anything received after that time might be too late.
Quoted 7 lines
Quoted 5 lines
Quoted 5 lines
Quoted 4 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.14.5-rc1.gzand the diffstat can be found below.
Compiled and booted on my test systems. No dmesg regressions.
Thanks for testing.
greg k-h
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.14.5 release. There are 140 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 Sat May 31 04:30:12 UTC 2014. Anything received after that time might be too late.
Build results:
total: 143 pass: 133 skipped: 4 fail: 6
Qemu tests all passed.
Failing builds are
alpha:defconfig - Fails with 'Inconsistent kallsyms data'. New failure; need to debug.
unicore32:defconfig - still fails to build for all releases
powerpc:allmodconfig - fail for binutils 2.3 and 2.4. known problem; patch pending
powerpc:ppc64e_defconfig - fail if built with binutils 2.4; patch pending
powerpc:chroma_defconfig - fail if built with binutils 2.4; patch pending
Bisect points to commit 'vlan: Fix lockdep warning with stacked vlan devices' as culprit for the alpha:defconfig build failure. Reverting this patch fixes the problem. I looked at the patch, but I have no idea what may cause the failure.
Details are available at http://server.roeck-us.net:8010/builders.
Guenter
Greg Kroah-Hartman
maintainerQuoted 23 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.14.5 release. There are 140 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 Sat May 31 04:30:12 UTC 2014. Anything received after that time might be too late.
Build results:
total: 143 pass: 133 skipped: 4 fail: 6Qemu tests all passed.
Failing builds are
alpha:defconfig - Fails with 'Inconsistent kallsyms data'. New failure; need to debug.
unicore32:defconfig - still fails to build for all releases
powerpc:allmodconfig - fail for binutils 2.3 and 2.4. known problem; patch pending
powerpc:ppc64e_defconfig - fail if built with binutils 2.4; patch pending
powerpc:chroma_defconfig - fail if built with binutils 2.4; patch pending
Quoted 3 lines
Bisect points to commit 'vlan: Fix lockdep warning with stacked vlan devices' as culprit for the alpha:defconfig build failure. Reverting this patch fixes the problem. I looked at the patch, but I have no idea what may cause the failure.
Odd. Is this also broken in Linus's tree?
thanks,
greg k-h
Quoted 24 lines · Greg Kroah-Hartman
Quoted 23 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.14.5 release. There are 140 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 Sat May 31 04:30:12 UTC 2014. Anything received after that time might be too late.
Build results:
total: 143 pass: 133 skipped: 4 fail: 6Qemu tests all passed.
Failing builds are
alpha:defconfig - Fails with 'Inconsistent kallsyms data'. New failure; need to debug.
unicore32:defconfig - still fails to build for all releases
powerpc:allmodconfig - fail for binutils 2.3 and 2.4. known problem; patch pending
powerpc:ppc64e_defconfig - fail if built with binutils 2.4; patch pending
powerpc:chroma_defconfig - fail if built with binutils 2.4; patch pending
Quoted 6 lines
Quoted 3 lines
Bisect points to commit 'vlan: Fix lockdep warning with stacked vlan devices' as culprit for the alpha:defconfig build failure. Reverting this patch fixes the problem. I looked at the patch, but I have no idea what may cause the failure.
Odd. Is this also broken in Linus's tree?
Agreed, it is odd. As I said, not idea what is causing this. v3.15-rc7 is fine.
Guenter
Quoted 5 lines · Guenter Roeck
Quoted 4 lines · Greg Kroah-Hartman
Quoted 3 lines · Guenter Roeck
alpha:defconfig - Fails with 'Inconsistent kallsyms data'. New failure; need to debug.
Quoted 8 lines
Quoted 6 lines
Quoted 3 lines
Bisect points to commit 'vlan: Fix lockdep warning with stacked vlan devices' as culprit for the alpha:defconfig build failure. Reverting this patch fixes the problem. I looked at the patch, but I have no idea what may cause the failure.
Odd. Is this also broken in Linus's tree?
Agreed, it is odd. As I said, not idea what is causing this. v3.15-rc7 is fine.
The bisection is almost certainly bogus, and this 'inconsistent kallsyms data' issue is not new. I thought we fixed it, but it's possible that there are alpha-specific issues and/or that it depends on binutils versions.
In particular, when we've seen it in the past, it has depended on exact alignment of code or data, which is why random changes (particularly to percpu data) can seem to trigger it. Basically, two symbols getting the same address and then being sorted differently by 'nm' or similar.
See for example
http://marc.info/?l=linux-next&m=133267456809502&w=2
where it hits ARM and rmk actually debugged that particular case.
Adding Michal to the cc, because I have a dim memory of this being fixed, but I can't remember how. I hope Michal does.. Or maybe the fact that alpha is hit by this just means that I mis-remember.
Linus
Quoted 28 lines · Linus Torvalds
Quoted 5 lines · Guenter Roeck
Quoted 4 lines · Greg Kroah-Hartman
Quoted 3 lines · Guenter Roeck
alpha:defconfig - Fails with 'Inconsistent kallsyms data'. New failure; need to debug.
Quoted 8 lines
Quoted 6 lines
Quoted 3 lines
Bisect points to commit 'vlan: Fix lockdep warning with stacked vlan devices' as culprit for the alpha:defconfig build failure. Reverting this patch fixes the problem. I looked at the patch, but I have no idea what may cause the failure.
Odd. Is this also broken in Linus's tree?
Agreed, it is odd. As I said, not idea what is causing this. v3.15-rc7 is fine.
The bisection is almost certainly bogus, and this 'inconsistent kallsyms data' issue is not new. I thought we fixed it, but it's possible that there are alpha-specific issues and/or that it depends on binutils versions.
In particular, when we've seen it in the past, it has depended on exact alignment of code or data, which is why random changes (particularly to percpu data) can seem to trigger it. Basically, two symbols getting the same address and then being sorted differently by 'nm' or similar.
See for example
Quoted 8 lines
http://marc.info/?l=linux-next&m=133267456809502&w=2where it hits ARM and rmk actually debugged that particular case.
Adding Michal to the cc, because I have a dim memory of this being fixed, but I can't remember how. I hope Michal does.. Or maybe the fact that alpha is hit by this just means that I mis-remember.
For now I "solved" the build problem by adding KALLSYMS_EXTRA_PASS=1" to alpha builds.
Guenter
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 6 lines · Holger Hoffstätte
Quoted 1 line · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.14.5 release.
Applied to .4 and so far working well on 3 different machines (server/ workstation/old laptop) without any issues.
Thanks for testing and letting me know.
greg k-h