4.19.6-stable review
Subsystems (3)
Greg Kroah-Hartman
maintainerPATCH 9/110 xhci: handle port status events for removed USB3 hcd
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit 1245374e9b8340fc255fd51b2015173a83050d03 upstream.
At xhci removal the USB3 hcd (shared_hcd) is removed before the primary USB2 hcd. Interrupts for port status changes may still occur for USB3 ports after the shared_hcd is freed, causing NULL pointer dereference.
Check if xhci->shared_hcd is still valid before handing USB3 port events
--- drivers/usb/host/xhci-ring.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/usb/host/xhci-ring.c +7 -0
@@ -1552,6 +1552,13 @@ static void handle_port_status(struct xh goto cleanup; } +/* We might get interrupts after shared_hcd is removed */ +if (port->rhub == &xhci->usb3_rhub && xhci->shared_hcd ==NULL ) { +xhci_dbg (xhci,"ignore port event for removed USB3 hcd\n" ); + bogus_port_status = true; + goto cleanup; + } + hcd = port->rhub->hcd; bus_state = &xhci->bus_state[hcd_index (hcd)]; hcd_portnum = port->hcd_portnum;
Greg Kroah-Hartman
maintainerPATCH 12/110 usb: xhci: fix timeout for transition from RExit to U0
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaron Ma <[email protected]>
commit a5baeaeabcca3244782a9b6382ebab6f8a58f583 upstream.
This definition is used by msecs_to_jiffies in milliseconds. According to the comments, max rexit timeout should be 20ms. Align with the comments to properly calculate the delay.
Verified on Sunrise Point-LP and Cannon Lake.
--- drivers/usb/host/xhci-hub.c | 4 ++-- drivers/usb/host/xhci.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/usb/host/xhci-hub.c +2 -2
@@ -921,7 +921,7 @@ static u32 xhci_get_port_status(struct u time_left =wait_for_completion_timeout ( &bus_state->rexit_done[wIndex],msecs_to_jiffies ( -XHCI_MAX_REXIT_TIMEOUT )); +XHCI_MAX_REXIT_TIMEOUT_MS ));spin_lock_irqsave (&xhci->lock, flags);if (time_left) {
@@ -935,7 +935,7 @@ static u32 xhci_get_port_status(struct u }else {int port_status =readl (port->addr);xhci_warn (xhci,"Port resume took longer than %i msec, port status = 0x%x\n" , -XHCI_MAX_REXIT_TIMEOUT , +XHCI_MAX_REXIT_TIMEOUT_MS , port_status); status |=USB_PORT_STAT_SUSPEND ;clear_bit (wIndex, &bus_state->rexit_ports);
drivers/usb/host/xhci.h +1 -1
@@ -1678,7 +1678,7 @@ struct xhci_bus_state {* It can take up to 20 ms to transition from RExit to U0 on the * Intel Lynx Point LP xHCI host. */ -#define XHCI_MAX_REXIT_TIMEOUT (20 * 1000) +#define XHCI_MAX_REXIT_TIMEOUT_MS 20static inline unsigned int hcd_index (struct usb_hcd *hcd) {
Greg Kroah-Hartman
maintainerPATCH 14/110 usb: xhci: Prevent bus suspend if a port connect change or polling state is detected
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit 2f31a67f01a8beb22cae754c53522cb61a005750 upstream.
USB3 roothub might autosuspend before a plugged USB3 device is detected, causing USB3 device enumeration failure.
USB3 devices don't show up as connected and enabled until USB3 link trainig completes. On a fast booting platform with a slow USB3 link training the link might reach the connected enabled state just as the bus is suspending.
If this device is discovered first time by the xhci_bus_suspend() routine it will be put to U3 suspended state like the other ports which failed to suspend earlier.
The hub thread will notice the connect change and resume the bus, moving the port back to U0
This U0 -> U3 -> U0 transition right after being connected seems to be too much for some devices, causing them to first go to SS.Inactive state, and finally end up stuck in a polling state with reset asserted
Fix this by failing the bus suspend if a port has a connect change or is in a polling state in xhci_bus_suspend().
Don't do any port changes until all ports are checked, buffer all port changes and only write them in the end if suspend can proceed
--- drivers/usb/host/xhci-hub.c | 60 +++++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 14 deletions(-)
drivers/usb/host/xhci-hub.c +46 -14
@@ -1474,15 +1474,18 @@ int xhci_bus_suspend(struct usb_hcd *hcdunsigned long flags;struct xhci_hub *rhub;struct xhci_port **ports; +u32 portsc_buf[USB_MAXCHILDREN ]; +bool wake_enabled; rhub =xhci_get_rhub (hcd); ports = rhub->ports; max_ports = rhub->num_ports; bus_state = &xhci->bus_state[hcd_index (hcd)]; + wake_enabled = hcd->self.root_hub->do_remote_wakeup;spin_lock_irqsave (&xhci->lock, flags); -if (hcd->self.root_hub->do_remote_wakeup) { +if (wake_enabled) {if (bus_state->resuming_ports ||/* USB2 */ bus_state->port_remote_wakeup) {/* USB3 */ spin_unlock_irqrestore (&xhci->lock, flags);
@@ -1490,26 +1493,36 @@ int xhci_bus_suspend(struct usb_hcd *hcdreturn -EBUSY ; } } - - port_index = max_ports; +/* +* Prepare ports for suspend, but don't write anything before all ports +* are checked and we know bus suspend can proceed +*/ bus_state->bus_suspended =0 ; + port_index = max_ports;while (port_index--) { -/* suspend the port if the port is not suspended */ u32 t1, t2; -int slot_id; t1 =readl (ports[port_index]->addr); t2 =xhci_port_state_to_neutral (t1); + portsc_buf[port_index] =0 ; -if ((t1 &PORT_PE ) && !(t1 &PORT_PLS_MASK )) { -xhci_dbg (xhci,"port %d not suspended\n" , port_index); - slot_id =xhci_find_slot_id_by_port (hcd, xhci, - port_index +1 ); -if (slot_id) { +/* Bail out if a USB3 port has a new device in link training */ +if ((t1 &PORT_PLS_MASK ) ==XDEV_POLLING ) { + bus_state->bus_suspended =0 ; +spin_unlock_irqrestore (&xhci->lock, flags); +xhci_dbg (xhci,"Bus suspend bailout, port in polling\n" ); +return -EBUSY ; + } + +/* suspend ports in U0, or bail out for new connect changes */ +if ((t1 &PORT_PE ) && (t1 &PORT_PLS_MASK ) ==XDEV_U0 ) { +if ((t1 &PORT_CSC ) && wake_enabled) { + bus_state->bus_suspended =0 ;spin_unlock_irqrestore (&xhci->lock, flags); -xhci_stop_device (xhci, slot_id,1 ); -spin_lock_irqsave (&xhci->lock, flags); +xhci_dbg (xhci,"Bus suspend bailout, port connect change\n" ); +return -EBUSY ; } +xhci_dbg (xhci,"port %d not suspended\n" , port_index); t2 &= ~PORT_PLS_MASK ; t2 |=PORT_LINK_STROBE |XDEV_U3 ;set_bit (port_index, &bus_state->bus_suspended);
@@ -1518,7 +1531,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd* including the USB 3.0 roothub, but only if CONFIG_PM * is enabled, so also enable remote wake here. */ -if (hcd->self.root_hub->do_remote_wakeup) { +if (wake_enabled) {if (t1 &PORT_CONNECT ) { t2 |=PORT_WKOC_E |PORT_WKDISC_E ; t2 &= ~PORT_WKCONN_E ;
@@ -1538,7 +1551,26 @@ int xhci_bus_suspend(struct usb_hcd *hcd t1 =xhci_port_state_to_neutral (t1);if (t1 != t2) -writel (t2, ports[port_index]->addr); + portsc_buf[port_index] = t2; + } + +/* write port settings, stopping and suspending ports if needed */ + port_index = max_ports; +while (port_index--) { +if (!portsc_buf[port_index]) +continue ; +if (test_bit (port_index, &bus_state->bus_suspended)) { +int slot_id; + + slot_id =xhci_find_slot_id_by_port (hcd, xhci, + port_index +1 ); +if (slot_id) { +spin_unlock_irqrestore (&xhci->lock, flags); +xhci_stop_device (xhci, slot_id,1 ); +spin_lock_irqsave (&xhci->lock, flags); + } + } +writel (portsc_buf[port_index], ports[port_index]->addr); } hcd->state =HC_STATE_SUSPENDED ; bus_state->next_statechange = jiffies +msecs_to_jiffies (10 );
Greg Kroah-Hartman
maintainerPATCH 16/110 MAINTAINERS: Add Sasha as a stable branch maintainer
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Kroah-Hartman <[email protected]>
commit cb5d21946d2a2f4687c482ab4604af1d29dac35a upstream.
Sasha has somehow been convinced into helping me with the stable kernel maintenance. Codify this slip in good judgement before he realizes what he really signed up for :)
--- MAINTAINERS | 1 + 1 file changed, 1 insertion(+)
MAINTAINERS +1 -0
@@ -13769,6 +13769,7 @@ F: drivers/i2c/busses/i2c-stm32* STABLE BRANCH M: Greg Kroah-Hartman <[email protected]> +M: Sasha Levin <[email protected]> L: [email protected] S: Supported F: Documentation/process/stable-kernel-rules.rst
Greg Kroah-Hartman
maintainerPATCH 18/110 Documentation/security-bugs: Postpone fix publication in exceptional cases
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
commit 544b03da39e2d7b4961d3163976ed4bfb1fac509 upstream.
At the request of the reporter, the Linux kernel security team offers to postpone the publishing of a fix for up to 5 business days from the date of a report.
While it is generally undesirable to keep a fix private after it has been developed, this short window is intended to allow distributions to package the fix into their kernel builds and permits early inclusion of the security team in the case of a co-ordinated disclosure with other parties. Unfortunately, discussions with major Linux distributions and cloud providers has revealed that 5 business days is not sufficient to achieve either of these two goals.
As an example, cloud providers need to roll out KVM security fixes to a global fleet of hosts with sufficient early ramp-up and monitoring. An end-to-end timeline of less than two weeks dramatically cuts into the amount of early validation and increases the chance of guest-visible regressions.
The consequence of this timeline mismatch is that security issues are commonly fixed without the involvement of the Linux kernel security team and are instead analysed and addressed by an ad-hoc group of developers across companies contributing to Linux. In some cases, mainline (and therefore the official stable kernels) can be left to languish for extended periods of time. This undermines the Linux kernel security process and puts upstream developers in a difficult position should they find themselves involved with an undisclosed security problem that they are unable to report due to restrictions from their employer.
To accommodate the needs of these users of the Linux kernel and encourage them to engage with the Linux security team when security issues are first uncovered, extend the maximum period for which fixes may be delayed to 7 calendar days, or 14 calendar days in exceptional cases, where the logistics of QA and large scale rollouts specifically need to be accommodated. This brings parity with the linux-distros@ maximum embargo period of 14 calendar days.
--- Documentation/admin-guide/security-bugs.rst | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
Documentation/admin-guide/security-bugs.rst +10 -9
@@ -32,16 +32,17 @@ Disclosure and embargoed information The security list is not a disclosure channel. For that, see Coordination below. -Once a robust fix has been developed, our preference is to release the -fix in a timely fashion, treating it no differently than any of the other -thousands of changes and fixes the Linux kernel project releases every -month. +Once a robust fix has been developed, the release process starts. Fixes +for publicly known bugs are released immediately. -However, at the request of the reporter, we will postpone releasing the -fix for up to 5 business days after the date of the report or after the -embargo has lifted; whichever comes first. The only exception to that -rule is if the bug is publicly known, in which case the preference is to -release the fix as soon as it's available. +Although our preference is to release fixes for publicly undisclosed bugs +as soon as they become available, this may be postponed at the request of +the reporter or an affected party for up to 7 calendar days from the start +of the release process, with an exceptional extension to 14 calendar days +if it is agreed that the criticality of the bug requires more time. The +only valid reason for deferring the publication of a fix is to accommodate +the logistics of QA and large scale rollouts which require release +coordination. Whilst embargoed information may be shared with trusted individuals in order to develop a fix, such information will not be published alongside
Greg Kroah-Hartman
maintainerPATCH 27/110 opp: ti-opp-supply: Dynamically update u_volt_min
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keerthy <[email protected]>
commit ba038546ff9e15d54d1134b5c5d2355648c00dec upstream.
The voltage range (min, max) provided in the device tree is from the data manual and is pretty big, catering to a wide range of devices. On a i2c read/write failure the regulator_set_voltage_triplet function falls back to set voltage between min and max. The min value from Device Tree can be lesser than the optimal value and in that case that can lead to a hang or crash. Hence set the u_volt_min dynamically to the optimal voltage value.
--- drivers/opp/ti-opp-supply.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/opp/ti-opp-supply.c +3 -0
@@ -290,6 +290,9 @@ static int ti_opp_supply_set_opp(struct vdd_uv =_get_optimal_vdd_voltage (dev, &opp_data, new_supply_vbb->u_volt); +if (new_supply_vdd->u_volt_min < vdd_uv) + new_supply_vdd->u_volt_min = vdd_uv; +/* Scaling up? Scale voltage before frequency */ if (freq > old_freq) { ret = _opp_set_voltage(dev, new_supply_vdd, vdd_uv, vdd_reg,
Greg Kroah-Hartman
maintainerPATCH 38/110 mm/memory.c: recheck page table entry with page table lock held
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aneesh Kumar K.V <[email protected]>
commit ff09d7ec9786be4ad7589aa987d7dc66e2dd9160 upstream.
We clear the pte temporarily during read/modify/write update of the pte. If we take a page fault while the pte is cleared, the application can get SIGBUS. One such case is with remap_pfn_range without a backing vm_ops->fault callback. do_fault will return SIGBUS in that case.
cpu 0 cpu1mprotect()
ptep_modify_prot_start()/pte cleared.
.
. page fault.
.
.prep_modify_prot_commit()
Fix this by taking page table lock and rechecking for pte_none.
--- mm/memory.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-)
mm/memory.c +30 -4
@@ -3745,10 +3745,36 @@ static vm_fault_t do_fault(struct vm_faustruct vm_area_struct *vma = vmf->vma;vm_fault_t ret; -/* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND */ -if (!vma->vm_ops->fault) - ret =VM_FAULT_SIGBUS ; -else if (!(vmf->flags &FAULT_FLAG_WRITE )) +/* +* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND +*/ +if (!vma->vm_ops->fault) { +/* +* If we find a migration pmd entry or a none pmd entry, which +* should never happen, return SIGBUS +*/ +if (unlikely (!pmd_present (*vmf->pmd))) + ret =VM_FAULT_SIGBUS ; +else { + vmf->pte =pte_offset_map_lock (vmf->vma->vm_mm, + vmf->pmd, + vmf->address, + &vmf->ptl); +/* +* Make sure this is not a temporary clearing of pte +* by holding ptl and checking again. A R/M/W update +* of pte involves: take ptl, clearing the pte so that +* we don't have concurrent modification by hardware +* followed by an update. +*/ +if (unlikely (pte_none (*vmf->pte))) + ret =VM_FAULT_SIGBUS ; +else + ret =VM_FAULT_NOPAGE ; + +pte_unmap_unlock (vmf->pte, vmf->ptl); + } + }else if (!(vmf->flags &FAULT_FLAG_WRITE )) ret =do_read_fault (vmf);else if (!(vma->vm_flags &VM_SHARED )) ret =do_cow_fault (vmf);
Greg Kroah-Hartman
maintainerPATCH 39/110 tcp: do not release socket ownership in tcp_close()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
commit 8873c064d1de579ea23412a6d3eee972593f142b upstream.
syzkaller was able to hit the WARN_ON(sock_owned_by_user(sk)); in tcp_close()
While a socket is being closed, it is very possible other threads find it in rtnetlink dump.
tcp_get_info() will acquire the socket lock for a short amount of time (slow = lock_sock_fast(sk)/unlock_sock_fast(sk, slow);), enough to trigger the warning.
--- include/net/sock.h | 1 + net/core/sock.c | 2 +- net/ipv4/tcp.c | 11 +++-------- 3 files changed, 5 insertions(+), 9 deletions(-)
include/net/sock.h +1 -0
@@ -1491,6 +1491,7 @@ static inline void lock_sock(struct socklock_sock_nested (sk,0 ); } +void __release_sock (struct sock *sk);void release_sock (struct sock *sk);/* BH context may only use the following locking interface. */
net/core/sock.c +1 -1
@@ -2317,7 +2317,7 @@ static void __lock_sock(struct sock *sk)finish_wait (&sk->sk_lock.wq, &wait); } -static void __release_sock (struct sock *sk) +void __release_sock (struct sock *sk) __releases(&sk->sk_lock.slock) __acquires(&sk->sk_lock.slock) {
net/ipv4/tcp.c +3 -8
@@ -2403,16 +2403,10 @@ adjudge_to_death:sock_hold (sk);sock_orphan (sk); -/* It is the last release_sock in its life. It will remove backlog. */ -release_sock (sk); - - -/* Now socket is owned by kernel and we acquire BH lock -* to finish close. No need to check for user refs. -*/ local_bh_disable ();bh_lock_sock (sk); -WARN_ON (sock_owned_by_user (sk)); +/* remove backlog if any, without releasing ownership. */ +__release_sock (sk);percpu_counter_inc (sk->sk_prot->orphan_count);
@@ -2481,6 +2475,7 @@ adjudge_to_death: out:bh_unlock_sock (sk);local_bh_enable (); +release_sock (sk);sock_put (sk); }EXPORT_SYMBOL (tcp_close);
Greg Kroah-Hartman
maintainerPATCH 45/110 drm/ast: change resolution may cause screen blurred
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Y.C. Chen <[email protected]>
commit 1a37bd823891568f8721989aed0615835632d81a upstream.
The value of pitches is not correct while calling mode_set. The issue we found so far on following system:
- Debian8 with XFCE Desktop
- Ubuntu with KDE Desktop
- SUSE15 with KDE Desktop
--- drivers/gpu/drm/ast/ast_mode.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/ast/ast_mode.c +1 -0
@@ -568,6 +568,7 @@ static int ast_crtc_do_set_base(struct d }ast_bo_unreserve (bo); +ast_set_offset_reg (crtc);ast_set_start_address_crt1 (crtc, (u32 )gpu_addr);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 53/110 can: rx-offload: introduce can_rx_offload_get_echo_skb() and can_rx_offload_queue_sorted() functions
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
commit 55059f2b7f868cd43b3ad30e28e18347e1b46ace upstream.
Current CAN framework can't guarantee proper/chronological order of RX and TX-ECHO messages. To make this possible, drivers should use this functions instead of can_get_echo_skb().
--- drivers/net/can/rx-offload.c | 46 +++++++++++++++++++++++++++++++++++++++++ include/linux/can/rx-offload.h | 4 +++ 2 files changed, 50 insertions(+)
drivers/net/can/rx-offload.c +46 -0
@@ -209,6 +209,52 @@ int can_rx_offload_irq_offload_fifo(stru }EXPORT_SYMBOL_GPL (can_rx_offload_irq_offload_fifo); +int can_rx_offload_queue_sorted (struct can_rx_offload *offload, +struct sk_buff *skb,u32 timestamp) +{ +struct can_rx_offload_cb *cb; +unsigned long flags; + +if (skb_queue_len (&offload->skb_queue) > + offload->skb_queue_len_max) +return -ENOMEM ; + + cb =can_rx_offload_get_cb (skb); + cb->timestamp = timestamp; + +spin_lock_irqsave (&offload->skb_queue.lock, flags); +__skb_queue_add_sort (&offload->skb_queue, skb, can_rx_offload_compare); +spin_unlock_irqrestore (&offload->skb_queue.lock, flags); + +can_rx_offload_schedule (offload); + +return 0 ; +} +EXPORT_SYMBOL_GPL (can_rx_offload_queue_sorted); + +unsigned int can_rx_offload_get_echo_skb (struct can_rx_offload *offload, +unsigned int idx,u32 timestamp) +{ +struct net_device *dev = offload->dev; +struct net_device_stats *stats = &dev->stats; +struct sk_buff *skb; +u8 len; +int err; + + skb =__can_get_echo_skb (dev, idx, &len); +if (!skb) +return 0 ; + + err =can_rx_offload_queue_sorted (offload, skb, timestamp); +if (err) { + stats->rx_errors++; + stats->tx_fifo_errors++; + } + +return len; +} +EXPORT_SYMBOL_GPL (can_rx_offload_get_echo_skb); +int can_rx_offload_irq_queue_err_skb (struct can_rx_offload *offload,struct sk_buff *skb) { if (skb_queue_len(&offload->skb_queue) >
include/linux/can/rx-offload.h +4 -0
@@ -41,6 +41,10 @@ int can_rx_offload_add_timestamp(structint can_rx_offload_add_fifo (struct net_device *dev,struct can_rx_offload *offload,unsigned int weight);int can_rx_offload_irq_offload_timestamp (struct can_rx_offload *offload,u64 reg);int can_rx_offload_irq_offload_fifo (struct can_rx_offload *offload); +int can_rx_offload_queue_sorted (struct can_rx_offload *offload, +struct sk_buff *skb,u32 timestamp); +unsigned int can_rx_offload_get_echo_skb (struct can_rx_offload *offload, +unsigned int idx,u32 timestamp);int can_rx_offload_irq_queue_err_skb (struct can_rx_offload *offload,struct sk_buff *skb);void can_rx_offload_reset (struct can_rx_offload *offload);void can_rx_offload_del (struct can_rx_offload *offload);
Greg Kroah-Hartman
maintainerPATCH 57/110 can: raw: check for CAN FD capable netdev in raw_sendmsg()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Hartkopp <[email protected]>
commit a43608fa77213ad5ac5f75994254b9f65d57cfa0 upstream.
When the socket is CAN FD enabled it can handle CAN FD frame transmissions. Add an additional check in raw_sendmsg() as a CAN2.0 CAN driver (non CAN FD) should never see a CAN FD frame. Due to the commonly used can_dropped_invalid_skb() function the CAN 2.0 driver would drop that CAN FD frame anyway - but with this patch the user gets a proper -EINVAL return code.
--- net/can/raw.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
net/can/raw.c +8 -7
@@ -745,18 +745,19 @@ static int raw_sendmsg(struct socket *so }else ifindex = ro->ifindex; -if (ro->fd_frames) { + dev =dev_get_by_index (sock_net (sk), ifindex); +if (!dev) +return -ENXIO ; + + err = -EINVAL ; +if (ro->fd_frames && dev->mtu ==CANFD_MTU ) {if (unlikely (size !=CANFD_MTU && size !=CAN_MTU )) -return -EINVAL ; + goto put_dev; }else {if (unlikely (size !=CAN_MTU )) -return -EINVAL ; + goto put_dev; } - dev =dev_get_by_index (sock_net (sk), ifindex); -if (!dev) -return -ENXIO ; - skb =sock_alloc_send_skb (sk, size +sizeof (struct can_skb_priv ), msg->msg_flags &MSG_DONTWAIT , &err);if (!skb)
Greg Kroah-Hartman
maintainerPATCH 59/110 can: flexcan: Always use last mailbox for TX
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Stein <[email protected]>
commit cbffaf7aa09edbaea2bc7dc440c945297095e2fd upstream.
Essentially this patch moves the TX mailbox to position 63, regardless of timestamp based offloading or RX FIFO. So mainly the iflag register usage regarding TX has changed. The rest is consolidating RX FIFO and timestamp offloading as they now use both the same TX mailbox.
The reason is a very annoying behavior regarding sending RTR frames when _not_ using RX FIFO:
If a TX mailbox sent a RTR frame it becomes a RX mailbox. For that reason flexcan_irq disables the TX mailbox again. But if during the time the RTR was sent and the TX mailbox is disabled a new CAN frames is received, it is lost without notice. The reason is that so-called "Move-in" process starts from the lowest mailbox which happen to be a TX mailbox set to EMPTY.
Steps to reproduce (I used an imx7d):
1. generate regular bursts of messages
2. send a RTR from flexcan with higher priority than burst messages every 1ms, e.g. cangen -I 0x100 -L 0 -g 1 -R can0
3. notice a lost message without notification after some seconds
When running an iperf in parallel this problem is occurring even more frequently. Using filters is not possible as at least one single CAN-ID is allowed. Handling the TX MB during RX is also not possible as there is no race-free disable of RX MB.
There is still a slight window when the described problem can occur. But for that all RX MB must be in use which is essentially next to an overrun. Still there will be no indication if it ever occurs.
--- drivers/net/can/flexcan.c | 67 ++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 34 deletions(-)
drivers/net/can/flexcan.c +33 -34
@@ -135,13 +135,12 @@/* FLEXCAN interrupt flag register (IFLAG) bits */ /* Errata ERR005829 step7: Reserve first valid MB */ -#define FLEXCAN_TX_MB_RESERVED_OFF_FIFO 8 -#define FLEXCAN_TX_MB_OFF_FIFO 9 +#define FLEXCAN_TX_MB_RESERVED_OFF_FIFO 8#define FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP 0 -#define FLEXCAN_TX_MB_OFF_TIMESTAMP 1 -#define FLEXCAN_RX_MB_OFF_TIMESTAMP_FIRST (FLEXCAN_TX_MB_OFF_TIMESTAMP + 1) -#define FLEXCAN_RX_MB_OFF_TIMESTAMP_LAST 63 -#define FLEXCAN_IFLAG_MB (x) BIT(x) +#define FLEXCAN_TX_MB 63 +#define FLEXCAN_RX_MB_OFF_TIMESTAMP_FIRST (FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP + 1) +#define FLEXCAN_RX_MB_OFF_TIMESTAMP_LAST (FLEXCAN_TX_MB - 1) +#define FLEXCAN_IFLAG_MB (x) BIT(x & 0x1f)#define FLEXCAN_IFLAG_RX_FIFO_OVERFLOW BIT(7)#define FLEXCAN_IFLAG_RX_FIFO_WARN BIT(6)#define FLEXCAN_IFLAG_RX_FIFO_AVAILABLE BIT(5)
@@ -745,9 +744,9 @@ static inline u64 flexcan_read_reg_iflagstruct flexcan_regs __iomem *regs = priv->regs;u32 iflag1, iflag2; - iflag2 = priv->read (®s->iflag2) & priv->reg_imask2_default; - iflag1 = priv->read (®s->iflag1) & priv->reg_imask1_default & + iflag2 = priv->read (®s->iflag2) & priv->reg_imask2_default & ~FLEXCAN_IFLAG_MB (priv->tx_mb_idx); + iflag1 = priv->read (®s->iflag1) & priv->reg_imask1_default;return (u64 )iflag2 <<32 | iflag1; }
@@ -759,11 +758,9 @@ static irqreturn_t flexcan_irq(int irq,struct flexcan_priv *priv =netdev_priv (dev);struct flexcan_regs __iomem *regs = priv->regs;irqreturn_t handled =IRQ_NONE ; -u32 reg_iflag1, reg_esr; +u32 reg_iflag2, reg_esr;enum can_state last_state = priv->can.state; - reg_iflag1 = priv->read (®s->iflag1); -/* reception interrupt */ if (priv->devtype_data->quirks &FLEXCAN_QUIRK_USE_OFF_TIMESTAMP ) {u64 reg_iflag;
@@ -777,6 +774,9 @@ static irqreturn_t flexcan_irq(int irq,break ; } }else { +u32 reg_iflag1; + + reg_iflag1 = priv->read (®s->iflag1);if (reg_iflag1 &FLEXCAN_IFLAG_RX_FIFO_AVAILABLE ) { handled =IRQ_HANDLED ;can_rx_offload_irq_offload_fifo (&priv->offload);
@@ -792,8 +792,10 @@ static irqreturn_t flexcan_irq(int irq, } } + reg_iflag2 = priv->read (®s->iflag2); +/* transmission complete interrupt */ -if (reg_iflag1 &FLEXCAN_IFLAG_MB (priv->tx_mb_idx)) { +if (reg_iflag2 &FLEXCAN_IFLAG_MB (priv->tx_mb_idx)) {u32 reg_ctrl = priv->read (®s->mb[FLEXCAN_TX_MB ].can_ctrl); handled =IRQ_HANDLED ;
@@ -805,7 +807,7 @@ static irqreturn_t flexcan_irq(int irq,/* after sending a RTR frame MB is in RX mode */ priv->write (FLEXCAN_MB_CODE_TX_INACTIVE , &priv->tx_mb->can_ctrl); - priv->write (FLEXCAN_IFLAG_MB (priv->tx_mb_idx), ®s->iflag1); + priv->write (FLEXCAN_IFLAG_MB (priv->tx_mb_idx), ®s->iflag2);netif_wake_queue (dev); }
@@ -947,15 +949,13 @@ static int flexcan_chip_start(struct net reg_mcr &= ~FLEXCAN_MCR_MAXMB (0xff ); reg_mcr |=FLEXCAN_MCR_FRZ |FLEXCAN_MCR_HALT |FLEXCAN_MCR_SUPV |FLEXCAN_MCR_WRN_EN |FLEXCAN_MCR_SRX_DIS |FLEXCAN_MCR_IRMQ | -FLEXCAN_MCR_IDAM_C ; +FLEXCAN_MCR_IDAM_C |FLEXCAN_MCR_MAXMB (priv->tx_mb_idx); -if (priv->devtype_data->quirks &FLEXCAN_QUIRK_USE_OFF_TIMESTAMP ) { +if (priv->devtype_data->quirks &FLEXCAN_QUIRK_USE_OFF_TIMESTAMP ) reg_mcr &= ~FLEXCAN_MCR_FEN ; - reg_mcr |=FLEXCAN_MCR_MAXMB (priv->offload.mb_last); - }else { - reg_mcr |=FLEXCAN_MCR_FEN | -FLEXCAN_MCR_MAXMB (priv->tx_mb_idx); - } +else + reg_mcr |=FLEXCAN_MCR_FEN ; +netdev_dbg (dev,"%s: writing mcr=0x%08x" , __func__, reg_mcr); priv->write (reg_mcr, ®s->mcr);
@@ -998,16 +998,17 @@ static int flexcan_chip_start(struct net priv->write (reg_ctrl2, ®s->ctrl2); } -/* clear and invalidate all mailboxes first */ -for (i = priv->tx_mb_idx; i <ARRAY_SIZE (regs->mb); i++) { - priv->write (FLEXCAN_MB_CODE_RX_INACTIVE , - ®s->mb[i].can_ctrl); - } -if (priv->devtype_data->quirks &FLEXCAN_QUIRK_USE_OFF_TIMESTAMP ) { -for (i = priv->offload.mb_first; i <= priv->offload.mb_last; i++) +for (i = priv->offload.mb_first; i <= priv->offload.mb_last; i++) { priv->write (FLEXCAN_MB_CODE_RX_EMPTY , ®s->mb[i].can_ctrl); + } + }else { +/* clear and invalidate unused mailboxes first */ +for (i =FLEXCAN_TX_MB_RESERVED_OFF_FIFO ; i <=ARRAY_SIZE (regs->mb); i++) { + priv->write (FLEXCAN_MB_CODE_RX_INACTIVE , + ®s->mb[i].can_ctrl); + } }/* Errata ERR005829: mark first TX mailbox as INACTIVE */
@@ -1371,17 +1372,15 @@ static int flexcan_probe(struct platform priv->devtype_data = devtype_data; priv->reg_xceiver = reg_xceiver; -if (priv->devtype_data->quirks &FLEXCAN_QUIRK_USE_OFF_TIMESTAMP ) { - priv->tx_mb_idx =FLEXCAN_TX_MB_OFF_TIMESTAMP ; +if (priv->devtype_data->quirks &FLEXCAN_QUIRK_USE_OFF_TIMESTAMP ) priv->tx_mb_reserved = ®s->mb[FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP ]; - }else { - priv->tx_mb_idx =FLEXCAN_TX_MB_OFF_FIFO ; +else priv->tx_mb_reserved = ®s->mb[FLEXCAN_TX_MB_RESERVED_OFF_FIFO ]; - } + priv->tx_mb_idx =FLEXCAN_TX_MB ; priv->tx_mb = ®s->mb[priv->tx_mb_idx]; - priv->reg_imask1_default =FLEXCAN_IFLAG_MB (priv->tx_mb_idx); - priv->reg_imask2_default =0 ; + priv->reg_imask1_default =0 ; + priv->reg_imask2_default =FLEXCAN_IFLAG_MB (priv->tx_mb_idx); priv->offload.mailbox_read = flexcan_mailbox_read;
Greg Kroah-Hartman
maintainerPATCH 63/110 fsnotify: generalize handling of extra event flags
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amir Goldstein <[email protected]>
commit 007d1e8395eaa59b0e7ad9eb2b53a40859446a88 upstream.
FS_EVENT_ON_CHILD gets a special treatment in fsnotify() because it is not a flag specifying an event type, but rather an extra flags that may be reported along with another event and control the handling of the event by the backend.
FS_ISDIR is also an "extra flag" and not an "event type" and therefore desrves the same treatment. With inotify/dnotify backends it was never possible to set FS_ISDIR in mark masks, so it did not matter. With fanotify backend, mark adding code jumps through hoops to avoid setting the FS_ISDIR in the commulative object mask.
Separate the constant ALL_FSNOTIFY_EVENTS to ALL_FSNOTIFY_FLAGS and ALL_FSNOTIFY_EVENTS, so the latter can be used to test for specific event types.
--- fs/notify/fsnotify.c | 7 +++---- include/linux/fsnotify_backend.h | 9 +++++++-- 2 files changed, 10 insertions(+), 6 deletions(-)
fs/notify/fsnotify.c +3 -4
@@ -193,7 +193,7 @@ static int send_to_group(struct inode *t struct fsnotify_iter_info *iter_info) {struct fsnotify_group *group =NULL ; -__u32 test_mask = (mask & ~FS_EVENT_ON_CHILD ); +__u32 test_mask = (mask &ALL_FSNOTIFY_EVENTS );__u32 marks_mask =0 ;__u32 marks_ignored_mask =0 ;struct fsnotify_mark *mark;
@@ -324,8 +324,7 @@ int fsnotify(struct inode *to_tell, __u3struct fsnotify_iter_info iter_info = {};struct mount *mnt;int ret =0 ; -/* global tests shouldn't care about events on child only the specific event */ -__u32 test_mask = (mask & ~FS_EVENT_ON_CHILD ); +__u32 test_mask = (mask &ALL_FSNOTIFY_EVENTS );if (data_is ==FSNOTIFY_EVENT_PATH ) mnt =real_mount (((const struct path *)data)->mnt);
@@ -389,7 +388,7 @@ static __init int fsnotify_init(void) {int ret; -BUG_ON (hweight32 (ALL_FSNOTIFY_EVENTS ) !=23 ); +BUG_ON (hweight32 (ALL_FSNOTIFY_BITS ) !=23 ); ret =init_srcu_struct (&fsnotify_mark_srcu);if (ret)
include/linux/fsnotify_backend.h +7 -2
@@ -68,15 +68,20 @@#define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM) +/* Events that can be reported to backends */ #define ALL_FSNOTIFY_EVENTS (FS_ACCESS | FS_MODIFY | FS_ATTRIB | \ FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN | \ FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE | \ FS_DELETE | FS_DELETE_SELF | FS_MOVE_SELF | \ FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED | \ - FS_OPEN_PERM | FS_ACCESS_PERM | FS_EXCL_UNLINK | \ - FS_ISDIR | FS_IN_ONESHOT | FS_DN_RENAME | \ + FS_OPEN_PERM | FS_ACCESS_PERM | FS_DN_RENAME) + +/* Extra flags that may be reported with event or control handling of events */ +#define ALL_FSNOTIFY_FLAGS (FS_EXCL_UNLINK | FS_ISDIR | FS_IN_ONESHOT | \ FS_DN_MULTISHOT | FS_EVENT_ON_CHILD) +#define ALL_FSNOTIFY_BITS (ALL_FSNOTIFY_EVENTS | ALL_FSNOTIFY_FLAGS) +struct fsnotify_group ;struct fsnotify_event ;struct fsnotify_mark ;
Greg Kroah-Hartman
maintainerPATCH 65/110 pinctrl: meson: fix pinconf bias disable
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e39f9dd8206ad66992ac0e6218ef1ba746f2cce9 ]
If a bias is enabled on a pin of an Amlogic SoC, calling .pin_config_set() with PIN_CONFIG_BIAS_DISABLE will not disable the bias. Instead it will force a pull-down bias on the pin.
Instead of the pull type register bank, the driver should access the pull enable register bank.
--- drivers/pinctrl/meson/pinctrl-meson.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/meson/pinctrl-meson.c +1 -1
@@ -192,7 +192,7 @@ static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,dev_dbg (pc->dev,"pin %u: disable bias\n" , pin);meson_calc_reg_and_bit (bank, pin,REG_PULL , ®, &bit); - ret =regmap_update_bits (pc->reg_pull, reg, + ret =regmap_update_bits (pc->reg_pullen, reg,BIT (bit),0 );if (ret)return ret;
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 66/110 pinctrl: meson: fix gxbb ao pull register bits
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 4bc51e1e350cd4707ce6e551a93eae26d40b9889 ]
AO pull register definition is inverted between pull (up/down) and pull enable. Fixing this allows to properly apply bias setting through pinconf
--- drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/meson/pinctrl-meson-gxbb.c +1 -1
@@ -830,7 +830,7 @@ static struct meson_bank meson_gxbb_periphs_banks[] = {static struct meson_bank meson_gxbb_aobus_banks[] = {/* name first last irq pullen pull dir out in */ -BANK ("AO" ,GPIOAO_0 ,GPIOAO_13 ,0 ,13 ,0 ,0 ,0 ,16 ,0 ,0 ,0 ,16 ,1 ,0 ), +BANK ("AO" ,GPIOAO_0 ,GPIOAO_13 ,0 ,13 ,0 ,16 ,0 ,0 ,0 ,0 ,0 ,16 ,1 ,0 ), };static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 67/110 pinctrl: meson: fix gxl ao pull register bits
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ed3a2b74f3eb34c84c8377353f4730f05acdfd05 ]
AO pull register definition is inverted between pull (up/down) and pull enable. Fixing this allows to properly apply bias setting through pinconf
--- drivers/pinctrl/meson/pinctrl-meson-gxl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/meson/pinctrl-meson-gxl.c +1 -1
@@ -807,7 +807,7 @@ static struct meson_bank meson_gxl_periphs_banks[] = {static struct meson_bank meson_gxl_aobus_banks[] = {/* name first last irq pullen pull dir out in */ -BANK ("AO" ,GPIOAO_0 ,GPIOAO_9 ,0 ,9 ,0 ,0 ,0 ,16 ,0 ,0 ,0 ,16 ,1 ,0 ), +BANK ("AO" ,GPIOAO_0 ,GPIOAO_9 ,0 ,9 ,0 ,16 ,0 ,0 ,0 ,0 ,0 ,16 ,1 ,0 ), };static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 68/110 pinctrl: meson: fix meson8 ao pull register bits
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e91b162d2868672d06010f34aa83d408db13d3c6 ]
AO pull register definition is inverted between pull (up/down) and pull enable. Fixing this allows to properly apply bias setting through pinconf
--- drivers/pinctrl/meson/pinctrl-meson8.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/meson/pinctrl-meson8.c +1 -1
@@ -1053,7 +1053,7 @@ static struct meson_bank meson8_cbus_banks[] = {static struct meson_bank meson8_aobus_banks[] = {/* name first last irq pullen pull dir out in */ -BANK ("AO" ,GPIOAO_0 ,GPIO_TEST_N ,0 ,13 ,0 ,0 ,0 ,16 ,0 ,0 ,0 ,16 ,1 ,0 ), +BANK ("AO" ,GPIOAO_0 ,GPIO_TEST_N ,0 ,13 ,0 ,16 ,0 ,0 ,0 ,0 ,0 ,16 ,1 ,0 ), };static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 69/110 pinctrl: meson: fix meson8b ao pull register bits
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a1705f02704cd8a24d434bfd0141ee8142ad277a ]
AO pull register definition is inverted between pull (up/down) and pull enable. Fixing this allows to properly apply bias setting through pinconf
--- drivers/pinctrl/meson/pinctrl-meson8b.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/meson/pinctrl-meson8b.c +1 -1
@@ -906,7 +906,7 @@ static struct meson_bank meson8b_cbus_banks[] = {static struct meson_bank meson8b_aobus_banks[] = {/* name first lastc irq pullen pull dir out in */ -BANK ("AO" ,GPIOAO_0 ,GPIO_TEST_N ,0 ,13 ,0 ,0 ,0 ,16 ,0 ,0 ,0 ,16 ,1 ,0 ), +BANK ("AO" ,GPIOAO_0 ,GPIO_TEST_N ,0 ,13 ,0 ,16 ,0 ,0 ,0 ,0 ,0 ,16 ,1 ,0 ), };static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 70/110 tools/testing/nvdimm: Fix the array size for dimm devices.
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit af31b04b67f4fd7f639fd465a507c154c46fc9fb ]
KASAN reports following global out of bounds access while nfit_test is being loaded. The out of bound access happens the following reference to dimm_fail_cmd_flags[dimm]. 'dimm' is over than the index value, NUM_DCR (==5).
static int override_return_code(int dimm, unsigned int func, int rc)
{
if ((1 << func) & dimm_fail_cmd_flags[dimm]) {dimm_fail_cmd_flags[] definition:
static unsigned long dimm_fail_cmd_flags[NUM_DCR];
'dimm' is the return value of get_dimm(), and get_dimm() returns the index of handle[] array. The handle[] has 7 index. Let's use ARRAY_SIZE(handle) as the array size.
KASAN report:
==================================================================
BUG: KASAN: global-out-of-bounds in nfit_test_ctl+0x47bb/0x55b0 [nfit_test] Read of size 8 at addr ffffffffc10cbbe8 by task kworker/u41:0/8 ... Call Trace: dump_stack+0xea/0x1b0 ? dump_stack_print_info.cold.0+0x1b/0x1b ? kmsg_dump_rewind_nolock+0xd9/0xd9 print_address_description+0x65/0x22e ? nfit_test_ctl+0x47bb/0x55b0 [nfit_test] kasan_report.cold.6+0x92/0x1a6 nfit_test_ctl+0x47bb/0x55b0 [nfit_test] ... The buggy address belongs to the variable: dimm_fail_cmd_flags+0x28/0xffffffffffffa440 [nfit_test] ==================================================================
--- tools/testing/nvdimm/test/nfit.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/testing/nvdimm/test/nfit.c +4 -4
@@ -139,8 +139,8 @@ static u32 handle[] = { [6] = NFIT_DIMM_HANDLE(1, 0, 0, 0, 1), }; -static unsigned long dimm_fail_cmd_flags[NUM_DCR ]; -static int dimm_fail_cmd_code[NUM_DCR ]; +static unsigned long dimm_fail_cmd_flags[ARRAY_SIZE (handle)]; +static int dimm_fail_cmd_code[ARRAY_SIZE (handle)];static const struct nd_intel_smart smart_def = { .flags =ND_INTEL_SMART_HEALTH_VALID
@@ -203,7 +203,7 @@ struct nfit_test {unsigned long deadline;spinlock_t lock; } ars_state; -struct device *dimm_dev[NUM_DCR ]; +struct device *dimm_dev[ARRAY_SIZE (handle)];struct nd_intel_smart *smart;struct nd_intel_smart_threshold *smart_threshold;struct badrange badrange;
@@ -2678,7 +2678,7 @@ static int nfit_test_probe(struct platform_device *pdev)u32 nfit_handle =__to_nfit_memdev (nfit_mem)->device_handle;int i; -for (i =0 ; i <NUM_DCR ; i++) +for (i =0 ; i <ARRAY_SIZE (handle); i++)if (nfit_handle == handle[i])dev_set_drvdata (nfit_test->dimm_dev[i], nfit_mem);
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 71/110 scsi: lpfc: fix remoteport access
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit f8d294324598ec85bea2779512e48c94cbe4d7c6 ]
The addition of a spinlock in lpfc_debugfs_nodelist_data() introduced a bug that lets us not skip NULL pointers correctly, as noticed by gcc-8:
drivers/scsi/lpfc/lpfc_debugfs.c: In function 'lpfc_debugfs_nodelist_data.constprop':drivers/scsi/lpfc/lpfc_debugfs.c:728:13: error: 'nrport' may be used uninitialized in this function [-Werror=maybe-uninitialized]
if (nrport->port_role & FC_PORT_ROLE_NVME_INITIATOR)
This changes the logic back to what it was, while keeping the added spinlock.
--- drivers/scsi/lpfc/lpfc_debugfs.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/lpfc/lpfc_debugfs.c +2 -0
@@ -700,6 +700,8 @@ lpfc_debugfs_nodelist_data(struct lpfc_vport *vport, char *buf, int size) rport =lpfc_ndlp_get_nrport (ndlp);if (rport) nrport = rport->remoteport; +else + nrport =NULL ;spin_unlock (&phba->hbalock);if (!nrport)continue ;
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 72/110 scsi: hisi_sas: Remove set but not used variable dq_list
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e34ff8edcae89922d187425ab0b82e6a039aa371 ]
Fixes gcc '-Wunused-but-set-variable' warning:
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c: In function 'start_delivery_v1_hw':drivers/scsi/hisi_sas/hisi_sas_v1_hw.c:907:20: warning:
variable 'dq_list' set but not used [-Wunused-but-set-variable]
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c: In function 'start_delivery_v2_hw':drivers/scsi/hisi_sas/hisi_sas_v2_hw.c:1671:20: warning:
variable 'dq_list' set but not used [-Wunused-but-set-variable]
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c: In function 'start_delivery_v3_hw':drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:889:20: warning:
variable 'dq_list' set but not used [-Wunused-but-set-variable]
It never used since introduction in commitfa222db0b036 ("scsi: hisi_sas: Don't lock DQ for complete task sending")
--- drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 -- drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 -- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 2 -- 3 files changed, 6 deletions(-)
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +0 -2
@@ -904,11 +904,9 @@ static void start_delivery_v1_hw(struct hisi_sas_dq *dq) {struct hisi_hba *hisi_hba = dq->hisi_hba;struct hisi_sas_slot *s, *s1, *s2 =NULL ; -struct list_head *dq_list;int dlvry_queue = dq->id;int wp; - dq_list = &dq->list;list_for_each_entry_safe (s, s1, &dq->list, delivery) {if (!s->ready)break ;
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +0 -2
@@ -1666,11 +1666,9 @@ static void start_delivery_v2_hw(struct hisi_sas_dq *dq) {struct hisi_hba *hisi_hba = dq->hisi_hba;struct hisi_sas_slot *s, *s1, *s2 =NULL ; -struct list_head *dq_list;int dlvry_queue = dq->id;int wp; - dq_list = &dq->list;list_for_each_entry_safe (s, s1, &dq->list, delivery) {if (!s->ready)break ;
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +0 -2
@@ -883,11 +883,9 @@ static void start_delivery_v3_hw(struct hisi_sas_dq *dq) {struct hisi_hba *hisi_hba = dq->hisi_hba;struct hisi_sas_slot *s, *s1, *s2 =NULL ; -struct list_head *dq_list;int dlvry_queue = dq->id;int wp; - dq_list = &dq->list;list_for_each_entry_safe (s, s1, &dq->list, delivery) {if (!s->ready)break ;
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 73/110 KVM: PPC: Move and undef TRACE_INCLUDE_PATH/FILE
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 28c5bcf74fa07c25d5bd118d1271920f51ce2a98 ]
TRACE_INCLUDE_PATH and TRACE_INCLUDE_FILE are used by <trace/define_trace.h>, so like that #include, they should be outside #ifdef protection.
They also need to be #undefed before defining, in case multiple trace headers are included by the same C file. This became the case on book3e after commit cf4a6085151a ("powerpc/mm: Add missing tracepoint for tlbie"), leading to the following build error:
CC arch/powerpc/kvm/powerpc.o
In file included from arch/powerpc/kvm/powerpc.c:51:0:arch/powerpc/kvm/trace.h:9:0: error: "TRACE_INCLUDE_PATH" redefined [-Werror]
#define TRACE_INCLUDE_PATH .
^
In file included from arch/powerpc/kvm/../mm/mmu_decl.h:25:0,
from arch/powerpc/kvm/powerpc.c:48:./arch/powerpc/include/asm/trace.h:224:0: note: this is the location of the previous definition
#define TRACE_INCLUDE_PATH asm
^
cc1: all warnings being treated as errors
--- arch/powerpc/kvm/trace.h | 8 ++++++-- arch/powerpc/kvm/trace_booke.h | 9 +++++++-- arch/powerpc/kvm/trace_hv.h | 9 +++++++-- arch/powerpc/kvm/trace_pr.h | 9 +++++++-- 4 files changed, 27 insertions(+), 8 deletions(-)
arch/powerpc/kvm/trace.h +6 -2
@@ -6,8 +6,6 @@#undef TRACE_SYSTEM#define TRACE_SYSTEM kvm -#define TRACE_INCLUDE_PATH . -#define TRACE_INCLUDE_FILE trace/* * Tracepoint for guest mode entry.
@@ -120,4 +118,10 @@ TRACE_EVENT(kvm_check_requests,#endif /* _TRACE_KVM_H */ /* This part must be outside protection */ +#undef TRACE_INCLUDE_PATH +#undef TRACE_INCLUDE_FILE + +#define TRACE_INCLUDE_PATH . +#define TRACE_INCLUDE_FILE trace +#include <trace/define_trace.h>
arch/powerpc/kvm/trace_booke.h +7 -2
@@ -6,8 +6,6 @@#undef TRACE_SYSTEM#define TRACE_SYSTEM kvm_booke -#define TRACE_INCLUDE_PATH . -#define TRACE_INCLUDE_FILE trace_booke#define kvm_trace_symbol_exit \ {0, "CRITICAL"}, \
@@ -218,4 +216,11 @@ TRACE_EVENT(kvm_booke_queue_irqprio,#endif /* This part must be outside protection */ + +#undef TRACE_INCLUDE_PATH +#undef TRACE_INCLUDE_FILE + +#define TRACE_INCLUDE_PATH . +#define TRACE_INCLUDE_FILE trace_booke +#include <trace/define_trace.h>
arch/powerpc/kvm/trace_hv.h +7 -2
@@ -9,8 +9,6 @@#undef TRACE_SYSTEM#define TRACE_SYSTEM kvm_hv -#define TRACE_INCLUDE_PATH . -#define TRACE_INCLUDE_FILE trace_hv#define kvm_trace_symbol_hcall \ {H_REMOVE, "H_REMOVE"}, \
@@ -497,4 +495,11 @@ TRACE_EVENT(kvmppc_run_vcpu_exit,#endif /* _TRACE_KVM_HV_H */ /* This part must be outside protection */ + +#undef TRACE_INCLUDE_PATH +#undef TRACE_INCLUDE_FILE + +#define TRACE_INCLUDE_PATH . +#define TRACE_INCLUDE_FILE trace_hv +#include <trace/define_trace.h>
arch/powerpc/kvm/trace_pr.h +7 -2
@@ -8,8 +8,6 @@#undef TRACE_SYSTEM#define TRACE_SYSTEM kvm_pr -#define TRACE_INCLUDE_PATH . -#define TRACE_INCLUDE_FILE trace_pr TRACE_EVENT(kvm_book3s_reenter, TP_PROTO(int r, struct kvm_vcpu *vcpu),
@@ -257,4 +255,11 @@ TRACE_EVENT(kvm_exit,#endif /* _TRACE_KVM_H */ /* This part must be outside protection */ + +#undef TRACE_INCLUDE_PATH +#undef TRACE_INCLUDE_FILE + +#define TRACE_INCLUDE_PATH . +#define TRACE_INCLUDE_FILE trace_pr +#include <trace/define_trace.h>
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 74/110 cpufreq: imx6q: add return value check for voltage scale
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6ef28a04d1ccf718eee069b72132ce4aa1e52ab9 ]
Add return value check for voltage scale when ARM clock rate change fail.
--- drivers/cpufreq/imx6q-cpufreq.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/cpufreq/imx6q-cpufreq.c +6 -1
@@ -159,8 +159,13 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)/* Ensure the arm clock divider is what we expect */ ret =clk_set_rate (clks[ARM ].clk, new_freq *1000 );if (ret) { +int ret1; +dev_err (cpu_dev,"failed to set clock rate: %d\n" , ret); -regulator_set_voltage_tol (arm_reg, volt_old,0 ); + ret1 =regulator_set_voltage_tol (arm_reg, volt_old,0 ); +if (ret1) +dev_warn (cpu_dev, +"failed to restore vddarm voltage: %d\n" , ret1);return ret; }
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 75/110 rtc: cmos: Do not export alarm rtc_ops when we do not support alarms
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit fbb974ba693bbfb4e24a62181ef16d4e45febc37 ]
When there is no IRQ configured for the RTC, the rtc-cmos code does not support alarms, all alarm rtc_ops fail with -EIO / -EINVAL.
The rtc-core expects a rtc driver which does not support rtc alarms to not have alarm ops at all. Otherwise the wakealarm sysfs attr will read as empty rather then returning an error, making it impossible for userspace to find out beforehand if alarms are supported.
A system without an IRQ for the RTC before this patch:
[root@localhost ~]# cat /sys/class/rtc/rtc0/wakealarm [root@localhost ~]#
After this patch:
[root@localhost ~]# cat /sys/class/rtc/rtc0/wakealarm
cat: /sys/class/rtc/rtc0/wakealarm: No such file or directory [root@localhost ~]#
This fixes gnome-session + systemd trying to use suspend-then-hibernate, which causes systemd to abort the suspend when writing the RTC alarm fails.
--- drivers/rtc/rtc-cmos.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/rtc/rtc-cmos.c +12 -4
@@ -257,6 +257,7 @@ static int cmos_read_alarm(struct device *dev, struct rtc_wkalrm *t)struct cmos_rtc *cmos =dev_get_drvdata (dev);unsigned char rtc_control; +/* This not only a rtc_op, but also called directly */ if (!is_valid_irq (cmos->irq))return -EIO ;
@@ -452,6 +453,7 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)unsigned char mon, mday, hrs, min, sec, rtc_control;int ret; +/* This not only a rtc_op, but also called directly */ if (!is_valid_irq (cmos->irq))return -EIO ;
@@ -516,9 +518,6 @@ static int cmos_alarm_irq_enable(struct device *dev, unsigned int enabled)struct cmos_rtc *cmos =dev_get_drvdata (dev);unsigned long flags; -if (!is_valid_irq (cmos->irq)) -return -EINVAL ; -spin_lock_irqsave (&rtc_lock, flags);if (enabled)
@@ -579,6 +578,12 @@ static const struct rtc_class_ops cmos_rtc_ops = { .alarm_irq_enable = cmos_alarm_irq_enable, }; +static const struct rtc_class_ops cmos_rtc_ops_no_alarm = { + .read_time = cmos_read_time, + .set_time = cmos_set_time, + .proc = cmos_procfs, +}; +/*----------------------------------------------------------------*/ /*
@@ -855,9 +860,12 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)dev_dbg (dev,"IRQ %d is already in use\n" , rtc_irq); goto cleanup1; } + + cmos_rtc.rtc->ops = &cmos_rtc_ops; + }else { + cmos_rtc.rtc->ops = &cmos_rtc_ops_no_alarm; } - cmos_rtc.rtc->ops = &cmos_rtc_ops; cmos_rtc.rtc->nvram_old_abi = true; retval =rtc_register_device (cmos_rtc.rtc);if (retval)
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 76/110 rtc: pcf2127: fix a kmemleak caused in pcf2127_i2c_gather_write
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 9bde0afb7a906f1dabdba37162551565740b862d ]
pcf2127_i2c_gather_write() allocates memory as local variable for i2c_master_send(), after finishing the master transfer, the allocated memory should be freed. The kmemleak is reported:
unreferenced object 0xffff80231e7dba80 (size 64):
comm "hwclock", pid 27762, jiffies 4296880075 (age 356.944s) hex dump (first 32 bytes):
03 00 12 03 19 02 11 13 00 80 98 18 00 00 ff ff ................
00 50 00 00 00 00 00 00 02 00 00 00 00 00 00 00 .P..............
backtrace:
[<ffff000008221398>] create_object+0xf8/0x278
[<ffff000008a96264>] kmemleak_alloc+0x74/0xa0
[<ffff00000821070c>] __kmalloc+0x1ac/0x348
[<ffff0000087ed1dc>] pcf2127_i2c_gather_write+0x54/0xf8
[<ffff0000085fd9d4>] _regmap_raw_write+0x464/0x850
[<ffff0000085fe3f4>] regmap_bulk_write+0x1a4/0x348
[<ffff0000087ed32c>] pcf2127_rtc_set_time+0xac/0xe8
[<ffff0000087eaad8>] rtc_set_time+0x80/0x138
[<ffff0000087ebfb0>] rtc_dev_ioctl+0x398/0x610
[<ffff00000823f2c0>] do_vfs_ioctl+0xb0/0x848
[<ffff00000823fae4>] SyS_ioctl+0x8c/0xa8
[<ffff000008083ac0>] el0_svc_naked+0x34/0x38
[<ffffffffffffffff>] 0xffffffffffffffff--- drivers/rtc/rtc-pcf2127.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/rtc/rtc-pcf2127.c +3 -0
@@ -303,6 +303,9 @@ static int pcf2127_i2c_gather_write(void *context,memcpy (buf +1 , val, val_size); ret =i2c_master_send (client, buf, val_size +1 ); + +kfree (buf); +if (ret != val_size +1 )return ret <0 ? ret : -EIO ;
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 77/110 crypto: simd - correctly take reqsize of wrapped skcipher into account
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 508a1c4df085a547187eed346f1bfe5e381797f1 ]
The simd wrapper's skcipher request context structure consists of a single subrequest whose size is taken from the subordinate skcipher. However, in simd_skcipher_init(), the reqsize that is retrieved is not from the subordinate skcipher but from the cryptd request structure, whose size is completely unrelated to the actual wrapped skcipher.
--- crypto/simd.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
crypto/simd.c +3 -2
@@ -124,8 +124,9 @@ static int simd_skcipher_init(struct crypto_skcipher *tfm) ctx->cryptd_tfm = cryptd_tfm; - reqsize =sizeof (struct skcipher_request ); - reqsize +=crypto_skcipher_reqsize (&cryptd_tfm->base); + reqsize =crypto_skcipher_reqsize (cryptd_skcipher_child (cryptd_tfm)); + reqsize =max (reqsize,crypto_skcipher_reqsize (&cryptd_tfm->base)); + reqsize +=sizeof (struct skcipher_request );crypto_skcipher_set_reqsize (tfm, reqsize);
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 78/110 floppy: fix race condition in __floppy_read_block_0()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit de7b75d82f70c5469675b99ad632983c50b6f7e7 ]
LKP recently reported a hang at bootup in the floppy code:
[ 245.678853] INFO: task mount:580 blocked for more than 120 seconds. [ 245.679906] Tainted: G T 4.19.0-rc6-00172-ga9f38e1 #1 [ 245.680959] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 245.682181] mount D 6372 580 1 0x00000004 [ 245.683023] Call Trace: [ 245.683425] __schedule+0x2df/0x570 [ 245.683975] schedule+0x2d/0x80 [ 245.684476] schedule_timeout+0x19d/0x330 [ 245.685090] ? wait_for_common+0xa5/0x170 [ 245.685735] wait_for_common+0xac/0x170 [ 245.686339] ? do_sched_yield+0x90/0x90 [ 245.686935] wait_for_completion+0x12/0x20 [ 245.687571] __floppy_read_block_0+0xfb/0x150 [ 245.688244] ? floppy_resume+0x40/0x40 [ 245.688844] floppy_revalidate+0x20f/0x240 [ 245.689486] check_disk_change+0x43/0x60 [ 245.690087] floppy_open+0x1ea/0x360 [ 245.690653] __blkdev_get+0xb4/0x4d0 [ 245.691212] ? blkdev_get+0x1db/0x370 [ 245.691777] blkdev_get+0x1f3/0x370 [ 245.692351] ? path_put+0x15/0x20 [ 245.692871] ? lookup_bdev+0x4b/0x90 [ 245.693539] blkdev_get_by_path+0x3d/0x80 [ 245.694165] mount_bdev+0x2a/0x190 [ 245.694695] squashfs_mount+0x10/0x20 [ 245.695271] ? squashfs_alloc_inode+0x30/0x30 [ 245.695960] mount_fs+0xf/0x90 [ 245.696451] vfs_kern_mount+0x43/0x130 [ 245.697036] do_mount+0x187/0xc40 [ 245.697563] ? memdup_user+0x28/0x50 [ 245.698124] ksys_mount+0x60/0xc0 [ 245.698639] sys_mount+0x19/0x20 [ 245.699167] do_int80_syscall_32+0x61/0x130 [ 245.699813] entry_INT80_32+0xc7/0xc7
showing that we never complete that read request. The reason is that the completion setup is racy - it initializes the completion event AFTER submitting the IO, which means that the IO could complete before/during the init. If it does, we are passing garbage to complete() and we may sleep forever waiting for the event to occur.
--- drivers/block/floppy.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/block/floppy.c +2 -1
@@ -4151,10 +4151,11 @@ static int __floppy_read_block_0(struct block_device *bdev, int drive) bio.bi_end_io = floppy_rb0_cb;bio_set_op_attrs (&bio,REQ_OP_READ ,0 ); +init_completion (&cbdata.complete); +submit_bio (&bio);process_fd_request (); -init_completion (&cbdata.complete);wait_for_completion (&cbdata.complete);__free_page (page);
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 79/110 powerpc/io: Fix the IO workarounds code to work with Radix
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 43c6494fa1499912c8177e71450c0279041152a6 ]
Back in 2006 Ben added some workarounds for a misbehaviour in the Spider IO bridge used on early Cell machines, see commit 014da7ff47b5 ("[POWERPC] Cell "Spider" MMIO workarounds"). Later these were made to be generic, ie. not tied specifically to Spider.
The code stashes a token in the high bits (59-48) of virtual addresses used for IO (eg. returned from ioremap()). This works fine when using the Hash MMU, but when we're using the Radix MMU the bits used for the token overlap with some of the bits of the virtual address.
This is because the maximum virtual address is larger with Radix, up to c00fffffffffffff, and in fact we use that high part of the address range for ioremap(), see RADIX_KERN_IO_START.
As it happens the bits that are used overlap with the bits that differentiate an IO address vs a linear map address. If the resulting address lies outside the linear mapping we will crash (see below), if not we just corrupt memory.
virtio-pci 0000:00:00.0: Using 64-bit direct DMA at offset 800000000000000
Unable to handle kernel paging request for data at address 0xc000000080000014
...
CFAR: c000000000626b98 DAR: c000000080000014 DSISR: 42000000 IRQMASK: 0
GPR00: c0000000006c54fc c00000003e523378 c0000000016de600 0000000000000000
GPR04: c00c000080000014 0000000000000007 0fffffff000affff 0000000000000030
^^^^
...
NIP [c000000000626c5c] .iowrite8+0xec/0x100
LR [c0000000006c992c] .vp_reset+0x2c/0x90
Call Trace:
.pci_bus_read_config_dword+0xc4/0x120 (unreliable)
.register_virtio_device+0x13c/0x1c0
.virtio_pci_probe+0x148/0x1f0
.local_pci_probe+0x68/0x140
.pci_device_probe+0x164/0x220
.really_probe+0x274/0x3b0
.driver_probe_device+0x80/0x170
.__driver_attach+0x14c/0x150
.bus_for_each_dev+0xb8/0x130
.driver_attach+0x34/0x50
.bus_add_driver+0x178/0x2f0
.driver_register+0x90/0x1a0
.__pci_register_driver+0x6c/0x90
.virtio_pci_driver_init+0x2c/0x40
.do_one_initcall+0x64/0x280
.kernel_init_freeable+0x36c/0x474
.kernel_init+0x24/0x160
.ret_from_kernel_thread+0x58/0x7cThis hasn't been a problem because CONFIG_PPC_IO_WORKAROUNDS which enables this code is usually not enabled. It is only enabled when it's selected by PPC_CELL_NATIVE which is only selected by PPC_IBM_CELL_BLADE and that in turn depends on BIG_ENDIAN. So in order to hit the bug you need to build a big endian kernel, with IBM Cell Blade support enabled, as well as Radix MMU support, and then boot that on Power9 using Radix MMU.
Still we can fix the bug, so let's do that. We simply use fewer bits for the token, taking the union of the restrictions on the address from both Hash and Radix, we end up with 8 bits we can use for the token. The only user of the token is iowa_mem_find_bus() which only supports 8 token values, so 8 bits is plenty for that.
--- arch/powerpc/include/asm/io.h | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-)
arch/powerpc/include/asm/io.h +7 -13
@@ -285,19 +285,13 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src,* their hooks, a bitfield is reserved for use by the platform near the * top of MMIO addresses (not PIO, those have to cope the hard way). * -* This bit field is 12 bits and is at the top of the IO virtual -* addresses PCI_IO_INDIRECT_TOKEN_MASK. +* The highest address in the kernel virtual space are: * -* The kernel virtual space is thus: +* d0003fffffffffff # with Hash MMU +* c00fffffffffffff # with Radix MMU * -* 0xD000000000000000 : vmalloc -* 0xD000080000000000 : PCI PHB IO space -* 0xD000080080000000 : ioremap -* 0xD0000fffffffffff : end of ioremap region -* -* Since the top 4 bits are reserved as the region ID, we use thus -* the next 12 bits and keep 4 bits available for the future if the -* virtual address space is ever to be extended. +* The top 4 bits are reserved as the region ID on hash, leaving us 8 bits +* that can be used for the field. * * The direct IO mapping operations will then mask off those bits * before doing the actual access, though that only happen when
@@ -309,8 +303,8 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src,*/ #ifdef CONFIG_PPC_INDIRECT_MMIO -#define PCI_IO_IND_TOKEN_MASK 0x0fff000000000000ul -#define PCI_IO_IND_TOKEN_SHIFT 48 +#define PCI_IO_IND_TOKEN_SHIFT 52 +#define PCI_IO_IND_TOKEN_MASK (0xfful << PCI_IO_IND_TOKEN_SHIFT)#define PCI_FIX_ADDR (addr) \ ((PCI_IO_ADDR)(((unsigned long)(addr)) & ~PCI_IO_IND_TOKEN_MASK))#define PCI_GET_ADDR_TOKEN (addr) \
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 80/110 sched/fair: Fix cpu_util_wake() for execl type workloads
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c469933e772132aad040bd6a2adc8edf9ad6f825 ]
A ~10% regression has been reported for UnixBench's execl throughput test by Aaron Lu and Ye Xiaolong:
https://lkml.org/lkml/2018/10/30/765
That test is pretty simple, it does a "recursive" execve() syscall on the same binary. Starting from the syscall, this sequence is possible:
do_execve()
do_execveat_common()
__do_execve_file()
sched_exec()
select_task_rq_fair() <==| Task already enqueued
find_idlest_cpu()
find_idlest_group()
capacity_spare_wake() <==| Functions not called from
cpu_util_wake() | the wakeup pathwhich means we can end up calling cpu_util_wake() not only from the "wakeup path", as its name would suggest. Indeed, the task doing an execve() syscall is already enqueued on the CPU we want to get the cpu_util_wake() for.
The estimated utilization for a CPU computed in cpu_util_wake() was written under the assumption that function can be called only from the wakeup path. If instead the task is already enqueued, we end up with a utilization which does not remove the current task's contribution from the estimated utilization of the CPU.
This will wrongly assume a reduced spare capacity on the current CPU and increase the chances to migrate the task on execve.
The regression is tracked down to:
commit d519329f72a6 ("sched/fair: Update util_est only on util_avg updates")
because in that patch we turn on by default the UTIL_EST sched feature. However, the real issue is introduced by:
commit f9be3e5961c5 ("sched/fair: Use util_est in LB and WU paths")
Let's fix this by ensuring to always discount the task estimated utilization from the CPU's estimated utilization when the task is also the current one. The same benchmark of the bug report, executed on a dual socket 40 CPUs Intel(R) Xeon(R) CPU E5-2690 v2 @ 3.00GHz machine, reports these "Execl Throughput" figures (higher the better):
mainline : 48136.5 lps
mainline+fix : 55376.5 lps
which correspond to a 15% speedup.
Moreover, since {cpu_util,capacity_spare}_wake() are not really only used from the wakeup path, let's remove this ambiguity by using a better matching name: {cpu_util,capacity_spare}_without().
Since we are at that, let's also improve the existing documentation.
--- kernel/sched/fair.c | 62 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 14 deletions(-)
kernel/sched/fair.c +48 -14
@@ -5672,11 +5672,11 @@ static int wake_affine(struct sched_domain *sd, struct task_struct *p,return target; } -static unsigned long cpu_util_wake (int cpu,struct task_struct *p); +static unsigned long cpu_util_without (int cpu,struct task_struct *p); -static unsigned long capacity_spare_wake (int cpu,struct task_struct *p) +static unsigned long capacity_spare_without (int cpu,struct task_struct *p) { -return max_t (long,capacity_of (cpu) -cpu_util_wake (cpu, p),0 ); +return max_t (long,capacity_of (cpu) -cpu_util_without (cpu, p),0 ); }/*
@@ -5736,7 +5736,7 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p, avg_load +=cfs_rq_load_avg (&cpu_rq (i)->cfs); - spare_cap =capacity_spare_wake (i, p); + spare_cap =capacity_spare_without (i, p);if (spare_cap > max_spare_cap) max_spare_cap = spare_cap;
@@ -5887,8 +5887,8 @@ static inline int find_idlest_cpu(struct sched_domain *sd, struct task_struct *preturn prev_cpu;/* -* We need task's util for capacity_spare_wake, sync it up to prev_cpu's -* last_update_time. +* We need task's util for capacity_spare_without, sync it up to +* prev_cpu's last_update_time. */ if (!(sd_flag &SD_BALANCE_FORK ))sync_entity_load_avg (&p->se);
@@ -6214,10 +6214,19 @@ static inline unsigned long cpu_util(int cpu) }/* -* cpu_util_wake: Compute CPU utilization with any contributions from -* the waking task p removed. +* cpu_util_without: compute cpu utilization without any contributions from *p +* @cpu: the CPU which utilization is requested +* @p: the task which utilization should be discounted +* +* The utilization of a CPU is defined by the utilization of tasks currently +* enqueued on that CPU as well as tasks which are currently sleeping after an +* execution on that CPU. +* +* This method returns the utilization of the specified CPU by discounting the +* utilization of the specified task, whenever the task is currently +* contributing to the CPU utilization. */ -static unsigned long cpu_util_wake (int cpu,struct task_struct *p) +static unsigned long cpu_util_without (int cpu,struct task_struct *p) {struct cfs_rq *cfs_rq;unsigned int util;
@@ -6229,7 +6238,7 @@ static unsigned long cpu_util_wake(int cpu, struct task_struct *p) cfs_rq = &cpu_rq (cpu)->cfs; util =READ_ONCE (cfs_rq->avg.util_avg); -/* Discount task's blocked util from CPU's util */ +/* Discount task's util from CPU's util */ util -= min_t(unsigned int, util, task_util(p));/*
@@ -6238,14 +6247,14 @@ static unsigned long cpu_util_wake(int cpu, struct task_struct *p)* a) if *p is the only task sleeping on this CPU, then: * cpu_util (== task_util) > util_est (== 0) * and thus we return: -* cpu_util_wake = (cpu_util - task_util) = 0 +* cpu_util_without = (cpu_util - task_util) = 0 * * b) if other tasks are SLEEPING on this CPU, which is now exiting * IDLE, then: * cpu_util >= task_util * cpu_util > util_est (== 0) * and thus we discount *p's blocked utilization to return: -* cpu_util_wake = (cpu_util - task_util) >= 0 +* cpu_util_without = (cpu_util - task_util) >= 0 * * c) if other tasks are RUNNABLE on that CPU and * util_est > cpu_util
@@ -6258,8 +6267,33 @@ static unsigned long cpu_util_wake(int cpu, struct task_struct *p)* covered by the following code when estimated utilization is * enabled. */ -if (sched_feat (UTIL_EST )) - util =max (util,READ_ONCE (cfs_rq->avg.util_est.enqueued)); +if (sched_feat (UTIL_EST )) { +unsigned int estimated = +READ_ONCE (cfs_rq->avg.util_est.enqueued); + +/* +* Despite the following checks we still have a small window +* for a possible race, when an execl's select_task_rq_fair() +* races with LB's detach_task(): +* +* detach_task() +* p->on_rq = TASK_ON_RQ_MIGRATING; +* ---------------------------------- A +* deactivate_task() \ +* dequeue_task() + RaceTime +* util_est_dequeue() / +* ---------------------------------- B +* +* The additional check on "current == p" it's required to +* properly fix the execl regression and it helps in further +* reducing the chances for the above race. +*/ +if (unlikely (task_on_rq_queued (p) || current == p)) { + estimated -= min_t(unsigned int, estimated, + (_task_util_est (p) |UTIL_AVG_UNCHANGED )); + } + util =max (util, estimated); + }/* * Utilization (estimated) can exceed the CPU capacity, thus let's
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 81/110 perf/x86/intel/uncore: Add more IMC PCI IDs for KabyLake and CoffeeLake CPUs
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c10a8de0d32e95b0b8c7c17b6dc09baea5a5a899 ]
KabyLake and CoffeeLake CPUs have the same client uncore events as SkyLake.
Add the PCI IDs for the KabyLake Y, U, S processor lines and CoffeeLake U, H, S processor lines.
--- arch/x86/events/intel/uncore_snb.c | 115 ++++++++++++++++++++++++++++- 1 file changed, 114 insertions(+), 1 deletion(-)
arch/x86/events/intel/uncore_snb.c +114 -1
@@ -15,6 +15,25 @@#define PCI_DEVICE_ID_INTEL_SKL_HQ_IMC 0x1910#define PCI_DEVICE_ID_INTEL_SKL_SD_IMC 0x190f#define PCI_DEVICE_ID_INTEL_SKL_SQ_IMC 0x191f +#define PCI_DEVICE_ID_INTEL_KBL_Y_IMC 0x590c +#define PCI_DEVICE_ID_INTEL_KBL_U_IMC 0x5904 +#define PCI_DEVICE_ID_INTEL_KBL_UQ_IMC 0x5914 +#define PCI_DEVICE_ID_INTEL_KBL_SD_IMC 0x590f +#define PCI_DEVICE_ID_INTEL_KBL_SQ_IMC 0x591f +#define PCI_DEVICE_ID_INTEL_CFL_2U_IMC 0x3ecc +#define PCI_DEVICE_ID_INTEL_CFL_4U_IMC 0x3ed0 +#define PCI_DEVICE_ID_INTEL_CFL_4H_IMC 0x3e10 +#define PCI_DEVICE_ID_INTEL_CFL_6H_IMC 0x3ec4 +#define PCI_DEVICE_ID_INTEL_CFL_2S_D_IMC 0x3e0f +#define PCI_DEVICE_ID_INTEL_CFL_4S_D_IMC 0x3e1f +#define PCI_DEVICE_ID_INTEL_CFL_6S_D_IMC 0x3ec2 +#define PCI_DEVICE_ID_INTEL_CFL_8S_D_IMC 0x3e30 +#define PCI_DEVICE_ID_INTEL_CFL_4S_W_IMC 0x3e18 +#define PCI_DEVICE_ID_INTEL_CFL_6S_W_IMC 0x3ec6 +#define PCI_DEVICE_ID_INTEL_CFL_8S_W_IMC 0x3e31 +#define PCI_DEVICE_ID_INTEL_CFL_4S_S_IMC 0x3e33 +#define PCI_DEVICE_ID_INTEL_CFL_6S_S_IMC 0x3eca +#define PCI_DEVICE_ID_INTEL_CFL_8S_S_IMC 0x3e32/* SNB event control */ #define SNB_UNC_CTL_EV_SEL_MASK 0x000000ff
@@ -569,7 +588,82 @@ static const struct pci_device_id skl_uncore_pci_ids[] = { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_SQ_IMC), .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), }, - + {/* IMC */ + PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KBL_Y_IMC), + .driver_data =UNCORE_PCI_DEV_DATA (SNB_PCI_UNCORE_IMC ,0 ), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_KBL_U_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_KBL_UQ_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_KBL_SD_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_KBL_SQ_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_2U_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_4U_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_4H_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_6H_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_2S_D_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_4S_D_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_6S_D_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_8S_D_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_4S_W_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_6S_W_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_8S_W_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_4S_S_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_6S_S_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, + { /* IMC */ +PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_CFL_8S_S_IMC ), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, { /* end: all zeroes */ }, };
@@ -618,6 +712,25 @@ static const struct imc_uncore_pci_dev desktop_imc_pci_ids[] = {IMC_DEV (SKL_HQ_IMC , &skl_uncore_pci_driver),/* 6th Gen Core H Quad Core */ IMC_DEV (SKL_SD_IMC , &skl_uncore_pci_driver),/* 6th Gen Core S Dual Core */ IMC_DEV (SKL_SQ_IMC , &skl_uncore_pci_driver),/* 6th Gen Core S Quad Core */ +IMC_DEV (KBL_Y_IMC , &skl_uncore_pci_driver),/* 7th Gen Core Y */ +IMC_DEV (KBL_U_IMC , &skl_uncore_pci_driver),/* 7th Gen Core U */ +IMC_DEV (KBL_UQ_IMC , &skl_uncore_pci_driver),/* 7th Gen Core U Quad Core */ +IMC_DEV (KBL_SD_IMC , &skl_uncore_pci_driver),/* 7th Gen Core S Dual Core */ +IMC_DEV (KBL_SQ_IMC , &skl_uncore_pci_driver),/* 7th Gen Core S Quad Core */ +IMC_DEV (CFL_2U_IMC , &skl_uncore_pci_driver),/* 8th Gen Core U 2 Cores */ +IMC_DEV (CFL_4U_IMC , &skl_uncore_pci_driver),/* 8th Gen Core U 4 Cores */ +IMC_DEV (CFL_4H_IMC , &skl_uncore_pci_driver),/* 8th Gen Core H 4 Cores */ +IMC_DEV (CFL_6H_IMC , &skl_uncore_pci_driver),/* 8th Gen Core H 6 Cores */ +IMC_DEV (CFL_2S_D_IMC , &skl_uncore_pci_driver),/* 8th Gen Core S 2 Cores Desktop */ +IMC_DEV (CFL_4S_D_IMC , &skl_uncore_pci_driver),/* 8th Gen Core S 4 Cores Desktop */ +IMC_DEV (CFL_6S_D_IMC , &skl_uncore_pci_driver),/* 8th Gen Core S 6 Cores Desktop */ +IMC_DEV (CFL_8S_D_IMC , &skl_uncore_pci_driver),/* 8th Gen Core S 8 Cores Desktop */ +IMC_DEV (CFL_4S_W_IMC , &skl_uncore_pci_driver),/* 8th Gen Core S 4 Cores Work Station */ +IMC_DEV (CFL_6S_W_IMC , &skl_uncore_pci_driver),/* 8th Gen Core S 6 Cores Work Station */ +IMC_DEV (CFL_8S_W_IMC , &skl_uncore_pci_driver),/* 8th Gen Core S 8 Cores Work Station */ +IMC_DEV (CFL_4S_S_IMC , &skl_uncore_pci_driver),/* 8th Gen Core S 4 Cores Server */ +IMC_DEV (CFL_6S_S_IMC , &skl_uncore_pci_driver),/* 8th Gen Core S 6 Cores Server */ + IMC_DEV(CFL_8S_S_IMC, &skl_uncore_pci_driver), /* 8th Gen Core S 8 Cores Server */ { /* end marker */ } };
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 82/110 ARM: make lookup_processor_type() non-__init
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 899a42f836678a595f7d2bc36a5a0c2b03d08cbc ]
Move lookup_processor_type() out of the __init section so it is callable from (eg) the secondary startup code during hotplug.
--- arch/arm/kernel/head-common.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm/kernel/head-common.S +3 -3
@@ -145,6 +145,9 @@ __mmap_switched_data: #endif .size __mmap_switched_data, . - __mmap_switched_data + __FINIT + .text + /* * This provides a C-API version of __lookup_processor_type */
@@ -156,9 +159,6 @@ ENTRY(lookup_processor_type) ldmfd sp!, {r4 - r6, r9, pc} ENDPROC(lookup_processor_type) - __FINIT - .text - /* * Read processor ID register (CP#15, CR0), and look up in the linker-built * supported processor list. Note that we can't use the absolute addresses
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 83/110 ARM: clean up per-processor check_bugs method call
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 945aceb1db8885d3a35790cf2e810f681db52756 ]
Call the per-processor type check_bugs() method in the same way as we do other per-processor functions - move the "processor." detail into proc-fns.h.
--- arch/arm/include/asm/proc-fns.h | 1 + arch/arm/kernel/bugs.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-)
arch/arm/include/asm/proc-fns.h +1 -0
@@ -99,6 +99,7 @@ extern void cpu_do_suspend(void *);extern void cpu_do_resume (void *);#else #define cpu_proc_init processor._proc_init +#define cpu_check_bugs processor.check_bugs#define cpu_proc_fin processor._proc_fin#define cpu_reset processor.reset#define cpu_do_idle processor._do_idle
arch/arm/kernel/bugs.c +2 -2
@@ -6,8 +6,8 @@void check_other_bugs (void ) {#ifdef MULTI_CPU -if (processor.check_bugs) - processor.check_bugs (); +if (cpu_check_bugs) +cpu_check_bugs ();#endif }
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 84/110 ARM: add PROC_VTABLE and PROC_TABLE macros
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e209950fdd065d2cc46e6338e47e52841b830cba ]
Allow the way we access members of the processor vtable to be changed at compile time. We will need to move to per-CPU vtables to fix the Spectre variant 2 issues on big.Little systems.
However, we have a couple of calls that do not need the vtable treatment, and indeed cause a kernel warning due to the (later) use of smp_processor_id(), so also introduce the PROC_TABLE macro for these which always use CPU 0's function pointers.
--- arch/arm/include/asm/proc-fns.h | 39 ++++++++++++++++++++++----------- arch/arm/kernel/setup.c | 4 +--- 2 files changed, 27 insertions(+), 16 deletions(-)
arch/arm/include/asm/proc-fns.h +26 -13
@@ -23,7 +23,7 @@ struct mm_struct;/* * Don't change this structure - ASM code relies on it. */ -extern struct processor { +struct processor {/* MISC * get data abort address/flags */
@@ -79,9 +79,13 @@ extern struct processor {unsigned int suspend_size;void (*do_suspend)(void *);void (*do_resume)(void *); -} processor; +};#ifndef MULTI_CPU +static inline void init_proc_vtable (const struct processor *p) +{ +} +extern void cpu_proc_init (void );extern void cpu_proc_fin (void );extern int cpu_do_idle (void );
@@ -98,18 +102,27 @@ extern void cpu_reset(unsigned long addr, bool hvc) __attribute__((noreturn));extern void cpu_do_suspend (void *);extern void cpu_do_resume (void *);#else -#define cpu_proc_init processor._proc_init -#define cpu_check_bugs processor.check_bugs -#define cpu_proc_fin processor._proc_fin -#define cpu_reset processor.reset -#define cpu_do_idle processor._do_idle -#define cpu_dcache_clean_area processor.dcache_clean_area -#define cpu_set_pte_ext processor.set_pte_ext -#define cpu_do_switch_mm processor.switch_mm -/* These three are private to arch/arm/kernel/suspend.c */ -#define cpu_do_suspend processor.do_suspend -#define cpu_do_resume processor.do_resume +extern struct processor processor; +#define PROC_VTABLE (f) processor.f +#define PROC_TABLE (f) processor.f +static inline void init_proc_vtable (const struct processor *p) +{ + processor = *p; +} + +#define cpu_proc_init PROC_VTABLE(_proc_init) +#define cpu_check_bugs PROC_VTABLE(check_bugs) +#define cpu_proc_fin PROC_VTABLE(_proc_fin) +#define cpu_reset PROC_VTABLE(reset) +#define cpu_do_idle PROC_VTABLE(_do_idle) +#define cpu_dcache_clean_area PROC_TABLE(dcache_clean_area) +#define cpu_set_pte_ext PROC_TABLE(set_pte_ext) +#define cpu_do_switch_mm PROC_VTABLE(switch_mm) + +/* These two are private to arch/arm/kernel/suspend.c */ +#define cpu_do_suspend PROC_VTABLE(do_suspend) +#define cpu_do_resume PROC_VTABLE(do_resume)#endif extern void cpu_resume (void );
arch/arm/kernel/setup.c +1 -3
@@ -686,9 +686,7 @@ static void __init setup_processor(void) cpu_name = list->cpu_name; __cpu_architecture =__get_cpu_architecture (); -#ifdef MULTI_CPU - processor = *list->proc; -#endif +init_proc_vtable (list->proc);#ifdef MULTI_TLB cpu_tlb = *list->tlb;#endif
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 85/110 ARM: spectre-v2: per-CPU vtables to work around big.Little systems
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 383fb3ee8024d596f488d2dbaf45e572897acbdb ]
In big.Little systems, some CPUs require the Spectre workarounds in paths such as the context switch, but other CPUs do not. In order to handle these differences, we need per-CPU vtables.
We are unable to use the kernel's per-CPU variables to support this as per-CPU is not initialised at times when we need access to the vtables, so we have to use an array indexed by logical CPU number.
We use an array-of-pointers to avoid having function pointers in the kernel's read/write .data section.
--- arch/arm/include/asm/proc-fns.h | 23 +++++++++++++++++++++++ arch/arm/kernel/setup.c | 5 +++++ arch/arm/kernel/smp.c | 31 +++++++++++++++++++++++++++++++ arch/arm/mm/proc-v7-bugs.c | 17 ++--------------- 4 files changed, 61 insertions(+), 15 deletions(-)
arch/arm/include/asm/proc-fns.h +23 -0
@@ -104,12 +104,35 @@ extern void cpu_do_resume(void *);#else extern struct processor processor; +#if defined(CONFIG_BIG_LITTLE ) && defined(CONFIG_HARDEN_BRANCH_PREDICTOR ) +#include <linux/smp.h> +/* +* This can't be a per-cpu variable because we need to access it before +* per-cpu has been initialised. We have a couple of functions that are +* called in a pre-emptible context, and so can't use smp_processor_id() +* there, hence PROC_TABLE(). We insist in init_proc_vtable() that the +* function pointers for these are identical across all CPUs. +*/ +extern struct processor *cpu_vtable[]; +#define PROC_VTABLE (f) cpu_vtable[smp_processor_id()]->f +#define PROC_TABLE (f) cpu_vtable[0]->f +static inline void init_proc_vtable (const struct processor *p) +{ +unsigned int cpu =smp_processor_id (); + *cpu_vtable[cpu] = *p; +WARN_ON_ONCE (cpu_vtable[cpu]->dcache_clean_area != + cpu_vtable[0 ]->dcache_clean_area); +WARN_ON_ONCE (cpu_vtable[cpu]->set_pte_ext != + cpu_vtable[0 ]->set_pte_ext); +} +#else #define PROC_VTABLE (f) processor.f#define PROC_TABLE (f) processor.fstatic inline void init_proc_vtable (const struct processor *p) { processor = *p; } +#endif #define cpu_proc_init PROC_VTABLE(_proc_init)#define cpu_check_bugs PROC_VTABLE(check_bugs)
arch/arm/kernel/setup.c +5 -0
@@ -115,6 +115,11 @@ EXPORT_SYMBOL(elf_hwcap2);#ifdef MULTI_CPU struct processor processor__ro_after_init ; +#if defined(CONFIG_BIG_LITTLE ) && defined(CONFIG_HARDEN_BRANCH_PREDICTOR ) +struct processor *cpu_vtable[NR_CPUS ] = { + [0 ] = &processor, +}; +#endif #endif #ifdef MULTI_TLB struct cpu_tlb_fns cpu_tlb__ro_after_init ;
arch/arm/kernel/smp.c +31 -0
@@ -42,6 +42,7 @@#include <asm/mmu_context.h> #include <asm/pgtable.h> #include <asm/pgalloc.h> +#include <asm/procinfo.h> #include <asm/processor.h> #include <asm/sections.h> #include <asm/tlbflush.h>
@@ -102,6 +103,30 @@ static unsigned long get_arch_pgd(pgd_t *pgd)#endif } +#if defined(CONFIG_BIG_LITTLE ) && defined(CONFIG_HARDEN_BRANCH_PREDICTOR ) +static int secondary_biglittle_prepare (unsigned int cpu) +{ +if (!cpu_vtable[cpu]) + cpu_vtable[cpu] =kzalloc (sizeof (*cpu_vtable[cpu]),GFP_KERNEL ); + +return cpu_vtable[cpu] ?0 : -ENOMEM ; +} + +static void secondary_biglittle_init (void ) +{ +init_proc_vtable (lookup_processor (read_cpuid_id ())->proc); +} +#else +static int secondary_biglittle_prepare (unsigned int cpu) +{ +return 0 ; +} + +static void secondary_biglittle_init (void ) +{ +} +#endif +int __cpu_up (unsigned int cpu,struct task_struct *idle) {int ret;
@@ -109,6 +134,10 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle)if (!smp_ops.smp_boot_secondary)return -ENOSYS ; + ret =secondary_biglittle_prepare (cpu); +if (ret) +return ret; +/* * We need to tell the secondary core where to find * its stack and the page tables.
@@ -359,6 +388,8 @@ asmlinkage void secondary_start_kernel(void)struct mm_struct *mm = &init_mm;unsigned int cpu; +secondary_biglittle_init (); +/* * The identity mapping is uncached (strongly ordered), so * switch away from it before attempting any exclusive accesses.
arch/arm/mm/proc-v7-bugs.c +2 -15
@@ -52,8 +52,6 @@ static void cpu_v7_spectre_init(void)case ARM_CPU_PART_CORTEX_A17 :case ARM_CPU_PART_CORTEX_A73 :case ARM_CPU_PART_CORTEX_A75 : -if (processor.switch_mm != cpu_v7_bpiall_switch_mm) - goto bl_error;per_cpu (harden_branch_predictor_fn, cpu) = harden_branch_predictor_bpiall; spectre_v2_method ="BPIALL" ;
@@ -61,8 +59,6 @@ static void cpu_v7_spectre_init(void)case ARM_CPU_PART_CORTEX_A15 :case ARM_CPU_PART_BRAHMA_B15 : -if (processor.switch_mm != cpu_v7_iciallu_switch_mm) - goto bl_error;per_cpu (harden_branch_predictor_fn, cpu) = harden_branch_predictor_iciallu; spectre_v2_method ="ICIALLU" ;
@@ -88,11 +84,9 @@ static void cpu_v7_spectre_init(void) ARM_SMCCC_ARCH_WORKAROUND_1, &res);if ((int )res.a0 !=0 )break ; -if (processor.switch_mm != cpu_v7_hvc_switch_mm && cpu) - goto bl_error;per_cpu (harden_branch_predictor_fn, cpu) = call_hvc_arch_workaround_1; - processor.switch_mm = cpu_v7_hvc_switch_mm; + cpu_do_switch_mm = cpu_v7_hvc_switch_mm; spectre_v2_method ="hypervisor" ;break ;
@@ -101,11 +95,9 @@ static void cpu_v7_spectre_init(void) ARM_SMCCC_ARCH_WORKAROUND_1, &res);if ((int )res.a0 !=0 )break ; -if (processor.switch_mm != cpu_v7_smc_switch_mm && cpu) - goto bl_error;per_cpu (harden_branch_predictor_fn, cpu) = call_smc_arch_workaround_1; - processor.switch_mm = cpu_v7_smc_switch_mm; + cpu_do_switch_mm = cpu_v7_smc_switch_mm; spectre_v2_method ="firmware" ;break ;
@@ -119,11 +111,6 @@ static void cpu_v7_spectre_init(void)if (spectre_v2_method)pr_info ("CPU%u: Spectre v2: using %s workaround\n" , smp_processor_id(), spectre_v2_method); -return ; - -bl_error: -pr_err ("CPU%u: Spectre v2: incorrect context switching function, system vulnerable\n" , - cpu); }#else static void cpu_v7_spectre_init (void )
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 86/110 block: copy ioprio in __bio_clone_fast() and bounce
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ca474b73896bf6e0c1eb8787eb217b0f80221610 ]
We need to copy the io priority, too; otherwise the clone will run with a different priority than the original one.
Fixed up subject, and ordered stores.
--- block/bio.c | 1 + block/bounce.c | 1 + 2 files changed, 2 insertions(+)
block/bio.c +1 -0
@@ -605,6 +605,7 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src)if (bio_flagged (bio_src,BIO_THROTTLED ))bio_set_flag (bio,BIO_THROTTLED ); bio->bi_opf = bio_src->bi_opf; + bio->bi_ioprio = bio_src->bi_ioprio; bio->bi_write_hint = bio_src->bi_write_hint; bio->bi_iter = bio_src->bi_iter; bio->bi_io_vec = bio_src->bi_io_vec;
block/bounce.c +1 -0
@@ -248,6 +248,7 @@ static struct bio *bounce_clone_bio(struct bio *bio_src, gfp_t gfp_mask,return NULL ; bio->bi_disk = bio_src->bi_disk; bio->bi_opf = bio_src->bi_opf; + bio->bi_ioprio = bio_src->bi_ioprio; bio->bi_write_hint = bio_src->bi_write_hint; bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector; bio->bi_iter.bi_size = bio_src->bi_iter.bi_size;
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 87/110 SUNRPC: Fix a bogus get/put in generic_key_to_expire()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e3d5e573a54dabdc0f9f3cb039d799323372b251 ]
--- net/sunrpc/auth_generic.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
net/sunrpc/auth_generic.c +1 -7
@@ -281,13 +281,7 @@ static bool generic_key_to_expire(struct rpc_cred *cred) { struct auth_cred *acred = &container_of(cred, struct generic_cred, gc_base)->acred; -bool ret; - -get_rpccred (cred); - ret =test_bit (RPC_CRED_KEY_EXPIRE_SOON , &acred->ac_flags); -put_rpccred (cred); - -return ret; +return test_bit (RPC_CRED_KEY_EXPIRE_SOON , &acred->ac_flags); }static const struct rpc_credops generic_credops = {
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 88/110 riscv: add missing vdso_install target
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit f157d411a9eb170d2ee6b766da7a381962017cc9 ]
Building kernel 4.20 for Fedora as RPM fails, because riscv is missing vdso_install target in arch/riscv/Makefile.
--- arch/riscv/Makefile | 4 ++++ 1 file changed, 4 insertions(+)
arch/riscv/Makefile +4 -0
@@ -82,4 +82,8 @@ core-y += arch/riscv/kernel/ arch/riscv/mm/ libs-y += arch/riscv/lib/ +PHONY += vdso_install +vdso_install: + $(Q)$(MAKE) $(build)=arch/riscv/kernel/vdso $@ + all: vmlinux
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 89/110 RISC-V: Silence some module warnings on 32-bit
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ef3a61406618291c46da168ff91acaa28d85944c ]
Fixes:
arch/riscv/kernel/module.c: In function 'apply_r_riscv_32_rela':./include/linux/kern_levels.h:5:18: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 3 has type 'Elf32_Addr' {aka 'unsigned int'} [-Wformat=] arch/riscv/kernel/module.c:23:27: note: format string is defined herearch/riscv/kernel/module.c: In function 'apply_r_riscv_pcrel_hi20_rela':./include/linux/kern_levels.h:5:18: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 3 has type 'Elf32_Addr' {aka 'unsigned int'} [-Wformat=] arch/riscv/kernel/module.c:104:23: note: format string is defined herearch/riscv/kernel/module.c: In function 'apply_r_riscv_hi20_rela':./include/linux/kern_levels.h:5:18: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 3 has type 'Elf32_Addr' {aka 'unsigned int'} [-Wformat=] arch/riscv/kernel/module.c:146:23: note: format string is defined herearch/riscv/kernel/module.c: In function 'apply_r_riscv_got_hi20_rela':./include/linux/kern_levels.h:5:18: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 3 has type 'Elf32_Addr' {aka 'unsigned int'} [-Wformat=] arch/riscv/kernel/module.c:190:60: note: format string is defined herearch/riscv/kernel/module.c: In function 'apply_r_riscv_call_plt_rela':./include/linux/kern_levels.h:5:18: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 3 has type 'Elf32_Addr' {aka 'unsigned int'} [-Wformat=] arch/riscv/kernel/module.c:214:24: note: format string is defined herearch/riscv/kernel/module.c: In function 'apply_r_riscv_call_rela':./include/linux/kern_levels.h:5:18: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 3 has type 'Elf32_Addr' {aka 'unsigned int'} [-Wformat=] arch/riscv/kernel/module.c:236:23: note: format string is defined here
--- arch/riscv/kernel/module.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
arch/riscv/kernel/module.c +6 -6
@@ -21,7 +21,7 @@ static int apply_r_riscv_32_rela(struct module *me, u32 *location, Elf_Addr v) {if (v != (u32 )v) {pr_err ("%s: value %016llx out of range for 32-bit field\n" , - me->name, v); + me->name, (long long )v);return -EINVAL ; } *location = v;
@@ -102,7 +102,7 @@ static int apply_r_riscv_pcrel_hi20_rela(struct module *me, u32 *location,if (offset != (s32 )offset) {pr_err ("%s: target %016llx can not be addressed by the 32-bit offset from PC = %p\n" , - me->name, v, location); + me->name, (long long )v, location);return -EINVAL ; }
@@ -144,7 +144,7 @@ static int apply_r_riscv_hi20_rela(struct module *me, u32 *location,if (IS_ENABLED (CMODEL_MEDLOW )) {pr_err ("%s: target %016llx can not be addressed by the 32-bit offset from PC = %p\n" , - me->name, v, location); + me->name, (long long )v, location);return -EINVAL ; }
@@ -188,7 +188,7 @@ static int apply_r_riscv_got_hi20_rela(struct module *me, u32 *location, }else {pr_err ("%s: can not generate the GOT entry for symbol = %016llx from PC = %p\n" , - me->name, v, location); + me->name, (long long )v, location);return -EINVAL ; }
@@ -212,7 +212,7 @@ static int apply_r_riscv_call_plt_rela(struct module *me, u32 *location, }else {pr_err ("%s: target %016llx can not be addressed by the 32-bit offset from PC = %p\n" , - me->name, v, location); + me->name, (long long )v, location);return -EINVAL ; } }
@@ -234,7 +234,7 @@ static int apply_r_riscv_call_rela(struct module *me, u32 *location,if (offset != fill_v) {pr_err ("%s: target %016llx can not be addressed by the 32-bit offset from PC = %p\n" , - me->name, v, location); + me->name, (long long )v, location);return -EINVAL ; }
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 90/110 drm/amdgpu: fix bug with IH ring setup
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c837243ff4017f493c7d6f4ab57278d812a86859 ]
The bug limits the IH ring wptr address to 40bit. When the system memory is bigger than 1TB, the bus address is more than 40bit, this causes the interrupt cannot be handled and cleared correctly.
--- drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/vega10_ih.c +1 -1
@@ -129,7 +129,7 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)else wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs *4 );WREG32_SOC15 (OSSSYS ,0 , mmIH_RB_WPTR_ADDR_LO,lower_32_bits (wptr_off)); -WREG32_SOC15 (OSSSYS ,0 , mmIH_RB_WPTR_ADDR_HI,upper_32_bits (wptr_off) &0xFF ); +WREG32_SOC15 (OSSSYS ,0 , mmIH_RB_WPTR_ADDR_HI,upper_32_bits (wptr_off) &0xFFFF );/* set rptr, wptr to 0 */ WREG32_SOC15 (OSSSYS ,0 , mmIH_RB_RPTR,0 );
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 91/110 kdb: Use strscpy with destination buffer size
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c2b94c72d93d0929f48157eef128c4f9d2e603ce ]
gcc 8.1.0 warns with:
kernel/debug/kdb/kdb_support.c: In function ‘kallsyms_symbol_next’:kernel/debug/kdb/kdb_support.c:239:4: warning: ‘strncpy’ specified bound depends on the length of the source argument [-Wstringop-overflow=]
strncpy(prefix_name, name, strlen(name)+1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kernel/debug/kdb/kdb_support.c:239:31: note: length computed here
Use strscpy() with the destination buffer size, and use ellipses when displaying truncated symbols.
v2: Use strscpy()
--- kernel/debug/kdb/kdb_io.c | 15 +++++++++------ kernel/debug/kdb/kdb_private.h | 2 +- kernel/debug/kdb/kdb_support.c | 10 +++++----- 3 files changed, 15 insertions(+), 12 deletions(-)
kernel/debug/kdb/kdb_io.c +9 -6
@@ -216,7 +216,7 @@ static char *kdb_read(char *buffer, size_t bufsize)int count;int i;int diag, dtab_count; -int key; +int key, buf_size, ret; diag =kdbgetintenv ("DTABCOUNT" , &dtab_count);
@@ -336,9 +336,8 @@ poll_again:else p_tmp = tmpbuffer; len =strlen (p_tmp); - count =kallsyms_symbol_complete (p_tmp, -sizeof (tmpbuffer) - - (p_tmp - tmpbuffer)); + buf_size =sizeof (tmpbuffer) - (p_tmp - tmpbuffer); + count =kallsyms_symbol_complete (p_tmp, buf_size);if (tab ==2 && count >0 ) {kdb_printf ("\n%d symbols are found." , count);if (count > dtab_count) {
@@ -350,9 +349,13 @@ poll_again: }kdb_printf ("\n" );for (i =0 ; i < count; i++) { -if (WARN_ON (!kallsyms_symbol_next (p_tmp, i))) + ret =kallsyms_symbol_next (p_tmp, i, buf_size); +if (WARN_ON (!ret))break ; -kdb_printf ("%s " , p_tmp); +if (ret != -E2BIG ) +kdb_printf ("%s " , p_tmp); +else +kdb_printf ("%s... " , p_tmp); *(p_tmp + len) ='\0' ; }if (i >= dtab_count)
kernel/debug/kdb/kdb_private.h +1 -1
@@ -83,7 +83,7 @@ typedef struct __ksymtab {unsigned long sym_start;unsigned long sym_end; } kdb_symtab_t; -extern int kallsyms_symbol_next (char *prefix_name,int flag); +extern int kallsyms_symbol_next (char *prefix_name,int flag,int buf_size);extern int kallsyms_symbol_complete (char *prefix_name,int max_len);/* Exported Symbols for kernel loadable modules to use. */
kernel/debug/kdb/kdb_support.c +5 -5
@@ -221,11 +221,13 @@ int kallsyms_symbol_complete(char *prefix_name, int max_len)* Parameters: * prefix_name prefix of a symbol name to lookup * flag 0 means search from the head, 1 means continue search. +* buf_size maximum length that can be written to prefix_name +* buffer * Returns: * 1 if a symbol matches the given prefix. * 0 if no string found */ -int kallsyms_symbol_next (char *prefix_name,int flag) +int kallsyms_symbol_next (char *prefix_name,int flag,int buf_size) {int prefix_len =strlen (prefix_name);static loff_t pos;
@@ -235,10 +237,8 @@ int kallsyms_symbol_next(char *prefix_name, int flag) pos =0 ;while ((name =kdb_walk_kallsyms (&pos))) { -if (strncmp (name, prefix_name, prefix_len) ==0 ) { -strncpy (prefix_name, name,strlen (name)+1 ); -return 1 ; - } +if (!strncmp (name, prefix_name, prefix_len)) +return strscpy (prefix_name, name, buf_size); }return 0 ; }
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 92/110 NFSv4: Fix an Oops during delegation callbacks
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e39d8a186ed002854196668cb7562ffdfbc6d379 ]
If the server sends a CB_GETATTR or a CB_RECALL while the filesystem is being unmounted, then we can Oops when releasing the inode in nfs4_callback_getattr() and nfs4_callback_recall().
--- fs/nfs/callback_proc.c | 4 ++-- fs/nfs/delegation.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-)
fs/nfs/callback_proc.c +2 -2
@@ -66,7 +66,7 @@ __be32 nfs4_callback_getattr(void *argp, void *resp, out_iput:rcu_read_unlock ();trace_nfs4_cb_getattr (cps->clp, &args->fh, inode, -ntohl (res->status)); -iput (inode); +nfs_iput_and_deactive (inode); out:dprintk ("%s: exit with status = %d\n" , __func__,ntohl (res->status));return res->status;
@@ -108,7 +108,7 @@ __be32 nfs4_callback_recall(void *argp, void *resp, }trace_nfs4_cb_recall (cps->clp, &args->fh, inode, &args->stateid, -ntohl (res)); -iput (inode); +nfs_iput_and_deactive (inode); out:dprintk ("%s: exit with status = %d\n" , __func__,ntohl (res));return res;
fs/nfs/delegation.c +9 -2
@@ -849,16 +849,23 @@ nfs_delegation_find_inode_server(struct nfs_server *server, const struct nfs_fh *fhandle) {struct nfs_delegation *delegation; -struct inode *res =NULL ; +struct inode *freeme, *res =NULL ;list_for_each_entry_rcu (delegation, &server->delegations, super_list) {spin_lock (&delegation->lock);if (delegation->inode !=NULL &&nfs_compare_fh (fhandle, &NFS_I (delegation->inode)->fh) ==0 ) { - res =igrab (delegation->inode); + freeme =igrab (delegation->inode); +if (freeme &&nfs_sb_active (freeme->i_sb)) + res = freeme;spin_unlock (&delegation->lock);if (res !=NULL )return res; +if (freeme) { +rcu_read_unlock (); +iput (freeme); +rcu_read_lock (); + }return ERR_PTR (-EAGAIN ); }spin_unlock (&delegation->lock);
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 93/110 powerpc/numa: Suppress "VPHN is not supported" messages
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 437ccdc8ce629470babdda1a7086e2f477048cbd ]
When VPHN function is not supported and during cpu hotplug event, kernel prints message 'VPHN function not supported. Disabling polling...'. Currently it prints on every hotplug event, it floods dmesg when a KVM guest tries to hotplug huge number of vcpus, let's just print once and suppress further kernel prints.
--- arch/powerpc/mm/numa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/mm/numa.c +1 -1
@@ -1179,7 +1179,7 @@ static long vphn_get_associativity(unsigned long cpu,switch (rc) {case H_FUNCTION : -printk (KERN_INFO +printk_once (KERN_INFO "VPHN is not supported. Disabling polling...\n" );stop_topology_update ();break ;
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 94/110 efi/arm: Revert deferred unmap of early memmap mapping
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 33412b8673135b18ea42beb7f5117ed0091798b6 ]
Commit:
3ea86495aef2 ("efi/arm: preserve early mapping of UEFI memory map longer for BGRT")
deferred the unmap of the early mapping of the UEFI memory map to accommodate the ACPI BGRT code, which looks up the memory type that backs the BGRT table to validate it against the requirements of the UEFI spec.
Unfortunately, this causes problems on ARM, which does not permit early mappings to persist after paging_init() is called, resulting in a WARN() splat. Since we don't support the BGRT table on ARM anway, let's revert ARM to the old behaviour, which is to take down the early mapping at the end of efi_init().
--- drivers/firmware/efi/arm-init.c | 4 ++++ drivers/firmware/efi/arm-runtime.c | 2 +- drivers/firmware/efi/memmap.c | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-)
drivers/firmware/efi/arm-init.c +4 -0
@@ -265,6 +265,10 @@ void __init efi_init(void) (params.mmap & ~PAGE_MASK)));init_screen_info (); + +/* ARM does not permit early mappings to persist across paging_init() */ +if (IS_ENABLED (CONFIG_ARM )) +efi_memmap_unmap (); }static int __init register_gop_device (void )
drivers/firmware/efi/arm-runtime.c +1 -1
@@ -110,7 +110,7 @@ static int __init arm_enable_runtime_services(void) {u64 mapsize; -if (!efi_enabled (EFI_BOOT ) || !efi_enabled (EFI_MEMMAP )) { +if (!efi_enabled (EFI_BOOT )) {pr_info ("EFI services will not be available.\n" );return 0 ; }
drivers/firmware/efi/memmap.c +3 -0
@@ -118,6 +118,9 @@ int __init efi_memmap_init_early(struct efi_memory_map_data *data)void __init efi_memmap_unmap (void ) { +if (!efi_enabled (EFI_MEMMAP )) +return ; +if (!efi.memmap.late) {unsigned long size;
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 95/110 z3fold: fix possible reclaim races
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ca0246bb97c23da9d267c2107c07fb77e38205c9 ]
Reclaim and free can race on an object which is basically fine but in order for reclaim to be able to map "freed" object we need to encode object length in the handle. handle_to_chunks() is then introduced to extract object length from a handle and use it during mapping.
Moreover, to avoid racing on a z3fold "headless" page release, we should not try to free that page in z3fold_free() if the reclaim bit is set. Also, in the unlikely case of trying to reclaim a page being freed, we should not proceed with that page.
While at it, fix the page accounting in reclaim function.
This patch supersedes "[PATCH] z3fold: fix reclaim lock-ups".
--- mm/z3fold.c | 101 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 39 deletions(-)
mm/z3fold.c +62 -39
@@ -99,6 +99,7 @@ struct z3fold_header {#define NCHUNKS ((PAGE_SIZE - ZHDR_SIZE_ALIGNED) >> CHUNK_SHIFT)#define BUDDY_MASK (0x3) +#define BUDDY_SHIFT 2/** * struct z3fold_pool - stores metadata for each z3fold pool
@@ -145,7 +146,7 @@ enum z3fold_page_flags {MIDDLE_CHUNK_MAPPED ,NEEDS_COMPACTING ,PAGE_STALE , - UNDER_RECLAIM + PAGE_CLAIMED, /* by either reclaim or free */ };/*****************
@@ -174,7 +175,7 @@ static struct z3fold_header *init_z3fold_page(struct page *page,clear_bit (MIDDLE_CHUNK_MAPPED , &page->private);clear_bit (NEEDS_COMPACTING , &page->private);clear_bit (PAGE_STALE , &page->private); -clear_bit (UNDER_RECLAIM , &page->private); +clear_bit (PAGE_CLAIMED , &page->private);spin_lock_init (&zhdr->page_lock);kref_init (&zhdr->refcount);
@@ -223,8 +224,11 @@ static unsigned long encode_handle(struct z3fold_header *zhdr, enum buddy bud)unsigned long handle; handle = (unsigned long )zhdr; -if (bud !=HEADLESS ) - handle += (bud + zhdr->first_num) &BUDDY_MASK ; +if (bud !=HEADLESS ) { + handle |= (bud + zhdr->first_num) &BUDDY_MASK ; +if (bud ==LAST ) + handle |= (zhdr->last_chunks <<BUDDY_SHIFT ); + }return handle; }
@@ -234,6 +238,12 @@ static struct z3fold_header *handle_to_z3fold_header(unsigned long handle)return (struct z3fold_header *)(handle &PAGE_MASK ); } +/* only for LAST bud, returns zero otherwise */ +static unsigned short handle_to_chunks (unsigned long handle) +{ +return (handle & ~PAGE_MASK ) >>BUDDY_SHIFT ; +} +/* * (handle & BUDDY_MASK) < zhdr->first_num is possible in encode_handle * but that doesn't matter. because the masking will result in the
@@ -720,37 +730,39 @@ static void z3fold_free(struct z3fold_pool *pool, unsigned long handle) page =virt_to_page (zhdr);if (test_bit (PAGE_HEADLESS , &page->private)) { -/* HEADLESS page stored */ - bud =HEADLESS ; - }else { -z3fold_page_lock (zhdr); - bud =handle_to_buddy (handle); - -switch (bud) { -case FIRST : - zhdr->first_chunks =0 ; -break ; -case MIDDLE : - zhdr->middle_chunks =0 ; - zhdr->start_middle =0 ; -break ; -case LAST : - zhdr->last_chunks =0 ; -break ; -default : -pr_err ("%s: unknown bud %d\n" , __func__, bud); -WARN_ON (1 ); -z3fold_page_unlock (zhdr); -return ; +/* if a headless page is under reclaim, just leave. +* NB: we use test_and_set_bit for a reason: if the bit +* has not been set before, we release this page +* immediately so we don't care about its value any more. +*/ +if (!test_and_set_bit (PAGE_CLAIMED , &page->private)) { +spin_lock (&pool->lock); +list_del (&page->lru); +spin_unlock (&pool->lock); +free_z3fold_page (page); +atomic64_dec (&pool->pages_nr); } +return ; } -if (bud ==HEADLESS ) { -spin_lock (&pool->lock); -list_del (&page->lru); -spin_unlock (&pool->lock); -free_z3fold_page (page); -atomic64_dec (&pool->pages_nr); +/* Non-headless case */ +z3fold_page_lock (zhdr); + bud =handle_to_buddy (handle); + +switch (bud) { +case FIRST : + zhdr->first_chunks =0 ; +break ; +case MIDDLE : + zhdr->middle_chunks =0 ; +break ; +case LAST : + zhdr->last_chunks =0 ; +break ; +default : +pr_err ("%s: unknown bud %d\n" , __func__, bud); +WARN_ON (1 ); +z3fold_page_unlock (zhdr);return ; }
@@ -758,7 +770,7 @@ static void z3fold_free(struct z3fold_pool *pool, unsigned long handle)atomic64_dec (&pool->pages_nr);return ; } -if (test_bit (UNDER_RECLAIM , &page->private)) { +if (test_bit (PAGE_CLAIMED , &page->private)) {z3fold_page_unlock (zhdr);return ; }
@@ -836,20 +848,30 @@ static int z3fold_reclaim_page(struct z3fold_pool *pool, unsigned int retries) }list_for_each_prev (pos, &pool->lru) { page = list_entry(pos, struct page, lru); + +/* this bit could have been set by free, in which case +* we pass over to the next page in the pool. +*/ +if (test_and_set_bit (PAGE_CLAIMED , &page->private)) +continue ; + + zhdr =page_address (page);if (test_bit (PAGE_HEADLESS , &page->private)) -/* candidate found */ break ; - zhdr =page_address (page); -if (!z3fold_page_trylock (zhdr)) +if (!z3fold_page_trylock (zhdr)) { + zhdr =NULL ;continue ;/* can't evict at this point */ + }kref_get (&zhdr->refcount);list_del_init (&zhdr->buddy); zhdr->cpu =-1 ; -set_bit (UNDER_RECLAIM , &page->private);break ; } +if (!zhdr) +break ; +list_del_init (&page->lru);spin_unlock (&pool->lock);
@@ -898,6 +920,7 @@ next:if (test_bit (PAGE_HEADLESS , &page->private)) {if (ret ==0 ) {free_z3fold_page (page); +atomic64_dec (&pool->pages_nr);return 0 ; }spin_lock (&pool->lock);
@@ -905,7 +928,7 @@ next:spin_unlock (&pool->lock); }else {z3fold_page_lock (zhdr); -clear_bit (UNDER_RECLAIM , &page->private); +clear_bit (PAGE_CLAIMED , &page->private);if (kref_put (&zhdr->refcount, release_z3fold_page_locked)) {atomic64_dec (&pool->pages_nr);
@@ -964,7 +987,7 @@ static void *z3fold_map(struct z3fold_pool *pool, unsigned long handle)set_bit (MIDDLE_CHUNK_MAPPED , &page->private);break ;case LAST : - addr +=PAGE_SIZE - (zhdr->last_chunks <<CHUNK_SHIFT ); + addr +=PAGE_SIZE - (handle_to_chunks (handle) <<CHUNK_SHIFT );break ;default :pr_err ("unknown buddy id %d\n" , buddy);
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 96/110 mm, memory_hotplug: check zone_movable in has_unmovable_pages
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 9d7899999c62c1a81129b76d2a6ecbc4655e1597 ]
Page state checks are racy. Under a heavy memory workload (e.g. stress -m 200 -t 2h) it is quite easy to hit a race window when the page is allocated but its state is not fully populated yet. A debugging patch to dump the struct page state shows
has_unmovable_pages: pfn:0x10dfec00, found:0x1, count:0x0
page:ffffea0437fb0000 count:1 mapcount:1 mapping:ffff880e05239841 index:0x7f26e5000 compound_mapcount: 1
flags: 0x5fffffc0090034(uptodate|lru|active|head|swapbacked)
Note that the state has been checked for both PageLRU and PageSwapBacked already. Closing this race completely would require some sort of retry logic. This can be tricky and error prone (think of potential endless or long taking loops).
Workaround this problem for movable zones at least. Such a zone should only contain movable pages. Commit 15c30bc09085 ("mm, memory_hotplug:
make has_unmovable_pages more robust") has told us that this is not strictly true though. Bootmem pages should be marked reserved though so we can move the original check after the PageReserved check. Pages from other zones are still prone to races but we even do not pretend that memory hotremove works for those so pre-mature failure doesn't hurt that much.
--- mm/page_alloc.c | 8 ++++++++ 1 file changed, 8 insertions(+)
mm/page_alloc.c +8 -0
@@ -7690,6 +7690,14 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,if (PageReserved (page)) goto unmovable; +/* +* If the zone is movable and we have ruled out all reserved +* pages then it should be reasonably safe to assume the rest +* is movable. +*/ +if (zone_idx (zone) ==ZONE_MOVABLE ) +continue ; +/* * Hugepages are not in LRU lists, but they're movable. * We need not scan over tail pages bacause we don't
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 97/110 tmpfs: make lseek(SEEK_DATA/SEK_HOLE) return ENXIO with a negative offset
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 1a413646931cb14442065cfc17561e50f5b5bb44 ]
Other filesystems such as ext4, f2fs and ubifs all return ENXIO when lseek (SEEK_DATA or SEEK_HOLE) requests a negative offset.
man 2 lseek says
: EINVAL whence is not valid. Or: the resulting file offset would be
: negative, or beyond the end of a seekable device.
:
: ENXIO whence is SEEK_DATA or SEEK_HOLE, and the file offset is beyond
: the end of the file.
Make tmpfs return ENXIO under these circumstances as well. After this, tmpfs also passes xfstests's generic/448.
--- mm/shmem.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
mm/shmem.c +1 -3
@@ -2610,9 +2610,7 @@ static loff_t shmem_file_llseek(struct file *file, loff_t offset, int whence)inode_lock (inode);/* We're holding i_mutex so we can access i_size directly */ -if (offset <0 ) - offset = -EINVAL ; -else if (offset >= inode->i_size) +if (offset <0 || offset >= inode->i_size) offset = -ENXIO ;else { start = offset >>PAGE_SHIFT ;
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 98/110 mm, page_alloc: check for max order in hot path
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c63ae43ba53bc432b414fd73dd5f4b01fcb1ab43 ]
Konstantin has noticed that kvmalloc might trigger the following warning:
WARNING: CPU: 0 PID: 6676 at mm/vmstat.c:986 __fragmentation_index+0x54/0x60 [...] Call Trace: fragmentation_index+0x76/0x90 compaction_suitable+0x4f/0xf0 shrink_node+0x295/0x310 node_reclaim+0x205/0x250 get_page_from_freelist+0x649/0xad0 __alloc_pages_nodemask+0x12a/0x2a0 kmalloc_large_node+0x47/0x90 __kmalloc_node+0x22b/0x2e0 kvmalloc_node+0x3e/0x70 xt_alloc_table_info+0x3a/0x80 [x_tables] do_ip6t_set_ctl+0xcd/0x1c0 [ip6_tables] nf_setsockopt+0x44/0x60 SyS_setsockopt+0x6f/0xc0 do_syscall_64+0x67/0x120 entry_SYSCALL_64_after_hwframe+0x3d/0xa2
the problem is that we only check for an out of bound order in the slow path and the node reclaim might happen from the fast path already. This is fixable by making sure that kvmalloc doesn't ever use kmalloc for requests that are larger than KMALLOC_MAX_SIZE but this also shows that the code is rather fragile. A recent UBSAN report just underlines that by the following report
UBSAN: Undefined behaviour in mm/page_alloc.c:3117:19 shift exponent 51 is too large for 32-bit type 'int' CPU: 0 PID: 6520 Comm: syz-executor1 Not tainted 4.19.0-rc2 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011 Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0xd2/0x148 lib/dump_stack.c:113 ubsan_epilogue+0x12/0x94 lib/ubsan.c:159 __ubsan_handle_shift_out_of_bounds+0x2b6/0x30b lib/ubsan.c:425 __zone_watermark_ok+0x2c7/0x400 mm/page_alloc.c:3117 zone_watermark_fast mm/page_alloc.c:3216 [inline] get_page_from_freelist+0xc49/0x44c0 mm/page_alloc.c:3300 __alloc_pages_nodemask+0x21e/0x640 mm/page_alloc.c:4370 alloc_pages_current+0xcc/0x210 mm/mempolicy.c:2093 alloc_pages include/linux/gfp.h:509 [inline] __get_free_pages+0x12/0x60 mm/page_alloc.c:4414 dma_mem_alloc+0x36/0x50 arch/x86/include/asm/floppy.h:156 raw_cmd_copyin drivers/block/floppy.c:3159 [inline] raw_cmd_ioctl drivers/block/floppy.c:3206 [inline] fd_locked_ioctl+0xa00/0x2c10 drivers/block/floppy.c:3544 fd_ioctl+0x40/0x60 drivers/block/floppy.c:3571 __blkdev_driver_ioctl block/ioctl.c:303 [inline] blkdev_ioctl+0xb3c/0x1a30 block/ioctl.c:601 block_ioctl+0x105/0x150 fs/block_dev.c:1883 vfs_ioctl fs/ioctl.c:46 [inline] do_vfs_ioctl+0x1c0/0x1150 fs/ioctl.c:687 ksys_ioctl+0x9e/0xb0 fs/ioctl.c:702 __do_sys_ioctl fs/ioctl.c:709 [inline] __se_sys_ioctl fs/ioctl.c:707 [inline] __x64_sys_ioctl+0x7e/0xc0 fs/ioctl.c:707 do_syscall_64+0xc4/0x510 arch/x86/entry/common.c:290 entry_SYSCALL_64_after_hwframe+0x49/0xbe
Note that this is not a kvmalloc path. It is just that the fast path really depends on having sanitzed order as well. Therefore move the order check to the fast path.
--- mm/page_alloc.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
mm/page_alloc.c +9 -11
@@ -4055,17 +4055,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,unsigned int cpuset_mems_cookie;int reserve_flags; -/* -* In the slowpath, we sanity check order to avoid ever trying to -* reclaim >= MAX_ORDER areas which will never succeed. Callers may -* be using allocators in order of preference for an area that is -* too large. -*/ -if (order >=MAX_ORDER ) { -WARN_ON_ONCE (!(gfp_mask & __GFP_NOWARN)); -return NULL ; - } -/* * We also sanity check to catch abuse of atomic reserves being used by * callers that are not in atomic context.
@@ -4359,6 +4348,15 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, int preferred_nid,gfp_t alloc_mask;/* The gfp_t that was actually used for allocation */ struct alloc_context ac = { }; +/* +* There are several places where we assume that the order value is sane +* so bail out early if the request is out of bound. +*/ +if (unlikely (order >=MAX_ORDER )) { +WARN_ON_ONCE (!(gfp_mask & __GFP_NOWARN)); +return NULL ; + } + gfp_mask &= gfp_allowed_mask; alloc_mask = gfp_mask;if (!prepare_alloc_pages (gfp_mask, order, preferred_nid, nodemask, &ac, &alloc_mask, &alloc_flags))
Signature · 1 line
2.17.1
Greg Kroah-Hartman
maintainerPATCH 101/110 tty: wipe buffer.
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Torvalds <[email protected]>
commit c9a8e5fce009e3c601a43c49ea9dbcb25d1ffac5 upstream.
After we are done with the tty buffer, zero it out.
--- drivers/tty/tty_buffer.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/tty/tty_buffer.c +5 -1
@@ -468,11 +468,15 @@ receive_buf(struct tty_port *port, struc {unsigned char *p =char_buf_ptr (head, head->read);char *f =NULL ; +int n;if (~head->flags &TTYB_NORMAL ) f =flag_buf_ptr (head, head->read); -return port->client_ops->receive_buf (port, p, f, count); + n = port->client_ops->receive_buf (port, p, f, count); +if (n >0 ) +memset (p,0 , n); +return n; }/**
Greg Kroah-Hartman
maintainerPATCH 104/110 rcu: Make need_resched() respond to urgent RCU-QS needs
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul E. McKenney <[email protected]>
commit 92aa39e9dc77481b90cbef25e547d66cab901496 upstream.
The per-CPU rcu_dynticks.rcu_urgent_qs variable communicates an urgent need for an RCU quiescent state from the force-quiescent-state processing within the grace-period kthread to context switches and to cond_resched(). Unfortunately, such urgent needs are not communicated to need_resched(), which is sometimes used to decide when to invoke cond_resched(), for but one example, within the KVM vcpu_run() function. As of v4.15, this can result in synchronize_sched() being delayed by up to ten seconds, which can be problematic, to say nothing of annoying.
This commit therefore checks rcu_dynticks.rcu_urgent_qs from within rcu_check_callbacks(), which is invoked from the scheduling-clock interrupt handler. If the current task is not an idle task and is not executing in usermode, a context switch is forced, and either way, the rcu_dynticks.rcu_urgent_qs variable is set to false. If the current task is an idle task, then RCU's dyntick-idle code will detect the quiescent state, so no further action is required. Similarly, if the task is executing in usermode, other code in rcu_check_callbacks() and its called functions will report the corresponding quiescent state.
--- kernel/rcu/tree.c | 9 +++++++++ 1 file changed, 9 insertions(+)
kernel/rcu/tree.c +9 -0
@@ -2662,6 +2662,15 @@ void rcu_check_callbacks(int user)rcu_bh_qs (); }rcu_preempt_check_callbacks (); +/* The load-acquire pairs with the store-release setting to true. */ +if (smp_load_acquire (this_cpu_ptr (&rcu_dynticks.rcu_urgent_qs))) { +/* Idle and userspace execution already are quiescent states. */ +if (!rcu_is_cpu_rrupt_from_idle () && !user) { +set_tsk_need_resched (current); +set_preempt_need_resched (); + } +__this_cpu_write (rcu_dynticks.rcu_urgent_qs, false); + }if (rcu_pending ())invoke_rcu_core ();
Greg Kroah-Hartman
maintainerPATCH 108/110 media: ov5640: fix auto gain & exposure when changing mode
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hugues Fruchet <[email protected]>
commit 3cca8ef5f774cbd61c8db05d9aa401de9bb59c66 upstream.
Ensure that auto gain and auto exposure are well restored when changing mode.
--- drivers/media/i2c/ov5640.c | 96 +++++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 42 deletions(-)
drivers/media/i2c/ov5640.c +54 -42
@@ -1022,6 +1022,18 @@ static int ov5640_get_gain(struct ov5640return gain &0x3ff ; } +static int ov5640_set_gain (struct ov5640_dev *sensor,int gain) +{ +return ov5640_write_reg16 (sensor,OV5640_REG_AEC_PK_REAL_GAIN , + (u16 )gain &0x3ff ); +} + +static int ov5640_set_autogain (struct ov5640_dev *sensor,bool on) +{ +return ov5640_mod_reg (sensor,OV5640_REG_AEC_PK_MANUAL , +BIT (1 ), on ?0 :BIT (1 )); +} +static int ov5640_set_stream_dvp (struct ov5640_dev *sensor,bool on) {int ret;
@@ -1588,7 +1600,7 @@ static int ov5640_set_mode_exposure_calc }/* set capture gain */ - ret =__v4l2_ctrl_s_ctrl (sensor->ctrls.gain, cap_gain16); + ret =ov5640_set_gain (sensor, cap_gain16);if (ret)return ret;
@@ -1601,7 +1613,7 @@ static int ov5640_set_mode_exposure_calc }/* set exposure */ -return __v4l2_ctrl_s_ctrl (sensor->ctrls.exposure, cap_shutter); +return ov5640_set_exposure (sensor, cap_shutter); }/*
@@ -1609,26 +1621,13 @@ static int ov5640_set_mode_exposure_calc* change mode directly */ static int ov5640_set_mode_direct (struct ov5640_dev *sensor, -const struct ov5640_mode_info *mode, -bool auto_exp) +const struct ov5640_mode_info *mode) { -int ret; -if (!mode->reg_data)return -EINVAL ;/* Write capture setting */ - ret =ov5640_load_regs (sensor, mode); -if (ret <0 ) -return ret; - -/* turn auto gain/exposure back on for direct mode */ - ret =__v4l2_ctrl_s_ctrl (sensor->ctrls.auto_gain,1 ); -if (ret) -return ret; - -return __v4l2_ctrl_s_ctrl (sensor->ctrls.auto_exp, auto_exp ? -V4L2_EXPOSURE_AUTO :V4L2_EXPOSURE_MANUAL ); +return ov5640_load_regs (sensor, mode); }static int ov5640_set_mode (struct ov5640_dev *sensor)
@@ -1636,6 +1635,7 @@ static int ov5640_set_mode(struct ov5640const struct ov5640_mode_info *mode = sensor->current_mode;const struct ov5640_mode_info *orig_mode = sensor->last_mode;enum ov5640_downsize_mode dn_mode, orig_dn_mode; +bool auto_gain = sensor->ctrls.auto_gain->val ==1 ;bool auto_exp = sensor->ctrls.auto_exp->val ==V4L2_EXPOSURE_AUTO ;int ret;
@@ -1643,19 +1643,23 @@ static int ov5640_set_mode(struct ov5640 orig_dn_mode = orig_mode->dn_mode;/* auto gain and exposure must be turned off when changing modes */ - ret =__v4l2_ctrl_s_ctrl (sensor->ctrls.auto_gain,0 ); -if (ret) -return ret; +if (auto_gain) { + ret =ov5640_set_autogain (sensor, false); +if (ret) +return ret; + } - ret =ov5640_set_autoexposure (sensor, false); -if (ret) -return ret; +if (auto_exp) { + ret =ov5640_set_autoexposure (sensor, false); +if (ret) + goto restore_auto_gain; + }if ((dn_mode ==SUBSAMPLING && orig_dn_mode ==SCALING ) || (dn_mode ==SCALING && orig_dn_mode ==SUBSAMPLING )) {/* * change between subsampling and scaling -* go through exposure calucation +* go through exposure calculation */ ret =ov5640_set_mode_exposure_calc (sensor, mode); }else {
@@ -1663,11 +1667,16 @@ static int ov5640_set_mode(struct ov5640* change inside subsampling or scaling * download firmware directly */ - ret =ov5640_set_mode_direct (sensor, mode, auto_exp); + ret =ov5640_set_mode_direct (sensor, mode); } -if (ret <0 ) -return ret; + goto restore_auto_exp_gain; + +/* restore auto gain and exposure */ +if (auto_gain) +ov5640_set_autogain (sensor, true); +if (auto_exp) +ov5640_set_autoexposure (sensor, true); ret =ov5640_set_binning (sensor, dn_mode !=SCALING );if (ret <0 )
@@ -1689,6 +1698,15 @@ static int ov5640_set_mode(struct ov5640 sensor->last_mode = mode;return 0 ; + +restore_auto_exp_gain: +if (auto_exp) +ov5640_set_autoexposure (sensor, true); +restore_auto_gain: +if (auto_gain) +ov5640_set_autogain (sensor, true); + +return ret; } static int ov5640_set_framefmt(struct ov5640_dev *sensor,
@@ -2201,20 +2219,20 @@ static int ov5640_set_ctrl_white_balancereturn ret; } -static int ov5640_set_ctrl_exposure (struct ov5640_dev *sensor,int exp) +static int ov5640_set_ctrl_exposure (struct ov5640_dev *sensor, +enum v4l2_exposure_auto_type auto_exposure) {struct ov5640_ctrls *ctrls = &sensor->ctrls; -bool auto_exposure = (exp ==V4L2_EXPOSURE_AUTO ); +bool auto_exp = (auto_exposure ==V4L2_EXPOSURE_AUTO );int ret =0 ;if (ctrls->auto_exp->is_new) { - ret =ov5640_mod_reg (sensor,OV5640_REG_AEC_PK_MANUAL , -BIT (0 ), auto_exposure ?0 :BIT (0 )); + ret =ov5640_set_autoexposure (sensor, auto_exp);if (ret)return ret; } -if (!auto_exposure && ctrls->exposure->is_new) { +if (!auto_exp && ctrls->exposure->is_new) {u16 max_exp; ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_VTS,
@@ -2234,25 +2252,19 @@ static int ov5640_set_ctrl_exposure(strureturn ret; } -static int ov5640_set_ctrl_gain (struct ov5640_dev *sensor,int auto_gain) +static int ov5640_set_ctrl_gain (struct ov5640_dev *sensor,bool auto_gain) {struct ov5640_ctrls *ctrls = &sensor->ctrls;int ret =0 ;if (ctrls->auto_gain->is_new) { - ret =ov5640_mod_reg (sensor,OV5640_REG_AEC_PK_MANUAL , -BIT (1 ), - ctrls->auto_gain->val ?0 :BIT (1 )); + ret =ov5640_set_autogain (sensor, auto_gain);if (ret)return ret; } -if (!auto_gain && ctrls->gain->is_new) { -u16 gain = (u16 )ctrls->gain->val; - - ret =ov5640_write_reg16 (sensor,OV5640_REG_AEC_PK_REAL_GAIN , - gain &0x3ff ); - } +if (!auto_gain && ctrls->gain->is_new) + ret =ov5640_set_gain (sensor, ctrls->gain->val);return ret; }
Greg Kroah-Hartman
maintainerPATCH 110/110 media: ov5640: fix auto controls values when switching to manual mode
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hugues Fruchet <[email protected]>
commit a8f438c684eaa4cbe6c98828eb996d5ec53e24fb upstream.
When switching from auto to manual mode, V4L2 core is calling g_volatile_ctrl() in manual mode in order to get the manual initial value. Remove the manual mode check/return to not break this behaviour.
--- drivers/media/i2c/ov5640.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/media/i2c/ov5640.c +0 -4
@@ -2337,16 +2337,12 @@ static int ov5640_g_volatile_ctrl(structswitch (ctrl->id) {case V4L2_CID_AUTOGAIN : -if (!ctrl->val) -return 0 ; val =ov5640_get_gain (sensor);if (val <0 )return val; sensor->ctrls.gain->val = val;break ;case V4L2_CID_EXPOSURE_AUTO : -if (ctrl->val ==V4L2_EXPOSURE_MANUAL ) -return 0 ; val =ov5640_get_exposure (sensor);if (val <0 )return val;
Greg Kroah-Hartman
maintainerPATCH 10/110 xhci: Add check for invalid byte size error when UAS devices are connected.
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sandeep Singh <[email protected]>
commit d9193efba84fe4c4aa22a569fade5e6ca971f8af upstream.
Observed "TRB completion code (27)" error which corresponds to Stopped - Length Invalid error(xhci spec section 4.17.4) while connecting USB to SATA bridge.
Looks like this case was not considered when the following patch[1] was committed. Hence adding this new check which can prevent
the invalid byte size error.
[1] ade2e3a xhci: handle transfer events without TRB pointer
--- drivers/usb/host/xhci-ring.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/host/xhci-ring.c +1 -0
@@ -2254,6 +2254,7 @@ static int handle_tx_event(struct xhci_h goto cleanup;case COMP_RING_UNDERRUN :case COMP_RING_OVERRUN : +case COMP_STOPPED_LENGTH_INVALID : goto cleanup;default : xhci_err(xhci, "ERROR Transfer event for unknown stream ring slot %u ep %u\n",
Greg Kroah-Hartman
maintainerPATCH 11/110 usb: xhci: fix uninitialized completion when USB3 port got wrong status
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaron Ma <[email protected]>
commit 958c0bd86075d4ef1c936998deefe1947e539240 upstream.
Realtek USB3.0 Card Reader [0bda:0328] reports wrong port status on Cannon lake PCH USB3.1 xHCI [8086:a36d] after resume from S3, after clear port reset it works fine.
Since this device is registered on USB3 roothub at boot, when port status reports not superspeed, xhci_get_port_status will call an uninitialized completion in bus_state[0].
Kernel will hang because of NULL pointer.
Restrict the USB2 resume status check in USB2 roothub to fix hang issue.
--- drivers/usb/host/xhci-hub.c | 2 +- drivers/usb/host/xhci-ring.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/usb/host/xhci-hub.c +1 -1
@@ -876,7 +876,7 @@ static u32 xhci_get_port_status(struct u status |=USB_PORT_STAT_SUSPEND ; }if ((raw_port_status &PORT_PLS_MASK ) ==XDEV_RESUME && - !DEV_SUPERSPEED_ANY (raw_port_status)) { + !DEV_SUPERSPEED_ANY (raw_port_status) && hcd->speed <HCD_USB3 ) {if ((raw_port_status &PORT_RESET ) || !(raw_port_status &PORT_PE ))return 0xffffffff ;
drivers/usb/host/xhci-ring.c +1 -1
@@ -1642,7 +1642,7 @@ static void handle_port_status(struct xh* RExit to a disconnect state). If so, let the the driver know it's * out of the RExit state. */ -if (!DEV_SUPERSPEED_ANY (portsc) && +if (!DEV_SUPERSPEED_ANY (portsc) && hcd->speed <HCD_USB3 &&test_and_clear_bit (hcd_portnum, &bus_state->rexit_ports)) {complete (&bus_state->rexit_done[hcd_portnum]);
Greg Kroah-Hartman
maintainerPATCH 13/110 xhci: Add quirk to workaround the errata seen on Cavium Thunder-X2 Soc
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cherian, George <[email protected]>
commit 11644a7659529730eaf2f166efaabe7c3dc7af8c upstream.
Implement workaround for ThunderX2 Errata-129 (documented in CN99XX Known Issues" available at Cavium support site).
As per ThunderX2errata-129, USB 2 device may come up as USB 1 if a connection to a USB 1 device is followed by another connection to a USB 2 device, the link will come up as USB 1 for the USB 2 device.
Resolution: Reset the PHY after the USB 1 device is disconnected. The PHY reset sequence is done using private registers in XHCI register space. After the PHY is reset we check for the PLL lock status and retry the operation if it fails. From our tests, retrying 4 times is sufficient.
Add a new quirk flag XHCI_RESET_PLL_ON_DISCONNECT to invoke the workaround in handle_xhci_port_status().
--- drivers/usb/host/xhci-pci.c | 5 +++++ drivers/usb/host/xhci-ring.c | 35 ++++++++++++++++++++++++++++++++++- drivers/usb/host/xhci.h | 1 + 3 files changed, 40 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-pci.c +5 -0
@@ -231,6 +231,11 @@ static void xhci_pci_quirks(struct devicif (pdev->vendor ==PCI_VENDOR_ID_TI && pdev->device ==0x8241 ) xhci->quirks |=XHCI_LIMIT_ENDPOINT_INTERVAL_7 ; +if ((pdev->vendor ==PCI_VENDOR_ID_BROADCOM || + pdev->vendor ==PCI_VENDOR_ID_CAVIUM ) && + pdev->device ==0x9026 ) + xhci->quirks |=XHCI_RESET_PLL_ON_DISCONNECT ; +if (xhci->quirks &XHCI_RESET_ON_RESUME )xhci_dbg_trace (xhci, trace_xhci_dbg_quirks,"QUIRK: Resetting on resume" );
drivers/usb/host/xhci-ring.c +34 -1
@@ -1517,6 +1517,35 @@ static void handle_device_notification(susb_wakeup_notification (udev->parent, udev->portnum); } +/* +* Quirk hanlder for errata seen on Cavium ThunderX2 processor XHCI +* Controller. +* As per ThunderX2errata-129 USB 2 device may come up as USB 1 +* If a connection to a USB 1 device is followed by another connection +* to a USB 2 device. +* +* Reset the PHY after the USB device is disconnected if device speed +* is less than HCD_USB3. +* Retry the reset sequence max of 4 times checking the PLL lock status. +* +*/ +static void xhci_cavium_reset_phy_quirk (struct xhci_hcd *xhci) +{ +struct usb_hcd *hcd =xhci_to_hcd (xhci); +u32 pll_lock_check; +u32 retry_count =4 ; + +do { +/* Assert PHY reset */ +writel (0x6F , hcd->regs +0x1048 ); +udelay (10 ); +/* De-assert the PHY reset */ +writel (0x7F , hcd->regs +0x1048 ); +udelay (200 ); + pll_lock_check =readl (hcd->regs +0x1070 ); + }while (!(pll_lock_check &0x1 ) && --retry_count); +} +static void handle_port_status (struct xhci_hcd *xhci,union xhci_trb *event) {
@@ -1650,8 +1679,12 @@ static void handle_port_status(struct xh goto cleanup; } -if (hcd->speed <HCD_USB3 ) +if (hcd->speed <HCD_USB3 ) {xhci_test_and_clear_bit (xhci, port,PORT_PLC ); +if ((xhci->quirks &XHCI_RESET_PLL_ON_DISCONNECT ) && + (portsc &PORT_CSC ) && !(portsc &PORT_CONNECT )) +xhci_cavium_reset_phy_quirk (xhci); + } cleanup:/* Update event ring dequeue pointer before dropping the lock */
drivers/usb/host/xhci.h +1 -0
@@ -1846,6 +1846,7 @@ struct xhci_hcd {#define XHCI_SUSPEND_DELAY BIT_ULL(30)#define XHCI_INTEL_USB_ROLE_SW BIT_ULL(31)#define XHCI_ZERO_64B_REGS BIT_ULL(32) +#define XHCI_RESET_PLL_ON_DISCONNECT BIT_ULL(34)unsigned int num_active_eps;unsigned int limit_active_eps;
Greg Kroah-Hartman
maintainerPATCH 15/110 ALSA: oss: Use kvzalloc() for local buffer allocations
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 65766ee0bf7fe8b3be80e2e1c3ef54ad59b29476 upstream.
PCM OSS layer may allocate a few temporary buffers, one for the core read/write and another for the conversions via plugins. Currently both are allocated via vmalloc(). But as the allocation size is equivalent with the PCM period size, the required size might be quite small, depending on the application.
This patch replaces these vmalloc() calls with kvzalloc() for covering small period sizes better. Also, we use "z"-alloc variant here for addressing the possible uninitialized access reported by syzkaller.
--- sound/core/oss/pcm_oss.c | 6 +++--- sound/core/oss/pcm_plugin.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-)
sound/core/oss/pcm_oss.c +3 -3
@@ -1062,8 +1062,8 @@ static int snd_pcm_oss_change_params_loc runtime->oss.channels =params_channels (params); runtime->oss.rate =params_rate (params); -vfree (runtime->oss.buffer); - runtime->oss.buffer =vmalloc (runtime->oss.period_bytes); +kvfree (runtime->oss.buffer); + runtime->oss.buffer =kvzalloc (runtime->oss.period_bytes,GFP_KERNEL );if (!runtime->oss.buffer) { err = -ENOMEM ; goto failure;
@@ -2328,7 +2328,7 @@ static void snd_pcm_oss_release_substrea {struct snd_pcm_runtime *runtime; runtime = substream->runtime; -vfree (runtime->oss.buffer); +kvfree (runtime->oss.buffer); runtime->oss.buffer =NULL ;#ifdef CONFIG_SND_PCM_OSS_PLUGINS snd_pcm_oss_plugin_clear (substream);
sound/core/oss/pcm_plugin.c +3 -3
@@ -66,8 +66,8 @@ static int snd_pcm_plugin_alloc(struct sreturn -ENXIO ; size /=8 ;if (plugin->buf_frames < frames) { -vfree (plugin->buf); - plugin->buf =vmalloc (size); +kvfree (plugin->buf); + plugin->buf =kvzalloc (size,GFP_KERNEL ); plugin->buf_frames = frames; }if (!plugin->buf) {
@@ -191,7 +191,7 @@ int snd_pcm_plugin_free(struct snd_pcm_pif (plugin->private_free) plugin->private_free (plugin);kfree (plugin->buf_channels); -vfree (plugin->buf); +kvfree (plugin->buf);kfree (plugin);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 2/110 efi/libstub: arm: support building with clang
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alistair Strachan <[email protected]>
commit 41f1c48420709470c51ee0e54b6fb28b956bb4e0 upstream.
When building with CONFIG_EFI and CONFIG_EFI_STUB on ARM, the libstub Makefile would use -mno-single-pic-base without checking it was supported by the compiler. As the ARM (32-bit) clang backend does not support this flag, the build would fail.
This changes the Makefile to check the compiler's support for -mno-single-pic-base before using it, similar to c1c386681bd7 ("ARM:
8767/1: add support for building ARM kernel with clang").
--- drivers/firmware/efi/libstub/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/firmware/efi/libstub/Makefile +2 -1
@@ -16,7 +16,8 @@ cflags-$(CONFIG_X86) += -m$(BITS) -D__K cflags-$(CONFIG_ARM64) := $(subst -pg,,$(KBUILD_CFLAGS)) -fpie \ $(DISABLE_STACKLEAK_PLUGIN) cflags-$(CONFIG_ARM) := $(subst -pg,,$(KBUILD_CFLAGS)) \ - -fno-builtin -fpic -mno-single-pic-base + -fno-builtin -fpic \ + $(call cc-option,-mno-single-pic-base) cflags-$(CONFIG_EFI_ARMSTUB) += -I$(srctree)/scripts/dtc/libfdt
Greg Kroah-Hartman
maintainerPATCH 3/110 usb: core: Fix hub port connection events lost
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dennis Wassenberg <[email protected]>
commit 22454b79e6de05fa61a2a72d00d2eed798abbb75 upstream.
This will clear the USB_PORT_FEAT_C_CONNECTION bit in case of a hub port reset only if a device is was attached to the hub port before resetting the hub port.
Using a Lenovo T480s attached to the ultra dock it was not possible to detect some usb-c devices at the dock usb-c ports because the hub_port_reset code will clear the USB_PORT_FEAT_C_CONNECTION bit after the actual hub port reset. Using this device combo the USB_PORT_FEAT_C_CONNECTION bit was set between the actual hub port reset and the clear of the USB_PORT_FEAT_C_CONNECTION bit. This ends up with clearing the USB_PORT_FEAT_C_CONNECTION bit after the new device was attached such that it was not detected.
This patch will not clear the USB_PORT_FEAT_C_CONNECTION bit if there is currently no device attached to the port before the hub port reset. This will avoid clearing the connection bit for new attached devices.
--- drivers/usb/core/hub.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/core/hub.c +3 -1
@@ -2847,7 +2847,9 @@ static int hub_port_reset(struct usb_hub USB_PORT_FEAT_C_BH_PORT_RESET);usb_clear_port_feature (hub->hdev, port1,USB_PORT_FEAT_C_PORT_LINK_STATE ); -usb_clear_port_feature (hub->hdev, port1, + +if (udev) +usb_clear_port_feature (hub->hdev, port1,USB_PORT_FEAT_C_CONNECTION );/*
Greg Kroah-Hartman
maintainerPATCH 4/110 usb: dwc3: gadget: fix ISOC TRB type on unaligned transfers
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 2fc6d4be35fb1e262f209758e25bfe2b7a113a7f upstream.
When chaining ISOC TRBs together, only the first ISOC TRB should be of type ISOC_FIRST, all others should be of type ISOC. This patch fixes that.
--- drivers/usb/dwc3/gadget.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/usb/dwc3/gadget.c +3 -3
@@ -1072,7 +1072,7 @@ static void dwc3_prepare_one_trb_sg(stru/* Now prepare one extra TRB to align transfer size */ trb = &dep->trb_pool[dep->trb_enqueue];__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr, - maxp - rem, false,0 , + maxp - rem, false,1 , req->request.stream_id, req->request.short_not_ok, req->request.no_interrupt);
@@ -1116,7 +1116,7 @@ static void dwc3_prepare_one_trb_linear(/* Now prepare one extra TRB to align transfer size */ trb = &dep->trb_pool[dep->trb_enqueue];__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr, maxp - rem, - false,0 , req->request.stream_id, + false,1 , req->request.stream_id, req->request.short_not_ok, req->request.no_interrupt); } else if (req->request.zero && req->request.length &&
@@ -1132,7 +1132,7 @@ static void dwc3_prepare_one_trb_linear(/* Now prepare one extra TRB to handle ZLP */ trb = &dep->trb_pool[dep->trb_enqueue];__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr,0 , - false,0 , req->request.stream_id, + false,1 , req->request.stream_id, req->request.short_not_ok, req->request.no_interrupt); }else {
Greg Kroah-Hartman
maintainerPATCH 6/110 usb: dwc3: core: Clean up ULPI device
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit 08fd9a82fda86529bb2f2af3c2f7cb657b4d3066 upstream.
If dwc3_core_init_mode() fails with deferred probe, next probe fails on sysfs with
sysfs: cannot create duplicate filename '/devices/pci0000:00/0000:00:11.0/dwc3.0.auto/dwc3.0.auto.ulpi'
To avoid this failure, clean up ULPI device.
--- drivers/usb/dwc3/core.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/dwc3/core.c +1 -0
@@ -1499,6 +1499,7 @@ static int dwc3_probe(struct platform_de err5:dwc3_event_buffers_cleanup (dwc); +dwc3_ulpi_exit (dwc); err4:dwc3_free_scratch_buffers (dwc);
Greg Kroah-Hartman
maintainerPATCH 7/110 usb: dwc3: Fix NULL pointer exception in dwc3_pci_remove()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuppuswamy Sathyanarayanan <[email protected]>
commit 7b412b04a0c7000293008231ce8413056abb1982 upstream.
In dwc3_pci_quirks() function, gpiod lookup table is only registered for baytrail SOC. But in dwc3_pci_remove(), we try to unregistered it without any checks. This leads to NULL pointer de-reference exception in gpiod_remove_lookup_table() when unloading the module for non baytrail SOCs. This patch fixes this issue.
without ACPI GPIO resources")
--- drivers/usb/dwc3/dwc3-pci.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/dwc3/dwc3-pci.c +3 -1
@@ -283,8 +283,10 @@ err:static void dwc3_pci_remove (struct pci_dev *pci) {struct dwc3_pci *dwc =pci_get_drvdata (pci); +struct pci_dev *pdev = dwc->pci; -gpiod_remove_lookup_table (&platform_bytcr_gpios); +if (pdev->device ==PCI_DEVICE_ID_INTEL_BYT ) +gpiod_remove_lookup_table (&platform_bytcr_gpios);#ifdef CONFIG_PM cancel_work_sync (&dwc->wakeup_work);#endif
Greg Kroah-Hartman
maintainerPATCH 8/110 xhci: Fix leaking USB3 shared_hcd at xhci removal
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit f068090426ea8d72c408ebd42953a82a88e2282c upstream.
Ensure that the shared_hcd pointer is valid when calling usb_put_hcd()
The shared_hcd is removed and freed in xhci by first calling usb_remove_hcd(xhci->shared_hcd), and later usb_put_hcd(xhci->shared_hcd)
Afer commit fe190ed0d602 ("xhci: Do not halt the host until both HCD have disconnected their devices.") the shared_hcd was never properly put as xhci->shared_hcd was set to NULL before usb_put_hcd(xhci->shared_hcd) was called.
shared_hcd (USB3) is removed before primary hcd (USB2). While removing the primary hcd we might need to handle xhci interrupts to cleanly remove last USB2 devices, therefore we need to set xhci->shared_hcd to NULL before removing the primary hcd to let xhci interrupt handler know shared_hcd is no longer available.
xhci-plat.c, xhci-histb.c and xhci-mtk first create both their hcd's before adding them. so to keep the correct reverse removal order use a temporary shared_hcd variable for them.
For more details see commit 4ac53087d6d4 ("usb: xhci: plat: Create both HCDs before adding them")
--- drivers/usb/host/xhci-histb.c | 6 ++++-- drivers/usb/host/xhci-mtk.c | 6 ++++-- drivers/usb/host/xhci-pci.c | 1 + drivers/usb/host/xhci-plat.c | 6 ++++-- drivers/usb/host/xhci-tegra.c | 1 + drivers/usb/host/xhci.c | 2 -- 6 files changed, 14 insertions(+), 8 deletions(-)
drivers/usb/host/xhci-histb.c +4 -2
@@ -325,14 +325,16 @@ static int xhci_histb_remove(struct platstruct xhci_hcd_histb *histb =platform_get_drvdata (dev);struct usb_hcd *hcd = histb->hcd;struct xhci_hcd *xhci =hcd_to_xhci (hcd); +struct usb_hcd *shared_hcd = xhci->shared_hcd; xhci->xhc_state |=XHCI_STATE_REMOVING ; -usb_remove_hcd (xhci->shared_hcd); +usb_remove_hcd (shared_hcd); + xhci->shared_hcd =NULL ;device_wakeup_disable (&dev->dev);usb_remove_hcd (hcd); -usb_put_hcd (xhci->shared_hcd); +usb_put_hcd (shared_hcd);xhci_histb_host_disable (histb);usb_put_hcd (hcd);
drivers/usb/host/xhci-mtk.c +4 -2
@@ -590,12 +590,14 @@ static int xhci_mtk_remove(struct platfostruct xhci_hcd_mtk *mtk =platform_get_drvdata (dev);struct usb_hcd *hcd = mtk->hcd;struct xhci_hcd *xhci =hcd_to_xhci (hcd); +struct usb_hcd *shared_hcd = xhci->shared_hcd; -usb_remove_hcd (xhci->shared_hcd); +usb_remove_hcd (shared_hcd); + xhci->shared_hcd =NULL ;device_init_wakeup (&dev->dev, false);usb_remove_hcd (hcd); -usb_put_hcd (xhci->shared_hcd); +usb_put_hcd (shared_hcd);usb_put_hcd (hcd);xhci_mtk_sch_exit (mtk);xhci_mtk_clks_disable (mtk);
drivers/usb/host/xhci-pci.c +1 -0
@@ -356,6 +356,7 @@ static void xhci_pci_remove(struct pci_dif (xhci->shared_hcd) {usb_remove_hcd (xhci->shared_hcd);usb_put_hcd (xhci->shared_hcd); + xhci->shared_hcd =NULL ; }/* Workaround for spurious wakeups at shutdown with HSW */
drivers/usb/host/xhci-plat.c +4 -2
@@ -359,14 +359,16 @@ static int xhci_plat_remove(struct platfstruct xhci_hcd *xhci =hcd_to_xhci (hcd);struct clk *clk = xhci->clk;struct clk *reg_clk = xhci->reg_clk; +struct usb_hcd *shared_hcd = xhci->shared_hcd; xhci->xhc_state |=XHCI_STATE_REMOVING ; -usb_remove_hcd (xhci->shared_hcd); +usb_remove_hcd (shared_hcd); + xhci->shared_hcd =NULL ;usb_phy_shutdown (hcd->usb_phy);usb_remove_hcd (hcd); -usb_put_hcd (xhci->shared_hcd); +usb_put_hcd (shared_hcd);clk_disable_unprepare (clk);clk_disable_unprepare (reg_clk);
drivers/usb/host/xhci-tegra.c +1 -0
@@ -1240,6 +1240,7 @@ static int tegra_xusb_remove(struct platusb_remove_hcd (xhci->shared_hcd);usb_put_hcd (xhci->shared_hcd); + xhci->shared_hcd =NULL ;usb_remove_hcd (tegra->hcd);usb_put_hcd (tegra->hcd);
drivers/usb/host/xhci.c +0 -2
@@ -719,8 +719,6 @@ static void xhci_stop(struct usb_hcd *hc/* Only halt host and free memory after both hcds are removed */ if (!usb_hcd_is_primary_hcd (hcd)) { -/* usb core will free this hcd shortly, unset pointer */ - xhci->shared_hcd =NULL ;mutex_unlock (&xhci->mutex);return ; }
Greg Kroah-Hartman
maintainercover 4.19.6-stable review
This is the start of the stable review cycle for the 4.19.6 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.6-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.19.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.19.6-rc1
Hugues Fruchet <[email protected]>
media: ov5640: fix auto controls values when switching to manual mode
Hugues Fruchet <[email protected]>
media: ov5640: fix wrong binning value in exposure calculation
Hugues Fruchet <[email protected]>
media: ov5640: fix auto gain & exposure when changing mode
Hugues Fruchet <[email protected]>
media: ov5640: fix exposure regression
Jacopo Mondi <[email protected]>
media: ov5640: Fix timings setup code
Jacopo Mondi <[email protected]>
media: ov5640: Re-work MIPI startup sequence
Paul E. McKenney <[email protected]>
rcu: Make need_resched() respond to urgent RCU-QS needs
Andreas Gruenbacher <[email protected]>
gfs2: Fix iomap buffer head reference counting bug
Greg Kroah-Hartman <[email protected]>
tty: wipe buffer if not echoing data
Linus Torvalds <[email protected]>
tty: wipe buffer.
Sebastien Boisvert <[email protected]>
include/linux/pfn_t.h: force '~' to be parsed as an unary operator
Matthew Wilcox <[email protected]>
dax: Avoid losing wakeup in dax_lock_mapping_entry
Michal Hocko <[email protected]>
mm, page_alloc: check for max order in hot path
Yufen Yu <[email protected]>
tmpfs: make lseek(SEEK_DATA/SEK_HOLE) return ENXIO with a negative offset
Michal Hocko <[email protected]>
mm, memory_hotplug: check zone_movable in has_unmovable_pages
Vitaly Wool <[email protected]>
z3fold: fix possible reclaim races
Ard Biesheuvel <[email protected]>
efi/arm: Revert deferred unmap of early memmap mapping
Satheesh Rajendran <[email protected]>
powerpc/numa: Suppress "VPHN is not supported" messages
Trond Myklebust <[email protected]>
NFSv4: Fix an Oops during delegation callbacks
Prarit Bhargava <[email protected]>
kdb: Use strscpy with destination buffer size
Philip Yang <[email protected]>
drm/amdgpu: fix bug with IH ring setup
Olof Johansson <[email protected]>
RISC-V: Silence some module warnings on 32-bit
David Abdurachmanov <[email protected]>
riscv: add missing vdso_install target
Trond Myklebust <[email protected]>
SUNRPC: Fix a bogus get/put in generic_key_to_expire()
Hannes Reinecke <[email protected]>
block: copy ioprio in __bio_clone_fast() and bounce
Russell King <[email protected]>
ARM: spectre-v2: per-CPU vtables to work around big.Little systems
Russell King <[email protected]>
ARM: add PROC_VTABLE and PROC_TABLE macros
Russell King <[email protected]>
ARM: clean up per-processor check_bugs method call
Russell King <[email protected]>
ARM: make lookup_processor_type() non-__init
Kan Liang <[email protected]>
perf/x86/intel/uncore: Add more IMC PCI IDs for KabyLake and CoffeeLake CPUs
Patrick Bellasi <[email protected]>
sched/fair: Fix cpu_util_wake() for 'execl' type workloads
Michael Ellerman <[email protected]>
powerpc/io: Fix the IO workarounds code to work with Radix
Jens Axboe <[email protected]>
floppy: fix race condition in __floppy_read_block_0()
Ard Biesheuvel <[email protected]>
crypto: simd - correctly take reqsize of wrapped skcipher into account
Xulin Sun <[email protected]>
rtc: pcf2127: fix a kmemleak caused in pcf2127_i2c_gather_write
Hans de Goede <[email protected]>
rtc: cmos: Do not export alarm rtc_ops when we do not support alarms
Anson Huang <[email protected]>
cpufreq: imx6q: add return value check for voltage scale
Scott Wood <[email protected]>
KVM: PPC: Move and undef TRACE_INCLUDE_PATH/FILE
YueHaibing <[email protected]>
scsi: hisi_sas: Remove set but not used variable 'dq_list'
Arnd Bergmann <[email protected]>
scsi: lpfc: fix remoteport access
Masayoshi Mizuma <[email protected]>
tools/testing/nvdimm: Fix the array size for dimm devices.
Jerome Brunet <[email protected]>
pinctrl: meson: fix meson8b ao pull register bits
Jerome Brunet <[email protected]>
pinctrl: meson: fix meson8 ao pull register bits
Jerome Brunet <[email protected]>
pinctrl: meson: fix gxl ao pull register bits
Jerome Brunet <[email protected]>
pinctrl: meson: fix gxbb ao pull register bits
Jerome Brunet <[email protected]>
pinctrl: meson: fix pinconf bias disable
Amir Goldstein <[email protected]>
fanotify: fix handling of events on child sub-directory
Amir Goldstein <[email protected]>
fsnotify: generalize handling of extra event flags
Michael J. Ruhl <[email protected]>
IB/hfi1: Eliminate races in the SDMA send error path
Erik Schmauss <[email protected]>
ACPICA: AML interpreter: add region addresses in global list during initialization
Marc Kleine-Budde <[email protected]>
can: flexcan: remove not needed struct flexcan_priv::tx_mb and struct flexcan_priv::tx_mb_idx
Alexander Stein <[email protected]>
can: flexcan: Always use last mailbox for TX
Lukas Wunner <[email protected]>
can: hi311x: Use level-triggered interrupt
Oliver Hartkopp <[email protected]>
can: raw: check for CAN FD capable netdev in raw_sendmsg()
Oleksij Rempel <[email protected]>
can: flexcan: handle tx-complete CAN frames via rx-offload infrastructure
Oleksij Rempel <[email protected]>
can: flexcan: use can_rx_offload_queue_sorted() for flexcan_irq_bus_*()
Oleksij Rempel <[email protected]>
can: rx-offload: rename can_rx_offload_irq_queue_err_skb() to can_rx_offload_queue_tail()
Oleksij Rempel <[email protected]>
can: rx-offload: introduce can_rx_offload_get_echo_skb() and can_rx_offload_queue_sorted() functions
Marc Kleine-Budde <[email protected]>
can: dev: __can_get_echo_skb(): print error message, if trying to echo non existing skb
Marc Kleine-Budde <[email protected]>
can: dev: __can_get_echo_skb(): Don't crash the kernel if can_priv::echo_skb is accessed out of bounds
Marc Kleine-Budde <[email protected]>
can: dev: __can_get_echo_skb(): replace struct can_frame by canfd_frame to access frame length
Marc Kleine-Budde <[email protected]>
can: dev: can_get_echo_skb(): factor out non sending code to __can_get_echo_skb()
Pankaj Bansal <[email protected]>
can: flexcan: Unlock the MB unconditionally
Thomas Zimmermann <[email protected]>
drm/ast: Remove existing framebuffers before loading driver
Y.C. Chen <[email protected]>
drm/ast: fixed cursor may disappear sometimes
Y.C. Chen <[email protected]>
drm/ast: change resolution may cause screen blurred
Ville Syrjälä <[email protected]>
drm/i915: Disable LP3 watermarks on all SNB machines
Felix Kuehling <[email protected]>
drm/amdgpu: Fix oops when pp_funcs->switch_power_profile is unset
Boris Brezillon <[email protected]>
drm/vc4: Set ->legacy_cursor_update to false when doing non-async updates
Takashi Iwai <[email protected]>
drm/amdgpu: Add missing firmware entry for HAINAN
Paul Kocialkowski <[email protected]>
drm/fb-helper: Blacklist writeback when adding connectors to fbdev
Eric Dumazet <[email protected]>
tcp: do not release socket ownership in tcp_close()
Aneesh Kumar K.V <[email protected]>
mm/memory.c: recheck page table entry with page table lock held
Dmitry Vyukov <[email protected]>
mm: don't warn about large allocations for slab
Eric Dumazet <[email protected]>
llc: do not use sk_eat_skb()
Andrew Price <[email protected]>
gfs2: Don't leave s_fs_info pointing to freed memory in init_sbd
Xin Long <[email protected]>
sctp: clear the transport of some out_chunk_list chunks in sctp_assoc_rm_peer
Tetsuo Handa <[email protected]>
bfs: add sanity check at bfs_fill_super()
Dmitry Torokhov <[email protected]>
Input: synaptics - avoid using uninitialized variable when probing
Tetsuo Handa <[email protected]>
selinux: Add __GFP_NOWARN to allocation at str_read()
Dominique Martinet <[email protected]>
v9fs_dir_readdir: fix double-free on p9stat_read error
Konstantin Khlebnikov <[email protected]>
tools/power/cpupower: fix compilation with STATIC=true
Keerthy <[email protected]>
opp: ti-opp-supply: Correct the supply in _get_optimal_vdd_voltage call
Keerthy <[email protected]>
opp: ti-opp-supply: Dynamically update u_volt_min
Rafał Miłecki <[email protected]>
brcmfmac: fix reporting support for 160 MHz channels
Luca Coelho <[email protected]>
iwlwifi: mvm: don't use SAR Geo if basic SAR is not used
Emmanuel Grumbach <[email protected]>
iwlwifi: mvm: fix regulatory domain update when the firmware starts
Emmanuel Grumbach <[email protected]>
iwlwifi: mvm: support sta_statistics() even on older firmware
Matt Chen <[email protected]>
iwlwifi: fix wrong WGDS_WIFI_DATA_SIZE
Vladimir Zapolskiy <[email protected]>
gpio: don't free unallocated ida on gpiochip_add_data_with_key() error path
Adrian Hunter <[email protected]>
mmc: sdhci-pci: Workaround GLK firmware failing to restore the tuning value
Rajat Jain <[email protected]>
mmc: sdhci-pci: Try "cd" for card-detect lookup before using NULL
Will Deacon <[email protected]>
Documentation/security-bugs: Postpone fix publication in exceptional cases
Will Deacon <[email protected]>
Documentation/security-bugs: Clarify treatment of embargoed information
Greg Kroah-Hartman <[email protected]>
MAINTAINERS: Add Sasha as a stable branch maintainer
Takashi Iwai <[email protected]>
ALSA: oss: Use kvzalloc() for local buffer allocations
Mathias Nyman <[email protected]>
usb: xhci: Prevent bus suspend if a port connect change or polling state is detected
Cherian, George <[email protected]>
xhci: Add quirk to workaround the errata seen on Cavium Thunder-X2 Soc
Aaron Ma <[email protected]>
usb: xhci: fix timeout for transition from RExit to U0
Aaron Ma <[email protected]>
usb: xhci: fix uninitialized completion when USB3 port got wrong status
Sandeep Singh <[email protected]>
xhci: Add check for invalid byte size error when UAS devices are connected.
Mathias Nyman <[email protected]>
xhci: handle port status events for removed USB3 hcd
Mathias Nyman <[email protected]>
xhci: Fix leaking USB3 shared_hcd at xhci removal
Kuppuswamy Sathyanarayanan <[email protected]>
usb: dwc3: Fix NULL pointer exception in dwc3_pci_remove()
Andy Shevchenko <[email protected]>
usb: dwc3: core: Clean up ULPI device
Thinh Nguyen <[email protected]>
usb: dwc3: gadget: Properly check last unaligned/zero chain TRB
Felipe Balbi <[email protected]>
usb: dwc3: gadget: fix ISOC TRB type on unaligned transfers
Dennis Wassenberg <[email protected]>
usb: core: Fix hub port connection events lost
Alistair Strachan <[email protected]>
efi/libstub: arm: support building with clang
Rodrigo Rivas Costa <[email protected]>
HID: steam: remove input device when a hid client is running.
-------------
Diffstat:
Documentation/admin-guide/security-bugs.rst | 48 ++-- .../devicetree/bindings/net/can/holt_hi311x.txt | 2 +- MAINTAINERS | 1 + Makefile | 4 +- arch/arm/include/asm/proc-fns.h | 61 ++++- arch/arm/kernel/bugs.c | 4 +- arch/arm/kernel/head-common.S | 6 +- arch/arm/kernel/setup.c | 9 +- arch/arm/kernel/smp.c | 31 +++ arch/arm/mm/proc-v7-bugs.c | 17 +- arch/powerpc/include/asm/io.h | 20 +- arch/powerpc/kvm/trace.h | 8 +- arch/powerpc/kvm/trace_booke.h | 9 +- arch/powerpc/kvm/trace_hv.h | 9 +- arch/powerpc/kvm/trace_pr.h | 9 +- arch/powerpc/mm/numa.c | 2 +- arch/riscv/Makefile | 4 + arch/riscv/kernel/module.c | 12 +- arch/x86/events/intel/uncore_snb.c | 115 ++++++++- block/bio.c | 1 + block/bounce.c | 1 + crypto/simd.c | 5 +- drivers/acpi/acpica/dsopcode.c | 4 + drivers/block/floppy.c | 3 +- drivers/cpufreq/imx6q-cpufreq.c | 7 +- drivers/firmware/efi/arm-init.c | 4 + drivers/firmware/efi/arm-runtime.c | 2 +- drivers/firmware/efi/libstub/Makefile | 3 +- drivers/firmware/efi/memmap.c | 3 + drivers/gpio/gpiolib.c | 5 +- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 7 +- drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 1 + drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 2 +- drivers/gpu/drm/ast/ast_drv.c | 21 ++ drivers/gpu/drm/ast/ast_mode.c | 3 +- drivers/gpu/drm/drm_fb_helper.c | 3 + drivers/gpu/drm/i915/intel_pm.c | 41 +++- drivers/gpu/drm/vc4/vc4_kms.c | 6 + drivers/hid/hid-steam.c | 154 +++++++----- drivers/infiniband/hw/hfi1/user_sdma.c | 87 +++---- drivers/infiniband/hw/hfi1/user_sdma.h | 3 - drivers/input/mouse/synaptics.c | 4 +- drivers/media/i2c/ov5640.c | 263 +++++++++++++-------- drivers/mmc/host/sdhci-pci-core.c | 86 ++++++- drivers/net/can/dev.c | 48 +++- drivers/net/can/flexcan.c | 108 +++++---- drivers/net/can/rx-offload.c | 51 +++- drivers/net/can/spi/hi311x.c | 2 +- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 3 +- drivers/net/wireless/intel/iwlwifi/fw/acpi.h | 4 +- drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 38 ++- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 12 +- drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | 5 +- drivers/opp/ti-opp-supply.c | 5 +- drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 2 +- drivers/pinctrl/meson/pinctrl-meson-gxl.c | 2 +- drivers/pinctrl/meson/pinctrl-meson.c | 2 +- drivers/pinctrl/meson/pinctrl-meson8.c | 2 +- drivers/pinctrl/meson/pinctrl-meson8b.c | 2 +- drivers/rtc/rtc-cmos.c | 16 +- drivers/rtc/rtc-pcf2127.c | 3 + drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 - drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 - drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 2 - drivers/scsi/lpfc/lpfc_debugfs.c | 2 + drivers/tty/n_tty.c | 20 +- drivers/tty/tty_buffer.c | 6 +- drivers/usb/core/hub.c | 4 +- drivers/usb/dwc3/core.c | 1 + drivers/usb/dwc3/dwc3-pci.c | 4 +- drivers/usb/dwc3/gadget.c | 8 +- drivers/usb/host/xhci-histb.c | 6 +- drivers/usb/host/xhci-hub.c | 66 ++++-- drivers/usb/host/xhci-mtk.c | 6 +- drivers/usb/host/xhci-pci.c | 6 + drivers/usb/host/xhci-plat.c | 6 +- drivers/usb/host/xhci-ring.c | 45 +++- drivers/usb/host/xhci-tegra.c | 1 + drivers/usb/host/xhci.c | 2 - drivers/usb/host/xhci.h | 3 +- fs/9p/vfs_dir.c | 11 - fs/bfs/inode.c | 9 +- fs/dax.c | 7 +- fs/gfs2/bmap.c | 40 ++-- fs/gfs2/ops_fstype.c | 2 +- fs/nfs/callback_proc.c | 4 +- fs/nfs/delegation.c | 11 +- fs/notify/fanotify/fanotify.c | 10 +- fs/notify/fsnotify.c | 15 +- include/linux/can/dev.h | 1 + include/linux/can/rx-offload.h | 7 +- include/linux/fsnotify_backend.h | 9 +- include/linux/pfn_t.h | 2 +- include/net/sock.h | 1 + kernel/debug/kdb/kdb_io.c | 15 +- kernel/debug/kdb/kdb_private.h | 2 +- kernel/debug/kdb/kdb_support.c | 10 +- kernel/rcu/tree.c | 9 + kernel/sched/fair.c | 62 +++-- mm/memory.c | 34 ++- mm/page_alloc.c | 28 ++- mm/shmem.c | 4 +- mm/slab.c | 4 + mm/slab_common.c | 12 +- mm/z3fold.c | 101 +++++--- net/can/raw.c | 15 +- net/core/sock.c | 2 +- net/ipv4/tcp.c | 11 +- net/llc/af_llc.c | 11 +- net/sctp/associola.c | 10 +- net/sunrpc/auth_generic.c | 8 +- security/selinux/ss/policydb.c | 2 +- sound/core/oss/pcm_oss.c | 6 +- sound/core/oss/pcm_plugin.c | 6 +- tools/power/cpupower/bench/Makefile | 2 +- tools/power/cpupower/lib/cpufreq.c | 2 +- tools/power/cpupower/lib/cpuidle.c | 2 +- tools/power/cpupower/lib/cpupower.c | 4 +- tools/power/cpupower/lib/cpupower_intern.h | 2 +- tools/testing/nvdimm/test/nfit.c | 8 +- 120 files changed, 1435 insertions(+), 653 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 29/110 tools/power/cpupower: fix compilation with STATIC=true
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Khlebnikov <[email protected]>
commit 9de9aa45e9bd67232e000cca42ceb134b8ae51b6 upstream.
Rename duplicate sysfs_read_file into cpupower_read_sysfs and fix linking.
--- tools/power/cpupower/bench/Makefile | 2 +- tools/power/cpupower/lib/cpufreq.c | 2 +- tools/power/cpupower/lib/cpuidle.c | 2 +- tools/power/cpupower/lib/cpupower.c | 4 ++-- tools/power/cpupower/lib/cpupower_intern.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-)
tools/power/cpupower/bench/Makefile +1 -1
@@ -9,7 +9,7 @@ endif ifeq ($(strip $(STATIC)),true) LIBS = -L../ -L$(OUTPUT) -lm OBJS = $(OUTPUT)main.o $(OUTPUT)parse.o $(OUTPUT)system.o $(OUTPUT)benchmark.o \ - $(OUTPUT)../lib/cpufreq.o $(OUTPUT)../lib/sysfs.o + $(OUTPUT)../lib/cpufreq.o $(OUTPUT)../lib/cpupower.o else LIBS = -L../ -L$(OUTPUT) -lm -lcpupower OBJS = $(OUTPUT)main.o $(OUTPUT)parse.o $(OUTPUT)system.o $(OUTPUT)benchmark.o
tools/power/cpupower/lib/cpufreq.c +1 -1
@@ -28,7 +28,7 @@ static unsigned int sysfs_cpufreq_read_fsnprintf (path,sizeof (path),PATH_TO_CPU "cpu%u/cpufreq/%s" , cpu, fname); -return sysfs_read_file (path, buf, buflen); +return cpupower_read_sysfs (path, buf, buflen); }/* helper function to write a new value to a /sys file */
tools/power/cpupower/lib/cpuidle.c +1 -1
@@ -319,7 +319,7 @@ static unsigned int sysfs_cpuidle_read_fsnprintf (path,sizeof (path),PATH_TO_CPU "cpuidle/%s" , fname); -return sysfs_read_file (path, buf, buflen); +return cpupower_read_sysfs (path, buf, buflen); }
tools/power/cpupower/lib/cpupower.c +2 -2
@@ -15,7 +15,7 @@#include "cpupower.h" #include "cpupower_intern.h" -unsigned int sysfs_read_file (const char *path,char *buf,size_t buflen) +unsigned int cpupower_read_sysfs (const char *path,char *buf,size_t buflen) {int fd;ssize_t numread;
@@ -95,7 +95,7 @@ static int sysfs_topology_read_file(unsisnprintf (path,sizeof (path),PATH_TO_CPU "cpu%u/topology/%s" , cpu, fname); -if (sysfs_read_file (path, linebuf,MAX_LINE_LEN ) ==0 ) +if (cpupower_read_sysfs (path, linebuf,MAX_LINE_LEN ) ==0 )return -1 ; *result =strtol (linebuf, &endp,0 );if (endp == linebuf || errno ==ERANGE )
tools/power/cpupower/lib/cpupower_intern.h +1 -1
@@ -3,4 +3,4 @@#define MAX_LINE_LEN 4096#define SYSFS_PATH_MAX 255 -unsigned int sysfs_read_file (const char *path,char *buf,size_t buflen); +unsigned int cpupower_read_sysfs (const char *path,char *buf,size_t buflen);
Greg Kroah-Hartman
maintainerPATCH 30/110 v9fs_dir_readdir: fix double-free on p9stat_read error
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dominique Martinet <[email protected]>
commit 81c99089bce693b94b775b6eb888115d2d540086 upstream.
p9stat_read will call p9stat_free on error, we should only free the struct content on success.
There also is no need to "p9stat_init" st as the read function will zero the whole struct for us anyway, so clean up the code a bit while we are here.
--- fs/9p/vfs_dir.c | 11 ----------- 1 file changed, 11 deletions(-)
fs/9p/vfs_dir.c +0 -11
@@ -76,15 +76,6 @@ static inline int dt_type(struct p9_wstareturn rettype; } -static void p9stat_init (struct p9_wstat *stbuf) -{ - stbuf->name =NULL ; - stbuf->uid =NULL ; - stbuf->gid =NULL ; - stbuf->muid =NULL ; - stbuf->extension =NULL ; -} -/** * v9fs_alloc_rdir_buf - Allocate buffer used for read and readdir * @filp: opened file structure
@@ -145,12 +136,10 @@ static int v9fs_dir_readdir(struct file rdir->tail = n; }while (rdir->head < rdir->tail) { -p9stat_init (&st); err =p9stat_read (fid->clnt, rdir->buf + rdir->head, rdir->tail - rdir->head, &st);if (err) {p9_debug (P9_DEBUG_VFS ,"returned %d\n" , err); -p9stat_free (&st);return -EIO ; } reclen = st.size+2 ;
Greg Kroah-Hartman
maintainerPATCH 31/110 selinux: Add __GFP_NOWARN to allocation at str_read()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit 4458bba09788e70e8fb39ad003f087cd9dfbd6ac upstream.
syzbot is hitting warning at str_read() [1] because len parameter can become larger than KMALLOC_MAX_SIZE. We don't need to emit warning for this case.
[1] https://syzkaller.appspot.com/bug?id=7f2f5aad79ea8663c296a2eedb81978401a908f0
--- security/selinux/ss/policydb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
security/selinux/ss/policydb.c +1 -1
@@ -1101,7 +1101,7 @@ static int str_read(char **strp, gfp_t fif ((len ==0 ) || (len == (u32)-1 ))return -EINVAL ; - str =kmalloc (len +1 , flags); + str =kmalloc (len +1 , flags | __GFP_NOWARN);if (!str)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 32/110 Input: synaptics - avoid using uninitialized variable when probing
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Torokhov <[email protected]>
commit f39f8688888ae74fa8deae2d01289b69b4727394 upstream.
synaptics_detect() does not check whether sending commands to the device succeeds and instead relies on getting unique data from the device. Let's make sure we seed entire buffer with zeroes to make sure we will not use garbage on stack that just happen to be 0x47.
--- drivers/input/mouse/synaptics.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/input/mouse/synaptics.c +1 -3
@@ -99,9 +99,7 @@ static int synaptics_mode_cmd(struct psmint synaptics_detect (struct psmouse *psmouse,bool set_properties) {struct ps2dev *ps2dev = &psmouse->ps2dev; -u8 param[4 ]; - - param[0 ] =0 ; +u8 param[4 ] = {0 };ps2_command (ps2dev, param,PSMOUSE_CMD_SETRES );ps2_command (ps2dev, param,PSMOUSE_CMD_SETRES );
Greg Kroah-Hartman
maintainerPATCH 33/110 bfs: add sanity check at bfs_fill_super()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit 9f2df09a33aa2c76ce6385d382693f98d7f2f07e upstream.
syzbot is reporting too large memory allocation at bfs_fill_super() [1]. Since file system image is corrupted such that bfs_sb->s_start == 0, bfs_fill_super() is trying to allocate 8MB of continuous memory. Fix this by adding a sanity check on bfs_sb->s_start, __GFP_NOWARN and printf().
[1] https://syzkaller.appspot.com/bug?id=16a87c236b951351374a84c8a32f40edbc034e96
--- fs/bfs/inode.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
fs/bfs/inode.c +6 -3
@@ -350,7 +350,8 @@ static int bfs_fill_super(struct super_b s->s_magic =BFS_MAGIC ; -if (le32_to_cpu (bfs_sb->s_start) >le32_to_cpu (bfs_sb->s_end)) { +if (le32_to_cpu (bfs_sb->s_start) >le32_to_cpu (bfs_sb->s_end) || +le32_to_cpu (bfs_sb->s_start) <BFS_BSIZE ) {printf ("Superblock is corrupted\n" ); goto out1; }
@@ -359,9 +360,11 @@ static int bfs_fill_super(struct super_bsizeof (struct bfs_inode ) +BFS_ROOT_INO -1 ; imap_len = (info->si_lasti /8 ) +1 ; - info->si_imap =kzalloc (imap_len,GFP_KERNEL ); -if (!info->si_imap) + info->si_imap =kzalloc (imap_len,GFP_KERNEL | __GFP_NOWARN); +if (!info->si_imap) { +printf ("Cannot allocate %u bytes\n" , imap_len); goto out1; + }for (i =0 ; i <BFS_ROOT_INO ; i++)set_bit (i, info->si_imap);
Greg Kroah-Hartman
maintainerPATCH 34/110 sctp: clear the transport of some out_chunk_list chunks in sctp_assoc_rm_peer
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
commit df132eff463873e14e019a07f387b4d577d6d1f9 upstream.
If a transport is removed by asconf but there still are some chunks with this transport queuing on out_chunk_list, later an use-after-free issue will be caused when accessing this transport from these chunks in sctp_outq_flush().
This is an old bug, we fix it by clearing the transport of these chunks in out_chunk_list when removing a transport in sctp_assoc_rm_peer().
--- net/sctp/associola.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
net/sctp/associola.c +7 -3
@@ -499,8 +499,9 @@ void sctp_assoc_set_primary(struct sctp_void sctp_assoc_rm_peer (struct sctp_association *asoc,struct sctp_transport *peer) { -struct list_head *pos; -struct sctp_transport *transport; +struct sctp_transport *transport; +struct list_head *pos; +struct sctp_chunk *ch;pr_debug ("%s: association:%p addr:%pISpc\n" , __func__, asoc, &peer->ipaddr.sa);
@@ -564,7 +565,6 @@ void sctp_assoc_rm_peer(struct sctp_asso*/ if (!list_empty (&peer->transmitted)) {struct sctp_transport *active = asoc->peer.active_path; -struct sctp_chunk *ch;/* Reset the transport of each chunk on this list */ list_for_each_entry(ch, &peer->transmitted,
@@ -586,6 +586,10 @@ void sctp_assoc_rm_peer(struct sctp_assosctp_transport_hold (active); } +list_for_each_entry (ch, &asoc->outqueue.out_chunk_list, list) +if (ch->transport == peer) + ch->transport =NULL ; + asoc->peer.transport_count--;sctp_transport_free (peer);
Greg Kroah-Hartman
maintainerPATCH 36/110 llc: do not use sk_eat_skb()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
commit 604d415e2bd642b7e02c80e719e0396b9d4a77a6 upstream.
syzkaller triggered a use-after-free [1], caused by a combination of skb_get() in llc_conn_state_process() and usage of sk_eat_skb()
sk_eat_skb() is assuming the skb about to be freed is only used by the current thread. TCP/DCCP stacks enforce this because current thread holds the socket lock.
llc_conn_state_process() wants to make sure skb does not disappear, and holds a reference on the skb it manipulates. But as soon as this skb is added to socket receive queue, another thread can consume it.
This means that llc must use regular skb_unlink() and kfree_skb() so that both producer and consumer can safely work on the same skb.
[1]
BUG: KASAN: use-after-free in atomic_read include/asm-generic/atomic-instrumented.h:21 [inline]
BUG: KASAN: use-after-free in refcount_read include/linux/refcount.h:43 [inline]
BUG: KASAN: use-after-free in skb_unref include/linux/skbuff.h:967 [inline]
BUG: KASAN: use-after-free in kfree_skb+0xb7/0x580 net/core/skbuff.c:655
Read of size 4 at addr ffff8801d1f6fba4 by task ksoftirqd/1/18
CPU: 1 PID: 18 Comm: ksoftirqd/1 Not tainted 4.19.0-rc8+ #295
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Call Trace:
__dump_stack lib/dump_stack.c:77 [inline]
dump_stack+0x1c4/0x2b6 lib/dump_stack.c:113
print_address_description.cold.8+0x9/0x1ff mm/kasan/report.c:256
kasan_report_error mm/kasan/report.c:354 [inline]
kasan_report.cold.9+0x242/0x309 mm/kasan/report.c:412
check_memory_region_inline mm/kasan/kasan.c:260 [inline]
check_memory_region+0x13e/0x1b0 mm/kasan/kasan.c:267
kasan_check_read+0x11/0x20 mm/kasan/kasan.c:272
atomic_read include/asm-generic/atomic-instrumented.h:21 [inline]
refcount_read include/linux/refcount.h:43 [inline]
skb_unref include/linux/skbuff.h:967 [inline]
kfree_skb+0xb7/0x580 net/core/skbuff.c:655
llc_sap_state_process+0x9b/0x550 net/llc/llc_sap.c:224
llc_sap_rcv+0x156/0x1f0 net/llc/llc_sap.c:297
llc_sap_handler+0x65e/0xf80 net/llc/llc_sap.c:438
llc_rcv+0x79e/0xe20 net/llc/llc_input.c:208
__netif_receive_skb_one_core+0x14d/0x200 net/core/dev.c:4913
__netif_receive_skb+0x2c/0x1e0 net/core/dev.c:5023
process_backlog+0x218/0x6f0 net/core/dev.c:5829
napi_poll net/core/dev.c:6249 [inline]
net_rx_action+0x7c5/0x1950 net/core/dev.c:6315
__do_softirq+0x30c/0xb03 kernel/softirq.c:292
run_ksoftirqd+0x94/0x100 kernel/softirq.c:653
smpboot_thread_fn+0x68b/0xa00 kernel/smpboot.c:164
kthread+0x35a/0x420 kernel/kthread.c:246
ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:413
Allocated by task 18:
save_stack+0x43/0xd0 mm/kasan/kasan.c:448
set_track mm/kasan/kasan.c:460 [inline]
kasan_kmalloc+0xc7/0xe0 mm/kasan/kasan.c:553
kasan_slab_alloc+0x12/0x20 mm/kasan/kasan.c:490
kmem_cache_alloc_node+0x144/0x730 mm/slab.c:3644
__alloc_skb+0x119/0x770 net/core/skbuff.c:193
alloc_skb include/linux/skbuff.h:995 [inline]
llc_alloc_frame+0xbc/0x370 net/llc/llc_sap.c:54
llc_station_ac_send_xid_r net/llc/llc_station.c:52 [inline]
llc_station_rcv+0x1dc/0x1420 net/llc/llc_station.c:111
llc_rcv+0xc32/0xe20 net/llc/llc_input.c:220
__netif_receive_skb_one_core+0x14d/0x200 net/core/dev.c:4913
__netif_receive_skb+0x2c/0x1e0 net/core/dev.c:5023
process_backlog+0x218/0x6f0 net/core/dev.c:5829
napi_poll net/core/dev.c:6249 [inline]
net_rx_action+0x7c5/0x1950 net/core/dev.c:6315
__do_softirq+0x30c/0xb03 kernel/softirq.c:292
Freed by task 16383:
save_stack+0x43/0xd0 mm/kasan/kasan.c:448
set_track mm/kasan/kasan.c:460 [inline]
__kasan_slab_free+0x102/0x150 mm/kasan/kasan.c:521
kasan_slab_free+0xe/0x10 mm/kasan/kasan.c:528
__cache_free mm/slab.c:3498 [inline]
kmem_cache_free+0x83/0x290 mm/slab.c:3756
kfree_skbmem+0x154/0x230 net/core/skbuff.c:582
__kfree_skb+0x1d/0x20 net/core/skbuff.c:642
sk_eat_skb include/net/sock.h:2366 [inline]
llc_ui_recvmsg+0xec2/0x1610 net/llc/af_llc.c:882
sock_recvmsg_nosec net/socket.c:794 [inline]
sock_recvmsg+0xd0/0x110 net/socket.c:801
___sys_recvmsg+0x2b6/0x680 net/socket.c:2278
__sys_recvmmsg+0x303/0xb90 net/socket.c:2390
do_sys_recvmmsg+0x181/0x1a0 net/socket.c:2466
__do_sys_recvmmsg net/socket.c:2484 [inline]
__se_sys_recvmmsg net/socket.c:2480 [inline]
__x64_sys_recvmmsg+0xbe/0x150 net/socket.c:2480
do_syscall_64+0x1b9/0x820 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe
The buggy address belongs to the object at ffff8801d1f6fac0
which belongs to the cache skbuff_head_cache of size 232
The buggy address is located 228 bytes inside of
232-byte region [ffff8801d1f6fac0, ffff8801d1f6fba8)
The buggy address belongs to the page:
page:ffffea000747dbc0 count:1 mapcount:0 mapping:ffff8801d9be7680 index:0xffff8801d1f6fe80
flags: 0x2fffc0000000100(slab)
raw: 02fffc0000000100 ffffea0007346e88 ffffea000705b108 ffff8801d9be7680
raw: ffff8801d1f6fe80 ffff8801d1f6f0c0 000000010000000b 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff8801d1f6fa80: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
ffff8801d1f6fb00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>ffff8801d1f6fb80: fb fb fb fb fb fc fc fc fc fc fc fc fc fc fc fc
^
ffff8801d1f6fc00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff8801d1f6fc80: fb fb fb fb fb fb fb fb fb fb fb fb fb fc fc fc--- net/llc/af_llc.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
net/llc/af_llc.c +4 -7
@@ -730,7 +730,6 @@ static int llc_ui_recvmsg(struct socketstruct sk_buff *skb =NULL ;struct sock *sk = sock->sk;struct llc_sock *llc =llc_sk (sk); -unsigned long cpu_flags;size_t copied =0 ;u32 peek_seq =0 ;u32 *seq, skb_len;
@@ -855,9 +854,8 @@ static int llc_ui_recvmsg(struct socket goto copy_uaddr;if (!(flags &MSG_PEEK )) { -spin_lock_irqsave (&sk->sk_receive_queue.lock, cpu_flags); -sk_eat_skb (sk, skb); -spin_unlock_irqrestore (&sk->sk_receive_queue.lock, cpu_flags); +skb_unlink (skb, &sk->sk_receive_queue); +kfree_skb (skb); *seq =0 ; }
@@ -878,9 +876,8 @@ copy_uaddr:llc_cmsg_rcv (msg, skb);if (!(flags &MSG_PEEK )) { -spin_lock_irqsave (&sk->sk_receive_queue.lock, cpu_flags); -sk_eat_skb (sk, skb); -spin_unlock_irqrestore (&sk->sk_receive_queue.lock, cpu_flags); +skb_unlink (skb, &sk->sk_receive_queue); +kfree_skb (skb); *seq =0 ; }
Greg Kroah-Hartman
maintainerPATCH 19/110 mmc: sdhci-pci: Try "cd" for card-detect lookup before using NULL
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rajat Jain <[email protected]>
commit cdcefe6bd9df754f528ffc339d3cc143cea4ddf6 upstream.
Problem:
The card detect IRQ does not work with modern BIOS (that want to use _DSD to provide the card detect GPIO to the driver).
Details:
The mmc core provides the mmc_gpiod_request_cd() API to let host drivers request the gpio descriptor for the "card detect" pin.
This pin is specified in the ACPI for the SDHC device:
* Either as a resource using _CRS. This is a method used by legacy BIOS. (The driver needs to tell which resource index).
* Or as a named property ("cd-gpios"/"cd-gpio") in _DSD (which internally points to an entry in _CRS). This way, the driver can lookup using a string. This is what modern BIOS prefer to use.
This API finally results in a call to the following code:
struct gpio_desc *acpi_find_gpio(..., const char *con_id,...) {
...
/* Lookup gpio (using "<con_id>-gpio") in the _DSD */
...
if (!acpi_can_fallback_to_crs(adev, con_id))
return ERR_PTR(-ENOENT);
...
/* Falling back to _CRS is allowed, Lookup gpio in the _CRS */
...
}
Note that this means that if the ACPI has _DSD properties, the kernel will never use _CRS for the lookup (Because acpi_can_fallback_to_crs() will always be false for any device hat has _DSD entries).
The SDHCI driver is thus currently broken on a modern BIOS, even if BIOS provides both _CRS (for index based lookup) and _DSD entries (for string based lookup). Ironically, none of these will be used for the lookup currently because:
* Since the con_id is NULL, acpi_find_gpio() does not find a matching entry in DSDT. (The _DSDT entry has the property name = "cd-gpios")
* Because ACPI contains DSDT entries, thus acpi_can_fallback_to_crs() returns false (because device properties have been populated from _DSD), thus the _CRS is never used for the lookup.
Fix:
Try "cd" for lookup in the _DSD before falling back to using NULL so as to try looking up in the _CRS.
I've tested this patch successfully with both Legacy BIOS (that provide only _CRS method) as well as modern BIOS (that provide both _CRS and _DSD). Also the use of "cd" appears to be fairly consistent across other users of this API (other MMC host controller drivers).
--- drivers/mmc/host/sdhci-pci-core.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/mmc/host/sdhci-pci-core.c +6 -1
@@ -1762,8 +1762,13 @@ static struct sdhci_pci_slot *sdhci_pci_device_init_wakeup (&pdev->dev, true);if (slot->cd_idx >=0 ) { - ret =mmc_gpiod_request_cd (host->mmc,NULL , slot->cd_idx, + ret =mmc_gpiod_request_cd (host->mmc,"cd" , slot->cd_idx, slot->cd_override_level,0 ,NULL ); +if (ret && ret != -EPROBE_DEFER ) + ret =mmc_gpiod_request_cd (host->mmc,NULL , + slot->cd_idx, + slot->cd_override_level, +0 ,NULL );if (ret == -EPROBE_DEFER ) goto remove;
Greg Kroah-Hartman
maintainerPATCH 37/110 mm: dont warn about large allocations for slab
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Vyukov <[email protected]>
commit 61448479a9f2c954cde0cfe778cb6bec5d0a748d upstream.
Slub does not call kmalloc_slab() for sizes > KMALLOC_MAX_CACHE_SIZE, instead it falls back to kmalloc_large().
For slab KMALLOC_MAX_CACHE_SIZE == KMALLOC_MAX_SIZE and it calls kmalloc_slab() for all allocations relying on NULL return value for over-sized allocations.
This inconsistency leads to unwanted warnings from kmalloc_slab() for over-sized allocations for slab. Returning NULL for failed allocations is the expected behavior.
Make slub and slab code consistent by checking size > KMALLOC_MAX_CACHE_SIZE in slab before calling kmalloc_slab().
While we are here also fix the check in kmalloc_slab(). We should check against KMALLOC_MAX_CACHE_SIZE rather than KMALLOC_MAX_SIZE. It all kinda worked because for slab the constants are the same, and slub always checks the size against KMALLOC_MAX_CACHE_SIZE before kmalloc_slab(). But if we get there with size > KMALLOC_MAX_CACHE_SIZE anyhow bad things will happen. For example, in case of a newly introduced bug in slub code.
Also move the check in kmalloc_slab() from function entry to the size > 192 case. This partially compensates for the additional check in slab code and makes slub code a bit faster (at least theoretically).
Also drop __GFP_NOWARN in the warning check. This warning means a bug in slab code itself, user-passed flags have nothing to do with it.
Nothing of this affects slob.
--- mm/slab.c | 4 ++++ mm/slab_common.c | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-)
mm/slab.c +4 -0
@@ -3675,6 +3675,8 @@ __do_kmalloc_node(size_t size, gfp_t flastruct kmem_cache *cachep;void *ret; +if (unlikely (size >KMALLOC_MAX_CACHE_SIZE )) +return NULL ; cachep =kmalloc_slab (size, flags);if (unlikely (ZERO_OR_NULL_PTR (cachep)))return cachep;
@@ -3710,6 +3712,8 @@ static __always_inline void *__do_kmallostruct kmem_cache *cachep;void *ret; +if (unlikely (size >KMALLOC_MAX_CACHE_SIZE )) +return NULL ; cachep =kmalloc_slab (size, flags);if (unlikely (ZERO_OR_NULL_PTR (cachep)))return cachep;
mm/slab_common.c +6 -6
@@ -1027,18 +1027,18 @@ struct kmem_cache *kmalloc_slab(size_t s {unsigned int index; -if (unlikely (size >KMALLOC_MAX_SIZE )) { -WARN_ON_ONCE (!(flags & __GFP_NOWARN)); -return NULL ; - } -if (size <=192 ) {if (!size)return ZERO_SIZE_PTR ; index = size_index[size_index_elem (size)]; - }else + }else { +if (unlikely (size >KMALLOC_MAX_CACHE_SIZE )) { +WARN_ON (1 ); +return NULL ; + } index =fls (size -1 ); + }#ifdef CONFIG_ZONE_DMA if (unlikely ((flags &GFP_DMA )))
Greg Kroah-Hartman
maintainerPATCH 40/110 drm/fb-helper: Blacklist writeback when adding connectors to fbdev
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Kocialkowski <[email protected]>
commit 8fd3b90300bec541806dac271de2fd44e2e4e2d2 upstream.
Writeback connectors do not produce any on-screen output and require special care for use. Such connectors are hidden from enumeration in DRM resources by default, but they are still picked-up by fbdev. This makes rather little sense since fbdev is not really adapted for dealing with writeback.
Moreover, this is also a source of issues when userspace disables the CRTC (and associated plane) without detaching the CRTC from the connector (which is hidden by default). In this case, the connector is still using the CRTC, leading to am "enabled/connectors mismatch" and eventually the failure of the associated atomic commit. This situation happens with VC4 testing under IGT GPU Tools.
Filter out writeback connectors in the fbdev helper to solve this.
--- drivers/gpu/drm/drm_fb_helper.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/drm_fb_helper.c +3 -0
@@ -200,6 +200,9 @@ int drm_fb_helper_single_add_all_connectmutex_lock (&fb_helper->lock);drm_connector_list_iter_begin (dev, &conn_iter);drm_for_each_connector_iter (connector, &conn_iter) { +if (connector->connector_type ==DRM_MODE_CONNECTOR_WRITEBACK ) +continue ; + ret =__drm_fb_helper_add_one_connector (fb_helper, connector);if (ret) goto fail;
Greg Kroah-Hartman
maintainerPATCH 41/110 drm/amdgpu: Add missing firmware entry for HAINAN
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 8d4d7c58994759bbd9f4fec32d88bf0e0b89302e upstream.
Due to lack of MODULE_FIRMWARE() with hainan_mc.bin, the driver doesn't work properly in initrd. Let's add it.
Bugzilla: https://bugzilla.suse.com/show_bug.cgi?id=1116239
--- drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +1 -0
@@ -45,6 +45,7 @@ MODULE_FIRMWARE("amdgpu/tahiti_mc.bin");MODULE_FIRMWARE ("amdgpu/pitcairn_mc.bin" );MODULE_FIRMWARE ("amdgpu/verde_mc.bin" );MODULE_FIRMWARE ("amdgpu/oland_mc.bin" ); +MODULE_FIRMWARE ("amdgpu/hainan_mc.bin" );MODULE_FIRMWARE ("amdgpu/si58_mc.bin" );#define MC_SEQ_MISC0__MT__MASK 0xf0000000
Greg Kroah-Hartman
maintainerPATCH 42/110 drm/vc4: Set ->legacy_cursor_update to false when doing non-async updates
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit fcc86cb45d38ca2f24bcea9c29c7f4742041caed upstream.
drm_atomic_helper_setup_commit() auto-completes commit->flip_done when state->legacy_cursor_update is true, but we know for sure that we want a sync update when we call drm_atomic_helper_setup_commit() from vc4_atomic_commit().
Explicitly set state->legacy_cursor_update to false to prevent this auto-completion.
--- drivers/gpu/drm/vc4/vc4_kms.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/vc4/vc4_kms.c +6 -0
@@ -216,6 +216,12 @@ static int vc4_atomic_commit(struct drm_return 0 ; } +/* We know for sure we don't want an async update here. Set +* state->legacy_cursor_update to false to prevent +* drm_atomic_helper_setup_commit() from auto-completing +* commit->flip_done. +*/ + state->legacy_cursor_update = false; ret =drm_atomic_helper_setup_commit (state, nonblock);if (ret)return ret;
Greg Kroah-Hartman
maintainerPATCH 43/110 drm/amdgpu: Fix oops when pp_funcs->switch_power_profile is unset
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Kuehling <[email protected]>
commit 919a52fc4ca137c871f295224507fa3401e08472 upstream.
On Vega20 and other pre-production GPUs, powerplay is not enabled yet. Check for NULL pointers before calling pp_funcs function pointers.
Also affects Kaveri.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +5 -2
@@ -496,8 +496,11 @@ void amdgpu_amdkfd_set_compute_idle(stru {struct amdgpu_device *adev = (struct amdgpu_device *)kgd; -amdgpu_dpm_switch_power_profile (adev, -PP_SMC_POWER_PROFILE_COMPUTE , !idle); +if (adev->powerplay.pp_funcs && + adev->powerplay.pp_funcs->switch_power_profile) +amdgpu_dpm_switch_power_profile (adev, +PP_SMC_POWER_PROFILE_COMPUTE , + !idle); }bool amdgpu_amdkfd_is_kfd_vmid (struct amdgpu_device *adev,u32 vmid)
Greg Kroah-Hartman
maintainerPATCH 44/110 drm/i915: Disable LP3 watermarks on all SNB machines
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ville Syrjälä <[email protected]>
commit 21556350ade3cb5d7afecc8b3544e56431d21695 upstream.
I have a Thinkpad X220 Tablet in my hands that is losing vblank interrupts whenever LP3 watermarks are used.
If I nudge the latency value written to the WM3 register just by one in either direction the problem disappears. That to me suggests that the punit will not enter the corrsponding powersave mode (MPLL shutdown IIRC) unless the latency value in the register matches exactly what we read from SSKPD. Ie. it's not really a latency value but rather just a cookie by which the punit can identify the desired power saving state. On HSW/BDW this was changed such that we actually just write the WM level number into those bits, which makes much more sense given the observed behaviour.
We could try to handle this by disallowing LP3 watermarks only when vblank interrupts are enabled but we'd first have to prove that only vblank interrupts are affected, which seems unlikely. Also we can't grab the wm mutex from the vblank enable/disable hooks because those are called with various spinlocks held. Thus we'd have to redesigne the watermark locking. So to play it safe and keep the code simple we simply disable LP3 watermarks on all SNB machines.
To do that we simply zero out the latency values for watermark level 3, and we adjust the watermark computation to check for that. The behaviour now matches that of the g4x/vlv/skl wm code in the presence of a zeroed latency value.
v2: s/USHRT_MAX/U32_MAX/ for consistency with the types (Chris)
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101269
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103713
--- drivers/gpu/drm/i915/intel_pm.c | 41 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/intel_pm.c +40 -1
@@ -2492,6 +2492,9 @@ static uint32_t ilk_compute_pri_wm(constuint32_t method1, method2;int cpp; +if (mem_value ==0 ) +return U32_MAX ; +if (!intel_wm_plane_visible (cstate, pstate))return 0 ;
@@ -2521,6 +2524,9 @@ static uint32_t ilk_compute_spr_wm(constuint32_t method1, method2;int cpp; +if (mem_value ==0 ) +return U32_MAX ; +if (!intel_wm_plane_visible (cstate, pstate))return 0 ;
@@ -2544,6 +2550,9 @@ static uint32_t ilk_compute_cur_wm(const {int cpp; +if (mem_value ==0 ) +return U32_MAX ; +if (!intel_wm_plane_visible (cstate, pstate))return 0 ;
@@ -2998,6 +3007,34 @@ static void snb_wm_latency_quirk(structintel_print_wm_latency (dev_priv,"Cursor" , dev_priv->wm.cur_latency); } +static void snb_wm_lp3_irq_quirk (struct drm_i915_private *dev_priv) +{ +/* +* On some SNB machines (Thinkpad X220 Tablet at least) +* LP3 usage can cause vblank interrupts to be lost. +* The DEIIR bit will go high but it looks like the CPU +* never gets interrupted. +* +* It's not clear whether other interrupt source could +* be affected or if this is somehow limited to vblank +* interrupts only. To play it safe we disable LP3 +* watermarks entirely. +*/ +if (dev_priv->wm.pri_latency[3 ] ==0 && + dev_priv->wm.spr_latency[3 ] ==0 && + dev_priv->wm.cur_latency[3 ] ==0 ) +return ; + + dev_priv->wm.pri_latency[3 ] =0 ; + dev_priv->wm.spr_latency[3 ] =0 ; + dev_priv->wm.cur_latency[3 ] =0 ; + +DRM_DEBUG_KMS ("LP3 watermarks disabled due to potential for lost interrupts\n" ); +intel_print_wm_latency (dev_priv,"Primary" , dev_priv->wm.pri_latency); +intel_print_wm_latency (dev_priv,"Sprite" , dev_priv->wm.spr_latency); +intel_print_wm_latency (dev_priv,"Cursor" , dev_priv->wm.cur_latency); +} +static void ilk_setup_wm_latency (struct drm_i915_private *dev_priv) {intel_read_wm_latency (dev_priv, dev_priv->wm.pri_latency);
@@ -3014,8 +3051,10 @@ static void ilk_setup_wm_latency(structintel_print_wm_latency (dev_priv,"Sprite" , dev_priv->wm.spr_latency);intel_print_wm_latency (dev_priv,"Cursor" , dev_priv->wm.cur_latency); -if (IS_GEN6 (dev_priv)) +if (IS_GEN6 (dev_priv)) {snb_wm_latency_quirk (dev_priv); +snb_wm_lp3_irq_quirk (dev_priv); + } }static void skl_setup_wm_latency (struct drm_i915_private *dev_priv)
Greg Kroah-Hartman
maintainerPATCH 46/110 drm/ast: fixed cursor may disappear sometimes
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Y.C. Chen <[email protected]>
commit 7989b9ee8bafe5cc625381dd0c3c4586de27ca26 upstream.
--- drivers/gpu/drm/ast/ast_mode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/ast/ast_mode.c +1 -1
@@ -1255,7 +1255,7 @@ static int ast_cursor_move(struct drm_crast_set_index_reg (ast,AST_IO_CRTC_PORT ,0xc7 , ((y >>8 ) &0x07 ));/* dummy write to fire HWC */ -ast_set_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xCB ,0xFF ,0x00 ); +ast_show_cursor (crtc);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 20/110 mmc: sdhci-pci: Workaround GLK firmware failing to restore the tuning value
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
commit 5305ec6a27b2dc7398a689e661a4a2e951026f09 upstream.
GLK firmware can indicate that the tuning value will be restored after runtime suspend, but not actually do that. Add a workaround that detects such cases, and lets the driver do re-tuning instead.
--- drivers/mmc/host/sdhci-pci-core.c | 79 +++++++++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-)
drivers/mmc/host/sdhci-pci-core.c +77 -2
@@ -12,6 +12,7 @@* - JMicron (hardware and technical support) */ +#include <linux/bitfield.h> #include <linux/string.h> #include <linux/delay.h> #include <linux/highmem.h>
@@ -462,6 +463,9 @@ struct intel_host {u32 dsm_fns;int drv_strength;bool d3_retune; +bool rpm_retune_ok; +u32 glk_rx_ctrl1; +u32 glk_tun_val; }; static const guid_t intel_dsm_guid =
@@ -791,6 +795,77 @@ cleanup:return ret; } +#ifdef CONFIG_PM +#define GLK_RX_CTRL1 0x834 +#define GLK_TUN_VAL 0x840 +#define GLK_PATH_PLL GENMASK(13, 8) +#define GLK_DLY GENMASK(6, 0) +/* Workaround firmware failing to restore the tuning value */ +static void glk_rpm_retune_wa (struct sdhci_pci_chip *chip,bool susp) +{ +struct sdhci_pci_slot *slot = chip->slots[0 ]; +struct intel_host *intel_host =sdhci_pci_priv (slot); +struct sdhci_host *host = slot->host; +u32 glk_rx_ctrl1; +u32 glk_tun_val; +u32 dly; + +if (intel_host->rpm_retune_ok || !mmc_can_retune (host->mmc)) +return ; + + glk_rx_ctrl1 =sdhci_readl (host,GLK_RX_CTRL1 ); + glk_tun_val =sdhci_readl (host,GLK_TUN_VAL ); + +if (susp) { + intel_host->glk_rx_ctrl1 = glk_rx_ctrl1; + intel_host->glk_tun_val = glk_tun_val; +return ; + } + +if (!intel_host->glk_tun_val) +return ; + +if (glk_rx_ctrl1 != intel_host->glk_rx_ctrl1) { + intel_host->rpm_retune_ok = true; +return ; + } + + dly =FIELD_PREP (GLK_DLY ,FIELD_GET (GLK_PATH_PLL , glk_rx_ctrl1) + + (intel_host->glk_tun_val <<1 )); +if (dly ==FIELD_GET (GLK_DLY , glk_rx_ctrl1)) +return ; + + glk_rx_ctrl1 = (glk_rx_ctrl1 & ~GLK_DLY ) | dly; +sdhci_writel (host, glk_rx_ctrl1,GLK_RX_CTRL1 ); + + intel_host->rpm_retune_ok = true; + chip->rpm_retune = true; +mmc_retune_needed (host->mmc); +pr_info ("%s: Requiring re-tune after rpm resume" ,mmc_hostname (host->mmc)); +} + +static void glk_rpm_retune_chk (struct sdhci_pci_chip *chip,bool susp) +{ +if (chip->pdev->device ==PCI_DEVICE_ID_INTEL_GLK_EMMC && + !chip->rpm_retune) +glk_rpm_retune_wa (chip, susp); +} + +static int glk_runtime_suspend (struct sdhci_pci_chip *chip) +{ +glk_rpm_retune_chk (chip, true); + +return sdhci_cqhci_runtime_suspend (chip); +} + +static int glk_runtime_resume (struct sdhci_pci_chip *chip) +{ +glk_rpm_retune_chk (chip, false); + +return sdhci_cqhci_runtime_resume (chip); +} +#endif +#ifdef CONFIG_ACPI static int ni_set_max_freq (struct sdhci_pci_slot *slot) {
@@ -879,8 +954,8 @@ static const struct sdhci_pci_fixes sdhc .resume = sdhci_cqhci_resume,#endif #ifdef CONFIG_PM - .runtime_suspend = sdhci_cqhci_runtime_suspend, - .runtime_resume = sdhci_cqhci_runtime_resume, + .runtime_suspend = glk_runtime_suspend, + .runtime_resume = glk_runtime_resume, #endif .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC, .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
Greg Kroah-Hartman
maintainerPATCH 48/110 can: flexcan: Unlock the MB unconditionally
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pankaj Bansal <[email protected]>
commit 5178b7cd8e42448b1041716f124734eaaa36ca50 upstream.
Unlock the MB irrespective of reception method being FIFO or timestamp based. It is optional but recommended to unlock Mailbox as soon as possible and make it available for reception.
--- drivers/net/can/flexcan.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/can/flexcan.c +6 -1
@@ -720,9 +720,14 @@ static unsigned int flexcan_mailbox_read priv->write (BIT (n -32 ), ®s->iflag2); }else { priv->write (FLEXCAN_IFLAG_RX_FIFO_AVAILABLE , ®s->iflag1); - priv->read (®s->timer); } +/* Read the Free Running Timer. It is optional but recommended +* to unlock Mailbox as soon as possible and make it available +* for reception. +*/ + priv->read (®s->timer); +return 1 ; }
Greg Kroah-Hartman
maintainerPATCH 49/110 can: dev: can_get_echo_skb(): factor out non sending code to __can_get_echo_skb()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
commit a4310fa2f24687888ce80fdb0e88583561a23700 upstream.
This patch factors out all non sending parts of can_get_echo_skb() into a seperate function __can_get_echo_skb(), so that it can be re-used in an upcoming patch.
--- drivers/net/can/dev.c | 36 +++++++++++++++++++++++++----------- include/linux/can/dev.h | 1 + 2 files changed, 26 insertions(+), 11 deletions(-)
drivers/net/can/dev.c +25 -11
@@ -477,14 +477,7 @@ void can_put_echo_skb(struct sk_buff *sk }EXPORT_SYMBOL_GPL (can_put_echo_skb); -/* -* Get the skb from the stack and loop it back locally -* -* The function is typically called when the TX done interrupt -* is handled in the device driver. The driver must protect -* access to priv->echo_skb, if necessary. -*/ -unsigned int can_get_echo_skb (struct net_device *dev,unsigned int idx) +struct sk_buff *__can_get_echo_skb (struct net_device *dev,unsigned int idx,u8 *len_ptr) {struct can_priv *priv =netdev_priv (dev);
@@ -495,13 +488,34 @@ unsigned int can_get_echo_skb(struct netstruct can_frame *cf = (struct can_frame *)skb->data;u8 dlc = cf->can_dlc; -netif_rx (priv->echo_skb[idx]); + *len_ptr = dlc; priv->echo_skb[idx] =NULL ; -return dlc; +return skb; } -return 0 ; +return NULL ; +} + +/* +* Get the skb from the stack and loop it back locally +* +* The function is typically called when the TX done interrupt +* is handled in the device driver. The driver must protect +* access to priv->echo_skb, if necessary. +*/ +unsigned int can_get_echo_skb (struct net_device *dev,unsigned int idx) +{ +struct sk_buff *skb; +u8 len; + + skb =__can_get_echo_skb (dev, idx, &len); +if (!skb) +return 0 ; + +netif_rx (skb); + +return len; }EXPORT_SYMBOL_GPL (can_get_echo_skb);
include/linux/can/dev.h +1 -0
@@ -169,6 +169,7 @@ void can_change_state(struct net_devicevoid can_put_echo_skb (struct sk_buff *skb,struct net_device *dev,unsigned int idx); +struct sk_buff *__can_get_echo_skb (struct net_device *dev,unsigned int idx,u8 *len_ptr);unsigned int can_get_echo_skb (struct net_device *dev,unsigned int idx);void can_free_echo_skb (struct net_device *dev,unsigned int idx);
Greg Kroah-Hartman
maintainerPATCH 50/110 can: dev: __can_get_echo_skb(): replace struct can_frame by canfd_frame to access frame length
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
commit 200f5c49f7a2cd694436bfc6cb0662b794c96736 upstream.
This patch replaces the use of "struct can_frame::can_dlc" by "struct canfd_frame::len" to access the frame's length. As it is ensured that both structures have a compatible memory layout for this member this is no functional change. Futher, this compatibility is documented in a comment.
--- drivers/net/can/dev.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/can/dev.c +6 -3
@@ -484,11 +484,14 @@ struct sk_buff *__can_get_echo_skb(strucBUG_ON (idx >= priv->echo_skb_max);if (priv->echo_skb[idx]) { +/* Using "struct canfd_frame::len" for the frame +* length is supported on both CAN and CANFD frames. +*/ struct sk_buff *skb = priv->echo_skb[idx]; -struct can_frame *cf = (struct can_frame *)skb->data; -u8 dlc = cf->can_dlc; +struct canfd_frame *cf = (struct canfd_frame *)skb->data; +u8 len = cf->len; - *len_ptr = dlc; + *len_ptr = len; priv->echo_skb[idx] =NULL ;return skb;
Greg Kroah-Hartman
maintainerPATCH 51/110 can: dev: __can_get_echo_skb(): Dont crash the kernel if can_priv::echo_skb is accessed out of bounds
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
commit e7a6994d043a1e31d5b17706a22ce33d2a3e4cdc upstream.
If the "struct can_priv::echo_skb" is accessed out of bounds would lead to a kernel crash. Better print a sensible warning message instead and try to recover.
--- drivers/net/can/dev.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/can/dev.c +5 -1
@@ -481,7 +481,11 @@ struct sk_buff *__can_get_echo_skb(struc {struct can_priv *priv =netdev_priv (dev); -BUG_ON (idx >= priv->echo_skb_max); +if (idx >= priv->echo_skb_max) { +netdev_err (dev,"%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n" , + __func__, idx, priv->echo_skb_max); +return NULL ; + }if (priv->echo_skb[idx]) {/* Using "struct canfd_frame::len" for the frame
Greg Kroah-Hartman
maintainerPATCH 52/110 can: dev: __can_get_echo_skb(): print error message, if trying to echo non existing skb
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
commit 7da11ba5c5066dadc2e96835a6233d56d7b7764a upstream.
Prior to echoing a successfully transmitted CAN frame (by calling can_get_echo_skb()), CAN drivers have to put the CAN frame (by calling can_put_echo_skb() in the transmit function). These put and get function take an index as parameter, which is used to identify the CAN frame.
A driver calling can_get_echo_skb() with a index not pointing to a skb is a BUG, so add an appropriate error message.
--- drivers/net/can/dev.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-)
drivers/net/can/dev.c +14 -13
@@ -480,6 +480,8 @@ EXPORT_SYMBOL_GPL(can_put_echo_skb);struct sk_buff *__can_get_echo_skb (struct net_device *dev,unsigned int idx,u8 *len_ptr) {struct can_priv *priv =netdev_priv (dev); +struct sk_buff *skb = priv->echo_skb[idx]; +struct canfd_frame *cf;if (idx >= priv->echo_skb_max) { netdev_err(dev, "%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n",
@@ -487,21 +489,20 @@ struct sk_buff *__can_get_echo_skb(strucreturn NULL ; } -if (priv->echo_skb[idx]) { -/* Using "struct canfd_frame::len" for the frame -* length is supported on both CAN and CANFD frames. -*/ -struct sk_buff *skb = priv->echo_skb[idx]; -struct canfd_frame *cf = (struct canfd_frame *)skb->data; -u8 len = cf->len; - - *len_ptr = len; - priv->echo_skb[idx] =NULL ; - -return skb; +if (!skb) { +netdev_err (dev,"%s: BUG! Trying to echo non existing skb: can_priv::echo_skb[%u]\n" , + __func__, idx); +return NULL ; } -return NULL ; +/* Using "struct canfd_frame::len" for the frame +* length is supported on both CAN and CANFD frames. +*/ + cf = (struct canfd_frame *)skb->data; + *len_ptr = cf->len; + priv->echo_skb[idx] =NULL ; + +return skb; }/*
Greg Kroah-Hartman
maintainerPATCH 21/110 gpio: dont free unallocated ida on gpiochip_add_data_with_key() error path
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Zapolskiy <[email protected]>
commit a05a14049999598a3bb6fab12db6b768a0215522 upstream.
The change corrects the error path in gpiochip_add_data_with_key() by avoiding to call ida_simple_remove(), if ida_simple_get() returns an error.
Note that ida_simple_remove()/ida_free() throws a BUG(), if id argument is negative, it allows to easily check the correctness of the fix by fuzzing the return value from ida_simple_get().
--- drivers/gpio/gpiolib.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpio/gpiolib.c +3 -2
@@ -1285,7 +1285,7 @@ int gpiochip_add_data_with_key(struct gp gdev->descs =kcalloc (chip->ngpio,sizeof (gdev->descs[0 ]),GFP_KERNEL );if (!gdev->descs) { status = -ENOMEM ; - goto err_free_gdev; + goto err_free_ida; }if (chip->ngpio ==0 ) {
@@ -1413,8 +1413,9 @@ err_free_label:kfree_const (gdev->label); err_free_descs:kfree (gdev->descs); -err_free_gdev: +err_free_ida:ida_simple_remove (&gpio_ida, gdev->id); +err_free_gdev:/* failures here can mean systems won't boot... */ pr_err("%s: GPIOs %d..%d (%s) failed to register, %d\n", __func__, gdev->base, gdev->base + gdev->ngpio - 1,
Greg Kroah-Hartman
maintainerPATCH 22/110 iwlwifi: fix wrong WGDS_WIFI_DATA_SIZE
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Chen <[email protected]>
commit 66e839030fd698586734e017fd55c4f2a89dba0b upstream.
Quoted 1 line
From coreboot/BIOS:
Name ("WGDS", Package() {
Revision,
Package() {
DomainType, // 0x7:WiFi ==> We miss this one.
WgdsWiFiSarDeltaGroup1PowerMax1, // Group 1 FCC 2400 Max
WgdsWiFiSarDeltaGroup1PowerChainA1, // Group 1 FCC 2400 A Offset WgdsWiFiSarDeltaGroup1PowerChainB1, // Group 1 FCC 2400 B Offset
WgdsWiFiSarDeltaGroup1PowerMax2, // Group 1 FCC 5200 Max
WgdsWiFiSarDeltaGroup1PowerChainA2, // Group 1 FCC 5200 A Offset WgdsWiFiSarDeltaGroup1PowerChainB2, // Group 1 FCC 5200 B Offset
WgdsWiFiSarDeltaGroup2PowerMax1, // Group 2 EC Jap 2400 Max
WgdsWiFiSarDeltaGroup2PowerChainA1, // Group 2 EC Jap 2400 A Offset WgdsWiFiSarDeltaGroup2PowerChainB1, // Group 2 EC Jap 2400 B Offset
WgdsWiFiSarDeltaGroup2PowerMax2, // Group 2 EC Jap 5200 Max
WgdsWiFiSarDeltaGroup2PowerChainA2, // Group 2 EC Jap 5200 A Offset WgdsWiFiSarDeltaGroup2PowerChainB2, // Group 2 EC Jap 5200 B Offset
WgdsWiFiSarDeltaGroup3PowerMax1, // Group 3 ROW 2400 Max
WgdsWiFiSarDeltaGroup3PowerChainA1, // Group 3 ROW 2400 A Offset WgdsWiFiSarDeltaGroup3PowerChainB1, // Group 3 ROW 2400 B Offset
WgdsWiFiSarDeltaGroup3PowerMax2, // Group 3 ROW 5200 Max
WgdsWiFiSarDeltaGroup3PowerChainA2, // Group 3 ROW 5200 A Offset WgdsWiFiSarDeltaGroup3PowerChainB2, // Group 3 ROW 5200 B Offset
}
})
When read the ACPI data to find out the WGDS, the DATA_SIZE is never matched.
Quoted 1 line
From the above format, it gives 19 numbers, but our driver is hardcode
as 18.
Fix it to pass then can parse the data into our wgds table. Then we will see:
iwlwifi 0000:01:00.0: U iwl_mvm_sar_geo_init Sending GEO_TX_POWER_LIMIT iwlwifi 0000:01:00.0: U iwl_mvm_sar_geo_init SAR geographic profile[0] Band[0]: chain A = 68 chain B = 69 max_tx_power = 54
iwlwifi 0000:01:00.0: U iwl_mvm_sar_geo_init SAR geographic profile[0] Band[1]: chain A = 48 chain B = 49 max_tx_power = 70
iwlwifi 0000:01:00.0: U iwl_mvm_sar_geo_init SAR geographic profile[1] Band[0]: chain A = 51 chain B = 67 max_tx_power = 50
iwlwifi 0000:01:00.0: U iwl_mvm_sar_geo_init SAR geographic profile[1] Band[1]: chain A = 69 chain B = 70 max_tx_power = 68
iwlwifi 0000:01:00.0: U iwl_mvm_sar_geo_init SAR geographic profile[2] Band[0]: chain A = 49 chain B = 50 max_tx_power = 48
iwlwifi 0000:01:00.0: U iwl_mvm_sar_geo_init SAR geographic profile[2] Band[1]: chain A = 52 chain B = 53 max_tx_power = 51
--- drivers/net/wireless/intel/iwlwifi/fw/acpi.h | 4 +++- drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-)
drivers/net/wireless/intel/iwlwifi/fw/acpi.h +3 -1
@@ -6,6 +6,7 @@* GPL LICENSE SUMMARY * * Copyright(c) 2017 Intel Deutschland GmbH +* Copyright(c) 2018 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
@@ -29,6 +30,7 @@* BSD LICENSE * * Copyright(c) 2017 Intel Deutschland GmbH +* Copyright(c) 2018 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without
@@ -84,7 +86,7 @@#define ACPI_WRDS_WIFI_DATA_SIZE (ACPI_SAR_TABLE_SIZE + 2)#define ACPI_EWRD_WIFI_DATA_SIZE ((ACPI_SAR_PROFILE_NUM - 1) * \ ACPI_SAR_TABLE_SIZE + 3) -#define ACPI_WGDS_WIFI_DATA_SIZE 18 +#define ACPI_WGDS_WIFI_DATA_SIZE 19#define ACPI_WRDD_WIFI_DATA_SIZE 2#define ACPI_SPLC_WIFI_DATA_SIZE 2
drivers/net/wireless/intel/iwlwifi/mvm/fw.c +1 -1
@@ -880,7 +880,7 @@ static int iwl_mvm_sar_geo_init(struct iIWL_DEBUG_RADIO (mvm,"Sending GEO_TX_POWER_LIMIT\n" );BUILD_BUG_ON (ACPI_NUM_GEO_PROFILES *ACPI_WGDS_NUM_BANDS * -ACPI_WGDS_TABLE_SIZE !=ACPI_WGDS_WIFI_DATA_SIZE ); +ACPI_WGDS_TABLE_SIZE +1 !=ACPI_WGDS_WIFI_DATA_SIZE );BUILD_BUG_ON (ACPI_NUM_GEO_PROFILES >IWL_NUM_GEO_PROFILES );
Greg Kroah-Hartman
maintainerPATCH 23/110 iwlwifi: mvm: support sta_statistics() even on older firmware
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
commit ec484d03ef0df8d34086b95710e355a259cbe1f2 upstream.
The oldest firmware supported by iwlmvm do support getting the average beacon RSSI. Enable the sta_statistics() call from mac80211 even on older firmware versions.
--- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +0 -4
@@ -4416,10 +4416,6 @@ static void iwl_mvm_mac_sta_statistics(s sinfo->filled |=BIT_ULL (NL80211_STA_INFO_SIGNAL_AVG ); } -if (!fw_has_capa (&mvm->fw->ucode_capa, -IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS )) -return ; -/* if beacon filtering isn't on mac80211 does it anyway */ if (!(vif->driver_flags &IEEE80211_VIF_BEACON_FILTER ))return ;
Greg Kroah-Hartman
maintainerPATCH 25/110 iwlwifi: mvm: dont use SAR Geo if basic SAR is not used
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luca Coelho <[email protected]>
commit 5d041c46ccb9b48acc110e214beff5e2789311df upstream.
We can't use SAR Geo if basic SAR is not enabled, since the SAR Geo tables define offsets in relation to the basic SAR table in use.
To fix this, make iwl_mvm_sar_init() return one in case WRDS is not available, so we can skip reading WGDS entirely.
--- drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 36 +++++++++++++++++++++------- 1 file changed, 28 insertions(+), 8 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/fw.c +28 -8
@@ -915,6 +915,11 @@ static int iwl_mvm_sar_get_ewrd_table(streturn -ENOENT ; } +static int iwl_mvm_sar_get_wgds_table (struct iwl_mvm *mvm) +{ +return -ENOENT ; +} +static int iwl_mvm_sar_geo_init (struct iwl_mvm *mvm) {return 0 ;
@@ -941,8 +946,11 @@ static int iwl_mvm_sar_init(struct iwl_mIWL_DEBUG_RADIO (mvm,"WRDS SAR BIOS table invalid or unavailable. (%d)\n" , ret); -/* if not available, don't fail and don't bother with EWRD */ -return 0 ; +/* +* If not available, don't fail and don't bother with EWRD. +* Return 1 to tell that we can't use WGDS either. +*/ +return 1 ; } ret =iwl_mvm_sar_get_ewrd_table (mvm);
@@ -955,9 +963,13 @@ static int iwl_mvm_sar_init(struct iwl_m/* choose profile 1 (WRDS) as default for both chains */ ret =iwl_mvm_sar_select_profile (mvm,1 ,1 ); -/* if we don't have profile 0 from BIOS, just skip it */ +/* +* If we don't have profile 0 from BIOS, just skip it. This +* means that SAR Geo will not be enabled either, even if we +* have other valid profiles. +*/ if (ret == -ENOENT ) -return 0 ; +return 1 ;return ret; }
@@ -1155,11 +1167,19 @@ int iwl_mvm_up(struct iwl_mvm *mvm)iwl_mvm_unref (mvm,IWL_MVM_REF_UCODE_DOWN ); ret =iwl_mvm_sar_init (mvm); -if (ret) - goto error; +if (ret ==0 ) { + ret =iwl_mvm_sar_geo_init (mvm); + }else if (ret >0 && !iwl_mvm_sar_get_wgds_table (mvm)) { +/* +* If basic SAR is not available, we check for WGDS, +* which should *not* be available either. If it is +* available, issue an error, because we can't use SAR +* Geo without basic SAR. +*/ +IWL_ERR (mvm,"BIOS contains WGDS but no WRDS\n" ); + } - ret =iwl_mvm_sar_geo_init (mvm); -if (ret) +if (ret <0 ) goto error;iwl_mvm_leds_sync (mvm);
Greg Kroah-Hartman
maintainerPATCH 26/110 brcmfmac: fix reporting support for 160 MHz channels
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
commit d1fe6ad6f6bd61c84788d3a7b11e459a439c6169 upstream.
Driver can report IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ so it's important to provide valid & complete info about supported bands for each channel. By default no support for 160 MHz should be assumed unless firmware reports it for a given channel later.
This fixes info passed to the userspace. Without that change userspace could try to use invalid channel and fail to start an interface.
--- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +2 -1
@@ -5997,7 +5997,8 @@ static int brcmf_construct_chaninfo(stru* for subsequent chanspecs. */ channel->flags =IEEE80211_CHAN_NO_HT40 | -IEEE80211_CHAN_NO_80MHZ ; +IEEE80211_CHAN_NO_80MHZ | +IEEE80211_CHAN_NO_160MHZ ; ch.bw =BRCMU_CHAN_BW_20 ; cfg->d11inf.encchspec (&ch); chaninfo = ch.chspec;
Greg Kroah-Hartman
maintainerPATCH 17/110 Documentation/security-bugs: Clarify treatment of embargoed information
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
commit 14fdc2c5318ae420e68496975f48dc1dbef52649 upstream.
The Linux kernel security team has been accused of rejecting the idea of security embargoes. This is incorrect, and could dissuade people from reporting security issues to us under the false assumption that the issue would leak prematurely.
Clarify the handling of embargoed information in our process documentation.
--- Documentation/admin-guide/security-bugs.rst | 45 +++++++++++++++++----------- 1 file changed, 28 insertions(+), 17 deletions(-)
Documentation/admin-guide/security-bugs.rst +28 -17
@@ -26,23 +26,34 @@ information is helpful. Any exploit cod be released without consent from the reporter unless it has already been made public. -Disclosure ----------- +Disclosure and embargoed information +------------------------------------ -The goal of the Linux kernel security team is to work with the bug -submitter to understand and fix the bug. We prefer to publish the fix as -soon as possible, but try to avoid public discussion of the bug itself -and leave that to others. - -Publishing the fix may be delayed when the bug or the fix is not yet -fully understood, the solution is not well-tested or for vendor -coordination. However, we expect these delays to be short, measurable in -days, not weeks or months. A release date is negotiated by the security -team working with the bug submitter as well as vendors. However, the -kernel security team holds the final say when setting a timeframe. The -timeframe varies from immediate (esp. if it's already publicly known bug) -to a few weeks. As a basic default policy, we expect report date to -release date to be on the order of 7 days. +The security list is not a disclosure channel. For that, see Coordination +below. + +Once a robust fix has been developed, our preference is to release the +fix in a timely fashion, treating it no differently than any of the other +thousands of changes and fixes the Linux kernel project releases every +month. + +However, at the request of the reporter, we will postpone releasing the +fix for up to 5 business days after the date of the report or after the +embargo has lifted; whichever comes first. The only exception to that +rule is if the bug is publicly known, in which case the preference is to +release the fix as soon as it's available. + +Whilst embargoed information may be shared with trusted individuals in +order to develop a fix, such information will not be published alongside +the fix or on any other disclosure channel without the permission of the +reporter. This includes but is not limited to the original bug report +and followup discussions (if any), exploits, CVE information or the +identity of the reporter. + +In other words our only interest is in getting bugs fixed. All other +information submitted to the security list and any followup discussions +of the report are treated confidentially even after the embargo has been +lifted, in perpetuity. Coordination ------------
@@ -68,7 +79,7 @@ may delay the bug handling. If a reporte assigned ahead of public disclosure, they will need to contact the private linux-distros list, described above. When such a CVE identifier is known before a patch is provided, it is desirable to mention it in the commit -message, though. +message if the reporter agrees. Non-disclosure agreements -------------------------
Greg Kroah-Hartman
maintainerPATCH 55/110 can: flexcan: use can_rx_offload_queue_sorted() for flexcan_irq_bus_*()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
commit d788905f68fd4714c82936f6f7f1d3644d7ae7ef upstream.
Currently, in case of bus error, driver will generate error message and put in the tail of the message queue. To avoid confusions, this change should place the bus related messages in proper order.
--- drivers/net/can/flexcan.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/net/can/flexcan.c +10 -2
@@ -563,9 +563,13 @@ static netdev_tx_t flexcan_start_xmit(ststatic void flexcan_irq_bus_err (struct net_device *dev,u32 reg_esr) {struct flexcan_priv *priv =netdev_priv (dev); +struct flexcan_regs __iomem *regs = priv->regs;struct sk_buff *skb;struct can_frame *cf;bool rx_errors = false, tx_errors = false; +u32 timestamp; + + timestamp = priv->read (®s->timer) <<16 ; skb =alloc_can_err_skb (dev, &cf);if (unlikely (!skb))
@@ -612,17 +616,21 @@ static void flexcan_irq_bus_err(struct nif (tx_errors) dev->stats.tx_errors++; -can_rx_offload_queue_tail (&priv->offload, skb); +can_rx_offload_queue_sorted (&priv->offload, skb, timestamp); }static void flexcan_irq_state (struct net_device *dev,u32 reg_esr) {struct flexcan_priv *priv =netdev_priv (dev); +struct flexcan_regs __iomem *regs = priv->regs;struct sk_buff *skb;struct can_frame *cf;enum can_state new_state, rx_state, tx_state;int flt;struct can_berr_counter bec; +u32 timestamp; + + timestamp = priv->read (®s->timer) <<16 ; flt = reg_esr &FLEXCAN_ESR_FLT_CONF_MASK ;if (likely (flt ==FLEXCAN_ESR_FLT_CONF_ACTIVE )) {
@@ -652,7 +660,7 @@ static void flexcan_irq_state(struct netif (unlikely (new_state ==CAN_STATE_BUS_OFF ))can_bus_off (dev); -can_rx_offload_queue_tail (&priv->offload, skb); +can_rx_offload_queue_sorted (&priv->offload, skb, timestamp); }static inline struct flexcan_priv *rx_offload_to_priv (struct can_rx_offload *offload)
Greg Kroah-Hartman
maintainerPATCH 64/110 fanotify: fix handling of events on child sub-directory
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amir Goldstein <[email protected]>
commit b469e7e47c8a075cc08bcd1e85d4365134bdcdd5 upstream.
When an event is reported on a sub-directory and the parent inode has a mark mask with FS_EVENT_ON_CHILD|FS_ISDIR, the event will be sent to fsnotify() even if the event type is not in the parent mark mask (e.g. FS_OPEN).
Further more, if that event happened on a mount or a filesystem with a mount/sb mark that does have that event type in their mask, the "on child" event will be reported on the mount/sb mark. That is not desired, because user will get a duplicate event for the same action.
Note that the event reported on the victim inode is never merged with the event reported on the parent inode, because of the check in should_merge(): old_fsn->inode == new_fsn->inode.
Fix this by looking for a match of an actual event type (i.e. not just FS_ISDIR) in parent's inode mark mask and by not reporting an "on child" event to group if event type is only found on mount/sb marks.
[backport hint: The bug seems to have always been in fanotify, but this
patch will only apply cleanly to v4.19.y]
--- fs/notify/fanotify/fanotify.c | 10 +++++----- fs/notify/fsnotify.c | 8 ++++++-- 2 files changed, 11 insertions(+), 7 deletions(-)
fs/notify/fanotify/fanotify.c +5 -5
@@ -115,12 +115,12 @@ static bool fanotify_should_send_event(scontinue ; mark = iter_info->marks[type];/* -* if the event is for a child and this inode doesn't care about -* events on the child, don't send it! +* If the event is for a child and this mark doesn't care about +* events on a child, don't send it! */ -if (type ==FSNOTIFY_OBJ_TYPE_INODE && - (event_mask &FS_EVENT_ON_CHILD ) && - !(mark->mask &FS_EVENT_ON_CHILD )) +if (event_mask &FS_EVENT_ON_CHILD && + (type !=FSNOTIFY_OBJ_TYPE_INODE || + !(mark->mask &FS_EVENT_ON_CHILD )))continue ; marks_mask |= mark->mask;
fs/notify/fsnotify.c +6 -2
@@ -161,9 +161,9 @@ int __fsnotify_parent(const struct path parent =dget_parent (dentry); p_inode = parent->d_inode; -if (unlikely (!fsnotify_inode_watches_children (p_inode))) +if (unlikely (!fsnotify_inode_watches_children (p_inode))) {__fsnotify_update_child_dentry_flags (p_inode); -else if (p_inode->i_fsnotify_mask & mask) { + }else if (p_inode->i_fsnotify_mask & mask &ALL_FSNOTIFY_EVENTS ) {struct name_snapshot name;/* we are notifying a parent so come up with the new mask which
@@ -331,6 +331,10 @@ int fsnotify(struct inode *to_tell, __u3else mnt =NULL ; +/* An event "on child" is not intended for a mount mark */ +if (mask &FS_EVENT_ON_CHILD ) + mnt =NULL ; +/* * Optimization: srcu_read_lock() has a memory barrier which can * be expensive. It protects walking the *_fsnotify_marks lists.
Greg Kroah-Hartman
maintainerPATCH 56/110 can: flexcan: handle tx-complete CAN frames via rx-offload infrastructure
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
commit ed72bc8bcb9277061e753faf300b20f97323761c upstream.
Current flexcan driver will put TX-ECHO in regular unsorted way, in this case TX-ECHO can come after the response to the same TXed message. In some cases, for example for J1939 stack, things will break. This patch is using new rx-offload API to put the messages just in the right place.
--- drivers/net/can/flexcan.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/can/flexcan.c +4 -1
@@ -794,8 +794,11 @@ static irqreturn_t flexcan_irq(int irq,/* transmission complete interrupt */ if (reg_iflag1 &FLEXCAN_IFLAG_MB (priv->tx_mb_idx)) { +u32 reg_ctrl = priv->read (®s->mb[FLEXCAN_TX_MB ].can_ctrl); + handled =IRQ_HANDLED ; - stats->tx_bytes +=can_get_echo_skb (dev,0 ); + stats->tx_bytes +=can_rx_offload_get_echo_skb (&priv->offload, +0 , reg_ctrl <<16 ); stats->tx_packets++;can_led_event (dev,CAN_LED_EVENT_TX );
Greg Kroah-Hartman
maintainerPATCH 58/110 can: hi311x: Use level-triggered interrupt
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
commit f164d0204b1156a7e0d8d1622c1a8d25752befec upstream.
If the hi3110 shares the SPI bus with another traffic-intensive device and packets are received in high volume (by a separate machine sending with "cangen -g 0 -i -x"), reception stops after a few minutes and the counter in /proc/interrupts stops incrementing. Bus state is "active". Bringing the interface down and back up reconvenes the reception. The issue is not observed when the hi3110 is the sole device on the SPI bus.
Using a level-triggered interrupt makes the issue go away and lets the hi3110 successfully receive 2 GByte over the course of 5 days while a ks8851 Ethernet chip on the same SPI bus handles 6 GByte of traffic.
Unfortunately the hi3110 datasheet is mum on the trigger type. The pin description on page 3 only specifies the polarity (active high):
http://www.holtic.com/documents/371-hi-3110_v-rev-kpdf.do
--- Documentation/devicetree/bindings/net/can/holt_hi311x.txt | 2 +- drivers/net/can/spi/hi311x.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/net/can/holt_hi311x.txt +1 -1
@@ -17,7 +17,7 @@ Example: reg = <1>; clocks = <&clk32m>; interrupt-parent = <&gpio4>; - interrupts = <13 IRQ_TYPE_EDGE_RISING>; + interrupts = <13 IRQ_TYPE_LEVEL_HIGH>; vdd-supply = <®5v0>; xceiver-supply = <®5v0>; };
drivers/net/can/spi/hi311x.c +1 -1
@@ -760,7 +760,7 @@ static int hi3110_open(struct net_device {struct hi3110_priv *priv =netdev_priv (net);struct spi_device *spi = priv->spi; -unsigned long flags =IRQF_ONESHOT |IRQF_TRIGGER_RISING ; +unsigned long flags =IRQF_ONESHOT |IRQF_TRIGGER_HIGH ;int ret; ret =open_candev (net);
Greg Kroah-Hartman
maintainerPATCH 60/110 can: flexcan: remove not needed struct flexcan_priv::tx_mb and struct flexcan_priv::tx_mb_idx
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
commit e05237f9da42ee52e73acea0bb082d788e111229 upstream.
The previous patch changes the TX path to always use the last mailbox regardless of the used offload scheme (rx-fifo or timestamp based). This means members "tx_mb" and "tx_mb_idx" of the struct flexcan_priv don't depend on the offload scheme, so replace them by compile time constants.
--- drivers/net/can/flexcan.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-)
drivers/net/can/flexcan.c +12 -15
@@ -258,9 +258,7 @@ struct flexcan_priv {struct can_rx_offload offload;struct flexcan_regs __iomem *regs; -struct flexcan_mb __iomem *tx_mb;struct flexcan_mb __iomem *tx_mb_reserved; -u8 tx_mb_idx;u32 reg_ctrl_default;u32 reg_imask1_default;u32 reg_imask2_default;
@@ -514,6 +512,7 @@ static int flexcan_get_berr_counter(consstatic netdev_tx_t flexcan_start_xmit (struct sk_buff *skb,struct net_device *dev) {const struct flexcan_priv *priv =netdev_priv (dev); +struct flexcan_regs __iomem *regs = priv->regs;struct can_frame *cf = (struct can_frame *)skb->data;u32 can_id;u32 data;
@@ -536,17 +535,17 @@ static netdev_tx_t flexcan_start_xmit(stif (cf->can_dlc >0 ) { data =be32_to_cpup ((__be32 *)&cf->data[0 ]); - priv->write (data, &priv->tx_mb->data[0 ]); + priv->write (data, ®s->mb[FLEXCAN_TX_MB ].data[0 ]); }if (cf->can_dlc >4 ) { data =be32_to_cpup ((__be32 *)&cf->data[4 ]); - priv->write (data, &priv->tx_mb->data[1 ]); + priv->write (data, ®s->mb[FLEXCAN_TX_MB ].data[1 ]); }can_put_echo_skb (skb, dev,0 ); - priv->write (can_id, &priv->tx_mb->can_id); - priv->write (ctrl, &priv->tx_mb->can_ctrl); + priv->write (can_id, ®s->mb[FLEXCAN_TX_MB ].can_id); + priv->write (ctrl, ®s->mb[FLEXCAN_TX_MB ].can_ctrl);/* Errata ERR005829 step8: * Write twice INACTIVE(0x8) code to first MB.
@@ -745,7 +744,7 @@ static inline u64 flexcan_read_reg_iflagu32 iflag1, iflag2; iflag2 = priv->read (®s->iflag2) & priv->reg_imask2_default & - ~FLEXCAN_IFLAG_MB (priv->tx_mb_idx); + ~FLEXCAN_IFLAG_MB (FLEXCAN_TX_MB ); iflag1 = priv->read (®s->iflag1) & priv->reg_imask1_default;return (u64 )iflag2 <<32 | iflag1;
@@ -795,7 +794,7 @@ static irqreturn_t flexcan_irq(int irq, reg_iflag2 = priv->read (®s->iflag2);/* transmission complete interrupt */ -if (reg_iflag2 &FLEXCAN_IFLAG_MB (priv->tx_mb_idx)) { +if (reg_iflag2 &FLEXCAN_IFLAG_MB (FLEXCAN_TX_MB )) {u32 reg_ctrl = priv->read (®s->mb[FLEXCAN_TX_MB ].can_ctrl); handled =IRQ_HANDLED ;
@@ -806,8 +805,8 @@ static irqreturn_t flexcan_irq(int irq,/* after sending a RTR frame MB is in RX mode */ priv->write (FLEXCAN_MB_CODE_TX_INACTIVE , - &priv->tx_mb->can_ctrl); - priv->write (FLEXCAN_IFLAG_MB (priv->tx_mb_idx), ®s->iflag2); + ®s->mb[FLEXCAN_TX_MB ].can_ctrl); + priv->write (FLEXCAN_IFLAG_MB (FLEXCAN_TX_MB ), ®s->iflag2);netif_wake_queue (dev); }
@@ -949,7 +948,7 @@ static int flexcan_chip_start(struct net reg_mcr &= ~FLEXCAN_MCR_MAXMB (0xff ); reg_mcr |=FLEXCAN_MCR_FRZ |FLEXCAN_MCR_HALT |FLEXCAN_MCR_SUPV |FLEXCAN_MCR_WRN_EN |FLEXCAN_MCR_SRX_DIS |FLEXCAN_MCR_IRMQ | -FLEXCAN_MCR_IDAM_C |FLEXCAN_MCR_MAXMB (priv->tx_mb_idx); +FLEXCAN_MCR_IDAM_C |FLEXCAN_MCR_MAXMB (FLEXCAN_TX_MB );if (priv->devtype_data->quirks &FLEXCAN_QUIRK_USE_OFF_TIMESTAMP ) reg_mcr &= ~FLEXCAN_MCR_FEN ;
@@ -1017,7 +1016,7 @@ static int flexcan_chip_start(struct net/* mark TX mailbox as INACTIVE */ priv->write (FLEXCAN_MB_CODE_TX_INACTIVE , - &priv->tx_mb->can_ctrl); + ®s->mb[FLEXCAN_TX_MB ].can_ctrl);/* acceptance mask/acceptance code (accept everything) */ priv->write (0x0 , ®s->rxgmask);
@@ -1376,11 +1375,9 @@ static int flexcan_probe(struct platform priv->tx_mb_reserved = ®s->mb[FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP ]; else priv->tx_mb_reserved = ®s->mb[FLEXCAN_TX_MB_RESERVED_OFF_FIFO]; - priv->tx_mb_idx =FLEXCAN_TX_MB ; - priv->tx_mb = ®s->mb[priv->tx_mb_idx]; priv->reg_imask1_default =0 ; - priv->reg_imask2_default =FLEXCAN_IFLAG_MB (priv->tx_mb_idx); + priv->reg_imask2_default =FLEXCAN_IFLAG_MB (FLEXCAN_TX_MB ); priv->offload.mailbox_read = flexcan_mailbox_read;
Greg Kroah-Hartman
maintainerPATCH 61/110 ACPICA: AML interpreter: add region addresses in global list during initialization
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Erik Schmauss <[email protected]>
commit 4abb951b73ff0a8a979113ef185651aa3c8da19b upstream.
The table load process omitted adding the operation region address range to the global list. This omission is problematic because the OS queries the global list to check for address range conflicts before deciding which drivers to load. This commit may result in warning messages that look like the following:
[ 7.871761] ACPI Warning: system_IO range 0x00000428-0x0000042F conflicts with op_region 0x00000400-0x0000047F (\PMIO) (20180531/utaddress-213) [ 7.871769] ACPI: If an ACPI driver is available for this device, you should use it instead of the native driver
However, these messages do not signify regressions. It is a result of properly adding address ranges within the global address list.
--- drivers/acpi/acpica/dsopcode.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/acpi/acpica/dsopcode.c +4 -0
@@ -417,6 +417,10 @@ acpi_ds_eval_region_operands(struct acpiACPI_FORMAT_UINT64 (obj_desc->region.address), obj_desc->region.length)); + status =acpi_ut_add_address_range (obj_desc->region.space_id, + obj_desc->region.address, + obj_desc->region.length, node); +/* Now the address and length are valid for this opregion */ obj_desc->region.flags |=AOPOBJ_DATA_VALID ;
Greg Kroah-Hartman
maintainerPATCH 62/110 IB/hfi1: Eliminate races in the SDMA send error path
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael J. Ruhl <[email protected]>
commit a0e0cb82804a6a21d9067022c2dfdf80d11da429 upstream.
pq_update() can only be called in two places: from the completion function when the complete (npkts) sequence of packets has been submitted and processed, or from setup function if a subset of the packets were submitted (i.e. the error path).
Currently both paths can call pq_update() if an error occurrs. This race will cause the n_req value to go negative, hanging file_close(), or cause a crash by freeing the txlist more than once.
Several variables are used to determine SDMA send state. Most of these are unnecessary, and have code inspectible races between the setup function and the completion function, in both the send path and the error path.
The request 'status' value can be set by the setup or by the completion function. This is code inspectibly racy. Since the status is not needed in the completion code or by the caller it has been removed.
The request 'done' value races between usage by the setup and the completion function. The completion function does not need this. When the number of processed packets matches npkts, it is done.
The 'has_error' value races between usage of the setup and the completion function. This can cause incorrect error handling and leave the n_req in an incorrect value (i.e. negative).
Simplify the code by removing all of the unneeded state checks and variables.
Clean up iovs node when it is freed.
Eliminate race conditions in the error path:
If all packets are submitted, the completion handler will set the completion status correctly (ok or aborted).
If all packets are not submitted, the caller must wait until the submitted packets have completed, and then set the completion status.
These two change eliminate the race condition in the error path.
--- drivers/infiniband/hw/hfi1/user_sdma.c | 85 ++++++++++++++------------------- drivers/infiniband/hw/hfi1/user_sdma.h | 3 - 2 files changed, 38 insertions(+), 50 deletions(-)
drivers/infiniband/hw/hfi1/user_sdma.c +38 -47
@@ -328,7 +328,6 @@ int hfi1_user_sdma_process_request(strucu8 opcode, sc, vl;u16 pkey;u32 slid; -int req_queued =0 ;u16 dlid;u32 selector;
@@ -392,7 +391,6 @@ int hfi1_user_sdma_process_request(struc req->data_len =0 ; req->pq = pq; req->cq = cq; - req->status =-1 ; req->ahg_idx =-1 ; req->iov_idx =0 ; req->sent =0 ;
@@ -400,12 +398,14 @@ int hfi1_user_sdma_process_request(struc req->seqcomp =0 ; req->seqsubmitted =0 ; req->tids =NULL ; - req->done =0 ; req->has_error =0 ;INIT_LIST_HEAD (&req->txps);memcpy (&req->info, &info,sizeof (info)); +/* The request is initialized, count it */ +atomic_inc (&pq->n_reqs); +if (req_opcode (info.ctrl) ==EXPECTED ) {/* expected must have a TID info and at least one data vector */ if (req->data_iovs <2 ) {
@@ -500,7 +500,6 @@ int hfi1_user_sdma_process_request(struc ret =pin_vector_pages (req, &req->iovs[i]);if (ret) { req->data_iovs = i; - req->status = ret; goto free_req; } req->data_len += req->iovs[i].iov.iov_len;
@@ -561,14 +560,10 @@ int hfi1_user_sdma_process_request(struc req->ahg_idx =sdma_ahg_alloc (req->sde);set_comp_state (pq, cq, info.comp_idx,QUEUED ,0 ); -atomic_inc (&pq->n_reqs); - req_queued =1 ;/* Send the first N packets in the request to buy us some time */ ret =user_sdma_send_pkts (req, pcount); -if (unlikely (ret <0 && ret != -EBUSY )) { - req->status = ret; +if (unlikely (ret <0 && ret != -EBUSY )) goto free_req; - }/* * It is possible that the SDMA engine would have processed all the
@@ -588,14 +583,8 @@ int hfi1_user_sdma_process_request(strucwhile (req->seqsubmitted != req->info.npkts) { ret =user_sdma_send_pkts (req, pcount);if (ret <0 ) { -if (ret != -EBUSY ) { - req->status = ret; -WRITE_ONCE (req->has_error,1 ); -if (READ_ONCE (req->seqcomp) == - req->seqsubmitted -1 ) - goto free_req; -return ret; - } +if (ret != -EBUSY ) + goto free_req; wait_event_interruptible_timeout( pq->busy.wait_dma, (pq->state == SDMA_PKT_Q_ACTIVE),
@@ -606,10 +595,19 @@ int hfi1_user_sdma_process_request(struc *count += idx;return 0 ; free_req: -user_sdma_free_request (req, true); -if (req_queued) +/* +* If the submitted seqsubmitted == npkts, the completion routine +* controls the final state. If sequbmitted < npkts, wait for any +* outstanding packets to finish before cleaning up. +*/ +if (req->seqsubmitted < req->info.npkts) { +if (req->seqsubmitted) +wait_event (pq->busy.wait_dma, + (req->seqcomp == req->seqsubmitted -1 )); +user_sdma_free_request (req, true);pq_update (pq); -set_comp_state (pq, cq, info.comp_idx,ERROR , req->status); +set_comp_state (pq, cq, info.comp_idx,ERROR , ret); + }return ret; }
@@ -917,7 +915,6 @@ dosend: ret =sdma_send_txlist (req->sde, &pq->busy, &req->txps, &count); req->seqsubmitted += count;if (req->seqsubmitted == req->info.npkts) { -WRITE_ONCE (req->done,1 );/* * The txreq has already been submitted to the HW queue * so we can free the AHG entry now. Corruption will not
@@ -1365,11 +1362,15 @@ static int set_txreq_header_ahg(struct ureturn idx; } -/* -* SDMA tx request completion callback. Called when the SDMA progress -* state machine gets notification that the SDMA descriptors for this -* tx request have been processed by the DMA engine. Called in -* interrupt context. +/** +* user_sdma_txreq_cb() - SDMA tx request completion callback. +* @txreq: valid sdma tx request +* @status: success/failure of request +* +* Called when the SDMA progress state machine gets notification that +* the SDMA descriptors for this tx request have been processed by the +* DMA engine. Called in interrupt context. +* Only do work on completed sequences. */ static void user_sdma_txreq_cb (struct sdma_txreq *txreq,int status) {
@@ -1378,7 +1379,7 @@ static void user_sdma_txreq_cb(struct sdstruct user_sdma_request *req;struct hfi1_user_sdma_pkt_q *pq;struct hfi1_user_sdma_comp_q *cq; -u16 idx; +enum hfi1_sdma_comp_state state =COMPLETE ;if (!tx->req)return ;
@@ -1391,31 +1392,19 @@ static void user_sdma_txreq_cb(struct sdSDMA_DBG (req,"SDMA completion with error %d" , status);WRITE_ONCE (req->has_error,1 ); + state =ERROR ; } req->seqcomp = tx->seqnum;kmem_cache_free (pq->txreq_cache, tx); - tx =NULL ; - idx = req->info.comp_idx; -if (req->status ==-1 && status ==SDMA_TXREQ_S_OK ) { -if (req->seqcomp == req->info.npkts -1 ) { - req->status =0 ; -user_sdma_free_request (req, false); -pq_update (pq); -set_comp_state (pq, cq, idx,COMPLETE ,0 ); - } - }else { -if (status !=SDMA_TXREQ_S_OK ) - req->status = status; -if (req->seqcomp == (READ_ONCE (req->seqsubmitted) -1 ) && - (READ_ONCE (req->done) || -READ_ONCE (req->has_error))) { -user_sdma_free_request (req, false); -pq_update (pq); -set_comp_state (pq, cq, idx,ERROR , req->status); - } - } +/* sequence isn't complete? We are done */ +if (req->seqcomp != req->info.npkts -1 ) +return ; + +user_sdma_free_request (req, false); +set_comp_state (pq, cq, req->info.comp_idx, state, status); +pq_update (pq); }static inline void pq_update (struct hfi1_user_sdma_pkt_q *pq)
@@ -1448,6 +1437,8 @@ static void user_sdma_free_request(strucif (!node)continue ; + req->iovs[i].node =NULL ; +if (unpin)hfi1_mmu_rb_remove (req->pq->handler, &node->rb);
drivers/infiniband/hw/hfi1/user_sdma.h +0 -3
@@ -205,8 +205,6 @@ struct user_sdma_request {/* Writeable fields shared with interrupt */ u64 seqcomp____cacheline_aligned_in_smp ;u64 seqsubmitted; -/* status of the last txreq completed */ -int status;/* Send side fields */ struct list_head txps____cacheline_aligned_in_smp ;
@@ -228,7 +226,6 @@ struct user_sdma_request {u16 tididx;/* progress index moving along the iovs array */ u8 iov_idx; -u8 done;u8 has_error;struct user_sdma_iovec iovs[MAX_VECTORS_PER_REQ ];
Greg Kroah-Hartman
maintainerPATCH 54/110 can: rx-offload: rename can_rx_offload_irq_queue_err_skb() to can_rx_offload_queue_tail()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
commit 4530ec36bb1e0d24f41c33229694adacda3d5d89 upstream.
This function has nothing todo with error.
--- drivers/net/can/flexcan.c | 4 ++-- drivers/net/can/rx-offload.c | 5 +++-- include/linux/can/rx-offload.h | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-)
drivers/net/can/flexcan.c +2 -2
@@ -612,7 +612,7 @@ static void flexcan_irq_bus_err(struct nif (tx_errors) dev->stats.tx_errors++; -can_rx_offload_irq_queue_err_skb (&priv->offload, skb); +can_rx_offload_queue_tail (&priv->offload, skb); }static void flexcan_irq_state (struct net_device *dev,u32 reg_esr)
@@ -652,7 +652,7 @@ static void flexcan_irq_state(struct netif (unlikely (new_state ==CAN_STATE_BUS_OFF ))can_bus_off (dev); -can_rx_offload_irq_queue_err_skb (&priv->offload, skb); +can_rx_offload_queue_tail (&priv->offload, skb); }static inline struct flexcan_priv *rx_offload_to_priv (struct can_rx_offload *offload)
drivers/net/can/rx-offload.c +3 -2
@@ -255,7 +255,8 @@ unsigned int can_rx_offload_get_echo_skb }EXPORT_SYMBOL_GPL (can_rx_offload_get_echo_skb); -int can_rx_offload_irq_queue_err_skb (struct can_rx_offload *offload,struct sk_buff *skb) +int can_rx_offload_queue_tail (struct can_rx_offload *offload, +struct sk_buff *skb) {if (skb_queue_len (&offload->skb_queue) > offload->skb_queue_len_max)
@@ -266,7 +267,7 @@ int can_rx_offload_irq_queue_err_skb(strreturn 0 ; } -EXPORT_SYMBOL_GPL (can_rx_offload_irq_queue_err_skb); +EXPORT_SYMBOL_GPL (can_rx_offload_queue_tail);static int can_rx_offload_init_queue (struct net_device *dev,struct can_rx_offload *offload,unsigned int weight) {
include/linux/can/rx-offload.h +2 -1
@@ -45,7 +45,8 @@ int can_rx_offload_queue_sorted(struct c struct sk_buff *skb, u32 timestamp);unsigned int can_rx_offload_get_echo_skb (struct can_rx_offload *offload,unsigned int idx,u32 timestamp); -int can_rx_offload_irq_queue_err_skb (struct can_rx_offload *offload,struct sk_buff *skb); +int can_rx_offload_queue_tail (struct can_rx_offload *offload, +struct sk_buff *skb);void can_rx_offload_reset (struct can_rx_offload *offload);void can_rx_offload_del (struct can_rx_offload *offload);void can_rx_offload_enable (struct can_rx_offload *offload);
Greg Kroah-Hartman
maintainerPATCH 100/110 include/linux/pfn_t.h: force ~ to be parsed as an unary operator
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastien Boisvert <[email protected]>
commit 4d54954a197175c0dcb3c82af0c0740d0c5f827a upstream.
Tracing the event "fs_dax:dax_pmd_insert_mapping" with perf produces this warning:
[fs_dax:dax_pmd_insert_mapping] unknown op '~'
It is printed in process_op (tools/lib/traceevent/event-parse.c) because '~' is parsed as a binary operator.
perf reads the format of fs_dax:dax_pmd_insert_mapping ("print fmt") from /sys/kernel/debug/tracing/events/fs_dax/dax_pmd_insert_mapping/format .
The format contains:
~(((u64) ~(~(((1UL) << 12)-1)))
^
\ interpreted as a binary operator by process_op().
This part is generated in the declaration of the event class dax_pmd_insert_mapping_class in include/trace/events/fs_dax.h :
__print_flags_u64(__entry->pfn_val & PFN_FLAGS_MASK, "|", PFN_FLAGS_TRACE),
This patch adds a pair of parentheses in the declaration of PFN_FLAGS_MASK to make sure that '~' is parsed as a unary operator by perf.
The part of the format that was problematic is now:
~(((u64) (~(~(((1UL) << 12)-1))))
Now, all the '~' are parsed as unary operators.
--- include/linux/pfn_t.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/pfn_t.h +1 -1
@@ -10,7 +10,7 @@* PFN_DEV - pfn is not covered by system memmap by default * PFN_MAP - pfn has a dynamic page mapping established by a device driver */ -#define PFN_FLAGS_MASK (((u64) ~PAGE_MASK) << (BITS_PER_LONG_LONG - PAGE_SHIFT)) +#define PFN_FLAGS_MASK (((u64) (~PAGE_MASK)) << (BITS_PER_LONG_LONG - PAGE_SHIFT))#define PFN_SG_CHAIN (1ULL << (BITS_PER_LONG_LONG - 1))#define PFN_SG_LAST (1ULL << (BITS_PER_LONG_LONG - 2))#define PFN_DEV (1ULL << (BITS_PER_LONG_LONG - 3))
Greg Kroah-Hartman
maintainerPATCH 102/110 tty: wipe buffer if not echoing data
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Kroah-Hartman <[email protected]>
commit b97b3d9fb57860a60592859e332de7759fd54c2e upstream.
If we are not echoing the data to userspace or the console is in icanon mode, then perhaps it is a "secret" so we should wipe it once we are done with it.
This mirrors the logic that the audit code has.
--- drivers/tty/n_tty.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
drivers/tty/n_tty.c +17 -3
@@ -152,17 +152,28 @@ static inline unsigned char *echo_buf_adreturn &ldata->echo_buf[i & (N_TTY_BUF_SIZE -1 )]; } +/* If we are not echoing the data, perhaps this is a secret so erase it */ +static void zero_buffer (struct tty_struct *tty,u8 *buffer,int size) +{ +bool icanon = !!L_ICANON (tty); +bool no_echo = !L_ECHO (tty); + +if (icanon && no_echo) +memset (buffer,0x00 , size); +} +static int tty_copy_to_user (struct tty_struct *tty,void __user *to,size_t tail,size_t n) {struct n_tty_data *ldata = tty->disc_data;size_t size =N_TTY_BUF_SIZE - tail; -const void *from =read_buf_addr (ldata, tail); +void *from =read_buf_addr (ldata, tail);int uncopied;if (n > size) {tty_audit_add_data (tty, from, size); uncopied =copy_to_user (to, from, size); +zero_buffer (tty, from, size - uncopied);if (uncopied)return uncopied; to += size;
@@ -171,7 +182,9 @@ static int tty_copy_to_user(struct tty_s }tty_audit_add_data (tty, from, n); -return copy_to_user (to, from, n); + uncopied =copy_to_user (to, from, n); +zero_buffer (tty, from, n - uncopied); +return uncopied; }/**
@@ -1960,11 +1973,12 @@ static int copy_from_read_buf(struct tty n =min (head - ldata->read_tail,N_TTY_BUF_SIZE - tail); n =min (*nr, n);if (n) { -const unsigned char *from =read_buf_addr (ldata, tail); +unsigned char *from =read_buf_addr (ldata, tail); retval =copy_to_user (*b, from, n); n -= retval; is_eof = n ==1 && *from ==EOF_CHAR (tty);tty_audit_add_data (tty, from, n); +zero_buffer (tty, from, n);smp_store_release (&ldata->read_tail, ldata->read_tail + n);/* Turn single EOF into zero-length read */ if (L_EXTPROC(tty) && ldata->icanon && is_eof &&
Greg Kroah-Hartman
maintainerPATCH 103/110 gfs2: Fix iomap buffer head reference counting bug
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Gruenbacher <[email protected]>
commit c26b5aa8ef0d46035060fded475e6ab957b9f69f upstream.
GFS2 passes the inode buffer head (dibh) from gfs2_iomap_begin to gfs2_iomap_end in iomap->private. It sets that private pointer in gfs2_iomap_get. Users of gfs2_iomap_get other than gfs2_iomap_begin would have to release iomap->private, but this isn't done correctly, leading to a leak of buffer head references.
To fix this, move the code for setting iomap->private from gfs2_iomap_get to gfs2_iomap_begin.
--- fs/gfs2/bmap.c | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-)
fs/gfs2/bmap.c +17 -23
@@ -826,7 +826,7 @@ static int gfs2_iomap_get(struct inode * ret =gfs2_meta_inode_buffer (ip, &dibh);if (ret) goto unlock; - iomap->private = dibh; + mp->mp_bh[0 ] = dibh;if (gfs2_is_stuffed (ip)) {if (flags &IOMAP_WRITE ) {
@@ -863,9 +863,6 @@ unstuff: len = lblock_stop - lblock +1 ; iomap->length = len << inode->i_blkbits; -get_bh (dibh); - mp->mp_bh[0 ] = dibh; - height = ip->i_height;while ((lblock +1 ) * sdp->sd_sb.sb_bsize > sdp->sd_heightsize[height]) height++;
@@ -898,8 +895,6 @@ out: iomap->bdev = inode->i_sb->s_bdev; unlock:up_read (&ip->i_rw_mutex); -if (ret && dibh) -brelse (dibh);return ret; do_alloc:
@@ -980,9 +975,9 @@ static void gfs2_iomap_journaled_page_dostatic int gfs2_iomap_begin_write (struct inode *inode,loff_t pos,loff_t length,unsigned flags, -struct iomap *iomap) +struct iomap *iomap, +struct metapath *mp) { -struct metapath mp = { .mp_aheight =1 , };struct gfs2_inode *ip =GFS2_I (inode);struct gfs2_sbd *sdp =GFS2_SB (inode);unsigned int data_blocks =0 , ind_blocks =0 , rblocks;
@@ -996,9 +991,9 @@ static int gfs2_iomap_begin_write(struct unstuff =gfs2_is_stuffed (ip) && pos + length >gfs2_max_stuffed_size (ip); - ret =gfs2_iomap_get (inode, pos, length, flags, iomap, &mp); + ret =gfs2_iomap_get (inode, pos, length, flags, iomap, mp);if (ret) - goto out_release; + goto out_unlock; alloc_required = unstuff || iomap->type ==IOMAP_HOLE ;
@@ -1013,7 +1008,7 @@ static int gfs2_iomap_begin_write(struct ret =gfs2_quota_lock_check (ip, &ap);if (ret) - goto out_release; + goto out_unlock; ret =gfs2_inplace_reserve (ip, &ap);if (ret)
@@ -1038,17 +1033,15 @@ static int gfs2_iomap_begin_write(struct ret =gfs2_unstuff_dinode (ip,NULL );if (ret) goto out_trans_end; -release_metapath (&mp); -brelse (iomap->private); - iomap->private =NULL ; +release_metapath (mp); ret =gfs2_iomap_get (inode, iomap->offset, iomap->length, - flags, iomap, &mp); + flags, iomap, mp);if (ret) goto out_trans_end; }if (iomap->type ==IOMAP_HOLE ) { - ret =gfs2_iomap_alloc (inode, iomap, flags, &mp); + ret =gfs2_iomap_alloc (inode, iomap, flags, mp);if (ret) {gfs2_trans_end (sdp);gfs2_inplace_release (ip);
@@ -1056,7 +1049,6 @@ static int gfs2_iomap_begin_write(struct goto out_qunlock; } } -release_metapath (&mp);if (!gfs2_is_stuffed (ip) &&gfs2_is_jdata (ip)) iomap->page_done = gfs2_iomap_journaled_page_done;return 0 ;
@@ -1069,10 +1061,7 @@ out_trans_fail: out_qunlock:if (alloc_required)gfs2_quota_unlock (ip); -out_release: -if (iomap->private) -brelse (iomap->private); -release_metapath (&mp); +out_unlock:gfs2_write_unlock (inode);return ret; }
@@ -1088,10 +1077,10 @@ static int gfs2_iomap_begin(struct inodetrace_gfs2_iomap_start (ip, pos, length, flags);if ((flags &IOMAP_WRITE ) && !(flags &IOMAP_DIRECT )) { - ret =gfs2_iomap_begin_write (inode, pos, length, flags, iomap); + ret =gfs2_iomap_begin_write (inode, pos, length, flags, iomap, &mp); }else { ret =gfs2_iomap_get (inode, pos, length, flags, iomap, &mp); -release_metapath (&mp); +/* * Silently fall back to buffered I/O for stuffed files or if * we've hot a hole (see gfs2_file_direct_write).
@@ -1100,6 +1089,11 @@ static int gfs2_iomap_begin(struct inode iomap->type != IOMAP_MAPPED) ret = -ENOTBLK ; } +if (!ret) { +get_bh (mp.mp_bh[0 ]); + iomap->private = mp.mp_bh[0 ]; + } +release_metapath (&mp);trace_gfs2_iomap_end (ip, iomap, ret);return ret; }
Greg Kroah-Hartman
maintainerPATCH 105/110 media: ov5640: Re-work MIPI startup sequence
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacopo Mondi <[email protected]>
commit aa4bb8b8838ffcc776a79f49a4d7476b82405349 upstream.
Rework the MIPI interface startup sequence with the following changes:
- Remove MIPI bus initialization from the initial settings blob
- At set_power(1) time power up MIPI Tx/Rx and set data and clock lanes in LP11 during 'sleep' and 'idle' with MIPI clock in non-continuous mode.
- At s_stream time enable/disable the MIPI interface output.
- Restore default settings at set_power(0) time.
Before this commit the sensor MIPI interface was initialized with settings that require a start/stop sequence at power-up time in order to force lanes into LP11 state, as they were initialized in LP00 when in 'sleep mode', which is assumed to be the sensor manual definition for the D-PHY defined stop mode.
The stream start/stop was performed by enabling disabling clock gating, and had the side effect to change the lanes sleep mode configuration when stream was stopped.
Clock gating/ungating:
- ret = ov5640_mod_reg(sensor, OV5640_REG_MIPI_CTRL00, BIT(5),
- on ? 0 : BIT(5));
- if (ret)
Set lanes in LP11 when in 'sleep mode':
- ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00,
- on ? 0x00 : 0x70);
This commit fixes an issue reported by Jagan Teki on i.MX6 platforms that prevents the host interface from powering up correctly:
https://lkml.org/lkml/2018/6/1/38
It also improves MIPI capture operations stability on my testing platform where MIPI capture often failed and returned all-purple frames.
--- drivers/media/i2c/ov5640.c | 99 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 20 deletions(-)
drivers/media/i2c/ov5640.c +79 -20
@@ -288,10 +288,10 @@ static const struct reg_value ov5640_ini {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0}, {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0}, {0x3000, 0x00, 0, 0}, {0x3002, 0x1c, 0, 0}, {0x3004, 0xff, 0, 0}, {0x3006, 0xc3, 0, 0}, - {0x300e, 0x45, 0, 0}, {0x302e, 0x08, 0, 0}, {0x4300, 0x3f, 0, 0}, + {0x302e, 0x08, 0, 0}, {0x4300, 0x3f, 0, 0}, {0x501f, 0x00, 0, 0}, {0x4713, 0x03, 0, 0}, {0x4407, 0x04, 0, 0}, {0x440e, 0x00, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0}, - {0x4837, 0x0a, 0, 0}, {0x4800, 0x04, 0, 0}, {0x3824, 0x02, 0, 0}, + {0x4837, 0x0a, 0, 0}, {0x3824, 0x02, 0, 0}, {0x5000, 0xa7, 0, 0}, {0x5001, 0xa3, 0, 0}, {0x5180, 0xff, 0, 0}, {0x5181, 0xf2, 0, 0}, {0x5182, 0x00, 0, 0}, {0x5183, 0x14, 0, 0}, {0x5184, 0x25, 0, 0}, {0x5185, 0x24, 0, 0}, {0x5186, 0x09, 0, 0},
@@ -1104,12 +1104,25 @@ static int ov5640_set_stream_mipi(struct {int ret; - ret =ov5640_mod_reg (sensor,OV5640_REG_MIPI_CTRL00 ,BIT (5 ), - on ?0 :BIT (5 )); -if (ret) -return ret; - ret =ov5640_write_reg (sensor,OV5640_REG_PAD_OUTPUT00 , - on ?0x00 :0x70 ); +/* +* Enable/disable the MIPI interface +* +* 0x300e = on ? 0x45 : 0x40 +* +* FIXME: the sensor manual (version 2.03) reports +* [7:5] = 000 : 1 data lane mode +* [7:5] = 001 : 2 data lanes mode +* But this settings do not work, while the following ones +* have been validated for 2 data lanes mode. +* +* [7:5] = 010 : 2 data lanes mode +* [4] = 0 : Power up MIPI HS Tx +* [3] = 0 : Power up MIPI LS Rx +* [2] = 1/0 : MIPI interface enable/disable +* [1:0] = 01/00: FIXME: 'debug' +*/ + ret =ov5640_write_reg (sensor,OV5640_REG_IO_MIPI_CTRL00 , + on ?0x45 :0x40 );if (ret)return ret;
@@ -1790,23 +1803,69 @@ static int ov5640_set_power(struct ov564if (ret) goto power_off; +/* We're done here for DVP bus, while CSI-2 needs setup. */ +if (sensor->ep.bus_type !=V4L2_MBUS_CSI2 ) +return 0 ; + +/* +* Power up MIPI HS Tx and LS Rx; 2 data lanes mode +* +* 0x300e = 0x40 +* [7:5] = 010 : 2 data lanes mode (see FIXME note in +* "ov5640_set_stream_mipi()") +* [4] = 0 : Power up MIPI HS Tx +* [3] = 0 : Power up MIPI LS Rx +* [2] = 0 : MIPI interface disabled +*/ + ret =ov5640_write_reg (sensor, +OV5640_REG_IO_MIPI_CTRL00 ,0x40 ); +if (ret) + goto power_off; + +/* +* Gate clock and set LP11 in 'no packets mode' (idle) +* +* 0x4800 = 0x24 +* [5] = 1 : Gate clock when 'no packets' +* [2] = 1 : MIPI bus in LP11 when 'no packets' +*/ + ret =ov5640_write_reg (sensor, +OV5640_REG_MIPI_CTRL00 ,0x24 ); +if (ret) + goto power_off; + +/* +* Set data lanes and clock in LP11 when 'sleeping' +* +* 0x3019 = 0x70 +* [6] = 1 : MIPI data lane 2 in LP11 when 'sleeping' +* [5] = 1 : MIPI data lane 1 in LP11 when 'sleeping' +* [4] = 1 : MIPI clock lane in LP11 when 'sleeping' +*/ + ret =ov5640_write_reg (sensor, +OV5640_REG_PAD_OUTPUT00 ,0x70 ); +if (ret) + goto power_off; + +/* Give lanes some time to coax into LP11 state. */ +usleep_range (500 ,1000 ); + + }else {if (sensor->ep.bus_type ==V4L2_MBUS_CSI2 ) { -/* -* start streaming briefly followed by stream off in -* order to coax the clock lane into LP-11 state. -*/ - ret =ov5640_set_stream_mipi (sensor, true); -if (ret) - goto power_off; -usleep_range (1000 ,2000 ); - ret =ov5640_set_stream_mipi (sensor, false); -if (ret) - goto power_off; +/* Reset MIPI bus settings to their default values. */ +ov5640_write_reg (sensor, +OV5640_REG_IO_MIPI_CTRL00 ,0x58 ); +ov5640_write_reg (sensor, +OV5640_REG_MIPI_CTRL00 ,0x04 ); +ov5640_write_reg (sensor, +OV5640_REG_PAD_OUTPUT00 ,0x00 ); } -return 0 ; +ov5640_set_power_off (sensor); } +return 0 ; + power_off:ov5640_set_power_off (sensor);return ret;
Greg Kroah-Hartman
maintainerPATCH 106/110 media: ov5640: Fix timings setup code
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacopo Mondi <[email protected]>
commit bad1774ed41e98a43074e50e7d5ac9e1e848d99a upstream.
As of: commit 476dec012f4c ("media: ov5640: Add horizontal and vertical totals") the timings parameters gets programmed separately from the static register values array.
When changing capture mode, the vertical and horizontal totals gets inspected by the set_mode_exposure_calc() functions, and only later programmed with the new values. This means exposure, light banding filter and shutter gain are calculated using the previous timings, and are thus not correct.
Fix this by programming timings right after the static register value table has been sent to the sensor in the ov5640_load_regs() function.
--- drivers/media/i2c/ov5640.c | 50 ++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 29 deletions(-)
drivers/media/i2c/ov5640.c +21 -29
@@ -910,6 +910,26 @@ static int ov5640_mod_reg(struct ov5640_ }/* download ov5640 settings to sensor through i2c */ +static int ov5640_set_timings (struct ov5640_dev *sensor, +const struct ov5640_mode_info *mode) +{ +int ret; + + ret =ov5640_write_reg16 (sensor,OV5640_REG_TIMING_DVPHO , mode->hact); +if (ret <0 ) +return ret; + + ret =ov5640_write_reg16 (sensor,OV5640_REG_TIMING_DVPVO , mode->vact); +if (ret <0 ) +return ret; + + ret =ov5640_write_reg16 (sensor,OV5640_REG_TIMING_HTS , mode->htot); +if (ret <0 ) +return ret; + +return ov5640_write_reg16 (sensor,OV5640_REG_TIMING_VTS , mode->vtot); +} +static int ov5640_load_regs (struct ov5640_dev *sensor,const struct ov5640_mode_info *mode) {
@@ -937,7 +957,7 @@ static int ov5640_load_regs(struct ov564usleep_range (1000 * delay_ms,1000 * delay_ms +100 ); } -return ret; +return ov5640_set_timings (sensor, mode); }/* read exposure, in number of line periods */
@@ -1400,30 +1420,6 @@ static int ov5640_set_virtual_channel(streturn ov5640_write_reg (sensor,OV5640_REG_DEBUG_MODE , temp); } -static int ov5640_set_timings (struct ov5640_dev *sensor, -const struct ov5640_mode_info *mode) -{ -int ret; - - ret =ov5640_write_reg16 (sensor,OV5640_REG_TIMING_DVPHO , mode->hact); -if (ret <0 ) -return ret; - - ret =ov5640_write_reg16 (sensor,OV5640_REG_TIMING_DVPVO , mode->vact); -if (ret <0 ) -return ret; - - ret =ov5640_write_reg16 (sensor,OV5640_REG_TIMING_HTS , mode->htot); -if (ret <0 ) -return ret; - - ret =ov5640_write_reg16 (sensor,OV5640_REG_TIMING_VTS , mode->vtot); -if (ret <0 ) -return ret; - -return 0 ; -} -static const struct ov5640_mode_info *ov5640_find_mode (struct ov5640_dev *sensor,enum ov5640_frame_rate fr,int width,int height,bool nearest)
@@ -1667,10 +1663,6 @@ static int ov5640_set_mode(struct ov5640if (ret <0 )return ret; - ret =ov5640_set_timings (sensor, mode); -if (ret <0 ) -return ret; - ret =ov5640_set_binning (sensor, dn_mode !=SCALING );if (ret <0 )return ret;
Greg Kroah-Hartman
maintainerPATCH 107/110 media: ov5640: fix exposure regression
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hugues Fruchet <[email protected]>
commit dc29a1c187eedc1d498cb567c44bbbc832b009cb upstream.
Symptom was black image when capturing HD or 5Mp picture due to manual exposure set to 1 while it was intended to set autoexposure to "manual", fix this.
--- drivers/media/i2c/ov5640.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/media/i2c/ov5640.c +12 -6
@@ -960,6 +960,12 @@ static int ov5640_load_regs(struct ov564return ov5640_set_timings (sensor, mode); } +static int ov5640_set_autoexposure (struct ov5640_dev *sensor,bool on) +{ +return ov5640_mod_reg (sensor,OV5640_REG_AEC_PK_MANUAL , +BIT (0 ), on ?0 :BIT (0 )); +} +/* read exposure, in number of line periods */ static int ov5640_get_exposure (struct ov5640_dev *sensor) {
@@ -1604,7 +1610,7 @@ static int ov5640_set_mode_exposure_calc*/ static int ov5640_set_mode_direct (struct ov5640_dev *sensor,const struct ov5640_mode_info *mode, -s32 exposure) +bool auto_exp) {int ret;
@@ -1621,7 +1627,8 @@ static int ov5640_set_mode_direct(structif (ret)return ret; -return __v4l2_ctrl_s_ctrl (sensor->ctrls.auto_exp, exposure); +return __v4l2_ctrl_s_ctrl (sensor->ctrls.auto_exp, auto_exp ? +V4L2_EXPOSURE_AUTO :V4L2_EXPOSURE_MANUAL ); }static int ov5640_set_mode (struct ov5640_dev *sensor)
@@ -1629,7 +1636,7 @@ static int ov5640_set_mode(struct ov5640const struct ov5640_mode_info *mode = sensor->current_mode;const struct ov5640_mode_info *orig_mode = sensor->last_mode;enum ov5640_downsize_mode dn_mode, orig_dn_mode; -s32 exposure; +bool auto_exp = sensor->ctrls.auto_exp->val ==V4L2_EXPOSURE_AUTO ;int ret; dn_mode = mode->dn_mode;
@@ -1640,8 +1647,7 @@ static int ov5640_set_mode(struct ov5640if (ret)return ret; - exposure = sensor->ctrls.auto_exp->val; - ret =ov5640_set_exposure (sensor,V4L2_EXPOSURE_MANUAL ); + ret =ov5640_set_autoexposure (sensor, false);if (ret)return ret;
@@ -1657,7 +1663,7 @@ static int ov5640_set_mode(struct ov5640* change inside subsampling or scaling * download firmware directly */ - ret =ov5640_set_mode_direct (sensor, mode, exposure); + ret =ov5640_set_mode_direct (sensor, mode, auto_exp); }if (ret <0 )
Greg Kroah-Hartman
maintainerPATCH 109/110 media: ov5640: fix wrong binning value in exposure calculation
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hugues Fruchet <[email protected]>
commit c2c3f42df4dd9bb231d756bacb0c897f662c6d3c upstream.
ov5640_set_mode_exposure_calc() is checking binning value but binning value read is buggy, fix this.
Rename ov5640_binning_on() to ov5640_get_binning() as per other similar functions.
--- drivers/media/i2c/ov5640.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/media/i2c/ov5640.c +4 -4
@@ -1384,7 +1384,7 @@ static int ov5640_set_ae_target(struct oreturn ov5640_write_reg (sensor,OV5640_REG_AEC_CTRL1F , fast_low); } -static int ov5640_binning_on (struct ov5640_dev *sensor) +static int ov5640_get_binning (struct ov5640_dev *sensor) {u8 temp;int ret;
@@ -1392,8 +1392,8 @@ static int ov5640_binning_on(struct ov56 ret =ov5640_read_reg (sensor,OV5640_REG_TIMING_TC_REG21 , &temp);if (ret)return ret; - temp &=0xfe ; -return temp ?1 :0 ; + +return temp &BIT (0 ); }static int ov5640_set_binning (struct ov5640_dev *sensor,bool enable)
@@ -1479,7 +1479,7 @@ static int ov5640_set_mode_exposure_calcif (ret <0 )return ret; prev_shutter = ret; - ret =ov5640_binning_on (sensor); + ret =ov5640_get_binning (sensor);if (ret <0 )return ret; if (ret && mode->id != OV5640_MODE_720P_1280_720 &&
Greg Kroah-Hartman
maintainerPATCH 99/110 dax: Avoid losing wakeup in dax_lock_mapping_entry
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox <[email protected]>
commit 25bbe21bf427a81b8e3ccd480ea0e1d940256156 upstream.
After calling get_unlocked_entry(), you have to call put_unlocked_entry() to avoid subsequent waiters losing wakeups.
--- fs/dax.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
fs/dax.c +6 -1
@@ -217,6 +217,9 @@ static inline void *unlock_slot(struct areturn (void *)entry; } +static void put_unlocked_mapping_entry (struct address_space *mapping, +pgoff_t index,void *entry); +/* * Lookup entry in radix tree, wait for it to become unlocked if it is * exceptional entry and return it. The caller must call
@@ -256,8 +259,10 @@ static void *__get_unlocked_mapping_entr revalidate =wait_fn ();finish_wait (wq, &ewait.wait);xa_lock_irq (&mapping->i_pages); -if (revalidate) +if (revalidate) { +put_unlocked_mapping_entry (mapping, index, entry);return ERR_PTR (-EAGAIN ); + } } }
Greg Kroah-Hartman
maintainerPATCH 24/110 iwlwifi: mvm: fix regulatory domain update when the firmware starts
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
commit 82715ac71e6b94a2c2136e31f3a8e6748e33aa8c upstream.
When the firmware starts, it doesn't have any regulatory information, hence it uses the world wide limitations. The driver can feed the firmware with previous knowledge that was kept in the driver, but the firmware may still not update its internal tables.
This happens when we start a BSS interface, and then the firmware can change the regulatory tables based on our location and it'll use more lenient, location specific rules. Then, if the firmware is shut down (when the interface is brought down), and then an AP interface is created, the firmware will forget the country specific rules.
The host will think that we are in a certain country that may allow channels and will try to teach the firmware about our location, but the firmware may still not allow to drop the world wide limitations and apply country specific rules because it was just re-started.
In this case, the firmware will reply with MCC_RESP_ILLEGAL to the MCC_UPDATE_CMD. In that case, iwlwifi needs to let the upper layers (cfg80211 / hostapd) know that the channel list they know about has been updated.
This fixes https://bugzilla.kernel.org/show_bug.cgi?id=201105
--- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 8 ++++++-- drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | 5 ++--- 2 files changed, 8 insertions(+), 5 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +6 -2
@@ -306,8 +306,12 @@ struct ieee80211_regdomain *iwl_mvm_get_ goto out; } -if (changed) - *changed = (resp->status ==MCC_RESP_NEW_CHAN_PROFILE ); +if (changed) { +u32 status =le32_to_cpu (resp->status); + + *changed = (status ==MCC_RESP_NEW_CHAN_PROFILE || + status ==MCC_RESP_ILLEGAL ); + } regd = iwl_parse_nvm_mcc_info(mvm->trans->dev, mvm->cfg, __le32_to_cpu(resp->n_channels),
drivers/net/wireless/intel/iwlwifi/mvm/nvm.c +2 -3
@@ -545,9 +545,8 @@ iwl_mvm_update_mcc(struct iwl_mvm *mvm, }IWL_DEBUG_LAR (mvm, -"MCC response status: 0x%x. new MCC: 0x%x ('%c%c') change: %d n_chans: %d\n" , - status, mcc, mcc >>8 , mcc &0xff , - !!(status ==MCC_RESP_NEW_CHAN_PROFILE ), n_channels); +"MCC response status: 0x%x. new MCC: 0x%x ('%c%c') n_chans: %d\n" , + status, mcc, mcc >>8 , mcc &0xff , n_channels); exit:iwl_free_resp (&cmd);
Greg Kroah-Hartman
maintainerPATCH 47/110 drm/ast: Remove existing framebuffers before loading driver
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
commit 5478ad10e7850ce3d8b7056db05ddfa3c9ddad9a upstream.
If vesafb attaches to the AST device, it configures the framebuffer memory for uncached access by default. When ast.ko later tries to attach itself to the device, it wants to use write-combining on the framebuffer memory, but vesefb's existing configuration for uncached access takes precedence. This results in reduced performance.
Removing the framebuffer's configuration before loding the AST driver fixes the problem. Other DRM drivers already contain equivalent code.
--- drivers/gpu/drm/ast/ast_drv.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/gpu/drm/ast/ast_drv.c +21 -0
@@ -60,8 +60,29 @@ static const struct pci_device_id pciidlMODULE_DEVICE_TABLE (pci, pciidlist); +static void ast_kick_out_firmware_fb (struct pci_dev *pdev) +{ +struct apertures_struct *ap; +bool primary = false; + + ap =alloc_apertures (1 ); +if (!ap) +return ; + + ap->ranges[0 ].base =pci_resource_start (pdev,0 ); + ap->ranges[0 ].size =pci_resource_len (pdev,0 ); + +#ifdef CONFIG_X86 + primary = pdev->resource[PCI_ROM_RESOURCE ].flags &IORESOURCE_ROM_SHADOW ; +#endif +drm_fb_helper_remove_conflicting_framebuffers (ap,"astdrmfb" , primary); +kfree (ap); +} +static int ast_pci_probe (struct pci_dev *pdev,const struct pci_device_id *ent) { +ast_kick_out_firmware_fb (pdev); +return drm_get_pci_dev (pdev, ent, &driver); }
Greg Kroah-Hartman
maintainerPATCH 35/110 gfs2: Dont leave s_fs_info pointing to freed memory in init_sbd
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Price <[email protected]>
commit 4c62bd9cea7bcf10292f7e4c57a2bca332942697 upstream.
When alloc_percpu() fails, sdp gets freed but sb->s_fs_info still points to the same address. Move the assignment after that error check so that s_fs_info can only point to a valid sdp or NULL, which is checked for later in the error path, in gfs2_kill_super().
--- fs/gfs2/ops_fstype.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/gfs2/ops_fstype.c +1 -1
@@ -72,13 +72,13 @@ static struct gfs2_sbd *init_sbd(structif (!sdp)return NULL ; - sb->s_fs_info = sdp; sdp->sd_vfs = sb; sdp->sd_lkstats = alloc_percpu(struct gfs2_pcpu_lkstats);if (!sdp->sd_lkstats) {kfree (sdp);return NULL ; } + sb->s_fs_info = sdp;set_bit (SDF_NOJOURNALID , &sdp->sd_flags);gfs2_tune_init (&sdp->sd_tune);
Greg Kroah-Hartman
maintainerPATCH 28/110 opp: ti-opp-supply: Correct the supply in _get_optimal_vdd_voltage call
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keerthy <[email protected]>
commit 622fecbccfe86a8052dea6b512d3821dcce29994 upstream.
_get_optimal_vdd_voltage call provides new_supply_vbb->u_volt as the reference voltage while it should be really new_supply_vdd->u_volt.
--- drivers/opp/ti-opp-supply.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/opp/ti-opp-supply.c +1 -1
@@ -288,7 +288,7 @@ static int ti_opp_supply_set_opp(structint ret; vdd_uv =_get_optimal_vdd_voltage (dev, &opp_data, - new_supply_vbb->u_volt); + new_supply_vdd->u_volt);if (new_supply_vdd->u_volt_min < vdd_uv) new_supply_vdd->u_volt_min = vdd_uv;
Greg Kroah-Hartman
maintainerPATCH 5/110 usb: dwc3: gadget: Properly check last unaligned/zero chain TRB
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thinh Nguyen <[email protected]>
commit ba3a51ac32ebcf8d0a54b37f1af268ad8a31c52f upstream.
Current check for the last extra TRB for zero and unaligned transfers does not account for isoc OUT. The last TRB of the Buffer Descriptor for isoc OUT transfers will be retired with HWO=0. As a result, we won't return early. The req->remaining will be updated to include the BUFSIZ count of the extra TRB, and the actual number of transferred bytes calculation will be wrong.
To fix this, check whether it's a short or zero packet and the last TRB chain bit to return early.
--- drivers/usb/dwc3/gadget.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/dwc3/gadget.c +1 -1
@@ -2250,7 +2250,7 @@ static int dwc3_gadget_ep_reclaim_comple* with one TRB pending in the ring. We need to manually clear HWO bit * from that TRB. */ -if ((req->zero || req->unaligned) && (trb->ctrl &DWC3_TRB_CTRL_HWO )) { +if ((req->zero || req->unaligned) && !(trb->ctrl &DWC3_TRB_CTRL_CHN )) { trb->ctrl &= ~DWC3_TRB_CTRL_HWO ;return 1 ; }
Greg Kroah-Hartman
maintainerPATCH 1/110 HID: steam: remove input device when a hid client is running.
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rodrigo Rivas Costa <[email protected]>
commit 385a4886778f6d6e61eff1d4d295af332d7130e1 upstream.
Previously, when a HID client such as the Steam Client was running, this driver disabled its input device to avoid doubling the input events.
While it worked mostly fine, some games got confused by the idle gamepad, and switched to two player mode, or asked the user to choose which gamepad to use. Other games just crashed, probably a bug in Unity [1].
With this commit, when a HID client starts, the input device is removed; when the HID client ends the input device is recreated.
[1]: https://github.com/ValveSoftware/steam-for-linux/issues/5645
--- drivers/hid/hid-steam.c | 154 ++++++++++++++++++++++++++++-------------------- 1 file changed, 90 insertions(+), 64 deletions(-)
drivers/hid/hid-steam.c +90 -64
@@ -23,8 +23,9 @@* In order to avoid breaking them this driver creates a layered hidraw device, * so it can detect when the client is running and then: * - it will not send any command to the controller. -* - this input device will be disabled, to avoid double input of the same +* - this input device will be removed, to avoid double input of the same * user action. +* When the client is closed, this input device will be created again. * * For additional functions, such as changing the right-pad margin or switching * the led, you can use the user-space tool at:
@@ -113,7 +114,7 @@ struct steam_device {spinlock_t lock;struct hid_device *hdev, *client_hdev;struct mutex mutex; -bool client_opened, input_opened; +bool client_opened;struct input_dev __rcu *input;unsigned long quirks;struct work_struct work_connect;
@@ -279,18 +280,6 @@ static void steam_set_lizard_mode(struct } } -static void steam_update_lizard_mode (struct steam_device *steam) -{ -mutex_lock (&steam->mutex); -if (!steam->client_opened) { -if (steam->input_opened) -steam_set_lizard_mode (steam, false); -else -steam_set_lizard_mode (steam, lizard_mode); - } -mutex_unlock (&steam->mutex); -} -static int steam_input_open (struct input_dev *dev) {struct steam_device *steam =input_get_drvdata (dev);
@@ -301,7 +290,6 @@ static int steam_input_open(struct inputreturn ret;mutex_lock (&steam->mutex); - steam->input_opened = true;if (!steam->client_opened && lizard_mode)steam_set_lizard_mode (steam, false);mutex_unlock (&steam->mutex);
@@ -313,7 +301,6 @@ static void steam_input_close(struct inpstruct steam_device *steam =input_get_drvdata (dev);mutex_lock (&steam->mutex); - steam->input_opened = false;if (!steam->client_opened && lizard_mode)steam_set_lizard_mode (steam, true);mutex_unlock (&steam->mutex);
@@ -400,7 +387,7 @@ static int steam_battery_register(structreturn 0 ; } -static int steam_register (struct steam_device *steam) +static int steam_input_register (struct steam_device *steam) {struct hid_device *hdev = steam->hdev;struct input_dev *input;
@@ -414,17 +401,6 @@ static int steam_register(struct steam_dreturn 0 ; } -/* -* Unlikely, but getting the serial could fail, and it is not so -* important, so make up a serial number and go on. -*/ -if (steam_get_serial (steam) <0 ) -strlcpy (steam->serial_no,"XXXXXXXXXX" , -sizeof (steam->serial_no)); - -hid_info (hdev,"Steam Controller '%s' connected" , - steam->serial_no); - input =input_allocate_device ();if (!input)return -ENOMEM ;
@@ -492,11 +468,6 @@ static int steam_register(struct steam_d goto input_register_fail;rcu_assign_pointer (steam->input, input); - -/* ignore battery errors, we can live without it */ -if (steam->quirks &STEAM_QUIRK_WIRELESS ) -steam_battery_register (steam); -return 0 ; input_register_fail:
@@ -504,27 +475,88 @@ input_register_fail:return ret; } -static void steam_unregister (struct steam_device *steam) +static void steam_input_unregister (struct steam_device *steam) {struct input_dev *input; +rcu_read_lock (); + input =rcu_dereference (steam->input); +rcu_read_unlock (); +if (!input) +return ; +RCU_INIT_POINTER (steam->input,NULL ); +synchronize_rcu (); +input_unregister_device (input); +} + +static void steam_battery_unregister (struct steam_device *steam) +{struct power_supply *battery;rcu_read_lock (); - input =rcu_dereference (steam->input); battery =rcu_dereference (steam->battery);rcu_read_unlock (); -if (battery) { -RCU_INIT_POINTER (steam->battery,NULL ); -synchronize_rcu (); -power_supply_unregister (battery); +if (!battery) +return ; +RCU_INIT_POINTER (steam->battery,NULL ); +synchronize_rcu (); +power_supply_unregister (battery); +} + +static int steam_register (struct steam_device *steam) +{ +int ret; + +/* +* This function can be called several times in a row with the +* wireless adaptor, without steam_unregister() between them, because +* another client send a get_connection_status command, for example. +* The battery and serial number are set just once per device. +*/ +if (!steam->serial_no[0 ]) { +/* +* Unlikely, but getting the serial could fail, and it is not so +* important, so make up a serial number and go on. +*/ +if (steam_get_serial (steam) <0 ) +strlcpy (steam->serial_no,"XXXXXXXXXX" , +sizeof (steam->serial_no)); + +hid_info (steam->hdev,"Steam Controller '%s' connected" , + steam->serial_no); + +/* ignore battery errors, we can live without it */ +if (steam->quirks &STEAM_QUIRK_WIRELESS ) +steam_battery_register (steam); + +mutex_lock (&steam_devices_lock); +list_add (&steam->list, &steam_devices); +mutex_unlock (&steam_devices_lock); } -if (input) { -RCU_INIT_POINTER (steam->input,NULL ); -synchronize_rcu (); + +mutex_lock (&steam->mutex); +if (!steam->client_opened) { +steam_set_lizard_mode (steam, lizard_mode); + ret =steam_input_register (steam); + }else { + ret =0 ; + } +mutex_unlock (&steam->mutex); + +return ret; +} + +static void steam_unregister (struct steam_device *steam) +{ +steam_battery_unregister (steam); +steam_input_unregister (steam); +if (steam->serial_no[0 ]) {hid_info (steam->hdev,"Steam Controller '%s' disconnected" , steam->serial_no); -input_unregister_device (input); +mutex_lock (&steam_devices_lock); +list_del (&steam->list); +mutex_unlock (&steam_devices_lock); + steam->serial_no[0 ] =0 ; } }
@@ -600,6 +632,9 @@ static int steam_client_ll_open(struct hmutex_lock (&steam->mutex); steam->client_opened = true;mutex_unlock (&steam->mutex); + +steam_input_unregister (steam); +return ret; }
@@ -609,13 +644,13 @@ static void steam_client_ll_close(structmutex_lock (&steam->mutex); steam->client_opened = false; -if (steam->input_opened) -steam_set_lizard_mode (steam, false); -else -steam_set_lizard_mode (steam, lizard_mode);mutex_unlock (&steam->mutex);hid_hw_close (steam->hdev); +if (steam->connected) { +steam_set_lizard_mode (steam, lizard_mode); +steam_input_register (steam); + } } static int steam_client_ll_raw_request(struct hid_device *hdev,
@@ -744,11 +779,6 @@ static int steam_probe(struct hid_device } } -mutex_lock (&steam_devices_lock); -steam_update_lizard_mode (steam); -list_add (&steam->list, &steam_devices); -mutex_unlock (&steam_devices_lock); -return 0 ; hid_hw_open_fail:
@@ -774,10 +804,6 @@ static void steam_remove(struct hid_devireturn ; } -mutex_lock (&steam_devices_lock); -list_del (&steam->list); -mutex_unlock (&steam_devices_lock); -hid_destroy_device (steam->client_hdev); steam->client_opened = false;cancel_work_sync (&steam->work_connect);
@@ -792,12 +818,14 @@ static void steam_remove(struct hid_devistatic void steam_do_connect_event (struct steam_device *steam,bool connected) {unsigned long flags; +bool changed;spin_lock_irqsave (&steam->lock, flags); + changed = steam->connected != connected; steam->connected = connected;spin_unlock_irqrestore (&steam->lock, flags); -if (schedule_work (&steam->work_connect) ==0 ) +if (changed &&schedule_work (&steam->work_connect) ==0 )dbg_hid ("%s: connected=%d event already queued\n" , __func__, connected); }
@@ -1019,13 +1047,8 @@ static int steam_raw_event(struct hid_dereturn 0 ;rcu_read_lock (); input =rcu_dereference (steam->input); -if (likely (input)) { +if (likely (input))steam_do_input_event (steam, input, data); - }else { -dbg_hid ("%s: input data without connect event\n" , - __func__); -steam_do_connect_event (steam, true); - }rcu_read_unlock ();break ;case STEAM_EV_CONNECT :
@@ -1074,7 +1097,10 @@ static int steam_param_set_lizard_mode(cmutex_lock (&steam_devices_lock);list_for_each_entry (steam, &steam_devices, list) { -steam_update_lizard_mode (steam); +mutex_lock (&steam->mutex); +if (!steam->client_opened) +steam_set_lizard_mode (steam, lizard_mode); +mutex_unlock (&steam->mutex); }mutex_unlock (&steam_devices_lock);return 0 ;
Re: [PATCH 4.19 033/110] bfs: add sanity check at bfs_fill_super()
In reply to Greg Kroah-HartmanHello,
Yes, of course I object to it. I ignored this version of the patch being applied to the older Linux versions, but for the latest versions surely the version that I have authored should be applied instead. I have sent to Andrew Morton both the 4.20-rc1 and 4.19.2 versions of the patch. The 4.20 was applied (as "linux-next", I don't know why it is not in 4.20-rc4 yet), but 4.19.2 version was not applied yet, so here it is attached again (with the proper changelog etc). It applies to 4.19.5 cleanly as well, so please use this version (attached).
Kind regards,
Tigran
Quoted 49 lines · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit
9f2df09a33aa2c76ce6385d382693f98d7f2f07eupstream.syzbot is reporting too large memory allocation at
bfs_fill_super()[1]. Since file system image is corrupted such thatbfs_sb->s_start== 0,bfs_fill_super()is trying to allocate 8MB of continuous memory. Fix this by adding a sanity check onbfs_sb->s_start,__GFP_NOWARNandprintf().[1] https://syzkaller.appspot.com/bug?id=16a87c236b951351374a84c8a32f40edbc034e96
Link http://lkml.kernel.org/r/1525862104-3407-1-git-send-email-penguin-kernel@I-love.SAKURA.ne.jp open hereSigned-off-by Tetsuo Handa <[email protected]>Reported-by syzbot <[email protected]>Reviewed-by Andrew Morton <[email protected]>Cc Tigran Aivazian <[email protected]>Cc Matthew Wilcox <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Linus Torvalds <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- fs/bfs/inode.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)fs/bfs/inode.c +2
-1@@ -350,7 +350,8 @@ static int bfs_fill_super(struct super_b s->s_magic =BFS_MAGIC ; -if (le32_to_cpu (bfs_sb->s_start) >le32_to_cpu (bfs_sb->s_end)) { +if (le32_to_cpu (bfs_sb->s_start) >le32_to_cpu (bfs_sb->s_end) || +le32_to_cpu (bfs_sb->s_start) <BFS_BSIZE ) {printf ("Superblock is corrupted\n" ); goto out1; }@@ -359,9 +360,11 @@ static int bfs_fill_super(struct super_bsizeof (struct bfs_inode ) +BFS_ROOT_INO -1 ; imap_len = (info->si_lasti /8 ) +1 ;
fs/bfs/inode.c static int bfs_fill_super(struct super_b · line 370
Quoted 10 lines
fs/bfs/inode.c +4
-2- info->si_imap =kzalloc (imap_len,GFP_KERNEL ); -if (!info->si_imap) + info->si_imap =kzalloc (imap_len,GFP_KERNEL | __GFP_NOWARN); +if (!info->si_imap) { +printf ("Cannot allocate %u bytes\n" , imap_len); goto out1; + }for (i =0 ; i <BFS_ROOT_INO ; i++)set_bit (i, info->si_imap);
From: Tigran Aivazian <[email protected]>
Subject: bfs: extra sanity checking and static inode bitmap
Strengthen validation of BFS superblock against corruption. Make in-core inode bitmap static part of superblock info structure. Print a warning when mounting a BFS filesystem created with "-N 512" option as only 510 files can be created in the root directory. Make the kernel messages more uniform. Update the 'prefix' passed to bfs_dump_imap() to match the current naming of operations. White space and comments cleanup.
---
fs/bfs/bfs.h | 11 ++++++- fs/bfs/dir.c | 4 +- fs/bfs/file.c | 2 - fs/bfs/inode.c | 66 ++++++++++++++++++++------------------------ include/uapi/linux/bfs_fs.h | 2 - 5 files changed, 43 insertions(+), 42 deletions(-)
uapi/linux/bfs_fs.h renamed from uapi/linux/bfs_fs.h.0 +1 -1
@@ -1,7 +1,7 @@/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ /* * include/linux/bfs_fs.h - BFS data structures on disk. -* Copyright (C) 1999 Tigran Aivazian <[email protected]> +* Copyright (C) 1999-2018 Tigran Aivazian <[email protected]> */ #ifndef _LINUX_BFS_FS_H
bfs/bfs.h renamed from bfs/bfs.h.0 +9 -2
@@ -1,13 +1,20 @@/* SPDX-License-Identifier: GPL-2.0 */ /* * fs/bfs/bfs.h -* Copyright (C) 1999 Tigran Aivazian <[email protected]> +* Copyright (C) 1999-2018 Tigran Aivazian <[email protected]> */ #ifndef _FS_BFS_BFS_H#define _FS_BFS_BFS_H#include <linux/bfs_fs.h> +/* In theory BFS supports up to 512 inodes, numbered from 2 (for /) up to 513 inclusive. +In actual fact, attempting to create the 512th inode (i.e. inode No. 513 or file No. 511) +will fail with ENOSPC in bfs_add_entry(): the root directory cannot contain so many entries, counting '..'. +So, mkfs.bfs(8) should really limit its -N option to 511 and not 512. For now, we just print a warning +if a filesystem is mounted with such "impossible to fill up" number of inodes */ +#define BFS_MAX_LASTI 513 +/* * BFS file system in-core superblock info */
@@ -17,7 +24,7 @@unsigned long si_freei;unsigned long si_lf_eblk;unsigned long si_lasti; -unsigned long *si_imap; +DECLARE_BITMAP (si_imap,BFS_MAX_LASTI +1 );struct mutex bfs_lock; };
bfs/dir.c renamed from bfs/dir.c.0 +2 -2
@@ -2,8 +2,8 @@/* * fs/bfs/dir.c * BFS directory operations. -* Copyright (C) 1999,2000 Tigran Aivazian <[email protected]> -* Made endianness-clean by Andrew Stribblehill <[email protected]> 2005 +* Copyright (C) 1999-2018 Tigran Aivazian <[email protected]> +* Made endianness-clean by Andrew Stribblehill <[email protected]> 2005 */ #include <linux/time.h>
bfs/file.c renamed from bfs/file.c.0 +1 -1
@@ -2,7 +2,7 @@/* * fs/bfs/file.c * BFS file operations. -* Copyright (C) 1999,2000 Tigran Aivazian <[email protected]> +* Copyright (C) 1999-2018 Tigran Aivazian <[email protected]> * * Make the file block allocation algorithm understand the size * of the underlying block device.
bfs/inode.c renamed from bfs/inode.c.0 +30 -36
178 lines not on this page · raw message
Greg KH
maintainerRe: [PATCH 4.19 033/110] bfs: add sanity check at bfs_fill_super()
Quoted 10 lines · Tigran Aivazian
Hello,
Yes, of course I object to it. I ignored this version of the patch being applied to the older Linux versions, but for the latest versions surely the version that I have authored should be applied instead. I have sent to Andrew Morton both the 4.20-rc1 and 4.19.2 versions of the patch. The 4.20 was applied (as "linux-next", I don't know why it is not in 4.20-rc4 yet), but 4.19.2 version was not applied yet, so here it is attached again (with the proper changelog etc). It applies to 4.19.5 cleanly as well, so please use this version (attached).
I can not apply a patch to the stable trees that are not in Linus's tree first. So there's nothing I can do here with this.
Until then, I'll take the patch that is already in Linus's tree, which is what I did here, thanks.
greg k-h
Re: [PATCH 4.19 033/110] bfs: add sanity check at bfs_fill_super()
Quoted 4 lines · Greg KH
Quoted 1 line · Tigran Aivazian
Yes, of course I object to it.
I can not apply a patch to the stable trees that are not in Linus's tree first. So there's nothing I can do here with this.
Ok, we can wait until my patch propagates into Linus' tree, but I would have thought it would be a waste of your time to apply a patch which is waiting to be inevitably superseded by a different one. I can see there are 238 PRs at Linus' tree on github and I am very glad that I looked into one of them --- it contained a long comment explaining that I should NOT do what I was just about to do, i.e. make a PR against Linus' tree! :)
And, besides, in the email conversation Linus approved my version of the patch anyway.
Kind regards,
Tigran
Greg KH
maintainerRe: [PATCH 4.19 033/110] bfs: add sanity check at bfs_fill_super()
Quoted 9 lines · Tigran Aivazian
Quoted 4 lines · Greg KH
Quoted 1 line · Tigran Aivazian
Yes, of course I object to it.
I can not apply a patch to the stable trees that are not in Linus's tree first. So there's nothing I can do here with this.
Ok, we can wait until my patch propagates into Linus' tree, but I would have thought it would be a waste of your time to apply a patch which is waiting to be inevitably superseded by a different one.
Your patch has to apply on top of the existing one, so there's not an issue here.
And might as well fix it now, as I can never count on a "future" patch getting merged.
Quoted 5 lines
I can
see there are 238 PRs at Linus' tree on github and I am very glad that I looked into one of them --- it contained a long comment explaining that I should NOT do what I was just about to do, i.e. make a PR against Linus' tree! :)
We do not do kernel development on github :)
thanks,
greg k-h
Re: [PATCH 4.19 033/110] bfs: add sanity check at bfs_fill_super()
Quoted 4 lines · Greg KH
Your patch has to apply on top of the existing one, so there's not an issue here.
And might as well fix it now, as I can never count on a "future" patch getting merged.
It is already fixed, i.e. it applies cleanly against the existing (i.e. 4.19.5) kernel. What I meant is that, there is little or no point in applying a short-lived patch as there is no conceivable reason that it can become a long-lived one.
Whatever else may have changed (all for the better of course) in the past 20 years in Linux kernel development, I presume the basic fundamental fact that no patch is accepted if the relevant maintainer has objections to it is still intact. And I am both the author and the maintainer of the BFS filesystem.
Kind regards,
Tigran
stable-rc/linux-4.19.y boot: 119 boots: 0 failed, 116 passed with 3 offline (v4.19.5-111-gac4af649901b)
stable-rc/linux-4.19.y boot: 119 boots: 0 failed, 116 passed with 3 offline (v4.19.5-111-gac4af649901b)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/branch/linux-4.19.y/kernel/v4.19.5-111-gac4af649901b/
Full Build Summary: https://kernelci.org/build/stable-rc/branch/linux-4.19.y/kernel/v4.19.5-111-gac4af649901b/
Tree: stable-rc
Branch: linux-4.19.y
Git Describe: v4.19.5-111-gac4af649901b
Git Commit: ac4af649901b05aa42f4ed3e153ce0150d67aa03
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 67 unique boards, 24 SoC families, 14 builds out of 202
Offline Platforms:
arm:
multi_v7_defconfig:
stih410-b2120: 1 offline labarm64:
defconfig:
meson-gxl-s905d-p230: 1 offline lab
meson-gxl-s905x-p212: 1 offline lab---
For more info write to <[email protected]>
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.6 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. 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/v4.x/stable-review/patch-4.19.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.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 4.19.6 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.6-rc1.gz
Quoted 8 lines
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
linux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted on the Lenovo IdeaPad 330-15ARR, no dmesg regressions.
P.S. My GCC loving friend Gabe said hi :p
Signature · 2 lines
Harsh Shandilya PRJKT Development LLC
Greg Kroah-Hartman
maintainerQuoted 15 lines · shuah
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.6 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.
Quoted 6 lines
Quoted 4 lines
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
Thanks for testing all of these and letting me know.
greg k-h
Greg Kroah-Hartman
maintainerQuoted 16 lines · Harsh Shandilya
Quoted 15 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.6 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
linux-4.19.y
and the diffstat can be found below.
Quoted 4 lines
Quoted 3 lines
thanks,
greg k-h
Built and booted on the Lenovo IdeaPad 330-15ARR, no dmesg regressions.
Thanks for testing these and letting me know.
Quoted 1 line
P.S. My GCC loving friend Gabe said hi :p
People love gcc? :)
greg k-h
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.6 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. 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/v4.x/stable-review/patch-4.19.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.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.
Summary
------------------------------------------------------------------------
kernel: 4.19.6-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.19.y
git commit: ac4af649901b05aa42f4ed3e153ce0150d67aa03
git describe: v4.19.5-111-gac4af649901b
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.19-oe/build/v4.19.5-111-gac4af649901b
No regressions (compared to build v4.19.5)
No fixes (compared to build v4.19.5)
Ran 20180 total tests in the following environments and test suites.
Environments
--------------
- dragonboard-410c - arm64
- hi6220-hikey - arm64
- i386
- juno-r2 - arm64
- qemu_arm
- qemu_arm64
- qemu_i386
- qemu_x86_64
- x15 - arm
- x86_64
Test Suites
-----------
* boot
* install-android-platform-tools-r2600
* kselftest
* libhugetlbfs
* ltp-cap_bounds-tests
* ltp-containers-tests
* ltp-cve-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-timers-tests
* ltp-hugetlb-tests
* ltp-open-posix-tests
* kselftest-vsyscall-mode-native
* kselftest-vsyscall-mode-none
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Greg Kroah-Hartman
maintainerQuoted 34 lines · Naresh Kamboju
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.6 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. 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/v4.x/stable-review/patch-4.19.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.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.Summary
------------------------------------------------------------------------kernel: 4.19.6-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.19.y
git commit:ac4af649901b05aa42f4ed3e153ce0150d67aa03
git describe: v4.19.5-111-gac4af649901b
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.19-oe/build/v4.19.5-111-gac4af649901b
Quoted 5 lines
No regressions (compared to build v4.19.5)
No fixes (compared to build v4.19.5)
Ran 20180 total tests in the following environments and test suites.
thanks for testing 4 of these and letting me know.
greg k-h
Quoted 28 lines · Greg Kroah-Hartman
Quoted 1 line · Harsh Shandilya
On 29 November 2018 7:41:31 PM IST, Greg Kroah-Hartman
Quoted 2 lines · <[email protected]> wrote:
Quoted 2 lines
This is the start of the stable review cycle for the 4.19.6 release. There are 110 patches in this series, all will be posted as a
response
Quoted 1 line
Quoted 1 line
to this one. If anyone has any issues with these being applied,
please
Quoted 10 lines
Quoted 6 lines
let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.6-rc1.gzQuoted 1 line
or in the git tree and branch at:
Quoted 8 lines
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitQuoted 6 lines
linux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted on the Lenovo IdeaPad 330-15ARR, no dmesg
regressions.
Quoted 7 lines
Thanks for testing these and letting me know.
Quoted 1 line
P.S. My GCC loving friend Gabe said hi :pPeople love gcc? :)
greg k-h
Everybody's got their thing, I'm not one to judge /shrug
Signature · 2 lines
Harsh Shandilya PRJKT Development LLC
Greg Kroah-Hartman
maintainerQuoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.6 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.6-rc1.gz
I have released a -rc2:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.6-rc2.gz
to hopefully resolve some ARM build (and runtime) issues.
thanks,
greg k-h
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.6 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. Anything received after that time might be too late.
For v4.19.5-107-g048192f:
Build results:
total: 159 pass: 159 fail: 0 Qemu test results: total: 337 pass: 337 fail: 0
Details are available at https://kerneltests.org/builders/.
Guenter
Greg Kroah-Hartman
maintainerQuoted 10 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.6 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Dec 1 13:58:54 UTC 2018. Anything received after that time might be too late.
Quoted 8 lines
For v4.19.5-107-g048192f:
Build results:
total: 159 pass: 159 fail: 0 Qemu test results: total: 337 pass: 337 fail: 0Details are available at https://kerneltests.org/builders/.
Thanks for testing all of these and letting me know.
greg k-h
PATCH 1/1 BFS: static inode bitmap and extra sanity checking
In reply to Tigran AivazianHello,
Please find a patch attached which contains the following changes:
1. Simplifies inode bitmap allocation by making it static.
2. Supersedes the changes to BFS that went into 4.19.6 with stronger checking.
3. Other changes are trivial (like whitespace cleanup, warning messages etc).
Fully tested under 4.19.6 kernel.
Kind regards,
Tigran
From: Tigran Aivazian <[email protected]>
Subject: [PATCH 4.19.6] BFS: static inode bitmap and extra sanity checking
Strengthen validation of BFS superblock against corruption. Make in-core inode bitmap static part of superblock info structure. Print a warning when mounting a BFS filesystem created with "-N 512" option as only 510 files can be created in the root directory. Make the kernel messages more uniform. Update the 'prefix' passed to bfs_dump_imap() to match the current naming of operations. White space and comments cleanup.
---
fs/bfs/bfs.h | 11 ++++++- fs/bfs/dir.c | 4 +- fs/bfs/file.c | 2 - fs/bfs/inode.c | 65 ++++++++++++++++++-------------------------- include/uapi/linux/bfs_fs.h | 2 - 5 files changed, 41 insertions(+), 43 deletions(-)
uapi/linux/bfs_fs.h renamed from uapi/linux/bfs_fs.h.0 +1 -1
@@ -1,7 +1,7 @@/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ /* * include/linux/bfs_fs.h - BFS data structures on disk. -* Copyright (C) 1999 Tigran Aivazian <[email protected]> +* Copyright (C) 1999-2018 Tigran Aivazian <[email protected]> */ #ifndef _LINUX_BFS_FS_H
bfs/bfs.h renamed from bfs/bfs.h.0 +9 -2
@@ -1,13 +1,20 @@/* SPDX-License-Identifier: GPL-2.0 */ /* * fs/bfs/bfs.h -* Copyright (C) 1999 Tigran Aivazian <[email protected]> +* Copyright (C) 1999-2018 Tigran Aivazian <[email protected]> */ #ifndef _FS_BFS_BFS_H#define _FS_BFS_BFS_H#include <linux/bfs_fs.h> +/* In theory BFS supports up to 512 inodes, numbered from 2 (for /) up to 513 inclusive. +In actual fact, attempting to create the 512th inode (i.e. inode No. 513 or file No. 511) +will fail with ENOSPC in bfs_add_entry(): the root directory cannot contain so many entries, counting '..'. +So, mkfs.bfs(8) should really limit its -N option to 511 and not 512. For now, we just print a warning +if a filesystem is mounted with such "impossible to fill up" number of inodes */ +#define BFS_MAX_LASTI 513 +/* * BFS file system in-core superblock info */
@@ -17,7 +24,7 @@unsigned long si_freei;unsigned long si_lf_eblk;unsigned long si_lasti; -unsigned long *si_imap; +DECLARE_BITMAP (si_imap,BFS_MAX_LASTI +1 );struct mutex bfs_lock; };
bfs/dir.c renamed from bfs/dir.c.0 +2 -2
@@ -2,8 +2,8 @@/* * fs/bfs/dir.c * BFS directory operations. -* Copyright (C) 1999,2000 Tigran Aivazian <[email protected]> -* Made endianness-clean by Andrew Stribblehill <[email protected]> 2005 +* Copyright (C) 1999-2018 Tigran Aivazian <[email protected]> +* Made endianness-clean by Andrew Stribblehill <[email protected]> 2005 */ #include <linux/time.h>
bfs/file.c renamed from bfs/file.c.0 +1 -1
@@ -2,7 +2,7 @@/* * fs/bfs/file.c * BFS file operations. -* Copyright (C) 1999,2000 Tigran Aivazian <[email protected]> +* Copyright (C) 1999-2018 Tigran Aivazian <[email protected]> * * Make the file block allocation algorithm understand the size * of the underlying block device.
bfs/inode.c renamed from bfs/inode.c.0 +28 -37
176 lines not on this page · raw message
Greg KH
maintainerRe: [PATCH 4.19.6] BFS: static inode bitmap and extra sanity checking
Quoted 30 lines · Tigran Aivazian
Hello,
Please find a patch attached which contains the following changes:
1. Simplifies inode bitmap allocation by making it static.
2. Supersedes the changes to BFS that went into 4.19.6 with stronger checking.
3. Other changes are trivial (like whitespace cleanup, warning messages etc).Fully tested under 4.19.6 kernel.
Kind regards,
TigranFrom: Tigran Aivazian <[email protected]>
Subject: [PATCH 4.19.6] BFS: static inode bitmap and extra sanity checkingStrengthen validation of BFS superblock against corruption. Make in-core inode bitmap static part of superblock info structure. Print a warning when mounting a BFS filesystem created with "-N 512" option as only 510 files can be created in the root directory. Make the kernel messages more uniform. Update the 'prefix' passed to
bfs_dump_imap()to match the current naming of operations. White space and comments cleanup.Signed-off-by Tigran Aivazian <[email protected]>Cc Tetsuo Handa <[email protected]>Cc Andrew Morton <[email protected]>Cc Matthew Wilcox <[email protected]>Cc Linus Torvalds <[email protected]>Cc Greg Kroah-Hartman <[email protected]>
Quoted 8 lines
---
fs/bfs/bfs.h | 11 ++++++- fs/bfs/dir.c | 4 +- fs/bfs/file.c | 2 - fs/bfs/inode.c | 65 ++++++++++++++++++-------------------------- include/uapi/linux/bfs_fs.h | 2 - 5 files changed, 41 insertions(+), 43 deletions(-)
What is the git commit id of this patch in Linus's tree?
thanks,
greg k-h
Sasha Levin
maintainerRe: [PATCH 4.19.6] BFS: static inode bitmap and extra sanity checking
In reply to Tigran AivazianQuoted 9 lines · Tigran Aivazian
Hello,
Please find a patch attached which contains the following changes:
1. Simplifies inode bitmap allocation by making it static.
2. Supersedes the changes to BFS that went into 4.19.6 with stronger checking.
3. Other changes are trivial (like whitespace cleanup, warning messages etc).Fully tested under 4.19.6 kernel.
No part of this patch is upstream yet. We can't take anything that is not in Linus's tree.
It should also not contain anything that isn't strictly a fix, that means no whitespace cleanups and such. Please break it into multiple patches when you send it upstream.
--
Thanks,
Sasha
Re: [PATCH 4.19.6] BFS: static inode bitmap and extra sanity checking
In reply to Greg KHQuoted 1 line · Greg KH
What is the git commit id of this patch in Linus's tree?
In linux-next the commit id is d2e6681167c634cfc3558991b59a6f614a31d226 , but it is not in Linus' tree (i.e. at github.com/torvalds/linux) yet. It went into Andrew Morton's "-mm" tree and then into "linux-next" tree.
I am happy to split it into multiple logical patches and send them to Linus, of course.
Kind regards,
Tigran
Greg KH
maintainerRe: [PATCH 4.19.6] BFS: static inode bitmap and extra sanity checking
Quoted 7 lines · Tigran Aivazian
Quoted 1 line · Greg KH
What is the git commit id of this patch in Linus's tree?
In linux-next the commit id is
d2e6681167c634cfc3558991b59a6f614a31d226, but it is not in Linus' tree (i.e. at github.com/torvalds/linux) yet. It went into Andrew Morton's "-mm" tree and then into "linux-next" tree.
Please take a look at:
https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html
for how to get a patch into the stable tree. The patch needs to be in Linus's tree first, linux-next does not count, sorry.
thanks,
greg k-h
Re: [PATCH 4.19 044/110] drm/i915: Disable LP3 watermarks on all SNB machines
In reply to Greg Kroah-HartmanQuoted 1 line · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
This one apparently introduces some annoying dmesg errors:
[ 3.487895] [drm:intel_print_wm_latency [i915]] *ERROR* Primary WM3 latency not provided [ 3.487926] [drm:intel_print_wm_latency [i915]] *ERROR* Sprite WM3 latency not provided [ 3.487955] [drm:intel_print_wm_latency [i915]] *ERROR* Cursor WM3 latency not provided
To silence those please also backport
commit 274dba1ae8ff ("drm/i915: Downgrade Gen9 Plane WM latency error")
Quoted 133 lines
------------------
From: Ville Syrj�l� <[email protected]>
commit
21556350ade3cb5d7afecc8b3544e56431d21695upstream.I have a Thinkpad X220 Tablet in my hands that is losing vblank interrupts whenever LP3 watermarks are used.
If I nudge the latency value written to the WM3 register just by one in either direction the problem disappears. That to me suggests that the punit will not enter the corrsponding powersave mode (MPLL shutdown IIRC) unless the latency value in the register matches exactly what we read from SSKPD. Ie. it's not really a latency value but rather just a cookie by which the punit can identify the desired power saving state. On HSW/BDW this was changed such that we actually just write the WM level number into those bits, which makes much more sense given the observed behaviour.
We could try to handle this by disallowing LP3 watermarks only when vblank interrupts are enabled but we'd first have to prove that only vblank interrupts are affected, which seems unlikely. Also we can't grab the wm mutex from the vblank enable/disable hooks because those are called with various spinlocks held. Thus we'd have to redesigne the watermark locking. So to play it safe and keep the code simple we simply disable LP3 watermarks on all SNB machines.
To do that we simply zero out the latency values for watermark level 3, and we adjust the watermark computation to check for that. The behaviour now matches that of the g4x/vlv/skl wm code in the presence of a zeroed latency value.
v2: s/USHRT_MAX/U32_MAX/ for consistency with the types (Chris)
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101269
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103713Signed-off-by Ville Syrj�l� <[email protected]>(cherry picked from commit 03981c6ebec4fc7056b9b45f847393aeac90d060)Signed-off-by Joonas Lahtinen <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/gpu/drm/i915/intel_pm.c | 41 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-)drivers/gpu/drm/i915/intel_pm.c +40
-1@@ -2492,6 +2492,9 @@ static uint32_t ilk_compute_pri_wm(constuint32_t method1, method2;int cpp; +if (mem_value ==0 ) +return U32_MAX ; +if (!intel_wm_plane_visible (cstate, pstate))return 0 ;@@ -2521,6 +2524,9 @@ static uint32_t ilk_compute_spr_wm(constuint32_t method1, method2;int cpp; +if (mem_value ==0 ) +return U32_MAX ; +if (!intel_wm_plane_visible (cstate, pstate))return 0 ;@@ -2544,6 +2550,9 @@ static uint32_t ilk_compute_cur_wm(const {int cpp; +if (mem_value ==0 ) +return U32_MAX ; +if (!intel_wm_plane_visible (cstate, pstate))return 0 ;@@ -2998,6 +3007,34 @@ static void snb_wm_latency_quirk(structintel_print_wm_latency (dev_priv,"Cursor" , dev_priv->wm.cur_latency); } +static void snb_wm_lp3_irq_quirk (struct drm_i915_private *dev_priv) +{ +/* +* On some SNB machines (Thinkpad X220 Tablet at least) +* LP3 usage can cause vblank interrupts to be lost. +* The DEIIR bit will go high but it looks like the CPU +* never gets interrupted. +* +* It's not clear whether other interrupt source could +* be affected or if this is somehow limited to vblank +* interrupts only. To play it safe we disable LP3 +* watermarks entirely. +*/ +if (dev_priv->wm.pri_latency[3 ] ==0 && + dev_priv->wm.spr_latency[3 ] ==0 && + dev_priv->wm.cur_latency[3 ] ==0 ) +return ; + + dev_priv->wm.pri_latency[3 ] =0 ; + dev_priv->wm.spr_latency[3 ] =0 ; + dev_priv->wm.cur_latency[3 ] =0 ; + +DRM_DEBUG_KMS ("LP3 watermarks disabled due to potential for lost interrupts\n" ); +intel_print_wm_latency (dev_priv,"Primary" , dev_priv->wm.pri_latency); +intel_print_wm_latency (dev_priv,"Sprite" , dev_priv->wm.spr_latency); +intel_print_wm_latency (dev_priv,"Cursor" , dev_priv->wm.cur_latency); +} +static void ilk_setup_wm_latency (struct drm_i915_private *dev_priv) {intel_read_wm_latency (dev_priv, dev_priv->wm.pri_latency);@@ -3014,8 +3051,10 @@ static void ilk_setup_wm_latency(structintel_print_wm_latency (dev_priv,"Sprite" , dev_priv->wm.spr_latency);intel_print_wm_latency (dev_priv,"Cursor" , dev_priv->wm.cur_latency); -if (IS_GEN6 (dev_priv)) +if (IS_GEN6 (dev_priv)) {snb_wm_latency_quirk (dev_priv); +snb_wm_lp3_irq_quirk (dev_priv); + } }static void skl_setup_wm_latency (struct drm_i915_private *dev_priv)
Signature · 2 lines
Ville Syrj�l� Intel
Greg Kroah-Hartman
maintainerRe: [PATCH 4.19 044/110] drm/i915: Disable LP3 watermarks on all SNB machines
Quoted 10 lines · Ville Syrj�l�
Quoted 1 line · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
This one apparently introduces some annoying dmesg errors:
[ 3.487895] [drm:intel_print_wm_latency [i915]] *ERROR* Primary WM3 latency not provided [ 3.487926] [drm:intel_print_wm_latency [i915]] *ERROR* Sprite WM3 latency not provided [ 3.487955] [drm:intel_print_wm_latency [i915]] *ERROR* Cursor WM3 latency not providedTo silence those please also backport
commit274dba1ae8ff("drm/i915: Downgrade Gen9 Plane WM latency error")
That commit id is not in Linus's tree, are you sure it is correct?
thanks,
greg k-h
Re: [PATCH 4.19 044/110] drm/i915: Disable LP3 watermarks on all SNB machines
Quoted 9 lines · Greg Kroah-Hartman
Quoted 8 lines · Ville Syrj�l�
Quoted 1 line · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
This one apparently introduces some annoying dmesg errors:
[ 3.487895] [drm:intel_print_wm_latency [i915]] *ERROR* Primary WM3 latency not provided [ 3.487926] [drm:intel_print_wm_latency [i915]] *ERROR* Sprite WM3 latency not provided [ 3.487955] [drm:intel_print_wm_latency [i915]] *ERROR* Cursor WM3 latency not provided
Quoted 4 lines
Quoted 2 lines
To silence those please also backport
commit274dba1ae8ff("drm/i915: Downgrade Gen9 Plane WM latency error")That commit id is not in Linus's tree, are you sure it is correct?
Sorry. Picked the wrong sha by accident.
86c1c87d0e62 ("drm/i915: Downgrade Gen9 Plane WM latency error")
Signature · 2 lines
Ville Syrj�l� Intel
Re: [PATCH 4.19 014/110] usb: xhci: Prevent bus suspend if a port connect change or polling state is detected
In reply to Greg Kroah-HartmanGreg Kroah-Hartman
maintainerRe: [PATCH 4.19 044/110] drm/i915: Disable LP3 watermarks on all SNB machines
In reply to Ville SyrjäläQuoted 10 lines · Ville Syrj�l�
Quoted 9 lines · Greg Kroah-Hartman
Quoted 8 lines · Ville Syrj�l�
Quoted 1 line · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
This one apparently introduces some annoying dmesg errors:
[ 3.487895] [drm:intel_print_wm_latency [i915]] *ERROR* Primary WM3 latency not provided [ 3.487926] [drm:intel_print_wm_latency [i915]] *ERROR* Sprite WM3 latency not provided [ 3.487955] [drm:intel_print_wm_latency [i915]] *ERROR* Cursor WM3 latency not provided
Quoted 8 lines
Quoted 4 lines
Quoted 2 lines
To silence those please also backport
commit274dba1ae8ff("drm/i915: Downgrade Gen9 Plane WM latency error")That commit id is not in Linus's tree, are you sure it is correct?
Sorry. Picked the wrong sha by accident.
86c1c87d0e62("drm/i915: Downgrade Gen9 Plane WM latency error")
Thanks, now queued up for 4.19.y
greg k-h
Re: [PATCH 4.19 014/110] usb: xhci: Prevent bus suspend if a port connect change or polling state is detected
In reply to Greg Kroah-HartmanHello,
Quoted 8 lines · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit
2f31a67f01a8beb22cae754c53522cb61a005750upstream.
[...]
on a current Thinkpad X1 Yoga, this breaks resume from hibernate such that opening the lid has (in the regular use case, see below) no effect any more:
The system is configured to hibernate when the lid is closed. So, the expected behavior, which is restored by reverting this patch, is:
close lid => system hibernates
open lid => system resumes
With this patch, the following two cases are observed:
1)
close lid => system hibernates
open lid => system stays off
press power button => system boots and resumes
2)
# systemctl hibernate => system hibernates close lid
open lid => system resumes
Regards,
Thomas
Greg Kroah-Hartman
maintainerRe: [PATCH 4.19 014/110] usb: xhci: Prevent bus suspend if a port connect change or polling state is detected
Quoted 30 lines · Thomas Zeitlhofer
Hello,
Quoted 8 lines · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit
2f31a67f01a8beb22cae754c53522cb61a005750upstream.[...]
on a current Thinkpad X1 Yoga, this breaks resume from hibernate such that opening the lid has (in the regular use case, see below) no effect any more:
The system is configured to hibernate when the lid is closed. So, the expected behavior, which is restored by reverting this patch, is:
close lid => system hibernates
open lid => system resumesWith this patch, the following two cases are observed:
1)
close lid => system hibernates
open lid => system stays off
press power button => system boots and resumes
Quoted 5 lines
2)
# systemctl hibernate => system hibernates close lid
open lid => system resumes
So this is a problem in Linus's tree? If so, let's work to get this fixed there first.
If not, then we have other issues :)
thanks,
greg k-h
Re: [PATCH 4.19 014/110] usb: xhci: Prevent bus suspend if a port connect change or polling state is detected
Quoted 37 lines · Greg Kroah-Hartman
Quoted 30 lines · Thomas Zeitlhofer
Hello,
Quoted 8 lines · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit
2f31a67f01a8beb22cae754c53522cb61a005750upstream.[...]
on a current Thinkpad X1 Yoga, this breaks resume from hibernate such that opening the lid has (in the regular use case, see below) no effect any more:
The system is configured to hibernate when the lid is closed. So, the expected behavior, which is restored by reverting this patch, is:
close lid => system hibernates
open lid => system resumesWith this patch, the following two cases are observed:
1)
close lid => system hibernates
open lid => system stays off
press power button => system boots and resumesQuoted 5 lines
2)
# systemctl hibernate => system hibernates close lid
open lid => system resumes
Quoted 5 lines
So this is a problem in Linus's tree? If so, let's work to get this fixed there first.
If not, then we have other issues :)
That patch incorrectly reacts to USB2 polling states as well, which could cause issues like this.
Does applying the below code help?
drivers/usb/host/xhci-hub.c +2 -1
@@ -1507,7 +1507,8 @@ int xhci_bus_suspend(struct usb_hcd *hcd) portsc_buf[port_index] =0 ;/* Bail out if a USB3 port has a new device in link training */ -if ((t1 &PORT_PLS_MASK ) ==XDEV_POLLING ) { +if ((hcd->speed >=HCD_USB3 ) && + (t1 &PORT_PLS_MASK ) ==XDEV_POLLING ) { bus_state->bus_suspended =0 ;spin_unlock_irqrestore (&xhci->lock, flags);xhci_dbg (xhci,"Bus suspend bailout, port in polling\n" );
Re: [PATCH 4.19 014/110] usb: xhci: Prevent bus suspend if a port connect change or polling state is detected
Quoted 54 lines · Mathias Nyman
Quoted 37 lines · Greg Kroah-Hartman
Quoted 30 lines · Thomas Zeitlhofer
Hello,
Quoted 8 lines · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit
2f31a67f01a8beb22cae754c53522cb61a005750upstream.[...]
on a current Thinkpad X1 Yoga, this breaks resume from hibernate such that opening the lid has (in the regular use case, see below) no effect any more:
The system is configured to hibernate when the lid is closed. So, the expected behavior, which is restored by reverting this patch, is:
close lid => system hibernates
open lid => system resumesWith this patch, the following two cases are observed:
1)
close lid => system hibernates
open lid => system stays off
press power button => system boots and resumesQuoted 5 lines
2)
# systemctl hibernate => system hibernates close lid
open lid => system resumesQuoted 5 lines
So this is a problem in Linus's tree? If so, let's work to get this fixed there first.
If not, then we have other issues :)
That patch incorrectly reacts to USB2 polling states as well, which could cause issues like this.
Does applying the below code help?
drivers/usb/host/xhci-hub.c +0
-0
drivers/usb/host/xhci-hub.c int xhci_bus_suspend(struct usb_hcd *hcd) · line 1513
Quoted 8 lines
drivers/usb/host/xhci-hub.c +2
-1@@ -1507,7 +1507,8 @@ int xhci_bus_suspend(struct usb_hcd *hcd) portsc_buf[port_index] =0 ;/* Bail out if a USB3 port has a new device in link training */ -if ((t1 &PORT_PLS_MASK ) ==XDEV_POLLING ) { +if ((hcd->speed >=HCD_USB3 ) && + (t1 &PORT_PLS_MASK ) ==XDEV_POLLING ) { bus_state->bus_suspended =0 ;spin_unlock_irqrestore (&xhci->lock, flags);xhci_dbg (xhci,"Bus suspend bailout, port in polling\n" );
Yes, this fixes the problem.
Thanks,
Thomas
Re: [PATCH 4.19 061/110] ACPICA: AML interpreter: add region addresses in global list during initialization
In reply to Greg Kroah-HartmanHi folks,
Quoted 36 lines · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Erik Schmauss <[email protected]>
commit
4abb951b73ff0a8a979113ef185651aa3c8da19bupstream.The table load process omitted adding the operation region address range to the global list. This omission is problematic because the OS queries the global list to check for address range conflicts before deciding which drivers to load. This commit may result in warning messages that look like the following:
[ 7.871761] ACPI Warning: system_IO range 0x00000428-0x0000042F conflicts with op_region 0x00000400-0x0000047F (\PMIO) (20180531/utaddress-213) [ 7.871769] ACPI: If an ACPI driver is available for this device, you should use it instead of the native driverHowever, these messages do not signify regressions. It is a result of properly adding address ranges within the global address list>
Tested-by Jean-Marc Lenoir <[email protected]>Signed-off-by Erik Schmauss <[email protected]>Cc All applicable <[email protected]>Signed-off-by Rafael J. Wysocki <[email protected]>Cc Jean Delvare <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/acpi/acpica/dsopcode.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/acpi/acpica/dsopcode.c acpi_ds_eval_region_operands(struct acpi · line 426
Quoted 10 lines
drivers/acpi/acpica/dsopcode.c +4
-0@@ -417,6 +417,10 @@ acpi_ds_eval_region_operands(struct acpiACPI_FORMAT_UINT64 (obj_desc->region.address), obj_desc->region.length)); + status =acpi_ut_add_address_range (obj_desc->region.space_id, + obj_desc->region.address, + obj_desc->region.length, node); +/* Now the address and length are valid for this opregion */ obj_desc->region.flags |=AOPOBJ_DATA_VALID ;
Fedora has received a couple of reports[0] of boot failures on v4.19 kernels:
kernel: BUG: unable to handle kernel paging request at 00000036000000b6
kernel: PGD 0 P4D 0
kernel: Oops: 0000 [#1] SMP NOPTI
kernel: CPU: 0 PID: 108 Comm: kworker/0:3 Not tainted 4.19.8-300.fc29.x86_64 #1
kernel: Hardware name: Hewlett-Packard HP Compaq 6715b/30C2, BIOS 68YTT Ver. F.07 07/16/2007
kernel: Workqueue: events work_for_cpu_fn
kernel: RIP: 0010:acpi_ns_build_normalized_path+0x76/0x108
kernel: Code: 31 c0 48 85 ff 74 de 31 d2 49 89 f8 31 c0 4c 39 05 ff 5b 57 01 74 61 4c 39 c7 74 0e 39 c2 76 08 41 89 c1 42 c6 04 0e 2e ff c0 <45> 8b 48 0c 41 89 ca 44 89 4c 24 04 45 31 c9 46 8a 5c 0c 07 45 84
kernel: RSP: 0018:ffffb68740a1fce0 EFLAGS: 00010207
kernel: RAX: 000000000000000a RBX: 0000000000000001 RCX: 0000000000000001
kernel: RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff9dd2360e7168
kernel: RBP: 0000000000000000 R08: 00000036000000aa R09: fffffffffffffffc
kernel: R10: 0000000000000000 R11: 00000000000000d2 R12: 0000000000008200
kernel: R13: ffff9dd2360e7168 R14: ffff9dd2706980c0 R15: 0000000000000001
kernel: FS: 0000000000000000(0000) GS:ffff9dd275c00000(0000) knlGS:0000000000000000
kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 kernel: CR2: 00000036000000b6 CR3: 000000007137e000 CR4: 00000000000006f0 kernel: Call Trace: kernel: acpi_ns_get_normalized_pathname+0x1f/0x6d kernel: acpi_ut_check_address_range+0x8f/0x118 kernel: acpi_check_address_range+0x40/0x59 kernel: acpi_check_resource_conflict+0x3a/0x50 kernel: acpi_check_region+0x61/0x80 kernel: piix4_probe+0x144/0x658 [i2c_piix4] kernel: local_pci_probe+0x41/0x90 kernel: work_for_cpu_fn+0x16/0x20 kernel: process_one_work+0x1a1/0x3a0 kernel: worker_thread+0x30/0x380 kernel: ? pwq_unbound_release_workfn+0xd0/0xd0 kernel: kthread+0x112/0x130 kernel: ? kthread_create_worker_on_cpu+0x70/0x70 kernel: ret_from_fork+0x35/0x40 kernel: Modules linked in: i2c_piix4(+) parport_pc wmi tpm_infineon
parport ssb hp_accel lis3lv02d mmc_core input_polldev video radeon i2c_algo_bit drm_kms_helper ttm drm firewire_ohci firewire_core ata_generic serio_raw pata_acpi yenta_socket crc_itu_t pata_atiixp
kernel: CR2: 00000036000000b6
kernel: ---[ end trace 9c88eedaaeca7db0 ]---
I reverted this patch on v4.19.8 and at least one user (Michael, Cc'd) reported that fixed the regression.
This patch appears to have been included in v4.19.2 (commit 22083c028d0b), reverted in v4.19.3 (commit 8ef305fbc50d), and finally included again here in v4.19.6 (commit 87403e35bc56). I couldn't find a discussion about bringing it back, so maybe it happened accidentally?
[0] https://bugzilla.redhat.com/show_bug.cgi?id=1659225
Thanks,
Jeremy
Greg Kroah-Hartman
maintainerRe: [PATCH 4.19 061/110] ACPICA: AML interpreter: add region addresses in global list during initialization
Quoted 96 lines · Jeremy Cline
Hi folks,
Quoted 36 lines · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Erik Schmauss <[email protected]>
commit
4abb951b73ff0a8a979113ef185651aa3c8da19bupstream.The table load process omitted adding the operation region address range to the global list. This omission is problematic because the OS queries the global list to check for address range conflicts before deciding which drivers to load. This commit may result in warning messages that look like the following:
[ 7.871761] ACPI Warning: system_IO range 0x00000428-0x0000042F conflicts with op_region 0x00000400-0x0000047F (\PMIO) (20180531/utaddress-213) [ 7.871769] ACPI: If an ACPI driver is available for this device, you should use it instead of the native driverHowever, these messages do not signify regressions. It is a result of properly adding address ranges within the global address list>
Tested-by Jean-Marc Lenoir <[email protected]>Signed-off-by Erik Schmauss <[email protected]>Cc All applicable <[email protected]>Signed-off-by Rafael J. Wysocki <[email protected]>Cc Jean Delvare <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/acpi/acpica/dsopcode.c | 4 ++++ 1 file changed, 4 insertions(+)drivers/acpi/acpica/dsopcode.c acpi_ds_eval_region_operands(struct acpi · line 426
Quoted 10 lines
drivers/acpi/acpica/dsopcode.c +4
-0@@ -417,6 +417,10 @@ acpi_ds_eval_region_operands(struct acpiACPI_FORMAT_UINT64 (obj_desc->region.address), obj_desc->region.length)); + status =acpi_ut_add_address_range (obj_desc->region.space_id, + obj_desc->region.address, + obj_desc->region.length, node); +/* Now the address and length are valid for this opregion */ obj_desc->region.flags |=AOPOBJ_DATA_VALID ;Fedora has received a couple of reports[0] of boot failures on v4.19 kernels:
kernel: BUG: unable to handle kernel paging request at
00000036000000b6
kernel: PGD 0 P4D 0
kernel: Oops: 0000 [#1] SMP NOPTI
kernel: CPU: 0 PID: 108 Comm: kworker/0:3 Not tainted 4.19.8-300.fc29.x86_64 #1
kernel: Hardware name: Hewlett-Packard HP Compaq 6715b/30C2, BIOS 68YTT Ver. F.07 07/16/2007
kernel: Workqueue: eventswork_for_cpu_fn
kernel: RIP: 0010:acpi_ns_build_normalized_path+0x76/0x108
kernel: Code: 31 c0 48 85 ff 74 de 31 d2 49 89 f8 31 c0 4c 39 05 ff 5b 57 01 74 61 4c 39 c7 74 0e 39 c2 76 08 41 89 c1 42 c6 04 0e 2e ff c0 <45> 8b 48 0c 41 89 ca 44 89 4c 24 04 45 31 c9 46 8a 5c 0c 07 45 84
kernel: RSP: 0018:ffffb68740a1fce0 EFLAGS: 00010207
kernel: RAX:000000000000000aRBX: 0000000000000001 RCX: 0000000000000001
kernel: RDX: 0000000000000000 RSI: 0000000000000000 RDI:ffff9dd2360e7168
kernel: RBP: 0000000000000000 R08:00000036000000aaR09: fffffffffffffffc
kernel: R10: 0000000000000000 R11:00000000000000d2R12: 0000000000008200
kernel: R13:ffff9dd2360e7168R14:ffff9dd2706980c0R15: 0000000000000001
kernel: FS: 0000000000000000(0000) GS:ffff9dd275c00000(0000) knlGS:0000000000000000kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 kernel: CR2: 00000036000000b6 CR3: 000000007137e000 CR4: 00000000000006f0 kernel: Call Trace: kernel: acpi_ns_get_normalized_pathname+0x1f/0x6d kernel: acpi_ut_check_address_range+0x8f/0x118 kernel: acpi_check_address_range+0x40/0x59 kernel: acpi_check_resource_conflict+0x3a/0x50 kernel: acpi_check_region+0x61/0x80 kernel: piix4_probe+0x144/0x658 [i2c_piix4] kernel: local_pci_probe+0x41/0x90 kernel: work_for_cpu_fn+0x16/0x20 kernel: process_one_work+0x1a1/0x3a0 kernel: worker_thread+0x30/0x380 kernel: ? pwq_unbound_release_workfn+0xd0/0xd0 kernel: kthread+0x112/0x130 kernel: ? kthread_create_worker_on_cpu+0x70/0x70 kernel: ret_from_fork+0x35/0x40 kernel: Modules linked in: i2c_piix4(+) parport_pc wmi tpm_infineonparport ssb
hp_accellis3lv02dmmc_coreinput_polldevvideo radeoni2c_algo_bitdrm_kms_helperttm drmfirewire_ohcifirewire_coreata_genericserio_rawpata_acpiyenta_socketcrc_itu_tpata_atiixp
kernel: CR2:00000036000000b6
kernel: ---[ end trace9c88eedaaeca7db0]---
Quoted 7 lines
I reverted this patch on v4.19.8 and at least one user (Michael, Cc'd) reported that fixed the regression.
This patch appears to have been included in v4.19.2 (commit
22083c028d0b), reverted in v4.19.3 (commit8ef305fbc50d), and finally included again here in v4.19.6 (commit87403e35bc56). I couldn't find a discussion about bringing it back, so maybe it happened accidentally?
No it was asked to be brought back, it was not an accident.
I think the acpi developers need to make up their mind :)
thanks,
greg k-h