From 7cb1e7e59824fa0ed7d81ca9e2503d6b3c4b9b5d Mon Sep 17 00:00:00 2001 From: ertugerata Date: Fri, 18 Sep 2015 20:33:36 +0300 Subject: [PATCH] kernel-4.17 and drivers --- kernel/drivers/module-bbswitch/pspec.xml | 11 +- kernel/drivers/module-broadcom-wl/pspec.xml | 11 +- .../drivers/module-virtualbox-guest/pspec.xml | 6 +- kernel/drivers/module-virtualbox/pspec.xml | 11 +- .../kernel/files/configs/kernel-x86_64-config | 2 +- .../kernel/files/patches/linux/patch-4.1.7.xz | Bin 0 -> 224108 bytes ...vdev-do-not-report-errors-form-flush.patch | 64 + ..._64-Don-t-save-flags-on-context-swit.patch | 62 - ...LL-pointer-dereference-in-runtime-PM.patch | 83 - ...evert-libata-Implement-NCQ-autosense.patch | 120 - ...plement-support-for-sense-data-repor.patch | 212 -- ...-Set-information-field-for-autosense.patch | 169 - ...jmicron-disable-broken-async_suspend.patch | 29 - ...he-async-PM-for-JMicron-chip-363-361.patch | 68 - .../gpu-drm-i915-Avoid-TP3-on-CHV.patch | 81 - ...-remove-HBR2-from-chv-supported-list.patch | 44 - ...r-dereference-in-RTPM-of-block-layer.patch | 74 + ...LL-pointer-dereference-in-runtime-PM.patch | 64 + kernel/kernel/files/patches/mageia/series | 123 +- ...k-setting-from-adav80x_regmap_config.patch | 31 + ...ain-settings-of-fll-in-free-run-mode.patch | 33 + ...-clock-ok-rather-than-use-interrupts.patch | 141 + ...c-rt5640-fix-line-out-no-sound-issue.patch | 89 + ...emove-redundant-arndale_audio_remove.patch | 48 + ...4-fix-wrong-clock-for-exynos4x12-adc.patch | 55 + ...istachio-correct-critical-clock-list.patch | 81 + ...of-clk-pll-settings-from-boot-loader.patch | 54 + ...xa-fix-core-frequency-reporting-unit.patch | 61 + ...-pxa-pxa3xx-fix-cken-register-access.patch | 38 - ...om-fix-msm8916-prng-clock-enable-bit.patch | 32 + ...et-clk_set_rate_parent-on-ce1-clocks.patch | 45 + ...-add-clk_set_rate_parent-to-sclk_mac.patch | 39 + ...able-clk-s5pv210-add-missing-call-to.patch | 37 + ...y-one-in-clk_sp810_timerclken_of_get.patch | 34 + ...ees-when-releasing-metadata-snapshot.patch | 33 - ...-testing-using-the-updated-testusb.c.patch | 44 + ...al-link-to-be-configured-on-any-pipe.patch | 58 + ...object-as-dirty-when-used-by-the-gpu.patch | 58 + ...on-workaround-everywhere-on-pre-gen6.patch | 79 + ...check-dp-link-status-on-long-hpd-too.patch | 75 + ...s-for-reading-a-split-64bit-register.patch | 57 + ...stable-drm-i915-preserve-ssc-earlier.patch | 117 + ...m-qxl-validate-monitors-config-modes.patch | 147 + ...able-drm-radeon-add-new-oland-pci-id.patch | 26 - ...n-atom-send-out-the-full-aux-address.patch | 39 + ...layport-on-hpd-until-we-get-the-dpcd.patch | 75 + ...uantization_range-for-pre-dce5-asics.patch | 47 + ...native-send-out-the-full-aux-address.patch | 40 + ...rm-vmwgfx-fix-execbuf-locking-issues.patch | 60 - ...s-mci-csrows-array-elements-properly.patch | 39 - ...reed-memory-during-device-disconnect.patch | 52 - ...c-fix-limit-in-uclogic_tablet_enable.patch | 33 - ...o-add-inverse-unit-conversion-macros.patch | 70 + ...s16400-fix-adis16448-gyroscope-scale.patch | 30 + ...able-iio-adis16480-fix-scale-factors.patch | 101 + ...nd-iio_triggered_buffer-are-required.patch | 33 + ...ative-error-code-from-iio_event_poll.patch | 33 + ...fer-fix-iio_buffer_poll-return-value.patch | 34 + ...-task-using-same-semaphore-set-exits.patch | 254 -- ...sem.c-update-correct-memory-barriers.patch | 86 - ...e-iwlwifi-pcie-fix-prepare-card-flow.patch | 83 - ...-blocks-should-use-the-read-verifier.patch | 37 + ...-localmodconfig-use-kbuild-files-too.patch | 36 - ...olate-hugetlbfs-page-w-refcount-held.patch | 48 - ...age-refcount-of-unknown-non-lru-page.patch | 37 - .../patches/mageia/stable-net_41.mbox.patch | 3345 ----------------- ...bit-to-access-vpd-through-function-0.patch | 135 + ...n-0-quirk-for-intel-ethernet-devices.patch | 41 + ...for-jmicron-multi-function-sata-ahci.patch | 120 + ...able-pci-fix-ti816x-class-code-quirk.patch | 45 + ...rf-fix-double-free-of-the-aux-buffer.patch | 49 - ...-fasync-handling-on-inherited-events.patch | 69 - ...perf_event_ioc_period-migration-race.patch | 125 - ...ble-perf-fix-running-time-accounting.patch | 49 - ...-don-t-return-int-on-__pm_clk_enable.patch | 48 + ...ter-memory-leak-fix-and-fix-the-leak.patch | 88 - ...erence-when-pci-driver-used-as-an-ap.patch | 59 - ...-module-parameter-for-msi-interrupts.patch | 30 - .../stable-s390-sclp-fix-compile-error.patch | 35 + ...stable-s390-setup-fix-novx-parameter.patch | 74 + ...cpu_active_mask-cpu_online_mask-race.patch | 146 + ...up-spi-mode-before-asserting-cs-gpio.patch | 88 + ...vers-to-limit-data-i-o-to-word-sizes.patch | 129 + ...fix-regression-in-spi-bitbang-txrx.h.patch | 43 + ...-for-timeout-error-before-proceeding.patch | 48 + ...g-spfi-fix-kbuild-test-robot-warning.patch | 33 + ...i-fix-multiple-calls-to-request-gpio.patch | 97 + ...x-fifo-size-to-64-word-from-256-word.patch | 66 + ...i7x3x-fix-digital-output-on-pci-7230.patch | 56 + ...n-t-clobber-ai_timer-in-command-test.patch | 87 + ...n-t-clobber-ao_timer-in-command-test.patch | 90 + ...fix-race-between-irq-and-set_termios.patch | 75 + ...out-transfers-of-more-than-512-bytes.patch | 58 + ...d-custom-pid-for-customware-products.patch | 51 + ...maxpacketsize-according-to-bandwidth.patch | 87 + ...6592-udc-forever-loop-in-set_feature.patch | 32 + ...delete-useless-bus_to_hcd-conversion.patch | 58 + ...3-fix-baud-rate-divisor-calculations.patch | 97 + ...lt4111-lte-ev-do-hspa-gobi-4g-module.patch | 30 + ...lserial-use-usb_get_serial_port_data.patch | 52 + ...-correct-fpu-emulation-access-to-ldt.patch | 98 + ...-ldt-access-in-single-stepping-logic.patch | 45 + ...le-x86-ldt-further-fix-fpu-emulation.patch | 35 + ...-x86-ldt-make-modify_ldt-synchronous.patch | 628 ++++ ...-xen-pv-apic-driver-for-domu-as-well.patch | 87 - ...th-work_busy-in-purge_persistent_gnt.patch | 40 - ...on-t-add-indirect-pages-to-list-when.patch | 44 - ...en-unmapping-the-ring-on-hvm-backend.patch | 40 - ...ory-corruption-for-btree-directories.patch | 65 + ...fs-fix-xfs_attr_leafblock-definition.patch | 47 + ...apic-Fix-fallout-from-x2apic-cleanup.patch | 81 - ...e-trace_cpu_idle-to-mwait_idle-calls.patch | 46 - kernel/kernel/pspec.xml | 30 +- 113 files changed, 5109 insertions(+), 5925 deletions(-) create mode 100644 kernel/kernel/files/patches/linux/patch-4.1.7.xz create mode 100644 kernel/kernel/files/patches/mageia/Input-evdev-do-not-report-errors-form-flush.patch delete mode 100644 kernel/kernel/files/patches/mageia/Revert-sched-x86_64-Don-t-save-flags-on-context-swit.patch delete mode 100644 kernel/kernel/files/patches/mageia/SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch delete mode 100644 kernel/kernel/files/patches/mageia/ata-Revert-libata-Implement-NCQ-autosense.patch delete mode 100644 kernel/kernel/files/patches/mageia/ata-Revert-libata-Implement-support-for-sense-data-repor.patch delete mode 100644 kernel/kernel/files/patches/mageia/ata-Revert-libata-eh-Set-information-field-for-autosense.patch delete mode 100644 kernel/kernel/files/patches/mageia/ata-jmicron-disable-broken-async_suspend.patch delete mode 100644 kernel/kernel/files/patches/mageia/ata-revert-Disabling-the-async-PM-for-JMicron-chip-363-361.patch delete mode 100644 kernel/kernel/files/patches/mageia/gpu-drm-i915-Avoid-TP3-on-CHV.patch delete mode 100644 kernel/kernel/files/patches/mageia/gpu-drm-i915-remove-HBR2-from-chv-supported-list.patch create mode 100644 kernel/kernel/files/patches/mageia/scsi-Fix-NULL-pointer-dereference-in-RTPM-of-block-layer.patch create mode 100644 kernel/kernel/files/patches/mageia/scsi-Revert-SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-asoc-adav80x-remove-.read_flag_mask-setting-from-adav80x_regmap_config.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-asoc-arizona-fix-gain-settings-of-fll-in-free-run-mode.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-asoc-arizona-poll-for-fll-clock-ok-rather-than-use-interrupts.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-asoc-rt5640-fix-line-out-no-sound-issue.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-asoc-samsung-remove-redundant-arndale_audio_remove.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-clk-exynos4-fix-wrong-clock-for-exynos4x12-adc.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-clk-pistachio-correct-critical-clock-list.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-clk-pistachio-fix-override-of-clk-pll-settings-from-boot-loader.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-clk-pxa-fix-core-frequency-reporting-unit.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-clk-pxa-pxa3xx-fix-cken-register-access.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-clk-qcom-fix-msm8916-prng-clock-enable-bit.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-clk-qcom-set-clk_set_rate_parent-on-ce1-clocks.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-clk-rockchip-rk3288-add-clk_set_rate_parent-to-sclk_mac.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-clk-s5pv210-add-missing-call-to.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-clk-versatile-off-by-one-in-clk_sp810_timerclken_of_get.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-dm-thin-metadata-delete-btrees-when-releasing-metadata-snapshot.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-doc-usb-gadget-testing-using-the-updated-testusb.c.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-i915-allow-dsi-dual-link-to-be-configured-on-any-pipe.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-i915-always-mark-the-object-as-dirty-when-used-by-the-gpu.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-i915-apply-the-pci_d0-d3-hibernation-workaround-everywhere-on-pre-gen6.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-i915-check-dp-link-status-on-long-hpd-too.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-i915-limit-the-number-of-loops-for-reading-a-split-64bit-register.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-i915-preserve-ssc-earlier.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-qxl-validate-monitors-config-modes.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-drm-radeon-add-new-oland-pci-id.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-radeon-atom-send-out-the-full-aux-address.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-radeon-don-t-link-train-displayport-on-hpd-until-we-get-the-dpcd.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-radeon-fix-hdmi-quantization_range-for-pre-dce5-asics.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-drm-radeon-native-send-out-the-full-aux-address.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-drm-vmwgfx-fix-execbuf-locking-issues.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-edac-ppc4xx-access-mci-csrows-array-elements-properly.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-hid-hid-input-fix-accessing-freed-memory-during-device-disconnect.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-hid-uclogic-fix-limit-in-uclogic_tablet_enable.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-iio-add-inverse-unit-conversion-macros.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-iio-adis16400-fix-adis16448-gyroscope-scale.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-iio-adis16480-fix-scale-factors.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-iio-bmg160-iio_buffer-and-iio_triggered_buffer-are-required.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-iio-event-remove-negative-error-code-from-iio_event_poll.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-iio-industrialio-buffer-fix-iio_buffer_poll-return-value.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-ipc-sem-fix-use-after-free-on-ipc_rmid-after-a-task-using-same-semaphore-set-exits.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-ipc-sem.c-update-correct-memory-barriers.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-iwlwifi-pcie-fix-prepare-card-flow.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-libxfs-readahead-of-dir3-data-blocks-should-use-the-read-verifier.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-localmodconfig-use-kbuild-files-too.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-mm-hwpoison-fix-fail-isolate-hugetlbfs-page-w-refcount-held.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-mm-hwpoison-fix-page-refcount-of-unknown-non-lru-page.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-net_41.mbox.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-pci-add-dev_flags-bit-to-access-vpd-through-function-0.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-pci-add-vpd-function-0-quirk-for-intel-ethernet-devices.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-pci-disable-async-suspend-resume-for-jmicron-multi-function-sata-ahci.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-pci-fix-ti816x-class-code-quirk.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-perf-fix-double-free-of-the-aux-buffer.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-perf-fix-fasync-handling-on-inherited-events.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-perf-fix-perf_event_ioc_period-migration-race.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-perf-fix-running-time-accounting.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-pm-clk-don-t-return-int-on-__pm_clk_enable.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-rsi-fix-failure-to-load-firmware-after-memory-leak-fix-and-fix-the-leak.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-rtlwifi-fix-null-dereference-when-pci-driver-used-as-an-ap.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-rtlwifi-rtl8723be-add-module-parameter-for-msi-interrupts.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-s390-sclp-fix-compile-error.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-s390-setup-fix-novx-parameter.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-sched-fix-cpu_active_mask-cpu_online_mask-race.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-spi-bcm2835-set-up-spi-mode-before-asserting-cs-gpio.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-spi-dw-allow-interface-drivers-to-limit-data-i-o-to-word-sizes.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-spi-fix-regression-in-spi-bitbang-txrx.h.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-spi-img-spfi-check-for-timeout-error-before-proceeding.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-spi-img-spfi-fix-kbuild-test-robot-warning.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-spi-img-spfi-fix-multiple-calls-to-request-gpio.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-spi-sh-msiof-fix-fifo-size-to-64-word-from-256-word.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-staging-comedi-adl_pci7x3x-fix-digital-output-on-pci-7230.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-staging-comedi-usbduxsigma-don-t-clobber-ai_timer-in-command-test.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-staging-comedi-usbduxsigma-don-t-clobber-ao_timer-in-command-test.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-tty-serial-men_z135_uart.c-fix-race-between-irq-and-set_termios.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-usb-dwc3-ep0-fix-mem-corruption-on-out-transfers-of-more-than-512-bytes.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-usb-ftdi_sio-added-custom-pid-for-customware-products.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-usb-gadget-f_uac2-finalize-wmaxpacketsize-according-to-bandwidth.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-usb-gadget-m66592-udc-forever-loop-in-set_feature.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-usb-host-ehci-sys-delete-useless-bus_to_hcd-conversion.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-usb-pl2303-fix-baud-rate-divisor-calculations.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-usb-qcserial-add-hp-lt4111-lte-ev-do-hspa-gobi-4g-module.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-usb-symbolserial-use-usb_get_serial_port_data.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-x86-ldt-correct-fpu-emulation-access-to-ldt.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-x86-ldt-correct-ldt-access-in-single-stepping-logic.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-x86-ldt-further-fix-fpu-emulation.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-x86-ldt-make-modify_ldt-synchronous.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-x86-xen-build-xen-pv-apic-driver-for-domu-as-well.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-xen-blkback-replace-work_pending-with-work_busy-in-purge_persistent_gnt.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-xen-blkfront-don-t-add-indirect-pages-to-list-when.patch delete mode 100644 kernel/kernel/files/patches/mageia/stable-xen-xenbus-don-t-leak-memory-when-unmapping-the-ring-on-hvm-backend.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-xfs-fix-file-type-directory-corruption-for-btree-directories.patch create mode 100644 kernel/kernel/files/patches/mageia/stable-xfs-fix-xfs_attr_leafblock-definition.patch delete mode 100644 kernel/kernel/files/patches/mageia/x86-apic-Fix-fallout-from-x2apic-cleanup.patch delete mode 100644 kernel/kernel/files/patches/mageia/x86-idle-Restore-trace_cpu_idle-to-mwait_idle-calls.patch diff --git a/kernel/drivers/module-bbswitch/pspec.xml b/kernel/drivers/module-bbswitch/pspec.xml index 29134444..922cfc8d 100644 --- a/kernel/drivers/module-bbswitch/pspec.xml +++ b/kernel/drivers/module-bbswitch/pspec.xml @@ -11,7 +11,7 @@ Kernel module allowing to switch dedicated graphics card on Optimus laptops kernel module allowing to switch dedicated graphics card on Optimus laptops - kernel-module-headers + kernel-module-headers https://github.com/Bumblebee-Project/bbswitch/archive/v0.8.tar.gz @@ -20,7 +20,7 @@ module-bbswitch - kernel + kernel /lib/modules @@ -34,6 +34,13 @@ + + 2015-09-18 + 0.8 + Rebuild for kernel-4.1.7. + Ertuğrul Erata + ertugrulerata@gmail.com + 2015-08-18 0.8 diff --git a/kernel/drivers/module-broadcom-wl/pspec.xml b/kernel/drivers/module-broadcom-wl/pspec.xml index 3cb9e328..06dc2432 100644 --- a/kernel/drivers/module-broadcom-wl/pspec.xml +++ b/kernel/drivers/module-broadcom-wl/pspec.xml @@ -15,7 +15,7 @@ http://www.broadcom.com/docs/linux_sta/hybrid-v35-nodebug-pcoem-6_30_223_248.tar.gz http://www.broadcom.com/docs/linux_sta/hybrid-v35_64-nodebug-pcoem-6_30_223_248.tar.gz - kernel-module-headers + kernel-module-headers patch/linux-40.patch @@ -30,7 +30,7 @@ module-broadcom-wl - kernel + kernel module-broadcom-wl-userspace @@ -62,6 +62,13 @@ + + 2015-09-18 + 6.30.223.248 + Rebuild for kernel 4.1.7. + Ertuğrul Erata + ertugrulerata@gmail.com + 2015-08-18 6.30.223.248 diff --git a/kernel/drivers/module-virtualbox-guest/pspec.xml b/kernel/drivers/module-virtualbox-guest/pspec.xml index 8a82d576..734a0576 100644 --- a/kernel/drivers/module-virtualbox-guest/pspec.xml +++ b/kernel/drivers/module-virtualbox-guest/pspec.xml @@ -14,14 +14,14 @@ This package provides the kernel modules needed for mouse integration and shared folder support between VirtualBox host and guest systems. http://source.pisilinux.org/1.0/module-virtualbox-guest-4.3.28.tar.xz - kernel-module-headers + kernel-module-headers module-virtualbox-guest - kernel + kernel baselayout module-virtualbox-guest-userspace @@ -55,7 +55,7 @@ 2015-08-18 4.3.28 - Rebuild for kernel-4.1.6. + Rebuild for kernel-4.1.7. Ertuğrul Erata ertugrulerata@gmail.com diff --git a/kernel/drivers/module-virtualbox/pspec.xml b/kernel/drivers/module-virtualbox/pspec.xml index 0a90bc3d..5b0de905 100644 --- a/kernel/drivers/module-virtualbox/pspec.xml +++ b/kernel/drivers/module-virtualbox/pspec.xml @@ -14,14 +14,14 @@ This package provides the kernel support for VirtualBox. http://source.pisilinux.org/1.0/module-virtualbox-4.3.28.tar.xz - kernel-module-headers + kernel-module-headers module-virtualbox - kernel + kernel module-virtualbox-userspace @@ -47,6 +47,13 @@ + + 2015-09-18 + 4.3.28 + Rebuild for kernel-4.1.7. + Ertuğrul Erata + ertugrulerata@gmail.com + 2015-08-18 4.3.28 diff --git a/kernel/kernel/files/configs/kernel-x86_64-config b/kernel/kernel/files/configs/kernel-x86_64-config index ac6c09d2..39d4fc93 100644 --- a/kernel/kernel/files/configs/kernel-x86_64-config +++ b/kernel/kernel/files/configs/kernel-x86_64-config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86_64 4.1.6 Kernel Configuration +# Linux/x86_64 4.1.7 Kernel Configuration # CONFIG_64BIT=y CONFIG_X86_64=y diff --git a/kernel/kernel/files/patches/linux/patch-4.1.7.xz b/kernel/kernel/files/patches/linux/patch-4.1.7.xz new file mode 100644 index 0000000000000000000000000000000000000000..056b9d3c1111ebc27620781006c0e93a8322faeb GIT binary patch literal 224108 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 z%0A>*;+GG7dCt;gRnqcVNYLVp?f)4=#S;nrG-b0&g6+s_zt7jHd$W`DkT6xsVZ>zL z*7TC+6OTQx!}1$`**oTrHjSmEuY&t0{9yR#u0RFn3EgGQ%$j3HXy7fp#_vo*eavqL zv?ujidz8GprrQ|v!J8`6M+tFfIT`Yy&t8_Dczn7T*Doz2=tk!b#Wv0D@}-bA_yBh}u+7<9>ml3&M-LlTCRTnO+py z=}Nr;{f>v6yK|;0-DU=U0VO&xb^N)OYg-<}F=samKs&Y5K-4Ku0&;Mm@iD&nOE{H& z=agAXmddz3!-s8?wR}M~DK_O*hg$2;D7;JCF8Z2YYPIAU*&m2CSYV=eH-Oi<;Ex?v zIfjxqGwim7HTCQrK|9pI%xS7nEOW{%cl=@o_pztNLM6(nv*2#Ay1J0Y_tE`{w7us< z(;N!sbO5U^Q}vV&;k%?Ps2#{o0bGGxa5vFz`<7x~|1ykrQ~{)UMbF|<WOmf{rI1Hs_$DsC_L#;407CZQF>=wA`OYmH!YMSJL$1$=bR1^ z@N+i>Jxyq<__=a{8-#rHlh$qiRX`&rPg9H}c;7YImlv+<{(BgR@N=0n6ISa@Mp6V# zlxFC-C?o3}mXXr+7nfcr-`8dm(~L0$V^t!&8c`0ooFnXrKr3Ef5vwU(>p6H%vtDVF zb>{7e0X8|?ij-lnLeiR0sS+510!M7=ZC7MhL z*x$IkCZTuSay0L$l-YWyB}A5EI@z{uw8cocxhuA1l!#jfnDBM_CV`wekgcbWZixKk z8dSEWx5*_7evs(l(X!~7`JCQJaVC9FV8sk;^n1j#@Q%Q^G)U+JU-f(2elT`U4Ps{j zsTj1hC3^`>21Au`ue12|Ht9mhm-DCMd<&{F?jSC>%%hOU|LZ~Z@-xMDe>qDJHU7U0 zqc@ARF@HPk$krh!^*s)=aomZ3>~6quBdgY=bFVp}pDK`Kxup>_G(fty~IgLcaVl%1`+qG1C0&YZ~+}cKNif1oE_9>-BJG*W2 z70|qfK6cY!*^(jqzQ1P$Z79)gEE*`uiDHATX~Dq>`bigi8U;s6i>d?^^Cwn$ukpWK zL1g*j1i|E&j@6L19(sx~avW+2bNlX~aDh z$wRTPpmZc#p*j`J94(-WC%Tp@I@j27?S-bdvUZ`tg7O!gnSA44!%H+m28vq

(EZ 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 z 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 +Date: Thu, 3 Sep 2015 22:20:00 -0700 +Subject: [PATCH] Input: evdev - do not report errors form flush() + +We've got bug reports showing the old systemd-logind (at least +system-210) aborting unexpectedly, and this turned out to be because +of an invalid error code from close() call to evdev devices. close() +is supposed to return only either EINTR or EBADFD, while the device +returned ENODEV. logind was overreacting to it and decided to kill +itself when an unexpected error code was received. What a tragedy. + +The bad error code comes from flush fops, and actually evdev_flush() +returns ENODEV when device is disconnected or client's access to it is +revoked. But in these cases the fact that flush did not actually happen is +not an error, but rather normal behavior. For non-disconnected devices +result of flush is also not that interesting as there is no potential of +data loss and even if it fails application has no way of handling the +error. Because of that we are better off always returning success from +evdev_flush(). + +Also returning EINTR from flush()/close() is discouraged (as it is not +clear how application should handle this error), so let's stop taking +evdev->mutex interruptibly. + +Bugzilla: http://bugzilla.suse.com/show_bug.cgi?id=939834 +Cc: +Signed-off-by: Takashi Iwai +Signed-off-by: Dmitry Torokhov +--- + drivers/input/evdev.c | 13 ++++--------- + 1 file changed, 4 insertions(+), 9 deletions(-) + +diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c +index 9d35499..08d4964 100644 +--- a/drivers/input/evdev.c ++++ b/drivers/input/evdev.c +@@ -290,19 +290,14 @@ static int evdev_flush(struct file *file, fl_owner_t id) + { + struct evdev_client *client = file->private_data; + struct evdev *evdev = client->evdev; +- int retval; + +- retval = mutex_lock_interruptible(&evdev->mutex); +- if (retval) +- return retval; ++ mutex_lock(&evdev->mutex); + +- if (!evdev->exist || client->revoked) +- retval = -ENODEV; +- else +- retval = input_flush_device(&evdev->handle, file); ++ if (evdev->exist && !client->revoked) ++ input_flush_device(&evdev->handle, file); + + mutex_unlock(&evdev->mutex); +- return retval; ++ return 0; + } + + static void evdev_free(struct device *dev) +-- +2.3.8 + diff --git a/kernel/kernel/files/patches/mageia/Revert-sched-x86_64-Don-t-save-flags-on-context-swit.patch b/kernel/kernel/files/patches/mageia/Revert-sched-x86_64-Don-t-save-flags-on-context-swit.patch deleted file mode 100644 index 12178194..00000000 --- a/kernel/kernel/files/patches/mageia/Revert-sched-x86_64-Don-t-save-flags-on-context-swit.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 512255a2ad2c832ca7d4de9f31245f73781922d0 Mon Sep 17 00:00:00 2001 -From: Andy Lutomirski -Date: Mon, 17 Aug 2015 12:22:50 -0700 -Subject: [PATCH] Revert "sched/x86_64: Don't save flags on context switch" - -This reverts commit: - - 2c7577a75837 ("sched/x86_64: Don't save flags on context switch") - -It was a nice speedup. It's also not quite correct: SYSENTER -enables interrupts too early. - -We can re-add this optimization once the SYSENTER code is beaten -into shape, which should happen in 4.3 or 4.4. - -Signed-off-by: Andy Lutomirski -Cc: Linus Torvalds -Cc: Peter Zijlstra -Cc: Thomas Gleixner -Cc: stable@vger.kernel.org # v3.19 -Link: http://lkml.kernel.org/r/85f56651f59f76624e80785a8fd3bdfdd089a818.1439838962.git.luto@kernel.org -Signed-off-by: Ingo Molnar ---- - arch/x86/include/asm/switch_to.h | 12 ++++-------- - 1 file changed, 4 insertions(+), 8 deletions(-) - -diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h -index 751bf4b..d7f3b3b 100644 ---- a/arch/x86/include/asm/switch_to.h -+++ b/arch/x86/include/asm/switch_to.h -@@ -79,12 +79,12 @@ do { \ - #else /* CONFIG_X86_32 */ - - /* frame pointer must be last for get_wchan */ --#define SAVE_CONTEXT "pushq %%rbp ; movq %%rsi,%%rbp\n\t" --#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp\t" -+#define SAVE_CONTEXT "pushf ; pushq %%rbp ; movq %%rsi,%%rbp\n\t" -+#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp ; popf\t" - - #define __EXTRA_CLOBBER \ - , "rcx", "rbx", "rdx", "r8", "r9", "r10", "r11", \ -- "r12", "r13", "r14", "r15", "flags" -+ "r12", "r13", "r14", "r15" - - #ifdef CONFIG_CC_STACKPROTECTOR - #define __switch_canary \ -@@ -100,11 +100,7 @@ do { \ - #define __switch_canary_iparam - #endif /* CC_STACKPROTECTOR */ - --/* -- * There is no need to save or restore flags, because flags are always -- * clean in kernel mode, with the possible exception of IOPL. Kernel IOPL -- * has no effect. -- */ -+/* Save restore flags to clear handle leaking NT */ - #define switch_to(prev, next, last) \ - asm volatile(SAVE_CONTEXT \ - "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \ --- -2.4.5 - diff --git a/kernel/kernel/files/patches/mageia/SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch b/kernel/kernel/files/patches/mageia/SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch deleted file mode 100644 index e7623744..00000000 --- a/kernel/kernel/files/patches/mageia/SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 49718f0fb8c9af192b33d8af3a2826db04025371 Mon Sep 17 00:00:00 2001 -From: Alan Stern -Date: Mon, 17 Aug 2015 11:02:42 -0400 -Subject: [PATCH] SCSI: Fix NULL pointer dereference in runtime PM -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The routines in scsi_rpm.c assume that if a runtime-PM callback is -invoked for a SCSI device, it can only mean that the device's driver -has asked the block layer to handle the runtime power management (by -calling blk_pm_runtime_init(), which among other things sets q->dev). - -However, this assumption turns out to be wrong for things like the ses -driver. Normally ses devices are not allowed to do runtime PM, but -userspace can override this setting. If this happens, the kernel gets -a NULL pointer dereference when blk_post_runtime_resume() tries to use -the uninitialized q->dev pointer. - -This patch fixes the problem by calling the block layer's runtime-PM -routines only if the device's driver really does have a runtime-PM -callback routine. Since ses doesn't define any such callbacks, the -crash won't occur. - -This fixes Bugzilla #101371. - -Signed-off-by: Alan Stern -Reported-by: Stanisław Pitucha -Reported-by: Ilan Cohen -Tested-by: Ilan Cohen -Reviewed-by: Johannes Thumshirn -Cc: stable@vger.kernel.org -Signed-off-by: James Bottomley ---- - drivers/scsi/scsi_pm.c | 22 +++++++++++----------- - 1 file changed, 11 insertions(+), 11 deletions(-) - -diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c -index 9e43ae1..e4b7998 100644 ---- a/drivers/scsi/scsi_pm.c -+++ b/drivers/scsi/scsi_pm.c -@@ -217,15 +217,15 @@ static int sdev_runtime_suspend(struct device *dev) - { - const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; - struct scsi_device *sdev = to_scsi_device(dev); -- int err; -+ int err = 0; - -- err = blk_pre_runtime_suspend(sdev->request_queue); -- if (err) -- return err; -- if (pm && pm->runtime_suspend) -+ if (pm && pm->runtime_suspend) { -+ err = blk_pre_runtime_suspend(sdev->request_queue); -+ if (err) -+ return err; - err = pm->runtime_suspend(dev); -- blk_post_runtime_suspend(sdev->request_queue, err); -- -+ blk_post_runtime_suspend(sdev->request_queue, err); -+ } - return err; - } - -@@ -248,11 +248,11 @@ static int sdev_runtime_resume(struct device *dev) - const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; - int err = 0; - -- blk_pre_runtime_resume(sdev->request_queue); -- if (pm && pm->runtime_resume) -+ if (pm && pm->runtime_resume) { -+ blk_pre_runtime_resume(sdev->request_queue); - err = pm->runtime_resume(dev); -- blk_post_runtime_resume(sdev->request_queue, err); -- -+ blk_post_runtime_resume(sdev->request_queue, err); -+ } - return err; - } - --- -2.4.5 - diff --git a/kernel/kernel/files/patches/mageia/ata-Revert-libata-Implement-NCQ-autosense.patch b/kernel/kernel/files/patches/mageia/ata-Revert-libata-Implement-NCQ-autosense.patch deleted file mode 100644 index dbb919f3..00000000 --- a/kernel/kernel/files/patches/mageia/ata-Revert-libata-Implement-NCQ-autosense.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 74a80d67b8316eb3fbeb73dafc060a5a0a708587 Mon Sep 17 00:00:00 2001 -From: Tejun Heo -Date: Mon, 3 Aug 2015 11:46:39 -0400 -Subject: [PATCH] Revert "libata: Implement NCQ autosense" - -This reverts commit 42b966fbf35da9c87f08d98f9b8978edf9e717cf. - -As implemented, ACS-4 sense reporting for ATA devices bypasses error -diagnosis and handling in libata degrading EH behavior significantly. -Revert the related changes for now. - -Signed-off-by: Tejun Heo -Cc: Hannes Reinecke -Cc: stable@vger.kernel.org #v4.1+ ---- - drivers/ata/libata-eh.c | 18 ------------------ - drivers/ata/libata-scsi.c | 9 ++------- - drivers/ata/libata.h | 1 - - include/linux/ata.h | 2 -- - 4 files changed, 2 insertions(+), 28 deletions(-) - -diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c -index 16125be..cb0508a 100644 ---- a/drivers/ata/libata-eh.c -+++ b/drivers/ata/libata-eh.c -@@ -1592,8 +1592,6 @@ static int ata_eh_read_log_10h(struct ata_device *dev, - tf->hob_lbah = buf[10]; - tf->nsect = buf[12]; - tf->hob_nsect = buf[13]; -- if (ata_id_has_ncq_autosense(dev->id)) -- tf->auxiliary = buf[14] << 16 | buf[15] << 8 | buf[16]; - - return 0; - } -@@ -1791,18 +1789,6 @@ void ata_eh_analyze_ncq_error(struct ata_link *link) - memcpy(&qc->result_tf, &tf, sizeof(tf)); - qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48; - qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ; -- if (qc->result_tf.auxiliary) { -- char sense_key, asc, ascq; -- -- sense_key = (qc->result_tf.auxiliary >> 16) & 0xff; -- asc = (qc->result_tf.auxiliary >> 8) & 0xff; -- ascq = qc->result_tf.auxiliary & 0xff; -- ata_dev_dbg(dev, "NCQ Autosense %02x/%02x/%02x\n", -- sense_key, asc, ascq); -- ata_scsi_set_sense(qc->scsicmd, sense_key, asc, ascq); -- qc->flags |= ATA_QCFLAG_SENSE_VALID; -- } -- - ehc->i.err_mask &= ~AC_ERR_DEV; - } - -@@ -1832,10 +1818,6 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, - return ATA_EH_RESET; - } - -- /* Set by NCQ autosense */ -- if (qc->flags & ATA_QCFLAG_SENSE_VALID) -- return 0; -- - if (stat & (ATA_ERR | ATA_DF)) - qc->err_mask |= AC_ERR_DEV; - else -diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c -index e1ecd2a..0d7f0da 100644 ---- a/drivers/ata/libata-scsi.c -+++ b/drivers/ata/libata-scsi.c -@@ -270,11 +270,8 @@ DEVICE_ATTR(unload_heads, S_IRUGO | S_IWUSR, - ata_scsi_park_show, ata_scsi_park_store); - EXPORT_SYMBOL_GPL(dev_attr_unload_heads); - --void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq) -+static void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq) - { -- if (!cmd) -- return; -- - cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; - - scsi_build_sense_buffer(0, cmd->sense_buffer, sk, asc, ascq); -@@ -1780,9 +1777,7 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) - ((cdb[2] & 0x20) || need_sense)) { - ata_gen_passthru_sense(qc); - } else { -- if (qc->flags & ATA_QCFLAG_SENSE_VALID) { -- cmd->result = SAM_STAT_CHECK_CONDITION; -- } else if (!need_sense) { -+ if (!need_sense) { - cmd->result = SAM_STAT_GOOD; - } else { - /* TODO: decide which descriptor format to use -diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h -index 8cfdd96..f840ca1 100644 ---- a/drivers/ata/libata.h -+++ b/drivers/ata/libata.h -@@ -137,7 +137,6 @@ extern int ata_scsi_add_hosts(struct ata_host *host, - struct scsi_host_template *sht); - extern void ata_scsi_scan_host(struct ata_port *ap, int sync); - extern int ata_scsi_offline_dev(struct ata_device *dev); --extern void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq); - extern void ata_scsi_media_change_notify(struct ata_device *dev); - extern void ata_scsi_hotplug(struct work_struct *work); - extern void ata_schedule_scsi_eh(struct Scsi_Host *shost); -diff --git a/include/linux/ata.h b/include/linux/ata.h -index 0e6a782..d2992bf 100644 ---- a/include/linux/ata.h -+++ b/include/linux/ata.h -@@ -528,8 +528,6 @@ struct ata_bmdma_prd { - #define ata_id_cdb_intr(id) (((id)[ATA_ID_CONFIG] & 0x60) == 0x20) - #define ata_id_has_da(id) ((id)[ATA_ID_SATA_CAPABILITY_2] & (1 << 4)) - #define ata_id_has_devslp(id) ((id)[ATA_ID_FEATURE_SUPP] & (1 << 8)) --#define ata_id_has_ncq_autosense(id) \ -- ((id)[ATA_ID_FEATURE_SUPP] & (1 << 7)) - - static inline bool ata_id_has_hipm(const u16 *id) - { --- -2.4.5 - diff --git a/kernel/kernel/files/patches/mageia/ata-Revert-libata-Implement-support-for-sense-data-repor.patch b/kernel/kernel/files/patches/mageia/ata-Revert-libata-Implement-support-for-sense-data-repor.patch deleted file mode 100644 index 69533d57..00000000 --- a/kernel/kernel/files/patches/mageia/ata-Revert-libata-Implement-support-for-sense-data-repor.patch +++ /dev/null @@ -1,212 +0,0 @@ -From 84ded2f8e7dda336fc2fb3570726ceb3b3b3590f Mon Sep 17 00:00:00 2001 -From: Tejun Heo -Date: Mon, 3 Aug 2015 11:45:34 -0400 -Subject: [PATCH] Revert "libata: Implement support for sense data reporting" - -This reverts commit fe7173c206de63fc28475ee6ae42ff95c05692de. - -As implemented, ACS-4 sense reporting for ATA devices bypasses error -diagnosis and handling in libata degrading EH behavior significantly. -Revert the related changes for now. - -ATA_ID_COMMAND_SET_3/4 constants are not reverted as they're used by -later changes. - -Signed-off-by: Tejun Heo -Cc: Hannes Reinecke -Cc: stable@vger.kernel.org #v4.1+ ---- - drivers/ata/libata-core.c | 20 +---------- - drivers/ata/libata-eh.c | 86 ++--------------------------------------------- - include/linux/ata.h | 16 --------- - 3 files changed, 4 insertions(+), 118 deletions(-) - -diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c -index 426bc12..19bcb80 100644 ---- a/drivers/ata/libata-core.c -+++ b/drivers/ata/libata-core.c -@@ -2147,24 +2147,6 @@ static int ata_dev_config_ncq(struct ata_device *dev, - return 0; - } - --static void ata_dev_config_sense_reporting(struct ata_device *dev) --{ -- unsigned int err_mask; -- -- if (!ata_id_has_sense_reporting(dev->id)) -- return; -- -- if (ata_id_sense_reporting_enabled(dev->id)) -- return; -- -- err_mask = ata_dev_set_feature(dev, SETFEATURE_SENSE_DATA, 0x1); -- if (err_mask) { -- ata_dev_dbg(dev, -- "failed to enable Sense Data Reporting, Emask 0x%x\n", -- err_mask); -- } --} -- - /** - * ata_dev_configure - Configure the specified ATA/ATAPI device - * @dev: Target device to configure -@@ -2387,7 +2369,7 @@ int ata_dev_configure(struct ata_device *dev) - dev->devslp_timing[i] = sata_setting[j]; - } - } -- ata_dev_config_sense_reporting(dev); -+ - dev->cdb_len = 16; - } - -diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c -index af08d32..16125be 100644 ---- a/drivers/ata/libata-eh.c -+++ b/drivers/ata/libata-eh.c -@@ -1630,70 +1630,6 @@ unsigned int atapi_eh_tur(struct ata_device *dev, u8 *r_sense_key) - } - - /** -- * ata_eh_request_sense - perform REQUEST_SENSE_DATA_EXT -- * @dev: device to perform REQUEST_SENSE_SENSE_DATA_EXT to -- * @sense_buf: result sense data buffer (SCSI_SENSE_BUFFERSIZE bytes long) -- * @dfl_sense_key: default sense key to use -- * -- * Perform REQUEST_SENSE_DATA_EXT after the device reported CHECK -- * SENSE. This function is EH helper. -- * -- * LOCKING: -- * Kernel thread context (may sleep). -- * -- * RETURNS: -- * encoded sense data on success, 0 on failure or if sense data -- * is not available. -- */ --static u32 ata_eh_request_sense(struct ata_queued_cmd *qc, -- struct scsi_cmnd *cmd) --{ -- struct ata_device *dev = qc->dev; -- struct ata_taskfile tf; -- unsigned int err_mask; -- -- if (!cmd) -- return 0; -- -- DPRINTK("ATA request sense\n"); -- ata_dev_warn(dev, "request sense\n"); -- if (!ata_id_sense_reporting_enabled(dev->id)) { -- ata_dev_warn(qc->dev, "sense data reporting disabled\n"); -- return 0; -- } -- ata_tf_init(dev, &tf); -- -- tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; -- tf.flags |= ATA_TFLAG_LBA | ATA_TFLAG_LBA48; -- tf.command = ATA_CMD_REQ_SENSE_DATA; -- tf.protocol = ATA_PROT_NODATA; -- -- err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0); -- /* -- * ACS-4 states: -- * The device may set the SENSE DATA AVAILABLE bit to one in the -- * STATUS field and clear the ERROR bit to zero in the STATUS field -- * to indicate that the command returned completion without an error -- * and the sense data described in table 306 is available. -- * -- * IOW the 'ATA_SENSE' bit might not be set even though valid -- * sense data is available. -- * So check for both. -- */ -- if ((tf.command & ATA_SENSE) || -- tf.lbah != 0 || tf.lbam != 0 || tf.lbal != 0) { -- ata_scsi_set_sense(cmd, tf.lbah, tf.lbam, tf.lbal); -- qc->flags |= ATA_QCFLAG_SENSE_VALID; -- ata_dev_warn(dev, "sense data %02x/%02x/%02x\n", -- tf.lbah, tf.lbam, tf.lbal); -- } else { -- ata_dev_warn(dev, "request sense failed stat %02x emask %x\n", -- tf.command, err_mask); -- } -- return err_mask; --} -- --/** - * atapi_eh_request_sense - perform ATAPI REQUEST_SENSE - * @dev: device to perform REQUEST_SENSE to - * @sense_buf: result sense data buffer (SCSI_SENSE_BUFFERSIZE bytes long) -@@ -1896,22 +1832,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, - return ATA_EH_RESET; - } - -- /* -- * Sense data reporting does not work if the -- * device fault bit is set. -- */ -- if ((stat & ATA_SENSE) && !(stat & ATA_DF) && -- !(qc->flags & ATA_QCFLAG_SENSE_VALID)) { -- if (!(qc->ap->pflags & ATA_PFLAG_FROZEN)) { -- tmp = ata_eh_request_sense(qc, qc->scsicmd); -- if (tmp) -- qc->err_mask |= tmp; -- } else { -- ata_dev_warn(qc->dev, "sense data available but port frozen\n"); -- } -- } -- -- /* Set by NCQ autosense or request sense above */ -+ /* Set by NCQ autosense */ - if (qc->flags & ATA_QCFLAG_SENSE_VALID) - return 0; - -@@ -2658,15 +2579,14 @@ static void ata_eh_link_report(struct ata_link *link) - - #ifdef CONFIG_ATA_VERBOSE_ERROR - if (res->command & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | -- ATA_SENSE | ATA_ERR)) { -+ ATA_ERR)) { - if (res->command & ATA_BUSY) - ata_dev_err(qc->dev, "status: { Busy }\n"); - else -- ata_dev_err(qc->dev, "status: { %s%s%s%s%s}\n", -+ ata_dev_err(qc->dev, "status: { %s%s%s%s}\n", - res->command & ATA_DRDY ? "DRDY " : "", - res->command & ATA_DF ? "DF " : "", - res->command & ATA_DRQ ? "DRQ " : "", -- res->command & ATA_SENSE ? "SENSE " : "", - res->command & ATA_ERR ? "ERR " : ""); - } - -diff --git a/include/linux/ata.h b/include/linux/ata.h -index 6c78956..0e6a782 100644 ---- a/include/linux/ata.h -+++ b/include/linux/ata.h -@@ -385,8 +385,6 @@ enum { - SATA_SSP = 0x06, /* Software Settings Preservation */ - SATA_DEVSLP = 0x09, /* Device Sleep */ - -- SETFEATURE_SENSE_DATA = 0xC3, /* Sense Data Reporting feature */ -- - /* feature values for SET_MAX */ - ATA_SET_MAX_ADDR = 0x00, - ATA_SET_MAX_PASSWD = 0x01, -@@ -710,20 +708,6 @@ static inline bool ata_id_has_read_log_d - return id[ATA_ID_COMMAND_SET_3] & (1 << 3); - } - --static inline bool ata_id_has_sense_reporting(const u16 *id) --{ -- if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15))) -- return false; -- return id[ATA_ID_COMMAND_SET_3] & (1 << 6); --} -- --static inline bool ata_id_sense_reporting_enabled(const u16 *id) --{ -- if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15))) -- return false; -- return id[ATA_ID_COMMAND_SET_4] & (1 << 6); --} -- - /** - * ata_id_major_version - get ATA level of drive - * @id: Identify data diff --git a/kernel/kernel/files/patches/mageia/ata-Revert-libata-eh-Set-information-field-for-autosense.patch b/kernel/kernel/files/patches/mageia/ata-Revert-libata-eh-Set-information-field-for-autosense.patch deleted file mode 100644 index f51f3667..00000000 --- a/kernel/kernel/files/patches/mageia/ata-Revert-libata-eh-Set-information-field-for-autosense.patch +++ /dev/null @@ -1,169 +0,0 @@ -From fe16d4f202c59a560533a223bc6375739ee30944 Mon Sep 17 00:00:00 2001 -From: Tejun Heo -Date: Mon, 3 Aug 2015 11:41:33 -0400 -Subject: [PATCH] Revert "libata-eh: Set 'information' field for autosense" - -This reverts commit a1524f226a02aa6edebd90ae0752e97cfd78b159. - -As implemented, ACS-4 sense reporting for ATA devices bypasses error -diagnosis and handling in libata degrading EH behavior significantly. -Revert the related changes for now. - -Signed-off-by: Tejun Heo -Cc: Hannes Reinecke -Cc: stable@vger.kernel.org #v4.1+ ---- - drivers/ata/libata-core.c | 4 ++-- - drivers/ata/libata-eh.c | 3 --- - drivers/ata/libata-scsi.c | 12 ------------ - drivers/ata/libata.h | 5 +---- - drivers/scsi/scsi_error.c | 31 ------------------------------- - include/scsi/scsi_eh.h | 1 - - 6 files changed, 3 insertions(+), 53 deletions(-) - -diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c -index db5d9f7..426bc12 100644 ---- a/drivers/ata/libata-core.c -+++ b/drivers/ata/libata-core.c -@@ -694,11 +694,11 @@ static int ata_rwcmd_protocol(struct ata_taskfile *tf, struct ata_device *dev) - * RETURNS: - * Block address read from @tf. - */ --u64 ata_tf_read_block(const struct ata_taskfile *tf, struct ata_device *dev) -+u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev) - { - u64 block = 0; - -- if (!dev || tf->flags & ATA_TFLAG_LBA) { -+ if (tf->flags & ATA_TFLAG_LBA) { - if (tf->flags & ATA_TFLAG_LBA48) { - block |= (u64)tf->hob_lbah << 40; - block |= (u64)tf->hob_lbam << 32; -diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c -index 7465031..af08d32 100644 ---- a/drivers/ata/libata-eh.c -+++ b/drivers/ata/libata-eh.c -@@ -1864,7 +1864,6 @@ void ata_eh_analyze_ncq_error(struct ata_link *link) - ata_dev_dbg(dev, "NCQ Autosense %02x/%02x/%02x\n", - sense_key, asc, ascq); - ata_scsi_set_sense(qc->scsicmd, sense_key, asc, ascq); -- ata_scsi_set_sense_information(qc->scsicmd, &qc->result_tf); - qc->flags |= ATA_QCFLAG_SENSE_VALID; - } - -@@ -1907,8 +1906,6 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, - tmp = ata_eh_request_sense(qc, qc->scsicmd); - if (tmp) - qc->err_mask |= tmp; -- else -- ata_scsi_set_sense_information(qc->scsicmd, tf); - } else { - ata_dev_warn(qc->dev, "sense data available but port frozen\n"); - } -diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c -index 641a61a..e1ecd2a 100644 ---- a/drivers/ata/libata-scsi.c -+++ b/drivers/ata/libata-scsi.c -@@ -280,18 +280,6 @@ void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq) - scsi_build_sense_buffer(0, cmd->sense_buffer, sk, asc, ascq); - } - --void ata_scsi_set_sense_information(struct scsi_cmnd *cmd, -- const struct ata_taskfile *tf) --{ -- u64 information; -- -- if (!cmd) -- return; -- -- information = ata_tf_read_block(tf, NULL); -- scsi_set_sense_information(cmd->sense_buffer, information); --} -- - static ssize_t - ata_scsi_em_message_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h -index a998a17..8cfdd96 100644 ---- a/drivers/ata/libata.h -+++ b/drivers/ata/libata.h -@@ -67,8 +67,7 @@ extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag); - extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev, - u64 block, u32 n_block, unsigned int tf_flags, - unsigned int tag); --extern u64 ata_tf_read_block(const struct ata_taskfile *tf, -- struct ata_device *dev); -+extern u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev); - extern unsigned ata_exec_internal(struct ata_device *dev, - struct ata_taskfile *tf, const u8 *cdb, - int dma_dir, void *buf, unsigned int buflen, -@@ -139,8 +138,6 @@ extern int ata_scsi_add_hosts(struct ata_host *host, - extern void ata_scsi_scan_host(struct ata_port *ap, int sync); - extern int ata_scsi_offline_dev(struct ata_device *dev); - extern void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq); --extern void ata_scsi_set_sense_information(struct scsi_cmnd *cmd, -- const struct ata_taskfile *tf); - extern void ata_scsi_media_change_notify(struct ata_device *dev); - extern void ata_scsi_hotplug(struct work_struct *work); - extern void ata_schedule_scsi_eh(struct Scsi_Host *shost); -diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c -index 106884a..b79bbea 100644 ---- a/drivers/scsi/scsi_error.c -+++ b/drivers/scsi/scsi_error.c -@@ -26,7 +26,6 @@ - #include - #include - #include --#include - - #include - #include -@@ -2523,33 +2522,3 @@ void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq) - } - } - EXPORT_SYMBOL(scsi_build_sense_buffer); -- --/** -- * scsi_set_sense_information - set the information field in a -- * formatted sense data buffer -- * @buf: Where to build sense data -- * @info: 64-bit information value to be set -- * -- **/ --void scsi_set_sense_information(u8 *buf, u64 info) --{ -- if ((buf[0] & 0x7f) == 0x72) { -- u8 *ucp, len; -- -- len = buf[7]; -- ucp = (char *)scsi_sense_desc_find(buf, len + 8, 0); -- if (!ucp) { -- buf[7] = len + 0xa; -- ucp = buf + 8 + len; -- } -- ucp[0] = 0; -- ucp[1] = 0xa; -- ucp[2] = 0x80; /* Valid bit */ -- ucp[3] = 0; -- put_unaligned_be64(info, &ucp[4]); -- } else if ((buf[0] & 0x7f) == 0x70) { -- buf[0] |= 0x80; -- put_unaligned_be64(info, &buf[3]); -- } --} --EXPORT_SYMBOL(scsi_set_sense_information); -diff --git a/include/scsi/scsi_eh.h b/include/scsi/scsi_eh.h -index 4942710..8d1d7fa 100644 ---- a/include/scsi/scsi_eh.h -+++ b/include/scsi/scsi_eh.h -@@ -28,7 +28,6 @@ extern int scsi_get_sense_info_fld(const u8 * sense_buffer, int sb_len, - u64 * info_out); - - extern void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq); --extern void scsi_set_sense_information(u8 *buf, u64 info); - - extern int scsi_ioctl_reset(struct scsi_device *, int __user *); - --- -2.4.5 - diff --git a/kernel/kernel/files/patches/mageia/ata-jmicron-disable-broken-async_suspend.patch b/kernel/kernel/files/patches/mageia/ata-jmicron-disable-broken-async_suspend.patch deleted file mode 100644 index f0787f4f..00000000 --- a/kernel/kernel/files/patches/mageia/ata-jmicron-disable-broken-async_suspend.patch +++ /dev/null @@ -1,29 +0,0 @@ - -Fix broken async_suspend - -https://bugzilla.kernel.org/show_bug.cgi?id=81551 - ---- a/drivers/pci/quirks.c -+++ a/drivers/pci/quirks.c -@@ -29,6 +29,21 @@ - #include "pci.h" - - /* -+ * For JMicron chips, we need to disable the async_suspend method, otherwise -+ * they will hit the power-on issue when doing device resume, add one quick -+ * solution to disable the async_suspend method. -+ */ -+static void pci_async_suspend_fixup(struct pci_dev *pdev) -+{ -+ /* -+ * disabling the async_suspend method for JMicron chips to -+ * avoid device resuming issue. -+ */ -+ device_disable_async_suspend(&pdev->dev); -+} -+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, pci_async_suspend_fixup); -+ -+/* - * Decoding should be disabled for a PCI device during BAR sizing to avoid - * conflict. But doing so may cause problems on host bridge and perhaps other - * key system devices. For devices that need to have mmio decoding always-on, diff --git a/kernel/kernel/files/patches/mageia/ata-revert-Disabling-the-async-PM-for-JMicron-chip-363-361.patch b/kernel/kernel/files/patches/mageia/ata-revert-Disabling-the-async-PM-for-JMicron-chip-363-361.patch deleted file mode 100644 index 687066be..00000000 --- a/kernel/kernel/files/patches/mageia/ata-revert-Disabling-the-async-PM-for-JMicron-chip-363-361.patch +++ /dev/null @@ -1,68 +0,0 @@ - -This patch reverts: - -From e6b7e41cdd8cae0591e04d9519b65470110e2d44 Mon Sep 17 00:00:00 2001 -From: Chuansheng Liu -Date: Mon, 1 Sep 2014 08:38:03 +0800 -Subject: [PATCH] ata: Disabling the async PM for JMicron chip 363/361 - - -in favour of the pci quirks based patch: -https://bugzilla.kernel.org/show_bug.cgi?id=81551 - -Signed-off-by: Thomas Backlund - ---- - drivers/ata/ahci.c | 12 ------------ - drivers/ata/pata_jmicron.c | 12 ------------ - 2 files changed, 24 deletions(-) - -diff --git b/drivers/ata/ahci.c a/drivers/ata/ahci.c -index f7da21b..bca3d64 100644 ---- b/drivers/ata/ahci.c -+++ a/drivers/ata/ahci.c -@@ -1337,18 +1337,6 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) - else if (pdev->vendor == 0x1c44 && pdev->device == 0x8000) - ahci_pci_bar = AHCI_PCI_BAR_ENMOTUS; - -- /* -- * The JMicron chip 361/363 contains one SATA controller and one -- * PATA controller,for powering on these both controllers, we must -- * follow the sequence one by one, otherwise one of them can not be -- * powered on successfully, so here we disable the async suspend -- * method for these chips. -- */ -- if (pdev->vendor == PCI_VENDOR_ID_JMICRON && -- (pdev->device == PCI_DEVICE_ID_JMICRON_JMB363 || -- pdev->device == PCI_DEVICE_ID_JMICRON_JMB361)) -- device_disable_async_suspend(&pdev->dev); -- - /* acquire resources */ - rc = pcim_enable_device(pdev); - if (rc) -diff --git b/drivers/ata/pata_jmicron.c a/drivers/ata/pata_jmicron.c -index 47e418b..4d1a5d2 100644 ---- b/drivers/ata/pata_jmicron.c -+++ a/drivers/ata/pata_jmicron.c -@@ -143,18 +143,6 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i - }; - const struct ata_port_info *ppi[] = { &info, NULL }; - -- /* -- * The JMicron chip 361/363 contains one SATA controller and one -- * PATA controller,for powering on these both controllers, we must -- * follow the sequence one by one, otherwise one of them can not be -- * powered on successfully, so here we disable the async suspend -- * method for these chips. -- */ -- if (pdev->vendor == PCI_VENDOR_ID_JMICRON && -- (pdev->device == PCI_DEVICE_ID_JMICRON_JMB363 || -- pdev->device == PCI_DEVICE_ID_JMICRON_JMB361)) -- device_disable_async_suspend(&pdev->dev); -- - return ata_pci_bmdma_init_one(pdev, ppi, &jmicron_sht, NULL, 0); - } - --- -1.8.5.6 - diff --git a/kernel/kernel/files/patches/mageia/gpu-drm-i915-Avoid-TP3-on-CHV.patch b/kernel/kernel/files/patches/mageia/gpu-drm-i915-Avoid-TP3-on-CHV.patch deleted file mode 100644 index 8fb32d99..00000000 --- a/kernel/kernel/files/patches/mageia/gpu-drm-i915-Avoid-TP3-on-CHV.patch +++ /dev/null @@ -1,81 +0,0 @@ -From ed63baaf849e91c84ac3e042b1fd6a0af07c16f3 Mon Sep 17 00:00:00 2001 -From: "Thulasimani,Sivakumar" -Date: Tue, 18 Aug 2015 15:30:37 +0530 -Subject: [PATCH] drm/i915: Avoid TP3 on CHV -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch removes TP3 support on CHV since there is no support -for HBR2 on this platform. - -v2: rename the function to indicate it checks source rates (Jani) -v3: update comment to indicate TP3 dependency on HBR2 supported - hardware (Jani) - -Cc: stable@vger.kernel.org # v4.1+ -Reviewed-by: Ville Syrjälä -Signed-off-by: Sivakumar Thulasimani -[Jani: fixed a couple of checkpatch warnings.] -Signed-off-by: Jani Nikula - -diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c -index 7ad0e0b..1df0e1f 100644 ---- a/drivers/gpu/drm/i915/intel_dp.c -+++ b/drivers/gpu/drm/i915/intel_dp.c -@@ -1166,6 +1166,19 @@ intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates) - return (intel_dp_max_link_bw(intel_dp) >> 3) + 1; - } - -+static bool intel_dp_source_supports_hbr2(struct drm_device *dev) -+{ -+ /* WaDisableHBR2:skl */ -+ if (IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) -+ return false; -+ -+ if ((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || IS_BROADWELL(dev) || -+ (INTEL_INFO(dev)->gen >= 9)) -+ return true; -+ else -+ return false; -+} -+ - static int - intel_dp_source_rates(struct drm_device *dev, const int **source_rates) - { -@@ -1176,12 +1189,8 @@ intel_dp_source_rates(struct drm_device *dev, const int **source_rates) - - *source_rates = default_rates; - -- /* WaDisableHBR2:skl */ -- if (IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) -- return (DP_LINK_BW_2_7 >> 3) + 1; -- -- if ((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || IS_BROADWELL(dev) || -- (INTEL_INFO(dev)->gen >= 9)) -+ /* This depends on the fact that 5.4 is last value in the array */ -+ if (intel_dp_source_supports_hbr2(dev)) - return (DP_LINK_BW_5_4 >> 3) + 1; - else - return (DP_LINK_BW_2_7 >> 3) + 1; -@@ -3936,10 +3945,15 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp) - } - } - -- /* Training Pattern 3 support, both source and sink */ -+ /* Training Pattern 3 support, Intel platforms that support HBR2 alone -+ * have support for TP3 hence that check is used along with dpcd check -+ * to ensure TP3 can be enabled. -+ * SKL < B0: due it's WaDisableHBR2 is the only exception where TP3 is -+ * supported but still not enabled. -+ */ - if (intel_dp->dpcd[DP_DPCD_REV] >= 0x12 && - intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED && -- (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)) { -+ intel_dp_source_supports_hbr2(dev)) { - intel_dp->use_tps3 = true; - DRM_DEBUG_KMS("Displayport TPS3 supported\n"); - } else --- -2.4.5 - diff --git a/kernel/kernel/files/patches/mageia/gpu-drm-i915-remove-HBR2-from-chv-supported-list.patch b/kernel/kernel/files/patches/mageia/gpu-drm-i915-remove-HBR2-from-chv-supported-list.patch deleted file mode 100644 index 892f4d25..00000000 --- a/kernel/kernel/files/patches/mageia/gpu-drm-i915-remove-HBR2-from-chv-supported-list.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 5e86dfe39f54ab13fd8079ac3d6cb100318909a3 Mon Sep 17 00:00:00 2001 -From: "Thulasimani,Sivakumar" -Date: Tue, 18 Aug 2015 11:07:57 +0530 -Subject: [PATCH] drm/i915: remove HBR2 from chv supported list -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch removes 5.4Gbps from supported link rate for CHV since -it is not supported in it. - -v2: change the ordering for better readability (Ville) - -Cc: stable@vger.kernel.org # v4.1+ -Reviewed-by: Ville Syrjälä -Signed-off-by: Sivakumar Thulasimani -Signed-off-by: Jani Nikula ---- - drivers/gpu/drm/i915/intel_dp.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c -index 6c8bf34..7ad0e0b 100644 ---- a/drivers/gpu/drm/i915/intel_dp.c -+++ b/drivers/gpu/drm/i915/intel_dp.c -@@ -1176,11 +1176,12 @@ intel_dp_source_rates(struct drm_device *dev, const int **source_rates) - - *source_rates = default_rates; - -+ /* WaDisableHBR2:skl */ - if (IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) -- /* WaDisableHBR2:skl */ - return (DP_LINK_BW_2_7 >> 3) + 1; -- else if (INTEL_INFO(dev)->gen >= 8 || -- (IS_HASWELL(dev) && !IS_HSW_ULX(dev))) -+ -+ if ((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || IS_BROADWELL(dev) || -+ (INTEL_INFO(dev)->gen >= 9)) - return (DP_LINK_BW_5_4 >> 3) + 1; - else - return (DP_LINK_BW_2_7 >> 3) + 1; --- -2.4.5 - diff --git a/kernel/kernel/files/patches/mageia/scsi-Fix-NULL-pointer-dereference-in-RTPM-of-block-layer.patch b/kernel/kernel/files/patches/mageia/scsi-Fix-NULL-pointer-dereference-in-RTPM-of-block-layer.patch new file mode 100644 index 00000000..49928d17 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/scsi-Fix-NULL-pointer-dereference-in-RTPM-of-block-layer.patch @@ -0,0 +1,74 @@ +SCSI: Fix NULL pointer dereference in RTPM of block layer + +The routines in scsi_pm.c assume that if a runtime-PM callback is +invoked for a SCSI device, it can only mean that the device's driver +has asked the block layer to handle the runtime power management (by +calling blk_pm_runtime_init(), which among other things sets q->dev). + +However, this assumption turns out to be wrong for things like the ses +driver. Normally ses devices are not allowed to do runtime PM, but +userspace can override this setting. If this happens, the kernel gets +a NULL pointer dereference when blk_post_runtime_resume() tries to use +the uninitialized q->dev pointer. + +This patch fixes the problem by checking q->dev in block layer before +handle runtime PM. Since ses doesn't define any PM callbacks and call +blk_pm_runtime_init(), the crash won't occur. + +This fixes Bugzilla #101371. +https://bugzilla.kernel.org/show_bug.cgi?id=101371 + +Signed-off-by: Ken Xue +Acked-by: Alan Stern +Cc: stable@vger.kernel.org + +--- + block/blk-core.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/block/blk-core.c b/block/blk-core.c +index 60912e9..a07ab18 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -3280,6 +3280,9 @@ int blk_pre_runtime_suspend(struct request_queue *q) + { + int ret = 0; + ++ if (!q->dev) ++ return ret; ++ + spin_lock_irq(q->queue_lock); + if (q->nr_pending) { + ret = -EBUSY; +@@ -3307,6 +3310,9 @@ EXPORT_SYMBOL(blk_pre_runtime_suspend); + */ + void blk_post_runtime_suspend(struct request_queue *q, int err) + { ++ if (!q->dev) ++ return; ++ + spin_lock_irq(q->queue_lock); + if (!err) { + q->rpm_status = RPM_SUSPENDED; +@@ -3331,6 +3337,9 @@ EXPORT_SYMBOL(blk_post_runtime_suspend); + */ + void blk_pre_runtime_resume(struct request_queue *q) + { ++ if (!q->dev) ++ return; ++ + spin_lock_irq(q->queue_lock); + q->rpm_status = RPM_RESUMING; + spin_unlock_irq(q->queue_lock); +@@ -3353,6 +3362,9 @@ EXPORT_SYMBOL(blk_pre_runtime_resume); + */ + void blk_post_runtime_resume(struct request_queue *q, int err) + { ++ if (!q->dev) ++ return; ++ + spin_lock_irq(q->queue_lock); + if (!err) { + q->rpm_status = RPM_ACTIVE; +-- +1.9.1 diff --git a/kernel/kernel/files/patches/mageia/scsi-Revert-SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch b/kernel/kernel/files/patches/mageia/scsi-Revert-SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch new file mode 100644 index 00000000..dc20be03 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/scsi-Revert-SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch @@ -0,0 +1,64 @@ +Revert "SCSI: Fix NULL pointer dereference in runtime PM" + +This reverts commit 49718f0fb8c9 ("SCSI: Fix NULL pointer dereference in +runtime PM") + +The old commit may lead to a issue that blk_{pre|post}_runtime_suspend and +blk_{pre|post}_runtime_resume can not be called in pairs. + +Take sr device as example, when sr device goes to runtime suspend, +blk_{pre|post}_runtime_suspend will be called since sr device defined +pm->runtime_suspend. But blk_{pre|post}_runtime_resume will not be called +since sr device doesn't have pm->runtime_resume. Then sr device can not +resume correctly anymore. + +Signed-off-by: Ken Xue +Acked-by: Alan Stern +Cc: stable@vger.kernel.org + +--- + drivers/scsi/scsi_pm.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c +index e4b7998..459abe1 100644 +--- a/drivers/scsi/scsi_pm.c ++++ b/drivers/scsi/scsi_pm.c +@@ -219,13 +219,13 @@ static int sdev_runtime_suspend(struct device *dev) + struct scsi_device *sdev = to_scsi_device(dev); + int err = 0; + +- if (pm && pm->runtime_suspend) { +- err = blk_pre_runtime_suspend(sdev->request_queue); +- if (err) +- return err; ++ err = blk_pre_runtime_suspend(sdev->request_queue); ++ if (err) ++ return err; ++ if (pm && pm->runtime_suspend) + err = pm->runtime_suspend(dev); +- blk_post_runtime_suspend(sdev->request_queue, err); +- } ++ blk_post_runtime_suspend(sdev->request_queue, err); ++ + return err; + } + +@@ -248,11 +248,11 @@ static int sdev_runtime_resume(struct device *dev) + const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; + int err = 0; + +- if (pm && pm->runtime_resume) { +- blk_pre_runtime_resume(sdev->request_queue); ++ blk_pre_runtime_resume(sdev->request_queue); ++ if (pm && pm->runtime_resume) + err = pm->runtime_resume(dev); +- blk_post_runtime_resume(sdev->request_queue, err); +- } ++ blk_post_runtime_resume(sdev->request_queue, err); ++ + return err; + } + +-- +1.9.1 diff --git a/kernel/kernel/files/patches/mageia/series b/kernel/kernel/files/patches/mageia/series index f1c2fe31..b96a67db 100644 --- a/kernel/kernel/files/patches/mageia/series +++ b/kernel/kernel/files/patches/mageia/series @@ -14,33 +14,72 @@ ### ### Stable Queue ### -stable-ipc-sem-fix-use-after-free-on-ipc_rmid-after-a-task-using-same-semaphore-set-exits.patch -stable-ipc-sem.c-update-correct-memory-barriers.patch -stable-mm-hwpoison-fix-page-refcount-of-unknown-non-lru-page.patch -stable-mm-hwpoison-fix-fail-isolate-hugetlbfs-page-w-refcount-held.patch -stable-clk-pxa-pxa3xx-fix-cken-register-access.patch -stable-xen-blkfront-don-t-add-indirect-pages-to-list-when.patch -stable-xen-blkback-replace-work_pending-with-work_busy-in-purge_persistent_gnt.patch -stable-rsi-fix-failure-to-load-firmware-after-memory-leak-fix-and-fix-the-leak.patch -stable-perf-fix-fasync-handling-on-inherited-events.patch -stable-perf-fix-running-time-accounting.patch -stable-perf-fix-double-free-of-the-aux-buffer.patch -stable-perf-fix-perf_event_ioc_period-migration-race.patch -stable-iwlwifi-pcie-fix-prepare-card-flow.patch -stable-rtlwifi-rtl8723be-add-module-parameter-for-msi-interrupts.patch -stable-rtlwifi-fix-null-dereference-when-pci-driver-used-as-an-ap.patch -stable-x86-xen-build-xen-pv-apic-driver-for-domu-as-well.patch -stable-xen-xenbus-don-t-leak-memory-when-unmapping-the-ring-on-hvm-backend.patch -stable-dm-thin-metadata-delete-btrees-when-releasing-metadata-snapshot.patch -stable-localmodconfig-use-kbuild-files-too.patch -stable-edac-ppc4xx-access-mci-csrows-array-elements-properly.patch -stable-hid-hid-input-fix-accessing-freed-memory-during-device-disconnect.patch -stable-hid-uclogic-fix-limit-in-uclogic_tablet_enable.patch -stable-drm-radeon-add-new-oland-pci-id.patch -stable-drm-vmwgfx-fix-execbuf-locking-issues.patch - -# DaveM -stable-net_41.mbox.patch +stable-x86-ldt-make-modify_ldt-synchronous.patch +stable-x86-ldt-correct-ldt-access-in-single-stepping-logic.patch +stable-x86-ldt-correct-fpu-emulation-access-to-ldt.patch +stable-x86-ldt-further-fix-fpu-emulation.patch +stable-drm-radeon-don-t-link-train-displayport-on-hpd-until-we-get-the-dpcd.patch +stable-drm-i915-apply-the-pci_d0-d3-hibernation-workaround-everywhere-on-pre-gen6.patch +stable-drm-i915-check-dp-link-status-on-long-hpd-too.patch +stable-drm-radeon-atom-send-out-the-full-aux-address.patch +stable-drm-radeon-native-send-out-the-full-aux-address.patch +stable-drm-radeon-fix-hdmi-quantization_range-for-pre-dce5-asics.patch +stable-drm-i915-preserve-ssc-earlier.patch +stable-drm-qxl-validate-monitors-config-modes.patch +stable-drm-i915-allow-dsi-dual-link-to-be-configured-on-any-pipe.patch +stable-drm-i915-always-mark-the-object-as-dirty-when-used-by-the-gpu.patch +stable-drm-i915-limit-the-number-of-loops-for-reading-a-split-64bit-register.patch +stable-s390-sclp-fix-compile-error.patch +stable-s390-setup-fix-novx-parameter.patch +stable-iio-bmg160-iio_buffer-and-iio_triggered_buffer-are-required.patch +stable-iio-event-remove-negative-error-code-from-iio_event_poll.patch +stable-iio-industrialio-buffer-fix-iio_buffer_poll-return-value.patch +stable-iio-adis16400-fix-adis16448-gyroscope-scale.patch +stable-iio-add-inverse-unit-conversion-macros.patch +stable-iio-adis16480-fix-scale-factors.patch +stable-sched-fix-cpu_active_mask-cpu_online_mask-race.patch +stable-staging-comedi-adl_pci7x3x-fix-digital-output-on-pci-7230.patch +stable-staging-comedi-usbduxsigma-don-t-clobber-ai_timer-in-command-test.patch +stable-staging-comedi-usbduxsigma-don-t-clobber-ao_timer-in-command-test.patch +stable-pm-clk-don-t-return-int-on-__pm_clk_enable.patch +stable-clk-rockchip-rk3288-add-clk_set_rate_parent-to-sclk_mac.patch +stable-clk-exynos4-fix-wrong-clock-for-exynos4x12-adc.patch +stable-clk-s5pv210-add-missing-call-to.patch +stable-clk-pistachio-fix-override-of-clk-pll-settings-from-boot-loader.patch +stable-clk-pistachio-correct-critical-clock-list.patch +stable-clk-versatile-off-by-one-in-clk_sp810_timerclken_of_get.patch +stable-clk-pxa-fix-core-frequency-reporting-unit.patch +stable-clk-qcom-set-clk_set_rate_parent-on-ce1-clocks.patch +stable-clk-qcom-fix-msm8916-prng-clock-enable-bit.patch +stable-pci-fix-ti816x-class-code-quirk.patch +stable-pci-add-dev_flags-bit-to-access-vpd-through-function-0.patch +stable-pci-add-vpd-function-0-quirk-for-intel-ethernet-devices.patch +stable-pci-disable-async-suspend-resume-for-jmicron-multi-function-sata-ahci.patch +stable-spi-bcm2835-set-up-spi-mode-before-asserting-cs-gpio.patch +stable-spi-fix-regression-in-spi-bitbang-txrx.h.patch +stable-spi-sh-msiof-fix-fifo-size-to-64-word-from-256-word.patch +stable-spi-img-spfi-check-for-timeout-error-before-proceeding.patch +stable-spi-img-spfi-fix-multiple-calls-to-request-gpio.patch +stable-spi-img-spfi-fix-kbuild-test-robot-warning.patch +stable-spi-dw-allow-interface-drivers-to-limit-data-i-o-to-word-sizes.patch +stable-usb-symbolserial-use-usb_get_serial_port_data.patch +stable-usb-qcserial-add-hp-lt4111-lte-ev-do-hspa-gobi-4g-module.patch +stable-usb-ftdi_sio-added-custom-pid-for-customware-products.patch +stable-usb-pl2303-fix-baud-rate-divisor-calculations.patch +stable-libxfs-readahead-of-dir3-data-blocks-should-use-the-read-verifier.patch +stable-xfs-fix-xfs_attr_leafblock-definition.patch +stable-xfs-fix-file-type-directory-corruption-for-btree-directories.patch +stable-usb-gadget-m66592-udc-forever-loop-in-set_feature.patch +stable-doc-usb-gadget-testing-using-the-updated-testusb.c.patch +stable-usb-dwc3-ep0-fix-mem-corruption-on-out-transfers-of-more-than-512-bytes.patch +stable-usb-gadget-f_uac2-finalize-wmaxpacketsize-according-to-bandwidth.patch +stable-usb-host-ehci-sys-delete-useless-bus_to_hcd-conversion.patch +stable-tty-serial-men_z135_uart.c-fix-race-between-irq-and-set_termios.patch +stable-asoc-rt5640-fix-line-out-no-sound-issue.patch +stable-asoc-samsung-remove-redundant-arndale_audio_remove.patch +stable-asoc-adav80x-remove-.read_flag_mask-setting-from-adav80x_regmap_config.patch +stable-asoc-arizona-fix-gain-settings-of-fll-in-free-run-mode.patch +stable-asoc-arizona-poll-for-fll-clock-ok-rather-than-use-interrupts.patch ### ### Arch x86 @@ -65,15 +104,6 @@ x86-increase-default-minimum-vmalloc-area-by-64MB-to-192MB.patch # slows down boot Revert-cpufreq-pcc-Enable-autoload-of-pcc-cpufreq-fo.patch -# wrong optimization -Revert-sched-x86_64-Don-t-save-flags-on-context-swit.patch - -# fix unbootable systems -x86-apic-Fix-fallout-from-x2apic-cleanup.patch - -# fixes powertop -x86-idle-Restore-trace_cpu_idle-to-mwait_idle-calls.patch - ### ### Core ### @@ -148,21 +178,13 @@ block-floppy-disable-pnp-modalias.patch # prefer ata over ide drivers ata-prefer-ata-drivers-over-ide-drivers-when-both-are-built.patch -# korg #81551 -ata-revert-Disabling-the-async-PM-for-JMicron-chip-363-361.patch -ata-jmicron-disable-broken-async_suspend.patch - # Nice SSD speedup block-Make-CFQ-default-to-IOPS-mode-on-SSDs.patch block-cfq-iosched-fix-the-setting-of-IOPS-mode-on-SSDs.patch -# libata eh breakage -ata-Revert-libata-eh-Set-information-field-for-autosense.patch -ata-Revert-libata-Implement-support-for-sense-data-repor.patch -ata-Revert-libata-Implement-NCQ-autosense.patch - -# ses driver crash -SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch +# properly fix null pointer deref introduced in 4.1.7 +scsi-Revert-SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch +scsi-Fix-NULL-pointer-dereference-in-RTPM-of-block-layer.patch ### ### File-system @@ -208,10 +230,6 @@ gpu-drm-mach64-linux-3.14-buildfix.patch gpu-drm-mach64-3.17-buildfix.patch gpu-drm-mach64-3.18-buildfix.patch -# i915 -gpu-drm-i915-remove-HBR2-from-chv-supported-list.patch -gpu-drm-i915-Avoid-TP3-on-CHV.patch - ### ### Hardware Monitoring ### @@ -222,6 +240,9 @@ gpu-drm-i915-Avoid-TP3-on-CHV.patch input-i8042-quirks-for-Fujitsu-Lifebook-A544-and-Lif.patch +# fixes systemd-logind killing itself +Input-evdev-do-not-report-errors-form-flush.patch + ### ### idle ### diff --git a/kernel/kernel/files/patches/mageia/stable-asoc-adav80x-remove-.read_flag_mask-setting-from-adav80x_regmap_config.patch b/kernel/kernel/files/patches/mageia/stable-asoc-adav80x-remove-.read_flag_mask-setting-from-adav80x_regmap_config.patch new file mode 100644 index 00000000..9fdd46c7 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-asoc-adav80x-remove-.read_flag_mask-setting-from-adav80x_regmap_config.patch @@ -0,0 +1,31 @@ +From 9d8352864907f0ad76124c5b28f65b5a382d7d7c Mon Sep 17 00:00:00 2001 +From: Axel Lin +Date: Fri, 14 Aug 2015 17:54:07 +0800 +Subject: ASoC: adav80x: Remove .read_flag_mask setting from adav80x_regmap_config + +From: Axel Lin + +commit 9d8352864907f0ad76124c5b28f65b5a382d7d7c upstream. + +Don't set .read_flag_mask for adav803, it's for adav801 only. + +Fixes: 0c2d69645628 ("ASoC: adav80x: Split SPI and I2C code into different modules") +Signed-off-by: Axel Lin +Acked-by: Lars-Peter Clausen +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + sound/soc/codecs/adav80x.c | 1 - + 1 file changed, 1 deletion(-) + +--- a/sound/soc/codecs/adav80x.c ++++ b/sound/soc/codecs/adav80x.c +@@ -864,7 +864,6 @@ const struct regmap_config adav80x_regma + .val_bits = 8, + .pad_bits = 1, + .reg_bits = 7, +- .read_flag_mask = 0x01, + + .max_register = ADAV80X_PLL_OUTE, + diff --git a/kernel/kernel/files/patches/mageia/stable-asoc-arizona-fix-gain-settings-of-fll-in-free-run-mode.patch b/kernel/kernel/files/patches/mageia/stable-asoc-arizona-fix-gain-settings-of-fll-in-free-run-mode.patch new file mode 100644 index 00000000..49961f20 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-asoc-arizona-fix-gain-settings-of-fll-in-free-run-mode.patch @@ -0,0 +1,33 @@ +From 1cf5a330c05ae37a0a98ac7c9800a6f50d5579ec Mon Sep 17 00:00:00 2001 +From: Nikesh Oswal +Date: Wed, 19 Aug 2015 16:02:24 +0100 +Subject: ASoC: arizona: Fix gain settings of FLL in free-run mode + +From: Nikesh Oswal + +commit 1cf5a330c05ae37a0a98ac7c9800a6f50d5579ec upstream. + +The wrong register was used to set the gain of ref loop, when changing +the FLL output on an active FLL. This patch corrects the offset of the +gain register. + +Signed-off-by: Nikesh Oswal +Signed-off-by: Charles Keepax +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + sound/soc/codecs/arizona.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/sound/soc/codecs/arizona.c ++++ b/sound/soc/codecs/arizona.c +@@ -1912,7 +1912,7 @@ static int arizona_enable_fll(struct ari + + if (already_enabled) { + /* Facilitate smooth refclk across the transition */ +- regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x7, ++ regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9, + ARIZONA_FLL1_GAIN_MASK, 0); + regmap_update_bits_async(fll->arizona->regmap, fll->base + 1, + ARIZONA_FLL1_FREERUN, diff --git a/kernel/kernel/files/patches/mageia/stable-asoc-arizona-poll-for-fll-clock-ok-rather-than-use-interrupts.patch b/kernel/kernel/files/patches/mageia/stable-asoc-arizona-poll-for-fll-clock-ok-rather-than-use-interrupts.patch new file mode 100644 index 00000000..1ae728a8 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-asoc-arizona-poll-for-fll-clock-ok-rather-than-use-interrupts.patch @@ -0,0 +1,141 @@ +From 0e7659712836ca59b4735bc5cc94de38698a5e01 Mon Sep 17 00:00:00 2001 +From: Charles Keepax +Date: Tue, 25 Aug 2015 12:43:48 +0100 +Subject: ASoC: arizona: Poll for FLL clock OK rather than use interrupts + +From: Charles Keepax + +commit 0e7659712836ca59b4735bc5cc94de38698a5e01 upstream. + +The extcon driver takes the DAPM mutex from within the interrupt thread +in several places, which makes it possible to get into a situation where +the interrupt thread is blocked waiting on the DAPM mutex whilst a DAPM +sequence is running which is attempting to configure the FLL. In this +case the FLL completion can't be completed as as the IRQ handler is +ONE_SHOT, which cause the FLL lock to use the full time out (250mS) and +report that the process timed out. + +It is not really practical to make the extcon driver not take the DAPM +mutex from within the interrupt thread, at least not without extensive +modification. So this patch fixes the issue by switching the wait for +the FLL lock to polling. A few fast polls are done first as the FLL +should lock quickly for a good quality reference clock, (indeed it hits +on the first poll on my system) and it will poll every 20mS after that +until it times out. + +Signed-off-by: Charles Keepax +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + sound/soc/codecs/arizona.c | 47 ++++++++++++++++++--------------------------- + sound/soc/codecs/arizona.h | 1 + 2 files changed, 19 insertions(+), 29 deletions(-) + +--- a/sound/soc/codecs/arizona.c ++++ b/sound/soc/codecs/arizona.c +@@ -1610,17 +1610,6 @@ int arizona_init_dai(struct arizona_priv + } + EXPORT_SYMBOL_GPL(arizona_init_dai); + +-static irqreturn_t arizona_fll_clock_ok(int irq, void *data) +-{ +- struct arizona_fll *fll = data; +- +- arizona_fll_dbg(fll, "clock OK\n"); +- +- complete(&fll->ok); +- +- return IRQ_HANDLED; +-} +- + static struct { + unsigned int min; + unsigned int max; +@@ -1902,10 +1891,11 @@ static int arizona_is_enabled_fll(struct + static int arizona_enable_fll(struct arizona_fll *fll) + { + struct arizona *arizona = fll->arizona; +- unsigned long time_left; + bool use_sync = false; + int already_enabled = arizona_is_enabled_fll(fll); + struct arizona_fll_cfg cfg; ++ int i; ++ unsigned int val; + + if (already_enabled < 0) + return already_enabled; +@@ -1964,9 +1954,6 @@ static int arizona_enable_fll(struct ari + if (!already_enabled) + pm_runtime_get(arizona->dev); + +- /* Clear any pending completions */ +- try_wait_for_completion(&fll->ok); +- + regmap_update_bits_async(arizona->regmap, fll->base + 1, + ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA); + if (use_sync) +@@ -1978,10 +1965,24 @@ static int arizona_enable_fll(struct ari + regmap_update_bits_async(arizona->regmap, fll->base + 1, + ARIZONA_FLL1_FREERUN, 0); + +- time_left = wait_for_completion_timeout(&fll->ok, +- msecs_to_jiffies(250)); +- if (time_left == 0) ++ arizona_fll_dbg(fll, "Waiting for FLL lock...\n"); ++ val = 0; ++ for (i = 0; i < 15; i++) { ++ if (i < 5) ++ usleep_range(200, 400); ++ else ++ msleep(20); ++ ++ regmap_read(arizona->regmap, ++ ARIZONA_INTERRUPT_RAW_STATUS_5, ++ &val); ++ if (val & (ARIZONA_FLL1_CLOCK_OK_STS << (fll->id - 1))) ++ break; ++ } ++ if (i == 15) + arizona_fll_warn(fll, "Timed out waiting for lock\n"); ++ else ++ arizona_fll_dbg(fll, "FLL locked (%d polls)\n", i); + + return 0; + } +@@ -2066,11 +2067,8 @@ EXPORT_SYMBOL_GPL(arizona_set_fll); + int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq, + int ok_irq, struct arizona_fll *fll) + { +- int ret; + unsigned int val; + +- init_completion(&fll->ok); +- + fll->id = id; + fll->base = base; + fll->arizona = arizona; +@@ -2092,13 +2090,6 @@ int arizona_init_fll(struct arizona *ari + snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name), + "FLL%d clock OK", id); + +- ret = arizona_request_irq(arizona, ok_irq, fll->clock_ok_name, +- arizona_fll_clock_ok, fll); +- if (ret != 0) { +- dev_err(arizona->dev, "Failed to get FLL%d clock OK IRQ: %d\n", +- id, ret); +- } +- + regmap_update_bits(arizona->regmap, fll->base + 1, + ARIZONA_FLL1_FREERUN, 0); + +--- a/sound/soc/codecs/arizona.h ++++ b/sound/soc/codecs/arizona.h +@@ -233,7 +233,6 @@ struct arizona_fll { + int id; + unsigned int base; + unsigned int vco_mult; +- struct completion ok; + + unsigned int fout; + int sync_src; diff --git a/kernel/kernel/files/patches/mageia/stable-asoc-rt5640-fix-line-out-no-sound-issue.patch b/kernel/kernel/files/patches/mageia/stable-asoc-rt5640-fix-line-out-no-sound-issue.patch new file mode 100644 index 00000000..c26be5c7 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-asoc-rt5640-fix-line-out-no-sound-issue.patch @@ -0,0 +1,89 @@ +From 9b850ca4f1c5acd7fcbbd4b38a2d27132801a8d5 Mon Sep 17 00:00:00 2001 +From: John Lin +Date: Tue, 11 Aug 2015 14:27:25 +0800 +Subject: ASoC: rt5640: fix line out no sound issue + +From: John Lin + +commit 9b850ca4f1c5acd7fcbbd4b38a2d27132801a8d5 upstream. + +The power for line out was not turned on when line out is enabled. +So we add "LOUT amp" widget to turn on the power for line out. + +Signed-off-by: John Lin +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + sound/soc/codecs/rt5640.c | 40 +++++++++++++++++++++++++++++++++++++--- + 1 file changed, 37 insertions(+), 3 deletions(-) + +--- a/sound/soc/codecs/rt5640.c ++++ b/sound/soc/codecs/rt5640.c +@@ -985,6 +985,35 @@ static int rt5640_hp_event(struct snd_so + return 0; + } + ++static int rt5640_lout_event(struct snd_soc_dapm_widget *w, ++ struct snd_kcontrol *kcontrol, int event) ++{ ++ struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); ++ ++ switch (event) { ++ case SND_SOC_DAPM_POST_PMU: ++ hp_amp_power_on(codec); ++ snd_soc_update_bits(codec, RT5640_PWR_ANLG1, ++ RT5640_PWR_LM, RT5640_PWR_LM); ++ snd_soc_update_bits(codec, RT5640_OUTPUT, ++ RT5640_L_MUTE | RT5640_R_MUTE, 0); ++ break; ++ ++ case SND_SOC_DAPM_PRE_PMD: ++ snd_soc_update_bits(codec, RT5640_OUTPUT, ++ RT5640_L_MUTE | RT5640_R_MUTE, ++ RT5640_L_MUTE | RT5640_R_MUTE); ++ snd_soc_update_bits(codec, RT5640_PWR_ANLG1, ++ RT5640_PWR_LM, 0); ++ break; ++ ++ default: ++ return 0; ++ } ++ ++ return 0; ++} ++ + static int rt5640_hp_power_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) + { +@@ -1180,13 +1209,16 @@ static const struct snd_soc_dapm_widget + 0, rt5640_spo_l_mix, ARRAY_SIZE(rt5640_spo_l_mix)), + SND_SOC_DAPM_MIXER("SPOR MIX", SND_SOC_NOPM, 0, + 0, rt5640_spo_r_mix, ARRAY_SIZE(rt5640_spo_r_mix)), +- SND_SOC_DAPM_MIXER("LOUT MIX", RT5640_PWR_ANLG1, RT5640_PWR_LM_BIT, 0, ++ SND_SOC_DAPM_MIXER("LOUT MIX", SND_SOC_NOPM, 0, 0, + rt5640_lout_mix, ARRAY_SIZE(rt5640_lout_mix)), + SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM, + 0, 0, rt5640_hp_power_event, SND_SOC_DAPM_POST_PMU), + SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, + rt5640_hp_event, + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), ++ SND_SOC_DAPM_PGA_S("LOUT amp", 1, SND_SOC_NOPM, 0, 0, ++ rt5640_lout_event, ++ SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), + SND_SOC_DAPM_SUPPLY("HP L Amp", RT5640_PWR_ANLG1, + RT5640_PWR_HP_L_BIT, 0, NULL, 0), + SND_SOC_DAPM_SUPPLY("HP R Amp", RT5640_PWR_ANLG1, +@@ -1501,8 +1533,10 @@ static const struct snd_soc_dapm_route r + {"HP R Playback", "Switch", "HP Amp"}, + {"HPOL", NULL, "HP L Playback"}, + {"HPOR", NULL, "HP R Playback"}, +- {"LOUTL", NULL, "LOUT MIX"}, +- {"LOUTR", NULL, "LOUT MIX"}, ++ ++ {"LOUT amp", NULL, "LOUT MIX"}, ++ {"LOUTL", NULL, "LOUT amp"}, ++ {"LOUTR", NULL, "LOUT amp"}, + }; + + static const struct snd_soc_dapm_route rt5640_specific_dapm_routes[] = { diff --git a/kernel/kernel/files/patches/mageia/stable-asoc-samsung-remove-redundant-arndale_audio_remove.patch b/kernel/kernel/files/patches/mageia/stable-asoc-samsung-remove-redundant-arndale_audio_remove.patch new file mode 100644 index 00000000..ea815142 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-asoc-samsung-remove-redundant-arndale_audio_remove.patch @@ -0,0 +1,48 @@ +From 14a500fe1396934c6b3ed8f009459a4723da7862 Mon Sep 17 00:00:00 2001 +From: Vaishali Thakkar +Date: Thu, 20 Aug 2015 22:11:15 +0530 +Subject: ASoC: samsung: Remove redundant arndale_audio_remove + +From: Vaishali Thakkar + +commit 14a500fe1396934c6b3ed8f009459a4723da7862 upstream. + +There is no use of snd_soc_unregister_card in remove function +as devm_snd_soc_register_card in probe function automatically +handles it. So, remove use of snd_soc_unregister_card and with +this change remove arndale_audio_remove as it is now redundant. + +Signed-off-by: Vaishali Thakkar +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + sound/soc/samsung/arndale_rt5631.c | 10 ---------- + 1 file changed, 10 deletions(-) + +--- a/sound/soc/samsung/arndale_rt5631.c ++++ b/sound/soc/samsung/arndale_rt5631.c +@@ -116,15 +116,6 @@ static int arndale_audio_probe(struct pl + return ret; + } + +-static int arndale_audio_remove(struct platform_device *pdev) +-{ +- struct snd_soc_card *card = platform_get_drvdata(pdev); +- +- snd_soc_unregister_card(card); +- +- return 0; +-} +- + static const struct of_device_id samsung_arndale_rt5631_of_match[] __maybe_unused = { + { .compatible = "samsung,arndale-rt5631", }, + { .compatible = "samsung,arndale-alc5631", }, +@@ -139,7 +130,6 @@ static struct platform_driver arndale_au + .of_match_table = of_match_ptr(samsung_arndale_rt5631_of_match), + }, + .probe = arndale_audio_probe, +- .remove = arndale_audio_remove, + }; + + module_platform_driver(arndale_audio_driver); diff --git a/kernel/kernel/files/patches/mageia/stable-clk-exynos4-fix-wrong-clock-for-exynos4x12-adc.patch b/kernel/kernel/files/patches/mageia/stable-clk-exynos4-fix-wrong-clock-for-exynos4x12-adc.patch new file mode 100644 index 00000000..60bdcac4 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-clk-exynos4-fix-wrong-clock-for-exynos4x12-adc.patch @@ -0,0 +1,55 @@ +From e323d56eb06b266b77c2b430cb5f1977ba549e03 Mon Sep 17 00:00:00 2001 +From: Krzysztof Kozlowski +Date: Fri, 12 Jun 2015 10:53:25 +0900 +Subject: clk: exynos4: Fix wrong clock for Exynos4x12 ADC + +From: Krzysztof Kozlowski + +commit e323d56eb06b266b77c2b430cb5f1977ba549e03 upstream. + +The TSADC gate clock was used in Exynos4x12 DTSI for exynos-adc driver. +However TSADC is present only on Exynos4210 so on Trats2 board (with +Exynos4412 SoC) the exynos-adc driver could not be probed: + ERROR: could not get clock /adc@126C0000:adc(0) + exynos-adc 126c0000.adc: failed getting clock, err = -2 + exynos-adc: probe of 126c0000.adc failed with error -2 + +Instead on Exynos4x12 SoCs the main clock used by Analog to Digital +Converter is located in different register and it is named in datasheet +as PCLK_ADC. Regardless of the name the purpose of this PCLK_ADC clock +is the same as purpose of TSADC from Exynos4210. + +The patch adds gate clock for Exynos4x12 using the proper register so +backward compatibility is preserved. This fixes the probe of exynos-adc +driver on Exynos4x12 boards and allows accessing sensors connected to it +on Trats2 board (ntc,ncp15wb473 AP and battery thermistors). + +Signed-off-by: Krzysztof Kozlowski +Fixes: c63c57433003 ("ARM: dts: Add ADC's dt data to read raw data for exynos4x12") +Reviewed-by: Javier Martinez Canillas +Acked-by: Tomasz Figa +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/samsung/clk-exynos4.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/clk/samsung/clk-exynos4.c ++++ b/drivers/clk/samsung/clk-exynos4.c +@@ -85,6 +85,7 @@ + #define DIV_PERIL4 0xc560 + #define DIV_PERIL5 0xc564 + #define E4X12_DIV_CAM1 0xc568 ++#define E4X12_GATE_BUS_FSYS1 0xc744 + #define GATE_SCLK_CAM 0xc820 + #define GATE_IP_CAM 0xc920 + #define GATE_IP_TV 0xc924 +@@ -1095,6 +1096,7 @@ static struct samsung_gate_clock exynos4 + 0), + GATE(CLK_PPMUIMAGE, "ppmuimage", "aclk200", E4X12_GATE_IP_IMAGE, 9, 0, + 0), ++ GATE(CLK_TSADC, "tsadc", "aclk133", E4X12_GATE_BUS_FSYS1, 16, 0, 0), + GATE(CLK_MIPI_HSI, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0), + GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, 0, 0), + GATE(CLK_SYSREG, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1, diff --git a/kernel/kernel/files/patches/mageia/stable-clk-pistachio-correct-critical-clock-list.patch b/kernel/kernel/files/patches/mageia/stable-clk-pistachio-correct-critical-clock-list.patch new file mode 100644 index 00000000..b711f795 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-clk-pistachio-correct-critical-clock-list.patch @@ -0,0 +1,81 @@ +From d31ff5f7f3b142b8d1ebb3da89187c54cdf2bc71 Mon Sep 17 00:00:00 2001 +From: "Damien.Horsley" +Date: Wed, 26 Aug 2015 17:11:40 +0100 +Subject: clk: pistachio: correct critical clock list + +From: "Damien.Horsley" + +commit d31ff5f7f3b142b8d1ebb3da89187c54cdf2bc71 upstream. + +Current critical clock list for pistachio enables +only mips and sys clocks by default but there are +also other clocks that are not claimed by anyone and +needs to be enabled by default. + +This patch updates the critical clocks that need +to be enabled by default. + +Add a separate struct to distinguish the critical clocks +as listed: +1.) core clocks: + a.) mips clock +2.) peripheral system clocks: + a.) sys clock + b.) sys_bus clock + c.) DDR clock + d.) ROM clock + +Fixes: b35d7c33419c("CLK: Pistachio: Register core clocks") +Reviewed-by: Andrew Bresticker +Signed-off-by: Ezequiel Garcia +Signed-off-by: Damien.Horsley +Signed-off-by: Govindraj Raja +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/pistachio/clk-pistachio.c | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +--- a/drivers/clk/pistachio/clk-pistachio.c ++++ b/drivers/clk/pistachio/clk-pistachio.c +@@ -159,9 +159,15 @@ PNAME(mux_debug) = { "mips_pll_mux", "rp + "wifi_pll_mux", "bt_pll_mux" }; + static u32 mux_debug_idx[] = { 0x0, 0x1, 0x2, 0x4, 0x8, 0x10 }; + +-static unsigned int pistachio_critical_clks[] __initdata = { +- CLK_MIPS, +- CLK_PERIPH_SYS, ++static unsigned int pistachio_critical_clks_core[] __initdata = { ++ CLK_MIPS ++}; ++ ++static unsigned int pistachio_critical_clks_sys[] __initdata = { ++ PERIPH_CLK_SYS, ++ PERIPH_CLK_SYS_BUS, ++ PERIPH_CLK_DDR, ++ PERIPH_CLK_ROM, + }; + + static void __init pistachio_clk_init(struct device_node *np) +@@ -193,8 +199,8 @@ static void __init pistachio_clk_init(st + + pistachio_clk_register_provider(p); + +- pistachio_clk_force_enable(p, pistachio_critical_clks, +- ARRAY_SIZE(pistachio_critical_clks)); ++ pistachio_clk_force_enable(p, pistachio_critical_clks_core, ++ ARRAY_SIZE(pistachio_critical_clks_core)); + } + CLK_OF_DECLARE(pistachio_clk, "img,pistachio-clk", pistachio_clk_init); + +@@ -261,6 +267,9 @@ static void __init pistachio_clk_periph_ + ARRAY_SIZE(pistachio_periph_gates)); + + pistachio_clk_register_provider(p); ++ ++ pistachio_clk_force_enable(p, pistachio_critical_clks_sys, ++ ARRAY_SIZE(pistachio_critical_clks_sys)); + } + CLK_OF_DECLARE(pistachio_clk_periph, "img,pistachio-clk-periph", + pistachio_clk_periph_init); diff --git a/kernel/kernel/files/patches/mageia/stable-clk-pistachio-fix-override-of-clk-pll-settings-from-boot-loader.patch b/kernel/kernel/files/patches/mageia/stable-clk-pistachio-fix-override-of-clk-pll-settings-from-boot-loader.patch new file mode 100644 index 00000000..2264f79c --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-clk-pistachio-fix-override-of-clk-pll-settings-from-boot-loader.patch @@ -0,0 +1,54 @@ +From e53f21c761d141bbcbce06e9ddab3b4e0a828f2c Mon Sep 17 00:00:00 2001 +From: Zdenko Pulitika +Date: Wed, 26 Aug 2015 17:11:38 +0100 +Subject: clk: pistachio: Fix override of clk-pll settings from boot loader + +From: Zdenko Pulitika + +commit e53f21c761d141bbcbce06e9ddab3b4e0a828f2c upstream. + +PLL enable callbacks are overriding PLL mode (int/frac) and +Noise reduction (on/off) settings set by the boot loader which +results in the incorrect clock rate. + +PLL mode and noise reduction are defined by the DSMPD and DACPD bits +of the PLL control register. PLL .enable() callbacks enable PLL +by deasserting all power-down bits of the PLL control register, +including DSMPD and DACPD bits, which is not necessary since +these bits don't actually enable/disable PLL. + +This commit fixes the problem by removing DSMPD and DACPD bits +from the "PLL enable" mask. + +Fixes: 43049b0c83f17("CLK: Pistachio: Add PLL driver") +Reviewed-by: Andrew Bresitcker +Signed-off-by: Zdenko Pulitika +Signed-off-by: Govindraj Raja +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/pistachio/clk-pll.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +--- a/drivers/clk/pistachio/clk-pll.c ++++ b/drivers/clk/pistachio/clk-pll.c +@@ -115,8 +115,7 @@ static int pll_gf40lp_frac_enable(struct + u32 val; + + val = pll_readl(pll, PLL_CTRL3); +- val &= ~(PLL_FRAC_CTRL3_PD | PLL_FRAC_CTRL3_DACPD | +- PLL_FRAC_CTRL3_DSMPD | PLL_FRAC_CTRL3_FOUTPOSTDIVPD | ++ val &= ~(PLL_FRAC_CTRL3_PD | PLL_FRAC_CTRL3_FOUTPOSTDIVPD | + PLL_FRAC_CTRL3_FOUT4PHASEPD | PLL_FRAC_CTRL3_FOUTVCOPD); + pll_writel(pll, val, PLL_CTRL3); + +@@ -233,7 +232,7 @@ static int pll_gf40lp_laint_enable(struc + u32 val; + + val = pll_readl(pll, PLL_CTRL1); +- val &= ~(PLL_INT_CTRL1_PD | PLL_INT_CTRL1_DSMPD | ++ val &= ~(PLL_INT_CTRL1_PD | + PLL_INT_CTRL1_FOUTPOSTDIVPD | PLL_INT_CTRL1_FOUTVCOPD); + pll_writel(pll, val, PLL_CTRL1); + diff --git a/kernel/kernel/files/patches/mageia/stable-clk-pxa-fix-core-frequency-reporting-unit.patch b/kernel/kernel/files/patches/mageia/stable-clk-pxa-fix-core-frequency-reporting-unit.patch new file mode 100644 index 00000000..6e08e1fe --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-clk-pxa-fix-core-frequency-reporting-unit.patch @@ -0,0 +1,61 @@ +From 4b5fb7dc9096d949a22651370bb6bf11f21edb30 Mon Sep 17 00:00:00 2001 +From: Robert Jarzmik +Date: Sun, 12 Jul 2015 22:49:53 +0200 +Subject: clk: pxa: fix core frequency reporting unit + +From: Robert Jarzmik + +commit 4b5fb7dc9096d949a22651370bb6bf11f21edb30 upstream. + +Legacy drivers which are not yet ported, such as cpufreq-pxa[23]xx, rely +on pxaXXx_get_clk_frequency_khz() to find the CPU core frequency. + +This reporting was broken because the expected unit is kHz and not +Hz. Fix the reporting for pxa25x, pxa27x and pxa3xx. + +Fixes: fe7710fae477 ("clk: add pxa25x clock drivers") +Fixes: d40670dc6169 ("clk: add pxa27x clock drivers") +Fixes: 9bbb8a338fb2 ("clk: pxa: add pxa3xx clock driver") +Signed-off-by: Robert Jarzmik +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/pxa/clk-pxa25x.c | 2 +- + drivers/clk/pxa/clk-pxa27x.c | 2 +- + drivers/clk/pxa/clk-pxa3xx.c | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/clk/pxa/clk-pxa25x.c ++++ b/drivers/clk/pxa/clk-pxa25x.c +@@ -79,7 +79,7 @@ unsigned int pxa25x_get_clk_frequency_kh + clks[3] / 1000000, (clks[3] % 1000000) / 10000); + } + +- return (unsigned int)clks[0]; ++ return (unsigned int)clks[0] / KHz; + } + + static unsigned long clk_pxa25x_memory_get_rate(struct clk_hw *hw, +--- a/drivers/clk/pxa/clk-pxa27x.c ++++ b/drivers/clk/pxa/clk-pxa27x.c +@@ -80,7 +80,7 @@ unsigned int pxa27x_get_clk_frequency_kh + pr_info("System bus clock: %ld.%02ldMHz\n", + clks[4] / 1000000, (clks[4] % 1000000) / 10000); + } +- return (unsigned int)clks[0]; ++ return (unsigned int)clks[0] / KHz; + } + + bool pxa27x_is_ppll_disabled(void) +--- a/drivers/clk/pxa/clk-pxa3xx.c ++++ b/drivers/clk/pxa/clk-pxa3xx.c +@@ -78,7 +78,7 @@ unsigned int pxa3xx_get_clk_frequency_kh + pr_info("System bus clock: %ld.%02ldMHz\n", + clks[4] / 1000000, (clks[4] % 1000000) / 10000); + } +- return (unsigned int)clks[0]; ++ return (unsigned int)clks[0] / KHz; + } + + static unsigned long clk_pxa3xx_ac97_get_rate(struct clk_hw *hw, diff --git a/kernel/kernel/files/patches/mageia/stable-clk-pxa-pxa3xx-fix-cken-register-access.patch b/kernel/kernel/files/patches/mageia/stable-clk-pxa-pxa3xx-fix-cken-register-access.patch deleted file mode 100644 index 203cd5f0..00000000 --- a/kernel/kernel/files/patches/mageia/stable-clk-pxa-pxa3xx-fix-cken-register-access.patch +++ /dev/null @@ -1,38 +0,0 @@ -From b93028c9af807b9474789e6aba34a6135b6cb708 Mon Sep 17 00:00:00 2001 -From: Robert Jarzmik -Date: Tue, 4 Aug 2015 08:21:33 +0200 -Subject: clk: pxa: pxa3xx: fix CKEN register access - -From: Robert Jarzmik - -commit b93028c9af807b9474789e6aba34a6135b6cb708 upstream. - -Clocks 0 to 31 are on CKENA, and not CKENB. The clock register names -were inadequately inverted. As a consequence, all clock operations were -happening on CKENB, because almost all but 2 clocks are on CKENA. - -As the clocks were activated by the bootloader in the former tests, it -escaped the testing that the wrong clock gate was manipulated. The error -was revealed by changing the pxa3xx-nand driver to a module, where upon -unloading, the wrong clock was disabled in CKENB. - -Fixes: 9bbb8a338fb2 ("clk: pxa: add pxa3xx clock driver") -Signed-off-by: Robert Jarzmik -Signed-off-by: Stephen Boyd -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/clk/pxa/clk-pxa3xx.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/clk/pxa/clk-pxa3xx.c -+++ b/drivers/clk/pxa/clk-pxa3xx.c -@@ -126,7 +126,7 @@ PARENTS(pxa3xx_ac97_bus) = { "ring_osc_6 - PARENTS(pxa3xx_sbus) = { "ring_osc_60mhz", "system_bus" }; - PARENTS(pxa3xx_smemcbus) = { "ring_osc_60mhz", "smemc" }; - --#define CKEN_AB(bit) ((CKEN_ ## bit > 31) ? &CKENA : &CKENB) -+#define CKEN_AB(bit) ((CKEN_ ## bit > 31) ? &CKENB : &CKENA) - #define PXA3XX_CKEN(dev_id, con_id, parents, mult_lp, div_lp, mult_hp, \ - div_hp, bit, is_lp, flags) \ - PXA_CKEN(dev_id, con_id, bit, parents, mult_lp, div_lp, \ diff --git a/kernel/kernel/files/patches/mageia/stable-clk-qcom-fix-msm8916-prng-clock-enable-bit.patch b/kernel/kernel/files/patches/mageia/stable-clk-qcom-fix-msm8916-prng-clock-enable-bit.patch new file mode 100644 index 00000000..d2d00d7e --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-clk-qcom-fix-msm8916-prng-clock-enable-bit.patch @@ -0,0 +1,32 @@ +From 1c4b4b0eb1909010b8ebda1ef208bf3ed62e7487 Mon Sep 17 00:00:00 2001 +From: Georgi Djakov +Date: Tue, 25 Aug 2015 15:27:43 +0300 +Subject: clk: qcom: Fix MSM8916 prng clock enable bit + +From: Georgi Djakov + +commit 1c4b4b0eb1909010b8ebda1ef208bf3ed62e7487 upstream. + +Fix the enable bit of the pseudorandom number generator clock. + +Reported-by: Stanimir Varbanov +Fixes: 3966fab8b6ab "clk: qcom: Add MSM8916 Global Clock Controller support" +Signed-off-by: Georgi Djakov +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/qcom/gcc-msm8916.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/clk/qcom/gcc-msm8916.c ++++ b/drivers/clk/qcom/gcc-msm8916.c +@@ -2278,7 +2278,7 @@ static struct clk_branch gcc_prng_ahb_cl + .halt_check = BRANCH_HALT_VOTED, + .clkr = { + .enable_reg = 0x45004, +- .enable_mask = BIT(0), ++ .enable_mask = BIT(8), + .hw.init = &(struct clk_init_data){ + .name = "gcc_prng_ahb_clk", + .parent_names = (const char *[]){ diff --git a/kernel/kernel/files/patches/mageia/stable-clk-qcom-set-clk_set_rate_parent-on-ce1-clocks.patch b/kernel/kernel/files/patches/mageia/stable-clk-qcom-set-clk_set_rate_parent-on-ce1-clocks.patch new file mode 100644 index 00000000..2e3f0458 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-clk-qcom-set-clk_set_rate_parent-on-ce1-clocks.patch @@ -0,0 +1,45 @@ +From d7a304e9d018c99dda80f4c16ec0fe817b5be4a1 Mon Sep 17 00:00:00 2001 +From: Stephen Boyd +Date: Tue, 14 Jul 2015 16:57:29 -0700 +Subject: clk: qcom: Set CLK_SET_RATE_PARENT on ce1 clocks + +From: Stephen Boyd + +commit d7a304e9d018c99dda80f4c16ec0fe817b5be4a1 upstream. + +The other ce clocks have the flag set, but ce1 doesn't, so +clk_set_rate() doesn't propagate up the tree to the ce1_src_clk. +Set the flag as this is supported. + +Reported-by: Bjorn Andersson +Tested-by: Bjorn Andersson +Fixes: 02824653200b ("clk: qcom: Add APQ8084 Global Clock Controller support") +Fixes: d33faa9ead8d ("clk: qcom: Add support for MSM8974's global clock controller (GCC)") +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/qcom/gcc-apq8084.c | 1 + + drivers/clk/qcom/gcc-msm8974.c | 1 + + 2 files changed, 2 insertions(+) + +--- a/drivers/clk/qcom/gcc-apq8084.c ++++ b/drivers/clk/qcom/gcc-apq8084.c +@@ -2105,6 +2105,7 @@ static struct clk_branch gcc_ce1_clk = { + "ce1_clk_src", + }, + .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, + .ops = &clk_branch2_ops, + }, + }, +--- a/drivers/clk/qcom/gcc-msm8974.c ++++ b/drivers/clk/qcom/gcc-msm8974.c +@@ -1783,6 +1783,7 @@ static struct clk_branch gcc_ce1_clk = { + "ce1_clk_src", + }, + .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, + .ops = &clk_branch2_ops, + }, + }, diff --git a/kernel/kernel/files/patches/mageia/stable-clk-rockchip-rk3288-add-clk_set_rate_parent-to-sclk_mac.patch b/kernel/kernel/files/patches/mageia/stable-clk-rockchip-rk3288-add-clk_set_rate_parent-to-sclk_mac.patch new file mode 100644 index 00000000..0b070dc1 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-clk-rockchip-rk3288-add-clk_set_rate_parent-to-sclk_mac.patch @@ -0,0 +1,39 @@ +From 4791eb61dbe8100ccac59fecfac9d93a15db1447 Mon Sep 17 00:00:00 2001 +From: Heiko Stuebner +Date: Thu, 18 Jun 2015 16:18:28 +0200 +Subject: clk: rockchip: rk3288: add CLK_SET_RATE_PARENT to sclk_mac + +From: Heiko Stuebner + +commit 4791eb61dbe8100ccac59fecfac9d93a15db1447 upstream. + +The dwmac ethernet controller on the rk3288 supports phys connected +via rgmii and rmii. With rgmii phys it is expected that the mac clock +is provided externally while with rmii phys the clock can be external +but also generated from the plls. In the later case it of course needs +be at 50MHz, which gets set from the dwmac_rk driver. +As most devices use a rgmii phy it never surfaced so far that the mac +clk mux, doesn't go up one lever to the pll clock in the rmii case with +internal clock generation, as it is missing the CLK_SET_RATE_PARENT flag, +and thus will not set the correct frequency in most cases. + +Fixes: b9e4ba541607 ("clk: rockchip: add clock controller for rk3288") +Signed-off-by: Heiko Stuebner +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/rockchip/clk-rk3288.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/clk/rockchip/clk-rk3288.c ++++ b/drivers/clk/rockchip/clk-rk3288.c +@@ -578,7 +578,7 @@ static struct rockchip_clk_branch rk3288 + COMPOSITE(0, "mac_pll_src", mux_pll_src_npll_cpll_gpll_p, 0, + RK3288_CLKSEL_CON(21), 0, 2, MFLAGS, 8, 5, DFLAGS, + RK3288_CLKGATE_CON(2), 5, GFLAGS), +- MUX(SCLK_MAC, "mac_clk", mux_mac_p, 0, ++ MUX(SCLK_MAC, "mac_clk", mux_mac_p, CLK_SET_RATE_PARENT, + RK3288_CLKSEL_CON(21), 4, 1, MFLAGS), + GATE(SCLK_MACREF_OUT, "sclk_macref_out", "mac_clk", 0, + RK3288_CLKGATE_CON(5), 3, GFLAGS), diff --git a/kernel/kernel/files/patches/mageia/stable-clk-s5pv210-add-missing-call-to.patch b/kernel/kernel/files/patches/mageia/stable-clk-s5pv210-add-missing-call-to.patch new file mode 100644 index 00000000..fb96a551 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-clk-s5pv210-add-missing-call-to.patch @@ -0,0 +1,37 @@ +From ba30011577330b7e29ecb5916d89c6db9fbc5b3d Mon Sep 17 00:00:00 2001 +From: Marek Szyprowski +Date: Wed, 12 Aug 2015 10:58:22 +0200 +Subject: clk: s5pv210: add missing call to + samsung_clk_of_add_provider() + +From: Marek Szyprowski + +commit ba30011577330b7e29ecb5916d89c6db9fbc5b3d upstream. + +Commit d5e136a21b2028fb1f45143ea7112d5869bfc6c7 ("clk: samsung: Register +clk provider only after registering its all clocks", merged to v3.17-rc1) +modified a way that driver registers registers to core framework. This +change has not been applied to s5pv210 clocks driver, which has been +merged in parallel to that commit. This patch adds a missing call to +samsung_clk_of_add_provider(), so the driver is operational again. + +Signed-off-by: Marek Szyprowski +Acked-by: Tomasz Figa +Signed-off-by: Michael Turquette +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/samsung/clk-s5pv210.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/clk/samsung/clk-s5pv210.c ++++ b/drivers/clk/samsung/clk-s5pv210.c +@@ -828,6 +828,8 @@ static void __init __s5pv210_clk_init(st + + s5pv210_clk_sleep_init(); + ++ samsung_clk_of_add_provider(np, ctx); ++ + pr_info("%s clocks: mout_apll = %ld, mout_mpll = %ld\n" + "\tmout_epll = %ld, mout_vpll = %ld\n", + is_s5p6442 ? "S5P6442" : "S5PV210", diff --git a/kernel/kernel/files/patches/mageia/stable-clk-versatile-off-by-one-in-clk_sp810_timerclken_of_get.patch b/kernel/kernel/files/patches/mageia/stable-clk-versatile-off-by-one-in-clk_sp810_timerclken_of_get.patch new file mode 100644 index 00000000..dcd5f48d --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-clk-versatile-off-by-one-in-clk_sp810_timerclken_of_get.patch @@ -0,0 +1,34 @@ +From 3294bee87091be5f179474f6c39d1d87769635e2 Mon Sep 17 00:00:00 2001 +From: Dan Carpenter +Date: Wed, 29 Jul 2015 13:17:06 +0300 +Subject: clk: versatile: off by one in clk_sp810_timerclken_of_get() + +From: Dan Carpenter + +commit 3294bee87091be5f179474f6c39d1d87769635e2 upstream. + +The ">" should be ">=" or we end up reading beyond the end of the array. + +Fixes: 6e973d2c4385 ('clk: vexpress: Add separate SP810 driver') +Signed-off-by: Dan Carpenter +Acked-by: Pawel Moll +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/versatile/clk-sp810.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/clk/versatile/clk-sp810.c ++++ b/drivers/clk/versatile/clk-sp810.c +@@ -128,8 +128,8 @@ static struct clk *clk_sp810_timerclken_ + { + struct clk_sp810 *sp810 = data; + +- if (WARN_ON(clkspec->args_count != 1 || clkspec->args[0] > +- ARRAY_SIZE(sp810->timerclken))) ++ if (WARN_ON(clkspec->args_count != 1 || ++ clkspec->args[0] >= ARRAY_SIZE(sp810->timerclken))) + return NULL; + + return sp810->timerclken[clkspec->args[0]].clk; diff --git a/kernel/kernel/files/patches/mageia/stable-dm-thin-metadata-delete-btrees-when-releasing-metadata-snapshot.patch b/kernel/kernel/files/patches/mageia/stable-dm-thin-metadata-delete-btrees-when-releasing-metadata-snapshot.patch deleted file mode 100644 index 3f3678c8..00000000 --- a/kernel/kernel/files/patches/mageia/stable-dm-thin-metadata-delete-btrees-when-releasing-metadata-snapshot.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 7f518ad0a212e2a6fd68630e176af1de395070a7 Mon Sep 17 00:00:00 2001 -From: Joe Thornber -Date: Wed, 12 Aug 2015 15:10:21 +0100 -Subject: dm thin metadata: delete btrees when releasing metadata snapshot - -From: Joe Thornber - -commit 7f518ad0a212e2a6fd68630e176af1de395070a7 upstream. - -The device details and mapping trees were just being decremented -before. Now btree_del() is called to do a deep delete. - -Signed-off-by: Joe Thornber -Signed-off-by: Mike Snitzer -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/md/dm-thin-metadata.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/md/dm-thin-metadata.c -+++ b/drivers/md/dm-thin-metadata.c -@@ -1295,8 +1295,8 @@ static int __release_metadata_snap(struc - return r; - - disk_super = dm_block_data(copy); -- dm_sm_dec_block(pmd->metadata_sm, le64_to_cpu(disk_super->data_mapping_root)); -- dm_sm_dec_block(pmd->metadata_sm, le64_to_cpu(disk_super->device_details_root)); -+ dm_btree_del(&pmd->info, le64_to_cpu(disk_super->data_mapping_root)); -+ dm_btree_del(&pmd->details_info, le64_to_cpu(disk_super->device_details_root)); - dm_sm_dec_block(pmd->metadata_sm, held_root); - - return dm_tm_unlock(pmd->tm, copy); diff --git a/kernel/kernel/files/patches/mageia/stable-doc-usb-gadget-testing-using-the-updated-testusb.c.patch b/kernel/kernel/files/patches/mageia/stable-doc-usb-gadget-testing-using-the-updated-testusb.c.patch new file mode 100644 index 00000000..0864b1a3 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-doc-usb-gadget-testing-using-the-updated-testusb.c.patch @@ -0,0 +1,44 @@ +From f811a38300be3cdb603171aea5ad3fb42b71ca53 Mon Sep 17 00:00:00 2001 +From: Peter Chen +Date: Fri, 31 Jul 2015 16:36:30 +0800 +Subject: doc: usb: gadget-testing: using the updated testusb.c + +From: Peter Chen + +commit f811a38300be3cdb603171aea5ad3fb42b71ca53 upstream. + +testusb.c at http://www.linux-usb.org/usbtest/ is out of date, +using the one at the kernel source folder. + +Signed-off-by: Peter Chen +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + Documentation/usb/gadget-testing.txt | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +--- a/Documentation/usb/gadget-testing.txt ++++ b/Documentation/usb/gadget-testing.txt +@@ -237,9 +237,7 @@ Testing the LOOPBACK function + ----------------------------- + + device: run the gadget +-host: test-usb +- +-http://www.linux-usb.org/usbtest/testusb.c ++host: test-usb (tools/usb/testusb.c) + + 8. MASS STORAGE function + ======================== +@@ -588,9 +586,8 @@ Testing the SOURCESINK function + ------------------------------- + + device: run the gadget +-host: test-usb ++host: test-usb (tools/usb/testusb.c) + +-http://www.linux-usb.org/usbtest/testusb.c + + 16. UAC1 function + ================= diff --git a/kernel/kernel/files/patches/mageia/stable-drm-i915-allow-dsi-dual-link-to-be-configured-on-any-pipe.patch b/kernel/kernel/files/patches/mageia/stable-drm-i915-allow-dsi-dual-link-to-be-configured-on-any-pipe.patch new file mode 100644 index 00000000..c545c5a9 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-i915-allow-dsi-dual-link-to-be-configured-on-any-pipe.patch @@ -0,0 +1,58 @@ +From 824257857fd81f5e749831ff9cd63566b5a86abe Mon Sep 17 00:00:00 2001 +From: Gaurav K Singh +Date: Mon, 3 Aug 2015 15:45:32 +0530 +Subject: drm/i915: Allow DSI dual link to be configured on any pipe +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Gaurav K Singh + +commit 824257857fd81f5e749831ff9cd63566b5a86abe upstream. + +Just like single link MIPI panels, similarly for dual link panels, pipe +to be configured is based on the DVO port from VBT Block 2. In hardware, +Port A is mapped with Pipe A and Port C is mapped with Pipe B. + +This issue got introduced in - + +commit 7e9804fdcffc650515c60f524b8b2076ee59e710 +Author: Jani Nikula +Date: Fri Jan 16 14:27:23 2015 +0200 + + drm/i915/dsi: add drm mipi dsi host support + +Signed-off-by: Gaurav K Singh +Reviewed-by: Ville Syrjälä +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_dsi.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_dsi.c ++++ b/drivers/gpu/drm/i915/intel_dsi.c +@@ -1036,11 +1036,7 @@ void intel_dsi_init(struct drm_device *d + intel_connector->unregister = intel_connector_unregister; + + /* Pipe A maps to MIPI DSI port A, pipe B maps to MIPI DSI port C */ +- if (dev_priv->vbt.dsi.config->dual_link) { +- /* XXX: does dual link work on either pipe? */ +- intel_encoder->crtc_mask = (1 << PIPE_A); +- intel_dsi->ports = ((1 << PORT_A) | (1 << PORT_C)); +- } else if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIA) { ++ if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIA) { + intel_encoder->crtc_mask = (1 << PIPE_A); + intel_dsi->ports = (1 << PORT_A); + } else if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIC) { +@@ -1048,6 +1044,9 @@ void intel_dsi_init(struct drm_device *d + intel_dsi->ports = (1 << PORT_C); + } + ++ if (dev_priv->vbt.dsi.config->dual_link) ++ intel_dsi->ports = ((1 << PORT_A) | (1 << PORT_C)); ++ + /* Create a DSI host (and a device) for each port. */ + for_each_dsi_port(port, intel_dsi->ports) { + struct intel_dsi_host *host; diff --git a/kernel/kernel/files/patches/mageia/stable-drm-i915-always-mark-the-object-as-dirty-when-used-by-the-gpu.patch b/kernel/kernel/files/patches/mageia/stable-drm-i915-always-mark-the-object-as-dirty-when-used-by-the-gpu.patch new file mode 100644 index 00000000..59d9b821 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-i915-always-mark-the-object-as-dirty-when-used-by-the-gpu.patch @@ -0,0 +1,58 @@ +From 51bc140431e233284660b1d22c47dec9ecdb521e Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Mon, 31 Aug 2015 15:10:39 +0100 +Subject: drm/i915: Always mark the object as dirty when used by the GPU +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Chris Wilson + +commit 51bc140431e233284660b1d22c47dec9ecdb521e upstream. + +There have been many hard to track down bugs whereby userspace forgot to +flag a write buffer and then cause graphics corruption or a hung GPU +when that buffer was later purged under memory pressure (as the buffer +appeared clean, its pages would have been evicted rather than preserved +and any changes more recent than in the backing storage would be lost). +In retrospect this is a rare optimisation against memory pressure, +already the slow path. If we always mark the buffer as dirty when +accessed by the GPU, anything not used can still be evicted cheaply +(ideal behaviour for mark-and-sweep eviction) but we do not run the risk +of corruption. For correct read serialisation, userspace still has to +notify when the GPU writes to an object. However, there are certain +situations under which userspace may wish to tell white lies to the +kernel... + +Signed-off-by: Chris Wilson +Cc: Daniel Vetter +Cc: Kristian Høgsberg +Cc: Jesse Barnes +Cc: "Goel, Akash" +Cc: Michał Winiarski +Reviewed-by: Daniel Vetter +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c ++++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c +@@ -1025,6 +1025,7 @@ i915_gem_execbuffer_move_to_active(struc + u32 old_read = obj->base.read_domains; + u32 old_write = obj->base.write_domain; + ++ obj->dirty = 1; /* be paranoid */ + obj->base.write_domain = obj->base.pending_write_domain; + if (obj->base.write_domain == 0) + obj->base.pending_read_domains |= obj->base.read_domains; +@@ -1032,7 +1033,6 @@ i915_gem_execbuffer_move_to_active(struc + + i915_vma_move_to_active(vma, ring); + if (obj->base.write_domain) { +- obj->dirty = 1; + i915_gem_request_assign(&obj->last_write_req, req); + + intel_fb_obj_invalidate(obj, ring, ORIGIN_CS); diff --git a/kernel/kernel/files/patches/mageia/stable-drm-i915-apply-the-pci_d0-d3-hibernation-workaround-everywhere-on-pre-gen6.patch b/kernel/kernel/files/patches/mageia/stable-drm-i915-apply-the-pci_d0-d3-hibernation-workaround-everywhere-on-pre-gen6.patch new file mode 100644 index 00000000..b425285d --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-i915-apply-the-pci_d0-d3-hibernation-workaround-everywhere-on-pre-gen6.patch @@ -0,0 +1,79 @@ +From 54875571bbfde00fc63741715c531cbb5246c3b2 Mon Sep 17 00:00:00 2001 +From: Imre Deak +Date: Tue, 30 Jun 2015 17:06:47 +0300 +Subject: drm/i915: apply the PCI_D0/D3 hibernation workaround everywhere on pre GEN6 + +From: Imre Deak + +commit 54875571bbfde00fc63741715c531cbb5246c3b2 upstream. + +commit da2bc1b9db3351addd293e5b82757efe1f77ed1d +Author: Imre Deak +Date: Thu Oct 23 19:23:26 2014 +0300 + + drm/i915: add poweroff_late handler + +introduced a regression on old platforms during hibernation. A workaround was +added in + +commit ab3be73fa7b43f4c3648ce29b5fd649ea54d3adb +Author: Imre Deak +Date: Mon Mar 2 13:04:41 2015 +0200 + + drm/i915: gen4: work around hang during hibernation + +using an explicit blacklist for the GENs/BIOS vendors where the issue was +reported. Later there we had reports of the same failure on platforms not on +this list. + +To my best knowledge the correct thing to do is still to put the device to PCI +D3 state during hibernation, see [1] and [2] for the reasons. This also aligns +with our future plans to unify more the runtime and system suspend/resume +paths. Since an exact blacklist seems to be impractical (multiple GENs and +BIOS vendors are affected) apply the workaround on everything pre GEN6. + +[1] http://lists.freedesktop.org/archives/intel-gfx/2015-February/060710.html +[2] https://lkml.org/lkml/2015/6/22/274 + +Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=95061 +Reported-by: Ilya Tumaykin +Reported-by: Dirk Griesbach +Reported-by: Pavel Machek +Reported-by: Mikko Rapeli +Tested-by: Mikko Rapeli +Reported-by: Paul Bolle +Signed-off-by: Imre Deak +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_drv.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/i915/i915_drv.c ++++ b/drivers/gpu/drm/i915/i915_drv.c +@@ -647,15 +647,18 @@ static int i915_drm_suspend_late(struct + + pci_disable_device(drm_dev->pdev); + /* +- * During hibernation on some GEN4 platforms the BIOS may try to access ++ * During hibernation on some platforms the BIOS may try to access + * the device even though it's already in D3 and hang the machine. So + * leave the device in D0 on those platforms and hope the BIOS will +- * power down the device properly. Platforms where this was seen: +- * Lenovo Thinkpad X301, X61s ++ * power down the device properly. The issue was seen on multiple old ++ * GENs with different BIOS vendors, so having an explicit blacklist ++ * is inpractical; apply the workaround on everything pre GEN6. The ++ * platforms where the issue was seen: ++ * Lenovo Thinkpad X301, X61s, X60, T60, X41 ++ * Fujitsu FSC S7110 ++ * Acer Aspire 1830T + */ +- if (!(hibernation && +- drm_dev->pdev->subsystem_vendor == PCI_VENDOR_ID_LENOVO && +- INTEL_INFO(dev_priv)->gen == 4)) ++ if (!(hibernation && INTEL_INFO(dev_priv)->gen < 6)) + pci_set_power_state(drm_dev->pdev, PCI_D3hot); + + return 0; diff --git a/kernel/kernel/files/patches/mageia/stable-drm-i915-check-dp-link-status-on-long-hpd-too.patch b/kernel/kernel/files/patches/mageia/stable-drm-i915-check-dp-link-status-on-long-hpd-too.patch new file mode 100644 index 00000000..fd5d79d6 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-i915-check-dp-link-status-on-long-hpd-too.patch @@ -0,0 +1,75 @@ +From d14e7b6d1d8747826cb900db852351c550e00fdd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= +Date: Thu, 20 Aug 2015 19:37:29 +0300 +Subject: drm/i915: Check DP link status on long hpd too +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= + +commit d14e7b6d1d8747826cb900db852351c550e00fdd upstream. + +We are no longer checkling the DP link status on long hpd. We used to do +that from the .hot_plug() handler, but it was removed when MST got +introduced. + +If there's no userspace we now fail to retrain the link if the sink +power is toggled (or cable yanked and replugged), meaning the user is +left staring at a blank screen. With the retraining put back that should +be fixed. + +Also remove the leftover comment that referred to the old retraining +from .hot_plug(). + +Fixes a regression introduced in: +commit 0e32b39ceed665bfa4a77a4bc307b6652b991632 +Author: Dave Airlie +Date: Fri May 2 14:02:48 2014 +1000 + + drm/i915: add DP 1.2 MST support (v0.7) + +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89453 +Tested-by: Palmer Dabbelt +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91407 +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89461 +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89594 +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85641 +Cc: Dave Airlie +Signed-off-by: Ville Syrjälä +Reviewed-by: Daniel Vetter +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_dp.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_dp.c ++++ b/drivers/gpu/drm/i915/intel_dp.c +@@ -4691,9 +4691,12 @@ intel_dp_hpd_pulse(struct intel_digital_ + + intel_dp_probe_oui(intel_dp); + +- if (!intel_dp_probe_mst(intel_dp)) ++ if (!intel_dp_probe_mst(intel_dp)) { ++ drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); ++ intel_dp_check_link_status(intel_dp); ++ drm_modeset_unlock(&dev->mode_config.connection_mutex); + goto mst_fail; +- ++ } + } else { + if (intel_dp->is_mst) { + if (intel_dp_check_mst_status(intel_dp) == -EINVAL) +@@ -4701,10 +4704,6 @@ intel_dp_hpd_pulse(struct intel_digital_ + } + + if (!intel_dp->is_mst) { +- /* +- * we'll check the link status via the normal hot plug path later - +- * but for short hpds we should check it now +- */ + drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); + intel_dp_check_link_status(intel_dp); + drm_modeset_unlock(&dev->mode_config.connection_mutex); diff --git a/kernel/kernel/files/patches/mageia/stable-drm-i915-limit-the-number-of-loops-for-reading-a-split-64bit-register.patch b/kernel/kernel/files/patches/mageia/stable-drm-i915-limit-the-number-of-loops-for-reading-a-split-64bit-register.patch new file mode 100644 index 00000000..8dd737f1 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-i915-limit-the-number-of-loops-for-reading-a-split-64bit-register.patch @@ -0,0 +1,57 @@ +From acd29f7b22262d9e848393b9b6ae13eb42d22514 Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Tue, 8 Sep 2015 14:17:13 +0100 +Subject: drm/i915: Limit the number of loops for reading a split 64bit register +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Chris Wilson + +commit acd29f7b22262d9e848393b9b6ae13eb42d22514 upstream. + +In I915_READ64_2x32 we attempt to read a 64bit register using 2 32bit +reads. Due to the nature of the registers we try to read in this manner, +they may increment between the two instruction (e.g. a timestamp +counter). To keep the result accurate, we repeat the read if we detect +an overflow (i.e. the upper value varies). However, some hardware is just +plain flaky and may endless loop as the the upper 32bits are not stable. +Just give up after a couple of tries and report whatever we read last. + +v2: Use the most recent values when erring out on an unstable register. + +Reported-by: russianneuromancer@ya.ru +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91906 +Signed-off-by: Chris Wilson +Cc: Michał Winiarski +Cc: Daniel Vetter +Cc: Jani Nikula +Reviewed-by: Daniel Vetter +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/i915_drv.h | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +--- a/drivers/gpu/drm/i915/i915_drv.h ++++ b/drivers/gpu/drm/i915/i915_drv.h +@@ -3190,13 +3190,13 @@ int intel_freq_opcode(struct drm_i915_pr + #define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true) + + #define I915_READ64_2x32(lower_reg, upper_reg) ({ \ +- u32 upper, lower, tmp; \ +- tmp = I915_READ(upper_reg); \ ++ u32 upper, lower, old_upper, loop = 0; \ ++ upper = I915_READ(upper_reg); \ + do { \ +- upper = tmp; \ ++ old_upper = upper; \ + lower = I915_READ(lower_reg); \ +- tmp = I915_READ(upper_reg); \ +- } while (upper != tmp); \ ++ upper = I915_READ(upper_reg); \ ++ } while (upper != old_upper && loop++ < 2); \ + (u64)upper << 32 | lower; }) + + #define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) diff --git a/kernel/kernel/files/patches/mageia/stable-drm-i915-preserve-ssc-earlier.patch b/kernel/kernel/files/patches/mageia/stable-drm-i915-preserve-ssc-earlier.patch new file mode 100644 index 00000000..ba74fa2d --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-i915-preserve-ssc-earlier.patch @@ -0,0 +1,117 @@ +From 69f92f67b68ab7028ffe15f0eea76b59f8859383 Mon Sep 17 00:00:00 2001 +From: Lukas Wunner +Date: Wed, 15 Jul 2015 13:57:35 +0200 +Subject: drm/i915: Preserve SSC earlier + +From: Lukas Wunner + +commit 69f92f67b68ab7028ffe15f0eea76b59f8859383 upstream. + +Commit 92122789b2d6 ("drm/i915: preserve SSC if previously set v3") +added code to intel_modeset_gem_init to override the SSC status read +from VBT with the SSC status set by BIOS. + +However, intel_modeset_gem_init is invoked *after* intel_modeset_init, +which calls intel_setup_outputs, which *modifies* SSC status by way of +intel_init_pch_refclk. So unlike advertised, intel_modeset_gem_init +doesn't preserve the SSC status set by BIOS but whatever +intel_init_pch_refclk decided on. + +This is a problem on dual gpu laptops such as the MacBook Pro which +require either a handler to switch DDC lines, or the discrete gpu +to proxy DDC/AUX communication: Both the handler and the discrete +gpu may initialize after the i915 driver, and consequently, an LVDS +connector may initially seem disconnected and the SSC therefore +is disabled by intel_init_pch_refclk, but on reprobe the connector +may turn out to be connected and the SSC must then be enabled. + +Due to 92122789b2d6 however, the SSC is not enabled on reprobe since +it is assumed BIOS disabled it while in fact it was disabled by +intel_init_pch_refclk. + +Also, because the SSC status is preserved so late, the preserved value +only ever gets used on resume but not on panel initialization: +intel_modeset_init calls intel_init_display which indirectly calls +intel_panel_use_ssc via multiple subroutines, *before* the BIOS value +overrides the VBT value in intel_modeset_gem_init (intel_panel_use_ssc +is the sole user of dev_priv->vbt.lvds_use_ssc). + +Fix this by moving the code introduced by 92122789b2d6 from +intel_modeset_gem_init to intel_modeset_init before the invocation +of intel_setup_outputs and intel_init_display. + +Add a DRM_DEBUG_KMS as suggested way back by Jani: +http://lists.freedesktop.org/archives/intel-gfx/2014-June/046666.html + +Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=88861 +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=61115 +Tested-by: Paul Hordiienko + [MBP 6,2 2010 intel ILK + nvidia GT216 pre-retina] +Tested-by: William Brown + [MBP 8,2 2011 intel SNB + amd turks pre-retina] +Tested-by: Lukas Wunner + [MBP 9,1 2012 intel IVB + nvidia GK107 pre-retina] +Tested-by: Bruno Bierbaumer + [MBP 11,3 2013 intel HSW + nvidia GK107 retina -- work in progress] +Fixes: 92122789b2d6 ("drm/i915: preserve SSC if previously set v3") +Signed-off-by: Lukas Wunner +Reviewed-by: Jesse Barnes +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_display.c | 29 ++++++++++++++++++----------- + 1 file changed, 18 insertions(+), 11 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -13781,6 +13781,24 @@ void intel_modeset_init(struct drm_devic + if (INTEL_INFO(dev)->num_pipes == 0) + return; + ++ /* ++ * There may be no VBT; and if the BIOS enabled SSC we can ++ * just keep using it to avoid unnecessary flicker. Whereas if the ++ * BIOS isn't using it, don't assume it will work even if the VBT ++ * indicates as much. ++ */ ++ if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) { ++ bool bios_lvds_use_ssc = !!(I915_READ(PCH_DREF_CONTROL) & ++ DREF_SSC1_ENABLE); ++ ++ if (dev_priv->vbt.lvds_use_ssc != bios_lvds_use_ssc) { ++ DRM_DEBUG_KMS("SSC %sabled by BIOS, overriding VBT which says %sabled\n", ++ bios_lvds_use_ssc ? "en" : "dis", ++ dev_priv->vbt.lvds_use_ssc ? "en" : "dis"); ++ dev_priv->vbt.lvds_use_ssc = bios_lvds_use_ssc; ++ } ++ } ++ + intel_init_display(dev); + intel_init_audio(dev); + +@@ -14266,7 +14284,6 @@ void intel_modeset_setup_hw_state(struct + + void intel_modeset_gem_init(struct drm_device *dev) + { +- struct drm_i915_private *dev_priv = dev->dev_private; + struct drm_crtc *c; + struct drm_i915_gem_object *obj; + int ret; +@@ -14275,16 +14292,6 @@ void intel_modeset_gem_init(struct drm_d + intel_init_gt_powersave(dev); + mutex_unlock(&dev->struct_mutex); + +- /* +- * There may be no VBT; and if the BIOS enabled SSC we can +- * just keep using it to avoid unnecessary flicker. Whereas if the +- * BIOS isn't using it, don't assume it will work even if the VBT +- * indicates as much. +- */ +- if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) +- dev_priv->vbt.lvds_use_ssc = !!(I915_READ(PCH_DREF_CONTROL) & +- DREF_SSC1_ENABLE); +- + intel_modeset_init_hw(dev); + + intel_setup_overlay(dev); diff --git a/kernel/kernel/files/patches/mageia/stable-drm-qxl-validate-monitors-config-modes.patch b/kernel/kernel/files/patches/mageia/stable-drm-qxl-validate-monitors-config-modes.patch new file mode 100644 index 00000000..2ee9e873 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-qxl-validate-monitors-config-modes.patch @@ -0,0 +1,147 @@ +From bd3e1c7c6de9f5f70d97cdb6c817151c0477c5e3 Mon Sep 17 00:00:00 2001 +From: Jonathon Jongsma +Date: Thu, 20 Aug 2015 14:04:32 -0500 +Subject: drm/qxl: validate monitors config modes + +From: Jonathon Jongsma + +commit bd3e1c7c6de9f5f70d97cdb6c817151c0477c5e3 upstream. + +Due to some recent changes in +drm_helper_probe_single_connector_modes_merge_bits(), old custom modes +were not being pruned properly. In current kernels, +drm_mode_validate_basic() is called to sanity-check each mode in the +list. If the sanity-check passes, the mode's status gets set to to +MODE_OK. In older kernels this check was not done, so old custom modes +would still have a status of MODE_UNVERIFIED at this point, and would +therefore be pruned later in the function. + +As a result of this new behavior, the list of modes for a device always +includes every custom mode ever configured for the device, with the +largest one listed first. Since desktop environments usually choose the +first preferred mode when a hotplug event is emitted, this had the +result of making it very difficult for the user to reduce the size of +the display. + +The qxl driver did implement the mode_valid connector function, but it +was empty. In order to restore the old behavior where old custom modes +are pruned, we implement a proper mode_valid function for the qxl +driver. This function now checks each mode against the last configured +custom mode and the list of standard modes. If the mode doesn't match +any of these, its status is set to MODE_BAD so that it will be pruned as +expected. + +Signed-off-by: Jonathon Jongsma +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/qxl/qxl_display.c | 66 +++++++++++++++++++++++--------------- + drivers/gpu/drm/qxl/qxl_drv.h | 2 + + 2 files changed, 42 insertions(+), 26 deletions(-) + +--- a/drivers/gpu/drm/qxl/qxl_display.c ++++ b/drivers/gpu/drm/qxl/qxl_display.c +@@ -160,9 +160,35 @@ static int qxl_add_monitors_config_modes + *pwidth = head->width; + *pheight = head->height; + drm_mode_probed_add(connector, mode); ++ /* remember the last custom size for mode validation */ ++ qdev->monitors_config_width = mode->hdisplay; ++ qdev->monitors_config_height = mode->vdisplay; + return 1; + } + ++static struct mode_size { ++ int w; ++ int h; ++} common_modes[] = { ++ { 640, 480}, ++ { 720, 480}, ++ { 800, 600}, ++ { 848, 480}, ++ {1024, 768}, ++ {1152, 768}, ++ {1280, 720}, ++ {1280, 800}, ++ {1280, 854}, ++ {1280, 960}, ++ {1280, 1024}, ++ {1440, 900}, ++ {1400, 1050}, ++ {1680, 1050}, ++ {1600, 1200}, ++ {1920, 1080}, ++ {1920, 1200} ++}; ++ + static int qxl_add_common_modes(struct drm_connector *connector, + unsigned pwidth, + unsigned pheight) +@@ -170,29 +196,6 @@ static int qxl_add_common_modes(struct d + struct drm_device *dev = connector->dev; + struct drm_display_mode *mode = NULL; + int i; +- struct mode_size { +- int w; +- int h; +- } common_modes[] = { +- { 640, 480}, +- { 720, 480}, +- { 800, 600}, +- { 848, 480}, +- {1024, 768}, +- {1152, 768}, +- {1280, 720}, +- {1280, 800}, +- {1280, 854}, +- {1280, 960}, +- {1280, 1024}, +- {1440, 900}, +- {1400, 1050}, +- {1680, 1050}, +- {1600, 1200}, +- {1920, 1080}, +- {1920, 1200} +- }; +- + for (i = 0; i < ARRAY_SIZE(common_modes); i++) { + mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, + 60, false, false, false); +@@ -823,11 +826,22 @@ static int qxl_conn_get_modes(struct drm + static int qxl_conn_mode_valid(struct drm_connector *connector, + struct drm_display_mode *mode) + { ++ struct drm_device *ddev = connector->dev; ++ struct qxl_device *qdev = ddev->dev_private; ++ int i; ++ + /* TODO: is this called for user defined modes? (xrandr --add-mode) + * TODO: check that the mode fits in the framebuffer */ +- DRM_DEBUG("%s: %dx%d status=%d\n", mode->name, mode->hdisplay, +- mode->vdisplay, mode->status); +- return MODE_OK; ++ ++ if(qdev->monitors_config_width == mode->hdisplay && ++ qdev->monitors_config_height == mode->vdisplay) ++ return MODE_OK; ++ ++ for (i = 0; i < ARRAY_SIZE(common_modes); i++) { ++ if (common_modes[i].w == mode->hdisplay && common_modes[i].h == mode->vdisplay) ++ return MODE_OK; ++ } ++ return MODE_BAD; + } + + static struct drm_encoder *qxl_best_encoder(struct drm_connector *connector) +--- a/drivers/gpu/drm/qxl/qxl_drv.h ++++ b/drivers/gpu/drm/qxl/qxl_drv.h +@@ -325,6 +325,8 @@ struct qxl_device { + struct work_struct fb_work; + + struct drm_property *hotplug_mode_update_property; ++ int monitors_config_width; ++ int monitors_config_height; + }; + + /* forward declaration for QXL_INFO_IO */ diff --git a/kernel/kernel/files/patches/mageia/stable-drm-radeon-add-new-oland-pci-id.patch b/kernel/kernel/files/patches/mageia/stable-drm-radeon-add-new-oland-pci-id.patch deleted file mode 100644 index fc3b4431..00000000 --- a/kernel/kernel/files/patches/mageia/stable-drm-radeon-add-new-oland-pci-id.patch +++ /dev/null @@ -1,26 +0,0 @@ -From e037239e5e7b61007763984aa35a8329596d8c88 Mon Sep 17 00:00:00 2001 -From: Alex Deucher -Date: Mon, 10 Aug 2015 15:28:49 -0400 -Subject: drm/radeon: add new OLAND pci id - -From: Alex Deucher - -commit e037239e5e7b61007763984aa35a8329596d8c88 upstream. - -Signed-off-by: Alex Deucher -Signed-off-by: Greg Kroah-Hartman - ---- - include/drm/drm_pciids.h | 1 + - 1 file changed, 1 insertion(+) - ---- a/include/drm/drm_pciids.h -+++ b/include/drm/drm_pciids.h -@@ -172,6 +172,7 @@ - {0x1002, 0x6610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6611, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6613, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ -+ {0x1002, 0x6617, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6620, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6621, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6623, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ diff --git a/kernel/kernel/files/patches/mageia/stable-drm-radeon-atom-send-out-the-full-aux-address.patch b/kernel/kernel/files/patches/mageia/stable-drm-radeon-atom-send-out-the-full-aux-address.patch new file mode 100644 index 00000000..7c961fcb --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-radeon-atom-send-out-the-full-aux-address.patch @@ -0,0 +1,39 @@ +From 3f8340cc72c9a1a4b49bce7802afd7f248400ef5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= +Date: Thu, 27 Aug 2015 17:23:31 +0300 +Subject: drm/radeon/atom: Send out the full AUX address +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= + +commit 3f8340cc72c9a1a4b49bce7802afd7f248400ef5 upstream. + +AUX addresses are 20 bits long. Send out the entire address instead of +just the low 16 bits. + +Cc: Alex Deucher +Cc: "Christian König" +Signed-off-by: Ville Syrjälä +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/atombios_dp.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/drivers/gpu/drm/radeon/atombios_dp.c ++++ b/drivers/gpu/drm/radeon/atombios_dp.c +@@ -171,8 +171,9 @@ radeon_dp_aux_transfer_atom(struct drm_d + return -E2BIG; + + tx_buf[0] = msg->address & 0xff; +- tx_buf[1] = msg->address >> 8; +- tx_buf[2] = msg->request << 4; ++ tx_buf[1] = (msg->address >> 8) & 0xff; ++ tx_buf[2] = (msg->request << 4) | ++ ((msg->address >> 16) & 0xf); + tx_buf[3] = msg->size ? (msg->size - 1) : 0; + + switch (msg->request & ~DP_AUX_I2C_MOT) { diff --git a/kernel/kernel/files/patches/mageia/stable-drm-radeon-don-t-link-train-displayport-on-hpd-until-we-get-the-dpcd.patch b/kernel/kernel/files/patches/mageia/stable-drm-radeon-don-t-link-train-displayport-on-hpd-until-we-get-the-dpcd.patch new file mode 100644 index 00000000..fee261a2 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-radeon-don-t-link-train-displayport-on-hpd-until-we-get-the-dpcd.patch @@ -0,0 +1,75 @@ +From 924f92bf12bfbef3662619e3ed24a1cea7c1cbcd Mon Sep 17 00:00:00 2001 +From: Stephen Chandler Paul +Date: Fri, 21 Aug 2015 14:16:12 -0400 +Subject: DRM - radeon: Don't link train DisplayPort on HPD until we get the dpcd + +From: Stephen Chandler Paul + +commit 924f92bf12bfbef3662619e3ed24a1cea7c1cbcd upstream. + +Most of the time this isn't an issue since hotplugging an adaptor will +trigger a crtc mode change which in turn, causes the driver to probe +every DisplayPort for a dpcd. However, in cases where hotplugging +doesn't cause a mode change (specifically when one unplugs a monitor +from a DisplayPort connector, then plugs that same monitor back in +seconds later on the same port without any other monitors connected), we +never probe for the dpcd before starting the initial link training. What +happens from there looks like this: + + - GPU has only one monitor connected. It's connected via + DisplayPort, and does not go through an adaptor of any sort. + + - User unplugs DisplayPort connector from GPU. + + - Change in HPD is detected by the driver, we probe every + DisplayPort for a possible connection. + + - Probe the port the user originally had the monitor connected + on for it's dpcd. This fails, and we clear the first (and only + the first) byte of the dpcd to indicate we no longer have a + dpcd for this port. + + - User plugs the previously disconnected monitor back into the + same DisplayPort. + + - radeon_connector_hotplug() is called before everyone else, + and tries to handle the link training. Since only the first + byte of the dpcd is zeroed, the driver is able to complete + link training but does so against the wrong dpcd, causing it + to initialize the link with the wrong settings. + + - Display stays blank (usually), dpcd is probed after the + initial link training, and the driver prints no obvious + messages to the log. + +In theory, since only one byte of the dpcd is chopped off (specifically, +the byte that contains the revision information for DisplayPort), it's +not entirely impossible that this bug may not show on certain monitors. +For instance, the only reason this bug was visible on my ASUS PB238 +monitor was due to the fact that this monitor using the enhanced framing +symbol sequence, the flag for which is ignored if the radeon driver +thinks that the DisplayPort version is below 1.1. + +Signed-off-by: Stephen Chandler Paul +Reviewed-by: Jerome Glisse +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/radeon_connectors.c | 5 +++++ + 1 file changed, 5 insertions(+) + +--- a/drivers/gpu/drm/radeon/radeon_connectors.c ++++ b/drivers/gpu/drm/radeon/radeon_connectors.c +@@ -95,6 +95,11 @@ void radeon_connector_hotplug(struct drm + if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { + drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); + } else if (radeon_dp_needs_link_train(radeon_connector)) { ++ /* Don't try to start link training before we ++ * have the dpcd */ ++ if (!radeon_dp_getdpcd(radeon_connector)) ++ return; ++ + /* set it to OFF so that drm_helper_connector_dpms() + * won't return immediately since the current state + * is ON at this point. diff --git a/kernel/kernel/files/patches/mageia/stable-drm-radeon-fix-hdmi-quantization_range-for-pre-dce5-asics.patch b/kernel/kernel/files/patches/mageia/stable-drm-radeon-fix-hdmi-quantization_range-for-pre-dce5-asics.patch new file mode 100644 index 00000000..90a2ec0c --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-radeon-fix-hdmi-quantization_range-for-pre-dce5-asics.patch @@ -0,0 +1,47 @@ +From 86b7709d48f0df8796bddd7e1ce45c6fb7a7c6ec Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Thu, 27 Aug 2015 09:52:22 -0400 +Subject: drm/radeon: fix HDMI quantization_range for pre-DCE5 asics + +From: Alex Deucher + +commit 86b7709d48f0df8796bddd7e1ce45c6fb7a7c6ec upstream. + +Support for output_csc is only available on DCE5 and newer so +don't mess with the HDMI quantization_range on pre-DCE5 asics. + +bug: +https://bugs.freedesktop.org/show_bug.cgi?id=83226 + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/radeon_audio.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +--- a/drivers/gpu/drm/radeon/radeon_audio.c ++++ b/drivers/gpu/drm/radeon/radeon_audio.c +@@ -522,13 +522,15 @@ static int radeon_audio_set_avi_packet(s + return err; + } + +- if (drm_rgb_quant_range_selectable(radeon_connector_edid(connector))) { +- if (radeon_encoder->output_csc == RADEON_OUTPUT_CSC_TVRGB) +- frame.quantization_range = HDMI_QUANTIZATION_RANGE_LIMITED; +- else +- frame.quantization_range = HDMI_QUANTIZATION_RANGE_FULL; +- } else { +- frame.quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT; ++ if (radeon_encoder->output_csc != RADEON_OUTPUT_CSC_BYPASS) { ++ if (drm_rgb_quant_range_selectable(radeon_connector_edid(connector))) { ++ if (radeon_encoder->output_csc == RADEON_OUTPUT_CSC_TVRGB) ++ frame.quantization_range = HDMI_QUANTIZATION_RANGE_LIMITED; ++ else ++ frame.quantization_range = HDMI_QUANTIZATION_RANGE_FULL; ++ } else { ++ frame.quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT; ++ } + } + + err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer)); diff --git a/kernel/kernel/files/patches/mageia/stable-drm-radeon-native-send-out-the-full-aux-address.patch b/kernel/kernel/files/patches/mageia/stable-drm-radeon-native-send-out-the-full-aux-address.patch new file mode 100644 index 00000000..d89b354a --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-drm-radeon-native-send-out-the-full-aux-address.patch @@ -0,0 +1,40 @@ +From 7040c399aea2b0213a9aefd73e507369a6d641d6 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Mon, 31 Aug 2015 11:15:05 -0400 +Subject: drm/radeon/native: Send out the full AUX address +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Alex Deucher + +commit 7040c399aea2b0213a9aefd73e507369a6d641d6 upstream. + +AUX addresses are 20 bits long. Send out the entire address instead of +just the low 16 bits. + +Port of: +drm/radeon/atom: Send out the full AUX address +to radeon non-atom aux path + +Reviewed-by: Christian König +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/radeon_dp_auxch.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/gpu/drm/radeon/radeon_dp_auxch.c ++++ b/drivers/gpu/drm/radeon/radeon_dp_auxch.c +@@ -116,8 +116,8 @@ radeon_dp_aux_transfer_native(struct drm + AUX_SW_WR_BYTES(bytes)); + + /* write the data header into the registers */ +- /* request, addres, msg size */ +- byte = (msg->request << 4); ++ /* request, address, msg size */ ++ byte = (msg->request << 4) | ((msg->address >> 16) & 0xf); + WREG32(AUX_SW_DATA + aux_offset[instance], + AUX_SW_DATA_MASK(byte) | AUX_SW_AUTOINCREMENT_DISABLE); + diff --git a/kernel/kernel/files/patches/mageia/stable-drm-vmwgfx-fix-execbuf-locking-issues.patch b/kernel/kernel/files/patches/mageia/stable-drm-vmwgfx-fix-execbuf-locking-issues.patch deleted file mode 100644 index c8232310..00000000 --- a/kernel/kernel/files/patches/mageia/stable-drm-vmwgfx-fix-execbuf-locking-issues.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 3e04e2fe6d87807d27521ad6ebb9e7919d628f25 Mon Sep 17 00:00:00 2001 -From: Thomas Hellstrom -Date: Tue, 11 Aug 2015 22:31:17 -0700 -Subject: drm/vmwgfx: Fix execbuf locking issues - -From: Thomas Hellstrom - -commit 3e04e2fe6d87807d27521ad6ebb9e7919d628f25 upstream. - -This addresses two issues that cause problems with viewperf maya-03 in -situation with memory pressure. - -The first issue causes attempts to unreserve buffers if batched -reservation fails due to, for example, a signal pending. While previously -the ttm_eu api was resistant against this type of error, it is no longer -and the lockdep code will complain about attempting to unreserve buffers -that are not reserved. The issue is resolved by avoid calling -ttm_eu_backoff_reservation in the buffer reserve error path. - -The second issue is that the binding_mutex may be held when user-space -fence objects are created and hence during memory reclaims. This may cause -recursive attempts to grab the binding mutex. The issue is resolved by not -holding the binding mutex across fence creation and submission. - -Signed-off-by: Thomas Hellstrom -Reviewed-by: Sinclair Yeh -Signed-off-by: Dave Airlie -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c -+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c -@@ -2492,7 +2492,7 @@ int vmw_execbuf_process(struct drm_file - ret = ttm_eu_reserve_buffers(&ticket, &sw_context->validate_nodes, - true, NULL); - if (unlikely(ret != 0)) -- goto out_err; -+ goto out_err_nores; - - ret = vmw_validate_buffers(dev_priv, sw_context); - if (unlikely(ret != 0)) -@@ -2536,6 +2536,7 @@ int vmw_execbuf_process(struct drm_file - vmw_resource_relocations_free(&sw_context->res_relocations); - - vmw_fifo_commit(dev_priv, command_size); -+ mutex_unlock(&dev_priv->binding_mutex); - - vmw_query_bo_switch_commit(dev_priv, sw_context); - ret = vmw_execbuf_fence_commands(file_priv, dev_priv, -@@ -2551,7 +2552,6 @@ int vmw_execbuf_process(struct drm_file - DRM_ERROR("Fence submission error. Syncing.\n"); - - vmw_resource_list_unreserve(&sw_context->resource_list, false); -- mutex_unlock(&dev_priv->binding_mutex); - - ttm_eu_fence_buffer_objects(&ticket, &sw_context->validate_nodes, - (void *) fence); diff --git a/kernel/kernel/files/patches/mageia/stable-edac-ppc4xx-access-mci-csrows-array-elements-properly.patch b/kernel/kernel/files/patches/mageia/stable-edac-ppc4xx-access-mci-csrows-array-elements-properly.patch deleted file mode 100644 index bc5b51c9..00000000 --- a/kernel/kernel/files/patches/mageia/stable-edac-ppc4xx-access-mci-csrows-array-elements-properly.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 5c16179b550b9fd8114637a56b153c9768ea06a5 Mon Sep 17 00:00:00 2001 -From: Michael Walle -Date: Tue, 21 Jul 2015 11:00:53 +0200 -Subject: EDAC, ppc4xx: Access mci->csrows array elements properly - -From: Michael Walle - -commit 5c16179b550b9fd8114637a56b153c9768ea06a5 upstream. - -The commit - - de3910eb79ac ("edac: change the mem allocation scheme to - make Documentation/kobject.txt happy") - -changed the memory allocation for the csrows member. But ppc4xx_edac was -forgotten in the patch. Fix it. - -Signed-off-by: Michael Walle -Cc: linux-edac -Cc: Mauro Carvalho Chehab -Link: http://lkml.kernel.org/r/1437469253-8611-1-git-send-email-michael@walle.cc -Signed-off-by: Borislav Petkov -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/edac/ppc4xx_edac.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/edac/ppc4xx_edac.c -+++ b/drivers/edac/ppc4xx_edac.c -@@ -920,7 +920,7 @@ static int ppc4xx_edac_init_csrows(struc - */ - - for (row = 0; row < mci->nr_csrows; row++) { -- struct csrow_info *csi = &mci->csrows[row]; -+ struct csrow_info *csi = mci->csrows[row]; - - /* - * Get the configuration settings for this diff --git a/kernel/kernel/files/patches/mageia/stable-hid-hid-input-fix-accessing-freed-memory-during-device-disconnect.patch b/kernel/kernel/files/patches/mageia/stable-hid-hid-input-fix-accessing-freed-memory-during-device-disconnect.patch deleted file mode 100644 index a1548fe1..00000000 --- a/kernel/kernel/files/patches/mageia/stable-hid-hid-input-fix-accessing-freed-memory-during-device-disconnect.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 0621809e37936e7c2b3eac9165cf2aad7f9189eb Mon Sep 17 00:00:00 2001 -From: Krzysztof Kozlowski -Date: Mon, 3 Aug 2015 14:57:30 +0900 -Subject: HID: hid-input: Fix accessing freed memory during device disconnect - -From: Krzysztof Kozlowski - -commit 0621809e37936e7c2b3eac9165cf2aad7f9189eb upstream. - -During unbinding the driver was dereferencing a pointer to memory -already freed by power_supply_unregister(). - -Driver was freeing its internal description of battery through pointers -stored in power_supply structure. However, because the core owns the -power supply instance, after calling power_supply_unregister() this -memory is freed and the driver cannot access these members. - -Fix this by storing the pointer to internal description of battery in a -local variable before calling power_supply_unregister(), so the pointer -remains valid. - -Signed-off-by: Krzysztof Kozlowski -Reported-by: H.J. Lu -Fixes: 297d716f6260 ("power_supply: Change ownership from driver to core") -Reviewed-by: Dmitry Torokhov -Signed-off-by: Jiri Kosina -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/hid/hid-input.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - ---- a/drivers/hid/hid-input.c -+++ b/drivers/hid/hid-input.c -@@ -462,12 +462,15 @@ out: - - static void hidinput_cleanup_battery(struct hid_device *dev) - { -+ const struct power_supply_desc *psy_desc; -+ - if (!dev->battery) - return; - -+ psy_desc = dev->battery->desc; - power_supply_unregister(dev->battery); -- kfree(dev->battery->desc->name); -- kfree(dev->battery->desc); -+ kfree(psy_desc->name); -+ kfree(psy_desc); - dev->battery = NULL; - } - #else /* !CONFIG_HID_BATTERY_STRENGTH */ diff --git a/kernel/kernel/files/patches/mageia/stable-hid-uclogic-fix-limit-in-uclogic_tablet_enable.patch b/kernel/kernel/files/patches/mageia/stable-hid-uclogic-fix-limit-in-uclogic_tablet_enable.patch deleted file mode 100644 index 54b4f47c..00000000 --- a/kernel/kernel/files/patches/mageia/stable-hid-uclogic-fix-limit-in-uclogic_tablet_enable.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 4a8e70f5d0d80675fc17b9ba1e62db8ca6b91775 Mon Sep 17 00:00:00 2001 -From: Dan Carpenter -Date: Wed, 29 Jul 2015 13:16:06 +0300 -Subject: HID: uclogic: fix limit in uclogic_tablet_enable() - -From: Dan Carpenter - -commit 4a8e70f5d0d80675fc17b9ba1e62db8ca6b91775 upstream. - -The limit should be ARRAY_SIZE(params) (5 elements) here instead of -sizeof(params) (20 bytes). - -Fixes: 08177f40bd00 ('HID: uclogic: merge hid-huion driver in hid-uclogic') -Signed-off-by: Dan Carpenter -Reviewed-by: Nikolai Kondrashov -Signed-off-by: Jiri Kosina -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/hid/hid-uclogic.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/hid/hid-uclogic.c -+++ b/drivers/hid/hid-uclogic.c -@@ -858,7 +858,7 @@ static int uclogic_tablet_enable(struct - for (p = drvdata->rdesc; - p <= drvdata->rdesc + drvdata->rsize - 4;) { - if (p[0] == 0xFE && p[1] == 0xED && p[2] == 0x1D && -- p[3] < sizeof(params)) { -+ p[3] < ARRAY_SIZE(params)) { - v = params[p[3]]; - put_unaligned(cpu_to_le32(v), (s32 *)p); - p += 4; diff --git a/kernel/kernel/files/patches/mageia/stable-iio-add-inverse-unit-conversion-macros.patch b/kernel/kernel/files/patches/mageia/stable-iio-add-inverse-unit-conversion-macros.patch new file mode 100644 index 00000000..caabd831 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-iio-add-inverse-unit-conversion-macros.patch @@ -0,0 +1,70 @@ +From c689a923c867eac40ed3826c1d9328edea8b6bc7 Mon Sep 17 00:00:00 2001 +From: Lars-Peter Clausen +Date: Wed, 5 Aug 2015 15:38:14 +0200 +Subject: iio: Add inverse unit conversion macros + +From: Lars-Peter Clausen + +commit c689a923c867eac40ed3826c1d9328edea8b6bc7 upstream. + +Add inverse unit conversion macro to convert from standard IIO units to +units that might be used by some devices. + +Those are useful in combination with scale factors that are specified as +IIO_VAL_FRACTIONAL. Typically the denominator for those specifications will +contain the maximum raw value the sensor will generate and the numerator +the value it maps to in a specific unit. Sometimes datasheets specify those +in different units than the standard IIO units (e.g. degree/s instead of +rad/s) and so we need to do a unit conversion. + +From a mathematical point of view it does not make a difference whether we +apply the unit conversion to the numerator or the inverse unit conversion +to the denominator since (x / y) / z = x / (y * z). But as the denominator +is typically a larger value and we are rounding both the numerator and +denominator to integer values using the later method gives us a better +precision (E.g. the relative error is smaller if we round 8000.3 to 8000 +rather than rounding 8.3 to 8). + +This is where in inverse unit conversion macros will be used. + +Marked for stable as used by some upcoming fixes. + +Signed-off-by: Lars-Peter Clausen +Signed-off-by: Jonathan Cameron +Signed-off-by: Greg Kroah-Hartman + +--- + include/linux/iio/iio.h | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +--- a/include/linux/iio/iio.h ++++ b/include/linux/iio/iio.h +@@ -642,6 +642,15 @@ int iio_str_to_fixpoint(const char *str, + #define IIO_DEGREE_TO_RAD(deg) (((deg) * 314159ULL + 9000000ULL) / 18000000ULL) + + /** ++ * IIO_RAD_TO_DEGREE() - Convert rad to degree ++ * @rad: A value in rad ++ * ++ * Returns the given value converted from rad to degree ++ */ ++#define IIO_RAD_TO_DEGREE(rad) \ ++ (((rad) * 18000000ULL + 314159ULL / 2) / 314159ULL) ++ ++/** + * IIO_G_TO_M_S_2() - Convert g to meter / second**2 + * @g: A value in g + * +@@ -649,4 +658,12 @@ int iio_str_to_fixpoint(const char *str, + */ + #define IIO_G_TO_M_S_2(g) ((g) * 980665ULL / 100000ULL) + ++/** ++ * IIO_M_S_2_TO_G() - Convert meter / second**2 to g ++ * @ms2: A value in meter / second**2 ++ * ++ * Returns the given value converted from meter / second**2 to g ++ */ ++#define IIO_M_S_2_TO_G(ms2) (((ms2) * 100000ULL + 980665ULL / 2) / 980665ULL) ++ + #endif /* _INDUSTRIAL_IO_H_ */ diff --git a/kernel/kernel/files/patches/mageia/stable-iio-adis16400-fix-adis16448-gyroscope-scale.patch b/kernel/kernel/files/patches/mageia/stable-iio-adis16400-fix-adis16448-gyroscope-scale.patch new file mode 100644 index 00000000..a04deb53 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-iio-adis16400-fix-adis16448-gyroscope-scale.patch @@ -0,0 +1,30 @@ +From 8166537283b31d7abaae9e56bd48fbbc30cdc579 Mon Sep 17 00:00:00 2001 +From: Lars-Peter Clausen +Date: Wed, 5 Aug 2015 15:38:13 +0200 +Subject: iio: adis16400: Fix adis16448 gyroscope scale + +From: Lars-Peter Clausen + +commit 8166537283b31d7abaae9e56bd48fbbc30cdc579 upstream. + +Use the correct scale for the adis16448 gyroscope output. + +Signed-off-by: Lars-Peter Clausen +Signed-off-by: Jonathan Cameron +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/iio/imu/adis16400_core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/iio/imu/adis16400_core.c ++++ b/drivers/iio/imu/adis16400_core.c +@@ -780,7 +780,7 @@ static struct adis16400_chip_info adis16 + .flags = ADIS16400_HAS_PROD_ID | + ADIS16400_HAS_SERIAL_NUMBER | + ADIS16400_BURST_DIAG_STAT, +- .gyro_scale_micro = IIO_DEGREE_TO_RAD(10000), /* 0.01 deg/s */ ++ .gyro_scale_micro = IIO_DEGREE_TO_RAD(40000), /* 0.04 deg/s */ + .accel_scale_micro = IIO_G_TO_M_S_2(833), /* 1/1200 g */ + .temp_scale_nano = 73860000, /* 0.07386 C */ + .temp_offset = 31000000 / 73860, /* 31 C = 0x00 */ diff --git a/kernel/kernel/files/patches/mageia/stable-iio-adis16480-fix-scale-factors.patch b/kernel/kernel/files/patches/mageia/stable-iio-adis16480-fix-scale-factors.patch new file mode 100644 index 00000000..0fe17053 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-iio-adis16480-fix-scale-factors.patch @@ -0,0 +1,101 @@ +From 7abad1063deb0f77d275c61f58863ec319c58c5c Mon Sep 17 00:00:00 2001 +From: Lars-Peter Clausen +Date: Wed, 5 Aug 2015 15:38:15 +0200 +Subject: iio: adis16480: Fix scale factors + +From: Lars-Peter Clausen + +commit 7abad1063deb0f77d275c61f58863ec319c58c5c upstream. + +The different devices support by the adis16480 driver have slightly +different scales for the gyroscope and accelerometer channels. + +Signed-off-by: Lars-Peter Clausen +Signed-off-by: Jonathan Cameron +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/iio/imu/adis16480.c | 39 +++++++++++++++++++++++++++++++++------ + 1 file changed, 33 insertions(+), 6 deletions(-) + +--- a/drivers/iio/imu/adis16480.c ++++ b/drivers/iio/imu/adis16480.c +@@ -110,6 +110,10 @@ + struct adis16480_chip_info { + unsigned int num_channels; + const struct iio_chan_spec *channels; ++ unsigned int gyro_max_val; ++ unsigned int gyro_max_scale; ++ unsigned int accel_max_val; ++ unsigned int accel_max_scale; + }; + + struct adis16480 { +@@ -497,19 +501,21 @@ static int adis16480_set_filter_freq(str + static int adis16480_read_raw(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, int *val, int *val2, long info) + { ++ struct adis16480 *st = iio_priv(indio_dev); ++ + switch (info) { + case IIO_CHAN_INFO_RAW: + return adis_single_conversion(indio_dev, chan, 0, val); + case IIO_CHAN_INFO_SCALE: + switch (chan->type) { + case IIO_ANGL_VEL: +- *val = 0; +- *val2 = IIO_DEGREE_TO_RAD(20000); /* 0.02 degree/sec */ +- return IIO_VAL_INT_PLUS_MICRO; ++ *val = st->chip_info->gyro_max_scale; ++ *val2 = st->chip_info->gyro_max_val; ++ return IIO_VAL_FRACTIONAL; + case IIO_ACCEL: +- *val = 0; +- *val2 = IIO_G_TO_M_S_2(800); /* 0.8 mg */ +- return IIO_VAL_INT_PLUS_MICRO; ++ *val = st->chip_info->accel_max_scale; ++ *val2 = st->chip_info->accel_max_val; ++ return IIO_VAL_FRACTIONAL; + case IIO_MAGN: + *val = 0; + *val2 = 100; /* 0.0001 gauss */ +@@ -674,18 +680,39 @@ static const struct adis16480_chip_info + [ADIS16375] = { + .channels = adis16485_channels, + .num_channels = ARRAY_SIZE(adis16485_channels), ++ /* ++ * storing the value in rad/degree and the scale in degree ++ * gives us the result in rad and better precession than ++ * storing the scale directly in rad. ++ */ ++ .gyro_max_val = IIO_RAD_TO_DEGREE(22887), ++ .gyro_max_scale = 300, ++ .accel_max_val = IIO_M_S_2_TO_G(21973), ++ .accel_max_scale = 18, + }, + [ADIS16480] = { + .channels = adis16480_channels, + .num_channels = ARRAY_SIZE(adis16480_channels), ++ .gyro_max_val = IIO_RAD_TO_DEGREE(22500), ++ .gyro_max_scale = 450, ++ .accel_max_val = IIO_M_S_2_TO_G(12500), ++ .accel_max_scale = 5, + }, + [ADIS16485] = { + .channels = adis16485_channels, + .num_channels = ARRAY_SIZE(adis16485_channels), ++ .gyro_max_val = IIO_RAD_TO_DEGREE(22500), ++ .gyro_max_scale = 450, ++ .accel_max_val = IIO_M_S_2_TO_G(20000), ++ .accel_max_scale = 5, + }, + [ADIS16488] = { + .channels = adis16480_channels, + .num_channels = ARRAY_SIZE(adis16480_channels), ++ .gyro_max_val = IIO_RAD_TO_DEGREE(22500), ++ .gyro_max_scale = 450, ++ .accel_max_val = IIO_M_S_2_TO_G(22500), ++ .accel_max_scale = 18, + }, + }; + diff --git a/kernel/kernel/files/patches/mageia/stable-iio-bmg160-iio_buffer-and-iio_triggered_buffer-are-required.patch b/kernel/kernel/files/patches/mageia/stable-iio-bmg160-iio_buffer-and-iio_triggered_buffer-are-required.patch new file mode 100644 index 00000000..7983e463 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-iio-bmg160-iio_buffer-and-iio_triggered_buffer-are-required.patch @@ -0,0 +1,33 @@ +From 06d2f6ca5a38abe92f1f3a132b331eee773868c3 Mon Sep 17 00:00:00 2001 +From: Markus Pargmann +Date: Wed, 29 Jul 2015 15:46:03 +0200 +Subject: iio: bmg160: IIO_BUFFER and IIO_TRIGGERED_BUFFER are required + +From: Markus Pargmann + +commit 06d2f6ca5a38abe92f1f3a132b331eee773868c3 upstream. + +This patch adds selects for IIO_BUFFER and IIO_TRIGGERED_BUFFER. Without +IIO_BUFFER, the driver does not compile. + +Signed-off-by: Markus Pargmann +Reviewed-by: Srinivas Pandruvada +Signed-off-by: Jonathan Cameron +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/iio/gyro/Kconfig | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/iio/gyro/Kconfig ++++ b/drivers/iio/gyro/Kconfig +@@ -53,7 +53,8 @@ config ADXRS450 + config BMG160 + tristate "BOSCH BMG160 Gyro Sensor" + depends on I2C +- select IIO_TRIGGERED_BUFFER if IIO_BUFFER ++ select IIO_BUFFER ++ select IIO_TRIGGERED_BUFFER + help + Say yes here to build support for Bosch BMG160 Tri-axis Gyro Sensor + driver. This driver also supports BMI055 gyroscope. diff --git a/kernel/kernel/files/patches/mageia/stable-iio-event-remove-negative-error-code-from-iio_event_poll.patch b/kernel/kernel/files/patches/mageia/stable-iio-event-remove-negative-error-code-from-iio_event_poll.patch new file mode 100644 index 00000000..3fa720d9 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-iio-event-remove-negative-error-code-from-iio_event_poll.patch @@ -0,0 +1,33 @@ +From 41d903c00051d8f31c98a8136edbac67e6f8688f Mon Sep 17 00:00:00 2001 +From: Cristina Opriceana +Date: Mon, 3 Aug 2015 13:00:47 +0300 +Subject: iio: event: Remove negative error code from iio_event_poll + +From: Cristina Opriceana + +commit 41d903c00051d8f31c98a8136edbac67e6f8688f upstream. + +Negative return values are not supported by iio_event_poll since +its return type is unsigned int. + +Fixes: f18e7a068a0a3 ("iio: Return -ENODEV for file operations if the device has been unregistered") + +Signed-off-by: Cristina Opriceana +Signed-off-by: Jonathan Cameron +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/iio/industrialio-event.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/iio/industrialio-event.c ++++ b/drivers/iio/industrialio-event.c +@@ -84,7 +84,7 @@ static unsigned int iio_event_poll(struc + unsigned int events = 0; + + if (!indio_dev->info) +- return -ENODEV; ++ return events; + + poll_wait(filep, &ev_int->wait, wait); + diff --git a/kernel/kernel/files/patches/mageia/stable-iio-industrialio-buffer-fix-iio_buffer_poll-return-value.patch b/kernel/kernel/files/patches/mageia/stable-iio-industrialio-buffer-fix-iio_buffer_poll-return-value.patch new file mode 100644 index 00000000..4549873a --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-iio-industrialio-buffer-fix-iio_buffer_poll-return-value.patch @@ -0,0 +1,34 @@ +From 1bdc0293901cbea23c6dc29432e81919d4719844 Mon Sep 17 00:00:00 2001 +From: Cristina Opriceana +Date: Mon, 3 Aug 2015 13:37:40 +0300 +Subject: iio: industrialio-buffer: Fix iio_buffer_poll return value + +From: Cristina Opriceana + +commit 1bdc0293901cbea23c6dc29432e81919d4719844 upstream. + +Change return value to 0 if no device is bound since +unsigned int cannot support negative error codes. + +Fixes: f18e7a068 ("iio: Return -ENODEV for file operations if the +device has been unregistered") + +Signed-off-by: Cristina Opriceana +Signed-off-by: Jonathan Cameron +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/iio/industrialio-buffer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/iio/industrialio-buffer.c ++++ b/drivers/iio/industrialio-buffer.c +@@ -151,7 +151,7 @@ unsigned int iio_buffer_poll(struct file + struct iio_buffer *rb = indio_dev->buffer; + + if (!indio_dev->info) +- return -ENODEV; ++ return 0; + + poll_wait(filp, &rb->pollq, wait); + if (iio_buffer_ready(indio_dev, rb, rb->watermark, 0)) diff --git a/kernel/kernel/files/patches/mageia/stable-ipc-sem-fix-use-after-free-on-ipc_rmid-after-a-task-using-same-semaphore-set-exits.patch b/kernel/kernel/files/patches/mageia/stable-ipc-sem-fix-use-after-free-on-ipc_rmid-after-a-task-using-same-semaphore-set-exits.patch deleted file mode 100644 index 22323f88..00000000 --- a/kernel/kernel/files/patches/mageia/stable-ipc-sem-fix-use-after-free-on-ipc_rmid-after-a-task-using-same-semaphore-set-exits.patch +++ /dev/null @@ -1,254 +0,0 @@ -From 602b8593d2b4138c10e922eeaafe306f6b51817b Mon Sep 17 00:00:00 2001 -From: "Herton R. Krzesinski" -Date: Fri, 14 Aug 2015 15:35:02 -0700 -Subject: ipc,sem: fix use after free on IPC_RMID after a task using same semaphore set exits - -From: "Herton R. Krzesinski" - -commit 602b8593d2b4138c10e922eeaafe306f6b51817b upstream. - -The current semaphore code allows a potential use after free: in -exit_sem we may free the task's sem_undo_list while there is still -another task looping through the same semaphore set and cleaning the -sem_undo list at freeary function (the task called IPC_RMID for the same -semaphore set). - -For example, with a test program [1] running which keeps forking a lot -of processes (which then do a semop call with SEM_UNDO flag), and with -the parent right after removing the semaphore set with IPC_RMID, and a -kernel built with CONFIG_SLAB, CONFIG_SLAB_DEBUG and -CONFIG_DEBUG_SPINLOCK, you can easily see something like the following -in the kernel log: - - Slab corruption (Not tainted): kmalloc-64 start=ffff88003b45c1c0, len=64 - 000: 6b 6b 6b 6b 6b 6b 6b 6b 00 6b 6b 6b 6b 6b 6b 6b kkkkkkkk.kkkkkkk - 010: ff ff ff ff 6b 6b 6b 6b ff ff ff ff ff ff ff ff ....kkkk........ - Prev obj: start=ffff88003b45c180, len=64 - 000: 00 00 00 00 ad 4e ad de ff ff ff ff 5a 5a 5a 5a .....N......ZZZZ - 010: ff ff ff ff ff ff ff ff c0 fb 01 37 00 88 ff ff ...........7.... - Next obj: start=ffff88003b45c200, len=64 - 000: 00 00 00 00 ad 4e ad de ff ff ff ff 5a 5a 5a 5a .....N......ZZZZ - 010: ff ff ff ff ff ff ff ff 68 29 a7 3c 00 88 ff ff ........h).<.... - BUG: spinlock wrong CPU on CPU#2, test/18028 - general protection fault: 0000 [#1] SMP - Modules linked in: 8021q mrp garp stp llc nf_conntrack_ipv4 nf_defrag_ipv4 ip6t_REJECT nf_reject_ipv6 nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables binfmt_misc ppdev input_leds joydev parport_pc parport floppy serio_raw virtio_balloon virtio_rng virtio_console virtio_net iosf_mbi crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcspkr qxl ttm drm_kms_helper drm snd_hda_codec_generic i2c_piix4 snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore crc32c_intel virtio_pci virtio_ring virtio pata_acpi ata_generic [last unloaded: speedstep_lib] - CPU: 2 PID: 18028 Comm: test Not tainted 4.2.0-rc5+ #1 - Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.8.1-20150318_183358- 04/01/2014 - RIP: spin_dump+0x53/0xc0 - Call Trace: - spin_bug+0x30/0x40 - do_raw_spin_unlock+0x71/0xa0 - _raw_spin_unlock+0xe/0x10 - freeary+0x82/0x2a0 - ? _raw_spin_lock+0xe/0x10 - semctl_down.clone.0+0xce/0x160 - ? __do_page_fault+0x19a/0x430 - ? __audit_syscall_entry+0xa8/0x100 - SyS_semctl+0x236/0x2c0 - ? syscall_trace_leave+0xde/0x130 - entry_SYSCALL_64_fastpath+0x12/0x71 - Code: 8b 80 88 03 00 00 48 8d 88 60 05 00 00 48 c7 c7 a0 2c a4 81 31 c0 65 8b 15 eb 40 f3 7e e8 08 31 68 00 4d 85 e4 44 8b 4b 08 74 5e <45> 8b 84 24 88 03 00 00 49 8d 8c 24 60 05 00 00 8b 53 04 48 89 - RIP [] spin_dump+0x53/0xc0 - RSP - ---[ end trace 783ebb76612867a0 ]--- - NMI watchdog: BUG: soft lockup - CPU#3 stuck for 22s! [test:18053] - Modules linked in: 8021q mrp garp stp llc nf_conntrack_ipv4 nf_defrag_ipv4 ip6t_REJECT nf_reject_ipv6 nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables binfmt_misc ppdev input_leds joydev parport_pc parport floppy serio_raw virtio_balloon virtio_rng virtio_console virtio_net iosf_mbi crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcspkr qxl ttm drm_kms_helper drm snd_hda_codec_generic i2c_piix4 snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore crc32c_intel virtio_pci virtio_ring virtio pata_acpi ata_generic [last unloaded: speedstep_lib] - CPU: 3 PID: 18053 Comm: test Tainted: G D 4.2.0-rc5+ #1 - Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.8.1-20150318_183358- 04/01/2014 - RIP: native_read_tsc+0x0/0x20 - Call Trace: - ? delay_tsc+0x40/0x70 - __delay+0xf/0x20 - do_raw_spin_lock+0x96/0x140 - _raw_spin_lock+0xe/0x10 - sem_lock_and_putref+0x11/0x70 - SYSC_semtimedop+0x7bf/0x960 - ? handle_mm_fault+0xbf6/0x1880 - ? dequeue_task_fair+0x79/0x4a0 - ? __do_page_fault+0x19a/0x430 - ? kfree_debugcheck+0x16/0x40 - ? __do_page_fault+0x19a/0x430 - ? __audit_syscall_entry+0xa8/0x100 - ? do_audit_syscall_entry+0x66/0x70 - ? syscall_trace_enter_phase1+0x139/0x160 - SyS_semtimedop+0xe/0x10 - SyS_semop+0x10/0x20 - entry_SYSCALL_64_fastpath+0x12/0x71 - Code: 47 10 83 e8 01 85 c0 89 47 10 75 08 65 48 89 3d 1f 74 ff 7e c9 c3 0f 1f 44 00 00 55 48 89 e5 e8 87 17 04 00 66 90 c9 c3 0f 1f 00 <55> 48 89 e5 0f 31 89 c1 48 89 d0 48 c1 e0 20 89 c9 48 09 c8 c9 - Kernel panic - not syncing: softlockup: hung tasks - -I wasn't able to trigger any badness on a recent kernel without the -proper config debugs enabled, however I have softlockup reports on some -kernel versions, in the semaphore code, which are similar as above (the -scenario is seen on some servers running IBM DB2 which uses semaphore -syscalls). - -The patch here fixes the race against freeary, by acquiring or waiting -on the sem_undo_list lock as necessary (exit_sem can race with freeary, -while freeary sets un->semid to -1 and removes the same sem_undo from -list_proc or when it removes the last sem_undo). - -After the patch I'm unable to reproduce the problem using the test case -[1]. - -[1] Test case used below: - - #include - #include - #include - #include - #include - #include - #include - #include - #include - - #define NSEM 1 - #define NSET 5 - - int sid[NSET]; - - void thread() - { - struct sembuf op; - int s; - uid_t pid = getuid(); - - s = rand() % NSET; - op.sem_num = pid % NSEM; - op.sem_op = 1; - op.sem_flg = SEM_UNDO; - - semop(sid[s], &op, 1); - exit(EXIT_SUCCESS); - } - - void create_set() - { - int i, j; - pid_t p; - union { - int val; - struct semid_ds *buf; - unsigned short int *array; - struct seminfo *__buf; - } un; - - /* Create and initialize semaphore set */ - for (i = 0; i < NSET; i++) { - sid[i] = semget(IPC_PRIVATE , NSEM, 0644 | IPC_CREAT); - if (sid[i] < 0) { - perror("semget"); - exit(EXIT_FAILURE); - } - } - un.val = 0; - for (i = 0; i < NSET; i++) { - for (j = 0; j < NSEM; j++) { - if (semctl(sid[i], j, SETVAL, un) < 0) - perror("semctl"); - } - } - - /* Launch threads that operate on semaphore set */ - for (i = 0; i < NSEM * NSET * NSET; i++) { - p = fork(); - if (p < 0) - perror("fork"); - if (p == 0) - thread(); - } - - /* Free semaphore set */ - for (i = 0; i < NSET; i++) { - if (semctl(sid[i], NSEM, IPC_RMID)) - perror("IPC_RMID"); - } - - /* Wait for forked processes to exit */ - while (wait(NULL)) { - if (errno == ECHILD) - break; - }; - } - - int main(int argc, char **argv) - { - pid_t p; - - srand(time(NULL)); - - while (1) { - p = fork(); - if (p < 0) { - perror("fork"); - exit(EXIT_FAILURE); - } - if (p == 0) { - create_set(); - goto end; - } - - /* Wait for forked processes to exit */ - while (wait(NULL)) { - if (errno == ECHILD) - break; - }; - } - end: - return 0; - } - -[akpm@linux-foundation.org: use normal comment layout] -Signed-off-by: Herton R. Krzesinski -Acked-by: Manfred Spraul -Cc: Davidlohr Bueso -Cc: Rafael Aquini -CC: Aristeu Rozanski -Cc: David Jeffery -Signed-off-by: Andrew Morton -Signed-off-by: Greg Kroah-Hartman - -Signed-off-by: Linus Torvalds - ---- - ipc/sem.c | 23 +++++++++++++++++------ - 1 file changed, 17 insertions(+), 6 deletions(-) - ---- a/ipc/sem.c -+++ b/ipc/sem.c -@@ -2074,17 +2074,28 @@ void exit_sem(struct task_struct *tsk) - rcu_read_lock(); - un = list_entry_rcu(ulp->list_proc.next, - struct sem_undo, list_proc); -- if (&un->list_proc == &ulp->list_proc) -- semid = -1; -- else -- semid = un->semid; -+ if (&un->list_proc == &ulp->list_proc) { -+ /* -+ * We must wait for freeary() before freeing this ulp, -+ * in case we raced with last sem_undo. There is a small -+ * possibility where we exit while freeary() didn't -+ * finish unlocking sem_undo_list. -+ */ -+ spin_unlock_wait(&ulp->lock); -+ rcu_read_unlock(); -+ break; -+ } -+ spin_lock(&ulp->lock); -+ semid = un->semid; -+ spin_unlock(&ulp->lock); - -+ /* exit_sem raced with IPC_RMID, nothing to do */ - if (semid == -1) { - rcu_read_unlock(); -- break; -+ continue; - } - -- sma = sem_obtain_object_check(tsk->nsproxy->ipc_ns, un->semid); -+ sma = sem_obtain_object_check(tsk->nsproxy->ipc_ns, semid); - /* exit_sem raced with IPC_RMID, nothing to do */ - if (IS_ERR(sma)) { - rcu_read_unlock(); diff --git a/kernel/kernel/files/patches/mageia/stable-ipc-sem.c-update-correct-memory-barriers.patch b/kernel/kernel/files/patches/mageia/stable-ipc-sem.c-update-correct-memory-barriers.patch deleted file mode 100644 index c5fbdbfd..00000000 --- a/kernel/kernel/files/patches/mageia/stable-ipc-sem.c-update-correct-memory-barriers.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 3ed1f8a99d70ea1cd1508910eb107d0edcae5009 Mon Sep 17 00:00:00 2001 -From: Manfred Spraul -Date: Fri, 14 Aug 2015 15:35:10 -0700 -Subject: ipc/sem.c: update/correct memory barriers - -From: Manfred Spraul - -commit 3ed1f8a99d70ea1cd1508910eb107d0edcae5009 upstream. - -sem_lock() did not properly pair memory barriers: - -!spin_is_locked() and spin_unlock_wait() are both only control barriers. -The code needs an acquire barrier, otherwise the cpu might perform read -operations before the lock test. - -As no primitive exists inside and since it seems -noone wants another primitive, the code creates a local primitive within -ipc/sem.c. - -With regards to -stable: - -The change of sem_wait_array() is a bugfix, the change to sem_lock() is a -nop (just a preprocessor redefinition to improve the readability). The -bugfix is necessary for all kernels that use sem_wait_array() (i.e.: -starting from 3.10). - -Signed-off-by: Manfred Spraul -Reported-by: Oleg Nesterov -Acked-by: Peter Zijlstra (Intel) -Cc: "Paul E. McKenney" -Cc: Kirill Tkhai -Cc: Ingo Molnar -Cc: Josh Poimboeuf -Cc: Davidlohr Bueso -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds -Signed-off-by: Greg Kroah-Hartman - ---- - ipc/sem.c | 18 ++++++++++++++---- - 1 file changed, 14 insertions(+), 4 deletions(-) - ---- a/ipc/sem.c -+++ b/ipc/sem.c -@@ -253,6 +253,16 @@ static void sem_rcu_free(struct rcu_head - } - - /* -+ * spin_unlock_wait() and !spin_is_locked() are not memory barriers, they -+ * are only control barriers. -+ * The code must pair with spin_unlock(&sem->lock) or -+ * spin_unlock(&sem_perm.lock), thus just the control barrier is insufficient. -+ * -+ * smp_rmb() is sufficient, as writes cannot pass the control barrier. -+ */ -+#define ipc_smp_acquire__after_spin_is_unlocked() smp_rmb() -+ -+/* - * Wait until all currently ongoing simple ops have completed. - * Caller must own sem_perm.lock. - * New simple ops cannot start, because simple ops first check -@@ -275,6 +285,7 @@ static void sem_wait_array(struct sem_ar - sem = sma->sem_base + i; - spin_unlock_wait(&sem->lock); - } -+ ipc_smp_acquire__after_spin_is_unlocked(); - } - - /* -@@ -327,13 +338,12 @@ static inline int sem_lock(struct sem_ar - /* Then check that the global lock is free */ - if (!spin_is_locked(&sma->sem_perm.lock)) { - /* -- * The ipc object lock check must be visible on all -- * cores before rechecking the complex count. Otherwise -- * we can race with another thread that does: -+ * We need a memory barrier with acquire semantics, -+ * otherwise we can race with another thread that does: - * complex_count++; - * spin_unlock(sem_perm.lock); - */ -- smp_rmb(); -+ ipc_smp_acquire__after_spin_is_unlocked(); - - /* - * Now repeat the test of complex_count: diff --git a/kernel/kernel/files/patches/mageia/stable-iwlwifi-pcie-fix-prepare-card-flow.patch b/kernel/kernel/files/patches/mageia/stable-iwlwifi-pcie-fix-prepare-card-flow.patch deleted file mode 100644 index 6aa67a1e..00000000 --- a/kernel/kernel/files/patches/mageia/stable-iwlwifi-pcie-fix-prepare-card-flow.patch +++ /dev/null @@ -1,83 +0,0 @@ -From c9fdec9f3970eeaa1b176422f46167f5f5158804 Mon Sep 17 00:00:00 2001 -From: Emmanuel Grumbach -Date: Mon, 20 Jul 2015 12:14:39 +0300 -Subject: iwlwifi: pcie: fix prepare card flow - -From: Emmanuel Grumbach - -commit c9fdec9f3970eeaa1b176422f46167f5f5158804 upstream. - -When the card is not owned by the PCIe bus, we need to -acquire ownership first. This flow is implemented in -iwl_pcie_prepare_card_hw. Because of a hardware bug, we -need to disable link power management before we can -request ownership otherwise the other user of the device -won't get notified that we are requesting the device which -will prevent us from acquire ownership. - -Same holds for the down flow where we need to make sure -that any other potential user is notified that the driver -is going down. - -Signed-off-by: Emmanuel Grumbach -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/net/wireless/iwlwifi/pcie/trans.c | 22 +++++++++++++++++++--- - 1 file changed, 19 insertions(+), 3 deletions(-) - ---- a/drivers/net/wireless/iwlwifi/pcie/trans.c -+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c -@@ -457,10 +457,16 @@ static void iwl_pcie_apm_stop(struct iwl - if (trans->cfg->device_family == IWL_DEVICE_FAMILY_7000) - iwl_set_bits_prph(trans, APMG_PCIDEV_STT_REG, - APMG_PCIDEV_STT_VAL_WAKE_ME); -- else if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) -+ else if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) { -+ iwl_set_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG, -+ CSR_RESET_LINK_PWR_MGMT_DISABLED); - iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG, - CSR_HW_IF_CONFIG_REG_PREPARE | - CSR_HW_IF_CONFIG_REG_ENABLE_PME); -+ mdelay(1); -+ iwl_clear_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG, -+ CSR_RESET_LINK_PWR_MGMT_DISABLED); -+ } - mdelay(5); - } - -@@ -555,6 +561,10 @@ static int iwl_pcie_prepare_card_hw(stru - if (ret >= 0) - return 0; - -+ iwl_set_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG, -+ CSR_RESET_LINK_PWR_MGMT_DISABLED); -+ msleep(1); -+ - for (iter = 0; iter < 10; iter++) { - /* If HW is not ready, prepare the conditions to check again */ - iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG, -@@ -562,8 +572,10 @@ static int iwl_pcie_prepare_card_hw(stru - - do { - ret = iwl_pcie_set_hw_ready(trans); -- if (ret >= 0) -- return 0; -+ if (ret >= 0) { -+ ret = 0; -+ goto out; -+ } - - usleep_range(200, 1000); - t += 200; -@@ -573,6 +585,10 @@ static int iwl_pcie_prepare_card_hw(stru - - IWL_ERR(trans, "Couldn't prepare the card\n"); - -+out: -+ iwl_clear_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG, -+ CSR_RESET_LINK_PWR_MGMT_DISABLED); -+ - return ret; - } - diff --git a/kernel/kernel/files/patches/mageia/stable-libxfs-readahead-of-dir3-data-blocks-should-use-the-read-verifier.patch b/kernel/kernel/files/patches/mageia/stable-libxfs-readahead-of-dir3-data-blocks-should-use-the-read-verifier.patch new file mode 100644 index 00000000..9c225d16 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-libxfs-readahead-of-dir3-data-blocks-should-use-the-read-verifier.patch @@ -0,0 +1,37 @@ +From 2f123bce18943fff819bc10f8868ffb9149fc622 Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Wed, 19 Aug 2015 10:33:58 +1000 +Subject: libxfs: readahead of dir3 data blocks should use the read verifier + +From: "Darrick J. Wong" + +commit 2f123bce18943fff819bc10f8868ffb9149fc622 upstream. + +In the dir3 data block readahead function, use the regular read +verifier to check the block's CRC and spot-check the block contents +instead of directly calling only the spot-checking routine. This +prevents corrupted directory data blocks from being read into the +kernel, which can lead to garbage ls output and directory loops (if +say one of the entries contains slashes and other junk). + +Signed-off-by: Darrick J. Wong +Reviewed-by: Dave Chinner +Signed-off-by: Dave Chinner +Signed-off-by: Greg Kroah-Hartman + +--- + fs/xfs/libxfs/xfs_dir2_data.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/fs/xfs/libxfs/xfs_dir2_data.c ++++ b/fs/xfs/libxfs/xfs_dir2_data.c +@@ -252,7 +252,8 @@ xfs_dir3_data_reada_verify( + return; + case cpu_to_be32(XFS_DIR2_DATA_MAGIC): + case cpu_to_be32(XFS_DIR3_DATA_MAGIC): +- xfs_dir3_data_verify(bp); ++ bp->b_ops = &xfs_dir3_data_buf_ops; ++ bp->b_ops->verify_read(bp); + return; + default: + xfs_buf_ioerror(bp, -EFSCORRUPTED); diff --git a/kernel/kernel/files/patches/mageia/stable-localmodconfig-use-kbuild-files-too.patch b/kernel/kernel/files/patches/mageia/stable-localmodconfig-use-kbuild-files-too.patch deleted file mode 100644 index 8fd1677b..00000000 --- a/kernel/kernel/files/patches/mageia/stable-localmodconfig-use-kbuild-files-too.patch +++ /dev/null @@ -1,36 +0,0 @@ -From c0ddc8c745b7f89c50385fd7aa03c78dc543fa7a Mon Sep 17 00:00:00 2001 -From: Richard Weinberger -Date: Mon, 27 Jul 2015 00:06:55 +0200 -Subject: localmodconfig: Use Kbuild files too - -From: Richard Weinberger - -commit c0ddc8c745b7f89c50385fd7aa03c78dc543fa7a upstream. - -In kbuild it is allowed to define objects in files named "Makefile" -and "Kbuild". -Currently localmodconfig reads objects only from "Makefile"s and misses -modules like nouveau. - -Link: http://lkml.kernel.org/r/1437948415-16290-1-git-send-email-richard@nod.at - -Reported-and-tested-by: Leonidas Spyropoulos -Signed-off-by: Richard Weinberger -Signed-off-by: Steven Rostedt -Signed-off-by: Greg Kroah-Hartman - ---- - scripts/kconfig/streamline_config.pl | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/scripts/kconfig/streamline_config.pl -+++ b/scripts/kconfig/streamline_config.pl -@@ -137,7 +137,7 @@ my $ksource = ($ARGV[0] ? $ARGV[0] : '.' - my $kconfig = $ARGV[1]; - my $lsmod_file = $ENV{'LSMOD'}; - --my @makefiles = `find $ksource -name Makefile 2>/dev/null`; -+my @makefiles = `find $ksource -name Makefile -or -name Kbuild 2>/dev/null`; - chomp @makefiles; - - my %depends; diff --git a/kernel/kernel/files/patches/mageia/stable-mm-hwpoison-fix-fail-isolate-hugetlbfs-page-w-refcount-held.patch b/kernel/kernel/files/patches/mageia/stable-mm-hwpoison-fix-fail-isolate-hugetlbfs-page-w-refcount-held.patch deleted file mode 100644 index 66962bb1..00000000 --- a/kernel/kernel/files/patches/mageia/stable-mm-hwpoison-fix-fail-isolate-hugetlbfs-page-w-refcount-held.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 036138080a4376e5f3e5d0cca8ac99084c5cf06e Mon Sep 17 00:00:00 2001 -From: Wanpeng Li -Date: Fri, 14 Aug 2015 15:34:59 -0700 -Subject: mm/hwpoison: fix fail isolate hugetlbfs page w/ refcount held - -From: Wanpeng Li - -commit 036138080a4376e5f3e5d0cca8ac99084c5cf06e upstream. - -Hugetlbfs pages will get a refcount in get_any_page() or -madvise_hwpoison() if soft offlining through madvise. The refcount which -is held by the soft offline path should be released if we fail to isolate -hugetlbfs pages. - -Fix it by reducing the refcount for both isolation success and failure. - -Signed-off-by: Wanpeng Li -Acked-by: Naoya Horiguchi -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds -Signed-off-by: Greg Kroah-Hartman - ---- - mm/memory-failure.c | 13 ++++++------- - 1 file changed, 6 insertions(+), 7 deletions(-) - ---- a/mm/memory-failure.c -+++ b/mm/memory-failure.c -@@ -1589,13 +1589,12 @@ static int soft_offline_huge_page(struct - unlock_page(hpage); - - ret = isolate_huge_page(hpage, &pagelist); -- if (ret) { -- /* -- * get_any_page() and isolate_huge_page() takes a refcount each, -- * so need to drop one here. -- */ -- put_page(hpage); -- } else { -+ /* -+ * get_any_page() and isolate_huge_page() takes a refcount each, -+ * so need to drop one here. -+ */ -+ put_page(hpage); -+ if (!ret) { - pr_info("soft offline: %#lx hugepage failed to isolate\n", pfn); - return -EBUSY; - } diff --git a/kernel/kernel/files/patches/mageia/stable-mm-hwpoison-fix-page-refcount-of-unknown-non-lru-page.patch b/kernel/kernel/files/patches/mageia/stable-mm-hwpoison-fix-page-refcount-of-unknown-non-lru-page.patch deleted file mode 100644 index 5179e96a..00000000 --- a/kernel/kernel/files/patches/mageia/stable-mm-hwpoison-fix-page-refcount-of-unknown-non-lru-page.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 4f32be677b124a49459e2603321c7a5605ceb9f8 Mon Sep 17 00:00:00 2001 -From: Wanpeng Li -Date: Fri, 14 Aug 2015 15:34:56 -0700 -Subject: mm/hwpoison: fix page refcount of unknown non LRU page - -From: Wanpeng Li - -commit 4f32be677b124a49459e2603321c7a5605ceb9f8 upstream. - -After trying to drain pages from pagevec/pageset, we try to get reference -count of the page again, however, the reference count of the page is not -reduced if the page is still not on LRU list. - -Fix it by adding the put_page() to drop the page reference which is from -__get_any_page(). - -Signed-off-by: Wanpeng Li -Acked-by: Naoya Horiguchi -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds -Signed-off-by: Greg Kroah-Hartman - ---- - mm/memory-failure.c | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/mm/memory-failure.c -+++ b/mm/memory-failure.c -@@ -1558,6 +1558,8 @@ static int get_any_page(struct page *pag - */ - ret = __get_any_page(page, pfn, 0); - if (!PageLRU(page)) { -+ /* Drop page reference which is from __get_any_page() */ -+ put_page(page); - pr_info("soft_offline: %#lx: unknown non LRU page type %lx\n", - pfn, page->flags); - return -EIO; diff --git a/kernel/kernel/files/patches/mageia/stable-net_41.mbox.patch b/kernel/kernel/files/patches/mageia/stable-net_41.mbox.patch deleted file mode 100644 index 0b56b06b..00000000 --- a/kernel/kernel/files/patches/mageia/stable-net_41.mbox.patch +++ /dev/null @@ -1,3345 +0,0 @@ -From 8c2854df13fbdfb163bc66939d6d09bb0ca306f6 Mon Sep 17 00:00:00 2001 -From: Angga -Date: Fri, 3 Jul 2015 14:40:52 +1200 -Subject: [PATCH 01/46] ipv6: Make MLD packets to only be processed locally - -[ Upstream commit 4c938d22c88a9ddccc8c55a85e0430e9c62b1ac5 ] - -Before commit daad151263cf ("ipv6: Make ipv6_is_mld() inline and use it -from ip6_mc_input().") MLD packets were only processed locally. After the -change, a copy of MLD packet goes through ip6_mr_input, causing -MRT6MSG_NOCACHE message to be generated to user space. - -Make MLD packet only processed locally. - -Fixes: daad151263cf ("ipv6: Make ipv6_is_mld() inline and use it from ip6_mc_input().") -Signed-off-by: Hermin Anggawijaya -Signed-off-by: David S. Miller ---- - net/ipv6/ip6_input.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c -index f2e464e..57990c9 100644 ---- a/net/ipv6/ip6_input.c -+++ b/net/ipv6/ip6_input.c -@@ -331,10 +331,10 @@ int ip6_mc_input(struct sk_buff *skb) - if (offset < 0) - goto out; - -- if (!ipv6_is_mld(skb, nexthdr, offset)) -- goto out; -+ if (ipv6_is_mld(skb, nexthdr, offset)) -+ deliver = true; - -- deliver = true; -+ goto out; - } - /* unknown RA - process it normally */ - } --- -2.1.0 - - -From b8c2c9a2ae175da385649f0855b9b9fb03b6a799 Mon Sep 17 00:00:00 2001 -From: Phil Sutter -Date: Mon, 6 Jul 2015 15:51:20 +0200 -Subject: [PATCH 02/46] rhashtable: fix for resize events during table walk - -[ Upstream commit 142b942a75cb10ede1b42bf85368d41449ab4e3b ] - -If rhashtable_walk_next detects a resize operation in progress, it jumps -to the new table and continues walking that one. But it misses to drop -the reference to it's current item, leading it to continue traversing -the new table's bucket in which the current item is sorted into, and -after reaching that bucket's end continues traversing the new table's -second bucket instead of the first one, thereby potentially missing -items. - -This fixes the rhashtable runtime test for me. Bug probably introduced -by Herbert Xu's patch eddee5ba ("rhashtable: Fix walker behaviour during -rehash") although not explicitly tested. - -Fixes: eddee5ba ("rhashtable: Fix walker behaviour during rehash") -Signed-off-by: Phil Sutter -Acked-by: Herbert Xu -Signed-off-by: David S. Miller ---- - lib/rhashtable.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/lib/rhashtable.c b/lib/rhashtable.c -index 8609378..cf910e4 100644 ---- a/lib/rhashtable.c -+++ b/lib/rhashtable.c -@@ -612,6 +612,8 @@ next: - iter->skip = 0; - } - -+ iter->p = NULL; -+ - /* Ensure we see any new tables. */ - smp_rmb(); - -@@ -622,8 +624,6 @@ next: - return ERR_PTR(-EAGAIN); - } - -- iter->p = NULL; -- - out: - - return obj; --- -2.1.0 - - -From 1ab639a7e8ab4f2263a5fdd611b33e0b9aff6b09 Mon Sep 17 00:00:00 2001 -From: Eric Dumazet -Date: Mon, 6 Jul 2015 17:13:26 +0200 -Subject: [PATCH 03/46] net: graceful exit from netif_alloc_netdev_queues() - -[ Upstream commit d339727c2b1a10f25e6636670ab6e1841170e328 ] - -User space can crash kernel with - -ip link add ifb10 numtxqueues 100000 type ifb - -We must replace a BUG_ON() by proper test and return -EINVAL for -crazy values. - -Fixes: 60877a32bce00 ("net: allow large number of tx queues") -Signed-off-by: Eric Dumazet -Signed-off-by: David S. Miller ---- - net/core/dev.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/net/core/dev.c b/net/core/dev.c -index aa82f9a..4723914 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -6297,7 +6297,8 @@ static int netif_alloc_netdev_queues(struct net_device *dev) - struct netdev_queue *tx; - size_t sz = count * sizeof(*tx); - -- BUG_ON(count < 1 || count > 0xffff); -+ if (count < 1 || count > 0xffff) -+ return -EINVAL; - - tx = kzalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT); - if (!tx) { --- -2.1.0 - - -From fa72557a85e0032a819bcd857de185da10799dd4 Mon Sep 17 00:00:00 2001 -From: Nicolas Dichtel -Date: Mon, 6 Jul 2015 17:25:10 +0200 -Subject: [PATCH 04/46] Revert "dev: set iflink to 0 for virtual interfaces" - -[ Upstream commit 95ec655bc465ccb2a3329d4aff9a45e3c8188db5 ] - -This reverts commit e1622baf54df8cc958bf29d71de5ad545ea7d93c. - -The side effect of this commit is to add a '@NONE' after each virtual -interface name with a 'ip link'. It may break existing scripts. - -Reported-by: Olivier Hartkopp -Signed-off-by: Nicolas Dichtel -Tested-by: Oliver Hartkopp -Signed-off-by: David S. Miller ---- - net/core/dev.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/net/core/dev.c b/net/core/dev.c -index 4723914..877ec57 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -672,10 +672,6 @@ int dev_get_iflink(const struct net_device *dev) - if (dev->netdev_ops && dev->netdev_ops->ndo_get_iflink) - return dev->netdev_ops->ndo_get_iflink(dev); - -- /* If dev->rtnl_link_ops is set, it's a virtual interface. */ -- if (dev->rtnl_link_ops) -- return 0; -- - return dev->ifindex; - } - EXPORT_SYMBOL(dev_get_iflink); --- -2.1.0 - - -From 75cead319911eab1b9813c55274b391128329d9b Mon Sep 17 00:00:00 2001 -From: Daniel Borkmann -Date: Tue, 7 Jul 2015 00:07:52 +0200 -Subject: [PATCH 05/46] rtnetlink: verify IFLA_VF_INFO attributes before - passing them to driver - -[ Upstream commit 4f7d2cdfdde71ffe962399b7020c674050329423 ] - -Jason Gunthorpe reported that since commit c02db8c6290b ("rtnetlink: make -SR-IOV VF interface symmetric"), we don't verify IFLA_VF_INFO attributes -anymore with respect to their policy, that is, ifla_vfinfo_policy[]. - -Before, they were part of ifla_policy[], but they have been nested since -placed under IFLA_VFINFO_LIST, that contains the attribute IFLA_VF_INFO, -which is another nested attribute for the actual VF attributes such as -IFLA_VF_MAC, IFLA_VF_VLAN, etc. - -Despite the policy being split out from ifla_policy[] in this commit, -it's never applied anywhere. nla_for_each_nested() only does basic nla_ok() -testing for struct nlattr, but it doesn't know about the data context and -their requirements. - -Fix, on top of Jason's initial work, does 1) parsing of the attributes -with the right policy, and 2) using the resulting parsed attribute table -from 1) instead of the nla_for_each_nested() loop (just like we used to -do when still part of ifla_policy[]). - -Reference: http://thread.gmane.org/gmane.linux.network/368913 -Fixes: c02db8c6290b ("rtnetlink: make SR-IOV VF interface symmetric") -Reported-by: Jason Gunthorpe -Cc: Chris Wright -Cc: Sucheta Chakraborty -Cc: Greg Rose -Cc: Jeff Kirsher -Cc: Rony Efraim -Cc: Vlad Zolotarov -Cc: Nicolas Dichtel -Cc: Thomas Graf -Signed-off-by: Jason Gunthorpe -Signed-off-by: Daniel Borkmann -Acked-by: Vlad Zolotarov -Signed-off-by: David S. Miller ---- - net/core/rtnetlink.c | 187 ++++++++++++++++++++++++++------------------------- - 1 file changed, 96 insertions(+), 91 deletions(-) - -diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c -index 8de3682..fe95cb7 100644 ---- a/net/core/rtnetlink.c -+++ b/net/core/rtnetlink.c -@@ -1287,10 +1287,6 @@ static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { - [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED }, - }; - --static const struct nla_policy ifla_vfinfo_policy[IFLA_VF_INFO_MAX+1] = { -- [IFLA_VF_INFO] = { .type = NLA_NESTED }, --}; -- - static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { - [IFLA_VF_MAC] = { .len = sizeof(struct ifla_vf_mac) }, - [IFLA_VF_VLAN] = { .len = sizeof(struct ifla_vf_vlan) }, -@@ -1437,96 +1433,98 @@ static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[]) - return 0; - } - --static int do_setvfinfo(struct net_device *dev, struct nlattr *attr) -+static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) - { -- int rem, err = -EINVAL; -- struct nlattr *vf; - const struct net_device_ops *ops = dev->netdev_ops; -+ int err = -EINVAL; - -- nla_for_each_nested(vf, attr, rem) { -- switch (nla_type(vf)) { -- case IFLA_VF_MAC: { -- struct ifla_vf_mac *ivm; -- ivm = nla_data(vf); -- err = -EOPNOTSUPP; -- if (ops->ndo_set_vf_mac) -- err = ops->ndo_set_vf_mac(dev, ivm->vf, -- ivm->mac); -- break; -- } -- case IFLA_VF_VLAN: { -- struct ifla_vf_vlan *ivv; -- ivv = nla_data(vf); -- err = -EOPNOTSUPP; -- if (ops->ndo_set_vf_vlan) -- err = ops->ndo_set_vf_vlan(dev, ivv->vf, -- ivv->vlan, -- ivv->qos); -- break; -- } -- case IFLA_VF_TX_RATE: { -- struct ifla_vf_tx_rate *ivt; -- struct ifla_vf_info ivf; -- ivt = nla_data(vf); -- err = -EOPNOTSUPP; -- if (ops->ndo_get_vf_config) -- err = ops->ndo_get_vf_config(dev, ivt->vf, -- &ivf); -- if (err) -- break; -- err = -EOPNOTSUPP; -- if (ops->ndo_set_vf_rate) -- err = ops->ndo_set_vf_rate(dev, ivt->vf, -- ivf.min_tx_rate, -- ivt->rate); -- break; -- } -- case IFLA_VF_RATE: { -- struct ifla_vf_rate *ivt; -- ivt = nla_data(vf); -- err = -EOPNOTSUPP; -- if (ops->ndo_set_vf_rate) -- err = ops->ndo_set_vf_rate(dev, ivt->vf, -- ivt->min_tx_rate, -- ivt->max_tx_rate); -- break; -- } -- case IFLA_VF_SPOOFCHK: { -- struct ifla_vf_spoofchk *ivs; -- ivs = nla_data(vf); -- err = -EOPNOTSUPP; -- if (ops->ndo_set_vf_spoofchk) -- err = ops->ndo_set_vf_spoofchk(dev, ivs->vf, -- ivs->setting); -- break; -- } -- case IFLA_VF_LINK_STATE: { -- struct ifla_vf_link_state *ivl; -- ivl = nla_data(vf); -- err = -EOPNOTSUPP; -- if (ops->ndo_set_vf_link_state) -- err = ops->ndo_set_vf_link_state(dev, ivl->vf, -- ivl->link_state); -- break; -- } -- case IFLA_VF_RSS_QUERY_EN: { -- struct ifla_vf_rss_query_en *ivrssq_en; -+ if (tb[IFLA_VF_MAC]) { -+ struct ifla_vf_mac *ivm = nla_data(tb[IFLA_VF_MAC]); - -- ivrssq_en = nla_data(vf); -- err = -EOPNOTSUPP; -- if (ops->ndo_set_vf_rss_query_en) -- err = ops->ndo_set_vf_rss_query_en(dev, -- ivrssq_en->vf, -- ivrssq_en->setting); -- break; -- } -- default: -- err = -EINVAL; -- break; -- } -- if (err) -- break; -+ err = -EOPNOTSUPP; -+ if (ops->ndo_set_vf_mac) -+ err = ops->ndo_set_vf_mac(dev, ivm->vf, -+ ivm->mac); -+ if (err < 0) -+ return err; -+ } -+ -+ if (tb[IFLA_VF_VLAN]) { -+ struct ifla_vf_vlan *ivv = nla_data(tb[IFLA_VF_VLAN]); -+ -+ err = -EOPNOTSUPP; -+ if (ops->ndo_set_vf_vlan) -+ err = ops->ndo_set_vf_vlan(dev, ivv->vf, ivv->vlan, -+ ivv->qos); -+ if (err < 0) -+ return err; -+ } -+ -+ if (tb[IFLA_VF_TX_RATE]) { -+ struct ifla_vf_tx_rate *ivt = nla_data(tb[IFLA_VF_TX_RATE]); -+ struct ifla_vf_info ivf; -+ -+ err = -EOPNOTSUPP; -+ if (ops->ndo_get_vf_config) -+ err = ops->ndo_get_vf_config(dev, ivt->vf, &ivf); -+ if (err < 0) -+ return err; -+ -+ err = -EOPNOTSUPP; -+ if (ops->ndo_set_vf_rate) -+ err = ops->ndo_set_vf_rate(dev, ivt->vf, -+ ivf.min_tx_rate, -+ ivt->rate); -+ if (err < 0) -+ return err; -+ } -+ -+ if (tb[IFLA_VF_RATE]) { -+ struct ifla_vf_rate *ivt = nla_data(tb[IFLA_VF_RATE]); -+ -+ err = -EOPNOTSUPP; -+ if (ops->ndo_set_vf_rate) -+ err = ops->ndo_set_vf_rate(dev, ivt->vf, -+ ivt->min_tx_rate, -+ ivt->max_tx_rate); -+ if (err < 0) -+ return err; - } -+ -+ if (tb[IFLA_VF_SPOOFCHK]) { -+ struct ifla_vf_spoofchk *ivs = nla_data(tb[IFLA_VF_SPOOFCHK]); -+ -+ err = -EOPNOTSUPP; -+ if (ops->ndo_set_vf_spoofchk) -+ err = ops->ndo_set_vf_spoofchk(dev, ivs->vf, -+ ivs->setting); -+ if (err < 0) -+ return err; -+ } -+ -+ if (tb[IFLA_VF_LINK_STATE]) { -+ struct ifla_vf_link_state *ivl = nla_data(tb[IFLA_VF_LINK_STATE]); -+ -+ err = -EOPNOTSUPP; -+ if (ops->ndo_set_vf_link_state) -+ err = ops->ndo_set_vf_link_state(dev, ivl->vf, -+ ivl->link_state); -+ if (err < 0) -+ return err; -+ } -+ -+ if (tb[IFLA_VF_RSS_QUERY_EN]) { -+ struct ifla_vf_rss_query_en *ivrssq_en; -+ -+ err = -EOPNOTSUPP; -+ ivrssq_en = nla_data(tb[IFLA_VF_RSS_QUERY_EN]); -+ if (ops->ndo_set_vf_rss_query_en) -+ err = ops->ndo_set_vf_rss_query_en(dev, ivrssq_en->vf, -+ ivrssq_en->setting); -+ if (err < 0) -+ return err; -+ } -+ - return err; - } - -@@ -1722,14 +1720,21 @@ static int do_setlink(const struct sk_buff *skb, - } - - if (tb[IFLA_VFINFO_LIST]) { -+ struct nlattr *vfinfo[IFLA_VF_MAX + 1]; - struct nlattr *attr; - int rem; -+ - nla_for_each_nested(attr, tb[IFLA_VFINFO_LIST], rem) { -- if (nla_type(attr) != IFLA_VF_INFO) { -+ if (nla_type(attr) != IFLA_VF_INFO || -+ nla_len(attr) < NLA_HDRLEN) { - err = -EINVAL; - goto errout; - } -- err = do_setvfinfo(dev, attr); -+ err = nla_parse_nested(vfinfo, IFLA_VF_MAX, attr, -+ ifla_vf_policy); -+ if (err < 0) -+ goto errout; -+ err = do_setvfinfo(dev, vfinfo); - if (err < 0) - goto errout; - status |= DO_SETLINK_NOTIFY; --- -2.1.0 - - -From e2205c42c1e82d357f7c5007f1507e0b9f341092 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timo=20Ter=C3=A4s?= -Date: Tue, 7 Jul 2015 08:34:13 +0300 -Subject: [PATCH 06/46] ip_tunnel: fix ipv4 pmtu check to honor inner ip header - df -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ Upstream commit fc24f2b2094366da8786f59f2606307e934cea17 ] - -Frag needed should be sent only if the inner header asked -to not fragment. Currently fragmentation is broken if the -tunnel has df set, but df was not asked in the original -packet. The tunnel's df needs to be still checked to update -internally the pmtu cache. - -Commit 23a3647bc4f93bac broke it, and this commit fixes -the ipv4 df check back to the way it was. - -Fixes: 23a3647bc4f93bac ("ip_tunnels: Use skb-len to PMTU check.") -Cc: Pravin B Shelar -Signed-off-by: Timo Teräs -Acked-by: Pravin B Shelar -Signed-off-by: David S. Miller ---- - net/ipv4/ip_tunnel.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c -index 4c2c3ba..626d9e5 100644 ---- a/net/ipv4/ip_tunnel.c -+++ b/net/ipv4/ip_tunnel.c -@@ -586,7 +586,8 @@ int ip_tunnel_encap(struct sk_buff *skb, struct ip_tunnel *t, - EXPORT_SYMBOL(ip_tunnel_encap); - - static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb, -- struct rtable *rt, __be16 df) -+ struct rtable *rt, __be16 df, -+ const struct iphdr *inner_iph) - { - struct ip_tunnel *tunnel = netdev_priv(dev); - int pkt_size = skb->len - tunnel->hlen - dev->hard_header_len; -@@ -603,7 +604,8 @@ static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb, - - if (skb->protocol == htons(ETH_P_IP)) { - if (!skb_is_gso(skb) && -- (df & htons(IP_DF)) && mtu < pkt_size) { -+ (inner_iph->frag_off & htons(IP_DF)) && -+ mtu < pkt_size) { - memset(IPCB(skb), 0, sizeof(*IPCB(skb))); - icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); - return -E2BIG; -@@ -737,7 +739,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, - goto tx_error; - } - -- if (tnl_update_pmtu(dev, skb, rt, tnl_params->frag_off)) { -+ if (tnl_update_pmtu(dev, skb, rt, tnl_params->frag_off, inner_iph)) { - ip_rt_put(rt); - goto tx_error; - } --- -2.1.0 - - -From b663e59e521c92aec57078e512f54fa6cabe998a Mon Sep 17 00:00:00 2001 -From: Stephen Smalley -Date: Tue, 7 Jul 2015 09:43:45 -0400 -Subject: [PATCH 07/46] net/tipc: initialize security state for new connection - socket - -[ Upstream commit fdd75ea8df370f206a8163786e7470c1277a5064 ] - -Calling connect() with an AF_TIPC socket would trigger a series -of error messages from SELinux along the lines of: -SELinux: Invalid class 0 -type=AVC msg=audit(1434126658.487:34500): avc: denied { } - for pid=292 comm="kworker/u16:5" scontext=system_u:system_r:kernel_t:s0 - tcontext=system_u:object_r:unlabeled_t:s0 tclass= - permissive=0 - -This was due to a failure to initialize the security state of the new -connection sock by the tipc code, leaving it with junk in the security -class field and an unlabeled secid. Add a call to security_sk_clone() -to inherit the security state from the parent socket. - -Reported-by: Tim Shearer -Signed-off-by: Stephen Smalley -Acked-by: Paul Moore -Acked-by: Ying Xue -Signed-off-by: David S. Miller ---- - net/tipc/socket.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/net/tipc/socket.c b/net/tipc/socket.c -index f485600..20cc6df 100644 ---- a/net/tipc/socket.c -+++ b/net/tipc/socket.c -@@ -2009,6 +2009,7 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags) - res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, 1); - if (res) - goto exit; -+ security_sk_clone(sock->sk, new_sock->sk); - - new_sk = new_sock->sk; - new_tsock = tipc_sk(new_sk); --- -2.1.0 - - -From b5e30ebfbf8c2b93970492ab66be1778b3114332 Mon Sep 17 00:00:00 2001 -From: Nikolay Aleksandrov -Date: Tue, 7 Jul 2015 15:55:56 +0200 -Subject: [PATCH 08/46] bridge: mdb: zero out the local br_ip variable before - use - -[ Upstream commit f1158b74e54f2e2462ba5e2f45a118246d9d5b43 ] - -Since commit b0e9a30dd669 ("bridge: Add vlan id to multicast groups") -there's a check in br_ip_equal() for a matching vlan id, but the mdb -functions were not modified to use (or at least zero it) so when an -entry was added it would have a garbage vlan id (from the local br_ip -variable in __br_mdb_add/del) and this would prevent it from being -matched and also deleted. So zero out the whole local ip var to protect -ourselves from future changes and also to fix the current bug, since -there's no vlan id support in the mdb uapi - use always vlan id 0. -Example before patch: -root@debian:~# bridge mdb add dev br0 port eth1 grp 239.0.0.1 permanent -root@debian:~# bridge mdb -dev br0 port eth1 grp 239.0.0.1 permanent -root@debian:~# bridge mdb del dev br0 port eth1 grp 239.0.0.1 permanent -RTNETLINK answers: Invalid argument - -After patch: -root@debian:~# bridge mdb add dev br0 port eth1 grp 239.0.0.1 permanent -root@debian:~# bridge mdb -dev br0 port eth1 grp 239.0.0.1 permanent -root@debian:~# bridge mdb del dev br0 port eth1 grp 239.0.0.1 permanent -root@debian:~# bridge mdb - -Signed-off-by: Nikolay Aleksandrov -Fixes: b0e9a30dd669 ("bridge: Add vlan id to multicast groups") -Signed-off-by: David S. Miller ---- - net/bridge/br_mdb.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c -index e29ad70..cc00066 100644 ---- a/net/bridge/br_mdb.c -+++ b/net/bridge/br_mdb.c -@@ -371,6 +371,7 @@ static int __br_mdb_add(struct net *net, struct net_bridge *br, - if (!p || p->br != br || p->state == BR_STATE_DISABLED) - return -EINVAL; - -+ memset(&ip, 0, sizeof(ip)); - ip.proto = entry->addr.proto; - if (ip.proto == htons(ETH_P_IP)) - ip.u.ip4 = entry->addr.u.ip4; -@@ -417,6 +418,7 @@ static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry) - if (!netif_running(br->dev) || br->multicast_disabled) - return -EINVAL; - -+ memset(&ip, 0, sizeof(ip)); - ip.proto = entry->addr.proto; - if (ip.proto == htons(ETH_P_IP)) { - if (timer_pending(&br->ip4_other_query.timer)) --- -2.1.0 - - -From fe98c4431957e308595cc5af799cb9f86c0875d1 Mon Sep 17 00:00:00 2001 -From: Oleg Nesterov -Date: Wed, 8 Jul 2015 21:42:11 +0200 -Subject: [PATCH 09/46] net: pktgen: fix race between pktgen_thread_worker() - and kthread_stop() - -[ Upstream commit fecdf8be2d91e04b0a9a4f79ff06499a36f5d14f ] - -pktgen_thread_worker() is obviously racy, kthread_stop() can come -between the kthread_should_stop() check and set_current_state(). - -Signed-off-by: Oleg Nesterov -Reported-by: Jan Stancek -Reported-by: Marcelo Leitner -Signed-off-by: David S. Miller ---- - net/core/pktgen.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/net/core/pktgen.c b/net/core/pktgen.c -index 508155b..043ea186 100644 ---- a/net/core/pktgen.c -+++ b/net/core/pktgen.c -@@ -3490,8 +3490,10 @@ static int pktgen_thread_worker(void *arg) - pktgen_rem_thread(t); - - /* Wait for kthread_stop */ -- while (!kthread_should_stop()) { -+ for (;;) { - set_current_state(TASK_INTERRUPTIBLE); -+ if (kthread_should_stop()) -+ break; - schedule(); - } - __set_current_state(TASK_RUNNING); --- -2.1.0 - - -From 15d50c4f295d8403f6fd818391e04b2c4f3e9637 Mon Sep 17 00:00:00 2001 -From: Eric Dumazet -Date: Thu, 9 Jul 2015 18:56:07 +0200 -Subject: [PATCH 10/46] bridge: fix potential crash in __netdev_pick_tx() - -[ Upstream commit a7d35f9d73e9ffa74a02304b817e579eec632f67 ] - -Commit c29390c6dfee ("xps: must clear sender_cpu before forwarding") -fixed an issue in normal forward path, caused by sender_cpu & napi_id -skb fields being an union. - -Bridge is another point where skb can be forwarded, so we need -the same cure. - -Bug triggers if packet was received on a NIC using skb_mark_napi_id() - -Fixes: 2bd82484bb4c ("xps: fix xps for stacked devices") -Signed-off-by: Eric Dumazet -Reported-by: Bob Liu -Tested-by: Bob Liu -Signed-off-by: David S. Miller ---- - net/bridge/br_forward.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c -index e97572b..0ff6e1b 100644 ---- a/net/bridge/br_forward.c -+++ b/net/bridge/br_forward.c -@@ -42,6 +42,7 @@ int br_dev_queue_push_xmit(struct sock *sk, struct sk_buff *skb) - } else { - skb_push(skb, ETH_HLEN); - br_drop_fake_rtable(skb); -+ skb_sender_cpu_clear(skb); - dev_queue_xmit(skb); - } - --- -2.1.0 - - -From 7bb85c2bd072511dd095c3c8ecbe063064ba2c5f Mon Sep 17 00:00:00 2001 -From: Julian Anastasov -Date: Thu, 9 Jul 2015 09:59:09 +0300 -Subject: [PATCH 11/46] net: do not process device backlog during - unregistration - -[ Upstream commit e9e4dd3267d0c5234c5c0f47440456b10875dec9 ] - -commit 381c759d9916 ("ipv4: Avoid crashing in ip_error") -fixes a problem where processed packet comes from device -with destroyed inetdev (dev->ip_ptr). This is not expected -because inetdev_destroy is called in NETDEV_UNREGISTER -phase and packets should not be processed after -dev_close_many() and synchronize_net(). Above fix is still -required because inetdev_destroy can be called for other -reasons. But it shows the real problem: backlog can keep -packets for long time and they do not hold reference to -device. Such packets are then delivered to upper levels -at the same time when device is unregistered. -Calling flush_backlog after NETDEV_UNREGISTER_FINAL still -accounts all packets from backlog but before that some packets -continue to be delivered to upper levels long after the -synchronize_net call which is supposed to wait the last -ones. Also, as Eric pointed out, processed packets, mostly -from other devices, can continue to add new packets to backlog. - -Fix the problem by moving flush_backlog early, after the -device driver is stopped and before the synchronize_net() call. -Then use netif_running check to make sure we do not add more -packets to backlog. We have to do it in enqueue_to_backlog -context when the local IRQ is disabled. As result, after the -flush_backlog and synchronize_net sequence all packets -should be accounted. - -Thanks to Eric W. Biederman for the test script and his -valuable feedback! - -Reported-by: Vittorio Gambaletta -Fixes: 6e583ce5242f ("net: eliminate refcounting in backlog queue") -Cc: Eric W. Biederman -Cc: Stephen Hemminger -Signed-off-by: Julian Anastasov -Signed-off-by: David S. Miller ---- - net/core/dev.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/net/core/dev.c b/net/core/dev.c -index 877ec57..cb49e01 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -3337,6 +3337,8 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, - local_irq_save(flags); - - rps_lock(sd); -+ if (!netif_running(skb->dev)) -+ goto drop; - qlen = skb_queue_len(&sd->input_pkt_queue); - if (qlen <= netdev_max_backlog && !skb_flow_limit(skb, qlen)) { - if (qlen) { -@@ -3358,6 +3360,7 @@ enqueue: - goto enqueue; - } - -+drop: - sd->dropped++; - rps_unlock(sd); - -@@ -6023,6 +6026,7 @@ static void rollback_registered_many(struct list_head *head) - unlist_netdevice(dev); - - dev->reg_state = NETREG_UNREGISTERING; -+ on_each_cpu(flush_backlog, dev, 1); - } - - synchronize_net(); -@@ -6647,8 +6651,6 @@ void netdev_run_todo(void) - - dev->reg_state = NETREG_UNREGISTERED; - -- on_each_cpu(flush_backlog, dev, 1); -- - netdev_wait_allrefs(dev); - - /* paranoia */ --- -2.1.0 - - -From c979c0e11800c79634b6b9d33ddb8f4cc03c81fa Mon Sep 17 00:00:00 2001 -From: Julian Anastasov -Date: Thu, 9 Jul 2015 09:59:10 +0300 -Subject: [PATCH 12/46] net: call rcu_read_lock early in process_backlog - -[ Upstream commit 2c17d27c36dcce2b6bf689f41a46b9e909877c21 ] - -Incoming packet should be either in backlog queue or -in RCU read-side section. Otherwise, the final sequence of -flush_backlog() and synchronize_net() may miss packets -that can run without device reference: - -CPU 1 CPU 2 - skb->dev: no reference - process_backlog:__skb_dequeue - process_backlog:local_irq_enable - -on_each_cpu for -flush_backlog => IPI(hardirq): flush_backlog - - packet not found in backlog - - CPU delayed ... -synchronize_net -- no ongoing RCU -read-side sections - -netdev_run_todo, -rcu_barrier: no -ongoing callbacks - __netif_receive_skb_core:rcu_read_lock - - too late -free dev - process packet for freed dev - -Fixes: 6e583ce5242f ("net: eliminate refcounting in backlog queue") -Cc: Eric W. Biederman -Cc: Stephen Hemminger -Signed-off-by: Julian Anastasov -Signed-off-by: David S. Miller ---- - net/core/dev.c | 30 +++++++++++++++--------------- - 1 file changed, 15 insertions(+), 15 deletions(-) - -diff --git a/net/core/dev.c b/net/core/dev.c -index cb49e01..a42b232 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -3666,8 +3666,6 @@ static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc) - - pt_prev = NULL; - -- rcu_read_lock(); -- - another_round: - skb->skb_iif = skb->dev->ifindex; - -@@ -3677,7 +3675,7 @@ another_round: - skb->protocol == cpu_to_be16(ETH_P_8021AD)) { - skb = skb_vlan_untag(skb); - if (unlikely(!skb)) -- goto unlock; -+ goto out; - } - - #ifdef CONFIG_NET_CLS_ACT -@@ -3707,7 +3705,7 @@ skip_taps: - if (static_key_false(&ingress_needed)) { - skb = handle_ing(skb, &pt_prev, &ret, orig_dev); - if (!skb) -- goto unlock; -+ goto out; - } - - skb->tc_verd = 0; -@@ -3724,7 +3722,7 @@ ncls: - if (vlan_do_receive(&skb)) - goto another_round; - else if (unlikely(!skb)) -- goto unlock; -+ goto out; - } - - rx_handler = rcu_dereference(skb->dev->rx_handler); -@@ -3736,7 +3734,7 @@ ncls: - switch (rx_handler(&skb)) { - case RX_HANDLER_CONSUMED: - ret = NET_RX_SUCCESS; -- goto unlock; -+ goto out; - case RX_HANDLER_ANOTHER: - goto another_round; - case RX_HANDLER_EXACT: -@@ -3790,8 +3788,7 @@ drop: - ret = NET_RX_DROP; - } - --unlock: -- rcu_read_unlock(); -+out: - return ret; - } - -@@ -3822,29 +3819,30 @@ static int __netif_receive_skb(struct sk_buff *skb) - - static int netif_receive_skb_internal(struct sk_buff *skb) - { -+ int ret; -+ - net_timestamp_check(netdev_tstamp_prequeue, skb); - - if (skb_defer_rx_timestamp(skb)) - return NET_RX_SUCCESS; - -+ rcu_read_lock(); -+ - #ifdef CONFIG_RPS - if (static_key_false(&rps_needed)) { - struct rps_dev_flow voidflow, *rflow = &voidflow; -- int cpu, ret; -- -- rcu_read_lock(); -- -- cpu = get_rps_cpu(skb->dev, skb, &rflow); -+ int cpu = get_rps_cpu(skb->dev, skb, &rflow); - - if (cpu >= 0) { - ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); - rcu_read_unlock(); - return ret; - } -- rcu_read_unlock(); - } - #endif -- return __netif_receive_skb(skb); -+ ret = __netif_receive_skb(skb); -+ rcu_read_unlock(); -+ return ret; - } - - /** -@@ -4389,8 +4387,10 @@ static int process_backlog(struct napi_struct *napi, int quota) - struct sk_buff *skb; - - while ((skb = __skb_dequeue(&sd->process_queue))) { -+ rcu_read_lock(); - local_irq_enable(); - __netif_receive_skb(skb); -+ rcu_read_unlock(); - local_irq_disable(); - input_queue_head_incr(sd); - if (++work >= quota) { --- -2.1.0 - - -From 9648a7edaa4326282fef3dbb8de9756d8edbfd0a Mon Sep 17 00:00:00 2001 -From: Dan Carpenter -Date: Sun, 12 Jul 2015 01:20:55 +0300 -Subject: [PATCH 13/46] net/xen-netback: off by one in BUG_ON() condition - -[ Upstream commit 50c2e4dd6749725338621fff456b26d3a592259f ] - -The > should be >=. I also added spaces around the '-' operations so -the code is a little more consistent and matches the condition better. - -Fixes: f53c3fe8dad7 ('xen-netback: Introduce TX grant mapping') -Signed-off-by: Dan Carpenter -Signed-off-by: David S. Miller ---- - drivers/net/xen-netback/netback.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c -index 0d25943..0866c5d 100644 ---- a/drivers/net/xen-netback/netback.c -+++ b/drivers/net/xen-netback/netback.c -@@ -1571,13 +1571,13 @@ static inline void xenvif_tx_dealloc_action(struct xenvif_queue *queue) - smp_rmb(); - - while (dc != dp) { -- BUG_ON(gop - queue->tx_unmap_ops > MAX_PENDING_REQS); -+ BUG_ON(gop - queue->tx_unmap_ops >= MAX_PENDING_REQS); - pending_idx = - queue->dealloc_ring[pending_index(dc++)]; - -- pending_idx_release[gop-queue->tx_unmap_ops] = -+ pending_idx_release[gop - queue->tx_unmap_ops] = - pending_idx; -- queue->pages_to_unmap[gop-queue->tx_unmap_ops] = -+ queue->pages_to_unmap[gop - queue->tx_unmap_ops] = - queue->mmap_pages[pending_idx]; - gnttab_set_unmap_op(gop, - idx_to_kaddr(queue, pending_idx), --- -2.1.0 - - -From d015db1b0649539f4473113aec24589a84c49dda Mon Sep 17 00:00:00 2001 -From: Herbert Xu -Date: Mon, 13 Jul 2015 16:04:13 +0800 -Subject: [PATCH 14/46] net: Clone skb before setting peeked flag - -[ Upstream commit 738ac1ebb96d02e0d23bc320302a6ea94c612dec ] - -Shared skbs must not be modified and this is crucial for broadcast -and/or multicast paths where we use it as an optimisation to avoid -unnecessary cloning. - -The function skb_recv_datagram breaks this rule by setting peeked -without cloning the skb first. This causes funky races which leads -to double-free. - -This patch fixes this by cloning the skb and replacing the skb -in the list when setting skb->peeked. - -Fixes: a59322be07c9 ("[UDP]: Only increment counter on first peek/recv") -Reported-by: Konstantin Khlebnikov -Signed-off-by: Herbert Xu -Signed-off-by: David S. Miller ---- - net/core/datagram.c | 41 ++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 38 insertions(+), 3 deletions(-) - -diff --git a/net/core/datagram.c b/net/core/datagram.c -index b80fb91..4e9a3f6 100644 ---- a/net/core/datagram.c -+++ b/net/core/datagram.c -@@ -131,6 +131,35 @@ out_noerr: - goto out; - } - -+static int skb_set_peeked(struct sk_buff *skb) -+{ -+ struct sk_buff *nskb; -+ -+ if (skb->peeked) -+ return 0; -+ -+ /* We have to unshare an skb before modifying it. */ -+ if (!skb_shared(skb)) -+ goto done; -+ -+ nskb = skb_clone(skb, GFP_ATOMIC); -+ if (!nskb) -+ return -ENOMEM; -+ -+ skb->prev->next = nskb; -+ skb->next->prev = nskb; -+ nskb->prev = skb->prev; -+ nskb->next = skb->next; -+ -+ consume_skb(skb); -+ skb = nskb; -+ -+done: -+ skb->peeked = 1; -+ -+ return 0; -+} -+ - /** - * __skb_recv_datagram - Receive a datagram skbuff - * @sk: socket -@@ -165,7 +194,9 @@ out_noerr: - struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, - int *peeked, int *off, int *err) - { -+ struct sk_buff_head *queue = &sk->sk_receive_queue; - struct sk_buff *skb, *last; -+ unsigned long cpu_flags; - long timeo; - /* - * Caller is allowed not to check sk->sk_err before skb_recv_datagram() -@@ -184,8 +215,6 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, - * Look at current nfs client by the way... - * However, this function was correct in any case. 8) - */ -- unsigned long cpu_flags; -- struct sk_buff_head *queue = &sk->sk_receive_queue; - int _off = *off; - - last = (struct sk_buff *)queue; -@@ -199,7 +228,11 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, - _off -= skb->len; - continue; - } -- skb->peeked = 1; -+ -+ error = skb_set_peeked(skb); -+ if (error) -+ goto unlock_err; -+ - atomic_inc(&skb->users); - } else - __skb_unlink(skb, queue); -@@ -223,6 +256,8 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, - - return NULL; - -+unlock_err: -+ spin_unlock_irqrestore(&queue->lock, cpu_flags); - no_packet: - *err = error; - return NULL; --- -2.1.0 - - -From cf2492918d52dee5f35b16cbba65d7000ff35ce2 Mon Sep 17 00:00:00 2001 -From: Herbert Xu -Date: Mon, 13 Jul 2015 20:01:42 +0800 -Subject: [PATCH 15/46] net: Fix skb csum races when peeking - -[ Upstream commit 89c22d8c3b278212eef6a8cc66b570bc840a6f5a ] - -When we calculate the checksum on the recv path, we store the -result in the skb as an optimisation in case we need the checksum -again down the line. - -This is in fact bogus for the MSG_PEEK case as this is done without -any locking. So multiple threads can peek and then store the result -to the same skb, potentially resulting in bogus skb states. - -This patch fixes this by only storing the result if the skb is not -shared. This preserves the optimisations for the few cases where -it can be done safely due to locking or other reasons, e.g., SIOCINQ. - -Signed-off-by: Herbert Xu -Acked-by: Eric Dumazet -Signed-off-by: David S. Miller ---- - net/core/datagram.c | 15 +++++++++------ - 1 file changed, 9 insertions(+), 6 deletions(-) - -diff --git a/net/core/datagram.c b/net/core/datagram.c -index 4e9a3f6..4967262 100644 ---- a/net/core/datagram.c -+++ b/net/core/datagram.c -@@ -657,7 +657,8 @@ __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len) - !skb->csum_complete_sw) - netdev_rx_csum_fault(skb->dev); - } -- skb->csum_valid = !sum; -+ if (!skb_shared(skb)) -+ skb->csum_valid = !sum; - return sum; - } - EXPORT_SYMBOL(__skb_checksum_complete_head); -@@ -677,11 +678,13 @@ __sum16 __skb_checksum_complete(struct sk_buff *skb) - netdev_rx_csum_fault(skb->dev); - } - -- /* Save full packet checksum */ -- skb->csum = csum; -- skb->ip_summed = CHECKSUM_COMPLETE; -- skb->csum_complete_sw = 1; -- skb->csum_valid = !sum; -+ if (!skb_shared(skb)) { -+ /* Save full packet checksum */ -+ skb->csum = csum; -+ skb->ip_summed = CHECKSUM_COMPLETE; -+ skb->csum_complete_sw = 1; -+ skb->csum_valid = !sum; -+ } - - return sum; - } --- -2.1.0 - - -From e2d3e7bcf6679da22c3a68837c4b3c78db3ec110 Mon Sep 17 00:00:00 2001 -From: Herbert Xu -Date: Tue, 4 Aug 2015 15:42:47 +0800 -Subject: [PATCH 16/46] net: Fix skb_set_peeked use-after-free bug - -[ Upstream commit a0a2a6602496a45ae838a96db8b8173794b5d398 ] - -The commit 738ac1ebb96d02e0d23bc320302a6ea94c612dec ("net: Clone -skb before setting peeked flag") introduced a use-after-free bug -in skb_recv_datagram. This is because skb_set_peeked may create -a new skb and free the existing one. As it stands the caller will -continue to use the old freed skb. - -This patch fixes it by making skb_set_peeked return the new skb -(or the old one if unchanged). - -Fixes: 738ac1ebb96d ("net: Clone skb before setting peeked flag") -Reported-by: Brenden Blanco -Signed-off-by: Herbert Xu -Tested-by: Brenden Blanco -Reviewed-by: Konstantin Khlebnikov -Signed-off-by: David S. Miller ---- - net/core/datagram.c | 13 +++++++------ - 1 file changed, 7 insertions(+), 6 deletions(-) - -diff --git a/net/core/datagram.c b/net/core/datagram.c -index 4967262..617088a 100644 ---- a/net/core/datagram.c -+++ b/net/core/datagram.c -@@ -131,12 +131,12 @@ out_noerr: - goto out; - } - --static int skb_set_peeked(struct sk_buff *skb) -+static struct sk_buff *skb_set_peeked(struct sk_buff *skb) - { - struct sk_buff *nskb; - - if (skb->peeked) -- return 0; -+ return skb; - - /* We have to unshare an skb before modifying it. */ - if (!skb_shared(skb)) -@@ -144,7 +144,7 @@ static int skb_set_peeked(struct sk_buff *skb) - - nskb = skb_clone(skb, GFP_ATOMIC); - if (!nskb) -- return -ENOMEM; -+ return ERR_PTR(-ENOMEM); - - skb->prev->next = nskb; - skb->next->prev = nskb; -@@ -157,7 +157,7 @@ static int skb_set_peeked(struct sk_buff *skb) - done: - skb->peeked = 1; - -- return 0; -+ return skb; - } - - /** -@@ -229,8 +229,9 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, - continue; - } - -- error = skb_set_peeked(skb); -- if (error) -+ skb = skb_set_peeked(skb); -+ error = PTR_ERR(skb); -+ if (IS_ERR(skb)) - goto unlock_err; - - atomic_inc(&skb->users); --- -2.1.0 - - -From f82e3fd078652a9b64f6b129d5b8eddb76481093 Mon Sep 17 00:00:00 2001 -From: Nikolay Aleksandrov -Date: Mon, 13 Jul 2015 06:36:19 -0700 -Subject: [PATCH 17/46] bridge: mdb: fix double add notification - -[ Upstream commit 5ebc784625ea68a9570d1f70557e7932988cd1b4 ] - -Since the mdb add/del code was introduced there have been 2 br_mdb_notify -calls when doing br_mdb_add() resulting in 2 notifications on each add. - -Example: - Command: bridge mdb add dev br0 port eth1 grp 239.0.0.1 permanent - Before patch: - root@debian:~# bridge monitor all - [MDB]dev br0 port eth1 grp 239.0.0.1 permanent - [MDB]dev br0 port eth1 grp 239.0.0.1 permanent - - After patch: - root@debian:~# bridge monitor all - [MDB]dev br0 port eth1 grp 239.0.0.1 permanent - -Signed-off-by: Nikolay Aleksandrov -Fixes: cfd567543590 ("bridge: add support of adding and deleting mdb entries") -Signed-off-by: David S. Miller ---- - net/bridge/br_mdb.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c -index cc00066..d1f910c 100644 ---- a/net/bridge/br_mdb.c -+++ b/net/bridge/br_mdb.c -@@ -348,7 +348,6 @@ static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port, - return -ENOMEM; - rcu_assign_pointer(*pp, p); - -- br_mdb_notify(br->dev, port, group, RTM_NEWMDB); - return 0; - } - --- -2.1.0 - - -From 8e96bd6de5d8c4acd2faeb9b950bd2ff42a8275a Mon Sep 17 00:00:00 2001 -From: WANG Cong -Date: Mon, 13 Jul 2015 12:30:07 -0700 -Subject: [PATCH 18/46] fq_codel: fix a use-after-free - -[ Upstream commit 052cbda41fdc243a8d40cce7ab3a6327b4b2887e ] - -Fixes: 25331d6ce42b ("net: sched: implement qstat helper routines") -Cc: John Fastabend -Signed-off-by: Cong Wang -Signed-off-by: Cong Wang -Acked-by: Eric Dumazet -Signed-off-by: David S. Miller ---- - net/sched/sch_fq_codel.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c -index c244c45b..9291598 100644 ---- a/net/sched/sch_fq_codel.c -+++ b/net/sched/sch_fq_codel.c -@@ -162,10 +162,10 @@ static unsigned int fq_codel_drop(struct Qdisc *sch) - skb = dequeue_head(flow); - len = qdisc_pkt_len(skb); - q->backlogs[idx] -= len; -- kfree_skb(skb); - sch->q.qlen--; - qdisc_qstats_drop(sch); - qdisc_qstats_backlog_dec(sch, skb); -+ kfree_skb(skb); - flow->dropped++; - return idx; - } --- -2.1.0 - - -From d4657581d01faad94a50b03f31bbe33c3b6dcb14 Mon Sep 17 00:00:00 2001 -From: Tilman Schmidt -Date: Tue, 14 Jul 2015 00:37:13 +0200 -Subject: [PATCH 19/46] isdn/gigaset: reset tty->receive_room when attaching - ser_gigaset - -[ Upstream commit fd98e9419d8d622a4de91f76b306af6aa627aa9c ] - -Commit 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc"), -first merged in kernel release 3.10, caused the following regression -in the Gigaset M101 driver: - -Before that commit, when closing the N_TTY line discipline in -preparation to switching to N_GIGASET_M101, receive_room would be -reset to a non-zero value by the call to n_tty_flush_buffer() in -n_tty's close method. With the removal of that call, receive_room -might be left at zero, blocking data reception on the serial line. - -The present patch fixes that regression by setting receive_room -to an appropriate value in the ldisc open method. - -Fixes: 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc") -Signed-off-by: Tilman Schmidt -Signed-off-by: David S. Miller ---- - drivers/isdn/gigaset/ser-gigaset.c | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c -index 8c91fd5..3ac9c41 100644 ---- a/drivers/isdn/gigaset/ser-gigaset.c -+++ b/drivers/isdn/gigaset/ser-gigaset.c -@@ -524,9 +524,18 @@ gigaset_tty_open(struct tty_struct *tty) - cs->hw.ser->tty = tty; - atomic_set(&cs->hw.ser->refcnt, 1); - init_completion(&cs->hw.ser->dead_cmp); -- - tty->disc_data = cs; - -+ /* Set the amount of data we're willing to receive per call -+ * from the hardware driver to half of the input buffer size -+ * to leave some reserve. -+ * Note: We don't do flow control towards the hardware driver. -+ * If more data is received than will fit into the input buffer, -+ * it will be dropped and an error will be logged. This should -+ * never happen as the device is slow and the buffer size ample. -+ */ -+ tty->receive_room = RBUFSIZE/2; -+ - /* OK.. Initialization of the datastructures and the HW is done.. Now - * startup system and notify the LL that we are ready to run - */ --- -2.1.0 - - -From a5802a78d70219bb1f2e5f6726486e3834b1270d Mon Sep 17 00:00:00 2001 -From: Eric Dumazet -Date: Tue, 14 Jul 2015 08:10:22 +0200 -Subject: [PATCH 20/46] ipv6: lock socket in ip6_datagram_connect() - -[ Upstream commit 03645a11a570d52e70631838cb786eb4253eb463 ] - -ip6_datagram_connect() is doing a lot of socket changes without -socket being locked. - -This looks wrong, at least for udp_lib_rehash() which could corrupt -lists because of concurrent udp_sk(sk)->udp_portaddr_hash accesses. - -Signed-off-by: Eric Dumazet -Acked-by: Herbert Xu -Signed-off-by: David S. Miller ---- - include/net/ip.h | 1 + - net/ipv4/datagram.c | 16 ++++++++++++---- - net/ipv6/datagram.c | 20 +++++++++++++++----- - 3 files changed, 28 insertions(+), 9 deletions(-) - -diff --git a/include/net/ip.h b/include/net/ip.h -index d14af7e..f41fc49 100644 ---- a/include/net/ip.h -+++ b/include/net/ip.h -@@ -161,6 +161,7 @@ static inline __u8 get_rtconn_flags(struct ipcm_cookie* ipc, struct sock* sk) - } - - /* datagram.c */ -+int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); - int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); - - void ip4_datagram_release_cb(struct sock *sk); -diff --git a/net/ipv4/datagram.c b/net/ipv4/datagram.c -index 90c0e83..574fad9 100644 ---- a/net/ipv4/datagram.c -+++ b/net/ipv4/datagram.c -@@ -20,7 +20,7 @@ - #include - #include - --int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) -+int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) - { - struct inet_sock *inet = inet_sk(sk); - struct sockaddr_in *usin = (struct sockaddr_in *) uaddr; -@@ -39,8 +39,6 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) - - sk_dst_reset(sk); - -- lock_sock(sk); -- - oif = sk->sk_bound_dev_if; - saddr = inet->inet_saddr; - if (ipv4_is_multicast(usin->sin_addr.s_addr)) { -@@ -82,9 +80,19 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) - sk_dst_set(sk, &rt->dst); - err = 0; - out: -- release_sock(sk); - return err; - } -+EXPORT_SYMBOL(__ip4_datagram_connect); -+ -+int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) -+{ -+ int res; -+ -+ lock_sock(sk); -+ res = __ip4_datagram_connect(sk, uaddr, addr_len); -+ release_sock(sk); -+ return res; -+} - EXPORT_SYMBOL(ip4_datagram_connect); - - /* Because UDP xmit path can manipulate sk_dst_cache without holding -diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c -index 62d908e..b10a889 100644 ---- a/net/ipv6/datagram.c -+++ b/net/ipv6/datagram.c -@@ -40,7 +40,7 @@ static bool ipv6_mapped_addr_any(const struct in6_addr *a) - return ipv6_addr_v4mapped(a) && (a->s6_addr32[3] == 0); - } - --int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) -+static int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) - { - struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; - struct inet_sock *inet = inet_sk(sk); -@@ -56,7 +56,7 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) - if (usin->sin6_family == AF_INET) { - if (__ipv6_only_sock(sk)) - return -EAFNOSUPPORT; -- err = ip4_datagram_connect(sk, uaddr, addr_len); -+ err = __ip4_datagram_connect(sk, uaddr, addr_len); - goto ipv4_connected; - } - -@@ -98,9 +98,9 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) - sin.sin_addr.s_addr = daddr->s6_addr32[3]; - sin.sin_port = usin->sin6_port; - -- err = ip4_datagram_connect(sk, -- (struct sockaddr *) &sin, -- sizeof(sin)); -+ err = __ip4_datagram_connect(sk, -+ (struct sockaddr *) &sin, -+ sizeof(sin)); - - ipv4_connected: - if (err) -@@ -204,6 +204,16 @@ out: - fl6_sock_release(flowlabel); - return err; - } -+ -+int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) -+{ -+ int res; -+ -+ lock_sock(sk); -+ res = __ip6_datagram_connect(sk, uaddr, addr_len); -+ release_sock(sk); -+ return res; -+} - EXPORT_SYMBOL_GPL(ip6_datagram_connect); - - int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *uaddr, --- -2.1.0 - - -From 1c0df6bdc731f7692a1fafd9c606135ba714e7c6 Mon Sep 17 00:00:00 2001 -From: Nikolay Aleksandrov -Date: Wed, 15 Jul 2015 21:52:51 +0200 -Subject: [PATCH 21/46] bonding: fix destruction of bond with devices different - from arphrd_ether - -[ Upstream commit 06f6d1094aa0992432b1e2a0920b0ee86ccd83bf ] - -When the bonding is being unloaded and the netdevice notifier is -unregistered it executes NETDEV_UNREGISTER for each device which should -remove the bond's proc entry but if the device enslaved is not of -ARPHRD_ETHER type and is in front of the bonding, it may execute -bond_release_and_destroy() first which would release the last slave and -destroy the bond device leaving the proc entry and thus we will get the -following error (with dynamic debug on for bond_netdev_event to see the -events order): -[ 908.963051] eql: event: 9 -[ 908.963052] eql: IFF_SLAVE -[ 908.963054] eql: event: 2 -[ 908.963056] eql: IFF_SLAVE -[ 908.963058] eql: event: 6 -[ 908.963059] eql: IFF_SLAVE -[ 908.963110] bond0: Releasing active interface eql -[ 908.976168] bond0: Destroying bond bond0 -[ 908.976266] bond0 (unregistering): Released all slaves -[ 908.984097] ------------[ cut here ]------------ -[ 908.984107] WARNING: CPU: 0 PID: 1787 at fs/proc/generic.c:575 -remove_proc_entry+0x112/0x160() -[ 908.984110] remove_proc_entry: removing non-empty directory -'net/bonding', leaking at least 'bond0' -[ 908.984111] Modules linked in: bonding(-) eql(O) 9p nfsd auth_rpcgss -oid_registry nfs_acl nfs lockd grace fscache sunrpc crct10dif_pclmul -crc32_pclmul crc32c_intel ghash_clmulni_intel ppdev qxl drm_kms_helper -snd_hda_codec_generic aesni_intel ttm aes_x86_64 glue_helper pcspkr lrw -gf128mul ablk_helper cryptd snd_hda_intel virtio_console snd_hda_codec -psmouse serio_raw snd_hwdep snd_hda_core 9pnet_virtio 9pnet evdev joydev -drm virtio_balloon snd_pcm snd_timer snd soundcore i2c_piix4 i2c_core -pvpanic acpi_cpufreq parport_pc parport processor thermal_sys button -autofs4 ext4 crc16 mbcache jbd2 hid_generic usbhid hid sg sr_mod cdrom -ata_generic virtio_blk virtio_net floppy ata_piix e1000 libata ehci_pci -virtio_pci scsi_mod uhci_hcd ehci_hcd virtio_ring virtio usbcore -usb_common [last unloaded: bonding] - -[ 908.984168] CPU: 0 PID: 1787 Comm: rmmod Tainted: G W O -4.2.0-rc2+ #8 -[ 908.984170] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 -[ 908.984172] 0000000000000000 ffffffff81732d41 ffffffff81525b34 -ffff8800358dfda8 -[ 908.984175] ffffffff8106c521 ffff88003595af78 ffff88003595af40 -ffff88003e3a4280 -[ 908.984178] ffffffffa058d040 0000000000000000 ffffffff8106c59a -ffffffff8172ebd0 -[ 908.984181] Call Trace: -[ 908.984188] [] ? dump_stack+0x40/0x50 -[ 908.984193] [] ? warn_slowpath_common+0x81/0xb0 -[ 908.984196] [] ? warn_slowpath_fmt+0x4a/0x50 -[ 908.984199] [] ? remove_proc_entry+0x112/0x160 -[ 908.984205] [] ? bond_destroy_proc_dir+0x26/0x30 -[bonding] -[ 908.984208] [] ? bond_net_exit+0x8e/0xa0 [bonding] -[ 908.984217] [] ? ops_exit_list.isra.4+0x37/0x70 -[ 908.984225] [] ? -unregister_pernet_operations+0x8d/0xd0 -[ 908.984228] [] ? -unregister_pernet_subsys+0x1d/0x30 -[ 908.984232] [] ? bonding_exit+0x23/0xdba [bonding] -[ 908.984236] [] ? SyS_delete_module+0x18a/0x250 -[ 908.984241] [] ? task_work_run+0x89/0xc0 -[ 908.984244] [] ? -entry_SYSCALL_64_fastpath+0x16/0x75 -[ 908.984247] ---[ end trace 7c006ed4abbef24b ]--- - -Thus remove the proc entry manually if bond_release_and_destroy() is -used. Because of the checks in bond_remove_proc_entry() it's not a -problem for a bond device to change namespaces (the bug fixed by the -Fixes commit) but since commit -f9399814927ad ("bonding: Don't allow bond devices to change network -namespaces.") that can't happen anyway. - -Reported-by: Carol Soto -Signed-off-by: Nikolay Aleksandrov -Fixes: a64d49c3dd50 ("bonding: Manage /proc/net/bonding/ entries from - the netdev events") -Tested-by: Carol L Soto -Signed-off-by: David S. Miller ---- - drivers/net/bonding/bond_main.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c -index d5fe5d5..6a4e523 100644 ---- a/drivers/net/bonding/bond_main.c -+++ b/drivers/net/bonding/bond_main.c -@@ -1902,6 +1902,7 @@ static int bond_release_and_destroy(struct net_device *bond_dev, - bond_dev->priv_flags |= IFF_DISABLE_NETPOLL; - netdev_info(bond_dev, "Destroying bond %s\n", - bond_dev->name); -+ bond_remove_proc_entry(bond); - unregister_netdevice(bond_dev); - } - return ret; --- -2.1.0 - - -From 69200c77f33e23a81609bc618659a4859c188a98 Mon Sep 17 00:00:00 2001 -From: Herbert Xu -Date: Mon, 20 Jul 2015 17:55:38 +0800 -Subject: [PATCH 22/46] Revert "sit: Add gro callbacks to sit_offload" - -[ Upstream commit fdbf5b097bbd9693a86c0b8bfdd071a9a2117cfc ] - -This patch reverts 19424e052fb44da2f00d1a868cbb51f3e9f4bbb5 ("sit: -Add gro callbacks to sit_offload") because it generates packets -that cannot be handled even by our own GSO. - -Reported-by: Wolfgang Walter -Signed-off-by: Herbert Xu -Signed-off-by: David S. Miller ---- - net/ipv6/ip6_offload.c | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c -index e893cd1..08b6204 100644 ---- a/net/ipv6/ip6_offload.c -+++ b/net/ipv6/ip6_offload.c -@@ -292,8 +292,6 @@ static struct packet_offload ipv6_packet_offload __read_mostly = { - static const struct net_offload sit_offload = { - .callbacks = { - .gso_segment = ipv6_gso_segment, -- .gro_receive = ipv6_gro_receive, -- .gro_complete = ipv6_gro_complete, - }, - }; - --- -2.1.0 - - -From 0479ad88a4eb6dd0d05a5712ff1d489fc27feaa4 Mon Sep 17 00:00:00 2001 -From: dingtianhong -Date: Thu, 16 Jul 2015 16:30:02 +0800 -Subject: [PATCH 23/46] bonding: correct the MAC address for "follow" - fail_over_mac policy - -[ Upstream commit a951bc1e6ba58f11df5ed5ddc41311e10f5fd20b ] - -The "follow" fail_over_mac policy is useful for multiport devices that -either become confused or incur a performance penalty when multiple -ports are programmed with the same MAC address, but the same MAC -address still may happened by this steps for this policy: - -1) echo +eth0 > /sys/class/net/bond0/bonding/slaves - bond0 has the same mac address with eth0, it is MAC1. - -2) echo +eth1 > /sys/class/net/bond0/bonding/slaves - eth1 is backup, eth1 has MAC2. - -3) ifconfig eth0 down - eth1 became active slave, bond will swap MAC for eth0 and eth1, - so eth1 has MAC1, and eth0 has MAC2. - -4) ifconfig eth1 down - there is no active slave, and eth1 still has MAC1, eth2 has MAC2. - -5) ifconfig eth0 up - the eth0 became active slave again, the bond set eth0 to MAC1. - -Something wrong here, then if you set eth1 up, the eth0 and eth1 will have the same -MAC address, it will break this policy for ACTIVE_BACKUP mode. - -This patch will fix this problem by finding the old active slave and -swap them MAC address before change active slave. - -Signed-off-by: Ding Tianhong -Tested-by: Nikolay Aleksandrov -Signed-off-by: David S. Miller ---- - drivers/net/bonding/bond_main.c | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) - -diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c -index 6a4e523..16d87bf 100644 ---- a/drivers/net/bonding/bond_main.c -+++ b/drivers/net/bonding/bond_main.c -@@ -625,6 +625,23 @@ static void bond_set_dev_addr(struct net_device *bond_dev, - call_netdevice_notifiers(NETDEV_CHANGEADDR, bond_dev); - } - -+static struct slave *bond_get_old_active(struct bonding *bond, -+ struct slave *new_active) -+{ -+ struct slave *slave; -+ struct list_head *iter; -+ -+ bond_for_each_slave(bond, slave, iter) { -+ if (slave == new_active) -+ continue; -+ -+ if (ether_addr_equal(bond->dev->dev_addr, slave->dev->dev_addr)) -+ return slave; -+ } -+ -+ return NULL; -+} -+ - /* bond_do_fail_over_mac - * - * Perform special MAC address swapping for fail_over_mac settings -@@ -652,6 +669,9 @@ static void bond_do_fail_over_mac(struct bonding *bond, - if (!new_active) - return; - -+ if (!old_active) -+ old_active = bond_get_old_active(bond, new_active); -+ - if (old_active) { - ether_addr_copy(tmp_mac, new_active->dev->dev_addr); - ether_addr_copy(saddr.sa_data, --- -2.1.0 - - -From 6fef6e2a4f97d67ea0c20473d228e755e3f96a21 Mon Sep 17 00:00:00 2001 -From: Daniel Borkmann -Date: Fri, 17 Jul 2015 22:38:43 +0200 -Subject: [PATCH 24/46] sched: cls_bpf: fix panic on filter replace - -[ Upstream commit f6bfc46da6292b630ba389592123f0dd02066172 ] - -The following test case causes a NULL pointer dereference in cls_bpf: - - FOO="1,6 0 0 4294967295," - tc filter add dev foo parent 1: bpf bytecode "$FOO" flowid 1:1 action ok - tc filter replace dev foo parent 1: pref 49152 handle 0x1 \ - bpf bytecode "$FOO" flowid 1:1 action drop - -The problem is that commit 1f947bf151e9 ("net: sched: rcu'ify cls_bpf") -accidentally swapped the arguments of list_replace_rcu(), the old -element needs to be the first argument and the new element the second. - -Fixes: 1f947bf151e9 ("net: sched: rcu'ify cls_bpf") -Signed-off-by: Daniel Borkmann -Acked-by: John Fastabend -Acked-by: Alexei Starovoitov -Signed-off-by: David S. Miller ---- - net/sched/cls_bpf.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c -index 91bd9c1..c0b86f2 100644 ---- a/net/sched/cls_bpf.c -+++ b/net/sched/cls_bpf.c -@@ -364,7 +364,7 @@ static int cls_bpf_change(struct net *net, struct sk_buff *in_skb, - goto errout; - - if (oldprog) { -- list_replace_rcu(&prog->link, &oldprog->link); -+ list_replace_rcu(&oldprog->link, &prog->link); - tcf_unbind_filter(tp, &oldprog->res); - call_rcu(&oldprog->rcu, __cls_bpf_delete_prog); - } else { --- -2.1.0 - - -From 8c2111406c9cc807767ecc64ae29a409cf486c94 Mon Sep 17 00:00:00 2001 -From: Daniel Borkmann -Date: Fri, 17 Jul 2015 22:38:45 +0200 -Subject: [PATCH 25/46] sched: cls_flow: fix panic on filter replace - -[ Upstream commit 32b2f4b196b37695fdb42b31afcbc15399d6ef91 ] - -The following test case causes a NULL pointer dereference in cls_flow: - - tc filter add dev foo parent 1: handle 0x1 flow hash keys dst action ok - tc filter replace dev foo parent 1: pref 49152 handle 0x1 \ - flow hash keys mark action drop - -To be more precise, actually two different panics are fixed, the first -occurs because tcf_exts_init() is not called on the newly allocated -filter when we do a replace. And the second panic uncovered after that -happens since the arguments of list_replace_rcu() are swapped, the old -element needs to be the first argument and the new element the second. - -Fixes: 70da9f0bf999 ("net: sched: cls_flow use RCU") -Signed-off-by: Daniel Borkmann -Acked-by: John Fastabend -Signed-off-by: David S. Miller ---- - net/sched/cls_flow.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/net/sched/cls_flow.c b/net/sched/cls_flow.c -index a620c4e..75df923 100644 ---- a/net/sched/cls_flow.c -+++ b/net/sched/cls_flow.c -@@ -419,6 +419,8 @@ static int flow_change(struct net *net, struct sk_buff *in_skb, - if (!fnew) - goto err2; - -+ tcf_exts_init(&fnew->exts, TCA_FLOW_ACT, TCA_FLOW_POLICE); -+ - fold = (struct flow_filter *)*arg; - if (fold) { - err = -EINVAL; -@@ -480,7 +482,6 @@ static int flow_change(struct net *net, struct sk_buff *in_skb, - fnew->mask = ~0U; - fnew->tp = tp; - get_random_bytes(&fnew->hashrnd, 4); -- tcf_exts_init(&fnew->exts, TCA_FLOW_ACT, TCA_FLOW_POLICE); - } - - fnew->perturb_timer.function = flow_perturbation; -@@ -520,7 +521,7 @@ static int flow_change(struct net *net, struct sk_buff *in_skb, - if (*arg == 0) - list_add_tail_rcu(&fnew->list, &head->filters); - else -- list_replace_rcu(&fnew->list, &fold->list); -+ list_replace_rcu(&fold->list, &fnew->list); - - *arg = (unsigned long)fnew; - --- -2.1.0 - - -From fe0e0574a708320517330ca57865f1d4d2530cfc Mon Sep 17 00:00:00 2001 -From: Edward Hyunkoo Jee -Date: Tue, 21 Jul 2015 09:43:59 +0200 -Subject: [PATCH 26/46] inet: frags: fix defragmented packet's IP header for - af_packet - -[ Upstream commit 0848f6428ba3a2e42db124d41ac6f548655735bf ] - -When ip_frag_queue() computes positions, it assumes that the passed -sk_buff does not contain L2 headers. - -However, when PACKET_FANOUT_FLAG_DEFRAG is used, IP reassembly -functions can be called on outgoing packets that contain L2 headers. - -Also, IPv4 checksum is not corrected after reassembly. - -Fixes: 7736d33f4262 ("packet: Add pre-defragmentation support for ipv4 fanouts.") -Signed-off-by: Edward Hyunkoo Jee -Signed-off-by: Eric Dumazet -Cc: Willem de Bruijn -Cc: Jerry Chu -Signed-off-by: David S. Miller ---- - net/ipv4/ip_fragment.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c -index cc1da6d..cae22a1 100644 ---- a/net/ipv4/ip_fragment.c -+++ b/net/ipv4/ip_fragment.c -@@ -342,7 +342,7 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb) - ihl = ip_hdrlen(skb); - - /* Determine the position of this fragment. */ -- end = offset + skb->len - ihl; -+ end = offset + skb->len - skb_network_offset(skb) - ihl; - err = -EINVAL; - - /* Is this the final fragment? */ -@@ -372,7 +372,7 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb) - goto err; - - err = -ENOMEM; -- if (!pskb_pull(skb, ihl)) -+ if (!pskb_pull(skb, skb_network_offset(skb) + ihl)) - goto err; - - err = pskb_trim_rcsum(skb, end - offset); -@@ -613,6 +613,9 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev, - iph->frag_off = qp->q.max_size ? htons(IP_DF) : 0; - iph->tot_len = htons(len); - iph->tos |= ecn; -+ -+ ip_send_check(iph); -+ - IP_INC_STATS_BH(net, IPSTATS_MIB_REASMOKS); - qp->q.fragments = NULL; - qp->q.fragments_tail = NULL; --- -2.1.0 - - -From 5dfcd4a0749d9d421ec04dedf37d9f07a0c22f3a Mon Sep 17 00:00:00 2001 -From: Florian Westphal -Date: Tue, 21 Jul 2015 16:33:50 +0200 -Subject: [PATCH 27/46] netlink: don't hold mutex in rcu callback when - releasing mmapd ring - -[ Upstream commit 0470eb99b4721586ccac954faac3fa4472da0845 ] - -Kirill A. Shutemov says: - -This simple test-case trigers few locking asserts in kernel: - -int main(int argc, char **argv) -{ - unsigned int block_size = 16 * 4096; - struct nl_mmap_req req = { - .nm_block_size = block_size, - .nm_block_nr = 64, - .nm_frame_size = 16384, - .nm_frame_nr = 64 * block_size / 16384, - }; - unsigned int ring_size; - int fd; - - fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC); - if (setsockopt(fd, SOL_NETLINK, NETLINK_RX_RING, &req, sizeof(req)) < 0) - exit(1); - if (setsockopt(fd, SOL_NETLINK, NETLINK_TX_RING, &req, sizeof(req)) < 0) - exit(1); - - ring_size = req.nm_block_nr * req.nm_block_size; - mmap(NULL, 2 * ring_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - return 0; -} - -+++ exited with 0 +++ -BUG: sleeping function called from invalid context at /home/kas/git/public/linux-mm/kernel/locking/mutex.c:616 -in_atomic(): 1, irqs_disabled(): 0, pid: 1, name: init -3 locks held by init/1: - #0: (reboot_mutex){+.+...}, at: [] SyS_reboot+0xa9/0x220 - #1: ((reboot_notifier_list).rwsem){.+.+..}, at: [] __blocking_notifier_call_chain+0x39/0x70 - #2: (rcu_callback){......}, at: [] rcu_do_batch.isra.49+0x160/0x10c0 -Preemption disabled at:[] __delay+0xf/0x20 - -CPU: 1 PID: 1 Comm: init Not tainted 4.1.0-00009-gbddf4c4818e0 #253 -Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS Debian-1.8.2-1 04/01/2014 - ffff88017b3d8000 ffff88027bc03c38 ffffffff81929ceb 0000000000000102 - 0000000000000000 ffff88027bc03c68 ffffffff81085a9d 0000000000000002 - ffffffff81ca2a20 0000000000000268 0000000000000000 ffff88027bc03c98 -Call Trace: - [] dump_stack+0x4f/0x7b - [] ___might_sleep+0x16d/0x270 - [] __might_sleep+0x4d/0x90 - [] mutex_lock_nested+0x2f/0x430 - [] ? _raw_spin_unlock_irqrestore+0x5d/0x80 - [] ? __this_cpu_preempt_check+0x13/0x20 - [] netlink_set_ring+0x1ed/0x350 - [] ? netlink_undo_bind+0x70/0x70 - [] netlink_sock_destruct+0x80/0x150 - [] __sk_free+0x1d/0x160 - [] sk_free+0x19/0x20 -[..] - -Cong Wang says: - -We can't hold mutex lock in a rcu callback, [..] - -Thomas Graf says: - -The socket should be dead at this point. It might be simpler to -add a netlink_release_ring() function which doesn't require -locking at all. - -Reported-by: "Kirill A. Shutemov" -Diagnosed-by: Cong Wang -Suggested-by: Thomas Graf -Signed-off-by: Florian Westphal -Signed-off-by: David S. Miller ---- - net/netlink/af_netlink.c | 79 ++++++++++++++++++++++++++++-------------------- - 1 file changed, 47 insertions(+), 32 deletions(-) - -diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c -index bf6e766..ea5ed7a 100644 ---- a/net/netlink/af_netlink.c -+++ b/net/netlink/af_netlink.c -@@ -355,25 +355,52 @@ err1: - return NULL; - } - -+ -+static void -+__netlink_set_ring(struct sock *sk, struct nl_mmap_req *req, bool tx_ring, void **pg_vec, -+ unsigned int order) -+{ -+ struct netlink_sock *nlk = nlk_sk(sk); -+ struct sk_buff_head *queue; -+ struct netlink_ring *ring; -+ -+ queue = tx_ring ? &sk->sk_write_queue : &sk->sk_receive_queue; -+ ring = tx_ring ? &nlk->tx_ring : &nlk->rx_ring; -+ -+ spin_lock_bh(&queue->lock); -+ -+ ring->frame_max = req->nm_frame_nr - 1; -+ ring->head = 0; -+ ring->frame_size = req->nm_frame_size; -+ ring->pg_vec_pages = req->nm_block_size / PAGE_SIZE; -+ -+ swap(ring->pg_vec_len, req->nm_block_nr); -+ swap(ring->pg_vec_order, order); -+ swap(ring->pg_vec, pg_vec); -+ -+ __skb_queue_purge(queue); -+ spin_unlock_bh(&queue->lock); -+ -+ WARN_ON(atomic_read(&nlk->mapped)); -+ -+ if (pg_vec) -+ free_pg_vec(pg_vec, order, req->nm_block_nr); -+} -+ - static int netlink_set_ring(struct sock *sk, struct nl_mmap_req *req, -- bool closing, bool tx_ring) -+ bool tx_ring) - { - struct netlink_sock *nlk = nlk_sk(sk); - struct netlink_ring *ring; -- struct sk_buff_head *queue; - void **pg_vec = NULL; - unsigned int order = 0; -- int err; - - ring = tx_ring ? &nlk->tx_ring : &nlk->rx_ring; -- queue = tx_ring ? &sk->sk_write_queue : &sk->sk_receive_queue; - -- if (!closing) { -- if (atomic_read(&nlk->mapped)) -- return -EBUSY; -- if (atomic_read(&ring->pending)) -- return -EBUSY; -- } -+ if (atomic_read(&nlk->mapped)) -+ return -EBUSY; -+ if (atomic_read(&ring->pending)) -+ return -EBUSY; - - if (req->nm_block_nr) { - if (ring->pg_vec != NULL) -@@ -405,31 +432,19 @@ static int netlink_set_ring(struct sock *sk, struct nl_mmap_req *req, - return -EINVAL; - } - -- err = -EBUSY; - mutex_lock(&nlk->pg_vec_lock); -- if (closing || atomic_read(&nlk->mapped) == 0) { -- err = 0; -- spin_lock_bh(&queue->lock); -- -- ring->frame_max = req->nm_frame_nr - 1; -- ring->head = 0; -- ring->frame_size = req->nm_frame_size; -- ring->pg_vec_pages = req->nm_block_size / PAGE_SIZE; -- -- swap(ring->pg_vec_len, req->nm_block_nr); -- swap(ring->pg_vec_order, order); -- swap(ring->pg_vec, pg_vec); -- -- __skb_queue_purge(queue); -- spin_unlock_bh(&queue->lock); -- -- WARN_ON(atomic_read(&nlk->mapped)); -+ if (atomic_read(&nlk->mapped) == 0) { -+ __netlink_set_ring(sk, req, tx_ring, pg_vec, order); -+ mutex_unlock(&nlk->pg_vec_lock); -+ return 0; - } -+ - mutex_unlock(&nlk->pg_vec_lock); - - if (pg_vec) - free_pg_vec(pg_vec, order, req->nm_block_nr); -- return err; -+ -+ return -EBUSY; - } - - static void netlink_mm_open(struct vm_area_struct *vma) -@@ -898,10 +913,10 @@ static void netlink_sock_destruct(struct sock *sk) - - memset(&req, 0, sizeof(req)); - if (nlk->rx_ring.pg_vec) -- netlink_set_ring(sk, &req, true, false); -+ __netlink_set_ring(sk, &req, false, NULL, 0); - memset(&req, 0, sizeof(req)); - if (nlk->tx_ring.pg_vec) -- netlink_set_ring(sk, &req, true, true); -+ __netlink_set_ring(sk, &req, true, NULL, 0); - } - #endif /* CONFIG_NETLINK_MMAP */ - -@@ -2197,7 +2212,7 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, - return -EINVAL; - if (copy_from_user(&req, optval, sizeof(req))) - return -EFAULT; -- err = netlink_set_ring(sk, &req, false, -+ err = netlink_set_ring(sk, &req, - optname == NETLINK_TX_RING); - break; - } --- -2.1.0 - - -From c8a958d63443e2d143d1710ee437c17438fd12e5 Mon Sep 17 00:00:00 2001 -From: "Michael S. Tsirkin" -Date: Wed, 15 Jul 2015 15:26:19 +0300 -Subject: [PATCH 28/46] virtio_net: don't require ANY_LAYOUT with VERSION_1 - -[ Upstream commit 75993300d008f418ee2569a632185fc1d7d50674 ] - -ANY_LAYOUT is a compatibility feature. It's implied -for VERSION_1 devices, and non-transitional devices -might not offer it. Change code to behave accordingly. - -Signed-off-by: Michael S. Tsirkin -Reviewed-by: Paolo Bonzini -Reviewed-by: Stefan Hajnoczi -Signed-off-by: David S. Miller ---- - drivers/net/virtio_net.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c -index 63c7810..7fbca37 100644 ---- a/drivers/net/virtio_net.c -+++ b/drivers/net/virtio_net.c -@@ -1828,7 +1828,8 @@ static int virtnet_probe(struct virtio_device *vdev) - else - vi->hdr_len = sizeof(struct virtio_net_hdr); - -- if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT)) -+ if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT) || -+ virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) - vi->any_header_sg = true; - - if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) --- -2.1.0 - - -From d5df2abc93d5027ec62fb714d6bb9b14bed65548 Mon Sep 17 00:00:00 2001 -From: Nikolay Aleksandrov -Date: Wed, 22 Jul 2015 13:03:40 +0200 -Subject: [PATCH 29/46] bridge: netlink: fix slave_changelink/br_setport race - conditions - -[ Upstream commit 963ad94853000ab100f5ff19eea80095660d41b4 ] - -Since slave_changelink support was added there have been a few race -conditions when using br_setport() since some of the port functions it -uses require the bridge lock. It is very easy to trigger a lockup due to -some internal spin_lock() usage without bh disabled, also it's possible to -get the bridge into an inconsistent state. - -Signed-off-by: Nikolay Aleksandrov -Fixes: 3ac636b8591c ("bridge: implement rtnl_link_ops->slave_changelink") -Reviewed-by: Jiri Pirko -Signed-off-by: David S. Miller ---- - net/bridge/br_netlink.c | 10 +++++++++- - 1 file changed, 9 insertions(+), 1 deletion(-) - -diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c -index 4b5c236..20e06a9 100644 ---- a/net/bridge/br_netlink.c -+++ b/net/bridge/br_netlink.c -@@ -711,9 +711,17 @@ static int br_port_slave_changelink(struct net_device *brdev, - struct nlattr *tb[], - struct nlattr *data[]) - { -+ struct net_bridge *br = netdev_priv(brdev); -+ int ret; -+ - if (!data) - return 0; -- return br_setport(br_port_get_rtnl(dev), data); -+ -+ spin_lock_bh(&br->lock); -+ ret = br_setport(br_port_get_rtnl(dev), data); -+ spin_unlock_bh(&br->lock); -+ -+ return ret; - } - - static int br_port_fill_slave_info(struct sk_buff *skb, --- -2.1.0 - - -From 8002540aec64b57e8a2a93adf4ad893b085f9ae6 Mon Sep 17 00:00:00 2001 -From: Jack Morgenstein -Date: Wed, 22 Jul 2015 16:53:47 +0300 -Subject: [PATCH 30/46] net/mlx4_core: Fix wrong index in propagating port - change event to VFs - -[ Upstream commit 1c1bf34951e8d17941bf708d1901c47e81b15d55 ] - -The port-change event processing in procedure mlx4_eq_int() uses "slave" -as the vf_oper array index. Since the value of "slave" is the PF function -index, the result is that the PF link state is used for deciding to -propagate the event for all the VFs. The VF link state should be used, -so the VF function index should be used here. - -Fixes: 948e306d7d64 ('net/mlx4: Add VF link state support') -Signed-off-by: Jack Morgenstein -Signed-off-by: Matan Barak -Signed-off-by: Or Gerlitz -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/mellanox/mlx4/eq.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c -index 2619c9f..983b1d5 100644 ---- a/drivers/net/ethernet/mellanox/mlx4/eq.c -+++ b/drivers/net/ethernet/mellanox/mlx4/eq.c -@@ -573,7 +573,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) - continue; - mlx4_dbg(dev, "%s: Sending MLX4_PORT_CHANGE_SUBTYPE_DOWN to slave: %d, port:%d\n", - __func__, i, port); -- s_info = &priv->mfunc.master.vf_oper[slave].vport[port].state; -+ s_info = &priv->mfunc.master.vf_oper[i].vport[port].state; - if (IFLA_VF_LINK_STATE_AUTO == s_info->link_state) { - eqe->event.port_change.port = - cpu_to_be32( -@@ -608,7 +608,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) - continue; - if (i == mlx4_master_func_num(dev)) - continue; -- s_info = &priv->mfunc.master.vf_oper[slave].vport[port].state; -+ s_info = &priv->mfunc.master.vf_oper[i].vport[port].state; - if (IFLA_VF_LINK_STATE_AUTO == s_info->link_state) { - eqe->event.port_change.port = - cpu_to_be32( --- -2.1.0 - - -From 9df9bb9ae0c1579a4e6e63fc6ebfb7d1e0a16ebb Mon Sep 17 00:00:00 2001 -From: Alexander Duyck -Date: Mon, 27 Jul 2015 13:08:06 -0700 -Subject: [PATCH 31/46] fib_trie: Drop unnecessary calls to leaf_pull_suffix - -[ Upstream commit 1513069edcf8dd86cfd8d5daef482b97d6b93df6 ] - -It was reported that update_suffix was taking a long time on systems where -a large number of leaves were attached to a single node. As it turns out -fib_table_flush was calling update_suffix for each leaf that didn't have all -of the aliases stripped from it. As a result, on this large node removing -one leaf would result in us calling update_suffix for every other leaf on -the node. - -The fix is to just remove the calls to leaf_pull_suffix since they are -redundant as we already have a call in resize that will go through and -update the suffix length for the node before we exit out of -fib_table_flush or fib_table_flush_external. - -Reported-by: David Ahern -Signed-off-by: Alexander Duyck -Tested-by: David Ahern -Signed-off-by: David S. Miller ---- - net/ipv4/fib_trie.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c -index 09b62e1..210ceca 100644 ---- a/net/ipv4/fib_trie.c -+++ b/net/ipv4/fib_trie.c -@@ -1780,8 +1780,6 @@ void fib_table_flush_external(struct fib_table *tb) - if (hlist_empty(&n->leaf)) { - put_child_root(pn, n->key, NULL); - node_free(n); -- } else { -- leaf_pull_suffix(pn, n); - } - } - } -@@ -1852,8 +1850,6 @@ int fib_table_flush(struct fib_table *tb) - if (hlist_empty(&n->leaf)) { - put_child_root(pn, n->key, NULL); - node_free(n); -- } else { -- leaf_pull_suffix(pn, n); - } - } - --- -2.1.0 - - -From 9119c5bc8f4ef473506590477e0dc196c2bc496d Mon Sep 17 00:00:00 2001 -From: Lars Westerhoff -Date: Tue, 28 Jul 2015 01:32:21 +0300 -Subject: [PATCH 32/46] packet: missing dev_put() in packet_do_bind() - -[ Upstream commit 158cd4af8dedbda0d612d448c724c715d0dda649 ] - -When binding a PF_PACKET socket, the use count of the bound interface is -always increased with dev_hold in dev_get_by_{index,name}. However, -when rebound with the same protocol and device as in the previous bind -the use count of the interface was not decreased. Ultimately, this -caused the deletion of the interface to fail with the following message: - -unregister_netdevice: waiting for dummy0 to become free. Usage count = 1 - -This patch moves the dev_put out of the conditional part that was only -executed when either the protocol or device changed on a bind. - -Fixes: 902fefb82ef7 ('packet: improve socket create/bind latency in some cases') -Signed-off-by: Lars Westerhoff -Signed-off-by: Dan Carpenter -Reviewed-by: Daniel Borkmann -Signed-off-by: David S. Miller ---- - net/packet/af_packet.c | 8 +++----- - 1 file changed, 3 insertions(+), 5 deletions(-) - -diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c -index fe1610d..733ef5a 100644 ---- a/net/packet/af_packet.c -+++ b/net/packet/af_packet.c -@@ -2688,7 +2688,7 @@ static int packet_release(struct socket *sock) - static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 proto) - { - struct packet_sock *po = pkt_sk(sk); -- const struct net_device *dev_curr; -+ struct net_device *dev_curr; - __be16 proto_curr; - bool need_rehook; - -@@ -2712,15 +2712,13 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 proto) - - po->num = proto; - po->prot_hook.type = proto; -- -- if (po->prot_hook.dev) -- dev_put(po->prot_hook.dev); -- - po->prot_hook.dev = dev; - - po->ifindex = dev ? dev->ifindex : 0; - packet_cached_dev_assign(po, dev); - } -+ if (dev_curr) -+ dev_put(dev_curr); - - if (proto == 0 || !need_rehook) - goto out_unlock; --- -2.1.0 - - -From dbd3501b0f680161110947cb7ba49b308a2d182e Mon Sep 17 00:00:00 2001 -From: Alexander Drozdov -Date: Tue, 28 Jul 2015 13:57:01 +0300 -Subject: [PATCH 33/46] packet: tpacket_snd(): fix signed/unsigned comparison - -[ Upstream commit dbd46ab412b8fb395f2b0ff6f6a7eec9df311550 ] - -tpacket_fill_skb() can return a negative value (-errno) which -is stored in tp_len variable. In that case the following -condition will be (but shouldn't be) true: - -tp_len > dev->mtu + dev->hard_header_len - -as dev->mtu and dev->hard_header_len are both unsigned. - -That may lead to just returning an incorrect EMSGSIZE errno -to the user. - -Fixes: 52f1454f629fa ("packet: allow to transmit +4 byte in TX_RING slot for VLAN case") -Signed-off-by: Alexander Drozdov -Acked-by: Daniel Borkmann -Signed-off-by: David S. Miller ---- - net/packet/af_packet.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c -index 733ef5a..e1ea5d4 100644 ---- a/net/packet/af_packet.c -+++ b/net/packet/af_packet.c -@@ -2307,7 +2307,8 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) - } - tp_len = tpacket_fill_skb(po, skb, ph, dev, size_max, proto, - addr, hlen); -- if (tp_len > dev->mtu + dev->hard_header_len) { -+ if (likely(tp_len >= 0) && -+ tp_len > dev->mtu + dev->hard_header_len) { - struct ethhdr *ehdr; - /* Earlier code assumed this would be a VLAN pkt, - * double-check this now that we have the actual --- -2.1.0 - - -From 9f07a1825bac3efa34dcb2d50944377edcf39d38 Mon Sep 17 00:00:00 2001 -From: Daniel Borkmann -Date: Wed, 29 Jul 2015 18:40:56 +0200 -Subject: [PATCH 34/46] act_bpf: fix memory leaks when replacing bpf programs - -[ Upstream commit f4eaed28c7834fc049c754f63e6988bbd73778d9 ] - -We currently trigger multiple memory leaks when replacing bpf -actions, besides others: - - comm "tc", pid 1909, jiffies 4294851310 (age 1602.796s) - hex dump (first 32 bytes): - 01 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 ................ - 18 b0 98 6d 00 88 ff ff 00 00 00 00 00 00 00 00 ...m............ - backtrace: - [] kmemleak_alloc+0x4e/0xb0 - [] __vmalloc_node_range+0x1bd/0x2c0 - [] __vmalloc+0x4a/0x50 - [] bpf_prog_alloc+0x3a/0xa0 - [] bpf_prog_create+0x44/0xa0 - [] tcf_bpf_init+0x28b/0x3c0 [act_bpf] - [] tcf_action_init_1+0x191/0x1b0 - [] tcf_action_init+0x82/0xf0 - [] tcf_exts_validate+0xb2/0xc0 - [] cls_bpf_modify_existing+0x98/0x340 [cls_bpf] - [] cls_bpf_change+0x1a6/0x274 [cls_bpf] - [] tc_ctl_tfilter+0x335/0x910 - [] rtnetlink_rcv_msg+0x95/0x240 - [] netlink_rcv_skb+0xaf/0xc0 - [] rtnetlink_rcv+0x2e/0x40 - [] netlink_unicast+0xef/0x1b0 - -Issue is that the old content from tcf_bpf is allocated and needs -to be released when we replace it. We seem to do that since the -beginning of act_bpf on the filter and insns, later on the name as -well. - -Example test case, after patch: - - # FOO="1,6 0 0 4294967295," - # BAR="1,6 0 0 4294967294," - # tc actions add action bpf bytecode "$FOO" index 2 - # tc actions show action bpf - action order 0: bpf bytecode '1,6 0 0 4294967295' default-action pipe - index 2 ref 1 bind 0 - # tc actions replace action bpf bytecode "$BAR" index 2 - # tc actions show action bpf - action order 0: bpf bytecode '1,6 0 0 4294967294' default-action pipe - index 2 ref 1 bind 0 - # tc actions replace action bpf bytecode "$FOO" index 2 - # tc actions show action bpf - action order 0: bpf bytecode '1,6 0 0 4294967295' default-action pipe - index 2 ref 1 bind 0 - # tc actions del action bpf index 2 - [...] - # echo "scan" > /sys/kernel/debug/kmemleak - # cat /sys/kernel/debug/kmemleak | grep "comm \"tc\"" | wc -l - 0 - -Fixes: d23b8ad8ab23 ("tc: add BPF based action") -Signed-off-by: Daniel Borkmann -Signed-off-by: David S. Miller ---- - net/sched/act_bpf.c | 50 +++++++++++++++++++++++++++++++++++--------------- - 1 file changed, 35 insertions(+), 15 deletions(-) - -diff --git a/net/sched/act_bpf.c b/net/sched/act_bpf.c -index dc6a2d3..521ffca 100644 ---- a/net/sched/act_bpf.c -+++ b/net/sched/act_bpf.c -@@ -27,9 +27,10 @@ - struct tcf_bpf_cfg { - struct bpf_prog *filter; - struct sock_filter *bpf_ops; -- char *bpf_name; -+ const char *bpf_name; - u32 bpf_fd; - u16 bpf_num_ops; -+ bool is_ebpf; - }; - - static int tcf_bpf(struct sk_buff *skb, const struct tc_action *act, -@@ -200,6 +201,7 @@ static int tcf_bpf_init_from_ops(struct nlattr **tb, struct tcf_bpf_cfg *cfg) - cfg->bpf_ops = bpf_ops; - cfg->bpf_num_ops = bpf_num_ops; - cfg->filter = fp; -+ cfg->is_ebpf = false; - - return 0; - } -@@ -234,18 +236,40 @@ static int tcf_bpf_init_from_efd(struct nlattr **tb, struct tcf_bpf_cfg *cfg) - cfg->bpf_fd = bpf_fd; - cfg->bpf_name = name; - cfg->filter = fp; -+ cfg->is_ebpf = true; - - return 0; - } - -+static void tcf_bpf_cfg_cleanup(const struct tcf_bpf_cfg *cfg) -+{ -+ if (cfg->is_ebpf) -+ bpf_prog_put(cfg->filter); -+ else -+ bpf_prog_destroy(cfg->filter); -+ -+ kfree(cfg->bpf_ops); -+ kfree(cfg->bpf_name); -+} -+ -+static void tcf_bpf_prog_fill_cfg(const struct tcf_bpf *prog, -+ struct tcf_bpf_cfg *cfg) -+{ -+ cfg->is_ebpf = tcf_bpf_is_ebpf(prog); -+ cfg->filter = prog->filter; -+ -+ cfg->bpf_ops = prog->bpf_ops; -+ cfg->bpf_name = prog->bpf_name; -+} -+ - static int tcf_bpf_init(struct net *net, struct nlattr *nla, - struct nlattr *est, struct tc_action *act, - int replace, int bind) - { - struct nlattr *tb[TCA_ACT_BPF_MAX + 1]; -+ struct tcf_bpf_cfg cfg, old; - struct tc_act_bpf *parm; - struct tcf_bpf *prog; -- struct tcf_bpf_cfg cfg; - bool is_bpf, is_ebpf; - int ret; - -@@ -294,6 +318,9 @@ static int tcf_bpf_init(struct net *net, struct nlattr *nla, - prog = to_bpf(act); - spin_lock_bh(&prog->tcf_lock); - -+ if (ret != ACT_P_CREATED) -+ tcf_bpf_prog_fill_cfg(prog, &old); -+ - prog->bpf_ops = cfg.bpf_ops; - prog->bpf_name = cfg.bpf_name; - -@@ -309,29 +336,22 @@ static int tcf_bpf_init(struct net *net, struct nlattr *nla, - - if (ret == ACT_P_CREATED) - tcf_hash_insert(act); -+ else -+ tcf_bpf_cfg_cleanup(&old); - - return ret; - - destroy_fp: -- if (is_ebpf) -- bpf_prog_put(cfg.filter); -- else -- bpf_prog_destroy(cfg.filter); -- -- kfree(cfg.bpf_ops); -- kfree(cfg.bpf_name); -- -+ tcf_bpf_cfg_cleanup(&cfg); - return ret; - } - - static void tcf_bpf_cleanup(struct tc_action *act, int bind) - { -- const struct tcf_bpf *prog = act->priv; -+ struct tcf_bpf_cfg tmp; - -- if (tcf_bpf_is_ebpf(prog)) -- bpf_prog_put(prog->filter); -- else -- bpf_prog_destroy(prog->filter); -+ tcf_bpf_prog_fill_cfg(act->priv, &tmp); -+ tcf_bpf_cfg_cleanup(&tmp); - } - - static struct tc_action_ops act_bpf_ops __read_mostly = { --- -2.1.0 - - -From a376fa38ddfa431270ed3127873550282d677fe7 Mon Sep 17 00:00:00 2001 -From: Daniel Borkmann -Date: Wed, 29 Jul 2015 23:35:25 +0200 -Subject: [PATCH 35/46] net: sched: fix refcount imbalance in actions - -[ Upstream commit 28e6b67f0b292f557468c139085303b15f1a678f ] - -Since commit 55334a5db5cd ("net_sched: act: refuse to remove bound action -outside"), we end up with a wrong reference count for a tc action. - -Test case 1: - - FOO="1,6 0 0 4294967295," - BAR="1,6 0 0 4294967294," - tc filter add dev foo parent 1: bpf bytecode "$FOO" flowid 1:1 \ - action bpf bytecode "$FOO" - tc actions show action bpf - action order 0: bpf bytecode '1,6 0 0 4294967295' default-action pipe - index 1 ref 1 bind 1 - tc actions replace action bpf bytecode "$BAR" index 1 - tc actions show action bpf - action order 0: bpf bytecode '1,6 0 0 4294967294' default-action pipe - index 1 ref 2 bind 1 - tc actions replace action bpf bytecode "$FOO" index 1 - tc actions show action bpf - action order 0: bpf bytecode '1,6 0 0 4294967295' default-action pipe - index 1 ref 3 bind 1 - -Test case 2: - - FOO="1,6 0 0 4294967295," - tc filter add dev foo parent 1: bpf bytecode "$FOO" flowid 1:1 action ok - tc actions show action gact - action order 0: gact action pass - random type none pass val 0 - index 1 ref 1 bind 1 - tc actions add action drop index 1 - RTNETLINK answers: File exists [...] - tc actions show action gact - action order 0: gact action pass - random type none pass val 0 - index 1 ref 2 bind 1 - tc actions add action drop index 1 - RTNETLINK answers: File exists [...] - tc actions show action gact - action order 0: gact action pass - random type none pass val 0 - index 1 ref 3 bind 1 - -What happens is that in tcf_hash_check(), we check tcf_common for a given -index and increase tcfc_refcnt and conditionally tcfc_bindcnt when we've -found an existing action. Now there are the following cases: - - 1) We do a late binding of an action. In that case, we leave the - tcfc_refcnt/tcfc_bindcnt increased and are done with the ->init() - handler. This is correctly handeled. - - 2) We replace the given action, or we try to add one without replacing - and find out that the action at a specific index already exists - (thus, we go out with error in that case). - -In case of 2), we have to undo the reference count increase from -tcf_hash_check() in the tcf_hash_check() function. Currently, we fail to -do so because of the 'tcfc_bindcnt > 0' check which bails out early with -an -EPERM error. - -Now, while commit 55334a5db5cd prevents 'tc actions del action ...' on an -already classifier-bound action to drop the reference count (which could -then become negative, wrap around etc), this restriction only accounts for -invocations outside a specific action's ->init() handler. - -One possible solution would be to add a flag thus we possibly trigger -the -EPERM ony in situations where it is indeed relevant. - -After the patch, above test cases have correct reference count again. - -Fixes: 55334a5db5cd ("net_sched: act: refuse to remove bound action outside") -Signed-off-by: Daniel Borkmann -Reviewed-by: Cong Wang -Signed-off-by: David S. Miller ---- - include/net/act_api.h | 8 +++++++- - net/sched/act_api.c | 11 ++++++----- - 2 files changed, 13 insertions(+), 6 deletions(-) - -diff --git a/include/net/act_api.h b/include/net/act_api.h -index 3ee4c92..931738b 100644 ---- a/include/net/act_api.h -+++ b/include/net/act_api.h -@@ -99,7 +99,6 @@ struct tc_action_ops { - - int tcf_hash_search(struct tc_action *a, u32 index); - void tcf_hash_destroy(struct tc_action *a); --int tcf_hash_release(struct tc_action *a, int bind); - u32 tcf_hash_new_index(struct tcf_hashinfo *hinfo); - int tcf_hash_check(u32 index, struct tc_action *a, int bind); - int tcf_hash_create(u32 index, struct nlattr *est, struct tc_action *a, -@@ -107,6 +106,13 @@ int tcf_hash_create(u32 index, struct nlattr *est, struct tc_action *a, - void tcf_hash_cleanup(struct tc_action *a, struct nlattr *est); - void tcf_hash_insert(struct tc_action *a); - -+int __tcf_hash_release(struct tc_action *a, bool bind, bool strict); -+ -+static inline int tcf_hash_release(struct tc_action *a, bool bind) -+{ -+ return __tcf_hash_release(a, bind, false); -+} -+ - int tcf_register_action(struct tc_action_ops *a, unsigned int mask); - int tcf_unregister_action(struct tc_action_ops *a); - int tcf_action_destroy(struct list_head *actions, int bind); -diff --git a/net/sched/act_api.c b/net/sched/act_api.c -index 3d43e49..f8d9c2a 100644 ---- a/net/sched/act_api.c -+++ b/net/sched/act_api.c -@@ -45,7 +45,7 @@ void tcf_hash_destroy(struct tc_action *a) - } - EXPORT_SYMBOL(tcf_hash_destroy); - --int tcf_hash_release(struct tc_action *a, int bind) -+int __tcf_hash_release(struct tc_action *a, bool bind, bool strict) - { - struct tcf_common *p = a->priv; - int ret = 0; -@@ -53,7 +53,7 @@ int tcf_hash_release(struct tc_action *a, int bind) - if (p) { - if (bind) - p->tcfc_bindcnt--; -- else if (p->tcfc_bindcnt > 0) -+ else if (strict && p->tcfc_bindcnt > 0) - return -EPERM; - - p->tcfc_refcnt--; -@@ -64,9 +64,10 @@ int tcf_hash_release(struct tc_action *a, int bind) - ret = 1; - } - } -+ - return ret; - } --EXPORT_SYMBOL(tcf_hash_release); -+EXPORT_SYMBOL(__tcf_hash_release); - - static int tcf_dump_walker(struct sk_buff *skb, struct netlink_callback *cb, - struct tc_action *a) -@@ -136,7 +137,7 @@ static int tcf_del_walker(struct sk_buff *skb, struct tc_action *a) - head = &hinfo->htab[tcf_hash(i, hinfo->hmask)]; - hlist_for_each_entry_safe(p, n, head, tcfc_head) { - a->priv = p; -- ret = tcf_hash_release(a, 0); -+ ret = __tcf_hash_release(a, false, true); - if (ret == ACT_P_DELETED) { - module_put(a->ops->owner); - n_i++; -@@ -413,7 +414,7 @@ int tcf_action_destroy(struct list_head *actions, int bind) - int ret = 0; - - list_for_each_entry_safe(a, tmp, actions, list) { -- ret = tcf_hash_release(a, bind); -+ ret = __tcf_hash_release(a, bind, true); - if (ret == ACT_P_DELETED) - module_put(a->ops->owner); - else if (ret < 0) --- -2.1.0 - - -From 40df9588f4415a976f1b67f344757d26f157e4f8 Mon Sep 17 00:00:00 2001 -From: Ido Schimmel -Date: Sun, 2 Aug 2015 19:29:16 +0200 -Subject: [PATCH 36/46] rocker: free netdevice during netdevice removal - -[ Upstream commit 1ebd47efa4e17391dfac8caa349c6a8d35f996d1 ] - -When removing a port's netdevice in 'rocker_remove_ports', we should -also free the allocated 'net_device' structure. Do that by calling -'free_netdev' after unregistering it. - -Signed-off-by: Ido Schimmel -Signed-off-by: Jiri Pirko -Fixes: 4b8ac9660af ("rocker: introduce rocker switch driver") -Acked-by: Scott Feldman -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/rocker/rocker.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/net/ethernet/rocker/rocker.c b/drivers/net/ethernet/rocker/rocker.c -index cf98cc9..73b6fc2 100644 ---- a/drivers/net/ethernet/rocker/rocker.c -+++ b/drivers/net/ethernet/rocker/rocker.c -@@ -4587,6 +4587,7 @@ static void rocker_remove_ports(struct rocker *rocker) - rocker_port = rocker->ports[i]; - rocker_port_ig_tbl(rocker_port, ROCKER_OP_FLAG_REMOVE); - unregister_netdev(rocker_port->dev); -+ free_netdev(rocker_port->dev); - } - kfree(rocker->ports); - } --- -2.1.0 - - -From b2c177c64de1f863de832da667ef6f626ccddb48 Mon Sep 17 00:00:00 2001 -From: Dan Carpenter -Date: Sat, 1 Aug 2015 15:33:26 +0300 -Subject: [PATCH 37/46] rds: fix an integer overflow test in - rds_info_getsockopt() - -[ Upstream commit 468b732b6f76b138c0926eadf38ac88467dcd271 ] - -"len" is a signed integer. We check that len is not negative, so it -goes from zero to INT_MAX. PAGE_SIZE is unsigned long so the comparison -is type promoted to unsigned long. ULONG_MAX - 4095 is a higher than -INT_MAX so the condition can never be true. - -I don't know if this is harmful but it seems safe to limit "len" to -INT_MAX - 4095. - -Fixes: a8c879a7ee98 ('RDS: Info and stats') -Signed-off-by: Dan Carpenter -Signed-off-by: David S. Miller ---- - net/rds/info.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/net/rds/info.c b/net/rds/info.c -index 9a6b4f6..140a44a 100644 ---- a/net/rds/info.c -+++ b/net/rds/info.c -@@ -176,7 +176,7 @@ int rds_info_getsockopt(struct socket *sock, int optname, char __user *optval, - - /* check for all kinds of wrapping and the like */ - start = (unsigned long)optval; -- if (len < 0 || len + PAGE_SIZE - 1 < len || start + len < start) { -+ if (len < 0 || len > INT_MAX - PAGE_SIZE + 1 || start + len < start) { - ret = -EINVAL; - goto out; - } --- -2.1.0 - - -From 346f0535765909d0f5fda364f365e05f8e602879 Mon Sep 17 00:00:00 2001 -From: Eric Dumazet -Date: Sat, 1 Aug 2015 12:14:33 +0200 -Subject: [PATCH 38/46] udp: fix dst races with multicast early demux -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ Upstream commit 10e2eb878f3ca07ac2f05fa5ca5e6c4c9174a27a ] - -Multicast dst are not cached. They carry DST_NOCACHE. - -As mentioned in commit f8864972126899 ("ipv4: fix dst race in -sk_dst_get()"), these dst need special care before caching them -into a socket. - -Caching them is allowed only if their refcnt was not 0, ie we -must use atomic_inc_not_zero() - -Also, we must use READ_ONCE() to fetch sk->sk_rx_dst, as mentioned -in commit d0c294c53a771 ("tcp: prevent fetching dst twice in early demux -code") - -Fixes: 421b3885bf6d ("udp: ipv4: Add udp early demux") -Tested-by: Gregory Hoggarth -Signed-off-by: Eric Dumazet -Reported-by: Gregory Hoggarth -Reported-by: Alex Gartrell -Cc: Michal Kubeček -Signed-off-by: David S. Miller ---- - net/ipv4/udp.c | 13 ++++++++++--- - 1 file changed, 10 insertions(+), 3 deletions(-) - -diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c -index 83aa604..1b8c5ba 100644 ---- a/net/ipv4/udp.c -+++ b/net/ipv4/udp.c -@@ -1995,12 +1995,19 @@ void udp_v4_early_demux(struct sk_buff *skb) - - skb->sk = sk; - skb->destructor = sock_efree; -- dst = sk->sk_rx_dst; -+ dst = READ_ONCE(sk->sk_rx_dst); - - if (dst) - dst = dst_check(dst, 0); -- if (dst) -- skb_dst_set_noref(skb, dst); -+ if (dst) { -+ /* DST_NOCACHE can not be used without taking a reference */ -+ if (dst->flags & DST_NOCACHE) { -+ if (likely(atomic_inc_not_zero(&dst->__refcnt))) -+ skb_dst_set(skb, dst); -+ } else { -+ skb_dst_set_noref(skb, dst); -+ } -+ } - } - - int udp_rcv(struct sk_buff *skb) --- -2.1.0 - - -From 469e1ebf7f9f83516cd805f0a8f2392d1b8298a3 Mon Sep 17 00:00:00 2001 -From: Nikolay Aleksandrov -Date: Tue, 4 Aug 2015 19:06:32 +0200 -Subject: [PATCH 39/46] bridge: netlink: account for the IFLA_BRPORT_PROXYARP - attribute size and policy - -[ Upstream commit 355b9f9df1f0311f20087350aee8ad96eedca8a9 ] - -The attribute size wasn't accounted for in the get_slave_size() callback -(br_port_get_slave_size) when it was introduced, so fix it now. Also add -a policy entry for it in br_port_policy. - -Signed-off-by: Nikolay Aleksandrov -Fixes: 958501163ddd ("bridge: Add support for IEEE 802.11 Proxy ARP") -Signed-off-by: David S. Miller ---- - net/bridge/br_netlink.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c -index 20e06a9..95ef032 100644 ---- a/net/bridge/br_netlink.c -+++ b/net/bridge/br_netlink.c -@@ -112,6 +112,7 @@ static inline size_t br_port_info_size(void) - + nla_total_size(1) /* IFLA_BRPORT_FAST_LEAVE */ - + nla_total_size(1) /* IFLA_BRPORT_LEARNING */ - + nla_total_size(1) /* IFLA_BRPORT_UNICAST_FLOOD */ -+ + nla_total_size(1) /* IFLA_BRPORT_PROXYARP */ - + 0; - } - -@@ -504,6 +505,7 @@ static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = { - [IFLA_BRPORT_FAST_LEAVE]= { .type = NLA_U8 }, - [IFLA_BRPORT_LEARNING] = { .type = NLA_U8 }, - [IFLA_BRPORT_UNICAST_FLOOD] = { .type = NLA_U8 }, -+ [IFLA_BRPORT_PROXYARP] = { .type = NLA_U8 }, - }; - - /* Change the state of the port and notify spanning tree */ --- -2.1.0 - - -From 7cea8ba728e377145ddb3c0c449beca792171109 Mon Sep 17 00:00:00 2001 -From: Nikolay Aleksandrov -Date: Tue, 4 Aug 2015 19:06:33 +0200 -Subject: [PATCH 40/46] bridge: netlink: account for the - IFLA_BRPORT_PROXYARP_WIFI attribute size and policy - -[ Upstream commit 786c2077ec8e9eab37a88fc14aac4309a8061e18 ] - -The attribute size wasn't accounted for in the get_slave_size() callback -(br_port_get_slave_size) when it was introduced, so fix it now. Also add -a policy entry for it in br_port_policy. - -Signed-off-by: Nikolay Aleksandrov -Fixes: 842a9ae08a25 ("bridge: Extend Proxy ARP design to allow optional rules for Wi-Fi") -Signed-off-by: David S. Miller ---- - net/bridge/br_netlink.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c -index 95ef032..a7559ef 100644 ---- a/net/bridge/br_netlink.c -+++ b/net/bridge/br_netlink.c -@@ -113,6 +113,7 @@ static inline size_t br_port_info_size(void) - + nla_total_size(1) /* IFLA_BRPORT_LEARNING */ - + nla_total_size(1) /* IFLA_BRPORT_UNICAST_FLOOD */ - + nla_total_size(1) /* IFLA_BRPORT_PROXYARP */ -+ + nla_total_size(1) /* IFLA_BRPORT_PROXYARP_WIFI */ - + 0; - } - -@@ -506,6 +507,7 @@ static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = { - [IFLA_BRPORT_LEARNING] = { .type = NLA_U8 }, - [IFLA_BRPORT_UNICAST_FLOOD] = { .type = NLA_U8 }, - [IFLA_BRPORT_PROXYARP] = { .type = NLA_U8 }, -+ [IFLA_BRPORT_PROXYARP_WIFI] = { .type = NLA_U8 }, - }; - - /* Change the state of the port and notify spanning tree */ --- -2.1.0 - - -From 61c226cb391165314b5ee42cc6f72bc9b29bc897 Mon Sep 17 00:00:00 2001 -From: Ivan Vecera -Date: Thu, 6 Aug 2015 22:48:23 +0200 -Subject: [PATCH 41/46] bna: fix interrupts storm caused by erroneous packets - -[ Upstream commit ade4dc3e616e33c80d7e62855fe1b6f9895bc7c3 ] - -The commit "e29aa33 bna: Enable Multi Buffer RX" moved packets counter -increment from the beginning of the NAPI processing loop after the check -for erroneous packets so they are never accounted. This counter is used -to inform firmware about number of processed completions (packets). -As these packets are never acked the firmware fires IRQs for them again -and again. - -Fixes: e29aa33 ("bna: Enable Multi Buffer RX") -Signed-off-by: Ivan Vecera -Acked-by: Rasesh Mody -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/brocade/bna/bnad.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c -index caae6cb..a1c30ee 100644 ---- a/drivers/net/ethernet/brocade/bna/bnad.c -+++ b/drivers/net/ethernet/brocade/bna/bnad.c -@@ -675,6 +675,7 @@ bnad_cq_process(struct bnad *bnad, struct bna_ccb *ccb, int budget) - if (!next_cmpl->valid) - break; - } -+ packets++; - - /* TODO: BNA_CQ_EF_LOCAL ? */ - if (unlikely(flags & (BNA_CQ_EF_MAC_ERROR | -@@ -691,7 +692,6 @@ bnad_cq_process(struct bnad *bnad, struct bna_ccb *ccb, int budget) - else - bnad_cq_setup_skb_frags(rcb, skb, sop_ci, nvecs, len); - -- packets++; - rcb->rxq->rx_packets++; - rcb->rxq->rx_bytes += totlen; - ccb->bytes_per_intr += totlen; --- -2.1.0 - - -From a4f50b7501f98b5e76e695bb3f8c892429082f90 Mon Sep 17 00:00:00 2001 -From: Daniel Borkmann -Date: Fri, 7 Aug 2015 00:26:41 +0200 -Subject: [PATCH 42/46] netlink: make sure -EBUSY won't escape from - netlink_insert - -[ Upstream commit 4e7c1330689e27556de407d3fdadc65ffff5eb12 ] - -Linus reports the following deadlock on rtnl_mutex; triggered only -once so far (extract): - -[12236.694209] NetworkManager D 0000000000013b80 0 1047 1 0x00000000 -[12236.694218] ffff88003f902640 0000000000000000 ffffffff815d15a9 0000000000000018 -[12236.694224] ffff880119538000 ffff88003f902640 ffffffff81a8ff84 00000000ffffffff -[12236.694230] ffffffff81a8ff88 ffff880119c47f00 ffffffff815d133a ffffffff81a8ff80 -[12236.694235] Call Trace: -[12236.694250] [] ? schedule_preempt_disabled+0x9/0x10 -[12236.694257] [] ? schedule+0x2a/0x70 -[12236.694263] [] ? schedule_preempt_disabled+0x9/0x10 -[12236.694271] [] ? __mutex_lock_slowpath+0x7f/0xf0 -[12236.694280] [] ? mutex_lock+0x16/0x30 -[12236.694291] [] ? rtnetlink_rcv+0x10/0x30 -[12236.694299] [] ? netlink_unicast+0xfb/0x180 -[12236.694309] [] ? rtnl_getlink+0x113/0x190 -[12236.694319] [] ? rtnetlink_rcv_msg+0x7a/0x210 -[12236.694331] [] ? sock_has_perm+0x5c/0x70 -[12236.694339] [] ? rtnetlink_rcv+0x30/0x30 -[12236.694346] [] ? netlink_rcv_skb+0x9c/0xc0 -[12236.694354] [] ? rtnetlink_rcv+0x1f/0x30 -[12236.694360] [] ? netlink_unicast+0xfb/0x180 -[12236.694367] [] ? netlink_sendmsg+0x484/0x5d0 -[12236.694376] [] ? __wake_up+0x2f/0x50 -[12236.694387] [] ? sock_sendmsg+0x33/0x40 -[12236.694396] [] ? ___sys_sendmsg+0x22e/0x240 -[12236.694405] [] ? ___sys_recvmsg+0x135/0x1a0 -[12236.694415] [] ? eventfd_write+0x82/0x210 -[12236.694423] [] ? fsnotify+0x32e/0x4c0 -[12236.694429] [] ? wake_up_q+0x60/0x60 -[12236.694434] [] ? __sys_sendmsg+0x39/0x70 -[12236.694440] [] ? entry_SYSCALL_64_fastpath+0x12/0x6a - -It seems so far plausible that the recursive call into rtnetlink_rcv() -looks suspicious. One way, where this could trigger is that the senders -NETLINK_CB(skb).portid was wrongly 0 (which is rtnetlink socket), so -the rtnl_getlink() request's answer would be sent to the kernel instead -to the actual user process, thus grabbing rtnl_mutex() twice. - -One theory would be that netlink_autobind() triggered via netlink_sendmsg() -internally overwrites the -EBUSY error to 0, but where it is wrongly -originating from __netlink_insert() instead. That would reset the -socket's portid to 0, which is then filled into NETLINK_CB(skb).portid -later on. As commit d470e3b483dc ("[NETLINK]: Fix two socket hashing bugs.") -also puts it, -EBUSY should not be propagated from netlink_insert(). - -It looks like it's very unlikely to reproduce. We need to trigger the -rhashtable_insert_rehash() handler under a situation where rehashing -currently occurs (one /rare/ way would be to hit ht->elasticity limits -while not filled enough to expand the hashtable, but that would rather -require a specifically crafted bind() sequence with knowledge about -destination slots, seems unlikely). It probably makes sense to guard -__netlink_insert() in any case and remap that error. It was suggested -that EOVERFLOW might be better than an already overloaded ENOMEM. - -Reference: http://thread.gmane.org/gmane.linux.network/372676 -Reported-by: Linus Torvalds -Signed-off-by: Daniel Borkmann -Acked-by: Herbert Xu -Acked-by: Thomas Graf -Signed-off-by: David S. Miller ---- - net/netlink/af_netlink.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c -index ea5ed7a..4856d97 100644 ---- a/net/netlink/af_netlink.c -+++ b/net/netlink/af_netlink.c -@@ -1094,6 +1094,11 @@ static int netlink_insert(struct sock *sk, u32 portid) - - err = __netlink_insert(table, sk); - if (err) { -+ /* In case the hashtable backend returns with -EBUSY -+ * from here, it must not escape to the caller. -+ */ -+ if (unlikely(err == -EBUSY)) -+ err = -EOVERFLOW; - if (err == -EEXIST) - err = -EADDRINUSE; - nlk_sk(sk)->portid = 0; --- -2.1.0 - - -From 538c509b7f2287f77363c6410216160d082dba22 Mon Sep 17 00:00:00 2001 -From: Eric Dumazet -Date: Mon, 10 Aug 2015 15:07:34 -0700 -Subject: [PATCH 43/46] inet: fix possible request socket leak - -[ Upstream commit 3257d8b12f954c462d29de6201664a846328a522 ] - -In commit b357a364c57c9 ("inet: fix possible panic in -reqsk_queue_unlink()"), I missed fact that tcp_check_req() -can return the listener socket in one case, and that we must -release the request socket refcount or we leak it. - -Tested: - - Following packetdrill test template shows the issue - -0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 -+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 -+0 bind(3, ..., ...) = 0 -+0 listen(3, 1) = 0 - -+0 < S 0:0(0) win 2920 -+0 > S. 0:0(0) ack 1 -+.002 < . 1:1(0) ack 21 win 2920 -+0 > R 21:21(0) - -Fixes: b357a364c57c9 ("inet: fix possible panic in reqsk_queue_unlink()") -Signed-off-by: Eric Dumazet -Signed-off-by: David S. Miller ---- - net/ipv4/tcp_ipv4.c | 2 +- - net/ipv6/tcp_ipv6.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c -index fc1c658..441ca6f 100644 ---- a/net/ipv4/tcp_ipv4.c -+++ b/net/ipv4/tcp_ipv4.c -@@ -1348,7 +1348,7 @@ static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb) - req = inet_csk_search_req(sk, th->source, iph->saddr, iph->daddr); - if (req) { - nsk = tcp_check_req(sk, skb, req, false); -- if (!nsk) -+ if (!nsk || nsk == sk) - reqsk_put(req); - return nsk; - } -diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c -index 3adffb3..e541d68 100644 ---- a/net/ipv6/tcp_ipv6.c -+++ b/net/ipv6/tcp_ipv6.c -@@ -946,7 +946,7 @@ static struct sock *tcp_v6_hnd_req(struct sock *sk, struct sk_buff *skb) - &ipv6_hdr(skb)->daddr, tcp_v6_iif(skb)); - if (req) { - nsk = tcp_check_req(sk, skb, req, false); -- if (!nsk) -+ if (!nsk || nsk == sk) - reqsk_put(req); - return nsk; - } --- -2.1.0 - - -From 5712cc9fa64a51b05baa1fa1e7a56e911ad47e3e Mon Sep 17 00:00:00 2001 -From: Eric Dumazet -Date: Mon, 10 Aug 2015 09:09:13 -0700 -Subject: [PATCH 44/46] inet: fix races with reqsk timers - -[ Upstream commit 2235f2ac75fd2501c251b0b699a9632e80239a6d ] - -reqsk_queue_destroy() and reqsk_queue_unlink() should use -del_timer_sync() instead of del_timer() before calling reqsk_put(), -otherwise we could free a req still used by another cpu. - -But before doing so, reqsk_queue_destroy() must release syn_wait_lock -spinlock or risk a dead lock, as reqsk_timer_handler() might -need to take this same spinlock from reqsk_queue_unlink() (called from -inet_csk_reqsk_queue_drop()) - -Fixes: fa76ce7328b2 ("inet: get rid of central tcp/dccp listener timer") -Signed-off-by: Eric Dumazet -Signed-off-by: David S. Miller ---- - net/core/request_sock.c | 8 +++++++- - net/ipv4/inet_connection_sock.c | 2 +- - 2 files changed, 8 insertions(+), 2 deletions(-) - -diff --git a/net/core/request_sock.c b/net/core/request_sock.c -index 87b22c0..b42f0e2 100644 ---- a/net/core/request_sock.c -+++ b/net/core/request_sock.c -@@ -103,10 +103,16 @@ void reqsk_queue_destroy(struct request_sock_queue *queue) - spin_lock_bh(&queue->syn_wait_lock); - while ((req = lopt->syn_table[i]) != NULL) { - lopt->syn_table[i] = req->dl_next; -+ /* Because of following del_timer_sync(), -+ * we must release the spinlock here -+ * or risk a dead lock. -+ */ -+ spin_unlock_bh(&queue->syn_wait_lock); - atomic_inc(&lopt->qlen_dec); -- if (del_timer(&req->rsk_timer)) -+ if (del_timer_sync(&req->rsk_timer)) - reqsk_put(req); - reqsk_put(req); -+ spin_lock_bh(&queue->syn_wait_lock); - } - spin_unlock_bh(&queue->syn_wait_lock); - } -diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c -index 8976ca4..b27fc40 100644 ---- a/net/ipv4/inet_connection_sock.c -+++ b/net/ipv4/inet_connection_sock.c -@@ -584,7 +584,7 @@ static bool reqsk_queue_unlink(struct request_sock_queue *queue, - } - - spin_unlock(&queue->syn_wait_lock); -- if (del_timer(&req->rsk_timer)) -+ if (del_timer_sync(&req->rsk_timer)) - reqsk_put(req); - return found; - } --- -2.1.0 - - -From 6f5087e42a1d9b2ebb7340eeea948b9524e54862 Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -Date: Sat, 8 Aug 2015 12:58:57 -0700 -Subject: [PATCH 45/46] net: dsa: Do not override PHY interface if already - configured - -[ Upstream commit 211c504a444710b1d8ce3431ac19f2578602ca27 ] - -In case we need to divert reads/writes using the slave MII bus, we may have -already fetched a valid PHY interface property from Device Tree, and that -mode is used by the PHY driver to make configuration decisions. - -If we could not fetch the "phy-mode" property, we will assign p->phy_interface -to PHY_INTERFACE_MODE_NA, such that we can actually check for that condition as -to whether or not we should override the interface value. - -Fixes: 19334920eaf7 ("net: dsa: Set valid phy interface type") -Signed-off-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - net/dsa/slave.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/net/dsa/slave.c b/net/dsa/slave.c -index 827cda56..57978c5 100644 ---- a/net/dsa/slave.c -+++ b/net/dsa/slave.c -@@ -732,7 +732,8 @@ static int dsa_slave_phy_connect(struct dsa_slave_priv *p, - return -ENODEV; - - /* Use already configured phy mode */ -- p->phy_interface = p->phy->interface; -+ if (p->phy_interface == PHY_INTERFACE_MODE_NA) -+ p->phy_interface = p->phy->interface; - phy_connect_direct(slave_dev, p->phy, dsa_slave_adjust_link, - p->phy_interface); - --- -2.1.0 - - -From 75eefed4fed0fd630556144eedcfed7e017ca96a Mon Sep 17 00:00:00 2001 -From: Andy Whitcroft -Date: Thu, 13 Aug 2015 20:49:01 +0100 -Subject: [PATCH 46/46] ipv4: off-by-one in continuation handling in - /proc/net/route - -[ Upstream commit 25b97c016b26039982daaa2c11d83979f93b71ab ] - -When generating /proc/net/route we emit a header followed by a line for -each route. When a short read is performed we will restart this process -based on the open file descriptor. When calculating the start point we -fail to take into account that the 0th entry is the header. This leads -us to skip the first entry when doing a continuation read. - -This can be easily seen with the comparison below: - - while read l; do echo "$l"; done A - cat /proc/net/route >B - diff -bu A B | grep '^[+-]' - -On my example machine I have approximatly 10KB of route output. There we -see the very first non-title element is lost in the while read case, -and an entry around the 8K mark in the cat case: - - +wlan0 00000000 02021EAC 0003 0 0 400 00000000 0 0 0 - -tun1 00C0AC0A 00000000 0001 0 0 950 00C0FFFF 0 0 0 - -Fix up the off-by-one when reaquiring position on continuation. - -Fixes: 8be33e955cb9 ("fib_trie: Fib walk rcu should take a tnode and key instead of a trie and a leaf") -BugLink: http://bugs.launchpad.net/bugs/1483440 -Acked-by: Alexander Duyck -Signed-off-by: Andy Whitcroft -Signed-off-by: David S. Miller ---- - net/ipv4/fib_trie.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c -index 210ceca..0ca933d 100644 ---- a/net/ipv4/fib_trie.c -+++ b/net/ipv4/fib_trie.c -@@ -2453,7 +2453,7 @@ static struct key_vector *fib_route_get_idx(struct fib_route_iter *iter, - key = l->key + 1; - iter->pos++; - -- if (pos-- <= 0) -+ if (--pos <= 0) - break; - - l = NULL; --- -2.1.0 - diff --git a/kernel/kernel/files/patches/mageia/stable-pci-add-dev_flags-bit-to-access-vpd-through-function-0.patch b/kernel/kernel/files/patches/mageia/stable-pci-add-dev_flags-bit-to-access-vpd-through-function-0.patch new file mode 100644 index 00000000..f7bd065f --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-pci-add-dev_flags-bit-to-access-vpd-through-function-0.patch @@ -0,0 +1,135 @@ +From 932c435caba8a2ce473a91753bad0173269ef334 Mon Sep 17 00:00:00 2001 +From: Mark Rustad +Date: Mon, 13 Jul 2015 11:40:02 -0700 +Subject: PCI: Add dev_flags bit to access VPD through function 0 + +From: Mark Rustad + +commit 932c435caba8a2ce473a91753bad0173269ef334 upstream. + +Add a dev_flags bit, PCI_DEV_FLAGS_VPD_REF_F0, to access VPD through +function 0 to provide VPD access on other functions. This is for hardware +devices that provide copies of the same VPD capability registers in +multiple functions. Because the kernel expects that each function has its +own registers, both the locking and the state tracking are affected by VPD +accesses to different functions. + +On such devices for example, if a VPD write is performed on function 0, +*any* later attempt to read VPD from any other function of that device will +hang. This has to do with how the kernel tracks the expected value of the +F bit per function. + +Concurrent accesses to different functions of the same device can not only +hang but also corrupt both read and write VPD data. + +When hangs occur, typically the error message: + + vpd r/w failed. This is likely a firmware bug on this device. + +will be seen. + +Never set this bit on function 0 or there will be an infinite recursion. + +Signed-off-by: Mark Rustad +Signed-off-by: Bjorn Helgaas +Acked-by: Alexander Duyck +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/pci/access.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++- + include/linux/pci.h | 2 + + 2 files changed, 62 insertions(+), 1 deletion(-) + +--- a/drivers/pci/access.c ++++ b/drivers/pci/access.c +@@ -439,6 +439,56 @@ static const struct pci_vpd_ops pci_vpd_ + .release = pci_vpd_pci22_release, + }; + ++static ssize_t pci_vpd_f0_read(struct pci_dev *dev, loff_t pos, size_t count, ++ void *arg) ++{ ++ struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn)); ++ ssize_t ret; ++ ++ if (!tdev) ++ return -ENODEV; ++ ++ ret = pci_read_vpd(tdev, pos, count, arg); ++ pci_dev_put(tdev); ++ return ret; ++} ++ ++static ssize_t pci_vpd_f0_write(struct pci_dev *dev, loff_t pos, size_t count, ++ const void *arg) ++{ ++ struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn)); ++ ssize_t ret; ++ ++ if (!tdev) ++ return -ENODEV; ++ ++ ret = pci_write_vpd(tdev, pos, count, arg); ++ pci_dev_put(tdev); ++ return ret; ++} ++ ++static const struct pci_vpd_ops pci_vpd_f0_ops = { ++ .read = pci_vpd_f0_read, ++ .write = pci_vpd_f0_write, ++ .release = pci_vpd_pci22_release, ++}; ++ ++static int pci_vpd_f0_dev_check(struct pci_dev *dev) ++{ ++ struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn)); ++ int ret = 0; ++ ++ if (!tdev) ++ return -ENODEV; ++ if (!tdev->vpd || !tdev->multifunction || ++ dev->class != tdev->class || dev->vendor != tdev->vendor || ++ dev->device != tdev->device) ++ ret = -ENODEV; ++ ++ pci_dev_put(tdev); ++ return ret; ++} ++ + int pci_vpd_pci22_init(struct pci_dev *dev) + { + struct pci_vpd_pci22 *vpd; +@@ -447,12 +497,21 @@ int pci_vpd_pci22_init(struct pci_dev *d + cap = pci_find_capability(dev, PCI_CAP_ID_VPD); + if (!cap) + return -ENODEV; ++ if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0) { ++ int ret = pci_vpd_f0_dev_check(dev); ++ ++ if (ret) ++ return ret; ++ } + vpd = kzalloc(sizeof(*vpd), GFP_ATOMIC); + if (!vpd) + return -ENOMEM; + + vpd->base.len = PCI_VPD_PCI22_SIZE; +- vpd->base.ops = &pci_vpd_pci22_ops; ++ if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0) ++ vpd->base.ops = &pci_vpd_f0_ops; ++ else ++ vpd->base.ops = &pci_vpd_pci22_ops; + mutex_init(&vpd->lock); + vpd->cap = cap; + vpd->busy = false; +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -180,6 +180,8 @@ enum pci_dev_flags { + PCI_DEV_FLAGS_NO_BUS_RESET = (__force pci_dev_flags_t) (1 << 6), + /* Do not use PM reset even if device advertises NoSoftRst- */ + PCI_DEV_FLAGS_NO_PM_RESET = (__force pci_dev_flags_t) (1 << 7), ++ /* Get VPD from function 0 VPD */ ++ PCI_DEV_FLAGS_VPD_REF_F0 = (__force pci_dev_flags_t) (1 << 8), + }; + + enum pci_irq_reroute_variant { diff --git a/kernel/kernel/files/patches/mageia/stable-pci-add-vpd-function-0-quirk-for-intel-ethernet-devices.patch b/kernel/kernel/files/patches/mageia/stable-pci-add-vpd-function-0-quirk-for-intel-ethernet-devices.patch new file mode 100644 index 00000000..b31bb387 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-pci-add-vpd-function-0-quirk-for-intel-ethernet-devices.patch @@ -0,0 +1,41 @@ +From 7aa6ca4d39edf01f997b9e02cf6d2fdeb224f351 Mon Sep 17 00:00:00 2001 +From: Mark Rustad +Date: Mon, 13 Jul 2015 11:40:07 -0700 +Subject: PCI: Add VPD function 0 quirk for Intel Ethernet devices + +From: Mark Rustad + +commit 7aa6ca4d39edf01f997b9e02cf6d2fdeb224f351 upstream. + +Set the PCI_DEV_FLAGS_VPD_REF_F0 flag on all Intel Ethernet device +functions other than function 0, so that on multi-function devices, we will +always read VPD from function 0 instead of from the other functions. + +[bhelgaas: changelog] +Signed-off-by: Mark Rustad +Signed-off-by: Bjorn Helgaas +Acked-by: Alexander Duyck +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/pci/quirks.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -1903,6 +1903,15 @@ static void quirk_netmos(struct pci_dev + DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, + PCI_CLASS_COMMUNICATION_SERIAL, 8, quirk_netmos); + ++static void quirk_f0_vpd_link(struct pci_dev *dev) ++{ ++ if (!dev->multifunction || !PCI_FUNC(dev->devfn)) ++ return; ++ dev->dev_flags |= PCI_DEV_FLAGS_VPD_REF_F0; ++} ++DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, ++ PCI_CLASS_NETWORK_ETHERNET, 8, quirk_f0_vpd_link); ++ + static void quirk_e100_interrupt(struct pci_dev *dev) + { + u16 command, pmcsr; diff --git a/kernel/kernel/files/patches/mageia/stable-pci-disable-async-suspend-resume-for-jmicron-multi-function-sata-ahci.patch b/kernel/kernel/files/patches/mageia/stable-pci-disable-async-suspend-resume-for-jmicron-multi-function-sata-ahci.patch new file mode 100644 index 00000000..ab31953c --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-pci-disable-async-suspend-resume-for-jmicron-multi-function-sata-ahci.patch @@ -0,0 +1,120 @@ +From 91f15fb30c77d4a0d0d9b97e5cec647650853145 Mon Sep 17 00:00:00 2001 +From: Zhang Rui +Date: Mon, 24 Aug 2015 15:27:11 -0500 +Subject: PCI: Disable async suspend/resume for JMicron multi-function SATA/AHCI + +From: Zhang Rui + +commit 91f15fb30c77d4a0d0d9b97e5cec647650853145 upstream. + +On multi-function JMicron SATA/PATA/AHCI devices, the PATA controller at +function 1 doesn't work if it is powered on before the SATA controller at +function 0. The result is that PATA doesn't work after resume, and we +print messages like this: + + pata_jmicron 0000:02:00.1: Refused to change power state, currently in D3 + irq 17: nobody cared (try booting with the "irqpoll" option) + +Async resume was introduced in v3.15 by 76569faa62c4 ("PM / sleep: +Asynchronous threads for resume_noirq"). Prior to that, we powered on +the functions in order, so this problem shouldn't happen. + +e6b7e41cdd8c ("ata: Disabling the async PM for JMicron chip 363/361") +solved the problem for JMicron 361 and 363 devices. With async suspend +disabled, we always power on function 0 before function 1. + +Barto then reported the same problem with a JMicron 368 (see comment #57 in +the bugzilla). + +Rather than extending the blacklist piecemeal, disable async suspend for +all JMicron multi-function SATA/PATA/AHCI devices. + +This quirk could stay in the ahci and pata_jmicron drivers, but it's likely +the problem will occur even if pata_jmicron isn't loaded until after the +suspend/resume. Making it a PCI quirk ensures that we'll preserve the +power-on order even if the drivers aren't loaded. + +[bhelgaas: changelog, limit to multi-function, limit to IDE/ATA] +Link: https://bugzilla.kernel.org/show_bug.cgi?id=81551 +Reported-and-tested-by: Barto +Signed-off-by: Zhang Rui +Signed-off-by: Bjorn Helgaas +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/ata/ahci.c | 13 +------------ + drivers/ata/pata_jmicron.c | 12 ------------ + drivers/pci/quirks.c | 12 ++++++++++++ + 3 files changed, 13 insertions(+), 24 deletions(-) + +--- a/drivers/ata/ahci.c ++++ b/drivers/ata/ahci.c +@@ -349,6 +349,7 @@ static const struct pci_device_id ahci_p + /* JMicron 362B and 362C have an AHCI function with IDE class code */ + { PCI_VDEVICE(JMICRON, 0x2362), board_ahci_ign_iferr }, + { PCI_VDEVICE(JMICRON, 0x236f), board_ahci_ign_iferr }, ++ /* May need to update quirk_jmicron_async_suspend() for additions */ + + /* ATI */ + { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */ +@@ -1377,18 +1378,6 @@ static int ahci_init_one(struct pci_dev + else if (pdev->vendor == 0x1c44 && pdev->device == 0x8000) + ahci_pci_bar = AHCI_PCI_BAR_ENMOTUS; + +- /* +- * The JMicron chip 361/363 contains one SATA controller and one +- * PATA controller,for powering on these both controllers, we must +- * follow the sequence one by one, otherwise one of them can not be +- * powered on successfully, so here we disable the async suspend +- * method for these chips. +- */ +- if (pdev->vendor == PCI_VENDOR_ID_JMICRON && +- (pdev->device == PCI_DEVICE_ID_JMICRON_JMB363 || +- pdev->device == PCI_DEVICE_ID_JMICRON_JMB361)) +- device_disable_async_suspend(&pdev->dev); +- + /* acquire resources */ + rc = pcim_enable_device(pdev); + if (rc) +--- a/drivers/ata/pata_jmicron.c ++++ b/drivers/ata/pata_jmicron.c +@@ -143,18 +143,6 @@ static int jmicron_init_one (struct pci_ + }; + const struct ata_port_info *ppi[] = { &info, NULL }; + +- /* +- * The JMicron chip 361/363 contains one SATA controller and one +- * PATA controller,for powering on these both controllers, we must +- * follow the sequence one by one, otherwise one of them can not be +- * powered on successfully, so here we disable the async suspend +- * method for these chips. +- */ +- if (pdev->vendor == PCI_VENDOR_ID_JMICRON && +- (pdev->device == PCI_DEVICE_ID_JMICRON_JMB363 || +- pdev->device == PCI_DEVICE_ID_JMICRON_JMB361)) +- device_disable_async_suspend(&pdev->dev); +- + return ata_pci_bmdma_init_one(pdev, ppi, &jmicron_sht, NULL, 0); + } + +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -1576,6 +1576,18 @@ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDO + + #endif + ++static void quirk_jmicron_async_suspend(struct pci_dev *dev) ++{ ++ if (dev->multifunction) { ++ device_disable_async_suspend(&dev->dev); ++ dev_info(&dev->dev, "async suspend disabled to avoid multi-function power-on ordering issue\n"); ++ } ++} ++DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE, 8, quirk_jmicron_async_suspend); ++DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_CLASS_STORAGE_SATA_AHCI, 0, quirk_jmicron_async_suspend); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_JMICRON, 0x2362, quirk_jmicron_async_suspend); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_JMICRON, 0x236f, quirk_jmicron_async_suspend); ++ + #ifdef CONFIG_X86_IO_APIC + static void quirk_alder_ioapic(struct pci_dev *pdev) + { diff --git a/kernel/kernel/files/patches/mageia/stable-pci-fix-ti816x-class-code-quirk.patch b/kernel/kernel/files/patches/mageia/stable-pci-fix-ti816x-class-code-quirk.patch new file mode 100644 index 00000000..cb1d71e3 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-pci-fix-ti816x-class-code-quirk.patch @@ -0,0 +1,45 @@ +From d1541dc977d376406f4584d8eb055488655c98ec Mon Sep 17 00:00:00 2001 +From: Bjorn Helgaas +Date: Fri, 19 Jun 2015 15:58:24 -0500 +Subject: PCI: Fix TI816X class code quirk + +From: Bjorn Helgaas + +commit d1541dc977d376406f4584d8eb055488655c98ec upstream. + +In fixup_ti816x_class(), we assigned "class = PCI_CLASS_MULTIMEDIA_VIDEO". +But PCI_CLASS_MULTIMEDIA_VIDEO is only the two-byte base class/sub-class +and needs to be shifted to make space for the low-order interface byte. + +Shift PCI_CLASS_MULTIMEDIA_VIDEO to set the correct class code. + +Fixes: 63c4408074cb ("PCI: Add quirk for setting valid class for TI816X Endpoint") +Signed-off-by: Bjorn Helgaas +CC: Hemant Pedanekar +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/pci/quirks.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -2838,12 +2838,15 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_IN + + static void fixup_ti816x_class(struct pci_dev *dev) + { ++ u32 class = dev->class; ++ + /* TI 816x devices do not have class code set when in PCIe boot mode */ +- dev_info(&dev->dev, "Setting PCI class for 816x PCIe device\n"); +- dev->class = PCI_CLASS_MULTIMEDIA_VIDEO; ++ dev->class = PCI_CLASS_MULTIMEDIA_VIDEO << 8; ++ dev_info(&dev->dev, "PCI class overridden (%#08x -> %#08x)\n", ++ class, dev->class); + } + DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_TI, 0xb800, +- PCI_CLASS_NOT_DEFINED, 0, fixup_ti816x_class); ++ PCI_CLASS_NOT_DEFINED, 0, fixup_ti816x_class); + + /* Some PCIe devices do not work reliably with the claimed maximum + * payload size supported. diff --git a/kernel/kernel/files/patches/mageia/stable-perf-fix-double-free-of-the-aux-buffer.patch b/kernel/kernel/files/patches/mageia/stable-perf-fix-double-free-of-the-aux-buffer.patch deleted file mode 100644 index ec441704..00000000 --- a/kernel/kernel/files/patches/mageia/stable-perf-fix-double-free-of-the-aux-buffer.patch +++ /dev/null @@ -1,49 +0,0 @@ -From ee9397a6fb9bc4e52677f5e33eed4abee0f515e6 Mon Sep 17 00:00:00 2001 -From: Ben Hutchings -Date: Mon, 27 Jul 2015 00:31:08 +0100 -Subject: perf: Fix double-free of the AUX buffer - -From: Ben Hutchings - -commit ee9397a6fb9bc4e52677f5e33eed4abee0f515e6 upstream. - -If rb->aux_refcount is decremented to zero before rb->refcount, -__rb_free_aux() may be called twice resulting in a double free of -rb->aux_pages. Fix this by adding a check to __rb_free_aux(). - -Signed-off-by: Ben Hutchings -Signed-off-by: Peter Zijlstra (Intel) -Cc: Alexander Shishkin -Cc: Arnaldo Carvalho de Melo -Cc: Linus Torvalds -Cc: Peter Zijlstra -Cc: Thomas Gleixner -Fixes: 57ffc5ca679f ("perf: Fix AUX buffer refcounting") -Link: http://lkml.kernel.org/r/1437953468.12842.17.camel@decadent.org.uk -Signed-off-by: Ingo Molnar -Signed-off-by: Greg Kroah-Hartman - ---- - kernel/events/ring_buffer.c | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - ---- a/kernel/events/ring_buffer.c -+++ b/kernel/events/ring_buffer.c -@@ -547,11 +547,13 @@ static void __rb_free_aux(struct ring_bu - rb->aux_priv = NULL; - } - -- for (pg = 0; pg < rb->aux_nr_pages; pg++) -- rb_free_aux_page(rb, pg); -+ if (rb->aux_nr_pages) { -+ for (pg = 0; pg < rb->aux_nr_pages; pg++) -+ rb_free_aux_page(rb, pg); - -- kfree(rb->aux_pages); -- rb->aux_nr_pages = 0; -+ kfree(rb->aux_pages); -+ rb->aux_nr_pages = 0; -+ } - } - - void rb_free_aux(struct ring_buffer *rb) diff --git a/kernel/kernel/files/patches/mageia/stable-perf-fix-fasync-handling-on-inherited-events.patch b/kernel/kernel/files/patches/mageia/stable-perf-fix-fasync-handling-on-inherited-events.patch deleted file mode 100644 index c9c5315b..00000000 --- a/kernel/kernel/files/patches/mageia/stable-perf-fix-fasync-handling-on-inherited-events.patch +++ /dev/null @@ -1,69 +0,0 @@ -From fed66e2cdd4f127a43fd11b8d92a99bdd429528c Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra -Date: Thu, 11 Jun 2015 10:32:01 +0200 -Subject: perf: Fix fasync handling on inherited events - -From: Peter Zijlstra - -commit fed66e2cdd4f127a43fd11b8d92a99bdd429528c upstream. - -Vince reported that the fasync signal stuff doesn't work proper for -inherited events. So fix that. - -Installing fasync allocates memory and sets filp->f_flags |= FASYNC, -which upon the demise of the file descriptor ensures the allocation is -freed and state is updated. - -Now for perf, we can have the events stick around for a while after the -original FD is dead because of references from child events. So we -cannot copy the fasync pointer around. We can however consistently use -the parent's fasync, as that will be updated. - -Reported-and-Tested-by: Vince Weaver -Signed-off-by: Peter Zijlstra (Intel) -Cc: Arnaldo Carvalho deMelo -Cc: Linus Torvalds -Cc: Peter Zijlstra -Cc: Thomas Gleixner -Cc: eranian@google.com -Link: http://lkml.kernel.org/r/1434011521.1495.71.camel@twins -Signed-off-by: Ingo Molnar -Signed-off-by: Greg Kroah-Hartman - ---- - kernel/events/core.c | 12 ++++++++++-- - 1 file changed, 10 insertions(+), 2 deletions(-) - ---- a/kernel/events/core.c -+++ b/kernel/events/core.c -@@ -4766,12 +4766,20 @@ static const struct file_operations perf - * to user-space before waking everybody up. - */ - -+static inline struct fasync_struct **perf_event_fasync(struct perf_event *event) -+{ -+ /* only the parent has fasync state */ -+ if (event->parent) -+ event = event->parent; -+ return &event->fasync; -+} -+ - void perf_event_wakeup(struct perf_event *event) - { - ring_buffer_wakeup(event); - - if (event->pending_kill) { -- kill_fasync(&event->fasync, SIGIO, event->pending_kill); -+ kill_fasync(perf_event_fasync(event), SIGIO, event->pending_kill); - event->pending_kill = 0; - } - } -@@ -6117,7 +6125,7 @@ static int __perf_event_overflow(struct - else - perf_event_output(event, data, regs); - -- if (event->fasync && event->pending_kill) { -+ if (*perf_event_fasync(event) && event->pending_kill) { - event->pending_wakeup = 1; - irq_work_queue(&event->pending); - } diff --git a/kernel/kernel/files/patches/mageia/stable-perf-fix-perf_event_ioc_period-migration-race.patch b/kernel/kernel/files/patches/mageia/stable-perf-fix-perf_event_ioc_period-migration-race.patch deleted file mode 100644 index 15f3ac35..00000000 --- a/kernel/kernel/files/patches/mageia/stable-perf-fix-perf_event_ioc_period-migration-race.patch +++ /dev/null @@ -1,125 +0,0 @@ -From c7999c6f3fed9e383d3131474588f282ae6d56b9 Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra -Date: Tue, 4 Aug 2015 19:22:49 +0200 -Subject: perf: Fix PERF_EVENT_IOC_PERIOD migration race - -From: Peter Zijlstra - -commit c7999c6f3fed9e383d3131474588f282ae6d56b9 upstream. - -I ran the perf fuzzer, which triggered some WARN()s which are due to -trying to stop/restart an event on the wrong CPU. - -Use the normal IPI pattern to ensure we run the code on the correct CPU. - -Signed-off-by: Peter Zijlstra (Intel) -Cc: Vince Weaver -Cc: Linus Torvalds -Cc: Peter Zijlstra -Cc: Thomas Gleixner -Fixes: bad7192b842c ("perf: Fix PERF_EVENT_IOC_PERIOD to force-reset the period") -Signed-off-by: Ingo Molnar -Signed-off-by: Greg Kroah-Hartman - ---- - kernel/events/core.c | 75 +++++++++++++++++++++++++++++++++++++-------------- - 1 file changed, 55 insertions(+), 20 deletions(-) - ---- a/kernel/events/core.c -+++ b/kernel/events/core.c -@@ -3976,28 +3976,21 @@ static void perf_event_for_each(struct p - perf_event_for_each_child(sibling, func); - } - --static int perf_event_period(struct perf_event *event, u64 __user *arg) --{ -- struct perf_event_context *ctx = event->ctx; -- int ret = 0, active; -+struct period_event { -+ struct perf_event *event; - u64 value; -+}; - -- if (!is_sampling_event(event)) -- return -EINVAL; -- -- if (copy_from_user(&value, arg, sizeof(value))) -- return -EFAULT; -- -- if (!value) -- return -EINVAL; -+static int __perf_event_period(void *info) -+{ -+ struct period_event *pe = info; -+ struct perf_event *event = pe->event; -+ struct perf_event_context *ctx = event->ctx; -+ u64 value = pe->value; -+ bool active; - -- raw_spin_lock_irq(&ctx->lock); -+ raw_spin_lock(&ctx->lock); - if (event->attr.freq) { -- if (value > sysctl_perf_event_sample_rate) { -- ret = -EINVAL; -- goto unlock; -- } -- - event->attr.sample_freq = value; - } else { - event->attr.sample_period = value; -@@ -4016,11 +4009,53 @@ static int perf_event_period(struct perf - event->pmu->start(event, PERF_EF_RELOAD); - perf_pmu_enable(ctx->pmu); - } -+ raw_spin_unlock(&ctx->lock); -+ -+ return 0; -+} -+ -+static int perf_event_period(struct perf_event *event, u64 __user *arg) -+{ -+ struct period_event pe = { .event = event, }; -+ struct perf_event_context *ctx = event->ctx; -+ struct task_struct *task; -+ u64 value; -+ -+ if (!is_sampling_event(event)) -+ return -EINVAL; -+ -+ if (copy_from_user(&value, arg, sizeof(value))) -+ return -EFAULT; -+ -+ if (!value) -+ return -EINVAL; -+ -+ if (event->attr.freq && value > sysctl_perf_event_sample_rate) -+ return -EINVAL; -+ -+ task = ctx->task; -+ pe.value = value; -+ -+ if (!task) { -+ cpu_function_call(event->cpu, __perf_event_period, &pe); -+ return 0; -+ } -+ -+retry: -+ if (!task_function_call(task, __perf_event_period, &pe)) -+ return 0; -+ -+ raw_spin_lock_irq(&ctx->lock); -+ if (ctx->is_active) { -+ raw_spin_unlock_irq(&ctx->lock); -+ task = ctx->task; -+ goto retry; -+ } - --unlock: -+ __perf_event_period(&pe); - raw_spin_unlock_irq(&ctx->lock); - -- return ret; -+ return 0; - } - - static const struct file_operations perf_fops; diff --git a/kernel/kernel/files/patches/mageia/stable-perf-fix-running-time-accounting.patch b/kernel/kernel/files/patches/mageia/stable-perf-fix-running-time-accounting.patch deleted file mode 100644 index 7fae9b52..00000000 --- a/kernel/kernel/files/patches/mageia/stable-perf-fix-running-time-accounting.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 00a2916f7f82c348a2a94dbb572874173bc308a3 Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra -Date: Mon, 27 Jul 2015 10:35:07 +0200 -Subject: perf: Fix running time accounting - -From: Peter Zijlstra - -commit 00a2916f7f82c348a2a94dbb572874173bc308a3 upstream. - -A recent fix to the shadow timestamp inadvertly broke the running time -accounting. - -We must not update the running timestamp if we fail to schedule the -event, the event will not have ran. This can (and did) result in -negative total runtime because the stopped timestamp was before the -running timestamp (we 'started' but never stopped the event -- because -it never really started we didn't have to stop it either). - -Reported-and-Tested-by: Vince Weaver -Fixes: 72f669c0086f ("perf: Update shadow timestamp before add event") -Signed-off-by: Peter Zijlstra (Intel) -Cc: Shaohua Li -Signed-off-by: Thomas Gleixner -Signed-off-by: Greg Kroah-Hartman - ---- - kernel/events/core.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/kernel/events/core.c -+++ b/kernel/events/core.c -@@ -1886,8 +1886,6 @@ event_sched_in(struct perf_event *event, - - perf_pmu_disable(event->pmu); - -- event->tstamp_running += tstamp - event->tstamp_stopped; -- - perf_set_shadow_time(event, ctx, tstamp); - - perf_log_itrace_start(event); -@@ -1899,6 +1897,8 @@ event_sched_in(struct perf_event *event, - goto out; - } - -+ event->tstamp_running += tstamp - event->tstamp_stopped; -+ - if (!is_software_event(event)) - cpuctx->active_oncpu++; - if (!ctx->nr_active++) diff --git a/kernel/kernel/files/patches/mageia/stable-pm-clk-don-t-return-int-on-__pm_clk_enable.patch b/kernel/kernel/files/patches/mageia/stable-pm-clk-don-t-return-int-on-__pm_clk_enable.patch new file mode 100644 index 00000000..36cb2f78 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-pm-clk-don-t-return-int-on-__pm_clk_enable.patch @@ -0,0 +1,48 @@ +From f4745a92781b872455f32feb01d1dce92aefcb6c Mon Sep 17 00:00:00 2001 +From: Colin Ian King +Date: Mon, 29 Jun 2015 22:13:38 +0100 +Subject: PM / clk: don't return int on __pm_clk_enable() + +From: Colin Ian King + +commit f4745a92781b872455f32feb01d1dce92aefcb6c upstream. + +Static analysis by cppcheck found an issue that was recently introduced by +commit 471f7707b6f0b1 ("PM / clock_ops: make __pm_clk_enable more generic") +where a return status in ret was not being initialised and garbage +being returned when ce->status >= PCE_STATUS_ERROR. + +The fact that ret is not being checked by the caller and that +ret is only used internally __pm_clk_enable() to check if clk_enable() +was OK means we can ignore returning it instead turn +__pm_clk_enable() into function with a void return. + +Fixes: 471f7707b6f0b1 ("PM / clock_ops: make __pm_clk_enable more generic") +Signed-off-by: Colin Ian King +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/base/power/clock_ops.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/base/power/clock_ops.c ++++ b/drivers/base/power/clock_ops.c +@@ -37,7 +37,7 @@ struct pm_clock_entry { + * @dev: The device for the given clock + * @ce: PM clock entry corresponding to the clock. + */ +-static inline int __pm_clk_enable(struct device *dev, struct pm_clock_entry *ce) ++static inline void __pm_clk_enable(struct device *dev, struct pm_clock_entry *ce) + { + int ret; + +@@ -49,8 +49,6 @@ static inline int __pm_clk_enable(struct + dev_err(dev, "%s: failed to enable clk %p, error %d\n", + __func__, ce->clk, ret); + } +- +- return ret; + } + + /** diff --git a/kernel/kernel/files/patches/mageia/stable-rsi-fix-failure-to-load-firmware-after-memory-leak-fix-and-fix-the-leak.patch b/kernel/kernel/files/patches/mageia/stable-rsi-fix-failure-to-load-firmware-after-memory-leak-fix-and-fix-the-leak.patch deleted file mode 100644 index a20f3929..00000000 --- a/kernel/kernel/files/patches/mageia/stable-rsi-fix-failure-to-load-firmware-after-memory-leak-fix-and-fix-the-leak.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 5d5cd85ff441534a52f23f821d0a7c644d3b6cce Mon Sep 17 00:00:00 2001 -From: Mike Looijmans -Date: Tue, 28 Jul 2015 07:51:01 +0200 -Subject: rsi: Fix failure to load firmware after memory leak fix and fix the leak - -From: Mike Looijmans - -commit 5d5cd85ff441534a52f23f821d0a7c644d3b6cce upstream. - -Fixes commit eae79b4f3e82 ("rsi: fix memory leak in rsi_load_ta_instructions()") -which stopped the driver from functioning. - -Firmware data has been allocated using vmalloc(), resulting in memory -that cannot be used for DMA. Hence the firmware was first copied to a -buffer allocated with kmalloc() in the original code. This patch reverts -the commit and only calls "kfree()" to release the buffer after sending -the data. This fixes the memory leak without breaking the driver. - -Add a comment to the kmemdup() calls to explain why this is done, and abort -if memory allocation fails. - -Tested on a Topic Miami-Florida board which contains the rsi SDIO chip. - -Also added the same kfree() call to the USB glue driver. This was not -tested on actual hardware though, as I only have the SDIO version. - -Fixes: eae79b4f3e82 ("rsi: fix memory leak in rsi_load_ta_instructions()") -Signed-off-by: Mike Looijmans -Signed-off-by: Kalle Valo -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 8 +++++++- - drivers/net/wireless/rsi/rsi_91x_usb_ops.c | 4 ++++ - 2 files changed, 11 insertions(+), 1 deletion(-) - ---- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c -+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c -@@ -172,6 +172,7 @@ static int rsi_load_ta_instructions(stru - (struct rsi_91x_sdiodev *)adapter->rsi_dev; - u32 len; - u32 num_blocks; -+ const u8 *fw; - const struct firmware *fw_entry = NULL; - u32 block_size = dev->tx_blk_size; - int status = 0; -@@ -200,6 +201,10 @@ static int rsi_load_ta_instructions(stru - return status; - } - -+ /* Copy firmware into DMA-accessible memory */ -+ fw = kmemdup(fw_entry->data, fw_entry->size, GFP_KERNEL); -+ if (!fw) -+ return -ENOMEM; - len = fw_entry->size; - - if (len % 4) -@@ -210,7 +215,8 @@ static int rsi_load_ta_instructions(stru - rsi_dbg(INIT_ZONE, "%s: Instruction size:%d\n", __func__, len); - rsi_dbg(INIT_ZONE, "%s: num blocks: %d\n", __func__, num_blocks); - -- status = rsi_copy_to_card(common, fw_entry->data, len, num_blocks); -+ status = rsi_copy_to_card(common, fw, len, num_blocks); -+ kfree(fw); - release_firmware(fw_entry); - return status; - } ---- a/drivers/net/wireless/rsi/rsi_91x_usb_ops.c -+++ b/drivers/net/wireless/rsi/rsi_91x_usb_ops.c -@@ -146,7 +146,10 @@ static int rsi_load_ta_instructions(stru - return status; - } - -+ /* Copy firmware into DMA-accessible memory */ - fw = kmemdup(fw_entry->data, fw_entry->size, GFP_KERNEL); -+ if (!fw) -+ return -ENOMEM; - len = fw_entry->size; - - if (len % 4) -@@ -158,6 +161,7 @@ static int rsi_load_ta_instructions(stru - rsi_dbg(INIT_ZONE, "%s: num blocks: %d\n", __func__, num_blocks); - - status = rsi_copy_to_card(common, fw, len, num_blocks); -+ kfree(fw); - release_firmware(fw_entry); - return status; - } diff --git a/kernel/kernel/files/patches/mageia/stable-rtlwifi-fix-null-dereference-when-pci-driver-used-as-an-ap.patch b/kernel/kernel/files/patches/mageia/stable-rtlwifi-fix-null-dereference-when-pci-driver-used-as-an-ap.patch deleted file mode 100644 index e15d8bb4..00000000 --- a/kernel/kernel/files/patches/mageia/stable-rtlwifi-fix-null-dereference-when-pci-driver-used-as-an-ap.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 7c62940165e9ae4004ce4e6b5117330bab94df68 Mon Sep 17 00:00:00 2001 -From: Luis Felipe Dominguez Vega -Date: Wed, 29 Jul 2015 21:11:20 -0500 -Subject: rtlwifi: Fix NULL dereference when PCI driver used as an AP - -From: Luis Felipe Dominguez Vega - -commit 7c62940165e9ae4004ce4e6b5117330bab94df68 upstream. - -In commit 33511b157bbcebaef853cc1811992b664a2e5862 ("rtlwifi: add support to -send beacon frame"), the mechanism for sending beacons was established. That -patch works correctly for rtl8192cu, but there is a possibility of getting -the following warnings in the PCI drivers: - -WARNING: CPU: 1 PID: 2439 at net/mac80211/driver-ops.h:12 -ieee80211_bss_info_change_notify+0x179/0x1d0 [mac80211]() -wlp5s0: Failed check-sdata-in-driver check, flags: 0x0 - -The warning is followed by a NULL pointer dereference as follows: - -BUG: unable to handle kernel NULL pointer dereference at 0000000000000006 -IP: [] rtl_get_tcb_desc+0x5e/0x760 [rtlwifi] - -This problem was reported at http://thread.gmane.org/gmane.linux.kernel.wireless.general/138645, -but no solution was found at that time. - -The problem was also reported at https://bugzilla.kernel.org/show_bug.cgi?id=9744 -and this solution was developed and tested there. - -The USB driver works with a NULL final argument in the adapter_tx() callback; -however, the PCI drivers need a struct rtl_tcb_desc in that position. - -Fixes: 33511b157bbc ("rtlwifi: add support to send beacon frame.") -Signed-off-by: Luis Felipe Dominguez Vega -Signed-off-by: Larry Finger -Signed-off-by: Kalle Valo -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/net/wireless/rtlwifi/core.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - ---- a/drivers/net/wireless/rtlwifi/core.c -+++ b/drivers/net/wireless/rtlwifi/core.c -@@ -1015,9 +1015,12 @@ static void send_beacon_frame(struct iee - { - struct rtl_priv *rtlpriv = rtl_priv(hw); - struct sk_buff *skb = ieee80211_beacon_get(hw, vif); -+ struct rtl_tcb_desc tcb_desc; - -- if (skb) -- rtlpriv->intf_ops->adapter_tx(hw, NULL, skb, NULL); -+ if (skb) { -+ memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc)); -+ rtlpriv->intf_ops->adapter_tx(hw, NULL, skb, &tcb_desc); -+ } - } - - static void rtl_op_bss_info_changed(struct ieee80211_hw *hw, diff --git a/kernel/kernel/files/patches/mageia/stable-rtlwifi-rtl8723be-add-module-parameter-for-msi-interrupts.patch b/kernel/kernel/files/patches/mageia/stable-rtlwifi-rtl8723be-add-module-parameter-for-msi-interrupts.patch deleted file mode 100644 index 2ab05f5e..00000000 --- a/kernel/kernel/files/patches/mageia/stable-rtlwifi-rtl8723be-add-module-parameter-for-msi-interrupts.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 741e3b9902d11585e18bfc7f8d47e913616bb070 Mon Sep 17 00:00:00 2001 -From: Larry Finger -Date: Sun, 2 Aug 2015 13:24:13 -0500 -Subject: rtlwifi: rtl8723be: Add module parameter for MSI interrupts - -From: Larry Finger - -commit 741e3b9902d11585e18bfc7f8d47e913616bb070 upstream. - -The driver code allows for the disabling of MSI interrupts; however the -module_parm line was missed and the option fails to show with modinfo. - -Signed-off-by: Larry Finger -Signed-off-by: Kalle Valo -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/net/wireless/rtlwifi/rtl8723be/sw.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/net/wireless/rtlwifi/rtl8723be/sw.c -+++ b/drivers/net/wireless/rtlwifi/rtl8723be/sw.c -@@ -385,6 +385,7 @@ module_param_named(debug, rtl8723be_mod_ - module_param_named(ips, rtl8723be_mod_params.inactiveps, bool, 0444); - module_param_named(swlps, rtl8723be_mod_params.swctrl_lps, bool, 0444); - module_param_named(fwlps, rtl8723be_mod_params.fwctrl_lps, bool, 0444); -+module_param_named(msi, rtl8723be_mod_params.msi_support, bool, 0444); - module_param_named(disable_watchdog, rtl8723be_mod_params.disable_watchdog, - bool, 0444); - MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n"); diff --git a/kernel/kernel/files/patches/mageia/stable-s390-sclp-fix-compile-error.patch b/kernel/kernel/files/patches/mageia/stable-s390-sclp-fix-compile-error.patch new file mode 100644 index 00000000..92376b16 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-s390-sclp-fix-compile-error.patch @@ -0,0 +1,35 @@ +From a313bdc5310dd807655d3ca3eb2219cd65dfe45a Mon Sep 17 00:00:00 2001 +From: Sebastian Ott +Date: Thu, 25 Jun 2015 09:32:22 +0200 +Subject: s390/sclp: fix compile error + +From: Sebastian Ott + +commit a313bdc5310dd807655d3ca3eb2219cd65dfe45a upstream. + +Fix this error when compiling with CONFIG_SMP=n and +CONFIG_DYNAMIC_DEBUG=y: + +drivers/s390/char/sclp_early.c: In function 'sclp_read_info_early': +drivers/s390/char/sclp_early.c:87:19: error: 'EBUSY' undeclared (first use in this function) + } while (rc == -EBUSY); + ^ + +Signed-off-by: Sebastian Ott +Signed-off-by: Martin Schwidefsky +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/s390/char/sclp_early.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/s390/char/sclp_early.c ++++ b/drivers/s390/char/sclp_early.c +@@ -7,6 +7,7 @@ + #define KMSG_COMPONENT "sclp_early" + #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt + ++#include + #include + #include + #include diff --git a/kernel/kernel/files/patches/mageia/stable-s390-setup-fix-novx-parameter.patch b/kernel/kernel/files/patches/mageia/stable-s390-setup-fix-novx-parameter.patch new file mode 100644 index 00000000..1ed34af3 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-s390-setup-fix-novx-parameter.patch @@ -0,0 +1,74 @@ +From 89b1145e93771d727645c96e323539c029b63f1c Mon Sep 17 00:00:00 2001 +From: Martin Schwidefsky +Date: Fri, 14 Aug 2015 13:20:28 +0200 +Subject: s390/setup: fix novx parameter + +From: Martin Schwidefsky + +commit 89b1145e93771d727645c96e323539c029b63f1c upstream. + +The novx parameter disables the vector facility but the HWCAP_S390_VXRS +bit in the ELf hardware capabilies is always set if the machine has +the vector facility. If the user space program uses the "vx" string +in the features field of /proc/cpuinfo to utilize vector instruction +it will crash if the novx kernel paramter is set. + +Convert setup_hwcaps to an arch_initcall and use MACHINE_HAS_VX to +decide if the HWCAPS_S390_VXRS bit needs to be set. + +Reported-by: Ulrich Weigand +Reviewed-by: Heiko Carstens +Signed-off-by: Martin Schwidefsky +Signed-off-by: Greg Kroah-Hartman + +--- + arch/s390/kernel/setup.c | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +--- a/arch/s390/kernel/setup.c ++++ b/arch/s390/kernel/setup.c +@@ -683,7 +683,7 @@ static void __init setup_memory(void) + /* + * Setup hardware capabilities. + */ +-static void __init setup_hwcaps(void) ++static int __init setup_hwcaps(void) + { + static const int stfl_bits[6] = { 0, 2, 7, 17, 19, 21 }; + struct cpuid cpu_id; +@@ -749,9 +749,11 @@ static void __init setup_hwcaps(void) + elf_hwcap |= HWCAP_S390_TE; + + /* +- * Vector extension HWCAP_S390_VXRS is bit 11. ++ * Vector extension HWCAP_S390_VXRS is bit 11. The Vector extension ++ * can be disabled with the "novx" parameter. Use MACHINE_HAS_VX ++ * instead of facility bit 129. + */ +- if (test_facility(129)) ++ if (MACHINE_HAS_VX) + elf_hwcap |= HWCAP_S390_VXRS; + get_cpu_id(&cpu_id); + add_device_randomness(&cpu_id, sizeof(cpu_id)); +@@ -788,7 +790,9 @@ static void __init setup_hwcaps(void) + strcpy(elf_platform, "z13"); + break; + } ++ return 0; + } ++arch_initcall(setup_hwcaps); + + /* + * Add system information as device randomness +@@ -871,11 +875,6 @@ void __init setup_arch(char **cmdline_p) + cpu_init(); + + /* +- * Setup capabilities (ELF_HWCAP & ELF_PLATFORM). +- */ +- setup_hwcaps(); +- +- /* + * Create kernel page tables and switch to virtual addressing. + */ + paging_init(); diff --git a/kernel/kernel/files/patches/mageia/stable-sched-fix-cpu_active_mask-cpu_online_mask-race.patch b/kernel/kernel/files/patches/mageia/stable-sched-fix-cpu_active_mask-cpu_online_mask-race.patch new file mode 100644 index 00000000..bee7ec3b --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-sched-fix-cpu_active_mask-cpu_online_mask-race.patch @@ -0,0 +1,146 @@ +From dd9d3843755da95f63dd3a376f62b3e45c011210 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jan=20H=2E=20Sch=C3=B6nherr?= +Date: Wed, 12 Aug 2015 21:35:56 +0200 +Subject: sched: Fix cpu_active_mask/cpu_online_mask race +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: =?UTF-8?q?Jan=20H=2E=20Sch=C3=B6nherr?= + +commit dd9d3843755da95f63dd3a376f62b3e45c011210 upstream. + +There is a race condition in SMP bootup code, which may result +in + + WARNING: CPU: 0 PID: 1 at kernel/workqueue.c:4418 + workqueue_cpu_up_callback() +or + kernel BUG at kernel/smpboot.c:135! + +It can be triggered with a bit of luck in Linux guests running +on busy hosts. + + CPU0 CPUn + ==== ==== + + _cpu_up() + __cpu_up() + start_secondary() + set_cpu_online() + cpumask_set_cpu(cpu, + to_cpumask(cpu_online_bits)); + cpu_notify(CPU_ONLINE) + + cpumask_set_cpu(cpu, + to_cpumask(cpu_active_bits)); + +During the various CPU_ONLINE callbacks CPUn is online but not +active. Several things can go wrong at that point, depending on +the scheduling of tasks on CPU0. + +Variant 1: + + cpu_notify(CPU_ONLINE) + workqueue_cpu_up_callback() + rebind_workers() + set_cpus_allowed_ptr() + + This call fails because it requires an active CPU; rebind_workers() + ends with a warning: + + WARNING: CPU: 0 PID: 1 at kernel/workqueue.c:4418 + workqueue_cpu_up_callback() + +Variant 2: + + cpu_notify(CPU_ONLINE) + smpboot_thread_call() + smpboot_unpark_threads() + .. + __kthread_unpark() + __kthread_bind() + wake_up_state() + .. + select_task_rq() + select_fallback_rq() + + The ->wake_cpu of the unparked thread is not allowed, making a call + to select_fallback_rq() necessary. Then, select_fallback_rq() cannot + find an allowed, active CPU and promptly resets the allowed CPUs, so + that the task in question ends up on CPU0. + + When those unparked tasks are eventually executed, they run + immediately into a BUG: + + kernel BUG at kernel/smpboot.c:135! + +Just changing the order in which the online/active bits are set +(and adding some memory barriers), would solve the two issues +above. However, it would change the order of operations back to +the one before commit 6acbfb96976f ("sched: Fix hotplug vs. +set_cpus_allowed_ptr()"), thus, reintroducing that particular +problem. + +Going further back into history, we have at least the following +commits touching this topic: +- commit 2baab4e90495 ("sched: Fix select_fallback_rq() vs cpu_active/cpu_online") +- commit 5fbd036b552f ("sched: Cleanup cpu_active madness") + +Together, these give us the following non-working solutions: + + - secondary CPU sets active before online, because active is assumed to + be a subset of online; + + - secondary CPU sets online before active, because the primary CPU + assumes that an online CPU is also active; + + - secondary CPU sets online and waits for primary CPU to set active, + because it might deadlock. + +Commit 875ebe940d77 ("powerpc/smp: Wait until secondaries are +active & online") introduces an arch-specific solution to this +arch-independent problem. + +Now, go for a more general solution without explicit waiting and +simply set active twice: once on the secondary CPU after online +was set and once on the primary CPU after online was seen. + +set_cpus_allowed_ptr()") + +Signed-off-by: Jan H. Schönherr +Acked-by: Peter Zijlstra +Cc: Anton Blanchard +Cc: Borislav Petkov +Cc: Joerg Roedel +Cc: Linus Torvalds +Cc: Matt Wilson +Cc: Michael Ellerman +Cc: Peter Zijlstra +Cc: Thomas Gleixner +Fixes: 6acbfb96976f ("sched: Fix hotplug vs. set_cpus_allowed_ptr()") +Link: http://lkml.kernel.org/r/1439408156-18840-1-git-send-email-jschoenh@amazon.de +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/sched/core.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -5328,6 +5328,14 @@ static int sched_cpu_active(struct notif + case CPU_STARTING: + set_cpu_rq_start_time(); + return NOTIFY_OK; ++ case CPU_ONLINE: ++ /* ++ * At this point a starting CPU has marked itself as online via ++ * set_cpu_online(). But it might not yet have marked itself ++ * as active, which is essential from here on. ++ * ++ * Thus, fall-through and help the starting CPU along. ++ */ + case CPU_DOWN_FAILED: + set_cpu_active((long)hcpu, true); + return NOTIFY_OK; diff --git a/kernel/kernel/files/patches/mageia/stable-spi-bcm2835-set-up-spi-mode-before-asserting-cs-gpio.patch b/kernel/kernel/files/patches/mageia/stable-spi-bcm2835-set-up-spi-mode-before-asserting-cs-gpio.patch new file mode 100644 index 00000000..f72761db --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-spi-bcm2835-set-up-spi-mode-before-asserting-cs-gpio.patch @@ -0,0 +1,88 @@ +From acace73df2c1913a526c1b41e4741a4a6704c863 Mon Sep 17 00:00:00 2001 +From: Martin Sperl +Date: Tue, 28 Jul 2015 14:03:12 +0000 +Subject: spi: bcm2835: set up spi-mode before asserting cs-gpio + +From: Martin Sperl + +commit acace73df2c1913a526c1b41e4741a4a6704c863 upstream. + +When using reverse polarity for clock (spi-cpol) on a device +the clock line gets altered after chip-select has been asserted +resulting in an additional clock beat, which confuses hardware. + +This did not show when using native-CS, as the same register +is used to control cs as well as polarity, so the changes came +into effect at the same time. Unfortunately this is not true +with gpio-cs. + +To avoid this situation this patch moves the setup of polarity +(spi-cpol and spi-cpha) outside of the chip-select into +prepare_message, which is run prior to asserting chip-select. + +Also fixes resetting 3-wire mode after use of rx-mode, so that +a 3-Wire sequence TX, RX, TX works as well (right now it runs +TX, RX, RX instead) + +Reported-by: Noralf Tronnes +Signed-off-by: Martin Sperl +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/spi/spi-bcm2835.c | 28 +++++++++++++++++++++++----- + 1 file changed, 23 insertions(+), 5 deletions(-) + +--- a/drivers/spi/spi-bcm2835.c ++++ b/drivers/spi/spi-bcm2835.c +@@ -257,13 +257,11 @@ static int bcm2835_spi_transfer_one(stru + spi_used_hz = cdiv ? (clk_hz / cdiv) : (clk_hz / 65536); + bcm2835_wr(bs, BCM2835_SPI_CLK, cdiv); + +- /* handle all the modes */ ++ /* handle all the 3-wire mode */ + if ((spi->mode & SPI_3WIRE) && (tfr->rx_buf)) + cs |= BCM2835_SPI_CS_REN; +- if (spi->mode & SPI_CPOL) +- cs |= BCM2835_SPI_CS_CPOL; +- if (spi->mode & SPI_CPHA) +- cs |= BCM2835_SPI_CS_CPHA; ++ else ++ cs &= ~BCM2835_SPI_CS_REN; + + /* for gpio_cs set dummy CS so that no HW-CS get changed + * we can not run this in bcm2835_spi_set_cs, as it does +@@ -291,6 +289,25 @@ static int bcm2835_spi_transfer_one(stru + return bcm2835_spi_transfer_one_irq(master, spi, tfr, cs); + } + ++static int bcm2835_spi_prepare_message(struct spi_master *master, ++ struct spi_message *msg) ++{ ++ struct spi_device *spi = msg->spi; ++ struct bcm2835_spi *bs = spi_master_get_devdata(master); ++ u32 cs = bcm2835_rd(bs, BCM2835_SPI_CS); ++ ++ cs &= ~(BCM2835_SPI_CS_CPOL | BCM2835_SPI_CS_CPHA); ++ ++ if (spi->mode & SPI_CPOL) ++ cs |= BCM2835_SPI_CS_CPOL; ++ if (spi->mode & SPI_CPHA) ++ cs |= BCM2835_SPI_CS_CPHA; ++ ++ bcm2835_wr(bs, BCM2835_SPI_CS, cs); ++ ++ return 0; ++} ++ + static void bcm2835_spi_handle_err(struct spi_master *master, + struct spi_message *msg) + { +@@ -429,6 +446,7 @@ static int bcm2835_spi_probe(struct plat + master->set_cs = bcm2835_spi_set_cs; + master->transfer_one = bcm2835_spi_transfer_one; + master->handle_err = bcm2835_spi_handle_err; ++ master->prepare_message = bcm2835_spi_prepare_message; + master->dev.of_node = pdev->dev.of_node; + + bs = spi_master_get_devdata(master); diff --git a/kernel/kernel/files/patches/mageia/stable-spi-dw-allow-interface-drivers-to-limit-data-i-o-to-word-sizes.patch b/kernel/kernel/files/patches/mageia/stable-spi-dw-allow-interface-drivers-to-limit-data-i-o-to-word-sizes.patch new file mode 100644 index 00000000..092f7550 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-spi-dw-allow-interface-drivers-to-limit-data-i-o-to-word-sizes.patch @@ -0,0 +1,129 @@ +From c4fe57f76269dbb2af135071513f260ca40229a3 Mon Sep 17 00:00:00 2001 +From: Michael van der Westhuizen +Date: Tue, 18 Aug 2015 22:21:53 +0200 +Subject: spi: dw: Allow interface drivers to limit data I/O to word sizes + +From: Michael van der Westhuizen + +commit c4fe57f76269dbb2af135071513f260ca40229a3 upstream. + +The commit dd11444327ce ("spi: dw-spi: Convert 16bit accesses to 32bit +accesses") changed all 16bit accesses in the DW_apb_ssi driver to 32bit. +This, unfortunately, breaks data register access on picoXcell, where the +DW IP needs data register accesses to be word accesses (all other +accesses appear to be OK). + +This change introduces a new master variable to allow interface drivers +to specify that 16bit data transfer I/O is required. This change also +introduces the ability to set this variable via device tree bindings in +the MMIO interface driver. Both the core and the MMIO interface driver +default to the current 32bit behaviour. + +Before this change, on a picoXcell pc3x3: + spi_master spi32766: interrupt_transfer: fifo overrun/underrun + m25p80 spi32766.0: error -5 reading 9f + m25p80: probe of spi32766.0 failed with error -5 + +After this change: + m25p80 spi32766.0: m25p40 (512 Kbytes) + +Fixes: dd11444327ce ("spi: dw-spi: Convert 16bit accesses to 32bit accesses") +Signed-off-by: Michael van der Westhuizen +Reviewed-by: Andy Shevchenko +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/spi/spi-dw-mmio.c | 3 +++ + drivers/spi/spi-dw.c | 4 ++-- + drivers/spi/spi-dw.h | 35 +++++++++++++++++++++++++++++++++++ + 3 files changed, 40 insertions(+), 2 deletions(-) + +--- a/drivers/spi/spi-dw-mmio.c ++++ b/drivers/spi/spi-dw-mmio.c +@@ -74,6 +74,9 @@ static int dw_spi_mmio_probe(struct plat + + dws->max_freq = clk_get_rate(dwsmmio->clk); + ++ of_property_read_u32(pdev->dev.of_node, "reg-io-width", ++ &dws->reg_io_width); ++ + num_cs = 4; + + if (pdev->dev.of_node) +--- a/drivers/spi/spi-dw.c ++++ b/drivers/spi/spi-dw.c +@@ -194,7 +194,7 @@ static void dw_writer(struct dw_spi *dws + else + txw = *(u16 *)(dws->tx); + } +- dw_writel(dws, DW_SPI_DR, txw); ++ dw_write_io_reg(dws, DW_SPI_DR, txw); + dws->tx += dws->n_bytes; + } + } +@@ -205,7 +205,7 @@ static void dw_reader(struct dw_spi *dws + u16 rxw; + + while (max--) { +- rxw = dw_readl(dws, DW_SPI_DR); ++ rxw = dw_read_io_reg(dws, DW_SPI_DR); + /* Care rx only if the transfer's original "rx" is not null */ + if (dws->rx_end - dws->len) { + if (dws->n_bytes == 1) +--- a/drivers/spi/spi-dw.h ++++ b/drivers/spi/spi-dw.h +@@ -109,6 +109,7 @@ struct dw_spi { + u32 fifo_len; /* depth of the FIFO buffer */ + u32 max_freq; /* max bus freq supported */ + ++ u32 reg_io_width; /* DR I/O width in bytes */ + u16 bus_num; + u16 num_cs; /* supported slave numbers */ + +@@ -145,11 +146,45 @@ static inline u32 dw_readl(struct dw_spi + return __raw_readl(dws->regs + offset); + } + ++static inline u16 dw_readw(struct dw_spi *dws, u32 offset) ++{ ++ return __raw_readw(dws->regs + offset); ++} ++ + static inline void dw_writel(struct dw_spi *dws, u32 offset, u32 val) + { + __raw_writel(val, dws->regs + offset); + } + ++static inline void dw_writew(struct dw_spi *dws, u32 offset, u16 val) ++{ ++ __raw_writew(val, dws->regs + offset); ++} ++ ++static inline u32 dw_read_io_reg(struct dw_spi *dws, u32 offset) ++{ ++ switch (dws->reg_io_width) { ++ case 2: ++ return dw_readw(dws, offset); ++ case 4: ++ default: ++ return dw_readl(dws, offset); ++ } ++} ++ ++static inline void dw_write_io_reg(struct dw_spi *dws, u32 offset, u32 val) ++{ ++ switch (dws->reg_io_width) { ++ case 2: ++ dw_writew(dws, offset, val); ++ break; ++ case 4: ++ default: ++ dw_writel(dws, offset, val); ++ break; ++ } ++} ++ + static inline void spi_enable_chip(struct dw_spi *dws, int enable) + { + dw_writel(dws, DW_SPI_SSIENR, (enable ? 1 : 0)); diff --git a/kernel/kernel/files/patches/mageia/stable-spi-fix-regression-in-spi-bitbang-txrx.h.patch b/kernel/kernel/files/patches/mageia/stable-spi-fix-regression-in-spi-bitbang-txrx.h.patch new file mode 100644 index 00000000..696409b6 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-spi-fix-regression-in-spi-bitbang-txrx.h.patch @@ -0,0 +1,43 @@ +From 26a67ec47a4c58fe79c6421c3dc3d697d322d2d6 Mon Sep 17 00:00:00 2001 +From: Lars Persson +Date: Wed, 29 Jul 2015 09:32:02 +0200 +Subject: spi: Fix regression in spi-bitbang-txrx.h + +From: Lars Persson + +commit 26a67ec47a4c58fe79c6421c3dc3d697d322d2d6 upstream. + +This patch fixes a regression introduced by commit 232a5adc5199 ("spi: +bitbang: only toggle bitchanges"). The attempt to optimize writes of +consecutive bit patterns broke most of the combinations of word size +and SPI modes due to selecting the wrong bit as the MSB value. + +Fixes: 232a5adc5199 (spi: bitbang: only toggle bitchanges) +Signed-off-by: Lars Persson +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/spi/spi-bitbang-txrx.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/spi/spi-bitbang-txrx.h ++++ b/drivers/spi/spi-bitbang-txrx.h +@@ -49,7 +49,7 @@ bitbang_txrx_be_cpha0(struct spi_device + { + /* if (cpol == 0) this is SPI_MODE_0; else this is SPI_MODE_2 */ + +- bool oldbit = !(word & 1); ++ u32 oldbit = (!(word & (1<<(bits-1)))) << 31; + /* clock starts at inactive polarity */ + for (word <<= (32 - bits); likely(bits); bits--) { + +@@ -81,7 +81,7 @@ bitbang_txrx_be_cpha1(struct spi_device + { + /* if (cpol == 0) this is SPI_MODE_1; else this is SPI_MODE_3 */ + +- bool oldbit = !(word & (1 << 31)); ++ u32 oldbit = (!(word & (1<<(bits-1)))) << 31; + /* clock starts at inactive polarity */ + for (word <<= (32 - bits); likely(bits); bits--) { + diff --git a/kernel/kernel/files/patches/mageia/stable-spi-img-spfi-check-for-timeout-error-before-proceeding.patch b/kernel/kernel/files/patches/mageia/stable-spi-img-spfi-check-for-timeout-error-before-proceeding.patch new file mode 100644 index 00000000..78224133 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-spi-img-spfi-check-for-timeout-error-before-proceeding.patch @@ -0,0 +1,48 @@ +From 011710e2ab659c7ad6e5e554806414bd7a9508be Mon Sep 17 00:00:00 2001 +From: Sifan Naeem +Date: Mon, 27 Jul 2015 13:11:15 +0100 +Subject: spi: img-spfi: check for timeout error before proceeding + +From: Sifan Naeem + +commit 011710e2ab659c7ad6e5e554806414bd7a9508be upstream. + +Calling spfi_wait_all_done is not required if the transfer has timed +out before all data is transferred. + +spfi_wait_all_done polls for Alldone interrupt which is triggered to +mark the transfer as complete and to indicate it is now safe to issue +a new transfer. + +Fixes: 8c2c8c0 ("spi: img-spfi: Control CS lines with GPIO") +Signed-off-by: Sifan Naeem +Reviewed-by: Andrew Bresticker +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/spi/spi-img-spfi.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/spi/spi-img-spfi.c ++++ b/drivers/spi/spi-img-spfi.c +@@ -267,15 +267,15 @@ static int img_spfi_start_pio(struct spi + cpu_relax(); + } + +- ret = spfi_wait_all_done(spfi); +- if (ret < 0) +- return ret; +- + if (rx_bytes > 0 || tx_bytes > 0) { + dev_err(spfi->dev, "PIO transfer timed out\n"); + return -ETIMEDOUT; + } + ++ ret = spfi_wait_all_done(spfi); ++ if (ret < 0) ++ return ret; ++ + return 0; + } + diff --git a/kernel/kernel/files/patches/mageia/stable-spi-img-spfi-fix-kbuild-test-robot-warning.patch b/kernel/kernel/files/patches/mageia/stable-spi-img-spfi-fix-kbuild-test-robot-warning.patch new file mode 100644 index 00000000..af8febbe --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-spi-img-spfi-fix-kbuild-test-robot-warning.patch @@ -0,0 +1,33 @@ +From 9176c6657b5c313cf504d157e6d91496ee5c8708 Mon Sep 17 00:00:00 2001 +From: Sifan Naeem +Date: Thu, 6 Aug 2015 10:33:01 +0100 +Subject: spi: img-spfi: fix kbuild test robot warning + +From: Sifan Naeem + +commit 9176c6657b5c313cf504d157e6d91496ee5c8708 upstream. + +drivers/spi/spi-img-spfi.c: In function 'img_spfi_setup': +drivers/spi/spi-img-spfi.c:446: warning: 'ret' may be used +uninitialized in this function. + +Fixes: commit b03ba9e314c1 ("spi: img-spfi: fix multiple calls to request gpio") +Signed-off-by: Sifan Naeem +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/spi/spi-img-spfi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/spi/spi-img-spfi.c ++++ b/drivers/spi/spi-img-spfi.c +@@ -444,7 +444,7 @@ static int img_spfi_unprepare(struct spi + + static int img_spfi_setup(struct spi_device *spi) + { +- int ret; ++ int ret = -EINVAL; + struct img_spfi_device_data *spfi_data = spi_get_ctldata(spi); + + if (!spfi_data) { diff --git a/kernel/kernel/files/patches/mageia/stable-spi-img-spfi-fix-multiple-calls-to-request-gpio.patch b/kernel/kernel/files/patches/mageia/stable-spi-img-spfi-fix-multiple-calls-to-request-gpio.patch new file mode 100644 index 00000000..68160468 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-spi-img-spfi-fix-multiple-calls-to-request-gpio.patch @@ -0,0 +1,97 @@ +From b03ba9e314c12b2127243145b5c1f41b2408de62 Mon Sep 17 00:00:00 2001 +From: Sifan Naeem +Date: Wed, 29 Jul 2015 11:55:26 +0100 +Subject: spi: img-spfi: fix multiple calls to request gpio + +From: Sifan Naeem + +commit b03ba9e314c12b2127243145b5c1f41b2408de62 upstream. + +spfi_setup may be called many times by the spi framework, but +gpio_request_one can only be called once without freeing, repeatedly +calling gpio_request_one will cause an error to be thrown, which +causes the request to spi_setup to be marked as failed. + +We can have a per-spi_device flag that indicates whether or not the +gpio has been requested. If the gpio has already been requested use +gpio_direction_output to set the direction of the gpio. + +Fixes: 8c2c8c03cdcb ("spi: img-spfi: Control CS lines with GPIO") +Signed-off-by: Sifan Naeem +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/spi/spi-img-spfi.c | 47 ++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 40 insertions(+), 7 deletions(-) + +--- a/drivers/spi/spi-img-spfi.c ++++ b/drivers/spi/spi-img-spfi.c +@@ -105,6 +105,10 @@ struct img_spfi { + bool rx_dma_busy; + }; + ++struct img_spfi_device_data { ++ bool gpio_requested; ++}; ++ + static inline u32 spfi_readl(struct img_spfi *spfi, u32 reg) + { + return readl(spfi->regs + reg); +@@ -441,20 +445,49 @@ static int img_spfi_unprepare(struct spi + static int img_spfi_setup(struct spi_device *spi) + { + int ret; ++ struct img_spfi_device_data *spfi_data = spi_get_ctldata(spi); + +- ret = gpio_request_one(spi->cs_gpio, (spi->mode & SPI_CS_HIGH) ? +- GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH, +- dev_name(&spi->dev)); +- if (ret) +- dev_err(&spi->dev, "can't request chipselect gpio %d\n", ++ if (!spfi_data) { ++ spfi_data = kzalloc(sizeof(*spfi_data), GFP_KERNEL); ++ if (!spfi_data) ++ return -ENOMEM; ++ spfi_data->gpio_requested = false; ++ spi_set_ctldata(spi, spfi_data); ++ } ++ if (!spfi_data->gpio_requested) { ++ ret = gpio_request_one(spi->cs_gpio, ++ (spi->mode & SPI_CS_HIGH) ? ++ GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH, ++ dev_name(&spi->dev)); ++ if (ret) ++ dev_err(&spi->dev, "can't request chipselect gpio %d\n", + spi->cs_gpio); +- ++ else ++ spfi_data->gpio_requested = true; ++ } else { ++ if (gpio_is_valid(spi->cs_gpio)) { ++ int mode = ((spi->mode & SPI_CS_HIGH) ? ++ GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH); ++ ++ ret = gpio_direction_output(spi->cs_gpio, mode); ++ if (ret) ++ dev_err(&spi->dev, "chipselect gpio %d setup failed (%d)\n", ++ spi->cs_gpio, ret); ++ } ++ } + return ret; + } + + static void img_spfi_cleanup(struct spi_device *spi) + { +- gpio_free(spi->cs_gpio); ++ struct img_spfi_device_data *spfi_data = spi_get_ctldata(spi); ++ ++ if (spfi_data) { ++ if (spfi_data->gpio_requested) ++ gpio_free(spi->cs_gpio); ++ kfree(spfi_data); ++ spi_set_ctldata(spi, NULL); ++ } + } + + static void img_spfi_config(struct spi_master *master, struct spi_device *spi, diff --git a/kernel/kernel/files/patches/mageia/stable-spi-sh-msiof-fix-fifo-size-to-64-word-from-256-word.patch b/kernel/kernel/files/patches/mageia/stable-spi-sh-msiof-fix-fifo-size-to-64-word-from-256-word.patch new file mode 100644 index 00000000..d29a9886 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-spi-sh-msiof-fix-fifo-size-to-64-word-from-256-word.patch @@ -0,0 +1,66 @@ +From fe78d0b7691c02744004b15f6979b3f106464bc4 Mon Sep 17 00:00:00 2001 +From: Koji Matsuoka +Date: Mon, 15 Jun 2015 02:25:05 +0900 +Subject: spi: sh-msiof: Fix FIFO size to 64 word from 256 word + +From: Koji Matsuoka + +commit fe78d0b7691c02744004b15f6979b3f106464bc4 upstream. + +The upper limit of Tx/Rx FIFO size is 64 word by the +specification of H/W. This patch corrects to 64 word from 256 word. + +Signed-off-by: Koji Matsuoka +Signed-off-by: Yoshihiro Kaneko +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/spi/spi-sh-msiof.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +--- a/drivers/spi/spi-sh-msiof.c ++++ b/drivers/spi/spi-sh-msiof.c +@@ -48,8 +48,8 @@ struct sh_msiof_spi_priv { + const struct sh_msiof_chipdata *chipdata; + struct sh_msiof_spi_info *info; + struct completion done; +- int tx_fifo_size; +- int rx_fifo_size; ++ unsigned int tx_fifo_size; ++ unsigned int rx_fifo_size; + void *tx_dma_page; + void *rx_dma_page; + dma_addr_t tx_dma_addr; +@@ -95,8 +95,6 @@ struct sh_msiof_spi_priv { + #define MDR2_WDLEN1(i) (((i) - 1) << 16) /* Word Count (1-64/256 (SH, A1))) */ + #define MDR2_GRPMASK1 0x00000001 /* Group Output Mask 1 (SH, A1) */ + +-#define MAX_WDLEN 256U +- + /* TSCR and RSCR */ + #define SCR_BRPS_MASK 0x1f00 /* Prescaler Setting (1-32) */ + #define SCR_BRPS(i) (((i) - 1) << 8) +@@ -850,7 +848,12 @@ static int sh_msiof_transfer_one(struct + * DMA supports 32-bit words only, hence pack 8-bit and 16-bit + * words, with byte resp. word swapping. + */ +- unsigned int l = min(len, MAX_WDLEN * 4); ++ unsigned int l = 0; ++ ++ if (tx_buf) ++ l = min(len, p->tx_fifo_size * 4); ++ if (rx_buf) ++ l = min(len, p->rx_fifo_size * 4); + + if (bits <= 8) { + if (l & 3) +@@ -963,7 +966,7 @@ static const struct sh_msiof_chipdata sh + + static const struct sh_msiof_chipdata r8a779x_data = { + .tx_fifo_size = 64, +- .rx_fifo_size = 256, ++ .rx_fifo_size = 64, + .master_flags = SPI_MASTER_MUST_TX, + }; + diff --git a/kernel/kernel/files/patches/mageia/stable-staging-comedi-adl_pci7x3x-fix-digital-output-on-pci-7230.patch b/kernel/kernel/files/patches/mageia/stable-staging-comedi-adl_pci7x3x-fix-digital-output-on-pci-7230.patch new file mode 100644 index 00000000..ea8b2f90 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-staging-comedi-adl_pci7x3x-fix-digital-output-on-pci-7230.patch @@ -0,0 +1,56 @@ +From ad83dbd974feb2e2a8cc071a1d28782bd4d2c70e Mon Sep 17 00:00:00 2001 +From: Ian Abbott +Date: Tue, 11 Aug 2015 13:05:10 +0100 +Subject: staging: comedi: adl_pci7x3x: fix digital output on PCI-7230 + +From: Ian Abbott + +commit ad83dbd974feb2e2a8cc071a1d28782bd4d2c70e upstream. + +The "adl_pci7x3x" driver replaced the "adl_pci7230" and "adl_pci7432" +drivers in commits 8f567c373c4b ("staging: comedi: new adl_pci7x3x +driver") and 657f77d173d3 ("staging: comedi: remove adl_pci7230 and +adl_pci7432 drivers"). Although the new driver code agrees with the +user manuals for the respective boards, digital outputs stopped working +on the PCI-7230. This has 16 digital output channels and the previous +adl_pci7230 driver shifted the 16 bit output state left by 16 bits +before writing to the hardware register. The new adl_pci7x3x driver +doesn't do that. Fix it in `adl_pci7x3x_do_insn_bits()` by checking +for the special case of the subdevice having only 16 channels and +duplicating the 16 bit output state into both halves of the 32-bit +register. That should work both for what the board actually does and +for what the user manual says it should do. + +Fixes: 8f567c373c4b ("staging: comedi: new adl_pci7x3x driver") +Signed-off-by: Ian Abbott +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/comedi/drivers/adl_pci7x3x.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +--- a/drivers/staging/comedi/drivers/adl_pci7x3x.c ++++ b/drivers/staging/comedi/drivers/adl_pci7x3x.c +@@ -120,8 +120,20 @@ static int adl_pci7x3x_do_insn_bits(stru + { + unsigned long reg = (unsigned long)s->private; + +- if (comedi_dio_update_state(s, data)) +- outl(s->state, dev->iobase + reg); ++ if (comedi_dio_update_state(s, data)) { ++ unsigned int val = s->state; ++ ++ if (s->n_chan == 16) { ++ /* ++ * It seems the PCI-7230 needs the 16-bit DO state ++ * to be shifted left by 16 bits before being written ++ * to the 32-bit register. Set the value in both ++ * halves of the register to be sure. ++ */ ++ val |= val << 16; ++ } ++ outl(val, dev->iobase + reg); ++ } + + data[1] = s->state; + diff --git a/kernel/kernel/files/patches/mageia/stable-staging-comedi-usbduxsigma-don-t-clobber-ai_timer-in-command-test.patch b/kernel/kernel/files/patches/mageia/stable-staging-comedi-usbduxsigma-don-t-clobber-ai_timer-in-command-test.patch new file mode 100644 index 00000000..6e6149cb --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-staging-comedi-usbduxsigma-don-t-clobber-ai_timer-in-command-test.patch @@ -0,0 +1,87 @@ +From 423b24c37dd5794a674c74b0ed56392003a69891 Mon Sep 17 00:00:00 2001 +From: Ian Abbott +Date: Thu, 23 Jul 2015 16:46:57 +0100 +Subject: staging: comedi: usbduxsigma: don't clobber ai_timer in command test + +From: Ian Abbott + +commit 423b24c37dd5794a674c74b0ed56392003a69891 upstream. + +`devpriv->ai_timer` is used while an asynchronous command is running on +the AI subdevice. It also gets modified by the subdevice's `cmdtest` +handler for checking new asynchronous commands +(`usbduxsigma_ai_cmdtest()`), which is not correct as it's allowed to +check new commands while an old command is still running. Fix it by +moving the code which sets up `devpriv->ai_timer` and +`devpriv->ai_interval` into the subdevice's `cmd` handler, +`usbduxsigma_ai_cmd()`. + +Note that the removed code in `usbduxsigma_ai_cmdtest()` checked that +`devpriv->ai_timer` did not end up less than than 1, but that could not +happen because `cmd->scan_begin_arg` had already been checked to be at +least the minimum required value (at least when `cmd->scan_begin_src == +TRIG_TIMER`, which had also been checked to be the case). + +Fixes: b986be8527c7 ("staging: comedi: usbduxsigma: tidy up analog input command support) +Signed-off-by: Ian Abbott +Reviewed-by: Bernd Porr +Reviewed-by: H Hartley Sweeten +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/comedi/drivers/usbduxsigma.c | 37 +++++++++++---------------- + 1 file changed, 16 insertions(+), 21 deletions(-) + +--- a/drivers/staging/comedi/drivers/usbduxsigma.c ++++ b/drivers/staging/comedi/drivers/usbduxsigma.c +@@ -550,27 +550,6 @@ static int usbduxsigma_ai_cmdtest(struct + if (err) + return 3; + +- /* Step 4: fix up any arguments */ +- +- if (high_speed) { +- /* +- * every 2 channels get a time window of 125us. Thus, if we +- * sample all 16 channels we need 1ms. If we sample only one +- * channel we need only 125us +- */ +- devpriv->ai_interval = interval; +- devpriv->ai_timer = cmd->scan_begin_arg / (125000 * interval); +- } else { +- /* interval always 1ms */ +- devpriv->ai_interval = 1; +- devpriv->ai_timer = cmd->scan_begin_arg / 1000000; +- } +- if (devpriv->ai_timer < 1) +- err |= -EINVAL; +- +- if (err) +- return 4; +- + return 0; + } + +@@ -668,6 +647,22 @@ static int usbduxsigma_ai_cmd(struct com + + down(&devpriv->sem); + ++ if (devpriv->high_speed) { ++ /* ++ * every 2 channels get a time window of 125us. Thus, if we ++ * sample all 16 channels we need 1ms. If we sample only one ++ * channel we need only 125us ++ */ ++ unsigned int interval = usbduxsigma_chans_to_interval(len); ++ ++ devpriv->ai_interval = interval; ++ devpriv->ai_timer = cmd->scan_begin_arg / (125000 * interval); ++ } else { ++ /* interval always 1ms */ ++ devpriv->ai_interval = 1; ++ devpriv->ai_timer = cmd->scan_begin_arg / 1000000; ++ } ++ + for (i = 0; i < len; i++) { + unsigned int chan = CR_CHAN(cmd->chanlist[i]); + diff --git a/kernel/kernel/files/patches/mageia/stable-staging-comedi-usbduxsigma-don-t-clobber-ao_timer-in-command-test.patch b/kernel/kernel/files/patches/mageia/stable-staging-comedi-usbduxsigma-don-t-clobber-ao_timer-in-command-test.patch new file mode 100644 index 00000000..7442682e --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-staging-comedi-usbduxsigma-don-t-clobber-ao_timer-in-command-test.patch @@ -0,0 +1,90 @@ +From c04a1f17803e0d3eeada586ca34a6b436959bc20 Mon Sep 17 00:00:00 2001 +From: Ian Abbott +Date: Thu, 23 Jul 2015 16:46:58 +0100 +Subject: staging: comedi: usbduxsigma: don't clobber ao_timer in command test + +From: Ian Abbott + +commit c04a1f17803e0d3eeada586ca34a6b436959bc20 upstream. + +`devpriv->ao_timer` is used while an asynchronous command is running on +the AO subdevice. It also gets modified by the subdevice's `cmdtest` +handler for checking new asynchronous commands, +`usbduxsigma_ao_cmdtest()`, which is not correct as it's allowed to +check new commands while an old command is still running. Fix it by +moving the code which sets up `devpriv->ao_timer` into the subdevice's +`cmd` handler, `usbduxsigma_ao_cmd()`. + +Note that the removed code in `usbduxsigma_ao_cmdtest()` checked that +`devpriv->ao_timer` did not end up less that 1, but that could not +happen due because `cmd->scan_begin_arg` or `cmd->convert_arg` had +already been range-checked. + +Also note that we tested the `high_speed` variable in the old code, but +that is currently always 0 and means that we always use "scan" timing +(`cmd->scan_begin_src == TRIG_TIMER` and `cmd->convert_src == TRIG_NOW`) +and never "convert" (individual sample) timing (`cmd->scan_begin_src == +TRIG_FOLLOW` and `cmd->convert_src == TRIG_TIMER`). The moved code +tests `cmd->convert_src` instead to decide whether "scan" or "convert" +timing is being used, although currently only "scan" timing is +supported. + +Fixes: fb1ef622e7a3 ("staging: comedi: usbduxsigma: tidy up analog output command support") +Signed-off-by: Ian Abbott +Reviewed-by: Bernd Porr +Reviewed-by: H Hartley Sweeten +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/staging/comedi/drivers/usbduxsigma.c | 33 +++++++++++---------------- + 1 file changed, 14 insertions(+), 19 deletions(-) + +--- a/drivers/staging/comedi/drivers/usbduxsigma.c ++++ b/drivers/staging/comedi/drivers/usbduxsigma.c +@@ -912,25 +912,6 @@ static int usbduxsigma_ao_cmdtest(struct + if (err) + return 3; + +- /* Step 4: fix up any arguments */ +- +- /* we count in timer steps */ +- if (high_speed) { +- /* timing of the conversion itself: every 125 us */ +- devpriv->ao_timer = cmd->convert_arg / 125000; +- } else { +- /* +- * timing of the scan: every 1ms +- * we get all channels at once +- */ +- devpriv->ao_timer = cmd->scan_begin_arg / 1000000; +- } +- if (devpriv->ao_timer < 1) +- err |= -EINVAL; +- +- if (err) +- return 4; +- + return 0; + } + +@@ -943,6 +924,20 @@ static int usbduxsigma_ao_cmd(struct com + + down(&devpriv->sem); + ++ if (cmd->convert_src == TRIG_TIMER) { ++ /* ++ * timing of the conversion itself: every 125 us ++ * at high speed (not used yet) ++ */ ++ devpriv->ao_timer = cmd->convert_arg / 125000; ++ } else { ++ /* ++ * timing of the scan: every 1ms ++ * we get all channels at once ++ */ ++ devpriv->ao_timer = cmd->scan_begin_arg / 1000000; ++ } ++ + devpriv->ao_counter = devpriv->ao_timer; + + if (cmd->start_src == TRIG_NOW) { diff --git a/kernel/kernel/files/patches/mageia/stable-tty-serial-men_z135_uart.c-fix-race-between-irq-and-set_termios.patch b/kernel/kernel/files/patches/mageia/stable-tty-serial-men_z135_uart.c-fix-race-between-irq-and-set_termios.patch new file mode 100644 index 00000000..9cf49bd7 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-tty-serial-men_z135_uart.c-fix-race-between-irq-and-set_termios.patch @@ -0,0 +1,75 @@ +From 8117e347406278fd399b077add4e638cd017ae2d Mon Sep 17 00:00:00 2001 +From: Johannes Thumshirn +Date: Thu, 6 Aug 2015 09:16:37 +0200 +Subject: tty: serial: men_z135_uart.c: Fix race between IRQ and set_termios() + +From: Johannes Thumshirn + +commit 8117e347406278fd399b077add4e638cd017ae2d upstream. + +Fix panic caused by a race between men_z135_intr() and men_z135_set_termios(). + +men_z135_intr() and men_z135_set_termios() both hold the struct uart_port::lock +spinlock, but men_z135_intr() does a spin_lock_irqsave() and +men_z135_set_termios() does a normal spin_lock(), which can lead to a deadlock +when an interrupt is called while the lock is being helt by +men_z135_set_termios(). + +This was discovered using a insmod, hardware looppback send/receive, rmmod +stress test. + +Signed-off-by: Johannes Thumshirn +Reviewed-by: Peter Hurley +Cc: Andreas Werner +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/tty/serial/men_z135_uart.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +--- a/drivers/tty/serial/men_z135_uart.c ++++ b/drivers/tty/serial/men_z135_uart.c +@@ -392,7 +392,6 @@ static irqreturn_t men_z135_intr(int irq + struct men_z135_port *uart = (struct men_z135_port *)data; + struct uart_port *port = &uart->port; + bool handled = false; +- unsigned long flags; + int irq_id; + + uart->stat_reg = ioread32(port->membase + MEN_Z135_STAT_REG); +@@ -401,7 +400,7 @@ static irqreturn_t men_z135_intr(int irq + if (!irq_id) + goto out; + +- spin_lock_irqsave(&port->lock, flags); ++ spin_lock(&port->lock); + /* It's save to write to IIR[7:6] RXC[9:8] */ + iowrite8(irq_id, port->membase + MEN_Z135_STAT_REG); + +@@ -427,7 +426,7 @@ static irqreturn_t men_z135_intr(int irq + handled = true; + } + +- spin_unlock_irqrestore(&port->lock, flags); ++ spin_unlock(&port->lock); + out: + return IRQ_RETVAL(handled); + } +@@ -717,7 +716,7 @@ static void men_z135_set_termios(struct + + baud = uart_get_baud_rate(port, termios, old, 0, uart_freq / 16); + +- spin_lock(&port->lock); ++ spin_lock_irq(&port->lock); + if (tty_termios_baud_rate(termios)) + tty_termios_encode_baud_rate(termios, baud, baud); + +@@ -725,7 +724,7 @@ static void men_z135_set_termios(struct + iowrite32(bd_reg, port->membase + MEN_Z135_BAUD_REG); + + uart_update_timeout(port, termios->c_cflag, baud); +- spin_unlock(&port->lock); ++ spin_unlock_irq(&port->lock); + } + + static const char *men_z135_type(struct uart_port *port) diff --git a/kernel/kernel/files/patches/mageia/stable-usb-dwc3-ep0-fix-mem-corruption-on-out-transfers-of-more-than-512-bytes.patch b/kernel/kernel/files/patches/mageia/stable-usb-dwc3-ep0-fix-mem-corruption-on-out-transfers-of-more-than-512-bytes.patch new file mode 100644 index 00000000..3828d961 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-usb-dwc3-ep0-fix-mem-corruption-on-out-transfers-of-more-than-512-bytes.patch @@ -0,0 +1,58 @@ +From b2fb5b1a0f50d3ebc12342c8d8dead245e9c9d4e Mon Sep 17 00:00:00 2001 +From: Kishon Vijay Abraham I +Date: Mon, 27 Jul 2015 12:25:27 +0530 +Subject: usb: dwc3: ep0: Fix mem corruption on OUT transfers of more than 512 bytes + +From: Kishon Vijay Abraham I + +commit b2fb5b1a0f50d3ebc12342c8d8dead245e9c9d4e upstream. + +DWC3 uses bounce buffer to handle non max packet aligned OUT transfers and +the size of bounce buffer is 512 bytes. However if the host initiates OUT +transfers of size more than 512 bytes (and non max packet aligned), the +driver throws a WARN dump but still programs the TRB to receive more than +512 bytes. This will cause bounce buffer to overflow and corrupt the +adjacent memory locations which can be fatal. + +Fix it by programming the TRB to receive a maximum of DWC3_EP0_BOUNCE_SIZE +(512) bytes. + +Signed-off-by: Kishon Vijay Abraham I +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/dwc3/ep0.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +--- a/drivers/usb/dwc3/ep0.c ++++ b/drivers/usb/dwc3/ep0.c +@@ -820,6 +820,11 @@ static void dwc3_ep0_complete_data(struc + unsigned maxp = ep0->endpoint.maxpacket; + + transfer_size += (maxp - (transfer_size % maxp)); ++ ++ /* Maximum of DWC3_EP0_BOUNCE_SIZE can only be received */ ++ if (transfer_size > DWC3_EP0_BOUNCE_SIZE) ++ transfer_size = DWC3_EP0_BOUNCE_SIZE; ++ + transferred = min_t(u32, ur->length, + transfer_size - length); + memcpy(ur->buf, dwc->ep0_bounce, transferred); +@@ -941,11 +946,14 @@ static void __dwc3_ep0_do_control_data(s + return; + } + +- WARN_ON(req->request.length > DWC3_EP0_BOUNCE_SIZE); +- + maxpacket = dep->endpoint.maxpacket; + transfer_size = roundup(req->request.length, maxpacket); + ++ if (transfer_size > DWC3_EP0_BOUNCE_SIZE) { ++ dev_WARN(dwc->dev, "bounce buf can't handle req len\n"); ++ transfer_size = DWC3_EP0_BOUNCE_SIZE; ++ } ++ + dwc->ep0_bounced = true; + + /* diff --git a/kernel/kernel/files/patches/mageia/stable-usb-ftdi_sio-added-custom-pid-for-customware-products.patch b/kernel/kernel/files/patches/mageia/stable-usb-ftdi_sio-added-custom-pid-for-customware-products.patch new file mode 100644 index 00000000..9529398b --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-usb-ftdi_sio-added-custom-pid-for-customware-products.patch @@ -0,0 +1,51 @@ +From 1fb8dc36384ae1140ee6ccc470de74397606a9d5 Mon Sep 17 00:00:00 2001 +From: Matthijs Kooijman +Date: Tue, 18 Aug 2015 10:33:56 +0200 +Subject: USB: ftdi_sio: Added custom PID for CustomWare products + +From: Matthijs Kooijman + +commit 1fb8dc36384ae1140ee6ccc470de74397606a9d5 upstream. + +CustomWare uses the FTDI VID with custom PIDs for their ShipModul MiniPlex +products. + +Signed-off-by: Matthijs Kooijman +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 4 ++++ + drivers/usb/serial/ftdi_sio_ids.h | 8 ++++++++ + 2 files changed, 12 insertions(+) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -605,6 +605,10 @@ static const struct usb_device_id id_tab + { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(FTDI_VID, FTDI_SYNAPSE_SS200_PID) }, ++ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX_PID) }, ++ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2_PID) }, ++ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2WI_PID) }, ++ { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX3_PID) }, + /* + * ELV devices: + */ +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -568,6 +568,14 @@ + */ + #define FTDI_SYNAPSE_SS200_PID 0x9090 /* SS200 - SNAP Stick 200 */ + ++/* ++ * CustomWare / ShipModul NMEA multiplexers product ids (FTDI_VID) ++ */ ++#define FTDI_CUSTOMWARE_MINIPLEX_PID 0xfd48 /* MiniPlex first generation NMEA Multiplexer */ ++#define FTDI_CUSTOMWARE_MINIPLEX2_PID 0xfd49 /* MiniPlex-USB and MiniPlex-2 series */ ++#define FTDI_CUSTOMWARE_MINIPLEX2WI_PID 0xfd4a /* MiniPlex-2Wi */ ++#define FTDI_CUSTOMWARE_MINIPLEX3_PID 0xfd4b /* MiniPlex-3 series */ ++ + + /********************************/ + /** third-party VID/PID combos **/ diff --git a/kernel/kernel/files/patches/mageia/stable-usb-gadget-f_uac2-finalize-wmaxpacketsize-according-to-bandwidth.patch b/kernel/kernel/files/patches/mageia/stable-usb-gadget-f_uac2-finalize-wmaxpacketsize-according-to-bandwidth.patch new file mode 100644 index 00000000..4dd324c3 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-usb-gadget-f_uac2-finalize-wmaxpacketsize-according-to-bandwidth.patch @@ -0,0 +1,87 @@ +From 913e4a90b6f9687ac0f543e7b632753e4f51c441 Mon Sep 17 00:00:00 2001 +From: Peter Chen +Date: Thu, 30 Jul 2015 13:13:03 +0800 +Subject: usb: gadget: f_uac2: finalize wMaxPacketSize according to bandwidth + +From: Peter Chen + +commit 913e4a90b6f9687ac0f543e7b632753e4f51c441 upstream. + +According to USB Audio Device 2.0 Spec, Ch4.10.1.1: +wMaxPacketSize is defined as follows: +Maximum packet size this endpoint is capable of sending or receiving +when this configuration is selected. +This is determined by the audio bandwidth constraints of the endpoint. + +In current code, the wMaxPacketSize is defined as the maximum packet size +for ISO endpoint, and it will let the host reserve much more space than +it really needs, so that we can't let more endpoints work together at +one frame. + +We find this issue when we try to let 4 f_uac2 gadgets work together [1] +at FS connection. + +[1]http://www.spinics.net/lists/linux-usb/msg123478.html + +Acked-by: Daniel Mack +Cc: andrzej.p@samsung.com +Cc: Daniel Mack +Cc: tiwai@suse.de +Cc: Alan Stern +Signed-off-by: Peter Chen +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/gadget/function/f_uac2.c | 31 +++++++++++++++++++++++++++++-- + 1 file changed, 29 insertions(+), 2 deletions(-) + +--- a/drivers/usb/gadget/function/f_uac2.c ++++ b/drivers/usb/gadget/function/f_uac2.c +@@ -975,6 +975,29 @@ free_ep(struct uac2_rtd_params *prm, str + "%s:%d Error!\n", __func__, __LINE__); + } + ++static void set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts, ++ struct usb_endpoint_descriptor *ep_desc, ++ unsigned int factor, bool is_playback) ++{ ++ int chmask, srate, ssize; ++ u16 max_packet_size; ++ ++ if (is_playback) { ++ chmask = uac2_opts->p_chmask; ++ srate = uac2_opts->p_srate; ++ ssize = uac2_opts->p_ssize; ++ } else { ++ chmask = uac2_opts->c_chmask; ++ srate = uac2_opts->c_srate; ++ ssize = uac2_opts->c_ssize; ++ } ++ ++ max_packet_size = num_channels(chmask) * ssize * ++ DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1))); ++ ep_desc->wMaxPacketSize = cpu_to_le16(min(max_packet_size, ++ le16_to_cpu(ep_desc->wMaxPacketSize))); ++} ++ + static int + afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) + { +@@ -1070,10 +1093,14 @@ afunc_bind(struct usb_configuration *cfg + uac2->p_prm.uac2 = uac2; + uac2->c_prm.uac2 = uac2; + ++ /* Calculate wMaxPacketSize according to audio bandwidth */ ++ set_ep_max_packet_size(uac2_opts, &fs_epin_desc, 1000, true); ++ set_ep_max_packet_size(uac2_opts, &fs_epout_desc, 1000, false); ++ set_ep_max_packet_size(uac2_opts, &hs_epin_desc, 8000, true); ++ set_ep_max_packet_size(uac2_opts, &hs_epout_desc, 8000, false); ++ + hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress; +- hs_epout_desc.wMaxPacketSize = fs_epout_desc.wMaxPacketSize; + hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress; +- hs_epin_desc.wMaxPacketSize = fs_epin_desc.wMaxPacketSize; + + ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, NULL); + if (ret) diff --git a/kernel/kernel/files/patches/mageia/stable-usb-gadget-m66592-udc-forever-loop-in-set_feature.patch b/kernel/kernel/files/patches/mageia/stable-usb-gadget-m66592-udc-forever-loop-in-set_feature.patch new file mode 100644 index 00000000..49845a10 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-usb-gadget-m66592-udc-forever-loop-in-set_feature.patch @@ -0,0 +1,32 @@ +From 5feb5d2003499b1094d898c010a7604d7afddc4c Mon Sep 17 00:00:00 2001 +From: Dan Carpenter +Date: Thu, 30 Jul 2015 00:30:58 +0300 +Subject: usb: gadget: m66592-udc: forever loop in set_feature() + +From: Dan Carpenter + +commit 5feb5d2003499b1094d898c010a7604d7afddc4c upstream. + +There is an "&&" vs "||" typo here so this loops 3000 times or if we get +unlucky it could loop forever. + +Fixes: ceaa0a6eeadf ('usb: gadget: m66592-udc: add support for TEST_MODE') +Signed-off-by: Dan Carpenter +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/gadget/udc/m66592-udc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/usb/gadget/udc/m66592-udc.c ++++ b/drivers/usb/gadget/udc/m66592-udc.c +@@ -1052,7 +1052,7 @@ static void set_feature(struct m66592 *m + tmp = m66592_read(m66592, M66592_INTSTS0) & + M66592_CTSQ; + udelay(1); +- } while (tmp != M66592_CS_IDST || timeout-- > 0); ++ } while (tmp != M66592_CS_IDST && timeout-- > 0); + + if (tmp == M66592_CS_IDST) + m66592_bset(m66592, diff --git a/kernel/kernel/files/patches/mageia/stable-usb-host-ehci-sys-delete-useless-bus_to_hcd-conversion.patch b/kernel/kernel/files/patches/mageia/stable-usb-host-ehci-sys-delete-useless-bus_to_hcd-conversion.patch new file mode 100644 index 00000000..67707230 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-usb-host-ehci-sys-delete-useless-bus_to_hcd-conversion.patch @@ -0,0 +1,58 @@ +From 0521cfd06e1ebcd575e7ae36aab068b38df23850 Mon Sep 17 00:00:00 2001 +From: Peter Chen +Date: Mon, 17 Aug 2015 10:23:03 +0800 +Subject: usb: host: ehci-sys: delete useless bus_to_hcd conversion + +From: Peter Chen + +commit 0521cfd06e1ebcd575e7ae36aab068b38df23850 upstream. + +The ehci platform device's drvdata is the pointer of struct usb_hcd +already, so we doesn't need to call bus_to_hcd conversion again. + +Signed-off-by: Peter Chen +Acked-by: Alan Stern +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/host/ehci-sysfs.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/usb/host/ehci-sysfs.c ++++ b/drivers/usb/host/ehci-sysfs.c +@@ -29,7 +29,7 @@ static ssize_t show_companion(struct dev + int count = PAGE_SIZE; + char *ptr = buf; + +- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev))); ++ ehci = hcd_to_ehci(dev_get_drvdata(dev)); + nports = HCS_N_PORTS(ehci->hcs_params); + + for (index = 0; index < nports; ++index) { +@@ -54,7 +54,7 @@ static ssize_t store_companion(struct de + struct ehci_hcd *ehci; + int portnum, new_owner; + +- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev))); ++ ehci = hcd_to_ehci(dev_get_drvdata(dev)); + new_owner = PORT_OWNER; /* Owned by companion */ + if (sscanf(buf, "%d", &portnum) != 1) + return -EINVAL; +@@ -85,7 +85,7 @@ static ssize_t show_uframe_periodic_max( + struct ehci_hcd *ehci; + int n; + +- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev))); ++ ehci = hcd_to_ehci(dev_get_drvdata(dev)); + n = scnprintf(buf, PAGE_SIZE, "%d\n", ehci->uframe_periodic_max); + return n; + } +@@ -101,7 +101,7 @@ static ssize_t store_uframe_periodic_max + unsigned long flags; + ssize_t ret; + +- ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev))); ++ ehci = hcd_to_ehci(dev_get_drvdata(dev)); + if (kstrtouint(buf, 0, &uframe_periodic_max) < 0) + return -EINVAL; + diff --git a/kernel/kernel/files/patches/mageia/stable-usb-pl2303-fix-baud-rate-divisor-calculations.patch b/kernel/kernel/files/patches/mageia/stable-usb-pl2303-fix-baud-rate-divisor-calculations.patch new file mode 100644 index 00000000..c9a2fc29 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-usb-pl2303-fix-baud-rate-divisor-calculations.patch @@ -0,0 +1,97 @@ +From 49bda21266fdf195142e8b5dea057f09e96ada9f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20Pecio?= +Date: Sun, 26 Jul 2015 11:14:34 +0200 +Subject: USB: pl2303: fix baud-rate divisor calculations + +From: =?UTF-8?q?Micha=C5=82=20Pecio?= + +commit 49bda21266fdf195142e8b5dea057f09e96ada9f upstream. + +This commit fixes the following issues: + +1. The 9th bit of buf was believed to be the LSB of divisor's +exponent, but the hardware interprets it as MSB (9th bit) of the +mantissa. The exponent is actually one bit shorter and applies +to base 4, not 2 as previously believed. + +2. Loop iterations doubled the exponent instead of incrementing. + +3. The exponent wasn't checked for overflow. + +4. The function returned requested rate instead of actual rate. + +Due to issue #2, the old code deviated from the wrong formula +described in #1 and actually yielded correct rates when divisor +was lower than 4096 by using exponents of 0, 2 or 4 base-2, +interpreted as 0, 1, 2 base-4 with the 9th mantissa bit clear. +However, at 93.75 kbaud or less the rate turned out too slow +due to #2 or too fast due to #2 and #3. + +I tested this patch by sending and validating 0x00,0x01,..,0xff +to an FTDI dongle at 234, 987, 2401, 9601, 31415, 115199, 250k, +500k, 750k, 1M, 1.5M, 3M+1 baud. All rates passed. + +I also used pv to check speed at some rates unsupported by FTDI: +45 (the lowest possible), 2M, 4M, 5M and 6M-1. Looked sane. + +Signed-off-by: Michal Pecio +Fixes: 399aa9a75ad3 ("USB: pl2303: use divisors for unsupported baud +rates") +[johan: update summary ] +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/pl2303.c | 35 ++++++++++++++++++++++++++--------- + 1 file changed, 26 insertions(+), 9 deletions(-) + +--- a/drivers/usb/serial/pl2303.c ++++ b/drivers/usb/serial/pl2303.c +@@ -362,21 +362,38 @@ static speed_t pl2303_encode_baud_rate_d + static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4], + speed_t baud) + { +- unsigned int tmp; ++ unsigned int baseline, mantissa, exponent; + + /* + * Apparently the formula is: +- * baudrate = 12M * 32 / (2^buf[1]) / buf[0] ++ * baudrate = 12M * 32 / (mantissa * 4^exponent) ++ * where ++ * mantissa = buf[8:0] ++ * exponent = buf[11:9] + */ +- tmp = 12000000 * 32 / baud; ++ baseline = 12000000 * 32; ++ mantissa = baseline / baud; ++ if (mantissa == 0) ++ mantissa = 1; /* Avoid dividing by zero if baud > 32*12M. */ ++ exponent = 0; ++ while (mantissa >= 512) { ++ if (exponent < 7) { ++ mantissa >>= 2; /* divide by 4 */ ++ exponent++; ++ } else { ++ /* Exponent is maxed. Trim mantissa and leave. */ ++ mantissa = 511; ++ break; ++ } ++ } ++ + buf[3] = 0x80; + buf[2] = 0; +- buf[1] = (tmp >= 256); +- while (tmp >= 256) { +- tmp >>= 2; +- buf[1] <<= 1; +- } +- buf[0] = tmp; ++ buf[1] = exponent << 1 | mantissa >> 8; ++ buf[0] = mantissa & 0xff; ++ ++ /* Calculate and return the exact baud rate. */ ++ baud = (baseline / mantissa) >> (exponent << 1); + + return baud; + } diff --git a/kernel/kernel/files/patches/mageia/stable-usb-qcserial-add-hp-lt4111-lte-ev-do-hspa-gobi-4g-module.patch b/kernel/kernel/files/patches/mageia/stable-usb-qcserial-add-hp-lt4111-lte-ev-do-hspa-gobi-4g-module.patch new file mode 100644 index 00000000..b07e2064 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-usb-qcserial-add-hp-lt4111-lte-ev-do-hspa-gobi-4g-module.patch @@ -0,0 +1,30 @@ +From 44840dec6127e4d7c5074f75d2dd96bc4ab85fe3 Mon Sep 17 00:00:00 2001 +From: David Ward +Date: Tue, 18 Aug 2015 10:36:23 +0200 +Subject: USB: qcserial: add HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module + +From: David Ward + +commit 44840dec6127e4d7c5074f75d2dd96bc4ab85fe3 upstream. + +This is an HP-branded Sierra Wireless EM7355: +https://bugzilla.redhat.com/show_bug.cgi?id=1223646#c2 + +Signed-off-by: David Ward +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/qcserial.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/usb/serial/qcserial.c ++++ b/drivers/usb/serial/qcserial.c +@@ -139,6 +139,7 @@ static const struct usb_device_id id_tab + {USB_DEVICE(0x0AF0, 0x8120)}, /* Option GTM681W */ + + /* non-Gobi Sierra Wireless devices */ ++ {DEVICE_SWI(0x03f0, 0x4e1d)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ + {DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */ + {DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */ + {DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */ diff --git a/kernel/kernel/files/patches/mageia/stable-usb-symbolserial-use-usb_get_serial_port_data.patch b/kernel/kernel/files/patches/mageia/stable-usb-symbolserial-use-usb_get_serial_port_data.patch new file mode 100644 index 00000000..e5e182bb --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-usb-symbolserial-use-usb_get_serial_port_data.patch @@ -0,0 +1,52 @@ +From 951d3793bbfc0a441d791d820183aa3085c83ea9 Mon Sep 17 00:00:00 2001 +From: Philipp Hachtmann +Date: Mon, 17 Aug 2015 17:31:46 +0200 +Subject: USB: symbolserial: Use usb_get_serial_port_data + +From: Philipp Hachtmann + +commit 951d3793bbfc0a441d791d820183aa3085c83ea9 upstream. + +The driver used usb_get_serial_data(port->serial) which compiled but resulted +in a NULL pointer being returned (and subsequently used). I did not go deeper +into this but I guess this is a regression. + +Signed-off-by: Philipp Hachtmann +Fixes: a85796ee5149 ("USB: symbolserial: move private-data allocation to +port_probe") +Acked-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/symbolserial.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/usb/serial/symbolserial.c ++++ b/drivers/usb/serial/symbolserial.c +@@ -94,7 +94,7 @@ exit: + + static int symbol_open(struct tty_struct *tty, struct usb_serial_port *port) + { +- struct symbol_private *priv = usb_get_serial_data(port->serial); ++ struct symbol_private *priv = usb_get_serial_port_data(port); + unsigned long flags; + int result = 0; + +@@ -120,7 +120,7 @@ static void symbol_close(struct usb_seri + static void symbol_throttle(struct tty_struct *tty) + { + struct usb_serial_port *port = tty->driver_data; +- struct symbol_private *priv = usb_get_serial_data(port->serial); ++ struct symbol_private *priv = usb_get_serial_port_data(port); + + spin_lock_irq(&priv->lock); + priv->throttled = true; +@@ -130,7 +130,7 @@ static void symbol_throttle(struct tty_s + static void symbol_unthrottle(struct tty_struct *tty) + { + struct usb_serial_port *port = tty->driver_data; +- struct symbol_private *priv = usb_get_serial_data(port->serial); ++ struct symbol_private *priv = usb_get_serial_port_data(port); + int result; + bool was_throttled; + diff --git a/kernel/kernel/files/patches/mageia/stable-x86-ldt-correct-fpu-emulation-access-to-ldt.patch b/kernel/kernel/files/patches/mageia/stable-x86-ldt-correct-fpu-emulation-access-to-ldt.patch new file mode 100644 index 00000000..6dda3314 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-x86-ldt-correct-fpu-emulation-access-to-ldt.patch @@ -0,0 +1,98 @@ +From 4809146b86c3d41ce588fdb767d021e2a80600dd Mon Sep 17 00:00:00 2001 +From: Juergen Gross +Date: Thu, 6 Aug 2015 19:54:34 +0200 +Subject: x86/ldt: Correct FPU emulation access to LDT + +From: Juergen Gross + +commit 4809146b86c3d41ce588fdb767d021e2a80600dd upstream. + +Commit 37868fe113ff ("x86/ldt: Make modify_ldt synchronous") +introduced a new struct ldt_struct anchored at mm->context.ldt. + +Adapt the x86 fpu emulation code to use that new structure. + +Signed-off-by: Juergen Gross +Reviewed-by: Andy Lutomirski +Cc: Linus Torvalds +Cc: Peter Zijlstra +Cc: Thomas Gleixner +Cc: billm@melbpc.org.au +Link: http://lkml.kernel.org/r/1438883674-1240-1-git-send-email-jgross@suse.com +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/math-emu/fpu_entry.c | 3 +-- + arch/x86/math-emu/fpu_system.h | 21 ++++++++++++++++++--- + arch/x86/math-emu/get_address.c | 3 +-- + 3 files changed, 20 insertions(+), 7 deletions(-) + +--- a/arch/x86/math-emu/fpu_entry.c ++++ b/arch/x86/math-emu/fpu_entry.c +@@ -29,7 +29,6 @@ + + #include + #include +-#include + #include + #include + +@@ -185,7 +184,7 @@ void math_emulate(struct math_emu_info * + math_abort(FPU_info, SIGILL); + } + +- code_descriptor = LDT_DESCRIPTOR(FPU_CS); ++ code_descriptor = FPU_get_ldt_descriptor(FPU_CS); + if (SEG_D_SIZE(code_descriptor)) { + /* The above test may be wrong, the book is not clear */ + /* Segmented 32 bit protected mode */ +--- a/arch/x86/math-emu/fpu_system.h ++++ b/arch/x86/math-emu/fpu_system.h +@@ -16,9 +16,24 @@ + #include + #include + +-/* s is always from a cpu register, and the cpu does bounds checking +- * during register load --> no further bounds checks needed */ +-#define LDT_DESCRIPTOR(s) (((struct desc_struct *)current->mm->context.ldt)[(s) >> 3]) ++#include ++#include ++ ++static inline struct desc_struct FPU_get_ldt_descriptor(unsigned seg) ++{ ++ static struct desc_struct zero_desc; ++ struct desc_struct ret = zero_desc; ++ ++#ifdef CONFIG_MODIFY_LDT_SYSCALL ++ seg >>= 3; ++ mutex_lock(¤t->mm->context.lock); ++ if (current->mm->context.ldt && seg < current->mm->context.ldt->size) ++ ret = current->mm->context.ldt->entries[seg]; ++ mutex_unlock(¤t->mm->context.lock); ++#endif ++ return ret; ++} ++ + #define SEG_D_SIZE(x) ((x).b & (3 << 21)) + #define SEG_G_BIT(x) ((x).b & (1 << 23)) + #define SEG_GRANULARITY(x) (((x).b & (1 << 23)) ? 4096 : 1) +--- a/arch/x86/math-emu/get_address.c ++++ b/arch/x86/math-emu/get_address.c +@@ -20,7 +20,6 @@ + #include + + #include +-#include + + #include "fpu_system.h" + #include "exception.h" +@@ -158,7 +157,7 @@ static long pm_address(u_char FPU_modrm, + addr->selector = PM_REG_(segment); + } + +- descriptor = LDT_DESCRIPTOR(PM_REG_(segment)); ++ descriptor = FPU_get_ldt_descriptor(segment); + base_address = SEG_BASE_ADDR(descriptor); + address = base_address + offset; + limit = base_address diff --git a/kernel/kernel/files/patches/mageia/stable-x86-ldt-correct-ldt-access-in-single-stepping-logic.patch b/kernel/kernel/files/patches/mageia/stable-x86-ldt-correct-ldt-access-in-single-stepping-logic.patch new file mode 100644 index 00000000..e0619146 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-x86-ldt-correct-ldt-access-in-single-stepping-logic.patch @@ -0,0 +1,45 @@ +From 136d9d83c07c5e30ac49fc83b27e8c4842f108fc Mon Sep 17 00:00:00 2001 +From: Juergen Gross +Date: Thu, 6 Aug 2015 10:04:38 +0200 +Subject: x86/ldt: Correct LDT access in single stepping logic + +From: Juergen Gross + +commit 136d9d83c07c5e30ac49fc83b27e8c4842f108fc upstream. + +Commit 37868fe113ff ("x86/ldt: Make modify_ldt synchronous") +introduced a new struct ldt_struct anchored at mm->context.ldt. + +convert_ip_to_linear() was changed to reflect this, but indexing +into the ldt has to be changed as the pointer is no longer void *. + +Signed-off-by: Juergen Gross +Reviewed-by: Andy Lutomirski +Cc: Linus Torvalds +Cc: Peter Zijlstra +Cc: Thomas Gleixner +Cc: bp@suse.de +Link: http://lkml.kernel.org/r/1438848278-12906-1-git-send-email-jgross@suse.com +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/kernel/step.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/arch/x86/kernel/step.c ++++ b/arch/x86/kernel/step.c +@@ -28,11 +28,11 @@ unsigned long convert_ip_to_linear(struc + struct desc_struct *desc; + unsigned long base; + +- seg &= ~7UL; ++ seg >>= 3; + + mutex_lock(&child->mm->context.lock); + if (unlikely(!child->mm->context.ldt || +- (seg >> 3) >= child->mm->context.ldt->size)) ++ seg >= child->mm->context.ldt->size)) + addr = -1L; /* bogus selector, access would fault */ + else { + desc = &child->mm->context.ldt->entries[seg]; diff --git a/kernel/kernel/files/patches/mageia/stable-x86-ldt-further-fix-fpu-emulation.patch b/kernel/kernel/files/patches/mageia/stable-x86-ldt-further-fix-fpu-emulation.patch new file mode 100644 index 00000000..af7eb5cd --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-x86-ldt-further-fix-fpu-emulation.patch @@ -0,0 +1,35 @@ +From 12e244f4b550498bbaf654a52f93633f7dde2dc7 Mon Sep 17 00:00:00 2001 +From: Andy Lutomirski +Date: Fri, 14 Aug 2015 15:02:55 -0700 +Subject: x86/ldt: Further fix FPU emulation + +From: Andy Lutomirski + +commit 12e244f4b550498bbaf654a52f93633f7dde2dc7 upstream. + +The previous fix confused a selector with a segment prefix. Fix it. + +Compile-tested only. + +Cc: Juergen Gross +Reported-by: Linus Torvalds +Fixes: 4809146b86c3 ("x86/ldt: Correct FPU emulation access to LDT") +Signed-off-by: Andy Lutomirski +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/math-emu/get_address.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/x86/math-emu/get_address.c ++++ b/arch/x86/math-emu/get_address.c +@@ -157,7 +157,7 @@ static long pm_address(u_char FPU_modrm, + addr->selector = PM_REG_(segment); + } + +- descriptor = FPU_get_ldt_descriptor(segment); ++ descriptor = FPU_get_ldt_descriptor(addr->selector); + base_address = SEG_BASE_ADDR(descriptor); + address = base_address + offset; + limit = base_address diff --git a/kernel/kernel/files/patches/mageia/stable-x86-ldt-make-modify_ldt-synchronous.patch b/kernel/kernel/files/patches/mageia/stable-x86-ldt-make-modify_ldt-synchronous.patch new file mode 100644 index 00000000..2729cf7e --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-x86-ldt-make-modify_ldt-synchronous.patch @@ -0,0 +1,628 @@ +From 37868fe113ff2ba814b3b4eb12df214df555f8dc Mon Sep 17 00:00:00 2001 +From: Andy Lutomirski +Date: Thu, 30 Jul 2015 14:31:32 -0700 +Subject: x86/ldt: Make modify_ldt synchronous + +From: Andy Lutomirski + +commit 37868fe113ff2ba814b3b4eb12df214df555f8dc upstream. + +modify_ldt() has questionable locking and does not synchronize +threads. Improve it: redesign the locking and synchronize all +threads' LDTs using an IPI on all modifications. + +This will dramatically slow down modify_ldt in multithreaded +programs, but there shouldn't be any multithreaded programs that +care about modify_ldt's performance in the first place. + +This fixes some fallout from the CVE-2015-5157 fixes. + +Signed-off-by: Andy Lutomirski +Reviewed-by: Borislav Petkov +Cc: Andrew Cooper +Cc: Andy Lutomirski +Cc: Boris Ostrovsky +Cc: Borislav Petkov +Cc: Brian Gerst +Cc: Denys Vlasenko +Cc: H. Peter Anvin +Cc: Jan Beulich +Cc: Konrad Rzeszutek Wilk +Cc: Linus Torvalds +Cc: Peter Zijlstra +Cc: Sasha Levin +Cc: Steven Rostedt +Cc: Thomas Gleixner +Cc: security@kernel.org +Cc: xen-devel +Link: http://lkml.kernel.org/r/4c6978476782160600471bd865b318db34c7b628.1438291540.git.luto@kernel.org +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/include/asm/desc.h | 15 -- + arch/x86/include/asm/mmu.h | 3 + arch/x86/include/asm/mmu_context.h | 54 ++++++- + arch/x86/kernel/cpu/common.c | 4 + arch/x86/kernel/cpu/perf_event.c | 12 + + arch/x86/kernel/ldt.c | 264 ++++++++++++++++++++----------------- + arch/x86/kernel/process_64.c | 4 + arch/x86/kernel/step.c | 6 + arch/x86/power/cpu.c | 3 + 9 files changed, 211 insertions(+), 154 deletions(-) + +--- a/arch/x86/include/asm/desc.h ++++ b/arch/x86/include/asm/desc.h +@@ -280,21 +280,6 @@ static inline void clear_LDT(void) + set_ldt(NULL, 0); + } + +-/* +- * load one particular LDT into the current CPU +- */ +-static inline void load_LDT_nolock(mm_context_t *pc) +-{ +- set_ldt(pc->ldt, pc->size); +-} +- +-static inline void load_LDT(mm_context_t *pc) +-{ +- preempt_disable(); +- load_LDT_nolock(pc); +- preempt_enable(); +-} +- + static inline unsigned long get_desc_base(const struct desc_struct *desc) + { + return (unsigned)(desc->base0 | ((desc->base1) << 16) | ((desc->base2) << 24)); +--- a/arch/x86/include/asm/mmu.h ++++ b/arch/x86/include/asm/mmu.h +@@ -9,8 +9,7 @@ + * we put the segment information here. + */ + typedef struct { +- void *ldt; +- int size; ++ struct ldt_struct *ldt; + + #ifdef CONFIG_X86_64 + /* True if mm supports a task running in 32 bit compatibility mode. */ +--- a/arch/x86/include/asm/mmu_context.h ++++ b/arch/x86/include/asm/mmu_context.h +@@ -34,6 +34,50 @@ static inline void load_mm_cr4(struct mm + #endif + + /* ++ * ldt_structs can be allocated, used, and freed, but they are never ++ * modified while live. ++ */ ++struct ldt_struct { ++ /* ++ * Xen requires page-aligned LDTs with special permissions. This is ++ * needed to prevent us from installing evil descriptors such as ++ * call gates. On native, we could merge the ldt_struct and LDT ++ * allocations, but it's not worth trying to optimize. ++ */ ++ struct desc_struct *entries; ++ int size; ++}; ++ ++static inline void load_mm_ldt(struct mm_struct *mm) ++{ ++ struct ldt_struct *ldt; ++ ++ /* lockless_dereference synchronizes with smp_store_release */ ++ ldt = lockless_dereference(mm->context.ldt); ++ ++ /* ++ * Any change to mm->context.ldt is followed by an IPI to all ++ * CPUs with the mm active. The LDT will not be freed until ++ * after the IPI is handled by all such CPUs. This means that, ++ * if the ldt_struct changes before we return, the values we see ++ * will be safe, and the new values will be loaded before we run ++ * any user code. ++ * ++ * NB: don't try to convert this to use RCU without extreme care. ++ * We would still need IRQs off, because we don't want to change ++ * the local LDT after an IPI loaded a newer value than the one ++ * that we can see. ++ */ ++ ++ if (unlikely(ldt)) ++ set_ldt(ldt->entries, ldt->size); ++ else ++ clear_LDT(); ++ ++ DEBUG_LOCKS_WARN_ON(preemptible()); ++} ++ ++/* + * Used for LDT copy/destruction. + */ + int init_new_context(struct task_struct *tsk, struct mm_struct *mm); +@@ -78,12 +122,12 @@ static inline void switch_mm(struct mm_s + * was called and then modify_ldt changed + * prev->context.ldt but suppressed an IPI to this CPU. + * In this case, prev->context.ldt != NULL, because we +- * never free an LDT while the mm still exists. That +- * means that next->context.ldt != prev->context.ldt, +- * because mms never share an LDT. ++ * never set context.ldt to NULL while the mm still ++ * exists. That means that next->context.ldt != ++ * prev->context.ldt, because mms never share an LDT. + */ + if (unlikely(prev->context.ldt != next->context.ldt)) +- load_LDT_nolock(&next->context); ++ load_mm_ldt(next); + } + #ifdef CONFIG_SMP + else { +@@ -106,7 +150,7 @@ static inline void switch_mm(struct mm_s + load_cr3(next->pgd); + trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH, TLB_FLUSH_ALL); + load_mm_cr4(next); +- load_LDT_nolock(&next->context); ++ load_mm_ldt(next); + } + } + #endif +--- a/arch/x86/kernel/cpu/common.c ++++ b/arch/x86/kernel/cpu/common.c +@@ -1434,7 +1434,7 @@ void cpu_init(void) + load_sp0(t, ¤t->thread); + set_tss_desc(cpu, t); + load_TR_desc(); +- load_LDT(&init_mm.context); ++ load_mm_ldt(&init_mm); + + clear_all_debug_regs(); + dbg_restore_debug_regs(); +@@ -1483,7 +1483,7 @@ void cpu_init(void) + load_sp0(t, thread); + set_tss_desc(cpu, t); + load_TR_desc(); +- load_LDT(&init_mm.context); ++ load_mm_ldt(&init_mm); + + t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap); + +--- a/arch/x86/kernel/cpu/perf_event.c ++++ b/arch/x86/kernel/cpu/perf_event.c +@@ -2170,21 +2170,25 @@ static unsigned long get_segment_base(un + int idx = segment >> 3; + + if ((segment & SEGMENT_TI_MASK) == SEGMENT_LDT) { ++ struct ldt_struct *ldt; ++ + if (idx > LDT_ENTRIES) + return 0; + +- if (idx > current->active_mm->context.size) ++ /* IRQs are off, so this synchronizes with smp_store_release */ ++ ldt = lockless_dereference(current->active_mm->context.ldt); ++ if (!ldt || idx > ldt->size) + return 0; + +- desc = current->active_mm->context.ldt; ++ desc = &ldt->entries[idx]; + } else { + if (idx > GDT_ENTRIES) + return 0; + +- desc = raw_cpu_ptr(gdt_page.gdt); ++ desc = raw_cpu_ptr(gdt_page.gdt) + idx; + } + +- return get_desc_base(desc + idx); ++ return get_desc_base(desc); + } + + #ifdef CONFIG_COMPAT +--- a/arch/x86/kernel/ldt.c ++++ b/arch/x86/kernel/ldt.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -20,82 +21,82 @@ + #include + #include + +-#ifdef CONFIG_SMP ++/* context.lock is held for us, so we don't need any locking. */ + static void flush_ldt(void *current_mm) + { +- if (current->active_mm == current_mm) +- load_LDT(¤t->active_mm->context); ++ mm_context_t *pc; ++ ++ if (current->active_mm != current_mm) ++ return; ++ ++ pc = ¤t->active_mm->context; ++ set_ldt(pc->ldt->entries, pc->ldt->size); + } +-#endif + +-static int alloc_ldt(mm_context_t *pc, int mincount, int reload) ++/* The caller must call finalize_ldt_struct on the result. LDT starts zeroed. */ ++static struct ldt_struct *alloc_ldt_struct(int size) + { +- void *oldldt, *newldt; +- int oldsize; ++ struct ldt_struct *new_ldt; ++ int alloc_size; + +- if (mincount <= pc->size) +- return 0; +- oldsize = pc->size; +- mincount = (mincount + (PAGE_SIZE / LDT_ENTRY_SIZE - 1)) & +- (~(PAGE_SIZE / LDT_ENTRY_SIZE - 1)); +- if (mincount * LDT_ENTRY_SIZE > PAGE_SIZE) +- newldt = vmalloc(mincount * LDT_ENTRY_SIZE); +- else +- newldt = (void *)__get_free_page(GFP_KERNEL); ++ if (size > LDT_ENTRIES) ++ return NULL; + +- if (!newldt) +- return -ENOMEM; ++ new_ldt = kmalloc(sizeof(struct ldt_struct), GFP_KERNEL); ++ if (!new_ldt) ++ return NULL; ++ ++ BUILD_BUG_ON(LDT_ENTRY_SIZE != sizeof(struct desc_struct)); ++ alloc_size = size * LDT_ENTRY_SIZE; ++ ++ /* ++ * Xen is very picky: it requires a page-aligned LDT that has no ++ * trailing nonzero bytes in any page that contains LDT descriptors. ++ * Keep it simple: zero the whole allocation and never allocate less ++ * than PAGE_SIZE. ++ */ ++ if (alloc_size > PAGE_SIZE) ++ new_ldt->entries = vzalloc(alloc_size); ++ else ++ new_ldt->entries = kzalloc(PAGE_SIZE, GFP_KERNEL); + +- if (oldsize) +- memcpy(newldt, pc->ldt, oldsize * LDT_ENTRY_SIZE); +- oldldt = pc->ldt; +- memset(newldt + oldsize * LDT_ENTRY_SIZE, 0, +- (mincount - oldsize) * LDT_ENTRY_SIZE); +- +- paravirt_alloc_ldt(newldt, mincount); +- +-#ifdef CONFIG_X86_64 +- /* CHECKME: Do we really need this ? */ +- wmb(); +-#endif +- pc->ldt = newldt; +- wmb(); +- pc->size = mincount; +- wmb(); +- +- if (reload) { +-#ifdef CONFIG_SMP +- preempt_disable(); +- load_LDT(pc); +- if (!cpumask_equal(mm_cpumask(current->mm), +- cpumask_of(smp_processor_id()))) +- smp_call_function(flush_ldt, current->mm, 1); +- preempt_enable(); +-#else +- load_LDT(pc); +-#endif +- } +- if (oldsize) { +- paravirt_free_ldt(oldldt, oldsize); +- if (oldsize * LDT_ENTRY_SIZE > PAGE_SIZE) +- vfree(oldldt); +- else +- put_page(virt_to_page(oldldt)); ++ if (!new_ldt->entries) { ++ kfree(new_ldt); ++ return NULL; + } +- return 0; ++ ++ new_ldt->size = size; ++ return new_ldt; + } + +-static inline int copy_ldt(mm_context_t *new, mm_context_t *old) ++/* After calling this, the LDT is immutable. */ ++static void finalize_ldt_struct(struct ldt_struct *ldt) + { +- int err = alloc_ldt(new, old->size, 0); +- int i; ++ paravirt_alloc_ldt(ldt->entries, ldt->size); ++} ++ ++/* context.lock is held */ ++static void install_ldt(struct mm_struct *current_mm, ++ struct ldt_struct *ldt) ++{ ++ /* Synchronizes with lockless_dereference in load_mm_ldt. */ ++ smp_store_release(¤t_mm->context.ldt, ldt); ++ ++ /* Activate the LDT for all CPUs using current_mm. */ ++ on_each_cpu_mask(mm_cpumask(current_mm), flush_ldt, current_mm, true); ++} + +- if (err < 0) +- return err; ++static void free_ldt_struct(struct ldt_struct *ldt) ++{ ++ if (likely(!ldt)) ++ return; + +- for (i = 0; i < old->size; i++) +- write_ldt_entry(new->ldt, i, old->ldt + i * LDT_ENTRY_SIZE); +- return 0; ++ paravirt_free_ldt(ldt->entries, ldt->size); ++ if (ldt->size * LDT_ENTRY_SIZE > PAGE_SIZE) ++ vfree(ldt->entries); ++ else ++ kfree(ldt->entries); ++ kfree(ldt); + } + + /* +@@ -104,17 +105,37 @@ static inline int copy_ldt(mm_context_t + */ + int init_new_context(struct task_struct *tsk, struct mm_struct *mm) + { ++ struct ldt_struct *new_ldt; + struct mm_struct *old_mm; + int retval = 0; + + mutex_init(&mm->context.lock); +- mm->context.size = 0; + old_mm = current->mm; +- if (old_mm && old_mm->context.size > 0) { +- mutex_lock(&old_mm->context.lock); +- retval = copy_ldt(&mm->context, &old_mm->context); +- mutex_unlock(&old_mm->context.lock); ++ if (!old_mm) { ++ mm->context.ldt = NULL; ++ return 0; + } ++ ++ mutex_lock(&old_mm->context.lock); ++ if (!old_mm->context.ldt) { ++ mm->context.ldt = NULL; ++ goto out_unlock; ++ } ++ ++ new_ldt = alloc_ldt_struct(old_mm->context.ldt->size); ++ if (!new_ldt) { ++ retval = -ENOMEM; ++ goto out_unlock; ++ } ++ ++ memcpy(new_ldt->entries, old_mm->context.ldt->entries, ++ new_ldt->size * LDT_ENTRY_SIZE); ++ finalize_ldt_struct(new_ldt); ++ ++ mm->context.ldt = new_ldt; ++ ++out_unlock: ++ mutex_unlock(&old_mm->context.lock); + return retval; + } + +@@ -125,53 +146,47 @@ int init_new_context(struct task_struct + */ + void destroy_context(struct mm_struct *mm) + { +- if (mm->context.size) { +-#ifdef CONFIG_X86_32 +- /* CHECKME: Can this ever happen ? */ +- if (mm == current->active_mm) +- clear_LDT(); +-#endif +- paravirt_free_ldt(mm->context.ldt, mm->context.size); +- if (mm->context.size * LDT_ENTRY_SIZE > PAGE_SIZE) +- vfree(mm->context.ldt); +- else +- put_page(virt_to_page(mm->context.ldt)); +- mm->context.size = 0; +- } ++ free_ldt_struct(mm->context.ldt); ++ mm->context.ldt = NULL; + } + + static int read_ldt(void __user *ptr, unsigned long bytecount) + { +- int err; ++ int retval; + unsigned long size; + struct mm_struct *mm = current->mm; + +- if (!mm->context.size) +- return 0; ++ mutex_lock(&mm->context.lock); ++ ++ if (!mm->context.ldt) { ++ retval = 0; ++ goto out_unlock; ++ } ++ + if (bytecount > LDT_ENTRY_SIZE * LDT_ENTRIES) + bytecount = LDT_ENTRY_SIZE * LDT_ENTRIES; + +- mutex_lock(&mm->context.lock); +- size = mm->context.size * LDT_ENTRY_SIZE; ++ size = mm->context.ldt->size * LDT_ENTRY_SIZE; + if (size > bytecount) + size = bytecount; + +- err = 0; +- if (copy_to_user(ptr, mm->context.ldt, size)) +- err = -EFAULT; +- mutex_unlock(&mm->context.lock); +- if (err < 0) +- goto error_return; ++ if (copy_to_user(ptr, mm->context.ldt->entries, size)) { ++ retval = -EFAULT; ++ goto out_unlock; ++ } ++ + if (size != bytecount) { +- /* zero-fill the rest */ +- if (clear_user(ptr + size, bytecount - size) != 0) { +- err = -EFAULT; +- goto error_return; ++ /* Zero-fill the rest and pretend we read bytecount bytes. */ ++ if (clear_user(ptr + size, bytecount - size)) { ++ retval = -EFAULT; ++ goto out_unlock; + } + } +- return bytecount; +-error_return: +- return err; ++ retval = bytecount; ++ ++out_unlock: ++ mutex_unlock(&mm->context.lock); ++ return retval; + } + + static int read_default_ldt(void __user *ptr, unsigned long bytecount) +@@ -195,6 +210,8 @@ static int write_ldt(void __user *ptr, u + struct desc_struct ldt; + int error; + struct user_desc ldt_info; ++ int oldsize, newsize; ++ struct ldt_struct *new_ldt, *old_ldt; + + error = -EINVAL; + if (bytecount != sizeof(ldt_info)) +@@ -213,34 +230,39 @@ static int write_ldt(void __user *ptr, u + goto out; + } + +- mutex_lock(&mm->context.lock); +- if (ldt_info.entry_number >= mm->context.size) { +- error = alloc_ldt(¤t->mm->context, +- ldt_info.entry_number + 1, 1); +- if (error < 0) +- goto out_unlock; +- } +- +- /* Allow LDTs to be cleared by the user. */ +- if (ldt_info.base_addr == 0 && ldt_info.limit == 0) { +- if (oldmode || LDT_empty(&ldt_info)) { +- memset(&ldt, 0, sizeof(ldt)); +- goto install; ++ if ((oldmode && !ldt_info.base_addr && !ldt_info.limit) || ++ LDT_empty(&ldt_info)) { ++ /* The user wants to clear the entry. */ ++ memset(&ldt, 0, sizeof(ldt)); ++ } else { ++ if (!IS_ENABLED(CONFIG_X86_16BIT) && !ldt_info.seg_32bit) { ++ error = -EINVAL; ++ goto out; + } ++ ++ fill_ldt(&ldt, &ldt_info); ++ if (oldmode) ++ ldt.avl = 0; + } + +- if (!IS_ENABLED(CONFIG_X86_16BIT) && !ldt_info.seg_32bit) { +- error = -EINVAL; ++ mutex_lock(&mm->context.lock); ++ ++ old_ldt = mm->context.ldt; ++ oldsize = old_ldt ? old_ldt->size : 0; ++ newsize = max((int)(ldt_info.entry_number + 1), oldsize); ++ ++ error = -ENOMEM; ++ new_ldt = alloc_ldt_struct(newsize); ++ if (!new_ldt) + goto out_unlock; +- } + +- fill_ldt(&ldt, &ldt_info); +- if (oldmode) +- ldt.avl = 0; +- +- /* Install the new entry ... */ +-install: +- write_ldt_entry(mm->context.ldt, ldt_info.entry_number, &ldt); ++ if (old_ldt) ++ memcpy(new_ldt->entries, old_ldt->entries, oldsize * LDT_ENTRY_SIZE); ++ new_ldt->entries[ldt_info.entry_number] = ldt; ++ finalize_ldt_struct(new_ldt); ++ ++ install_ldt(mm, new_ldt); ++ free_ldt_struct(old_ldt); + error = 0; + + out_unlock: +--- a/arch/x86/kernel/process_64.c ++++ b/arch/x86/kernel/process_64.c +@@ -122,11 +122,11 @@ void __show_regs(struct pt_regs *regs, i + void release_thread(struct task_struct *dead_task) + { + if (dead_task->mm) { +- if (dead_task->mm->context.size) { ++ if (dead_task->mm->context.ldt) { + pr_warn("WARNING: dead process %s still has LDT? <%p/%d>\n", + dead_task->comm, + dead_task->mm->context.ldt, +- dead_task->mm->context.size); ++ dead_task->mm->context.ldt->size); + BUG(); + } + } +--- a/arch/x86/kernel/step.c ++++ b/arch/x86/kernel/step.c +@@ -5,6 +5,7 @@ + #include + #include + #include ++#include + + unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs) + { +@@ -30,10 +31,11 @@ unsigned long convert_ip_to_linear(struc + seg &= ~7UL; + + mutex_lock(&child->mm->context.lock); +- if (unlikely((seg >> 3) >= child->mm->context.size)) ++ if (unlikely(!child->mm->context.ldt || ++ (seg >> 3) >= child->mm->context.ldt->size)) + addr = -1L; /* bogus selector, access would fault */ + else { +- desc = child->mm->context.ldt + seg; ++ desc = &child->mm->context.ldt->entries[seg]; + base = get_desc_base(desc); + + /* 16-bit code segment? */ +--- a/arch/x86/power/cpu.c ++++ b/arch/x86/power/cpu.c +@@ -23,6 +23,7 @@ + #include + #include /* pcntxt_mask */ + #include ++#include + + #ifdef CONFIG_X86_32 + __visible unsigned long saved_context_ebx; +@@ -154,7 +155,7 @@ static void fix_processor_context(void) + syscall_init(); /* This sets MSR_*STAR and related */ + #endif + load_TR_desc(); /* This does ltr */ +- load_LDT(¤t->active_mm->context); /* This does lldt */ ++ load_mm_ldt(current->active_mm); /* This does lldt */ + } + + /** diff --git a/kernel/kernel/files/patches/mageia/stable-x86-xen-build-xen-pv-apic-driver-for-domu-as-well.patch b/kernel/kernel/files/patches/mageia/stable-x86-xen-build-xen-pv-apic-driver-for-domu-as-well.patch deleted file mode 100644 index d2672797..00000000 --- a/kernel/kernel/files/patches/mageia/stable-x86-xen-build-xen-pv-apic-driver-for-domu-as-well.patch +++ /dev/null @@ -1,87 +0,0 @@ -From fc5fee86bdd3d720e2d1d324e4fae0c35845fa63 Mon Sep 17 00:00:00 2001 -From: "Jason A. Donenfeld" -Date: Mon, 10 Aug 2015 15:40:27 +0200 -Subject: x86/xen: build "Xen PV" APIC driver for domU as well - -From: "Jason A. Donenfeld" - -commit fc5fee86bdd3d720e2d1d324e4fae0c35845fa63 upstream. - -It turns out that a PV domU also requires the "Xen PV" APIC -driver. Otherwise, the flat driver is used and we get stuck in busy -loops that never exit, such as in this stack trace: - -(gdb) target remote localhost:9999 -Remote debugging using localhost:9999 -__xapic_wait_icr_idle () at ./arch/x86/include/asm/ipi.h:56 -56 while (native_apic_mem_read(APIC_ICR) & APIC_ICR_BUSY) -(gdb) bt - #0 __xapic_wait_icr_idle () at ./arch/x86/include/asm/ipi.h:56 - #1 __default_send_IPI_shortcut (shortcut=, -dest=, vector=) at -./arch/x86/include/asm/ipi.h:75 - #2 apic_send_IPI_self (vector=246) at arch/x86/kernel/apic/probe_64.c:54 - #3 0xffffffff81011336 in arch_irq_work_raise () at -arch/x86/kernel/irq_work.c:47 - #4 0xffffffff8114990c in irq_work_queue (work=0xffff88000fc0e400) at -kernel/irq_work.c:100 - #5 0xffffffff8110c29d in wake_up_klogd () at kernel/printk/printk.c:2633 - #6 0xffffffff8110ca60 in vprintk_emit (facility=0, level=, dict=0x0 , dictlen=, -fmt=, args=) - at kernel/printk/printk.c:1778 - #7 0xffffffff816010c8 in printk (fmt=) at -kernel/printk/printk.c:1868 - #8 0xffffffffc00013ea in ?? () - #9 0x0000000000000000 in ?? () - -Mailing-list-thread: https://lkml.org/lkml/2015/8/4/755 -Signed-off-by: Jason A. Donenfeld -Signed-off-by: David Vrabel -Signed-off-by: Greg Kroah-Hartman - ---- - arch/x86/xen/Makefile | 4 ++-- - arch/x86/xen/xen-ops.h | 6 ++---- - 2 files changed, 4 insertions(+), 6 deletions(-) - ---- a/arch/x86/xen/Makefile -+++ b/arch/x86/xen/Makefile -@@ -13,13 +13,13 @@ CFLAGS_mmu.o := $(nostackp) - obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ - time.o xen-asm.o xen-asm_$(BITS).o \ - grant-table.o suspend.o platform-pci-unplug.o \ -- p2m.o -+ p2m.o apic.o - - obj-$(CONFIG_EVENT_TRACING) += trace.o - - obj-$(CONFIG_SMP) += smp.o - obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o - obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o --obj-$(CONFIG_XEN_DOM0) += apic.o vga.o -+obj-$(CONFIG_XEN_DOM0) += vga.o - obj-$(CONFIG_SWIOTLB_XEN) += pci-swiotlb-xen.o - obj-$(CONFIG_XEN_EFI) += efi.o ---- a/arch/x86/xen/xen-ops.h -+++ b/arch/x86/xen/xen-ops.h -@@ -101,17 +101,15 @@ struct dom0_vga_console_info; - - #ifdef CONFIG_XEN_DOM0 - void __init xen_init_vga(const struct dom0_vga_console_info *, size_t size); --void __init xen_init_apic(void); - #else - static inline void __init xen_init_vga(const struct dom0_vga_console_info *info, - size_t size) - { - } --static inline void __init xen_init_apic(void) --{ --} - #endif - -+void __init xen_init_apic(void); -+ - #ifdef CONFIG_XEN_EFI - extern void xen_efi_init(void); - #else diff --git a/kernel/kernel/files/patches/mageia/stable-xen-blkback-replace-work_pending-with-work_busy-in-purge_persistent_gnt.patch b/kernel/kernel/files/patches/mageia/stable-xen-blkback-replace-work_pending-with-work_busy-in-purge_persistent_gnt.patch deleted file mode 100644 index 770bcb0a..00000000 --- a/kernel/kernel/files/patches/mageia/stable-xen-blkback-replace-work_pending-with-work_busy-in-purge_persistent_gnt.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 53bc7dc004fecf39e0ba70f2f8d120a1444315d3 Mon Sep 17 00:00:00 2001 -From: Bob Liu -Date: Wed, 22 Jul 2015 14:40:10 +0800 -Subject: xen-blkback: replace work_pending with work_busy in purge_persistent_gnt() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -From: Bob Liu - -commit 53bc7dc004fecf39e0ba70f2f8d120a1444315d3 upstream. - -The BUG_ON() in purge_persistent_gnt() will be triggered when previous purge -work haven't finished. - -There is a work_pending() before this BUG_ON, but it doesn't account if the work -is still currently running. - -Acked-by: Roger Pau Monné -Signed-off-by: Bob Liu -Signed-off-by: Konrad Rzeszutek Wilk -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/block/xen-blkback/blkback.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/block/xen-blkback/blkback.c -+++ b/drivers/block/xen-blkback/blkback.c -@@ -362,8 +362,8 @@ static void purge_persistent_gnt(struct - return; - } - -- if (work_pending(&blkif->persistent_purge_work)) { -- pr_alert_ratelimited("Scheduled work from previous purge is still pending, cannot purge list\n"); -+ if (work_busy(&blkif->persistent_purge_work)) { -+ pr_alert_ratelimited("Scheduled work from previous purge is still busy, cannot purge list\n"); - return; - } - diff --git a/kernel/kernel/files/patches/mageia/stable-xen-blkfront-don-t-add-indirect-pages-to-list-when.patch b/kernel/kernel/files/patches/mageia/stable-xen-blkfront-don-t-add-indirect-pages-to-list-when.patch deleted file mode 100644 index aeb4f074..00000000 --- a/kernel/kernel/files/patches/mageia/stable-xen-blkfront-don-t-add-indirect-pages-to-list-when.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 7b0767502b5db11cb1f0daef2d01f6d71b1192dc Mon Sep 17 00:00:00 2001 -From: Bob Liu -Date: Wed, 22 Jul 2015 14:40:09 +0800 -Subject: xen-blkfront: don't add indirect pages to list when - !feature_persistent -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -From: Bob Liu - -commit 7b0767502b5db11cb1f0daef2d01f6d71b1192dc upstream. - -We should consider info->feature_persistent when adding indirect page to list -info->indirect_pages, else the BUG_ON() in blkif_free() would be triggered. - -When we are using persistent grants the indirect_pages list -should always be empty because blkfront has pre-allocated enough -persistent pages to fill all requests on the ring. - -Acked-by: Roger Pau Monné -Signed-off-by: Bob Liu -Signed-off-by: Konrad Rzeszutek Wilk -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/block/xen-blkfront.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - ---- a/drivers/block/xen-blkfront.c -+++ b/drivers/block/xen-blkfront.c -@@ -1118,8 +1118,10 @@ static void blkif_completion(struct blk_ - * Add the used indirect page back to the list of - * available pages for indirect grefs. - */ -- indirect_page = pfn_to_page(s->indirect_grants[i]->pfn); -- list_add(&indirect_page->lru, &info->indirect_pages); -+ if (!info->feature_persistent) { -+ indirect_page = pfn_to_page(s->indirect_grants[i]->pfn); -+ list_add(&indirect_page->lru, &info->indirect_pages); -+ } - s->indirect_grants[i]->gref = GRANT_INVALID_REF; - list_add_tail(&s->indirect_grants[i]->node, &info->grants); - } diff --git a/kernel/kernel/files/patches/mageia/stable-xen-xenbus-don-t-leak-memory-when-unmapping-the-ring-on-hvm-backend.patch b/kernel/kernel/files/patches/mageia/stable-xen-xenbus-don-t-leak-memory-when-unmapping-the-ring-on-hvm-backend.patch deleted file mode 100644 index 68e0e3e1..00000000 --- a/kernel/kernel/files/patches/mageia/stable-xen-xenbus-don-t-leak-memory-when-unmapping-the-ring-on-hvm-backend.patch +++ /dev/null @@ -1,40 +0,0 @@ -From c22fe519e7e2b94ad173e0ea3b89c1a7d8be8d00 Mon Sep 17 00:00:00 2001 -From: Julien Grall -Date: Mon, 10 Aug 2015 19:10:38 +0100 -Subject: xen/xenbus: Don't leak memory when unmapping the ring on HVM backend - -From: Julien Grall - -commit c22fe519e7e2b94ad173e0ea3b89c1a7d8be8d00 upstream. - -The commit ccc9d90a9a8b5c4ad7e9708ec41f75ff9e98d61d "xenbus_client: -Extend interface to support multi-page ring" removes the call to -free_xenballooned_pages() in xenbus_unmap_ring_vfree_hvm(), leaking a -page for every shared ring. - -Only with backends running in HVM domains were affected. - -Signed-off-by: Julien Grall -Reviewed-by: Boris Ostrovsky -Reviewed-by: Wei Liu -Signed-off-by: David Vrabel -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/xen/xenbus/xenbus_client.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - ---- a/drivers/xen/xenbus/xenbus_client.c -+++ b/drivers/xen/xenbus/xenbus_client.c -@@ -814,8 +814,10 @@ static int xenbus_unmap_ring_vfree_hvm(s - - rv = xenbus_unmap_ring(dev, node->handles, node->nr_handles, - addrs); -- if (!rv) -+ if (!rv) { - vunmap(vaddr); -+ free_xenballooned_pages(node->nr_handles, node->hvm.pages); -+ } - else - WARN(1, "Leaking %p, size %u page(s)\n", vaddr, - node->nr_handles); diff --git a/kernel/kernel/files/patches/mageia/stable-xfs-fix-file-type-directory-corruption-for-btree-directories.patch b/kernel/kernel/files/patches/mageia/stable-xfs-fix-file-type-directory-corruption-for-btree-directories.patch new file mode 100644 index 00000000..1db4d92a --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-xfs-fix-file-type-directory-corruption-for-btree-directories.patch @@ -0,0 +1,65 @@ +From 037542345a82aaaa228ec280fe6ddff1568d169f Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Tue, 25 Aug 2015 10:05:13 +1000 +Subject: xfs: Fix file type directory corruption for btree directories + +From: Jan Kara + +commit 037542345a82aaaa228ec280fe6ddff1568d169f upstream. + +Users have occasionally reported that file type for some directory +entries is wrong. This mostly happened after updating libraries some +libraries. After some debugging the problem was traced down to +xfs_dir2_node_replace(). The function uses args->filetype as a file type +to store in the replaced directory entry however it also calls +xfs_da3_node_lookup_int() which will store file type of the current +directory entry in args->filetype. Thus we fail to change file type of a +directory entry to a proper type. + +Fix the problem by storing new file type in a local variable before +calling xfs_da3_node_lookup_int(). + +Reported-by: Giacomo Comes +Signed-off-by: Jan Kara +Reviewed-by: Dave Chinner +Signed-off-by: Dave Chinner +Signed-off-by: Greg Kroah-Hartman + +--- + fs/xfs/libxfs/xfs_dir2_node.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +--- a/fs/xfs/libxfs/xfs_dir2_node.c ++++ b/fs/xfs/libxfs/xfs_dir2_node.c +@@ -2132,6 +2132,7 @@ xfs_dir2_node_replace( + int error; /* error return value */ + int i; /* btree level */ + xfs_ino_t inum; /* new inode number */ ++ int ftype; /* new file type */ + xfs_dir2_leaf_t *leaf; /* leaf structure */ + xfs_dir2_leaf_entry_t *lep; /* leaf entry being changed */ + int rval; /* internal return value */ +@@ -2145,7 +2146,14 @@ xfs_dir2_node_replace( + state = xfs_da_state_alloc(); + state->args = args; + state->mp = args->dp->i_mount; ++ ++ /* ++ * We have to save new inode number and ftype since ++ * xfs_da3_node_lookup_int() is going to overwrite them ++ */ + inum = args->inumber; ++ ftype = args->filetype; ++ + /* + * Lookup the entry to change in the btree. + */ +@@ -2183,7 +2191,7 @@ xfs_dir2_node_replace( + * Fill in the new inode number and log the entry. + */ + dep->inumber = cpu_to_be64(inum); +- args->dp->d_ops->data_put_ftype(dep, args->filetype); ++ args->dp->d_ops->data_put_ftype(dep, ftype); + xfs_dir2_data_log_entry(args, state->extrablk.bp, dep); + rval = 0; + } diff --git a/kernel/kernel/files/patches/mageia/stable-xfs-fix-xfs_attr_leafblock-definition.patch b/kernel/kernel/files/patches/mageia/stable-xfs-fix-xfs_attr_leafblock-definition.patch new file mode 100644 index 00000000..f6edaf25 --- /dev/null +++ b/kernel/kernel/files/patches/mageia/stable-xfs-fix-xfs_attr_leafblock-definition.patch @@ -0,0 +1,47 @@ +From ffeecc5213024ae663377b442eedcfbacf6d0c5d Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Wed, 19 Aug 2015 10:34:32 +1000 +Subject: xfs: Fix xfs_attr_leafblock definition + +From: Jan Kara + +commit ffeecc5213024ae663377b442eedcfbacf6d0c5d upstream. + +struct xfs_attr_leafblock contains 'entries' array which is declared +with size 1 altough it can in fact contain much more entries. Since this +array is followed by further struct members, gcc (at least in version +4.8.3) thinks that the array has the fixed size of 1 element and thus +may optimize away all accesses beyond the end of array resulting in +non-working code. This problem was only observed with userspace code in +xfsprogs, however it's better to be safe in kernel as well and have +matching kernel and xfsprogs definitions. + +Signed-off-by: Jan Kara +Reviewed-by: Dave Chinner +Signed-off-by: Dave Chinner +Signed-off-by: Greg Kroah-Hartman + +--- + fs/xfs/libxfs/xfs_da_format.h | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +--- a/fs/xfs/libxfs/xfs_da_format.h ++++ b/fs/xfs/libxfs/xfs_da_format.h +@@ -680,8 +680,15 @@ typedef struct xfs_attr_leaf_name_remote + typedef struct xfs_attr_leafblock { + xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ + xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ +- xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ +- xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ ++ /* ++ * The rest of the block contains the following structures after the ++ * leaf entries, growing from the bottom up. The variables are never ++ * referenced and definining them can actually make gcc optimize away ++ * accesses to the 'entries' array above index 0 so don't do that. ++ * ++ * xfs_attr_leaf_name_local_t namelist; ++ * xfs_attr_leaf_name_remote_t valuelist; ++ */ + } xfs_attr_leafblock_t; + + /* diff --git a/kernel/kernel/files/patches/mageia/x86-apic-Fix-fallout-from-x2apic-cleanup.patch b/kernel/kernel/files/patches/mageia/x86-apic-Fix-fallout-from-x2apic-cleanup.patch deleted file mode 100644 index 6899f63a..00000000 --- a/kernel/kernel/files/patches/mageia/x86-apic-Fix-fallout-from-x2apic-cleanup.patch +++ /dev/null @@ -1,81 +0,0 @@ -From a57e456a7b28431b55e407e5ab78ebd5b378d19e Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sat, 22 Aug 2015 16:41:17 +0200 -Subject: [PATCH] x86/apic: Fix fallout from x2apic cleanup - -In the recent x2apic cleanup I got two things really wrong: -1) The safety check in __disable_x2apic which allows the function to - be called unconditionally is backwards. The check is there to - prevent access to the apic MSR in case that the machine has no - apic. Though right now it returns if the machine has an apic and - therefor the disabling of x2apic is never invoked. - -2) x2apic_disable() sets x2apic_mode to 0 after registering the local - apic. That's wrong, because register_lapic_address() checks x2apic - mode and therefor takes the wrong code path. - -This results in boot failures on machines with x2apic preenabled by -BIOS and can also lead to an fatal MSR access on machines without -apic. - -The solutions are simple: -1) Correct the sanity check for apic availability -2) Clear x2apic_mode _before_ calling register_lapic_address() - -Fixes: 659006bf3ae3 'x86/x2apic: Split enable and setup function' -Reported-and-tested-by: Javier Monteagudo -Signed-off-by: Thomas Gleixner -Link: https://bugzilla.redhat.com/show_bug.cgi?id=1224764 -Cc: stable@vger.kernel.org # 4.0+ -Cc: Laura Abbott -Cc: Jiang Liu -Cc: Joerg Roedel -Cc: Tony Luck -Cc: Borislav Petkov ---- - arch/x86/kernel/apic/apic.c | 14 +++++++------- - 1 file changed, 7 insertions(+), 7 deletions(-) - -diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c -index dcb5285..cde732c 100644 ---- a/arch/x86/kernel/apic/apic.c -+++ b/arch/x86/kernel/apic/apic.c -@@ -1424,7 +1424,7 @@ static inline void __x2apic_disable(void) - { - u64 msr; - -- if (cpu_has_apic) -+ if (!cpu_has_apic) - return; - - rdmsrl(MSR_IA32_APICBASE, msr); -@@ -1483,10 +1483,13 @@ void x2apic_setup(void) - - static __init void x2apic_disable(void) - { -- u32 x2apic_id; -+ u32 x2apic_id, state = x2apic_state; - -- if (x2apic_state != X2APIC_ON) -- goto out; -+ x2apic_mode = 0; -+ x2apic_state = X2APIC_DISABLED; -+ -+ if (state != X2APIC_ON) -+ return; - - x2apic_id = read_apic_id(); - if (x2apic_id >= 255) -@@ -1494,9 +1497,6 @@ static __init void x2apic_disable(void) - - __x2apic_disable(); - register_lapic_address(mp_lapic_addr); --out: -- x2apic_state = X2APIC_DISABLED; -- x2apic_mode = 0; - } - - static __init void x2apic_enable(void) --- -2.4.5 - diff --git a/kernel/kernel/files/patches/mageia/x86-idle-Restore-trace_cpu_idle-to-mwait_idle-calls.patch b/kernel/kernel/files/patches/mageia/x86-idle-Restore-trace_cpu_idle-to-mwait_idle-calls.patch deleted file mode 100644 index ee6f69f6..00000000 --- a/kernel/kernel/files/patches/mageia/x86-idle-Restore-trace_cpu_idle-to-mwait_idle-calls.patch +++ /dev/null @@ -1,46 +0,0 @@ -From e43d0189ac02415fe4487f79fc35e8f147e9ea0d Mon Sep 17 00:00:00 2001 -From: Jisheng Zhang -Date: Thu, 20 Aug 2015 12:54:39 +0800 -Subject: [PATCH] x86/idle: Restore trace_cpu_idle to mwait_idle() calls - -Commit b253149b843f ("sched/idle/x86: Restore mwait_idle() to fix boot -hangs, to improve power savings and to improve performance") restores -mwait_idle(), but the trace_cpu_idle related calls are missing. This -causes powertop on my old desktop powered by Intel Core2 E6550 to -report zero wakeups and zero events. - -Add them back to restore the proper behaviour. - -Fixes: b253149b843f ("sched/idle/x86: Restore mwait_idle() to ...") -Signed-off-by: Jisheng Zhang -Cc: -Cc: stable@vger.kernel.org # 4.1 -Link: http://lkml.kernel.org/r/1440046479-4262-1-git-send-email-jszhang@marvell.com -Signed-off-by: Thomas Gleixner ---- - arch/x86/kernel/process.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c -index 397688b..c27cad7 100644 ---- a/arch/x86/kernel/process.c -+++ b/arch/x86/kernel/process.c -@@ -408,6 +408,7 @@ static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c) - static void mwait_idle(void) - { - if (!current_set_polling_and_test()) { -+ trace_cpu_idle_rcuidle(1, smp_processor_id()); - if (this_cpu_has(X86_BUG_CLFLUSH_MONITOR)) { - smp_mb(); /* quirk */ - clflush((void *)¤t_thread_info()->flags); -@@ -419,6 +420,7 @@ static void mwait_idle(void) - __sti_mwait(0, 0); - else - local_irq_enable(); -+ trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id()); - } else { - local_irq_enable(); - } --- -2.4.5 - diff --git a/kernel/kernel/pspec.xml b/kernel/kernel/pspec.xml index babc173e..485dd269 100644 --- a/kernel/kernel/pspec.xml +++ b/kernel/kernel/pspec.xml @@ -1,4 +1,4 @@ -i + @@ -29,8 +29,8 @@ i - patches/linux/patch-4.1.6.xz - + patches/linux/patch-4.1.7.xz + patches/mageia/x86-pci-toshiba-equium-a60-assign-busses.patch patches/mageia/x86-boot-video-80x25-if-break.patch patches/mageia/x86-default_poweroff_up_machines.patch @@ -53,8 +53,6 @@ i patches/mageia/dm-raid-aliases.patch patches/mageia/block-floppy-disable-pnp-modalias.patch patches/mageia/ata-prefer-ata-drivers-over-ide-drivers-when-both-are-built.patch - patches/mageia/ata-revert-Disabling-the-async-PM-for-JMicron-chip-363-361.patch - patches/mageia/ata-jmicron-disable-broken-async_suspend.patch patches/mageia/block-Make-CFQ-default-to-IOPS-mode-on-SSDs.patch patches/mageia/block-cfq-iosched-fix-the-setting-of-IOPS-mode-on-SSDs.patch patches/mageia/fs-aufs4.patch @@ -124,16 +122,10 @@ i patches/mageia/3rd-rtl8723bs.patch patches/mageia/3rd-rtl8723bs-buildfix.patch patches/mageia/3rd-rtl8723bs-updates.patch - patches/mageia/Revert-sched-x86_64-Don-t-save-flags-on-context-swit.patch - patches/mageia/SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch - patches/mageia/ata-Revert-libata-eh-Set-information-field-for-autosense.patch - patches/mageia/ata-Revert-libata-Implement-support-for-sense-data-repor.patch - patches/mageia/ata-Revert-libata-Implement-NCQ-autosense.patch patches/mageia/fs-Revert-ext4-remove-block_device_ejected.patch - patches/mageia/gpu-drm-i915-remove-HBR2-from-chv-supported-list.patch - patches/mageia/gpu-drm-i915-Avoid-TP3-on-CHV.patch - patches/mageia/x86-apic-Fix-fallout-from-x2apic-cleanup.patch - patches/mageia/x86-idle-Restore-trace_cpu_idle-to-mwait_idle-calls.patch + patches/mageia/Input-evdev-do-not-report-errors-form-flush.patch + patches/mageia/scsi-Fix-NULL-pointer-dereference-in-RTPM-of-block-layer.patch + patches/mageia/scsi-Revert-SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch @@ -188,14 +180,14 @@ i - + 2015-09-05 4.1.6