5.10.65-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainerPATCH 150/236 usb: gadget: udc: s3c2410: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit ecff88e819e31081d41cd05bb199b9bd10e13e90 ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to request_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original error code. Stop calling request_irq() with the invalid IRQ #s.
--- drivers/usb/gadget/udc/s3c2410_udc.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/gadget/udc/s3c2410_udc.c +4 -0
@@ -1784,6 +1784,10 @@ static int s3c2410_udc_probe(struct platform_device *pdev)s3c2410_udc_reinit (udc); irq_usbd =platform_get_irq (pdev,0 ); +if (irq_usbd <0 ) { + retval = irq_usbd; + goto err_udc_clk; + }/* irq setup after old hardware state is cleaned up */ retval = request_irq(irq_usbd, s3c2410_udc_irq,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 151/236 usb: phy: fsl-usb: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit ecc2f30dbb25969908115c81ec23650ed982b004 ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to request_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original error code. Stop calling request_irq() with the invalid IRQ #s.
--- drivers/usb/phy/phy-fsl-usb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/phy/phy-fsl-usb.c +2 -0
@@ -873,6 +873,8 @@ int usb_otg_start(struct platform_device *pdev)/* request irq */ p_otg->irq =platform_get_irq (pdev,0 ); +if (p_otg->irq <0 ) +return p_otg->irq; status =request_irq (p_otg->irq, fsl_otg_isr,IRQF_SHARED , driver_name, p_otg);if (status) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 152/236 usb: phy: twl6030: add IRQ checks
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 0881e22c06e66af0b64773c91c8868ead3d01aa1 ]
The driver neglects to check the result of platform_get_irq()'s calls and blithely passes the negative error codes to request_threaded_irq() (which takes *unsigned* IRQ #), causing them both to fail with -EINVAL, overriding an original error code. Stop calling request_threaded_irq() with the invalid IRQ #s.
--- drivers/usb/phy/phy-twl6030-usb.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/phy/phy-twl6030-usb.c +5 -0
@@ -348,6 +348,11 @@ static int twl6030_usb_probe(struct platform_device *pdev) twl->irq2 =platform_get_irq (pdev,1 ); twl->linkstat =MUSB_UNKNOWN ; +if (twl->irq1 <0 ) +return twl->irq1; +if (twl->irq2 <0 ) +return twl->irq2; + twl->comparator.set_vbus = twl6030_set_vbus; twl->comparator.start_srp = twl6030_start_srp;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 153/236 usb: gadget: udc: renesas_usb3: Fix soc_device_match() abuse
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit cea45a3bd2dd4d9c35581328f571afd32b3c9f48 ]
soc_device_match() is intended as a last resort, to handle e.g. quirks that cannot be handled by matching based on a compatible value.
As the device nodes for the Renesas USB 3.0 Peripheral Controller on R-Car E3 and RZ/G2E do have SoC-specific compatible values, the latter can and should be used to match against these devices.
This also fixes support for the USB 3.0 Peripheral Controller on the R-Car E3e (R8A779M6) SoC, which is a different grading of the R-Car E3 (R8A77990) SoC, using the same SoC-specific compatible value.
--- drivers/usb/gadget/udc/renesas_usb3.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-)
drivers/usb/gadget/udc/renesas_usb3.c +7 -10
@@ -2707,10 +2707,15 @@ static const struct renesas_usb3_priv renesas_usb3_priv_r8a77990 = {static const struct of_device_id usb3_of_match[] = { { + .compatible ="renesas,r8a774c0-usb3-peri" , + .data = &renesas_usb3_priv_r8a77990, + }, { .compatible ="renesas,r8a7795-usb3-peri" , .data = &renesas_usb3_priv_gen3, - }, - { + }, { + .compatible ="renesas,r8a77990-usb3-peri" , + .data = &renesas_usb3_priv_r8a77990, + }, { .compatible ="renesas,rcar-gen3-usb3-peri" , .data = &renesas_usb3_priv_gen3, },
@@ -2719,18 +2724,10 @@ static const struct of_device_id usb3_of_match[] = {MODULE_DEVICE_TABLE (of, usb3_of_match);static const struct soc_device_attribute renesas_usb3_quirks_match[] = { - { - .soc_id ="r8a774c0" , - .data = &renesas_usb3_priv_r8a77990, - }, { .soc_id ="r8a7795" , .revision ="ES1.*" , .data = &renesas_usb3_priv_r8a7795_es1, }, - { - .soc_id ="r8a77990" , - .data = &renesas_usb3_priv_r8a77990, - }, {/* sentinel */ }, };
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 154/236 selftests/bpf: Fix test_core_autosize on big-endian machines
In reply to Greg Kroah-HartmanFrom: Ilya Leoshkevich <[email protected]>
[ Upstream commit d164dd9a5c08c16a883b3de97d13948c7be7fa4d ]
The "probed" part of test_core_autosize copies an integer using bpf_core_read() into an integer of a potentially different size. On big-endian machines a destination offset is required for this to produce a sensible result.
--- .../selftests/bpf/progs/test_core_autosize.c | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
tools/testing/selftests/bpf/progs/test_core_autosize.c +15 -5
@@ -125,6 +125,16 @@ int handle_downsize(void *ctx)return 0 ; } +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define bpf_core_read_int bpf_core_read +#else +#define bpf_core_read_int(dst, sz, src) ({ \ + /* Prevent "subtraction from stack pointer prohibited" */ \ + volatile long __off = sizeof(*dst) - (sz); \ + bpf_core_read((char *)(dst) + __off, sz, src); \ +}) +#endif + SEC("raw_tp/sys_enter")int handle_probed (void *ctx) {
@@ -132,23 +142,23 @@ int handle_probed(void *ctx)__u64 tmp; tmp =0 ; -bpf_core_read (&tmp,bpf_core_field_size (in->ptr), &in->ptr); +bpf_core_read_int (&tmp,bpf_core_field_size (in->ptr), &in->ptr); ptr_probed = tmp; tmp =0 ; -bpf_core_read (&tmp,bpf_core_field_size (in->val1), &in->val1); +bpf_core_read_int (&tmp,bpf_core_field_size (in->val1), &in->val1); val1_probed = tmp; tmp =0 ; -bpf_core_read (&tmp,bpf_core_field_size (in->val2), &in->val2); +bpf_core_read_int (&tmp,bpf_core_field_size (in->val2), &in->val2); val2_probed = tmp; tmp =0 ; -bpf_core_read (&tmp,bpf_core_field_size (in->val3), &in->val3); +bpf_core_read_int (&tmp,bpf_core_field_size (in->val3), &in->val3); val3_probed = tmp; tmp =0 ; -bpf_core_read (&tmp,bpf_core_field_size (in->val4), &in->val4); +bpf_core_read_int (&tmp,bpf_core_field_size (in->val4), &in->val4); val4_probed = tmp;return 0 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 155/236 devlink: Clear whole devlink_flash_notify struct
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
[ Upstream commit ed43fbac717882165a2a4bd64f7b1f56f7467bb7 ]
The { 0 } doesn't clear all fields in the struct, but tells to the compiler to set all fields to zero and doesn't touch any sub-fields if they exists.
The {} is an empty initialiser that instructs to fully initialize whole struct including sub-fields, which is error-prone for future devlink_flash_notify extensions.
--- net/core/devlink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/core/devlink.c +2 -2
@@ -3403,7 +3403,7 @@ out_free_msg:void devlink_flash_update_begin_notify (struct devlink *devlink) { -struct devlink_flash_notify params = {0 }; +struct devlink_flash_notify params = {}; __devlink_flash_update_notify(devlink, DEVLINK_CMD_FLASH_UPDATE,
@@ -3413,7 +3413,7 @@ EXPORT_SYMBOL_GPL(devlink_flash_update_begin_notify);void devlink_flash_update_end_notify (struct devlink *devlink) { -struct devlink_flash_notify params = {0 }; +struct devlink_flash_notify params = {}; __devlink_flash_update_notify(devlink, DEVLINK_CMD_FLASH_UPDATE_END,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 156/236 samples: pktgen: add missing IPv6 option to pktgen scripts
In reply to Greg Kroah-HartmanFrom: Juhee Kang <[email protected]>
[ Upstream commit 0f0c4f1b72e090b23131700bb155944cc28b2a7b ]
Currently, "sample04" and "sample05" are not working properly when running with an IPv6 option("-6"). The commit 0f06a6787e05 ("samples:
Add an IPv6 "-6" option to the pktgen scripts") has omitted the addition of this option at "sample04" and "sample05".
In order to support IPv6 option, this commit adds logic related to IPv6 option.
--- samples/pktgen/pktgen_sample04_many_flows.sh | 12 +++++++----- samples/pktgen/pktgen_sample05_flow_per_thread.sh | 12 +++++++----- 2 files changed, 14 insertions(+), 10 deletions(-)
samples/pktgen/pktgen_sample04_many_flows.sh +7 -5
@@ -13,13 +13,15 @@ root_check_run_with_sudo "$@" # Parameter parsing via include source ${basedir}/parameters.sh # Set some default params, if they didn't get set -[ -z "$DEST_IP" ] && DEST_IP="198.18.0.42" +if [ -z "$DEST_IP" ]; then + [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1" +fi [ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff" [ -z "$CLONE_SKB" ] && CLONE_SKB="0" [ -z "$COUNT" ] && COUNT="0" # Zero means indefinitely if [ -n "$DEST_IP" ]; then - validate_addr $DEST_IP - read -r DST_MIN DST_MAX <<< $(parse_addr $DEST_IP) + validate_addr${IP6} $DEST_IP + read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP) fi if [ -n "$DST_PORT" ]; then read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT)
@@ -65,8 +67,8 @@ for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do # Single destination pg_set $dev "dst_mac $DST_MAC" - pg_set $dev "dst_min $DST_MIN" - pg_set $dev "dst_max $DST_MAX" + pg_set $dev "dst${IP6}_min $DST_MIN" + pg_set $dev "dst${IP6}_max $DST_MAX" if [ -n "$DST_PORT" ]; then # Single destination port or random port range
samples/pktgen/pktgen_sample05_flow_per_thread.sh +7 -5
@@ -17,14 +17,16 @@ root_check_run_with_sudo "$@" # Parameter parsing via include source ${basedir}/parameters.sh # Set some default params, if they didn't get set -[ -z "$DEST_IP" ] && DEST_IP="198.18.0.42" +if [ -z "$DEST_IP" ]; then + [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1" +fi [ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff" [ -z "$CLONE_SKB" ] && CLONE_SKB="0" [ -z "$BURST" ] && BURST=32 [ -z "$COUNT" ] && COUNT="0" # Zero means indefinitely if [ -n "$DEST_IP" ]; then - validate_addr $DEST_IP - read -r DST_MIN DST_MAX <<< $(parse_addr $DEST_IP) + validate_addr${IP6} $DEST_IP + read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP) fi if [ -n "$DST_PORT" ]; then read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT)
@@ -55,8 +57,8 @@ for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do # Single destination pg_set $dev "dst_mac $DST_MAC" - pg_set $dev "dst_min $DST_MIN" - pg_set $dev "dst_max $DST_MAX" + pg_set $dev "dst${IP6}_min $DST_MIN" + pg_set $dev "dst${IP6}_max $DST_MAX" if [ -n "$DST_PORT" ]; then # Single destination port or random port range
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 157/236 Bluetooth: Move shutdown callback before flushing tx and rx queue
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
[ Upstream commit 0ea53674d07fb6db2dd7a7ec2fdc85a12eb246c2 ]
Commit 0ea9fd001a14 ("Bluetooth: Shutdown controller after workqueues are flushed or cancelled") introduced a regression that makes mtkbtsdio driver stops working:
[ 36.593956] Bluetooth: hci0: Firmware already downloaded [ 46.814613] Bluetooth: hci0: Execution of wmt command timed out [ 46.814619] Bluetooth: hci0: Failed to send wmt func ctrl (-110)
The shutdown callback depends on the result of hdev->rx_work, so we should call it before flushing rx_work:
-> btmtksdio_shutdown()
-> mtk_hci_wmt_sync()
-> __hci_cmd_send()
-> wait for BTMTKSDIO_TX_WAIT_VND_EVT gets cleared
-> btmtksdio_recv_event()
-> hci_recv_frame()
-> queue_work(hdev->workqueue, &hdev->rx_work)
-> clears BTMTKSDIO_TX_WAIT_VND_EVT
So move the shutdown callback before flushing TX/RX queue to resolve the issue.
--- net/bluetooth/hci_core.c | 8 ++++++++ 1 file changed, 8 insertions(+)
net/bluetooth/hci_core.c +8 -0
@@ -1726,6 +1726,14 @@ int hci_dev_do_close(struct hci_dev *hdev)hci_request_cancel_all (hdev);hci_req_sync_lock (hdev); +if (!hci_dev_test_flag (hdev,HCI_UNREGISTER ) && + !hci_dev_test_flag (hdev,HCI_USER_CHANNEL ) && +test_bit (HCI_UP , &hdev->flags)) { +/* Execute vendor specific shutdown routine */ +if (hdev->shutdown) + hdev->shutdown (hdev); + } +if (!test_and_clear_bit (HCI_UP , &hdev->flags)) {cancel_delayed_work_sync (&hdev->cmd_timer);hci_req_sync_unlock (hdev);
Signature · 1 line
2.30.2
Re: [PATCH 5.10 157/236] Bluetooth: Move shutdown callback before flushing tx and rx queue
Hi!
Quoted 1 line
[ Upstream commit
0ea53674d07fb6db2dd7a7ec2fdc85a12eb246c2]
Upstream commit is okay...
Quoted 2 lines
So move the shutdown callback before flushing TX/RX queue to resolve the issue.
...but something went wrong in stable. This is not moving code, this is duplicating it:
Quoted 7 lines
net/bluetooth/hci_core.c +1
-0@@ -1726,6 +1726,14 @@ int hci_dev_do_close(struct hci_dev *hdev)hci_request_cancel_all (hdev);hci_req_sync_lock (hdev); + if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
net/bluetooth/hci_core.c int hci_dev_do_close(struct hci_dev *hdev) · line 1739
Quoted 10 lines
net/bluetooth/hci_core.c +7
-0+ !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && + test_bit(HCI_UP, &hdev->flags)) { +/* Execute vendor specific shutdown routine */ +if (hdev->shutdown) + hdev->shutdown (hdev); + } +if (!test_and_clear_bit (HCI_UP , &hdev->flags)) {cancel_delayed_work_sync (&hdev->cmd_timer);hci_req_sync_unlock (hdev);
And yes, we end up with 2 copies in 5.10.
Best regards,
Pavel
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Re: [PATCH 5.10 157/236] Bluetooth: Move shutdown callback before flushing tx and rx queue
Quoted 18 lines · Pavel Machek
Hi!
Quoted 1 line
[ Upstream commit
0ea53674d07fb6db2dd7a7ec2fdc85a12eb246c2]Upstream commit is okay...
Quoted 2 lines
So move the shutdown callback before flushing TX/RX queue to resolve the issue.
...but something went wrong in stable. This is not moving code, this is duplicating it:
Quoted 6 lines
net/bluetooth/hci_core.c +0
-0@@ -1726,6 +1726,14 @@ int hci_dev_do_close(struct hci_dev *hdev)hci_request_cancel_all (hdev);hci_req_sync_lock (hdev);
Quoted 14 lines
net/bluetooth/hci_core.c int hci_dev_do_close(struct hci_dev *hdev) · line 1739
Quoted 11 lines
net/bluetooth/hci_core.c +8
-0+if (!hci_dev_test_flag (hdev,HCI_UNREGISTER ) && + !hci_dev_test_flag (hdev,HCI_USER_CHANNEL ) && +test_bit (HCI_UP , &hdev->flags)) { +/* Execute vendor specific shutdown routine */ +if (hdev->shutdown) + hdev->shutdown (hdev); + } +if (!test_and_clear_bit (HCI_UP , &hdev->flags)) {cancel_delayed_work_sync (&hdev->cmd_timer);hci_req_sync_unlock (hdev);And yes, we end up with 2 copies in 5.10.
Same problem in v5.4.y, unfortunately.
Guenter
Quoted 5 lines
Best regards,
Pavel
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Sasha Levin
maintainerRe: [PATCH 5.10 157/236] Bluetooth: Move shutdown callback before flushing tx and rx queue
Quoted 34 lines · Guenter Roeck
Quoted 18 lines · Pavel Machek
Hi!
Quoted 1 line
[ Upstream commit
0ea53674d07fb6db2dd7a7ec2fdc85a12eb246c2]Upstream commit is okay...
Quoted 2 lines
So move the shutdown callback before flushing TX/RX queue to resolve the issue.
...but something went wrong in stable. This is not moving code, this is duplicating it:
Quoted 6 lines
net/bluetooth/hci_core.c +0
-0@@ -1726,6 +1726,14 @@ int hci_dev_do_close(struct hci_dev *hdev)hci_request_cancel_all (hdev);hci_req_sync_lock (hdev);Quoted 14 lines
net/bluetooth/hci_core.c int hci_dev_do_close(struct hci_dev *hdev) · line 1739
Quoted 11 lines
net/bluetooth/hci_core.c +8
-0+if (!hci_dev_test_flag (hdev,HCI_UNREGISTER ) && + !hci_dev_test_flag (hdev,HCI_USER_CHANNEL ) && +test_bit (HCI_UP , &hdev->flags)) { +/* Execute vendor specific shutdown routine */ +if (hdev->shutdown) + hdev->shutdown (hdev); + } +if (!test_and_clear_bit (HCI_UP , &hdev->flags)) {cancel_delayed_work_sync (&hdev->cmd_timer);hci_req_sync_unlock (hdev);And yes, we end up with 2 copies in 5.10.
Quoted 1 line
Same problem in v5.4.y, unfortunately.
Ugh, odd - it wasn't manually backported :/
I'll drop it.
Signature · 2 lines
Thanks, Sasha
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 157/236] Bluetooth: Move shutdown callback before flushing tx and rx queue
Quoted 35 lines · Sasha Levin
Quoted 34 lines · Guenter Roeck
Quoted 32 lines · Pavel Machek
Hi!
Quoted 1 line
[ Upstream commit
0ea53674d07fb6db2dd7a7ec2fdc85a12eb246c2]Upstream commit is okay...
Quoted 2 lines
So move the shutdown callback before flushing TX/RX queue to resolve the issue.
...but something went wrong in stable. This is not moving code, this is duplicating it:
Quoted 7 lines
net/bluetooth/hci_core.c +1
-0@@ -1726,6 +1726,14 @@ int hci_dev_do_close(struct hci_dev *hdev)hci_request_cancel_all (hdev);hci_req_sync_lock (hdev); + if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&net/bluetooth/hci_core.c int hci_dev_do_close(struct hci_dev *hdev) · line 1739
Quoted 10 lines
net/bluetooth/hci_core.c +7
-0+ !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && + test_bit(HCI_UP, &hdev->flags)) { +/* Execute vendor specific shutdown routine */ +if (hdev->shutdown) + hdev->shutdown (hdev); + } +if (!test_and_clear_bit (HCI_UP , &hdev->flags)) {cancel_delayed_work_sync (&hdev->cmd_timer);hci_req_sync_unlock (hdev);And yes, we end up with 2 copies in 5.10.
Quoted 5 lines
Quoted 1 line
Same problem in v5.4.y, unfortunately.
Ugh, odd - it wasn't manually backported :/
I'll drop it.
Also now dropped from 5.13.y.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 158/236 PM: cpu: Make notifier chain use a raw_spinlock_t
In reply to Greg Kroah-HartmanFrom: Valentin Schneider <[email protected]>
[ Upstream commit b2f6662ac08d0e7c25574ce53623c71bdae9dd78 ]
Invoking atomic_notifier_chain_notify() requires acquiring a spinlock_t, which can block under CONFIG_PREEMPT_RT. Notifications for members of the cpu_pm notification chain will be issued by the idle task, which can never block.
Making *all* atomic_notifiers use a raw_spinlock is too big of a hammer, as only notifications issued by the idle task are problematic.
Special-case cpu_pm_notifier_chain by kludging a raw_notifier and raw_spinlock_t together, matching the atomic_notifier behavior with a raw_spinlock_t.
--- kernel/cpu_pm.c | 50 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-)
kernel/cpu_pm.c +38 -12
@@ -13,19 +13,32 @@#include <linux/spinlock.h> #include <linux/syscore_ops.h> -static ATOMIC_NOTIFIER_HEAD (cpu_pm_notifier_chain); +/* +* atomic_notifiers use a spinlock_t, which can block under PREEMPT_RT. +* Notifications for cpu_pm will be issued by the idle task itself, which can +* never block, IOW it requires using a raw_spinlock_t. +*/ +static struct { +struct raw_notifier_head chain; +raw_spinlock_t lock; +} cpu_pm_notifier = { + .chain =RAW_NOTIFIER_INIT (cpu_pm_notifier.chain), + .lock =__RAW_SPIN_LOCK_UNLOCKED (cpu_pm_notifier.lock), +};static int cpu_pm_notify (enum cpu_pm_event event) {int ret;/* -* atomic_notifier_call_chain has a RCU read critical section, which -* could be disfunctional in cpu idle. Copy RCU_NONIDLE code to let -* RCU know this. +* This introduces a RCU read critical section, which could be +* disfunctional in cpu idle. Copy RCU_NONIDLE code to let RCU know +* this. */ rcu_irq_enter_irqson (); - ret =atomic_notifier_call_chain (&cpu_pm_notifier_chain, event,NULL ); +rcu_read_lock (); + ret =raw_notifier_call_chain (&cpu_pm_notifier.chain, event,NULL ); +rcu_read_unlock ();rcu_irq_exit_irqson ();return notifier_to_errno (ret);
@@ -33,10 +46,13 @@ static int cpu_pm_notify(enum cpu_pm_event event)static int cpu_pm_notify_robust (enum cpu_pm_event event_up,enum cpu_pm_event event_down) { +unsigned long flags;int ret;rcu_irq_enter_irqson (); - ret =atomic_notifier_call_chain_robust (&cpu_pm_notifier_chain, event_up, event_down,NULL ); +raw_spin_lock_irqsave (&cpu_pm_notifier.lock, flags); + ret =raw_notifier_call_chain_robust (&cpu_pm_notifier.chain, event_up, event_down,NULL ); +raw_spin_unlock_irqrestore (&cpu_pm_notifier.lock, flags);rcu_irq_exit_irqson ();return notifier_to_errno (ret);
@@ -49,12 +65,17 @@ static int cpu_pm_notify_robust(enum cpu_pm_event event_up, enum cpu_pm_event ev* Add a driver to a list of drivers that are notified about * CPU and CPU cluster low power entry and exit. * -* This function may sleep, and has the same return conditions as -* raw_notifier_chain_register. +* This function has the same return conditions as raw_notifier_chain_register. */ int cpu_pm_register_notifier (struct notifier_block *nb) { -return atomic_notifier_chain_register (&cpu_pm_notifier_chain, nb); +unsigned long flags; +int ret; + +raw_spin_lock_irqsave (&cpu_pm_notifier.lock, flags); + ret =raw_notifier_chain_register (&cpu_pm_notifier.chain, nb); +raw_spin_unlock_irqrestore (&cpu_pm_notifier.lock, flags); +return ret; }EXPORT_SYMBOL_GPL (cpu_pm_register_notifier);
@@ -64,12 +85,17 @@ EXPORT_SYMBOL_GPL(cpu_pm_register_notifier);* * Remove a driver from the CPU PM notifier list. * -* This function may sleep, and has the same return conditions as -* raw_notifier_chain_unregister. +* This function has the same return conditions as raw_notifier_chain_unregister. */ int cpu_pm_unregister_notifier (struct notifier_block *nb) { -return atomic_notifier_chain_unregister (&cpu_pm_notifier_chain, nb); +unsigned long flags; +int ret; + +raw_spin_lock_irqsave (&cpu_pm_notifier.lock, flags); + ret =raw_notifier_chain_unregister (&cpu_pm_notifier.chain, nb); +raw_spin_unlock_irqrestore (&cpu_pm_notifier.lock, flags); +return ret; }EXPORT_SYMBOL_GPL (cpu_pm_unregister_notifier);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 159/236 usb: host: ohci-tmio: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 4ac5132e8a4300637a2da8f5d6bc7650db735b8a ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to usb_add_hcd() (which takes *unsigned* IRQ #), causing request_irq() that it calls to fail with -EINVAL, overriding an original error code. Stop calling usb_add_hcd() with the invalid IRQ #s.
--- drivers/usb/host/ohci-tmio.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/host/ohci-tmio.c +3 -0
@@ -202,6 +202,9 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev)if (!cell)return -EINVAL ; +if (irq <0 ) +return irq; + hcd =usb_create_hcd (&ohci_tmio_hc_driver, &dev->dev,dev_name (&dev->dev));if (!hcd) { ret = -ENOMEM ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 160/236 usb: phy: tahvo: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 0d45a1373e669880b8beaecc8765f44cb0241e47 ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to request_threaded_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original error code. Stop calling request_threaded_irq() with the invalid IRQ #s.
--- drivers/usb/phy/phy-tahvo.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/phy/phy-tahvo.c +3 -1
@@ -393,7 +393,9 @@ static int tahvo_usb_probe(struct platform_device *pdev)dev_set_drvdata (&pdev->dev, tu); - tu->irq =platform_get_irq (pdev,0 ); + tu->irq = ret =platform_get_irq (pdev,0 ); +if (ret <0 ) +return ret; ret =request_threaded_irq (tu->irq,NULL , tahvo_usb_vbus_interrupt,IRQF_ONESHOT ,"tahvo-vbus" , tu);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 161/236 libbpf: Re-build libbpf.so when libbpf.map changes
In reply to Greg Kroah-HartmanFrom: Andrii Nakryiko <[email protected]>
[ Upstream commit 61c7aa5020e98ac2fdcf07d07eec1baf2e9f0a08 ]
Ensure libbpf.so is re-built whenever libbpf.map is modified. Without this, changes to libbpf.map are not detected and versioned symbols mismatch error will be reported until make clean && make is used, which is a suboptimal developer experience.
--- tools/lib/bpf/Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
tools/lib/bpf/Makefile +5 -5
@@ -4,8 +4,9 @@ RM ?= rm srctree = $(abs_srctree) +VERSION_SCRIPT := libbpf.map LIBBPF_VERSION := $(shell \ - grep -oE '^LIBBPF_([0-9.]+)' libbpf.map | \ + grep -oE '^LIBBPF_([0-9.]+)' $(VERSION_SCRIPT) | \ sort -rV | head -n1 | cut -d'_' -f2) LIBBPF_MAJOR_VERSION := $(firstword $(subst ., ,$(LIBBPF_VERSION)))
@@ -131,7 +132,6 @@ SHARED_OBJDIR := $(OUTPUT)sharedobjs/ STATIC_OBJDIR := $(OUTPUT)staticobjs/ BPF_IN_SHARED := $(SHARED_OBJDIR)libbpf-in.o BPF_IN_STATIC := $(STATIC_OBJDIR)libbpf-in.o -VERSION_SCRIPT := libbpf.map BPF_HELPER_DEFS := $(OUTPUT)bpf_helper_defs.h LIB_TARGET := $(addprefix $(OUTPUT),$(LIB_TARGET))
@@ -184,10 +184,10 @@ $(BPF_HELPER_DEFS): $(srctree)/tools/include/uapi/linux/bpf.h $(OUTPUT)libbpf.so: $(OUTPUT)libbpf.so.$(LIBBPF_VERSION) -$(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN_SHARED) +$(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN_SHARED) $(VERSION_SCRIPT) $(QUIET_LINK)$(CC) $(LDFLAGS) \ --shared -Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \ - -Wl,--version-script=$(VERSION_SCRIPT) $^ -lelf -lz -o $@ + -Wl,--version-script=$(VERSION_SCRIPT) $< -lelf -lz -o $@ @ln -sf $(@F) $(OUTPUT)libbpf.so @ln -sf $(@F) $(OUTPUT)libbpf.so.$(LIBBPF_MAJOR_VERSION)
@@ -202,7 +202,7 @@ $(OUTPUT)libbpf.pc: check: check_abi -check_abi: $(OUTPUT)libbpf.so +check_abi: $(OUTPUT)libbpf.so $(VERSION_SCRIPT) @if [ "$(GLOBAL_SYM_COUNT)" != "$(VERSIONED_SYM_COUNT)" ]; then \ echo "Warning: Num of global symbols in $(BPF_IN_SHARED)" \ "($(GLOBAL_SYM_COUNT)) does NOT match with num of" \
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 162/236 mac80211: Fix insufficient headroom issue for AMSDU
In reply to Greg Kroah-HartmanFrom: Chih-Kang Chang <[email protected]>
[ Upstream commit f50d2ff8f016b79a2ff4acd5943a1eda40c545d4 ]
ieee80211_amsdu_realloc_pad() fails to account for extra_tx_headroom, the original reserved headroom might be eaten. Add the necessary extra_tx_headroom.
--- net/mac80211/tx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/mac80211/tx.c +3 -1
@@ -3229,7 +3229,9 @@ static bool ieee80211_amsdu_prepare_head(struct ieee80211_sub_if_data *sdata,if (info->control.flags &IEEE80211_TX_CTRL_AMSDU )return true; -if (!ieee80211_amsdu_realloc_pad (local, skb,sizeof (*amsdu_hdr))) +if (!ieee80211_amsdu_realloc_pad (local, skb, +sizeof (*amsdu_hdr) + + local->hw.extra_tx_headroom))return false; data =skb_push (skb,sizeof (*amsdu_hdr));
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 163/236 locking/lockdep: Mark local_lock_t
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
[ Upstream commit dfd5e3f5fe27bda91d5cc028c86ffbb7a0614489 ]
The local_lock_t's are special, because they cannot form IRQ inversions, make sure we can tell them apart from the rest of the locks.
--- include/linux/local_lock_internal.h | 5 ++++- include/linux/lockdep.h | 15 ++++++++++++--- include/linux/lockdep_types.h | 18 ++++++++++++++---- kernel/locking/lockdep.c | 16 +++++++++------- 4 files changed, 39 insertions(+), 15 deletions(-)
include/linux/local_lock_internal.h +4 -1
@@ -18,6 +18,7 @@ typedef struct { .dep_map = { \ .name = #lockname, \ .wait_type_inner = LD_WAIT_CONFIG, \ + .lock_type = LD_LOCK_PERCPU, \ }#else # define LL_DEP_MAP_INIT (lockname)
@@ -30,7 +31,9 @@ do { \static struct lock_class_key __key; \ \debug_check_no_locks_freed ((void *)lock,sizeof (*lock));\ - lockdep_init_map_wait(&(lock)->dep_map, #lock, &__key, 0, LD_WAIT_CONFIG);\ + lockdep_init_map_type(&(lock)->dep_map, #lock, &__key, 0, \ + LD_WAIT_CONFIG, LD_WAIT_INV, \ + LD_LOCK_PERCPU); \ } while (0)#ifdef CONFIG_DEBUG_LOCK_ALLOC
include/linux/lockdep.h +12 -3
@@ -185,12 +185,19 @@ extern void lockdep_unregister_key(struct lock_class_key *key);* to lockdep: */ -extern void lockdep_init_map_waits (struct lockdep_map *lock,const char *name, -struct lock_class_key *key,int subclass,short inner,short outer); +extern void lockdep_init_map_type (struct lockdep_map *lock,const char *name, +struct lock_class_key *key,int subclass,u8 inner,u8 outer,u8 lock_type); + +static inline void +lockdep_init_map_waits (struct lockdep_map *lock,const char *name, +struct lock_class_key *key,int subclass,u8 inner,u8 outer) +{ +lockdep_init_map_type (lock, name, key, subclass, inner,LD_WAIT_INV ,LD_LOCK_NORMAL ); +}static inline void lockdep_init_map_wait (struct lockdep_map *lock,const char *name, -struct lock_class_key *key,int subclass,short inner) +struct lock_class_key *key,int subclass,u8 inner) {lockdep_init_map_waits (lock, name, key, subclass, inner,LD_WAIT_INV ); }
@@ -340,6 +347,8 @@ static inline void lockdep_set_selftest_task(struct task_struct *task)# define lock_set_class (l, n, k, s, i) do { } while (0)# define lock_set_subclass (l, s, i) do { } while (0)# define lockdep_init () do { } while (0) +# define lockdep_init_map_type (lock, name, key, sub, inner, outer, type) \ + do { (void)(name); (void)(key); } while (0)# define lockdep_init_map_waits (lock, name, key, sub, inner, outer) \ do { (void)(name); (void)(key); } while (0)# define lockdep_init_map_wait (lock, name, key, sub, inner) \
include/linux/lockdep_types.h +14 -4
@@ -30,6 +30,12 @@ enum lockdep_wait_type { LD_WAIT_MAX, /* must be last */ }; +enum lockdep_lock_type { +LD_LOCK_NORMAL =0 ,/* normal, catch all */ +LD_LOCK_PERCPU ,/* percpu */ +LD_LOCK_MAX , +}; +#ifdef CONFIG_LOCKDEP /*
@@ -119,8 +125,10 @@ struct lock_class {int name_version;const char *name; -short wait_type_inner; -short wait_type_outer; +u8 wait_type_inner; +u8 wait_type_outer; +u8 lock_type; +/* u8 hole; */ #ifdef CONFIG_LOCK_STAT unsigned long contention_point[LOCKSTAT_POINTS ];
@@ -169,8 +177,10 @@ struct lockdep_map {struct lock_class_key *key;struct lock_class *class_cache[NR_LOCKDEP_CACHING_CLASSES ];const char *name; -short wait_type_outer;/* can be taken in this context */ -short wait_type_inner;/* presents this context */ +u8 wait_type_outer;/* can be taken in this context */ +u8 wait_type_inner;/* presents this context */ +u8 lock_type; +/* u8 hole; */ #ifdef CONFIG_LOCK_STAT int cpu;unsigned long ip;
kernel/locking/lockdep.c +9 -7
@@ -1293,6 +1293,7 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force) class->name_version =count_matching_names (class); class->wait_type_inner = lock->wait_type_inner; class->wait_type_outer = lock->wait_type_outer; + class->lock_type = lock->lock_type;/* * We use RCU's safe list-add method to make * parallel walking of the hash-list safe:
@@ -4621,9 +4622,9 @@ print_lock_invalid_wait_context(struct task_struct *curr,*/ static int check_wait_context (struct task_struct *curr,struct held_lock *next) { -short next_inner =hlock_class (next)->wait_type_inner; -short next_outer =hlock_class (next)->wait_type_outer; -short curr_inner; +u8 next_inner =hlock_class (next)->wait_type_inner; +u8 next_outer =hlock_class (next)->wait_type_outer; +u8 curr_inner;int depth;if (!next_inner || next->trylock)
@@ -4646,7 +4647,7 @@ static int check_wait_context(struct task_struct *curr, struct held_lock *next)for (; depth < curr->lockdep_depth; depth++) {struct held_lock *prev = curr->held_locks + depth; -short prev_inner =hlock_class (prev)->wait_type_inner; +u8 prev_inner =hlock_class (prev)->wait_type_inner;if (prev_inner) {/*
@@ -4695,9 +4696,9 @@ static inline int check_wait_context(struct task_struct *curr,/* * Initialize a lock instance's lock-class mapping info: */ -void lockdep_init_map_waits (struct lockdep_map *lock,const char *name, +void lockdep_init_map_type (struct lockdep_map *lock,const char *name,struct lock_class_key *key,int subclass, -short inner,short outer) +u8 inner,u8 outer,u8 lock_type) {int i;
@@ -4720,6 +4721,7 @@ void lockdep_init_map_waits(struct lockdep_map *lock, const char *name, lock->wait_type_outer = outer; lock->wait_type_inner = inner; + lock->lock_type = lock_type;/* * No key, no joy, we need to hash something.
@@ -4754,7 +4756,7 @@ void lockdep_init_map_waits(struct lockdep_map *lock, const char *name,raw_local_irq_restore (flags); } } -EXPORT_SYMBOL_GPL (lockdep_init_map_waits); +EXPORT_SYMBOL_GPL (lockdep_init_map_type);struct lock_class_key __lockdep_no_validate__;EXPORT_SYMBOL_GPL (__lockdep_no_validate__);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 164/236 locking/local_lock: Add missing owner initialization
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit d8bbd97ad0b99a9394f2cd8410b884c48e218cf0 ]
If CONFIG_DEBUG_LOCK_ALLOC=y is enabled then local_lock_t has an 'owner' member which is checked for consistency, but nothing initialized it to zero explicitly.
The static initializer does so implicit, and the run time allocated per CPU storage is usually zero initialized as well, but relying on that is not really good practice.
--- include/linux/local_lock_internal.h | 42 ++++++++++++++++------------- 1 file changed, 23 insertions(+), 19 deletions(-)
include/linux/local_lock_internal.h +23 -19
@@ -14,29 +14,14 @@ typedef struct { } local_lock_t;#ifdef CONFIG_DEBUG_LOCK_ALLOC -# define LL_DEP_MAP_INIT (lockname) \ +# define LOCAL_LOCK_DEBUG_INIT (lockname) \ .dep_map = { \ .name = #lockname, \ .wait_type_inner = LD_WAIT_CONFIG, \ - .lock_type = LD_LOCK_PERCPU, \ - } -#else -# define LL_DEP_MAP_INIT (lockname) -#endif - -#define INIT_LOCAL_LOCK (lockname) { LL_DEP_MAP_INIT(lockname) } - -#define __local_lock_init (lock) \ -do { \ - static struct lock_class_key __key; \ - \ - debug_check_no_locks_freed((void *)lock, sizeof(*lock));\ - lockdep_init_map_type(&(lock)->dep_map, #lock, &__key, 0, \ - LD_WAIT_CONFIG, LD_WAIT_INV, \ - LD_LOCK_PERCPU); \ -} while (0) + .lock_type = LD_LOCK_PERCPU, \ + }, \ + .owner = NULL, -#ifdef CONFIG_DEBUG_LOCK_ALLOC static inline void local_lock_acquire (local_lock_t *l) {lock_map_acquire (&l->dep_map);
@@ -51,11 +36,30 @@ static inline void local_lock_release(local_lock_t *l)lock_map_release (&l->dep_map); } +static inline void local_lock_debug_init (local_lock_t *l) +{ + l->owner =NULL ; +}#else /* CONFIG_DEBUG_LOCK_ALLOC */ +# define LOCAL_LOCK_DEBUG_INIT (lockname)static inline void local_lock_acquire (local_lock_t *l) { }static inline void local_lock_release (local_lock_t *l) { } +static inline void local_lock_debug_init (local_lock_t *l) { }#endif /* !CONFIG_DEBUG_LOCK_ALLOC */ +#define INIT_LOCAL_LOCK (lockname) { LOCAL_LOCK_DEBUG_INIT(lockname) } + +#define __local_lock_init (lock) \ +do { \ + static struct lock_class_key __key; \ + \ + debug_check_no_locks_freed((void *)lock, sizeof(*lock));\ + lockdep_init_map_type(&(lock)->dep_map, #lock, &__key, \ + 0, LD_WAIT_CONFIG, LD_WAIT_INV, \ + LD_LOCK_PERCPU); \ + local_lock_debug_init(lock); \ +} while (0) +#define __local_lock (lock) \ do { \ preempt_disable(); \
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 165/236 lockd: Fix invalid lockowner cast after vfs_test_lock
In reply to Greg Kroah-HartmanFrom: Benjamin Coddington <[email protected]>
[ Upstream commit cd2d644ddba183ec7b451b7c20d5c7cc06fcf0d7 ]
After calling vfs_test_lock() the pointer to a conflicting lock can be returned, and that lock is not guarunteed to be owned by nlm. In that case, we cannot cast it to struct nlm_lockowner. Instead return the pid of that conflicting lock.
--- fs/lockd/svclock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/lockd/svclock.c +1 -1
@@ -634,7 +634,7 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file, conflock->caller ="somehost" ;/* FIXME */ conflock->len =strlen (conflock->caller); conflock->oh.len =0 ;/* don't return OH info */ - conflock->svid = ((struct nlm_lockowner *)lock->fl.fl_owner)->pid; + conflock->svid = lock->fl.fl_pid; conflock->fl.fl_type = lock->fl.fl_type; conflock->fl.fl_start = lock->fl.fl_start; conflock->fl.fl_end = lock->fl.fl_end;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 166/236 nfsd4: Fix forced-expiry locking
In reply to Greg Kroah-HartmanFrom: J. Bruce Fields <[email protected]>
[ Upstream commit f7104cc1a9159cd0d3e8526cb638ae0301de4b61 ]
This should use the network-namespace-wide client_lock, not the per-client cl_lock.
You shouldn't see any bugs unless you're actually using the forced-expiry interface introduced by 89c905beccbb.
--- fs/nfsd/nfs4state.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/nfsd/nfs4state.c +2 -2
@@ -2646,9 +2646,9 @@ static void force_expire_client(struct nfs4_client *clp)struct nfsd_net *nn =net_generic (clp->net, nfsd_net_id);bool already_expired; -spin_lock (&clp->cl_lock); +spin_lock (&nn->client_lock); clp->cl_time =0 ; -spin_unlock (&clp->cl_lock); +spin_unlock (&nn->client_lock);wait_event (expiry_wq,atomic_read (&clp->cl_rpc_users) ==0 );spin_lock (&nn->client_lock);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 167/236 arm64: dts: marvell: armada-37xx: Extend PCIe MEM space
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
[ Upstream commit 514ef1e62d6521c2199d192b1c71b79d2aa21d5a ]
Current PCIe MEM space of size 16 MB is not enough for some combination of PCIe cards (e.g. NVMe disk together with ath11k wifi card). ARM Trusted Firmware for Armada 3700 platform already assigns 128 MB for PCIe window, so extend PCIe MEM space to the end of 128 MB PCIe window which allows to allocate more PCIe BARs for more PCIe cards.
Without this change some combination of PCIe cards cannot be used and kernel show error messages in dmesg during initialization:
pci 0000:00:00.0: BAR 8: no space for [mem size 0x01800000]
pci 0000:00:00.0: BAR 8: failed to assign [mem size 0x01800000]
pci 0000:00:00.0: BAR 6: assigned [mem 0xe8000000-0xe80007ff pref]
pci 0000:01:00.0: BAR 8: no space for [mem size 0x01800000]
pci 0000:01:00.0: BAR 8: failed to assign [mem size 0x01800000]
pci 0000:02:03.0: BAR 8: no space for [mem size 0x01000000]
pci 0000:02:03.0: BAR 8: failed to assign [mem size 0x01000000]
pci 0000:02:07.0: BAR 8: no space for [mem size 0x00100000]
pci 0000:02:07.0: BAR 8: failed to assign [mem size 0x00100000]
pci 0000:03:00.0: BAR 0: no space for [mem size 0x01000000 64bit]
pci 0000:03:00.0: BAR 0: failed to assign [mem size 0x01000000 64bit]Due to bugs in U-Boot port for Turris Mox, the second range in Turris Mox kernel DTS file for PCIe must start at 16 MB offset. Otherwise U-Boot crashes during loading of kernel DTB file. This bug is present only in U-Boot code for Turris Mox and therefore other Armada 3700 devices are not affected by this bug. Bug is fixed in U-Boot version 2021.07.
To not break booting new kernels on existing versions of U-Boot on Turris Mox, use first 16 MB range for IO and second range with rest of PCIe window for MEM.
--- .../boot/dts/marvell/armada-3720-turris-mox.dts | 17 +++++++++++++++++ arch/arm64/boot/dts/marvell/armada-37xx.dtsi | 11 +++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts +17 -0
@@ -134,6 +134,23 @@ pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>; status = "okay"; reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>; + /* + * U-Boot port for Turris Mox has a bug which always expects that "ranges" DT property + * contains exactly 2 ranges with 3 (child) address cells, 2 (parent) address cells and + * 2 size cells and also expects that the second range starts at 16 MB offset. If these + * conditions are not met then U-Boot crashes during loading kernel DTB file. PCIe address + * space is 128 MB long, so the best split between MEM and IO is to use fixed 16 MB window + * for IO and the rest 112 MB (64+32+16) for MEM, despite that maximal IO size is just 64 kB. + * This bug is not present in U-Boot ports for other Armada 3700 devices and is fixed in + * U-Boot version 2021.07. See relevant U-Boot commits (the last one contains fix): + * https://source.denx.de/u-boot/u-boot/-/commit/cb2ddb291ee6fcbddd6d8f4ff49089dfe580f5d7 + * https://source.denx.de/u-boot/u-boot/-/commit/c64ac3b3185aeb3846297ad7391fc6df8ecd73bf + * https://source.denx.de/u-boot/u-boot/-/commit/4a82fca8e330157081fc132a591ebd99ba02ee33 + */ + #address-cells = <3>; + #size-cells = <2>; + ranges = <0x81000000 0 0xe8000000 0 0xe8000000 0 0x01000000 /* Port 0 IO */ + 0x82000000 0 0xe9000000 0 0xe9000000 0 0x07000000>; /* Port 0 MEM */ /* enabled by U-Boot if PCIe module is present */ status = "disabled";
arch/arm64/boot/dts/marvell/armada-37xx.dtsi +9 -2
@@ -487,8 +487,15 @@ #interrupt-cells = <1>; msi-parent = <&pcie0>; msi-controller; - ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x1000000 /* Port 0 MEM */ - 0x81000000 0 0xe9000000 0 0xe9000000 0 0x10000>; /* Port 0 IO*/ + /* + * The 128 MiB address range [0xe8000000-0xf0000000] is + * dedicated for PCIe and can be assigned to 8 windows + * with size a power of two. Use one 64 KiB window for + * IO at the end and the remaining seven windows + * (totaling 127 MiB) for MEM. + */ + ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x07f00000 /* Port 0 MEM */ + 0x81000000 0 0xefff0000 0 0xefff0000 0 0x00010000>; /* Port 0 IO */ interrupt-map-mask = <0 0 0 7>; interrupt-map = <0 0 0 1 &pcie_intc 0>, <0 0 0 2 &pcie_intc 1>,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 168/236 clk: staging: correct reference to config IOMEM to config HAS_IOMEM
In reply to Greg Kroah-HartmanFrom: Lukas Bulwahn <[email protected]>
[ Upstream commit cbfa6f33e3a685c329d78e06b0cf1dcb23c9d849 ]
Commit 0a0a66c984b3 ("clk: staging: Specify IOMEM dependency for Xilinx Clocking Wizard driver") introduces a dependency on the non-existing config IOMEM, which basically makes it impossible to include this driver into any build. Fortunately, ./scripts/checkkconfigsymbols.py warns:
IOMEM
Referencing files: drivers/staging/clocking-wizard/Kconfig
The config for IOMEM support is called HAS_IOMEM. Correct this reference to the intended config.
--- drivers/staging/clocking-wizard/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/clocking-wizard/Kconfig +1 -1
@@ -5,6 +5,6 @@ config COMMON_CLK_XLNX_CLKWZRD tristate "Xilinx Clocking Wizard" - depends on COMMON_CLK && OF && IOMEM + depends on COMMON_CLK && OF && HAS_IOMEM help Support for the Xilinx Clocking Wizard IP core clock generator.
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 169/236 i2c: synquacer: fix deferred probing
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 8d744da241b81f4211f4813b0d3c1981326fa9ca ]
The driver overrides the error codes returned by platform_get_irq() to -ENODEV, so if it returns -EPROBE_DEFER, the driver will fail the probe permanently instead of the deferred probing. Switch to propagating the error codes upstream.
--- drivers/i2c/busses/i2c-synquacer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-synquacer.c +1 -1
@@ -578,7 +578,7 @@ static int synquacer_i2c_probe(struct platform_device *pdev) i2c->irq =platform_get_irq (pdev,0 );if (i2c->irq <0 ) -return -ENODEV ; +return i2c->irq; ret =devm_request_irq (&pdev->dev, i2c->irq, synquacer_i2c_isr,0 ,dev_name (&pdev->dev), i2c);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 170/236 firmware: raspberrypi: Keep count of all consumers
In reply to Greg Kroah-HartmanFrom: Nicolas Saenz Julienne <[email protected]>
[ Upstream commit 1e7c57355a3bc617fc220234889e49fe722a6305 ]
When unbinding the firmware device we need to make sure it has no consumers left. Otherwise we'd leave them with a firmware handle pointing at freed memory.
Keep a reference count of all consumers and introduce rpi_firmware_put() which will permit automatically decrease the reference count upon unbinding consumer drivers.
--- drivers/firmware/raspberrypi.c | 40 ++++++++++++++++++++-- include/soc/bcm2835/raspberrypi-firmware.h | 2 ++ 2 files changed, 39 insertions(+), 3 deletions(-)
drivers/firmware/raspberrypi.c +37 -3
@@ -7,6 +7,7 @@*/ #include <linux/dma-mapping.h> +#include <linux/kref.h> #include <linux/mailbox_client.h> #include <linux/module.h> #include <linux/of_platform.h>
@@ -27,6 +28,8 @@ struct rpi_firmware {struct mbox_chan *chan;/* The property channel. */ struct completion c;u32 enabled; + +struct kref consumers; };static DEFINE_MUTEX (transaction_lock);
@@ -225,12 +228,31 @@ static void rpi_register_clk_driver(struct device *dev) -1, NULL, 0); } +static void rpi_firmware_delete (struct kref *kref) +{ + struct rpi_firmware *fw = container_of(kref, struct rpi_firmware, + consumers); + +mbox_free_channel (fw->chan); +kfree (fw); +} + +void rpi_firmware_put (struct rpi_firmware *fw) +{ +kref_put (&fw->consumers, rpi_firmware_delete); +} +EXPORT_SYMBOL_GPL (rpi_firmware_put); +static int rpi_firmware_probe (struct platform_device *pdev) {struct device *dev = &pdev->dev;struct rpi_firmware *fw; - fw =devm_kzalloc (dev,sizeof (*fw),GFP_KERNEL ); +/* +* Memory will be freed by rpi_firmware_delete() once all users have +* released their firmware handles. Don't use devm_kzalloc() here. +*/ + fw =kzalloc (sizeof (*fw),GFP_KERNEL );if (!fw)return -ENOMEM ;
@@ -247,6 +269,7 @@ static int rpi_firmware_probe(struct platform_device *pdev) }init_completion (&fw->c); +kref_init (&fw->consumers);platform_set_drvdata (pdev, fw);
@@ -275,7 +298,8 @@ static int rpi_firmware_remove(struct platform_device *pdev) rpi_hwmon =NULL ;platform_device_unregister (rpi_clk); rpi_clk =NULL ; -mbox_free_channel (fw->chan); + +rpi_firmware_put (fw);return 0 ; }
@@ -284,16 +308,26 @@ static int rpi_firmware_remove(struct platform_device *pdev)* rpi_firmware_get - Get pointer to rpi_firmware structure. * @firmware_node: Pointer to the firmware Device Tree node. * +* The reference to rpi_firmware has to be released with rpi_firmware_put(). +* * Returns NULL is the firmware device is not ready. */ struct rpi_firmware *rpi_firmware_get (struct device_node *firmware_node) {struct platform_device *pdev =of_find_device_by_node (firmware_node); +struct rpi_firmware *fw;if (!pdev)return NULL ; -return platform_get_drvdata (pdev); + fw =platform_get_drvdata (pdev); +if (!fw) +return NULL ; + +if (!kref_get_unless_zero (&fw->consumers)) +return NULL ; + +return fw; }EXPORT_SYMBOL_GPL (rpi_firmware_get);
include/soc/bcm2835/raspberrypi-firmware.h +2 -0
@@ -140,6 +140,7 @@ int rpi_firmware_property(struct rpi_firmware *fw, u32 tag, void *data, size_t len);int rpi_firmware_property_list (struct rpi_firmware *fw,void *data,size_t tag_size); +void rpi_firmware_put (struct rpi_firmware *fw);struct rpi_firmware *rpi_firmware_get (struct device_node *firmware_node);#else static inline int rpi_firmware_property(struct rpi_firmware *fw, u32 tag,
@@ -154,6 +155,7 @@ static inline int rpi_firmware_property_list(struct rpi_firmware *fw,return -ENOSYS ; } +static inline void rpi_firmware_put (struct rpi_firmware *fw) { }static inline struct rpi_firmware *rpi_firmware_get (struct device_node *firmware_node) {return NULL ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 171/236 firmware: raspberrypi: Fix a leak in rpi_firmware_get()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 09cbd1df7d2615c19e40facbe31fdcb5f1ebfa96 ]
The reference taken by 'of_find_device_by_node()' must be released when not needed anymore.
Add the corresponding 'put_device()' in the normal and error handling paths.
--- drivers/firmware/raspberrypi.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/firmware/raspberrypi.c +8 -2
@@ -322,12 +322,18 @@ struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node) fw =platform_get_drvdata (pdev);if (!fw) -return NULL ; + goto err_put_device;if (!kref_get_unless_zero (&fw->consumers)) -return NULL ; + goto err_put_device; + +put_device (&pdev->dev);return fw; + +err_put_device: +put_device (&pdev->dev); +return NULL ; }EXPORT_SYMBOL_GPL (rpi_firmware_get);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 172/236 usb: gadget: mv_u3d: request_irq() after initializing UDC
In reply to Greg Kroah-HartmanFrom: Nadezda Lutovinova <[email protected]>
[ Upstream commit 2af0c5ffadaf9d13eca28409d4238b4e672942d3 ]
If IRQ occurs between calling request_irq() and mv_u3d_eps_init(), then null pointer dereference occurs since u3d->eps[] wasn't initialized yet but used in mv_u3d_nuke().
The patch puts registration of the interrupt handler after initializing of neccesery data.
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/usb/gadget/udc/mv_u3d_core.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
drivers/usb/gadget/udc/mv_u3d_core.c +10 -9
@@ -1921,14 +1921,6 @@ static int mv_u3d_probe(struct platform_device *dev) goto err_get_irq; } u3d->irq = r->start; -if (request_irq (u3d->irq, mv_u3d_irq, -IRQF_SHARED , driver_name, u3d)) { - u3d->irq =0 ; -dev_err (&dev->dev,"Request irq %d for u3d failed\n" , - u3d->irq); - retval = -ENODEV ; - goto err_request_irq; - }/* initialize gadget structure */ u3d->gadget.ops = &mv_u3d_ops;/* usb_gadget_ops */
@@ -1941,6 +1933,15 @@ static int mv_u3d_probe(struct platform_device *dev)mv_u3d_eps_init (u3d); +if (request_irq (u3d->irq, mv_u3d_irq, +IRQF_SHARED , driver_name, u3d)) { + u3d->irq =0 ; +dev_err (&dev->dev,"Request irq %d for u3d failed\n" , + u3d->irq); + retval = -ENODEV ; + goto err_request_irq; + } +/* external vbus detection */ if (u3d->vbus) { u3d->clock_gating =1 ;
@@ -1964,8 +1965,8 @@ static int mv_u3d_probe(struct platform_device *dev) err_unregister:free_irq (u3d->irq, u3d); -err_request_irq: err_get_irq: +err_request_irq:kfree (u3d->status_req); err_alloc_status_req:kfree (u3d->eps);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 173/236 mm/swap: consider max pages in iomap_swapfile_add_extent
In reply to Greg Kroah-HartmanFrom: Xu Yu <[email protected]>
[ Upstream commit 36ca7943ac18aebf8aad4c50829eb2ea5ec847df ]
When the max pages (last_page in the swap header + 1) is smaller than the total pages (inode size) of the swapfile, iomap_swapfile_activate overwrites sis->max with total pages.
However, frontswap_map is a swap page state bitmap allocated using the initial sis->max page count read from the swap header. If swapfile activation increases sis->max, it's possible for the frontswap code to walk off the end of the bitmap, thereby corrupting kernel memory.
[djwong: modify the description a bit; the original paragraph reads:
"However, frontswap_map is allocated using max pages. When test and clear the sis offset, which is larger than max pages, of frontswap_map in __frontswap_invalidate_page(), neighbors of frontswap_map may be overwritten, i.e., slab is polluted."
Note also that this bug resulted in a behavioral change: activating a swap file that was formatted and later extended results in all pages being activated, not the number of pages recorded in the swap header.]
This fixes the issue by considering the limitation of max pages of swap info in iomap_swapfile_add_extent().
To reproduce the case, compile kernel with slub RED ZONE, then run test:
$ sudo stress-ng -a 1 -x softlockup,resources -t 72h --metrics --times \ --verify -v -Y /root/tmpdir/stress-ng/stress-statistic-12.yaml \ --log-file /root/tmpdir/stress-ng/stress-logfile-12.txt \ --temp-path /root/tmpdir/stress-ng/
We'll get the error log as below:
[ 1151.015141] ============================================================================= [ 1151.016489] BUG kmalloc-16 (Not tainted): Right Redzone overwritten [ 1151.017486] ----------------------------------------------------------------------------- [ 1151.017486] [ 1151.018997] Disabling lock debugging due to kernel taint [ 1151.019873] INFO: 0x0000000084e43932-0x0000000098d17cae @offset=7392. First byte 0x0 instead of 0xcc [ 1151.021303] INFO: Allocated in __do_sys_swapon+0xcf6/0x1170 age=43417 cpu=9 pid=3816 [ 1151.022538] __slab_alloc+0xe/0x20 [ 1151.023069] __kmalloc_node+0xfd/0x4b0 [ 1151.023704] __do_sys_swapon+0xcf6/0x1170 [ 1151.024346] do_syscall_64+0x33/0x40 [ 1151.024925] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 1151.025749] INFO: Freed in put_cred_rcu+0xa1/0xc0 age=43424 cpu=3 pid=2041 [ 1151.026889] kfree+0x276/0x2b0 [ 1151.027405] put_cred_rcu+0xa1/0xc0 [ 1151.027949] rcu_do_batch+0x17d/0x410 [ 1151.028566] rcu_core+0x14e/0x2b0 [ 1151.029084] __do_softirq+0x101/0x29e [ 1151.029645] asm_call_irq_on_stack+0x12/0x20 [ 1151.030381] do_softirq_own_stack+0x37/0x40 [ 1151.031037] do_softirq.part.15+0x2b/0x30 [ 1151.031710] __local_bh_enable_ip+0x4b/0x50 [ 1151.032412] copy_fpstate_to_sigframe+0x111/0x360 [ 1151.033197] __setup_rt_frame+0xce/0x480 [ 1151.033809] arch_do_signal+0x1a3/0x250 [ 1151.034463] exit_to_user_mode_prepare+0xcf/0x110 [ 1151.035242] syscall_exit_to_user_mode+0x27/0x190 [ 1151.035970] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 1151.036795] INFO: Slab 0x000000003b9de4dc objects=44 used=9 fp=0x00000000539e349e flags=0xfffffc0010201 [ 1151.038323] INFO: Object 0x000000004855ba01 @offset=7376 fp=0x0000000000000000 [ 1151.038323] [ 1151.039683] Redzone 000000008d0afd3d: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc ................ [ 1151.041180] Object 000000004855ba01: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [ 1151.042714] Redzone 0000000084e43932: 00 00 00 c0 cc cc cc cc ........ [ 1151.044120] Padding 000000000864c042: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZZZZZZZZZ [ 1151.045615] CPU: 5 PID: 3816 Comm: stress-ng Tainted: G B 5.10.50+ #7 [ 1151.046846] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014 [ 1151.048633] Call Trace: [ 1151.049072] dump_stack+0x57/0x6a [ 1151.049585] check_bytes_and_report+0xed/0x110 [ 1151.050320] check_object+0x1eb/0x290 [ 1151.050924] ? __x64_sys_swapoff+0x39a/0x540 [ 1151.051646] free_debug_processing+0x151/0x350 [ 1151.052333] __slab_free+0x21a/0x3a0 [ 1151.052938] ? _cond_resched+0x2d/0x40 [ 1151.053529] ? __vunmap+0x1de/0x220 [ 1151.054139] ? __x64_sys_swapoff+0x39a/0x540 [ 1151.054796] ? kfree+0x276/0x2b0 [ 1151.055307] kfree+0x276/0x2b0 [ 1151.055832] __x64_sys_swapoff+0x39a/0x540 [ 1151.056466] do_syscall_64+0x33/0x40 [ 1151.057084] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 1151.057866] RIP: 0033:0x150340b0ffb7 [ 1151.058481] Code: Unable to access opcode bytes at RIP 0x150340b0ff8d. [ 1151.059537] RSP: 002b:00007fff7f4ee238 EFLAGS: 00000246 ORIG_RAX: 00000000000000a8 [ 1151.060768] RAX: ffffffffffffffda RBX: 00007fff7f4ee66c RCX: 0000150340b0ffb7 [ 1151.061904] RDX: 000000000000000a RSI: 0000000000018094 RDI: 00007fff7f4ee860 [ 1151.063033] RBP: 00007fff7f4ef980 R08: 0000000000000000 R09: 0000150340a672bd [ 1151.064135] R10: 00007fff7f4edca0 R11: 0000000000000246 R12: 0000000000018094 [ 1151.065253] R13: 0000000000000005 R14: 000000000160d930 R15: 00007fff7f4ee66c [ 1151.066413] FIX kmalloc-16: Restoring 0x0000000084e43932-0x0000000098d17cae=0xcc [ 1151.066413] [ 1151.067890] FIX kmalloc-16: Object at 0x000000004855ba01 not freed
--- fs/iomap/swapfile.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/iomap/swapfile.c +6 -0
@@ -30,11 +30,16 @@ static int iomap_swapfile_add_extent(struct iomap_swapfile_info *isi) {struct iomap *iomap = &isi->iomap;unsigned long nr_pages; +unsigned long max_pages;uint64_t first_ppage;uint64_t first_ppage_reported;uint64_t next_ppage;int error; +if (unlikely (isi->nr_pages >= isi->sis->max)) +return 0 ; + max_pages = isi->sis->max - isi->nr_pages; +/* * Round the start up and the end down so that the physical * extent aligns to a page boundary.
@@ -47,6 +52,7 @@ static int iomap_swapfile_add_extent(struct iomap_swapfile_info *isi)if (first_ppage >= next_ppage)return 0 ; nr_pages = next_ppage - first_ppage; + nr_pages =min (nr_pages, max_pages);/* * Calculate how much swap space we're adding; the first page contains
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 174/236 lkdtm: replace SCSI_DISPATCH_CMD with SCSI_QUEUE_RQ
In reply to Greg Kroah-HartmanFrom: Kevin Mitchell <[email protected]>
[ Upstream commit d1f278da6b11585f05b2755adfc8851cbf14a1ec ]
When scsi_dispatch_cmd was moved to scsi_lib.c and made static, some compilers (i.e., at least gcc 8.4.0) decided to compile this inline. This is a problem for lkdtm.ko, which inserted a kprobe on this function for the SCSI_DISPATCH_CMD crashpoint.
Move this crashpoint one function up the call chain to scsi_queue_rq. Though this is also a static function, it should never be inlined because it is assigned as a structure entry. Therefore, kprobe_register should always be able to find it.
--- Documentation/fault-injection/provoke-crashes.rst | 2 +- drivers/misc/lkdtm/core.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
Documentation/fault-injection/provoke-crashes.rst +1 -1
@@ -29,7 +29,7 @@ recur_count cpoint_name Where in the kernel to trigger the action. It can be one of INT_HARDWARE_ENTRY, INT_HW_IRQ_EN, INT_TASKLET_ENTRY, - FS_DEVRW, MEM_SWAPOUT, TIMERADD, SCSI_DISPATCH_CMD, + FS_DEVRW, MEM_SWAPOUT, TIMERADD, SCSI_QUEUE_RQ, IDE_CORE_CP, or DIRECT cpoint_type
drivers/misc/lkdtm/core.c +1 -1
@@ -81,7 +81,7 @@ static struct crashpoint crashpoints[] = {CRASHPOINT ("FS_DEVRW" ,"ll_rw_block" ),CRASHPOINT ("MEM_SWAPOUT" ,"shrink_inactive_list" ),CRASHPOINT ("TIMERADD" ,"hrtimer_start" ), -CRASHPOINT ("SCSI_DISPATCH_CMD" ,"scsi_dispatch_cmd" ), +CRASHPOINT ("SCSI_QUEUE_RQ" ,"scsi_queue_rq" ), CRASHPOINT("IDE_CORE_CP", "generic_ide_ioctl"), #endif };
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 175/236 Bluetooth: add timeout sanity check to hci_inquiry
In reply to Greg Kroah-HartmanFrom: Pavel Skripkin <[email protected]>
[ Upstream commit f41a4b2b5eb7872109723dab8ae1603bdd9d9ec1 ]
Syzbot hit "task hung" bug in hci_req_sync(). The problem was in unreasonable huge inquiry timeout passed from userspace. Fix it by adding sanity check for timeout value to hci_inquiry().
Since hci_inquiry() is the only user of hci_req_sync() with user controlled timeout value, it makes sense to check timeout value in hci_inquiry() and don't touch hci_req_sync().
--- net/bluetooth/hci_core.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/bluetooth/hci_core.c +6 -0
@@ -1336,6 +1336,12 @@ int hci_inquiry(void __user *arg) goto done; } +/* Restrict maximum inquiry length to 60 seconds */ +if (ir.length >60 ) { + err = -EINVAL ; + goto done; + } +hci_dev_lock (hdev);if (inquiry_cache_age (hdev) >INQUIRY_CACHE_AGE_MAX ||inquiry_cache_empty (hdev) || ir.flags &IREQ_CACHE_FLUSH ) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 176/236 i2c: iop3xx: fix deferred probing
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit a1299505162ad00def3573260c2c68b9c8e8d697 ]
When adding the code to handle platform_get_irq*() errors in the commit 489447380a29 ("handle errors returned by platform_get_irq*()"), the actual error code was enforced to be -ENXIO in the driver for some strange reason. This didn't matter much until the deferred probing was introduced -- which requires an actual error code to be propagated upstream from the failure site.
While fixing this, also stop overriding the errors from request_irq() to -EIO (done since the pre-git era).
--- drivers/i2c/busses/i2c-iop3xx.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/i2c/busses/i2c-iop3xx.c +2 -4
@@ -467,16 +467,14 @@ iop3xx_i2c_probe(struct platform_device *pdev) irq =platform_get_irq (pdev,0 );if (irq <0 ) { - ret = -ENXIO ; + ret = irq; goto unmap; } ret =request_irq (irq, iop3xx_i2c_irq_handler,0 , pdev->name, adapter_data); -if (ret) { - ret = -EIO ; +if (ret) goto unmap; - }memcpy (new_adapter->name, pdev->name,strlen (pdev->name)); new_adapter->owner =THIS_MODULE ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 177/236 i2c: s3c2410: fix IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit d6840a5e370b7ea4fde16ce2caf431bcc87f9a75 ]
Iff platform_get_irq() returns 0, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision...
--- drivers/i2c/busses/i2c-s3c2410.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-s3c2410.c +1 -1
@@ -1140,7 +1140,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)*/ if (!(i2c->quirks &QUIRK_POLL )) { i2c->irq = ret =platform_get_irq (pdev,0 ); -if (ret <=0 ) { +if (ret <0 ) {dev_err (&pdev->dev,"cannot find IRQ\n" );clk_unprepare (i2c->clk);return ret;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 178/236 i2c: fix platform_get_irq.cocci warnings
In reply to Greg Kroah-HartmanFrom: Tian Tao <[email protected]>
[ Upstream commit 2478b9c1dcc9aa84cfd71ed7b5ca2a2c0ede75b7 ]
Remove dev_err() messages after platform_get_irq*() failures. drivers/i2c/busses/i2c-hix5hd2.c:417:2-9: line 417 is redundant because platform_get_irq() already prints an error
--- drivers/i2c/busses/i2c-hix5hd2.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/i2c/busses/i2c-hix5hd2.c +1 -3
@@ -413,10 +413,8 @@ static int hix5hd2_i2c_probe(struct platform_device *pdev)return PTR_ERR (priv->regs); irq =platform_get_irq (pdev,0 ); -if (irq <=0 ) { -dev_err (&pdev->dev,"cannot find HS-I2C IRQ\n" ); +if (irq <=0 )return irq; - } priv->clk =devm_clk_get (&pdev->dev,NULL );if (IS_ERR (priv->clk)) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 179/236 i2c: hix5hd2: fix IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit f9b459c2ba5edfe247e86b45ad5dea8da542f3ea ]
Iff platform_get_irq() returns 0, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision...
--- drivers/i2c/busses/i2c-hix5hd2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-hix5hd2.c +1 -1
@@ -413,7 +413,7 @@ static int hix5hd2_i2c_probe(struct platform_device *pdev)return PTR_ERR (priv->regs); irq =platform_get_irq (pdev,0 ); -if (irq <=0 ) +if (irq <0 )return irq; priv->clk =devm_clk_get (&pdev->dev,NULL );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 180/236 gfs2: init system threads before freeze lock
In reply to Greg Kroah-HartmanFrom: Bob Peterson <[email protected]>
[ Upstream commit a28dc123fa66ba7f3eca7cffc4b01d96bfd35c27 ]
Patch 96b1454f2e ("gfs2: move freeze glock outside the make_fs_rw and _ro functions") changed the gfs2 mount sequence so that it holds the freeze lock before calling gfs2_make_fs_rw. Before this patch, gfs2_make_fs_rw called init_threads to initialize the quotad and logd threads. That is a problem if the system needs to withdraw due to IO errors early in the mount sequence, for example, while initializing the system statfs inode:
1. An IO error causes the statfs glock to not sync properly after recovery, and leaves items on the ail list.
2. The leftover items on the ail list causes its do_xmote call to fail, which makes it want to withdraw. But since the glock code cannot withdraw (because the withdraw sequence uses glocks) it relies upon the logd daemon to initiate the withdraw.
3. The withdraw can never be performed by the logd daemon because all this takes place before the logd daemon is started.
This patch moves function init_threads from super.c to ops_fstype.c and it changes gfs2_fill_super to start its threads before holding the freeze lock, and if there's an error, stop its threads after releasing it. This allows the logd to run unblocked by the freeze lock. Thus, the logd daemon can perform its withdraw sequence properly.
--- fs/gfs2/ops_fstype.c | 42 ++++++++++++++++++++++++++++++ fs/gfs2/super.c | 61 +++++--------------------------------------- 2 files changed, 48 insertions(+), 55 deletions(-)
fs/gfs2/ops_fstype.c +42 -0
@@ -1072,6 +1072,34 @@ void gfs2_online_uevent(struct gfs2_sbd *sdp)kobject_uevent_env (&sdp->sd_kobj,KOBJ_ONLINE , envp); } +static int init_threads (struct gfs2_sbd *sdp) +{ +struct task_struct *p; +int error =0 ; + + p =kthread_run (gfs2_logd, sdp,"gfs2_logd" ); +if (IS_ERR (p)) { + error =PTR_ERR (p); +fs_err (sdp,"can't start logd thread: %d\n" , error); +return error; + } + sdp->sd_logd_process = p; + + p =kthread_run (gfs2_quotad, sdp,"gfs2_quotad" ); +if (IS_ERR (p)) { + error =PTR_ERR (p); +fs_err (sdp,"can't start quotad thread: %d\n" , error); + goto fail; + } + sdp->sd_quotad_process = p; +return 0 ; + +fail: +kthread_stop (sdp->sd_logd_process); + sdp->sd_logd_process =NULL ; +return error; +} +/** * gfs2_fill_super - Read in superblock * @sb: The VFS superblock
@@ -1198,6 +1226,14 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc) goto fail_per_node; } +if (!sb_rdonly (sb)) { + error =init_threads (sdp); +if (error) { +gfs2_withdraw_delayed (sdp); + goto fail_per_node; + } + } + error =gfs2_freeze_lock (sdp, &freeze_gh,0 );if (error) goto fail_per_node;
@@ -1207,6 +1243,12 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc)gfs2_freeze_unlock (&freeze_gh);if (error) { +if (sdp->sd_quotad_process) +kthread_stop (sdp->sd_quotad_process); + sdp->sd_quotad_process =NULL ; +if (sdp->sd_logd_process) +kthread_stop (sdp->sd_logd_process); + sdp->sd_logd_process =NULL ;fs_err (sdp,"can't make FS RW: %d\n" , error); goto fail_per_node; }
fs/gfs2/super.c +6 -55
86 lines not on this page · raw message
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 181/236 rsi: fix error code in rsi_load_9116_firmware()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit d0f8430332a16c7baa80ce2886339182c5d85f37 ]
This code returns success if the kmemdup() fails, but obviously it should return -ENOMEM instead.
--- drivers/net/wireless/rsi/rsi_91x_hal.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/rsi/rsi_91x_hal.c +3 -1
@@ -1038,8 +1038,10 @@ static int rsi_load_9116_firmware(struct rsi_hw *adapter) } ta_firmware =kmemdup (fw_entry->data, fw_entry->size,GFP_KERNEL ); -if (!ta_firmware) +if (!ta_firmware) { + status = -ENOMEM ; goto fail_release_fw; + } fw_p = ta_firmware; instructions_sz = fw_entry->size;rsi_dbg (INFO_ZONE ,"FW Length = %d bytes\n" , instructions_sz);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 182/236 rsi: fix an error code in rsi_probe()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 9adcdf6758d7c4c9bdaf22d78eb9fcae260ed113 ]
Return -ENODEV instead of success for unsupported devices.
--- drivers/net/wireless/rsi/rsi_91x_usb.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/rsi/rsi_91x_usb.c +1 -0
@@ -814,6 +814,7 @@ static int rsi_probe(struct usb_interface *pfunction, }else {rsi_dbg (ERR_ZONE ,"%s: Unsupported RSI device id 0x%x\n" , __func__, id->idProduct); + status = -ENODEV ; goto err1; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 183/236 ASoC: Intel: kbl_da7219_max98927: Fix format selection for max98373
In reply to Greg Kroah-HartmanFrom: Cezary Rojewski <[email protected]>
[ Upstream commit 6d41bbf2fd3615c56dbf2b67f6cbf9e83d14a2e2 ]
Contrary to what is said in board's file, topology targeting kbl_da7219_max98373 expects format 16b, not 24/32b. Partially revert changes added in 'ASoC: Intel: Boards: Add Maxim98373 support' to bring old behavior back, aligning with topology expectations.
--- sound/soc/intel/boards/kbl_da7219_max98927.c | 55 +++----------------- 1 file changed, 7 insertions(+), 48 deletions(-)
sound/soc/intel/boards/kbl_da7219_max98927.c +7 -48
@@ -197,7 +197,7 @@ static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream, }if (!strcmp (codec_dai->component->name,MAX98373_DEV0_NAME )) { ret =snd_soc_dai_set_tdm_slot (codec_dai, -0x03 ,3 ,8 ,24 ); +0x30 ,3 ,8 ,16 );if (ret <0 ) {dev_err (runtime->dev,"DEV0 TDM slot err:%d\n" , ret);
@@ -206,10 +206,10 @@ static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream, }if (!strcmp (codec_dai->component->name,MAX98373_DEV1_NAME )) { ret =snd_soc_dai_set_tdm_slot (codec_dai, -0x0C ,3 ,8 ,24 ); +0xC0 ,3 ,8 ,16 );if (ret <0 ) {dev_err (runtime->dev, -"DEV0 TDM slot err:%d\n" , ret); +"DEV1 TDM slot err:%d\n" , ret);return ret; } }
@@ -309,24 +309,6 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,* The above 2 loops are mutually exclusive based on the stream direction, * thus rtd_dpcm variable will never be overwritten */ -/* -* Topology for kblda7219m98373 & kblmax98373 supports only S24_LE, -* where as kblda7219m98927 & kblmax98927 supports S16_LE by default. -* Skipping the port wise FE and BE configuration for kblda7219m98373 & -* kblmax98373 as the topology (FE & BE) supports S24_LE only. -*/ - -if (!strcmp (rtd->card->name,"kblda7219m98373" ) || - !strcmp (rtd->card->name,"kblmax98373" )) { -/* The ADSP will convert the FE rate to 48k, stereo */ - rate->min = rate->max =48000 ; - chan->min = chan->max =DUAL_CHANNEL ; - -/* set SSP to 24 bit */ -snd_mask_none (fmt); -snd_mask_set_format (fmt,SNDRV_PCM_FORMAT_S24_LE ); -return 0 ; - }/* * The ADSP will convert the FE rate to 48k, stereo, 24 bit
@@ -477,31 +459,20 @@ static struct snd_pcm_hw_constraint_list constraints_channels_quad = {static int kbl_fe_startup (struct snd_pcm_substream *substream) {struct snd_pcm_runtime *runtime = substream->runtime; -struct snd_soc_pcm_runtime *soc_rt =asoc_substream_to_rtd (substream);/* * On this platform for PCM device we support, * 48Khz * stereo +* 16 bit audio */ runtime->hw.channels_max =DUAL_CHANNEL ;snd_pcm_hw_constraint_list (runtime,0 ,SNDRV_PCM_HW_PARAM_CHANNELS , &constraints_channels); -/* -* Setup S24_LE (32 bit container and 24 bit valid data) for -* kblda7219m98373 & kblmax98373. For kblda7219m98927 & -* kblmax98927 keeping it as 16/16 due to topology FW dependency. -*/ -if (!strcmp (soc_rt->card->name,"kblda7219m98373" ) || - !strcmp (soc_rt->card->name,"kblmax98373" )) { - runtime->hw.formats =SNDRV_PCM_FMTBIT_S24_LE ; -snd_pcm_hw_constraint_msbits (runtime,0 ,32 ,24 ); - - }else { - runtime->hw.formats =SNDRV_PCM_FMTBIT_S16_LE ; -snd_pcm_hw_constraint_msbits (runtime,0 ,16 ,16 ); - } + + runtime->hw.formats =SNDRV_PCM_FMTBIT_S16_LE ; +snd_pcm_hw_constraint_msbits (runtime,0 ,16 ,16 );snd_pcm_hw_constraint_list (runtime,0 ,SNDRV_PCM_HW_PARAM_RATE , &constraints_rates);
@@ -534,23 +505,11 @@ static int kabylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,static int kabylake_dmic_startup (struct snd_pcm_substream *substream) {struct snd_pcm_runtime *runtime = substream->runtime; -struct snd_soc_pcm_runtime *soc_rt =asoc_substream_to_rtd (substream); runtime->hw.channels_min = runtime->hw.channels_max =QUAD_CHANNEL ;snd_pcm_hw_constraint_list (runtime,0 ,SNDRV_PCM_HW_PARAM_CHANNELS , &constraints_channels_quad); -/* -* Topology for kblda7219m98373 & kblmax98373 supports only S24_LE. -* The DMIC also configured for S24_LE. Forcing the DMIC format to -* S24_LE due to the topology FW dependency. -*/ -if (!strcmp (soc_rt->card->name,"kblda7219m98373" ) || - !strcmp (soc_rt->card->name,"kblmax98373" )) { - runtime->hw.formats =SNDRV_PCM_FMTBIT_S24_LE ; -snd_pcm_hw_constraint_msbits (runtime,0 ,32 ,24 ); - } -return snd_pcm_hw_constraint_list (substream->runtime,0 ,SNDRV_PCM_HW_PARAM_RATE , &constraints_rates); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 184/236 ASoC: Intel: Skylake: Leave data as is when invoking TLV IPCs
In reply to Greg Kroah-HartmanFrom: Cezary Rojewski <[email protected]>
[ Upstream commit 126b3422adc80f29d2129db7f61e0113a8a526c6 ]
Advancing pointer initially fixed issue for some users but caused regression for others. Leave data as it to make it easier for end users to adjust their topology files if needed.
--- sound/soc/intel/skylake/skl-topology.c | 6 ------ 1 file changed, 6 deletions(-)
sound/soc/intel/skylake/skl-topology.c +0 -6
@@ -1463,12 +1463,6 @@ static int skl_tplg_tlv_control_set(struct snd_kcontrol *kcontrol,struct skl_dev *skl =get_skl_ctx (w->dapm->dev);if (ac->params) { -/* -* Widget data is expected to be stripped of T and L -*/ - size -=2 *sizeof (unsigned int ); - data +=2 ; -if (size > ac->max)return -EINVAL ; ac->size = size;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 185/236 ASoC: Intel: Skylake: Fix module resource and format selection
In reply to Greg Kroah-HartmanFrom: Cezary Rojewski <[email protected]>
[ Upstream commit e8b374b649afe756c2470e0e6668022e90bf8518 ]
Module configuration may differ between its instances depending on resources required and input and output audio format. Available parameters to select from are stored in module resource and interface (format) lists. These come from topology, together with description of each of pipe's modules.
Ignoring index value provided by topology and relying always on 0th entry leads to unexpected module behavior due to under/overbudged resources assigned or impropper format selection. Fix by taking entry at index specified by topology.
--- sound/soc/intel/skylake/skl-topology.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
sound/soc/intel/skylake/skl-topology.c +10 -9
@@ -113,7 +113,7 @@ static int is_skl_dsp_widget_type(struct snd_soc_dapm_widget *w,static void skl_dump_mconfig (struct skl_dev *skl,struct skl_module_cfg *mcfg) { -struct skl_module_iface *iface = &mcfg->module->formats[0 ]; +struct skl_module_iface *iface = &mcfg->module->formats[mcfg->fmt_idx];dev_dbg (skl->dev,"Dumping config\n" );dev_dbg (skl->dev,"Input Format:\n" );
@@ -195,8 +195,8 @@ static void skl_tplg_update_params_fixup(struct skl_module_cfg *m_cfg,struct skl_module_fmt *in_fmt, *out_fmt;/* Fixups will be applied to pin 0 only */ - in_fmt = &m_cfg->module->formats[0 ].inputs[0 ].fmt; - out_fmt = &m_cfg->module->formats[0 ].outputs[0 ].fmt; + in_fmt = &m_cfg->module->formats[m_cfg->fmt_idx].inputs[0 ].fmt; + out_fmt = &m_cfg->module->formats[m_cfg->fmt_idx].outputs[0 ].fmt;if (params->stream ==SNDRV_PCM_STREAM_PLAYBACK ) {if (is_fe) {
@@ -239,9 +239,9 @@ static void skl_tplg_update_buffer_size(struct skl_dev *skl,/* Since fixups is applied to pin 0 only, ibs, obs needs * change for pin 0 only */ - res = &mcfg->module->resources[0 ]; - in_fmt = &mcfg->module->formats[0 ].inputs[0 ].fmt; - out_fmt = &mcfg->module->formats[0 ].outputs[0 ].fmt; + res = &mcfg->module->resources[mcfg->res_idx]; + in_fmt = &mcfg->module->formats[mcfg->fmt_idx].inputs[0 ].fmt; + out_fmt = &mcfg->module->formats[mcfg->fmt_idx].outputs[0 ].fmt;if (mcfg->m_type ==SKL_MODULE_TYPE_SRCINT ) multiplier =5 ;
@@ -1631,11 +1631,12 @@ int skl_tplg_update_pipe_params(struct device *dev,struct skl_module_cfg *mconfig, struct skl_pipe_params *params) { - struct skl_module_res *res = &mconfig->module->resources[0]; + struct skl_module_res *res;struct skl_dev *skl =get_skl_ctx (dev);struct skl_module_fmt *format =NULL ;u8 cfg_idx = mconfig->pipe->cur_config_idx; + res = &mconfig->module->resources[mconfig->res_idx];skl_tplg_fill_dma_id (mconfig, params); mconfig->fmt_idx = mconfig->mod_cfg[cfg_idx].fmt_idx; mconfig->res_idx = mconfig->mod_cfg[cfg_idx].res_idx;
@@ -1644,9 +1645,9 @@ int skl_tplg_update_pipe_params(struct device *dev,return 0 ;if (params->stream ==SNDRV_PCM_STREAM_PLAYBACK ) - format = &mconfig->module->formats[0 ].inputs[0 ].fmt; + format = &mconfig->module->formats[mconfig->fmt_idx].inputs[0 ].fmt;else - format = &mconfig->module->formats[0 ].outputs[0 ].fmt; + format = &mconfig->module->formats[mconfig->fmt_idx].outputs[0 ].fmt;/* set the hw_params */ format->s_freq = params->s_freq;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 186/236 mmc: sdhci: Fix issue with uninitialized dma_slave_config
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 522654d534d315d540710124c57b49ca22ac5f72 ]
Depending on the DMA driver being used, the struct dma_slave_config may need to be initialized to zero for the unused data.
For example, we have three DMA drivers using src_port_window_size and dst_port_window_size. If these are left uninitialized, it can cause DMA failures at least if external TI SDMA is ever configured for sdhci.
For other external DMA cases, this is probably not currently an issue but is still good to fix though.
--- drivers/mmc/host/sdhci.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/sdhci.c +1 -0
@@ -1223,6 +1223,7 @@ static int sdhci_external_dma_setup(struct sdhci_host *host,if (!host->mapbase)return -EINVAL ; +memset (&cfg,0 ,sizeof (cfg)); cfg.src_addr = host->mapbase +SDHCI_BUFFER ; cfg.dst_addr = host->mapbase +SDHCI_BUFFER ; cfg.src_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 187/236 mmc: dw_mmc: Fix issue with uninitialized dma_slave_config
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit c3ff0189d3bc9c03845fe37472c140f0fefd0c79 ]
Depending on the DMA driver being used, the struct dma_slave_config may need to be initialized to zero for the unused data.
For example, we have three DMA drivers using src_port_window_size and dst_port_window_size. If these are left uninitialized, it can cause DMA failures.
For dw_mmc, this is probably not currently an issue but is still good to fix though.
--- drivers/mmc/host/dw_mmc.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/dw_mmc.c +1 -0
@@ -782,6 +782,7 @@ static int dw_mci_edmac_start_dma(struct dw_mci *host,int ret =0 ;/* Set external dma config: burst size, burst width */ +memset (&cfg,0 ,sizeof (cfg)); cfg.dst_addr = host->phy_regs + fifo_offset; cfg.src_addr = cfg.dst_addr; cfg.dst_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 188/236 mmc: moxart: Fix issue with uninitialized dma_slave_config
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit ee5165354d498e5bceb0b386e480ac84c5f8c28c ]
Depending on the DMA driver being used, the struct dma_slave_config may need to be initialized to zero for the unused data.
For example, we have three DMA drivers using src_port_window_size and dst_port_window_size. If these are left uninitialized, it can cause DMA failures.
For moxart, this is probably not currently an issue but is still good to fix though.
--- drivers/mmc/host/moxart-mmc.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/moxart-mmc.c +1 -0
@@ -631,6 +631,7 @@ static int moxart_probe(struct platform_device *pdev) host->dma_chan_tx, host->dma_chan_rx); host->have_dma = true; +memset (&cfg,0 ,sizeof (cfg)); cfg.src_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ; cfg.dst_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 189/236 bpf: Fix possible out of bound write in narrow load handling
In reply to Greg Kroah-HartmanFrom: Andrey Ignatov <[email protected]>
[ Upstream commit d7af7e497f0308bc97809cc48b58e8e0f13887e1 ]
Fix a verifier bug found by smatch static checker in [0].
This problem has never been seen in prod to my best knowledge. Fixing it still seems to be a good idea since it's hard to say for sure whether it's possible or not to have a scenario where a combination of convert_ctx_access() and a narrow load would lead to an out of bound write.
When narrow load is handled, one or two new instructions are added to insn_buf array, but before it was only checked that
cnt >= ARRAY_SIZE(insn_buf)
And it's safe to add a new instruction to insn_buf[cnt++] only once. The second try will lead to out of bound write. And this is what can happen if shift is set.
Fix it by making sure that if the BPF_RSH instruction has to be added in addition to BPF_AND then there is enough space for two more instructions in insn_buf.
The full report [0] is below:
kernel/bpf/verifier.c:12304 convert_ctx_accesses() warn: offset 'cnt' incremented past end of array kernel/bpf/verifier.c:12311 convert_ctx_accesses() warn: offset 'cnt' incremented past end of array
kernel/bpf/verifier.c
12282
12283 insn->off = off & ~(size_default - 1);
12284 insn->code = BPF_LDX | BPF_MEM | size_code;
12285 }
12286
12287 target_size = 0;
12288 cnt = convert_ctx_access(type, insn, insn_buf, env->prog,
12289 &target_size);
12290 if (cnt == 0 || cnt >= ARRAY_SIZE(insn_buf) ||
^^^^^^^^^^^^^^^^^^^^^^^^^^^Bounds check.
12291 (ctx_field_size && !target_size)) {
12292 verbose(env, "bpf verifier is misconfigured\n");
12293 return -EINVAL;
12294 }
12295
12296 if (is_narrower_load && size < target_size) {
12297 u8 shift = bpf_ctx_narrow_access_offset(
12298 off, size, size_default) * 8;
12299 if (ctx_field_size <= 4) {
12300 if (shift)
12301 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_RSH,
^^^^^increment beyond end of array
12302 insn->dst_reg,
12303 shift);
--> 12304 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_AND, insn->dst_reg,
^^^^^out of bounds write
12305 (1 << size * 8) - 1);
12306 } else {
12307 if (shift)
12308 insn_buf[cnt++] = BPF_ALU64_IMM(BPF_RSH,
12309 insn->dst_reg,
12310 shift);
12311 insn_buf[cnt++] = BPF_ALU64_IMM(BPF_AND, insn->dst_reg,
^^^^^^^^^^^^^^^Same.
12312 (1ULL << size * 8) - 1);
12313 }
12314 }
12315
12316 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
12317 if (!new_prog)
12318 return -ENOMEM;
12319
12320 delta += cnt - 1;
12321
12322 /* keep walking new program and skip insns we just inserted */
12323 env->prog = new_prog;
12324 insn = new_prog->insnsi + i + delta;
12325 }
12326
12327 return 0;
12328 }[0] https://lore.kernel.org/bpf/20210817050843.GA21456@kili/
v1->v2:
- clarify that problem was only seen by static checker but not in prod;
--- kernel/bpf/verifier.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/bpf/verifier.c +4 -0
@@ -11038,6 +11038,10 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)if (is_narrower_load && size < target_size) {u8 shift =bpf_ctx_narrow_access_offset ( off, size, size_default) *8 ; +if (shift && cnt +1 >=ARRAY_SIZE (insn_buf)) { +verbose (env,"bpf verifier narrow ctx load misconfigured\n" ); +return -EINVAL ; + }if (ctx_field_size <=4 ) {if (shift) insn_buf[cnt++] = BPF_ALU32_IMM(BPF_RSH,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 190/236 CIFS: Fix a potencially linear read overflow
In reply to Greg Kroah-HartmanFrom: Len Baker <[email protected]>
[ Upstream commit f980d055a0f858d73d9467bb0b570721bbfcdfb8 ]
strlcpy() reads the entire source buffer first. This read may exceed the destination size limit. This is both inefficient and can lead to linear read overflows if a source string is not NUL-terminated.
Also, the strnlen() call does not avoid the read overflow in the strlcpy function when a not NUL-terminated string is passed.
So, replace this block by a call to kstrndup() that avoids this type of overflow and does the same.
--- fs/cifs/cifs_unicode.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
fs/cifs/cifs_unicode.c +2 -7
@@ -358,14 +358,9 @@ cifs_strndup_from_utf16(const char *src, const int maxlen,if (!dst)return NULL ;cifs_from_utf16 (dst, (__le16 *) src, len, maxlen, codepage, -NO_MAP_UNI_RSVD ); +NO_MAP_UNI_RSVD ); }else { - len =strnlen (src, maxlen); - len++; - dst =kmalloc (len,GFP_KERNEL ); -if (!dst) -return NULL ; -strlcpy (dst, src, len); + dst =kstrndup (src, maxlen,GFP_KERNEL ); }return dst;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 191/236 i2c: mt65xx: fix IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 58fb7c643d346e2364404554f531cfa6a1a3917c ]
Iff platform_get_irq() returns 0, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision...
--- drivers/i2c/busses/i2c-mt65xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-mt65xx.c +1 -1
@@ -1207,7 +1207,7 @@ static int mtk_i2c_probe(struct platform_device *pdev)return PTR_ERR (i2c->pdmabase); irq =platform_get_irq (pdev,0 ); -if (irq <=0 ) +if (irq <0 )return irq;init_completion (&i2c->msg_complete);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 192/236 i2c: xlp9xx: fix main IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 661e8a88e8317eb9ffe69c69d6cb4876370fe7e2 ]
Iff platform_get_irq() returns 0 for the main IRQ, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision...
--- drivers/i2c/busses/i2c-xlp9xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-xlp9xx.c +1 -1
@@ -517,7 +517,7 @@ static int xlp9xx_i2c_probe(struct platform_device *pdev)return PTR_ERR (priv->base); priv->irq =platform_get_irq (pdev,0 ); -if (priv->irq <=0 ) +if (priv->irq <0 )return priv->irq;/* SMBAlert irq */ priv->alert_data.irq =platform_get_irq (pdev,1 );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 193/236 usb: ehci-orion: Handle errors of clk_prepare_enable() in probe
In reply to Greg Kroah-HartmanFrom: Evgeny Novikov <[email protected]>
[ Upstream commit 4720f1bf4ee4a784d9ece05420ba33c9222a3004 ]
ehci_orion_drv_probe() did not account for possible errors of clk_prepare_enable() that in particular could cause invocation of clk_disable_unprepare() on clocks that were not prepared/enabled yet, e.g. in remove or on handling errors of usb_add_hcd() in probe. Though, there were several patches fixing different issues with clocks in this driver, they did not solve this problem.
Add handling of errors of clk_prepare_enable() in ehci_orion_drv_probe() to avoid calls of clk_disable_unprepare() without previous successful invocation of clk_prepare_enable().
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/usb/host/ehci-orion.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/usb/host/ehci-orion.c +6 -2
@@ -264,8 +264,11 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)* the clock does not exists. */ priv->clk =devm_clk_get (&pdev->dev,NULL ); -if (!IS_ERR (priv->clk)) -clk_prepare_enable (priv->clk); +if (!IS_ERR (priv->clk)) { + err =clk_prepare_enable (priv->clk); +if (err) + goto err_put_hcd; + } priv->phy =devm_phy_optional_get (&pdev->dev,"usb" );if (IS_ERR (priv->phy)) {
@@ -311,6 +314,7 @@ static int ehci_orion_drv_probe(struct platform_device *pdev) err_dis_clk:if (!IS_ERR (priv->clk))clk_disable_unprepare (priv->clk); +err_put_hcd:usb_put_hcd (hcd); err: dev_err(&pdev->dev, "init %s fail, %d\n",
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 194/236 usb: bdc: Fix an error handling path in bdc_probe() when no suitable DMA config is available
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit d2f42e09393c774ab79088d8e3afcc62b3328fc9 ]
If no suitable DMA configuration is available, a previous 'bdc_phy_init()' call must be undone by a corresponding 'bdc_phy_exit()' call.
Branch to the existing error handling path instead of returning directly.
--- drivers/usb/gadget/udc/bdc/bdc_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/gadget/udc/bdc/bdc_core.c +2 -1
@@ -560,7 +560,8 @@ static int bdc_probe(struct platform_device *pdev)if (ret) {dev_err (dev,"No suitable DMA config available, abort\n" ); -return -ENOTSUPP ; + ret = -ENOTSUPP ; + goto phycleanup; }dev_dbg (dev,"Using 32-bit address\n" ); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 195/236 usb: bdc: Fix a resource leak in the error handling path of bdc_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 6f15a2a09cecb7a2faba4a75bbd101f6f962294b ]
If an error occurs after a successful 'clk_prepare_enable()' call, it must be undone by a corresponding 'clk_disable_unprepare()' call. This call is already present in the remove function.
Add this call in the error handling path and reorder the code so that the 'clk_prepare_enable()' call happens later in the function.
The goal is to have as much managed resources functions as possible before the 'clk_prepare_enable()' call in order to keep the error handling path simple.
While at it, remove the now unneeded 'clk' variable.
--- drivers/usb/gadget/udc/bdc/bdc_core.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-)
drivers/usb/gadget/udc/bdc/bdc_core.c +13 -14
@@ -488,27 +488,14 @@ static int bdc_probe(struct platform_device *pdev)int irq;u32 temp;struct device *dev = &pdev->dev; -struct clk *clk;int phy_num;dev_dbg (dev,"%s()\n" , __func__); - clk =devm_clk_get_optional (dev,"sw_usbd" ); -if (IS_ERR (clk)) -return PTR_ERR (clk); - - ret =clk_prepare_enable (clk); -if (ret) { -dev_err (dev,"could not enable clock\n" ); -return ret; - } - bdc =devm_kzalloc (dev,sizeof (*bdc),GFP_KERNEL );if (!bdc)return -ENOMEM ; - bdc->clk = clk; - bdc->regs =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (bdc->regs))return PTR_ERR (bdc->regs);
@@ -545,10 +532,20 @@ static int bdc_probe(struct platform_device *pdev) } } + bdc->clk =devm_clk_get_optional (dev,"sw_usbd" ); +if (IS_ERR (bdc->clk)) +return PTR_ERR (bdc->clk); + + ret =clk_prepare_enable (bdc->clk); +if (ret) { +dev_err (dev,"could not enable clock\n" ); +return ret; + } + ret =bdc_phy_init (bdc);if (ret) {dev_err (bdc->dev,"BDC phy init failure:%d\n" , ret); -return ret; + goto disable_clk; } temp =bdc_readl (bdc->regs,BDC_BDCCAP1 );
@@ -581,6 +578,8 @@ cleanup:bdc_hw_exit (bdc); phycleanup:bdc_phy_exit (bdc); +disable_clk: +clk_disable_unprepare (bdc->clk);return ret; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 196/236 tty: serial: fsl_lpuart: fix the wrong mapbase value
In reply to Greg Kroah-HartmanFrom: Andy Duan <[email protected]>
[ Upstream commit d5c38948448abc2bb6b36dbf85a554bf4748885e ]
Register offset needs to be applied on mapbase also. dma_tx/rx_request use the physical address of UARTDATA. Register offset is currently only applied to membase (the corresponding virtual addr) but not on mapbase.
--- drivers/tty/serial/fsl_lpuart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/fsl_lpuart.c +1 -1
@@ -2597,7 +2597,7 @@ static int lpuart_probe(struct platform_device *pdev)return PTR_ERR (sport->port.membase); sport->port.membase += sdata->reg_off; - sport->port.mapbase = res->start; + sport->port.mapbase = res->start + sdata->reg_off; sport->port.dev = &pdev->dev; sport->port.type =PORT_LPUART ; sport->devtype = sdata->devtype;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 197/236 ASoC: wcd9335: Fix a double irq free in the remove function
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 7a6a723e98aa45f393e6add18f7309dfffa1b0e2 ]
There is no point in calling 'free_irq()' explicitly for 'WCD9335_IRQ_SLIMBUS' in the remove function.
The irqs are requested in 'wcd9335_setup_irqs()' using a resource managed function (i.e. 'devm_request_threaded_irq()'). 'wcd9335_setup_irqs()' requests all what is defined in the 'wcd9335_irqs' structure.
This structure has only one entry for 'WCD9335_IRQ_SLIMBUS'.
So 'devm_request...irq()' + explicit 'free_irq()' would lead to a double free.
Remove the unneeded 'free_irq()' from the remove function.
Message-Id: <0614d63bc00edd7e81dd367504128f3d84f72efa.1629091028.git.christophe.jaillet@wanadoo.fr>
--- sound/soc/codecs/wcd9335.c | 1 - 1 file changed, 1 deletion(-)
sound/soc/codecs/wcd9335.c +0 -1
@@ -4869,7 +4869,6 @@ static void wcd9335_codec_remove(struct snd_soc_component *comp)struct wcd9335_codec *wcd =dev_get_drvdata (comp->dev);wcd_clsh_ctrl_free (wcd->clsh_ctrl); -free_irq (regmap_irq_get_virq (wcd->irq_data,WCD9335_IRQ_SLIMBUS ), wcd); } static int wcd9335_codec_set_sysclk(struct snd_soc_component *comp,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 198/236 ASoC: wcd9335: Fix a memory leak in the error handling path of the probe function
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit fc6fc81caa63900cef9ebb8b2e365c3ed5a9effb ]
If 'wcd9335_setup_irqs()' fails, me must release the memory allocated in 'wcd_clsh_ctrl_alloc()', as already done in the remove function.
Add an error handling path and the missing 'wcd_clsh_ctrl_free()' call.
Message-Id: <6dc12372f09fabb70bf05941dbe6a1382dc93e43.1629091028.git.christophe.jaillet@wanadoo.fr>
--- sound/soc/codecs/wcd9335.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
sound/soc/codecs/wcd9335.c +10 -1
@@ -4844,6 +4844,7 @@ static void wcd9335_codec_init(struct snd_soc_component *component)static int wcd9335_codec_probe (struct snd_soc_component *component) {struct wcd9335_codec *wcd =dev_get_drvdata (component->dev); +int ret;int i;snd_soc_component_init_regmap (component, wcd->regmap);
@@ -4861,7 +4862,15 @@ static int wcd9335_codec_probe(struct snd_soc_component *component)for (i =0 ; i <NUM_CODEC_DAIS ; i++)INIT_LIST_HEAD (&wcd->dai[i].slim_ch_list); -return wcd9335_setup_irqs (wcd); + ret =wcd9335_setup_irqs (wcd); +if (ret) + goto free_clsh_ctrl; + +return 0 ; + +free_clsh_ctrl: +wcd_clsh_ctrl_free (wcd->clsh_ctrl); +return ret; }static void wcd9335_codec_remove (struct snd_soc_component *comp)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 199/236 ASoC: wcd9335: Disable irq on slave ports in the remove function
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit d3efd26af2e044ff2b48d38bb871630282d77e60 ]
The probe calls 'wcd9335_setup_irqs()' to enable interrupts on all slave ports.
This must be undone in the remove function.
Add a 'wcd9335_teardown_irqs()' function that undoes 'wcd9335_setup_irqs()' function, and call it from the remove function.
Message-Id: <8f761244d79bd4c098af8a482be9121d3a486d1b.1629091028.git.christophe.jaillet@wanadoo.fr>
--- sound/soc/codecs/wcd9335.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
sound/soc/codecs/wcd9335.c +11 -0
@@ -4076,6 +4076,16 @@ static int wcd9335_setup_irqs(struct wcd9335_codec *wcd)return ret; } +static void wcd9335_teardown_irqs (struct wcd9335_codec *wcd) +{ +int i; + +/* disable interrupts on all slave ports */ +for (i =0 ; i <WCD9335_SLIM_NUM_PORT_REG ; i++) +regmap_write (wcd->if_regmap,WCD9335_SLIM_PGD_PORT_INT_EN0 + i, +0x00 ); +} +static void wcd9335_cdc_sido_ccl_enable (struct wcd9335_codec *wcd,bool ccl_flag) {
@@ -4878,6 +4888,7 @@ static void wcd9335_codec_remove(struct snd_soc_component *comp)struct wcd9335_codec *wcd =dev_get_drvdata (comp->dev);wcd_clsh_ctrl_free (wcd->clsh_ctrl); +wcd9335_teardown_irqs (wcd); } static int wcd9335_codec_set_sysclk(struct snd_soc_component *comp,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 200/236 iwlwifi: follow the new inclusive terminology
In reply to Greg Kroah-HartmanFrom: Emmanuel Grumbach <[email protected]>
[ Upstream commit cdaba917268d7b58bf02fcc587cb2a7a277dc931 ]
The new inclusive terminology requires to change a few terms that were used in iwlwifi.
--- drivers/net/wireless/intel/iwlwifi/fw/acpi.c | 20 ++++++++-------- drivers/net/wireless/intel/iwlwifi/fw/acpi.h | 10 ++++---- .../wireless/intel/iwlwifi/fw/api/commands.h | 2 +- .../wireless/intel/iwlwifi/fw/api/nvm-reg.h | 8 +++---- .../net/wireless/intel/iwlwifi/fw/api/scan.h | 12 +++++----- drivers/net/wireless/intel/iwlwifi/fw/file.h | 2 +- .../net/wireless/intel/iwlwifi/iwl-config.h | 2 +- drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 6 ++--- .../net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | 10 ++++---- .../net/wireless/intel/iwlwifi/mvm/mac80211.c | 13 +++++----- drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 24 +++++++++---------- 11 files changed, 55 insertions(+), 54 deletions(-)
drivers/net/wireless/intel/iwlwifi/fw/acpi.c +10 -10
@@ -229,8 +229,8 @@ found:IWL_EXPORT_SYMBOL (iwl_acpi_get_wifi_pkg);int iwl_acpi_get_tas (struct iwl_fw_runtime *fwrt, -__le32 *black_list_array, -int *black_list_size) +__le32 *block_list_array, +int *block_list_size) {union acpi_object *wifi_pkg, *data;int ret, tbl_rev, i;
@@ -257,7 +257,7 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, enabled = !!wifi_pkg->package.elements[0 ].integer.value;if (!enabled) { - *black_list_size =-1 ; + *block_list_size =-1 ;IWL_DEBUG_RADIO (fwrt,"TAS not enabled\n" ); ret =0 ; goto out_free;
@@ -271,17 +271,17 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, ret = -EINVAL ; goto out_free; } - *black_list_size = wifi_pkg->package.elements[1 ].integer.value; + *block_list_size = wifi_pkg->package.elements[1 ].integer.value; -IWL_DEBUG_RADIO (fwrt,"TAS array size %d\n" , *black_list_size); -if (*black_list_size >APCI_WTAS_BLACK_LIST_MAX ) { +IWL_DEBUG_RADIO (fwrt,"TAS array size %d\n" , *block_list_size); +if (*block_list_size >APCI_WTAS_BLACK_LIST_MAX ) {IWL_DEBUG_RADIO (fwrt,"TAS invalid array size value %u\n" , - *black_list_size); + *block_list_size); ret = -EINVAL ; goto out_free; } -for (i =0 ; i < *black_list_size; i++) { +for (i =0 ; i < *block_list_size; i++) {u32 country; if (wifi_pkg->package.elements[2 + i].type !=
@@ -293,8 +293,8 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, } country = wifi_pkg->package.elements[2 + i].integer.value; - black_list_array[i] =cpu_to_le32 (country); -IWL_DEBUG_RADIO (fwrt,"TAS black list country %d\n" , country); + block_list_array[i] =cpu_to_le32 (country); +IWL_DEBUG_RADIO (fwrt,"TAS block list country %d\n" , country); } ret =0 ;
drivers/net/wireless/intel/iwlwifi/fw/acpi.h +5 -5
@@ -100,7 +100,7 @@#define ACPI_ECKV_WIFI_DATA_SIZE 2/* -* 1 type, 1 enabled, 1 black list size, 16 black list array +* 1 type, 1 enabled, 1 block list size, 16 block list array */ #define APCI_WTAS_BLACK_LIST_MAX 16#define ACPI_WTAS_WIFI_DATA_SIZE (3 + APCI_WTAS_BLACK_LIST_MAX)
@@ -197,8 +197,8 @@ bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt);int iwl_sar_geo_init (struct iwl_fw_runtime *fwrt,struct iwl_per_chain_offset *table,u32 n_bands); -int iwl_acpi_get_tas (struct iwl_fw_runtime *fwrt,__le32 *black_list_array, -int *black_list_size); +int iwl_acpi_get_tas (struct iwl_fw_runtime *fwrt,__le32 *block_list_array, +int *block_list_size);#else /* CONFIG_ACPI */
@@ -269,8 +269,8 @@ static inline bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt) }static inline int iwl_acpi_get_tas (struct iwl_fw_runtime *fwrt, -__le32 *black_list_array, -int *black_list_size) +__le32 *block_list_array, +int *block_list_size) {return -ENOENT ; }
drivers/net/wireless/intel/iwlwifi/fw/api/commands.h +1 -1
@@ -323,7 +323,7 @@ enum iwl_legacy_cmds {/** * @SCAN_OFFLOAD_UPDATE_PROFILES_CMD: -* update scan offload (scheduled scan) profiles/blacklist/etc. +* update scan offload (scheduled scan) profiles/blocklist/etc. */ SCAN_OFFLOAD_UPDATE_PROFILES_CMD = 0x6E,
drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h +4 -4
@@ -449,12 +449,12 @@ enum iwl_mcc_source {#define IWL_TAS_BLACK_LIST_MAX 16/** * struct iwl_tas_config_cmd - configures the TAS -* @black_list_size: size of relevant field in black_list_array -* @black_list_array: black list countries (without TAS) +* @block_list_size: size of relevant field in block_list_array +* @block_list_array: block list countries (without TAS) */ struct iwl_tas_config_cmd { -__le32 black_list_size; -__le32 black_list_array[IWL_TAS_BLACK_LIST_MAX ]; +__le32 block_list_size; +__le32 block_list_array[IWL_TAS_BLACK_LIST_MAX ]; } __packed;/* TAS_CONFIG_CMD_API_S_VER_2 */ /**
drivers/net/wireless/intel/iwlwifi/fw/api/scan.h +6 -6
@@ -8,7 +8,7 @@* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -* Copyright(c) 2018 - 2019 Intel Corporation +* Copyright(c) 2018 - 2020 Intel Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License as
@@ -31,7 +31,7 @@* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -* Copyright(c) 2018 - 2019 Intel Corporation +* Copyright(c) 2018 - 2020 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without
@@ -117,12 +117,12 @@ enum scan_framework_client { };/** -* struct iwl_scan_offload_blacklist - SCAN_OFFLOAD_BLACKLIST_S +* struct iwl_scan_offload_blocklist - SCAN_OFFLOAD_BLACKLIST_S * @ssid: MAC address to filter out * @reported_rssi: AP rssi reported to the host * @client_bitmap: clients ignore this entry - enum scan_framework_client */ -struct iwl_scan_offload_blacklist { +struct iwl_scan_offload_blocklist {u8 ssid[ETH_ALEN ];u8 reported_rssi;u8 client_bitmap;
@@ -162,7 +162,7 @@ struct iwl_scan_offload_profile {/** * struct iwl_scan_offload_profile_cfg_data -* @blacklist_len: length of blacklist +* @blocklist_len: length of blocklist * @num_profiles: num of profiles in the list * @match_notify: clients waiting for match found notification * @pass_match: clients waiting for the results
@@ -171,7 +171,7 @@ struct iwl_scan_offload_profile {* @reserved: reserved */ struct iwl_scan_offload_profile_cfg_data { -u8 blacklist_len; +u8 blocklist_len;u8 num_profiles;u8 match_notify;u8 pass_match;
drivers/net/wireless/intel/iwlwifi/fw/file.h +1 -1
@@ -220,7 +220,7 @@ struct iwl_ucode_capa {* treats good CRC threshold as a boolean * @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w). * @IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT: This uCode image supports uAPSD -* @IWL_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of black list instead of 64 in scan +* @IWL_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of block list instead of 64 in scan * offload profile config command. * @IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six * (rather than two) IPv6 addresses
drivers/net/wireless/intel/iwlwifi/iwl-config.h +1 -1
@@ -376,7 +376,7 @@ struct iwl_fw_mon_regs {* mode set * @nvm_hw_section_num: the ID of the HW NVM section * @mac_addr_from_csr: read HW address from CSR registers -* @features: hw features, any combination of feature_whitelist +* @features: hw features, any combination of feature_passlist * @pwr_tx_backoffs: translation table between power limits and backoffs * @max_tx_agg_size: max TX aggregation size of the ADDBA request/response * @max_ht_ampdu_factor: the exponent of the max length of A-MPDU that the
drivers/net/wireless/intel/iwlwifi/mvm/fw.c +3 -3
@@ -1109,7 +1109,7 @@ static void iwl_mvm_tas_init(struct iwl_mvm *mvm)struct iwl_tas_config_cmd cmd = {};int list_size; -BUILD_BUG_ON (ARRAY_SIZE (cmd.black_list_array) < +BUILD_BUG_ON (ARRAY_SIZE (cmd.block_list_array) <APCI_WTAS_BLACK_LIST_MAX );if (!fw_has_capa (&mvm->fw->ucode_capa,IWL_UCODE_TLV_CAPA_TAS_CFG )) {
@@ -1117,7 +1117,7 @@ static void iwl_mvm_tas_init(struct iwl_mvm *mvm)return ; } - ret =iwl_acpi_get_tas (&mvm->fwrt, cmd.black_list_array, &list_size); + ret =iwl_acpi_get_tas (&mvm->fwrt, cmd.block_list_array, &list_size);if (ret <0 ) { IWL_DEBUG_RADIO(mvm, "TAS table invalid or unavailable. (%d)\n",
@@ -1129,7 +1129,7 @@ static void iwl_mvm_tas_init(struct iwl_mvm *mvm)return ;/* list size if TAS enabled can only be non-negative */ - cmd.black_list_size =cpu_to_le32 ((u32 )list_size); + cmd.block_list_size =cpu_to_le32 ((u32 )list_size); ret = iwl_mvm_send_cmd_pdu(mvm, WIDE_ID(REGULATORY_AND_NVM_GROUP, TAS_CONFIG),
drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c +5 -5
@@ -115,12 +115,12 @@ static void iwl_mvm_mac_tsf_id_iter(void *_data, u8 *mac,* client in the system. * * The firmware will decide according to the MAC type which -* will be the master and slave. Clients that need to sync -* with a remote station will be the master, and an AP or GO -* will be the slave. +* will be the leader and follower. Clients that need to sync +* with a remote station will be the leader, and an AP or GO +* will be the follower. * -* Depending on the new interface type it can be slaved to -* or become the master of an existing interface. +* Depending on the new interface type it can be following +* or become the leader of an existing interface. */ switch (data->vif->type) {case NL80211_IFTYPE_STATION :
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +7 -6
@@ -2279,9 +2279,9 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,int ret;/* -* Re-calculate the tsf id, as the master-slave relations depend on the -* beacon interval, which was not known when the station interface was -* added. +* Re-calculate the tsf id, as the leader-follower relations depend +* on the beacon interval, which was not known when the station +* interface was added. */ if (changes &BSS_CHANGED_ASSOC && bss_conf->assoc) { if (vif->bss_conf.he_support &&
@@ -2499,8 +2499,9 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw, goto out_unlock;/* -* Re-calculate the tsf id, as the master-slave relations depend on the -* beacon interval, which was not known when the AP interface was added. +* Re-calculate the tsf id, as the leader-follower relations depend on +* the beacon interval, which was not known when the AP interface +* was added. */ if (vif->type ==NL80211_IFTYPE_AP )iwl_mvm_mac_ctxt_recalc_tsf_id (mvm, vif);
@@ -3116,7 +3117,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,* than 16. We can't avoid connecting at all, so refuse the * station state change, this will cause mac80211 to abandon * attempts to connect to this AP, and eventually wpa_s will -* blacklist the AP... +* blocklist the AP... */ if (vif->type ==NL80211_IFTYPE_STATION && vif->bss_conf.beacon_int <16 ) {
drivers/net/wireless/intel/iwlwifi/mvm/scan.c +12 -12
@@ -568,7 +568,7 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm, {struct iwl_scan_offload_profile *profile;struct iwl_scan_offload_profile_cfg_v1 *profile_cfg_v1; -struct iwl_scan_offload_blacklist *blacklist; +struct iwl_scan_offload_blocklist *blocklist;struct iwl_scan_offload_profile_cfg_data *data;int max_profiles =iwl_umac_scan_get_max_profiles (mvm->fw); int profile_cfg_size = sizeof(*data) +
@@ -579,7 +579,7 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm, .dataflags[0] = IWL_HCMD_DFL_NOCOPY, .dataflags[1] = IWL_HCMD_DFL_NOCOPY, }; -int blacklist_len; +int blocklist_len;int i;int ret;
@@ -587,22 +587,22 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,return -EIO ;if (mvm->fw->ucode_capa.flags &IWL_UCODE_TLV_FLAGS_SHORT_BL ) - blacklist_len =IWL_SCAN_SHORT_BLACKLIST_LEN ; + blocklist_len =IWL_SCAN_SHORT_BLACKLIST_LEN ;else - blacklist_len =IWL_SCAN_MAX_BLACKLIST_LEN ; + blocklist_len =IWL_SCAN_MAX_BLACKLIST_LEN ; - blacklist =kcalloc (blacklist_len,sizeof (*blacklist),GFP_KERNEL ); -if (!blacklist) + blocklist =kcalloc (blocklist_len,sizeof (*blocklist),GFP_KERNEL ); +if (!blocklist)return -ENOMEM ; profile_cfg_v1 =kzalloc (profile_cfg_size,GFP_KERNEL );if (!profile_cfg_v1) { ret = -ENOMEM ; - goto free_blacklist; + goto free_blocklist; } - cmd.data[0 ] = blacklist; - cmd.len[0 ] =sizeof (*blacklist) * blacklist_len; + cmd.data[0 ] = blocklist; + cmd.len[0 ] =sizeof (*blocklist) * blocklist_len; cmd.data[1 ] = profile_cfg_v1;/* if max_profile is MAX_PROFILES_V2, we have the new API */
@@ -615,7 +615,7 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm, data = &profile_cfg_v1->data; } -/* No blacklist configuration */ +/* No blocklist configuration */ data->num_profiles = req->n_match_sets; data->active_clients =SCAN_CLIENT_SCHED_SCAN ; data->pass_match =SCAN_CLIENT_SCHED_SCAN ;
@@ -639,8 +639,8 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm, ret =iwl_mvm_send_cmd (mvm, &cmd);kfree (profile_cfg_v1); -free_blacklist: -kfree (blacklist); +free_blocklist: +kfree (blocklist);return ret; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 201/236 iwlwifi: skip first element in the WTAS ACPI table
In reply to Greg Kroah-HartmanFrom: Abhishek Naik <[email protected]>
[ Upstream commit 19426d54302e199b3fd2d575f926a13af66be2b9 ]
By mistake we were considering the first element of the WTAS wifi package as part of the data we want to rid, but that element is the wifi package signature (always 0x07), so it should be skipped.
Change the code to read the data starting from element 1 instead.
--- drivers/net/wireless/intel/iwlwifi/fw/acpi.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/net/wireless/intel/iwlwifi/fw/acpi.c +7 -7
@@ -254,7 +254,7 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, goto out_free; } - enabled = !!wifi_pkg->package.elements[0 ].integer.value; + enabled = !!wifi_pkg->package.elements[1 ].integer.value;if (!enabled) { *block_list_size =-1 ;
@@ -263,15 +263,15 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, goto out_free; } -if (wifi_pkg->package.elements[1 ].type !=ACPI_TYPE_INTEGER || - wifi_pkg->package.elements[1 ].integer.value > +if (wifi_pkg->package.elements[2 ].type !=ACPI_TYPE_INTEGER || + wifi_pkg->package.elements[2 ].integer.value >APCI_WTAS_BLACK_LIST_MAX ) {IWL_DEBUG_RADIO (fwrt,"TAS invalid array size %llu\n" , wifi_pkg->package.elements[1 ].integer.value); ret = -EINVAL ; goto out_free; } - *block_list_size = wifi_pkg->package.elements[1 ].integer.value; + *block_list_size = wifi_pkg->package.elements[2 ].integer.value;IWL_DEBUG_RADIO (fwrt,"TAS array size %d\n" , *block_list_size);if (*block_list_size >APCI_WTAS_BLACK_LIST_MAX ) {
@@ -284,15 +284,15 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,for (i =0 ; i < *block_list_size; i++) {u32 country; -if (wifi_pkg->package.elements[2 + i].type != +if (wifi_pkg->package.elements[3 + i].type !=ACPI_TYPE_INTEGER ) {IWL_DEBUG_RADIO (fwrt, -"TAS invalid array elem %d\n" ,2 + i); +"TAS invalid array elem %d\n" ,3 + i); ret = -EINVAL ; goto out_free; } - country = wifi_pkg->package.elements[2 + i].integer.value; + country = wifi_pkg->package.elements[3 + i].integer.value; block_list_array[i] =cpu_to_le32 (country);IWL_DEBUG_RADIO (fwrt,"TAS block list country %d\n" , country); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 202/236 ice: Only lock to update netdev dev_addr
In reply to Greg Kroah-HartmanFrom: Brett Creeley <[email protected]>
[ Upstream commit b357d9717be7f95fde2c6c4650b186a995b71e59 ]
commit 3ba7f53f8bf1 ("ice: don't remove netdev->dev_addr from uc sync list") introduced calls to netif_addr_lock_bh() and netif_addr_unlock_bh() in the driver's ndo_set_mac() callback. This is fine since the driver is updated the netdev's dev_addr, but since this is a spinlock, the driver cannot sleep when the lock is held. Unfortunately the functions to add/delete MAC filters depend on a mutex. This was causing a trace with the lock debug kernel config options enabled when changing the mac address via iproute.
[ 203.273059] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:281 [ 203.273065] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 6698, name: ip [ 203.273068] Preemption disabled at: [ 203.273068] [<ffffffffc04aaeab>] ice_set_mac_address+0x8b/0x1c0 [ice] [ 203.273097] CPU: 31 PID: 6698 Comm: ip Tainted: G S W I 5.14.0-rc4 #2 [ 203.273100] Hardware name: Intel Corporation S2600WFT/S2600WFT, BIOS SE5C620.86B.02.01.0010.010620200716 01/06/2020 [ 203.273102] Call Trace: [ 203.273107] dump_stack_lvl+0x33/0x42 [ 203.273113] ? ice_set_mac_address+0x8b/0x1c0 [ice] [ 203.273124] ___might_sleep.cold.150+0xda/0xea [ 203.273131] mutex_lock+0x1c/0x40 [ 203.273136] ice_remove_mac+0xe3/0x180 [ice] [ 203.273155] ? ice_fltr_add_mac_list+0x20/0x20 [ice] [ 203.273175] ice_fltr_prepare_mac+0x43/0xa0 [ice] [ 203.273194] ice_set_mac_address+0xab/0x1c0 [ice] [ 203.273206] dev_set_mac_address+0xb8/0x120 [ 203.273210] dev_set_mac_address_user+0x2c/0x50 [ 203.273212] do_setlink+0x1dd/0x10e0 [ 203.273217] ? __nla_validate_parse+0x12d/0x1a0 [ 203.273221] __rtnl_newlink+0x530/0x910 [ 203.273224] ? __kmalloc_node_track_caller+0x17f/0x380 [ 203.273230] ? preempt_count_add+0x68/0xa0 [ 203.273236] ? _raw_spin_lock_irqsave+0x1f/0x30 [ 203.273241] ? kmem_cache_alloc_trace+0x4d/0x440 [ 203.273244] rtnl_newlink+0x43/0x60 [ 203.273245] rtnetlink_rcv_msg+0x13a/0x380 [ 203.273248] ? rtnl_calcit.isra.40+0x130/0x130 [ 203.273250] netlink_rcv_skb+0x4e/0x100 [ 203.273256] netlink_unicast+0x1a2/0x280 [ 203.273258] netlink_sendmsg+0x242/0x490 [ 203.273260] sock_sendmsg+0x58/0x60 [ 203.273263] ____sys_sendmsg+0x1ef/0x260 [ 203.273265] ? copy_msghdr_from_user+0x5c/0x90 [ 203.273268] ? ____sys_recvmsg+0xe6/0x170 [ 203.273270] ___sys_sendmsg+0x7c/0xc0 [ 203.273272] ? copy_msghdr_from_user+0x5c/0x90 [ 203.273274] ? ___sys_recvmsg+0x89/0xc0 [ 203.273276] ? __netlink_sendskb+0x50/0x50 [ 203.273278] ? mod_objcg_state+0xee/0x310 [ 203.273282] ? __dentry_kill+0x114/0x170 [ 203.273286] ? get_max_files+0x10/0x10 [ 203.273288] __sys_sendmsg+0x57/0xa0 [ 203.273290] do_syscall_64+0x37/0x80 [ 203.273295] entry_SYSCALL_64_after_hwframe+0x44/0xae [ 203.273296] RIP: 0033:0x7f8edf96e278 [ 203.273298] Code: 89 02 48 c7 c0 ff ff ff ff eb b5 0f 1f 80 00 00 00 00 f3 0f 1e fa 48 8d 05 25 63 2c 00 8b 00 85 c0 75 17 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 58 c3 0f 1f 80 00 00 00 00 41 54 41 89 d4 55 [ 203.273300] RSP: 002b:00007ffcb8bdac08 EFLAGS: 00000246 ORIG_RAX: 000000000000002e [ 203.273303] RAX: ffffffffffffffda RBX: 000000006115e0ae RCX: 00007f8edf96e278 [ 203.273304] RDX: 0000000000000000 RSI: 00007ffcb8bdac70 RDI: 0000000000000003 [ 203.273305] RBP: 0000000000000000 R08: 0000000000000001 R09: 00007ffcb8bda5b0 [ 203.273306] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000001 [ 203.273306] R13: 0000555e10092020 R14: 0000000000000000 R15: 0000000000000005
Fix this by only locking when changing the netdev->dev_addr. Also, make sure to restore the old netdev->dev_addr on any failures.
--- drivers/net/ethernet/intel/ice/ice_main.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/ice/ice_main.c +9 -4
@@ -4879,6 +4879,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)struct ice_hw *hw = &pf->hw;struct sockaddr *addr = pi;enum ice_status status; +u8 old_mac[ETH_ALEN ];u8 flags =0 ;int err =0 ;u8 *mac;
@@ -4901,8 +4902,13 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi) }netif_addr_lock_bh (netdev); +ether_addr_copy (old_mac, netdev->dev_addr); +/* change the netdev's MAC address */ +memcpy (netdev->dev_addr, mac, netdev->addr_len); +netif_addr_unlock_bh (netdev); +/* Clean up old MAC filter. Not an error if old filter doesn't exist */ - status =ice_fltr_remove_mac (vsi, netdev->dev_addr,ICE_FWD_TO_VSI ); + status =ice_fltr_remove_mac (vsi, old_mac,ICE_FWD_TO_VSI );if (status && status !=ICE_ERR_DOES_NOT_EXIST ) { err = -EADDRNOTAVAIL ; goto err_update_filters;
@@ -4925,13 +4931,12 @@ err_update_filters:if (err) {netdev_err (netdev,"can't set MAC %pM. filter update failed\n" , mac); +netif_addr_lock_bh (netdev); +ether_addr_copy (netdev->dev_addr, old_mac);netif_addr_unlock_bh (netdev);return err; } -/* change the netdev's MAC address */ -memcpy (netdev->dev_addr, mac, netdev->addr_len); -netif_addr_unlock_bh (netdev);netdev_dbg (vsi->netdev,"updated MAC address to %pM\n" , netdev->dev_addr);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 203/236 ath6kl: wmi: fix an error code in ath6kl_wmi_sync_point()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit fd6729ec534cffbbeb3917761e6d1fe6a412d3fe ]
This error path is unlikely because of it checked for NULL and returned -ENOMEM earlier in the function. But it should return an error code here as well if we ever do hit it because of a race condition or something.
--- drivers/net/wireless/ath/ath6kl/wmi.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath6kl/wmi.c +3 -1
@@ -2504,8 +2504,10 @@ static int ath6kl_wmi_sync_point(struct wmi *wmi, u8 if_idx) goto free_data_skb;for (index =0 ; index < num_pri_streams; index++) { -if (WARN_ON (!data_sync_bufs[index].skb)) +if (WARN_ON (!data_sync_bufs[index].skb)) { + ret = -ENOMEM ; goto free_data_skb; + } ep_id = ath6kl_ac2_endpoint_id(wmi->parent_dev, data_sync_bufs[index].
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 204/236 atlantic: Fix driver resume flow.
In reply to Greg Kroah-HartmanFrom: Sudarsana Reddy Kalluru <[email protected]>
[ Upstream commit 57f780f1c43362b86fd23d20bd940e2468237716 ]
Driver crashes when restoring from the Hibernate. In the resume flow, driver need to clean up the older nic/vec objects and re-initialize them.
--- drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c +3 -0
@@ -417,6 +417,9 @@ static int atl_resume_common(struct device *dev, bool deep)pci_restore_state (pdev);if (deep) { +/* Reinitialize Nic/Vecs objects */ +aq_nic_deinit (nic, !nic->aq_hw->aq_nic_cfg->wol); + ret =aq_nic_init (nic);if (ret) goto err_exit;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 205/236 bcma: Fix memory leak for internally-handled cores
In reply to Greg Kroah-HartmanFrom: Zenghui Yu <[email protected]>
[ Upstream commit b63aed3ff195130fef12e0af590f4838cf0201d8 ]
kmemleak reported that dev_name() of internally-handled cores were leaked on driver unbinding. Let's use device_initialize() to take refcounts for them and put_device() to properly free the related stuff.
While looking at it, there's another potential issue for those which should be *registered* into driver core. If device_register() failed, we put device once and freed bcma_device structures. In bcma_unregister_cores(), they're treated as unregistered and we hit both UAF and double-free. That smells not good and has also been fixed now.
--- drivers/bcma/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/bcma/main.c +3 -3
@@ -236,6 +236,7 @@ EXPORT_SYMBOL(bcma_core_irq);void bcma_prepare_core (struct bcma_bus *bus,struct bcma_device *core) { +device_initialize (&core->dev); core->dev.release = bcma_release_core_dev; core->dev.bus = &bcma_bus_type;dev_set_name (&core->dev,"bcma%d:%d" , bus->num, core->core_index);
@@ -277,11 +278,10 @@ static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core) {int err; - err =device_register (&core->dev); + err =device_add (&core->dev);if (err) {bcma_err (bus,"Could not register dev for core 0x%03X\n" , core->id.id); -put_device (&core->dev);return ; } core->dev_registered = true;
@@ -372,7 +372,7 @@ void bcma_unregister_cores(struct bcma_bus *bus)/* Now noone uses internally-handled cores, we can free them */ list_for_each_entry_safe (core, tmp, &bus->cores, list) {list_del (&core->list); -kfree (core); +put_device (&core->dev); } }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 206/236 brcmfmac: pcie: fix oops on failure to resume and reprobe
In reply to Greg Kroah-HartmanFrom: Ahmad Fatoum <[email protected]>
[ Upstream commit d745ca4f2c4ae9f1bd8cf7d8ac6e22d739bffd19 ]
When resuming from suspend, brcmf_pcie_pm_leave_D3 will first attempt a hot resume and then fall back to removing the PCI device and then reprobing. If this probe fails, the kernel will oops, because brcmf_err, which is called to report the failure will dereference the stale bus pointer. Open code and use the default bus-less brcmf_err to avoid this.
--- drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +1 -1
@@ -2073,7 +2073,7 @@ cleanup: err =brcmf_pcie_probe (pdev,NULL );if (err) -brcmf_err (bus,"probe after resume failed, err=%d\n" , err); +__brcmf_err (NULL , __func__,"probe after resume failed, err=%d\n" , err);return err; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 207/236 ipv6: make exception cache less predictible
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit a00df2caffed3883c341d5685f830434312e4a43 ]
Even after commit 4785305c05b2 ("ipv6: use siphash in rt6_exception_hash()"), an attacker can still use brute force to learn some secrets from a victim linux host.
One way to defeat these attacks is to make the max depth of the hash table bucket a random value.
Before this patch, each bucket of the hash table used to store exceptions could contain 6 items under attack.
After the patch, each bucket would contains a random number of items, between 6 and 10. The attacker can no longer infer secrets.
This is slightly increasing memory size used by the hash table, we do not expect this to be a problem.
Following patch is dealing with the same issue in IPv4.
--- net/ipv6/route.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/ipv6/route.c +4 -1
@@ -1655,6 +1655,7 @@ static int rt6_insert_exception(struct rt6_info *nrt,struct in6_addr *src_key =NULL ;struct rt6_exception *rt6_ex;struct fib6_nh *nh = res->nh; +int max_depth;int err =0 ;spin_lock_bh (&rt6_exception_lock);
@@ -1709,7 +1710,9 @@ static int rt6_insert_exception(struct rt6_info *nrt, bucket->depth++; net->ipv6.rt6_stats->fib_rt_cache++; -if (bucket->depth >FIB6_MAX_DEPTH ) +/* Randomize max depth to avoid some side channels attacks. */ + max_depth =FIB6_MAX_DEPTH +prandom_u32_max (FIB6_MAX_DEPTH ); +while (bucket->depth > max_depth)rt6_exception_remove_oldest (bucket); out:
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 208/236 ipv4: make exception cache less predictible
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 67d6d681e15b578c1725bad8ad079e05d1c48a8e ]
Even after commit 6457378fe796 ("ipv4: use siphash instead of Jenkins in fnhe_hashfun()"), an attacker can still use brute force to learn some secrets from a victim linux host.
One way to defeat these attacks is to make the max depth of the hash table bucket a random value.
Before this patch, each bucket of the hash table used to store exceptions could contain 6 items under attack.
After the patch, each bucket would contains a random number of items, between 6 and 10. The attacker can no longer infer secrets.
This is slightly increasing memory size used by the hash table, by 50% in average, we do not expect this to be a problem.
This patch is more complex than the prior one (IPv6 equivalent), because IPv4 was reusing the oldest entry.
Since we need to be able to evict more than one entry per update_or_create_fnhe() call, I had to replace fnhe_oldest() with fnhe_remove_oldest().
Also note that we will queue extra kfree_rcu() calls under stress, which hopefully wont be a too big issue.
--- net/ipv4/route.c | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-)
net/ipv4/route.c +30 -16
@@ -610,18 +610,25 @@ static void fnhe_flush_routes(struct fib_nh_exception *fnhe) } } -static struct fib_nh_exception *fnhe_oldest (struct fnhe_hash_bucket *hash) +static void fnhe_remove_oldest (struct fnhe_hash_bucket *hash) { -struct fib_nh_exception *fnhe, *oldest; +struct fib_nh_exception __rcu **fnhe_p, **oldest_p; +struct fib_nh_exception *fnhe, *oldest =NULL ; - oldest =rcu_dereference (hash->chain); -for (fnhe =rcu_dereference (oldest->fnhe_next); fnhe; - fnhe =rcu_dereference (fnhe->fnhe_next)) { -if (time_before (fnhe->fnhe_stamp, oldest->fnhe_stamp)) +for (fnhe_p = &hash->chain; ; fnhe_p = &fnhe->fnhe_next) { + fnhe =rcu_dereference_protected (*fnhe_p, +lockdep_is_held (&fnhe_lock)); +if (!fnhe) +break ; +if (!oldest || +time_before (fnhe->fnhe_stamp, oldest->fnhe_stamp)) { oldest = fnhe; + oldest_p = fnhe_p; + } }fnhe_flush_routes (oldest); -return oldest; + *oldest_p = oldest->fnhe_next; +kfree_rcu (oldest, rcu); }static u32 fnhe_hashfun (__be32 daddr)
@@ -700,16 +707,21 @@ static void update_or_create_fnhe(struct fib_nh_common *nhc, __be32 daddr,if (rt)fill_route_from_fnhe (rt, fnhe); }else { -if (depth >FNHE_RECLAIM_DEPTH ) - fnhe =fnhe_oldest (hash); -else { - fnhe =kzalloc (sizeof (*fnhe),GFP_ATOMIC ); -if (!fnhe) - goto out_unlock; - - fnhe->fnhe_next = hash->chain; -rcu_assign_pointer (hash->chain, fnhe); +/* Randomize max depth to avoid some side channels attacks. */ +int max_depth =FNHE_RECLAIM_DEPTH + +prandom_u32_max (FNHE_RECLAIM_DEPTH ); + +while (depth > max_depth) { +fnhe_remove_oldest (hash); + depth--; } + + fnhe =kzalloc (sizeof (*fnhe),GFP_ATOMIC ); +if (!fnhe) + goto out_unlock; + + fnhe->fnhe_next = hash->chain; + fnhe->fnhe_genid = genid; fnhe->fnhe_daddr = daddr; fnhe->fnhe_gw = gw;
@@ -717,6 +729,8 @@ static void update_or_create_fnhe(struct fib_nh_common *nhc, __be32 daddr, fnhe->fnhe_mtu_locked = lock; fnhe->fnhe_expires =max (1UL , expires); +rcu_assign_pointer (hash->chain, fnhe); +/* Exception created; mark the cached routes for the nexthop * stale, so anyone caching it rechecks if this exception * applies to them.
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 209/236 net: sched: Fix qdisc_rate_table refcount leak when get tcf_block failed
In reply to Greg Kroah-HartmanFrom: Xiyu Yang <[email protected]>
[ Upstream commit c66070125837900163b81a03063ddd657a7e9bfb ]
The reference counting issue happens in one exception handling path of cbq_change_class(). When failing to get tcf_block, the function forgets to decrease the refcount of "rtab" increased by qdisc_put_rtab(), causing a refcount leak.
Fix this issue by jumping to "failure" label when get tcf_block failed.
--- net/sched/sch_cbq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/sch_cbq.c +1 -1
@@ -1614,7 +1614,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t err =tcf_block_get (&cl->block, &cl->filter_list, sch, extack);if (err) {kfree (cl); -return err; + goto failure; }if (tca[TCA_RATE ]) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 210/236 net: qualcomm: fix QCA7000 checksum handling
In reply to Greg Kroah-HartmanFrom: Stefan Wahren <[email protected]>
[ Upstream commit 429205da6c834447a57279af128bdd56ccd5225e ]
Based on tests the QCA7000 doesn't support checksum offloading. So assume ip_summed is CHECKSUM_NONE and let the kernel take care of the checksum handling. This fixes data transfer issues in noisy environments.
--- drivers/net/ethernet/qualcomm/qca_spi.c | 2 +- drivers/net/ethernet/qualcomm/qca_uart.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/qualcomm/qca_spi.c +1 -1
@@ -434,7 +434,7 @@ qcaspi_receive(struct qcaspi *qca)skb_put (qca->rx_skb, retcode); qca->rx_skb->protocol =eth_type_trans ( qca->rx_skb, qca->rx_skb->dev); - qca->rx_skb->ip_summed =CHECKSUM_UNNECESSARY ; +skb_checksum_none_assert (qca->rx_skb);netif_rx_ni (qca->rx_skb); qca->rx_skb =netdev_alloc_skb_ip_align (net_dev, net_dev->mtu +VLAN_ETH_HLEN );
drivers/net/ethernet/qualcomm/qca_uart.c +1 -1
@@ -107,7 +107,7 @@ qca_tty_receive(struct serdev_device *serdev, const unsigned char *data,skb_put (qca->rx_skb, retcode); qca->rx_skb->protocol =eth_type_trans ( qca->rx_skb, qca->rx_skb->dev); - qca->rx_skb->ip_summed =CHECKSUM_UNNECESSARY ; +skb_checksum_none_assert (qca->rx_skb);netif_rx_ni (qca->rx_skb); qca->rx_skb = netdev_alloc_skb_ip_align(netdev, netdev->mtu +
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 211/236 octeontx2-af: Fix loop in free and unmap counter
In reply to Greg Kroah-HartmanFrom: Subbaraya Sundeep <[email protected]>
[ Upstream commit 6537e96d743b89294b397b4865c6c061abae31b0 ]
When the given counter does not belong to the entry then code ends up in infinite loop because the loop cursor, entry is not getting updated further. This patch fixes that by updating entry for every iteration.
--- drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c +2 -1
@@ -2081,10 +2081,11 @@ int rvu_mbox_handler_npc_mcam_unmap_counter(struct rvu *rvu, index =find_next_bit (mcam->bmap, mcam->bmap_entries, entry);if (index >= mcam->bmap_entries)break ; + entry = index +1 ; +if (mcam->entry2cntr_map[index] != req->cntr)continue ; - entry = index +1 ;npc_unmap_mcam_entry_and_cntr (rvu, mcam, blkaddr, index, req->cntr); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 212/236 octeontx2-af: Fix static code analyzer reported issues
In reply to Greg Kroah-HartmanFrom: Subbaraya Sundeep <[email protected]>
[ Upstream commit 698a82ebfb4b2f2014baf31b7324b328a2a6366e ]
This patch fixes the static code analyzer reported issues in rvu_npc.c. The reported errors are different sizes of operands in bitops and returning uninitialized values.
--- drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c +3 -3
@@ -27,7 +27,7 @@#define NIXLF_PROMISC_ENTRY 2#define NPC_PARSE_RESULT_DMAC_OFFSET 8 -#define NPC_HW_TSTAMP_OFFSET 8 +#define NPC_HW_TSTAMP_OFFSET 8ULLstatic const char def_pfl_name[] ="default" ;
@@ -1318,7 +1318,7 @@ static void npc_unmap_mcam_entry_and_cntr(struct rvu *rvu, int blkaddr, u16 entry, u16 cntr) { u16 index = entry & (mcam->banksize - 1); -u16 bank =npc_get_bank (mcam, entry); +u32 bank =npc_get_bank (mcam, entry);/* Remove mapping and reduce counter's refcnt */ mcam->entry2cntr_map[entry] =NPC_MCAM_INVALID_MAP ;
@@ -1879,8 +1879,8 @@ int rvu_mbox_handler_npc_mcam_shift_entry(struct rvu *rvu,struct npc_mcam *mcam = &rvu->hw->mcam;u16 pcifunc = req->hdr.pcifunc;u16 old_entry, new_entry; +int blkaddr, rc =0 ;u16 index, cntr; -int blkaddr, rc; blkaddr =rvu_get_blkaddr (rvu,BLKTYPE_NPC ,0 );if (blkaddr <0 )
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 213/236 octeontx2-af: Set proper errorcode for IPv4 checksum errors
In reply to Greg Kroah-HartmanFrom: Sunil Goutham <[email protected]>
[ Upstream commit 1e4428b6dba9b683dc2ec0a56ed7879de3200cce ]
With current config, for packets with IPv4 checksum errors, errorcode is being set to UNKNOWN. Hence added a separate errorcodes for outer and inner IPv4 checksum and changed NPC configuration accordingly.
Also turn on L2 multicast address check in NPC protocol check block.
--- drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c +4 -3
@@ -1171,14 +1171,15 @@ int rvu_npc_init(struct rvu *rvu)/* Enable below for Rx pkts. * - Outer IPv4 header checksum validation. -* - Detect outer L2 broadcast address and set NPC_RESULT_S[L2M]. +* - Detect outer L2 broadcast address and set NPC_RESULT_S[L2B]. +* - Detect outer L2 multicast address and set NPC_RESULT_S[L2M]. * - Inner IPv4 header checksum validation. * - Set non zero checksum error code value */ rvu_write64 (rvu, blkaddr,NPC_AF_PCK_CFG ,rvu_read64 (rvu, blkaddr,NPC_AF_PCK_CFG ) | -BIT_ULL (32 ) |BIT_ULL (24 ) |BIT_ULL (6 ) | -BIT_ULL (2 ) |BIT_ULL (1 )); + ((u64 )NPC_EC_OIP4_CSUM <<32 ) | (NPC_EC_IIP4_CSUM <<24 ) | +BIT_ULL (7 ) |BIT_ULL (6 ) |BIT_ULL (2 ) |BIT_ULL (1 ));/* Set RX and TX side MCAM search key size. * LA..LD (ltype only) + Channel
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 214/236 ipv4: fix endianness issue in inet_rtm_getroute_build_skb()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 92548b0ee220e000d81c27ac9a80e0ede895a881 ]
The UDP length field should be in network order.
This removes the following sparse error:
net/ipv4/route.c:3173:27: warning: incorrect type in assignment (different base types)net/ipv4/route.c:3173:27: expected restricted __be16 [usertype] lennet/ipv4/route.c:3173:27: got unsigned long
--- net/ipv4/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/route.c +1 -1
@@ -3078,7 +3078,7 @@ static struct sk_buff *inet_rtm_getroute_build_skb(__be32 src, __be32 dst, udph =skb_put_zero (skb,sizeof (struct udphdr )); udph->source = sport; udph->dest = dport; - udph->len =sizeof (struct udphdr ); + udph->len =htons (sizeof (struct udphdr )); udph->check =0 ;break ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 215/236 ASoC: rt5682: Remove unused variable in rt5682_i2c_remove()
In reply to Greg Kroah-HartmanFrom: Douglas Anderson <[email protected]>
commit a1ea05723c27a6f77894a60038a7b2b12fcec9a7 upstream.
In commit 772d44526e20 ("ASoC: rt5682: Properly turn off regulators if wrong device ID") I deleted code but forgot to delete a variable that's now unused. Delete it.
--- sound/soc/codecs/rt5682-i2c.c | 2 -- 1 file changed, 2 deletions(-)
sound/soc/codecs/rt5682-i2c.c +0 -2
@@ -289,8 +289,6 @@ static void rt5682_i2c_shutdown(struct istatic int rt5682_i2c_remove (struct i2c_client *client) { -struct rt5682_priv *rt5682 =i2c_get_clientdata (client); -rt5682_i2c_shutdown (client);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 216/236 iwlwifi Add support for ax201 in Samsung Galaxy Book Flex2 Alpha
In reply to Greg Kroah-HartmanFrom: Justin M. Forbes <[email protected]>
commit 2f32c147a3816d789722c0bd242a9431332ec3ed upstream.
The Samsung Galaxy Book Flex2 Alpha uses an ax201 with the ID a0f0/6074. This works fine with the existing driver once it knows to claim it. Simple patch to add the device.
--- drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/intel/iwlwifi/pcie/drv.c +1 -0
@@ -646,6 +646,7 @@ static const struct iwl_dev_info iwl_devIWL_DEV_INFO (0xA0F0 ,0x1652 , killer1650i_2ax_cfg_qu_b0_hr_b0,NULL ),IWL_DEV_INFO (0xA0F0 ,0x2074 , iwl_ax201_cfg_qu_hr,NULL ),IWL_DEV_INFO (0xA0F0 ,0x4070 , iwl_ax201_cfg_qu_hr,NULL ), +IWL_DEV_INFO (0xA0F0 ,0x6074 , iwl_ax201_cfg_qu_hr,NULL ),IWL_DEV_INFO (0x02F0 ,0x0070 , iwl_ax201_cfg_quz_hr,NULL ),IWL_DEV_INFO (0x02F0 ,0x0074 , iwl_ax201_cfg_quz_hr,NULL ), IWL_DEV_INFO(0x02F0, 0x6074, iwl_ax201_cfg_quz_hr, NULL),
Greg Kroah-Hartman
maintainerPATCH 217/236 f2fs: guarantee to write dirty data when enabling checkpoint back
In reply to Greg Kroah-HartmanFrom: Jaegeuk Kim <[email protected]>
commit dddd3d65293a52c2c3850c19b1e5115712e534d8 upstream.
We must flush all the dirty data when enabling checkpoint back. Let's guarantee that first by adding a retry logic on sync_inodes_sb(). In addition to that, this patch adds to flush data in fsync when checkpoint is disabled, which can mitigate the sync_inodes_sb() failures in advance.
--- fs/f2fs/file.c | 5 ++--- fs/f2fs/super.c | 11 ++++++++++- 2 files changed, 12 insertions(+), 4 deletions(-)
fs/f2fs/file.c +2 -3
@@ -259,8 +259,7 @@ static int f2fs_do_sync_file(struct file };unsigned int seq_id =0 ; -if (unlikely (f2fs_readonly (inode->i_sb) || -is_sbi_flag_set (sbi,SBI_CP_DISABLED ))) +if (unlikely (f2fs_readonly (inode->i_sb)))return 0 ;trace_f2fs_sync_file_enter (inode);
@@ -274,7 +273,7 @@ static int f2fs_do_sync_file(struct file ret =file_write_and_wait_range (file, start, end);clear_inode_flag (inode,FI_NEED_IPU ); -if (ret) { +if (ret ||is_sbi_flag_set (sbi,SBI_CP_DISABLED )) {trace_f2fs_sync_file_exit (inode, cp_reason, datasync, ret);return ret; }
fs/f2fs/super.c +10 -1
@@ -1764,8 +1764,17 @@ restore_flag:static void f2fs_enable_checkpoint (struct f2fs_sb_info *sbi) { +int retry =DEFAULT_RETRY_IO_COUNT ; +/* we should flush all the data to keep data consistency */ -sync_inodes_sb (sbi->sb); +do { +sync_inodes_sb (sbi->sb); +cond_resched (); +congestion_wait (BLK_RW_ASYNC ,DEFAULT_IO_TIMEOUT ); + }while (get_pages (sbi,F2FS_DIRTY_DATA ) && retry--); + +if (unlikely (retry <0 )) +f2fs_warn (sbi,"checkpoint=enable has some unwritten data." );down_write (&sbi->gc_lock);f2fs_dirty_to_prefree (sbi);
Greg Kroah-Hartman
maintainerPATCH 218/236 time: Handle negative seconds correctly in timespec64_to_ns()
In reply to Greg Kroah-HartmanFrom: Lukas Hannen <[email protected]>
commit 39ff83f2f6cc5cc1458dfcea9697f96338210beb upstream.
timespec64_ns() prevents multiplication overflows by comparing the seconds value of the timespec to KTIME_SEC_MAX. If the value is greater or equal it returns KTIME_MAX.
But that check casts the signed seconds value to unsigned which makes the comparision true for all negative values and therefore return wrongly KTIME_MAX.
Negative second values are perfectly valid and required in some places, e.g. ptp_clock_adjtime().
Remove the cast and add a check for the negative boundary which is required to prevent undefined behaviour due to multiplication underflow.
--- include/linux/time64.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
include/linux/time64.h +7 -2
@@ -25,7 +25,9 @@ struct itimerspec64 {#define TIME64_MIN (-TIME64_MAX - 1)#define KTIME_MAX ((s64)~((u64)1 << 63)) +#define KTIME_MIN (-KTIME_MAX - 1)#define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) +#define KTIME_SEC_MIN (KTIME_MIN / NSEC_PER_SEC)/* * Limits for settimeofday():
@@ -124,10 +126,13 @@ static inline bool timespec64_valid_sett*/ static inline s64 timespec64_to_ns (const struct timespec64 *ts) { -/* Prevent multiplication overflow */ -if ((unsigned long long )ts->tv_sec >=KTIME_SEC_MAX ) +/* Prevent multiplication overflow / underflow */ +if (ts->tv_sec >=KTIME_SEC_MAX )return KTIME_MAX ; +if (ts->tv_sec <=KTIME_SEC_MIN ) +return KTIME_MIN ; +return ((s64 ) ts->tv_sec *NSEC_PER_SEC ) + ts->tv_nsec; }
Greg Kroah-Hartman
maintainerPATCH 219/236 io_uring: IORING_OP_WRITE needs hash_reg_file set
In reply to Greg Kroah-HartmanFrom: Jens Axboe <[email protected]>
commit 7b3188e7ed54102a5dcc73d07727f41fb528f7c8 upstream.
During some testing, it became evident that using IORING_OP_WRITE doesn't hash buffered writes like the other writes commands do. That's simply an oversight, and can cause performance regressions when doing buffered writes with this command.
Correct that and add the flag, so that buffered writes are correctly hashed when using the non-iovec based write command.
--- fs/io_uring.c | 1 + 1 file changed, 1 insertion(+)
fs/io_uring.c +1 -0
@@ -889,6 +889,7 @@ static const struct io_op_def io_op_defs }, [IORING_OP_WRITE] = { .needs_file = 1, + .hash_reg_file = 1, .unbound_nonreg_file = 1, .pollout = 1, .async_size = sizeof(struct io_async_rw),
Greg Kroah-Hartman
maintainerPATCH 220/236 bio: fix page leak bio_add_hw_page failure
In reply to Greg Kroah-HartmanFrom: Pavel Begunkov <[email protected]>
commit d9cf3bd531844ffbfe94b16e417037a16efc988d upstream.
__bio_iov_append_get_pages() doesn't put not appended pages on bio_add_hw_page() failure, so potentially leaking them, fix it. Also, do the same for __bio_iov_iter_get_pages(), even though it looks like it can't be triggered by userspace in this case.
--- block/bio.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
block/bio.c +13 -2
@@ -978,6 +978,14 @@ static int __bio_iov_bvec_add_pages(strureturn 0 ; } +static void bio_put_pages (struct page **pages,size_t size,size_t off) +{ +size_t i, nr =DIV_ROUND_UP (size + (off & ~PAGE_MASK ),PAGE_SIZE ); + +for (i =0 ; i < nr; i++) +put_page (pages[i]); +} +#define PAGE_PTRS_PER_BVEC (sizeof(struct bio_vec) / sizeof(struct page *))/**
@@ -1022,8 +1030,10 @@ static int __bio_iov_iter_get_pages(struif (same_page)put_page (page); }else { -if (WARN_ON_ONCE (bio_full (bio, len))) -return -EINVAL ; +if (WARN_ON_ONCE (bio_full (bio, len))) { +bio_put_pages (pages + i, left, offset); +return -EINVAL ; + }__bio_add_page (bio, page, len, offset); } offset =0 ;
@@ -1068,6 +1078,7 @@ static int __bio_iov_append_get_pages(st len =min_t (size_t,PAGE_SIZE - offset, left);if (bio_add_hw_page (q, bio, page, len, offset, max_append_sectors, &same_page) != len) { +bio_put_pages (pages + i, left, offset); ret = -EINVAL ;break ; }
Greg Kroah-Hartman
maintainerPATCH 221/236 tty: Fix data race between tiocsti() and flush_to_ldisc()
In reply to Greg Kroah-HartmanFrom: Nguyen Dinh Phi <[email protected]>
commit bb2853a6a421a052268eee00fd5d3f6b3504b2b1 upstream.
The ops->receive_buf() may be accessed concurrently from these two functions. If the driver flushes data to the line discipline receive_buf() method while tiocsti() is waiting for the ops->receive_buf() to finish its work, the data race will happen.
For example:tty_ioctl |tty_ldisc_receive_buf
->tioctsi | ->tty_port_default_receive_buf
| ->tty_ldisc_receive_buf
->hci_uart_tty_receive | ->hci_uart_tty_receive
->h4_recv | ->h4_recvIn this case, the h4 receive buffer will be overwritten by the latecomer, and we will lost the data.
Hence, change tioctsi() function to use the exclusive lock interface from tty_buffer to avoid the data race.
--- drivers/tty/tty_io.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/tty/tty_io.c +2 -2
@@ -2257,8 +2257,6 @@ static int tty_fasync(int fd, struct fil* Locking: * Called functions take tty_ldiscs_lock * current->signal->tty check is safe without locks -* -* FIXME: may race normal receive processing */ static int tiocsti (struct tty_struct *tty,char __user *p)
@@ -2274,8 +2272,10 @@ static int tiocsti(struct tty_struct *tt ld =tty_ldisc_ref_wait (tty);if (!ld)return -EIO ; +tty_buffer_lock_exclusive (tty->port);if (ld->ops->receive_buf) ld->ops->receive_buf (tty, &ch, &mbz,1 ); +tty_buffer_unlock_exclusive (tty->port);tty_ldisc_deref (ld);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 222/236 perf/x86/amd/ibs: Extend PERF_PMU_CAP_NO_EXCLUDE to IBS Op
In reply to Greg Kroah-HartmanFrom: Kim Phillips <[email protected]>
commit f11dd0d80555cdc8eaf5cfc9e19c9e198217f9f1 upstream.
Commit:
2ff40250691e ("perf/core, arch/x86: Use PERF_PMU_CAP_NO_EXCLUDE for exclusion incapable PMUs")
neglected to do so.
--- arch/x86/events/amd/ibs.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/events/amd/ibs.c +1 -0
@@ -571,6 +571,7 @@ static struct perf_ibs perf_ibs_op = { .start = perf_ibs_start, .stop = perf_ibs_stop, .read = perf_ibs_read, + .capabilities = PERF_PMU_CAP_NO_EXCLUDE, }, .msr = MSR_AMD64_IBSOPCTL, .config_mask = IBS_OP_CONFIG_MASK,
Greg Kroah-Hartman
maintainerPATCH 223/236 x86/resctrl: Fix a maybe-uninitialized build warning treated as error
In reply to Greg Kroah-HartmanFrom: Babu Moger <[email protected]>
commit 527f721478bce3f49b513a733bacd19d6f34b08c upstream.
The recent commit
064855a69003 ("x86/resctrl: Fix default monitoring groups reporting")
caused a RHEL build failure with an uninitialized variable warning treated as an error because it removed the default case snippet.
The RHEL Makefile uses '-Werror=maybe-uninitialized' to force possibly uninitialized variable warnings to be treated as errors. This is also reported by smatch via the 0day robot.
The error from the RHEL build is:
arch/x86/kernel/cpu/resctrl/monitor.c: In function ‘__mon_event_count’:
arch/x86/kernel/cpu/resctrl/monitor.c:261:12: error: ‘m’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
m->chunks += chunks;
^~The upstream Makefile does not build using '-Werror=maybe-uninitialized'. So, the problem is not seen there. Fix the problem by putting back the default case snippet.
[ bp: note that there's nothing wrong with the code and other compilers
do not trigger this warning - this is being done just so the RHEL compiler is happy. ]
--- arch/x86/kernel/cpu/resctrl/monitor.c | 6 ++++++ 1 file changed, 6 insertions(+)
arch/x86/kernel/cpu/resctrl/monitor.c +6 -0
@@ -241,6 +241,12 @@ static u64 __mon_event_count(u32 rmid, scase QOS_L3_MBM_LOCAL_EVENT_ID : m = &rr->d->mbm_local[rmid];break ; +default : +/* +* Code would never reach here because an invalid +* event id would fail the __rmid_read. +*/ +return RMID_VAL_ERROR ; }if (rr->first) {
Greg Kroah-Hartman
maintainerPATCH 224/236 Revert "KVM: x86: mmu: Add guest physical address check in translate_gpa()"
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit e7177339d7b5f9594b316842122b5fda9513d5e2 upstream.
Revert a misguided illegal GPA check when "translating" a non-nested GPA. The check is woefully incomplete as it does not fill in @exception as expected by all callers, which leads to KVM attempting to inject a bogus exception, potentially exposing kernel stack information in the process.
WARNING: CPU: 0 PID: 8469 at arch/x86/kvm/x86.c:525 exception_type+0x98/0xb0 arch/x86/kvm/x86.c:525 CPU: 1 PID: 8469 Comm: syz-executor531 Not tainted 5.14.0-rc7-syzkaller #0 RIP: 0010:exception_type+0x98/0xb0 arch/x86/kvm/x86.c:525 Call Trace: x86_emulate_instruction+0xef6/0x1460 arch/x86/kvm/x86.c:7853 kvm_mmu_page_fault+0x2f0/0x1810 arch/x86/kvm/mmu/mmu.c:5199 handle_ept_misconfig+0xdf/0x3e0 arch/x86/kvm/vmx/vmx.c:5336 __vmx_handle_exit arch/x86/kvm/vmx/vmx.c:6021 [inline] vmx_handle_exit+0x336/0x1800 arch/x86/kvm/vmx/vmx.c:6038 vcpu_enter_guest+0x2a1c/0x4430 arch/x86/kvm/x86.c:9712 vcpu_run arch/x86/kvm/x86.c:9779 [inline] kvm_arch_vcpu_ioctl_run+0x47d/0x1b20 arch/x86/kvm/x86.c:10010 kvm_vcpu_ioctl+0x49e/0xe50 arch/x86/kvm/../../../virt/kvm/kvm_main.c:3652
The bug has escaped notice because practically speaking the GPA check is useless. The GPA check in question only comes into play when KVM is walking guest page tables (or "translating" CR3), and KVM already handles illegal GPA checks by setting reserved bits in rsvd_bits_mask for each PxE, or in the case of CR3 for loading PTDPTRs, manually checks for an illegal CR3. This particular failure doesn't hit the existing reserved bits checks because syzbot sets guest.MAXPHYADDR=1, and IA32 architecture simply doesn't allow for such an absurd MAXPHYADDR, e.g. 32-bit paging doesn't define any reserved PA bits checks, which KVM emulates by only incorporating the reserved PA bits into the "high" bits, i.e. bits 63:32.
Simply remove the bogus check. There is zero meaningful value and no architectural justification for supporting guest.MAXPHYADDR < 32, and properly filling the exception would introduce non-trivial complexity.
This reverts commit ec7771ab471ba6a945350353617e2e3385d0e013.
Message-Id: <[email protected]>
--- arch/x86/kvm/mmu/mmu.c | 6 ------ 1 file changed, 6 deletions(-)
arch/x86/kvm/mmu/mmu.c +0 -6
@@ -267,12 +267,6 @@ static bool check_mmio_spte(struct kvm_vstatic gpa_t translate_gpa (struct kvm_vcpu *vcpu,gpa_t gpa,u32 access,struct x86_exception *exception) { -/* Check if guest physical address doesn't exceed guest maximum */ -if (kvm_vcpu_is_illegal_gpa (vcpu, gpa)) { - exception->error_code |=PFERR_RSVD_MASK ; -return UNMAPPED_GVA ; - } -return gpa; }
Greg Kroah-Hartman
maintainerPATCH 225/236 KVM: s390: index kvm->arch.idle_mask by vcpu_idx
In reply to Greg Kroah-HartmanFrom: Halil Pasic <[email protected]>
commit a3e03bc1368c1bc16e19b001fc96dc7430573cc8 upstream.
While in practice vcpu->vcpu_idx == vcpu->vcp_id is often true, it may not always be, and we must not rely on this. Reason is that KVM decides the vcpu_idx, userspace decides the vcpu_id, thus the two might not match.
Currently kvm->arch.idle_mask is indexed by vcpu_id, which implies that code like
for_each_set_bit(vcpu_id, kvm->arch.idle_mask, online_vcpus) {
vcpu = kvm_get_vcpu(kvm, vcpu_id);
do_stuff(vcpu);
}is not legit. Reason is that kvm_get_vcpu expects an vcpu_idx, not an vcpu_id. The trouble is, we do actually use kvm->arch.idle_mask like this. To fix this problem we have two options. Either use kvm_get_vcpu_by_id(vcpu_id), which would loop to find the right vcpu_id, or switch to indexing via vcpu_idx. The latter is preferable for obvious reasons.
Let us make switch from indexing kvm->arch.idle_mask by vcpu_id to indexing it by vcpu_idx. To keep gisa_int.kicked_mask indexed by the same index as idle_mask lets make the same change for it as well.
--- arch/s390/include/asm/kvm_host.h | 1 + arch/s390/kvm/interrupt.c | 12 ++++++------ arch/s390/kvm/kvm-s390.c | 2 +- arch/s390/kvm/kvm-s390.h | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-)
arch/s390/include/asm/kvm_host.h +1 -0
@@ -957,6 +957,7 @@ struct kvm_arch{atomic64_t cmma_dirty_pages;/* subset of available cpu features enabled by user space */ DECLARE_BITMAP (cpu_feat,KVM_S390_VM_CPU_FEAT_NR_BITS ); +/* indexed by vcpu_idx */ DECLARE_BITMAP (idle_mask,KVM_MAX_VCPUS );struct kvm_s390_gisa_interrupt gisa_int;struct kvm_s390_pv pv;
arch/s390/kvm/interrupt.c +6 -6
@@ -419,13 +419,13 @@ static unsigned long deliverable_irqs(ststatic void __set_cpu_idle (struct kvm_vcpu *vcpu) {kvm_s390_set_cpuflags (vcpu,CPUSTAT_WAIT ); -set_bit (vcpu->vcpu_id, vcpu->kvm->arch.idle_mask); +set_bit (kvm_vcpu_get_idx (vcpu), vcpu->kvm->arch.idle_mask); }static void __unset_cpu_idle (struct kvm_vcpu *vcpu) {kvm_s390_clear_cpuflags (vcpu,CPUSTAT_WAIT ); -clear_bit (vcpu->vcpu_id, vcpu->kvm->arch.idle_mask); +clear_bit (kvm_vcpu_get_idx (vcpu), vcpu->kvm->arch.idle_mask); }static void __reset_intercept_indicators (struct kvm_vcpu *vcpu)
@@ -3050,18 +3050,18 @@ int kvm_s390_get_irq_state(struct kvm_vcstatic void __airqs_kick_single_vcpu (struct kvm *kvm,u8 deliverable_mask) { -int vcpu_id, online_vcpus =atomic_read (&kvm->online_vcpus); +int vcpu_idx, online_vcpus =atomic_read (&kvm->online_vcpus);struct kvm_s390_gisa_interrupt *gi = &kvm->arch.gisa_int;struct kvm_vcpu *vcpu; -for_each_set_bit (vcpu_id, kvm->arch.idle_mask, online_vcpus) { - vcpu =kvm_get_vcpu (kvm, vcpu_id); +for_each_set_bit (vcpu_idx, kvm->arch.idle_mask, online_vcpus) { + vcpu =kvm_get_vcpu (kvm, vcpu_idx);if (psw_ioint_disabled (vcpu))continue ; deliverable_mask &= (u8)(vcpu->arch.sie_block->gcr[6 ] >>24 );if (deliverable_mask) {/* lately kicked but not yet running */ -if (test_and_set_bit (vcpu_id, gi->kicked_mask)) +if (test_and_set_bit (vcpu_idx, gi->kicked_mask))return ;kvm_s390_vcpu_wakeup (vcpu);return ;
arch/s390/kvm/kvm-s390.c +1 -1
@@ -4015,7 +4015,7 @@ static int vcpu_pre_run(struct kvm_vcpukvm_s390_patch_guest_per_regs (vcpu); } -clear_bit (vcpu->vcpu_id, vcpu->kvm->arch.gisa_int.kicked_mask); +clear_bit (kvm_vcpu_get_idx (vcpu), vcpu->kvm->arch.gisa_int.kicked_mask); vcpu->arch.sie_block->icptcode =0 ; cpuflags =atomic_read (&vcpu->arch.sie_block->cpuflags);
arch/s390/kvm/kvm-s390.h +1 -1
@@ -79,7 +79,7 @@ static inline int is_vcpu_stopped(structstatic inline int is_vcpu_idle (struct kvm_vcpu *vcpu) { -return test_bit (vcpu->vcpu_id, vcpu->kvm->arch.idle_mask); +return test_bit (kvm_vcpu_get_idx (vcpu), vcpu->kvm->arch.idle_mask); }static inline int kvm_is_ucontrol (struct kvm *kvm)
Greg Kroah-Hartman
maintainerPATCH 226/236 KVM: x86: Update vCPUs hv_clock before back to guest when tsc_offset is adjusted
In reply to Greg Kroah-HartmanFrom: Zelin Deng <[email protected]>
commit d9130a2dfdd4b21736c91b818f87dbc0ccd1e757 upstream.
When MSR_IA32_TSC_ADJUST is written by guest due to TSC ADJUST feature especially there's a big tsc warp (like a new vCPU is hot-added into VM which has been up for a long time), tsc_offset is added by a large value then go back to guest. This causes system time jump as tsc_timestamp is not adjusted in the meantime and pvclock monotonic character. To fix this, just notify kvm to update vCPU's guest time before back to guest.
Message-Id: <[email protected]>
--- arch/x86/kvm/x86.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/x86/kvm/x86.c +4 -0
@@ -3116,6 +3116,10 @@ int kvm_set_msr_common(struct kvm_vcpu *if (!msr_info->host_initiated) {s64 adj = data - vcpu->arch.ia32_tsc_adjust_msr;adjust_tsc_offset_guest (vcpu, adj); +/* Before back to guest, tsc_timestamp must be adjusted +* as well, otherwise guest's percpu pvclock time could jump. +*/ +kvm_make_request (KVM_REQ_CLOCK_UPDATE , vcpu); } vcpu->arch.ia32_tsc_adjust_msr = data; }
Greg Kroah-Hartman
maintainerPATCH 227/236 KVM: VMX: avoid running vmx_handle_exit_irqoff in case of emulation
In reply to Greg Kroah-HartmanFrom: Maxim Levitsky <[email protected]>
commit 81b4b56d4f8130bbb99cf4e2b48082e5b4cfccb9 upstream.
If we are emulating an invalid guest state, we don't have a correct exit reason, and thus we shouldn't do anything in this function.
Message-Id: <[email protected]>
--- arch/x86/kvm/vmx/vmx.c | 3 +++ 1 file changed, 3 insertions(+)
arch/x86/kvm/vmx/vmx.c +3 -0
@@ -6396,6 +6396,9 @@ static void vmx_handle_exit_irqoff(struc {struct vcpu_vmx *vmx =to_vmx (vcpu); +if (vmx->emulation_required) +return ; +if (vmx->exit_reason.basic ==EXIT_REASON_EXTERNAL_INTERRUPT )handle_external_interrupt_irqoff (vcpu);else if (vmx->exit_reason.basic ==EXIT_REASON_EXCEPTION_NMI )
Greg Kroah-Hartman
maintainerPATCH 228/236 KVM: nVMX: Unconditionally clear nested.pi_pending on nested VM-Enter
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit f7782bb8d818d8f47c26b22079db10599922787a upstream.
Clear nested.pi_pending on nested VM-Enter even if L2 will run without posted interrupts enabled. If nested.pi_pending is left set from a previous L2, vmx_complete_nested_posted_interrupt() will pick up the stale flag and exit to userspace with an "internal emulation error" due the new L2 not having a valid nested.pi_desc.
Arguably, vmx_complete_nested_posted_interrupt() should first check for posted interrupts being enabled, but it's also completely reasonable that KVM wouldn't screw up a fundamental flag. Not to mention that the mere existence of nested.pi_pending is a long-standing bug as KVM shouldn't move the posted interrupt out of the IRR until it's actually processed, e.g. KVM effectively drops an interrupt when it performs a nested VM-Exit with a "pending" posted interrupt. Fixing the mess is a future problem.
Prior to vmx_complete_nested_posted_interrupt() interpreting a null PI descriptor as an error, this was a benign bug as the null PI descriptor effectively served as a check on PI not being enabled. Even then, the new flow did not become problematic until KVM started checking the result of kvm_check_nested_events().
Message-Id: <[email protected]>
--- arch/x86/kvm/vmx/nested.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
arch/x86/kvm/vmx/nested.c +3 -4
@@ -2243,12 +2243,11 @@ static void prepare_vmcs02_early(struct ~PIN_BASED_VMX_PREEMPTION_TIMER);/* Posted interrupts setting is only taken from vmcs12. */ -if (nested_cpu_has_posted_intr (vmcs12)) { + vmx->nested.pi_pending = false; +if (nested_cpu_has_posted_intr (vmcs12)) vmx->nested.posted_intr_nv = vmcs12->posted_intr_nv; - vmx->nested.pi_pending = false; - }else { +else exec_control &= ~PIN_BASED_POSTED_INTR ; - }pin_controls_set (vmx, exec_control);/*
Greg Kroah-Hartman
maintainerPATCH 229/236 ARM: dts: at91: add pinctrl-{names, 0} for all gpios
In reply to Greg Kroah-HartmanFrom: Claudiu Beznea <[email protected]>
commit bf781869e5cf3e4ec1a47dad69b6f0df97629cbd upstream.
Add pinctrl-names and pinctrl-0 properties on controllers that claims to use pins to avoid failures due to
commit 2ab73c6d8323 ("gpio: Support GPIO controllers without pin-ranges") and also to avoid using pins that may be claimed my other IPs.
--- arch/arm/boot/dts/at91-sam9x60ek.dts | 16 ++++++++++++++- arch/arm/boot/dts/at91-sama5d3_xplained.dts | 29 ++++++++++++++++++++++++++++ arch/arm/boot/dts/at91-sama5d4_xplained.dts | 19 ++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-)
arch/arm/boot/dts/at91-sam9x60ek.dts +15 -1
@@ -92,6 +92,8 @@ leds { compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_gpio_leds>; status = "okay"; /* Conflict with pwm0. */ red {
@@ -537,6 +539,10 @@ AT91_PIOA 19 AT91_PERIPH_A (AT91_PINCTRL_PULL_UP | AT91_PINCTRL_DRIVE_STRENGTH_HI) /* PA19 DAT2 periph A with pullup */ AT91_PIOA 20 AT91_PERIPH_A (AT91_PINCTRL_PULL_UP | AT91_PINCTRL_DRIVE_STRENGTH_HI)>; /* PA20 DAT3 periph A with pullup */ }; + pinctrl_sdmmc0_cd: sdmmc0_cd { + atmel,pins = + <AT91_PIOA 23 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; + }; }; sdmmc1 {
@@ -569,6 +575,14 @@ AT91_PIOD 16 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; }; }; + + leds { + pinctrl_gpio_leds: gpio_leds { + atmel,pins = <AT91_PIOB 11 AT91_PERIPH_GPIO AT91_PINCTRL_NONE + AT91_PIOB 12 AT91_PERIPH_GPIO AT91_PINCTRL_NONE + AT91_PIOB 13 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; + }; + }; }; /* pinctrl */ &pwm0 {
@@ -580,7 +594,7 @@ &sdmmc0 { bus-width = <4>; pinctrl-names = "default"; - pinctrl-0 = <&pinctrl_sdmmc0_default>; + pinctrl-0 = <&pinctrl_sdmmc0_default &pinctrl_sdmmc0_cd>; status = "okay"; cd-gpios = <&pioA 23 GPIO_ACTIVE_LOW>; disable-wp;
arch/arm/boot/dts/at91-sama5d3_xplained.dts +29 -0
@@ -57,6 +57,8 @@ }; spi0: spi@f0004000 { + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_spi0_cs>; cs-gpios = <&pioD 13 0>, <0>, <0>, <&pioD 16 0>; status = "okay"; };
@@ -169,6 +171,8 @@ }; spi1: spi@f8008000 { + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_spi1_cs>; cs-gpios = <&pioC 25 0>; status = "okay"; };
@@ -248,6 +252,26 @@ <AT91_PIOE 3 AT91_PERIPH_GPIO AT91_PINCTRL_NONE AT91_PIOE 4 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; }; + + pinctrl_gpio_leds: gpio_leds_default { + atmel,pins = + <AT91_PIOE 23 AT91_PERIPH_GPIO AT91_PINCTRL_NONE + AT91_PIOE 24 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; + }; + + pinctrl_spi0_cs: spi0_cs_default { + atmel,pins = + <AT91_PIOD 13 AT91_PERIPH_GPIO AT91_PINCTRL_NONE + AT91_PIOD 16 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; + }; + + pinctrl_spi1_cs: spi1_cs_default { + atmel,pins = <AT91_PIOC 25 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; + }; + + pinctrl_vcc_mmc0_reg_gpio: vcc_mmc0_reg_gpio_default { + atmel,pins = <AT91_PIOE 2 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; + }; }; }; };
@@ -339,6 +363,8 @@ vcc_mmc0_reg: fixedregulator_mmc0 { compatible = "regulator-fixed"; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_vcc_mmc0_reg_gpio>; gpio = <&pioE 2 GPIO_ACTIVE_LOW>; regulator-name = "mmc0-card-supply"; regulator-min-microvolt = <3300000>;
@@ -362,6 +388,9 @@ leds { compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_gpio_leds>; + status = "okay"; d2 { label = "d2";
arch/arm/boot/dts/at91-sama5d4_xplained.dts +19 -0
@@ -90,6 +90,8 @@ }; spi1: spi@fc018000 { + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_spi0_cs>; cs-gpios = <&pioB 21 0>; status = "okay"; };
@@ -147,6 +149,19 @@ atmel,pins = <AT91_PIOE 1 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; }; + pinctrl_spi0_cs: spi0_cs_default { + atmel,pins = + <AT91_PIOB 21 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; + }; + pinctrl_gpio_leds: gpio_leds_default { + atmel,pins = + <AT91_PIOD 30 AT91_PERIPH_GPIO AT91_PINCTRL_NONE + AT91_PIOE 15 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; + }; + pinctrl_vcc_mmc1_reg: vcc_mmc1_reg { + atmel,pins = + <AT91_PIOE 4 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>; + }; }; }; };
@@ -252,6 +267,8 @@ leds { compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_gpio_leds>; status = "okay"; d8 {
@@ -278,6 +295,8 @@ vcc_mmc1_reg: fixedregulator_mmc1 { compatible = "regulator-fixed"; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_vcc_mmc1_reg>; gpio = <&pioE 4 GPIO_ACTIVE_LOW>; regulator-name = "VDD MCI1"; regulator-min-microvolt = <3300000>;
Greg Kroah-Hartman
maintainerPATCH 230/236 fuse: truncate pagecache on atomic_o_trunc
In reply to Greg Kroah-HartmanFrom: Miklos Szeredi <[email protected]>
commit 76224355db7570cbe6b6f75c8929a1558828dd55 upstream.
fuse_finish_open() will be called with FUSE_NOWRITE in case of atomic O_TRUNC. This can deadlock with fuse_wait_on_page_writeback() in fuse_launder_page() triggered by invalidate_inode_pages2().
Fix by replacing invalidate_inode_pages2() in fuse_finish_open() with a truncate_pagecache() call. This makes sense regardless of FOPEN_KEEP_CACHE or fc->writeback cache, so do it unconditionally.
--- fs/fuse/file.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/fuse/file.c +5 -2
@@ -194,12 +194,11 @@ void fuse_finish_open(struct inode *inodstruct fuse_file *ff = file->private_data;struct fuse_conn *fc =get_fuse_conn (inode); -if (!(ff->open_flags &FOPEN_KEEP_CACHE )) -invalidate_inode_pages2 (inode->i_mapping);if (ff->open_flags &FOPEN_STREAM )stream_open (inode, file);else if (ff->open_flags &FOPEN_NONSEEKABLE )nonseekable_open (inode, file); +if (fc->atomic_o_trunc && (file->f_flags &O_TRUNC )) {struct fuse_inode *fi =get_fuse_inode (inode);
@@ -207,10 +206,14 @@ void fuse_finish_open(struct inode *inod fi->attr_version =atomic64_inc_return (&fc->attr_version);i_size_write (inode,0 );spin_unlock (&fi->lock); +truncate_pagecache (inode,0 );fuse_invalidate_attr (inode);if (fc->writeback_cache)file_update_time (file); + }else if (!(ff->open_flags &FOPEN_KEEP_CACHE )) { +invalidate_inode_pages2 (inode->i_mapping); } +if ((file->f_mode &FMODE_WRITE ) && fc->writeback_cache)fuse_link_write_file (file); }
Greg Kroah-Hartman
maintainerPATCH 231/236 fuse: flush extending writes
In reply to Greg Kroah-HartmanFrom: Miklos Szeredi <[email protected]>
commit 59bda8ecee2ffc6a602b7bf2b9e43ca669cdbdcd upstream.
Callers of fuse_writeback_range() assume that the file is ready for modification by the server in the supplied byte range after the call returns.
If there's a write that extends the file beyond the end of the supplied range, then the file needs to be extended to at least the end of the range, but currently that's not done.
There are at least two cases where this can cause problems:
- copy_file_range() will return short count if the file is not extended up to end of the source range.
- FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE will not extend the file, hence the region may not be fully allocated.
Fix by flushing writes from the start of the range up to the end of the file. This could be optimized if the writes are non-extending, etc, but it's probably not worth the trouble.
--- fs/fuse/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/fuse/file.c +1 -1
@@ -3240,7 +3240,7 @@ fuse_direct_IO(struct kiocb *iocb, strucstatic int fuse_writeback_range (struct inode *inode,loff_t start,loff_t end) { -int err =filemap_write_and_wait_range (inode->i_mapping, start, end); +int err =filemap_write_and_wait_range (inode->i_mapping, start,-1 );if (!err)fuse_sync_writes (inode);
Greg Kroah-Hartman
maintainerPATCH 232/236 IMA: remove -Wmissing-prototypes warning
In reply to Greg Kroah-HartmanFrom: Austin Kim <[email protected]>
commit a32ad90426a9c8eb3915eed26e08ce133bd9e0da upstream.
With W=1 build, the compiler throws warning message as below:
security/integrity/ima/ima_mok.c:24:12: warning:
no previous prototype for ‘ima_mok_init’ [-Wmissing-prototypes]
__init int ima_mok_init(void)
Silence the warning by adding static keyword to ima_mok_init().
--- security/integrity/ima/ima_mok.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
security/integrity/ima/ima_mok.c +1 -1
@@ -21,7 +21,7 @@ struct key *ima_blacklist_keyring;/* * Allocate the IMA blacklist keyring */ -__init int ima_mok_init (void ) +static __init int ima_mok_init (void ) {struct key_restriction *restriction;
Greg Kroah-Hartman
maintainerPATCH 233/236 IMA: remove the dependency on CRYPTO_MD5
In reply to Greg Kroah-HartmanFrom: THOBY Simon <[email protected]>
commit 8510505d55e194d3f6c9644c9f9d12c4f6b0395a upstream.
MD5 is a weak digest algorithm that shouldn't be used for cryptographic operation. It hinders the efficiency of a patch set that aims to limit the digests allowed for the extended file attribute namely security.ima. MD5 is no longer a requirement for IMA, nor should it be used there.
The sole place where we still use the MD5 algorithm inside IMA is setting the ima_hash algorithm to MD5, if the user supplies 'ima_hash=md5' parameter on the command line. With commit ab60368ab6a4 ("ima: Fallback to the builtin hash algorithm"), setting "ima_hash=md5" fails gracefully when CRYPTO_MD5 is not set:
ima: Can not allocate md5 (reason: -2)
ima: Allocating md5 failed, going to use default hash algorithm sha256
Remove the CRYPTO_MD5 dependency for IMA.
[[email protected]: include commit number in patch description for stable.]
--- security/integrity/ima/Kconfig | 1 - 1 file changed, 1 deletion(-)
security/integrity/ima/Kconfig +0 -1
@@ -6,7 +6,6 @@ config IMA select SECURITYFS select CRYPTO select CRYPTO_HMAC - select CRYPTO_MD5 select CRYPTO_SHA1 select CRYPTO_HASH_INFO select TCG_TPM if HAS_IOMEM && !UML
Greg Kroah-Hartman
maintainerPATCH 234/236 fbmem: dont allow too huge resolutions
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
commit 8c28051cdcbe9dfcec6bd0a4709d67a09df6edae upstream.
syzbot is reporting page fault at vga16fb_fillrect() [1], for vga16fb_check_var() is failing to detect multiplication overflow.
if (vxres * vyres > maxmem) {
vyres = maxmem / vxres;
if (vyres < yres)
return -ENOMEM;
}Since no module would accept too huge resolutions where multiplication overflow happens, let's reject in the common path.
--- drivers/video/fbdev/core/fbmem.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/video/fbdev/core/fbmem.c +6 -0
@@ -962,6 +962,7 @@ fb_set_var(struct fb_info *info, structstruct fb_var_screeninfo old_var;struct fb_videomode mode;struct fb_event event; +u32 unused;if (var->activate &FB_ACTIVATE_INV_MODE ) {struct fb_videomode mode1, mode2;
@@ -1008,6 +1009,11 @@ fb_set_var(struct fb_info *info, structif (var->xres <8 || var->yres <8 )return -EINVAL ; +/* Too huge resolution causes multiplication overflow. */ +if (check_mul_overflow (var->xres, var->yres, &unused) || +check_mul_overflow (var->xres_virtual, var->yres_virtual, &unused)) +return -EINVAL ; + ret = info->fbops->fb_check_var (var, info);if (ret)
Greg Kroah-Hartman
maintainerPATCH 235/236 backlight: pwm_bl: Improve bootloader/kernel device handover
In reply to Greg Kroah-HartmanFrom: Daniel Thompson <[email protected]>
commit 79fad92f2e596f5a8dd085788a24f540263ef887 upstream.
Currently there are (at least) two problems in the way pwm_bl starts managing the enable_gpio pin. Both occur when the backlight is initially off and the driver finds the pin not already in output mode and, as a result, unconditionally switches it to output-mode and asserts the signal.
Problem 1: This could cause the backlight to flicker since, at this stage in driver initialisation, we have no idea what the PWM and regulator are doing (an unconfigured PWM could easily "rest" at 100% duty cycle).
Problem 2: This will cause us not to correctly honour the post_pwm_on_delay (which also risks flickers).
Fix this by moving the code to configure the GPIO output mode until after we have examines the handover state. That allows us to initialize enable_gpio to off if the backlight is currently off and on if the backlight is on.
--- drivers/video/backlight/pwm_bl.c | 54 ++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 26 deletions(-)
drivers/video/backlight/pwm_bl.c +28 -26
@@ -417,6 +417,33 @@ static bool pwm_backlight_is_linear(strustatic int pwm_backlight_initial_power_state (const struct pwm_bl_data *pb) {struct device_node *node = pb->dev->of_node; +bool active = true; + +/* +* If the enable GPIO is present, observable (either as input +* or output) and off then the backlight is not currently active. +* */ +if (pb->enable_gpio &&gpiod_get_value_cansleep (pb->enable_gpio) ==0 ) + active = false; + +if (!regulator_is_enabled (pb->power_supply)) + active = false; + +if (!pwm_is_enabled (pb->pwm)) + active = false; + +/* +* Synchronize the enable_gpio with the observed state of the +* hardware. +*/ +if (pb->enable_gpio) +gpiod_direction_output (pb->enable_gpio, active); + +/* +* Do not change pb->enabled here! pb->enabled essentially +* tells us if we own one of the regulator's use counts and +* right now we do not. +*/ /* Not booted with device tree or no phandle link to the node */ if (!node || !node->phandle)
@@ -428,20 +455,7 @@ static int pwm_backlight_initial_power_s* assume that another driver will enable the backlight at the * appropriate time. Therefore, if it is disabled, keep it so. */ - -/* if the enable GPIO is disabled, do not enable the backlight */ -if (pb->enable_gpio &&gpiod_get_value_cansleep (pb->enable_gpio) ==0 ) -return FB_BLANK_POWERDOWN ; - -/* The regulator is disabled, do not enable the backlight */ -if (!regulator_is_enabled (pb->power_supply)) -return FB_BLANK_POWERDOWN ; - -/* The PWM is disabled, keep it like this */ -if (!pwm_is_enabled (pb->pwm)) -return FB_BLANK_POWERDOWN ; - -return FB_BLANK_UNBLANK ; +return active ?FB_BLANK_UNBLANK :FB_BLANK_POWERDOWN ; }static int pwm_backlight_probe (struct platform_device *pdev)
@@ -494,18 +508,6 @@ static int pwm_backlight_probe(struct pl goto err_alloc; } -/* -* If the GPIO is not known to be already configured as output, that -* is, if gpiod_get_direction returns either 1 or -EINVAL, change the -* direction to output and set the GPIO as active. -* Do not force the GPIO to active when it was already output as it -* could cause backlight flickering or we would enable the backlight too -* early. Leave the decision of the initial backlight state for later. -*/ -if (pb->enable_gpio && -gpiod_get_direction (pb->enable_gpio) !=0 ) -gpiod_direction_output (pb->enable_gpio,1 ); - pb->power_supply =devm_regulator_get (&pdev->dev,"power" );if (IS_ERR (pb->power_supply)) { ret =PTR_ERR (pb->power_supply);
Greg Kroah-Hartman
maintainerPATCH 236/236 clk: kirkwood: Fix a clocking boot regression
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
commit aaedb9e00e5400220a8871180d23a83e67f29f63 upstream.
Since a few kernel releases the Pogoplug 4 has crashed like this during boot:
Unable to handle kernel NULL pointer dereference at virtual address 00000002
(...)
[<c04116ec>] (strlen) from [<c00ead80>] (kstrdup+0x1c/0x4c)
[<c00ead80>] (kstrdup) from [<c04591d8>] (__clk_register+0x44/0x37c)
[<c04591d8>] (__clk_register) from [<c04595ec>] (clk_hw_register+0x20/0x44)
[<c04595ec>] (clk_hw_register) from [<c045bfa8>] (__clk_hw_register_mux+0x198/0x1e4) [<c045bfa8>] (__clk_hw_register_mux) from [<c045c050>] (clk_register_mux_table+0x5c/0x6c) [<c045c050>] (clk_register_mux_table) from [<c0acf3e0>] (kirkwood_clk_muxing_setup.constprop.0+0x13c/0x1ac) [<c0acf3e0>] (kirkwood_clk_muxing_setup.constprop.0) from [<c0aceae0>] (of_clk_init+0x12c/0x214) [<c0aceae0>] (of_clk_init) from [<c0ab576c>] (time_init+0x20/0x2c)
[<c0ab576c>] (time_init) from [<c0ab3d18>] (start_kernel+0x3dc/0x56c)
[<c0ab3d18>] (start_kernel) from [<00000000>] (0x0)
Code: e3130020 1afffffb e12fff1e c08a1078 (e5d03000)
This is because the "powersave" mux clock 0 was provided in an unterminated array, which is required by the loop in the driver:
/* Count, allocate, and register clock muxes */
for (n = 0; desc[n].name;)
n++;Here n will go out of bounds and then call clk_register_mux() on random memory contents after the mux clock.
Fix this by terminating the array with a blank entry.
--- drivers/clk/mvebu/kirkwood.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/mvebu/kirkwood.c +1 -0
@@ -265,6 +265,7 @@ static const char *powersave_parents[] =static const struct clk_muxing_soc_desc kirkwood_mux_desc[]__initconst = { {"powersave" , powersave_parents,ARRAY_SIZE (powersave_parents),11 ,1 ,0 }, + { } }; static struct clk *clk_muxing_get_src(
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.65 release. There are 236 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Sep 2021 13:10:21 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.65-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
5.10.65-rc1 Successfully Compiled and booted on my Raspberry PI 4b (8g) (bcm2711)
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.65 release. There are 236 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Sep 2021 13:10:21 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.65-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB, using 32-bit and 64-bit ARM kernels:
Signature · 1 line
Florian
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.65 release. There are 236 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Sep 2021 13:10:21 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.65-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.65 release. There are 236 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Sep 2021 13:10:21 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.65-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 5.10.65-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-5.10.y
* git commit: e306b25768e344bf338aeb3b1439af89af21b31e
* git describe: v5.10.64-237-ge306b25768e3
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.10.y/build/v5.10.64-237-ge306b25768e3
## No regressions (compared to v5.10.64-215-g5352b1865825)
## No fixes (compared to v5.10.64-215-g5352b1865825)
## Test result summary
total: 89197, pass: 74790, fail: 603, skip: 12826, xfail: 978
## Build Summary
* arc: 10 total, 10 passed, 0 failed
* arm: 289 total, 289 passed, 0 failed
* arm64: 39 total, 39 passed, 0 failed
* dragonboard-410c: 1 total, 1 passed, 0 failed
* hi6220-hikey: 1 total, 1 passed, 0 failed
* i386: 38 total, 38 passed, 0 failed
* juno-r2: 1 total, 1 passed, 0 failed
* mips: 51 total, 51 passed, 0 failed
* parisc: 12 total, 12 passed, 0 failed
* powerpc: 36 total, 35 passed, 1 failed
* riscv: 30 total, 30 passed, 0 failed
* s390: 18 total, 18 passed, 0 failed
* sh: 24 total, 24 passed, 0 failed
* sparc: 12 total, 12 passed, 0 failed
* x15: 1 total, 1 passed, 0 failed
* x86: 1 total, 1 passed, 0 failed
* x86_64: 39 total, 39 passed, 0 failed
## Test suites summary
* fwts
* igt-gpu-tools
* install-android-platform-tools-r2600
* kselftest-android
* kselftest-arm64
* kselftest-bpf
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-firmware
* kselftest-fpu
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-controllers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-open-posix-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-tracing-tests
* network-basic-tests
* packetdrill
* perf
* rcutorture
* ssuite
* v4l2-compliance
--
Linaro LKFT
https://lkft.linaro.org
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 5.10.65 release. There are 236 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-5.10.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.65 release. There are 236 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Sep 2021 13:10:21 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.65-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.10:
10 builds: 10 pass, 0 fail
28 boots: 28 pass, 0 fail
75 tests: 75 pass, 0 failLinux version: 5.10.65-rc1-ge306b25768e3
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.65 release. There are 236 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Sep 2021 13:10:21 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.65-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
Tested on arm64 and x86 for 5.10.65-rc1,
Kernel repo:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Branch: linux-5.10.y
Version: 5.10.65-rc1
Commit: e306b25768e344bf338aeb3b1439af89af21b31e
Compiler: gcc version 7.3.0 (GCC)
arm64:
--------------------------------------------------------------------
Testcase Result Summary:
total: 8907
passed: 8907
failed: 0
timeout: 0
--------------------------------------------------------------------
x86:
--------------------------------------------------------------------
Testcase Result Summary:
total: 8907
passed: 8907
failed: 0
timeout: 0
--------------------------------------------------------------------
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.65 release. There are 236 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Sep 2021 13:10:21 +0000. Anything received after that time might be too late.
Build results:
total: 159 pass: 159 fail: 0 Qemu test results: total: 471 pass: 471 fail: 0
Guenter
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.65 release. There are 236 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Sep 2021 13:10:21 +0000. Anything received after that time might be too late.
Build test:
mips (gcc version 11.1.1 20210816): 63 configs -> no new failure arm (gcc version 11.1.1 20210816): 105 configs -> no new failure arm64 (gcc version 11.1.1 20210816): 3 configs -> no failure x86_64 (gcc version 10.2.1 20210110): 4 configs -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
arm64: Booted on rpi4b (4GB model). No regression. [2]
[1]. https://openqa.qa.codethink.co.uk/tests/134
[2]. https://openqa.qa.codethink.co.uk/tests/132
--
Regards
Sudip