4.19.252-rc1 review
Greg Kroah-Hartman
maintainercover 4.19.252-rc1 review
This is the start of the stable review cycle for the 4.19.252 release. There are 31 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Jul 2022 09:05:28 +0000. 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.252-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.252-rc1
Miaoqian Lin <[email protected]>
dmaengine: ti: Add missing put_device in ti_dra7_xbar_route_allocate
Miaoqian Lin <[email protected]>
dmaengine: ti: Fix refcount leak in ti_dra7_xbar_route_allocate
Michael Walle <[email protected]>
dmaengine: at_xdma: handle errors of at_xdmac_alloc_desc() correctly
Dmitry Osipenko <[email protected]>
dmaengine: pl330: Fix lockdep warning about non-static key
Linus Torvalds <[email protected]>
ida: don't use BUG_ON() for debugging
Shuah Khan <[email protected]>
misc: rtsx_usb: set return value in rsp_buf alloc err path
Shuah Khan <[email protected]>
misc: rtsx_usb: use separate command and response buffers
Shuah Khan <[email protected]>
misc: rtsx_usb: fix use of dma mapped buffer for usb bulk transfer
Satish Nagireddy <[email protected]>
i2c: cadence: Unregister the clk notifier in error path
Vladimir Oltean <[email protected]>
selftests: forwarding: fix error message in learning_test
Vladimir Oltean <[email protected]>
selftests: forwarding: fix learning_test when h1 supports IFF_UNICAST_FLT
Vladimir Oltean <[email protected]>
selftests: forwarding: fix flood_unicast_test when h2 supports IFF_UNICAST_FLT
Rick Lindsley <[email protected]>
ibmvnic: Properly dispose of all skbs during a failover.
Claudiu Beznea <[email protected]>
ARM: at91: pm: use proper compatible for sama5d2's rtc
Samuel Holland <[email protected]>
pinctrl: sunxi: a83t: Fix NAND function name for some pins
Miaoqian Lin <[email protected]>
ARM: meson: Fix refcount leak in meson_smp_prepare_cpus
Eric Sandeen <[email protected]>
xfs: remove incorrect ASSERT in xfs_rename
Jimmy Assarsson <[email protected]>
can: kvaser_usb: kvaser_usb_leaf: fix bittiming limits
Jimmy Assarsson <[email protected]>
can: kvaser_usb: kvaser_usb_leaf: fix CAN clock frequency regression
Jimmy Assarsson <[email protected]>
can: kvaser_usb: replace run-time checks with struct kvaser_usb_driver_info
Jason A. Donenfeld <[email protected]>
powerpc/powernv: delay rng platform device creation until later in boot
Hsin-Yi Wang <[email protected]>
video: of_display_timing.h: include errno.h
Helge Deller <[email protected]>
fbcon: Disallow setting font bigger than screen size
Yian Chen <[email protected]>
iommu/vt-d: Fix PCI bus rescan device hot add
Duoming Zhou <[email protected]>
net: rose: fix UAF bug caused by rose_t0timer_expiry
Oliver Neukum <[email protected]>
usbnet: fix memory leak in error case
Rhett Aultman <[email protected]>
can: gs_usb: gs_usb_open/close(): fix memory leak
Liang He <[email protected]>
can: grcan: grcan_probe(): remove extra of_node_get()
Oliver Hartkopp <[email protected]>
can: bcm: use call_rcu() instead of costly synchronize_rcu()
Jann Horn <[email protected]>
mm/slub: add missing TID updates on slab deactivation
Sabrina Dubroca <[email protected]>
esp: limit skb_page_frag_refill use to a single page
-------------
Diffstat:
Makefile | 4 +- arch/arm/mach-at91/pm.c | 2 +- arch/arm/mach-meson/platsmp.c | 2 + arch/powerpc/platforms/powernv/rng.c | 16 +- drivers/dma/at_xdmac.c | 5 + drivers/dma/pl330.c | 2 +- drivers/dma/ti/dma-crossbar.c | 5 + drivers/i2c/busses/i2c-cadence.c | 1 + drivers/iommu/dmar.c | 2 +- drivers/misc/cardreader/rtsx_usb.c | 27 ++- drivers/net/can/grcan.c | 1 - drivers/net/can/usb/gs_usb.c | 23 +- drivers/net/can/usb/kvaser_usb/kvaser_usb.h | 25 ++- drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c | 255 ++++++++++++---------- drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c | 4 +- drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | 119 +++++----- drivers/net/ethernet/ibm/ibmvnic.c | 9 + drivers/net/usb/usbnet.c | 17 +- drivers/pinctrl/sunxi/pinctrl-sun8i-a83t.c | 10 +- drivers/video/fbdev/core/fbcon.c | 5 + fs/xfs/xfs_inode.c | 1 - include/linux/rtsx_usb.h | 2 - include/net/esp.h | 2 - include/video/of_display_timing.h | 2 + lib/idr.c | 4 +- mm/slub.c | 4 +- net/can/bcm.c | 18 +- net/ipv4/esp4.c | 5 +- net/ipv6/esp6.c | 5 +- net/rose/rose_route.c | 4 +- tools/testing/selftests/net/forwarding/lib.sh | 6 +- 31 files changed, 357 insertions(+), 230 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/31 esp: limit skb_page_frag_refill use to a single page
From: Sabrina Dubroca <[email protected]>
commit 5bd8baab087dff657e05387aee802e70304cc813 upstream.
Commit ebe48d368e97 ("esp: Fix possible buffer overflow in ESP transformation") tried to fix skb_page_frag_refill usage in ESP by capping allocsize to 32k, but that doesn't completely solve the issue, as skb_page_frag_refill may return a single page. If that happens, we will write out of bounds, despite the check introduced in the previous patch.
This patch forces COW in cases where we would end up calling skb_page_frag_refill with a size larger than a page (first in esp_output_head with tailen, then in esp_output_tail with skb->data_len).
--- include/net/esp.h | 2 -- net/ipv4/esp4.c | 5 ++--- net/ipv6/esp6.c | 5 ++--- 3 files changed, 4 insertions(+), 8 deletions(-)
include/net/esp.h +0 -2
@@ -4,8 +4,6 @@#include <linux/skbuff.h> -#define ESP_SKB_FRAG_MAXSIZE (PAGE_SIZE << SKB_FRAG_PAGE_ORDER) -struct ip_esp_hdr ;static inline struct ip_esp_hdr *ip_esp_hdr (const struct sk_buff *skb)
net/ipv4/esp4.c +2 -3
@@ -275,7 +275,6 @@ int esp_output_head(struct xfrm_state *xstruct page *page;struct sk_buff *trailer;int tailen = esp->tailen; -unsigned int allocsz;/* this is non-NULL only with UDP Encapsulation */ if (x->encap) {
@@ -285,8 +284,8 @@ int esp_output_head(struct xfrm_state *xreturn err; } - allocsz =ALIGN (skb->data_len + tailen,L1_CACHE_BYTES ); -if (allocsz >ESP_SKB_FRAG_MAXSIZE ) +if (ALIGN (tailen,L1_CACHE_BYTES ) >PAGE_SIZE || +ALIGN (skb->data_len,L1_CACHE_BYTES ) >PAGE_SIZE ) goto cow;if (!skb_cloned (skb)) {
net/ipv6/esp6.c +2 -3
@@ -241,10 +241,9 @@ int esp6_output_head(struct xfrm_state *struct page *page;struct sk_buff *trailer;int tailen = esp->tailen; -unsigned int allocsz; - allocsz =ALIGN (skb->data_len + tailen,L1_CACHE_BYTES ); -if (allocsz >ESP_SKB_FRAG_MAXSIZE ) +if (ALIGN (tailen,L1_CACHE_BYTES ) >PAGE_SIZE || +ALIGN (skb->data_len,L1_CACHE_BYTES ) >PAGE_SIZE ) goto cow;if (!skb_cloned (skb)) {
Greg Kroah-Hartman
maintainerPATCH 2/31 mm/slub: add missing TID updates on slab deactivation
In reply to Greg Kroah-HartmanFrom: Jann Horn <[email protected]>
commit eeaa345e128515135ccb864c04482180c08e3259 upstream.
The fastpath in slab_alloc_node() assumes that c->slab is stable as long as the TID stays the same. However, two places in __slab_alloc() currently don't update the TID when deactivating the CPU slab.
If multiple operations race the right way, this could lead to an object getting lost; or, in an even more unlikely situation, it could even lead to an object being freed onto the wrong slab's freelist, messing up the inuse counter and eventually causing a page to be freed to the page allocator while it still contains slab objects.
(I haven't actually tested these cases though, this is just based on looking at the code. Writing testcases for this stuff seems like it'd be a pain...)
The race leading to state inconsistency is (all operations on the same CPU and kmem_cache):
- task A: begin do_slab_free():
- read TID
- read pcpu freelist (==NULL)
- check slab == c->slab (true)
- [PREEMPT A->B]
- task B: begin slab_alloc_node():
- fastpath fails (c->freelist is NULL)
- enter __slab_alloc()
- slub_get_cpu_ptr() (disables preemption)
- enter ___slab_alloc()
- take local_lock_irqsave()
- read c->freelist as NULL
- get_freelist() returns NULL
- write c->slab = NULL
- drop local_unlock_irqrestore()
- goto new_slab
- slub_percpu_partial() is NULL
- get_partial() returns NULL
- slub_put_cpu_ptr() (enables preemption)
- [PREEMPT B->A]
- task A: finish do_slab_free():
- this_cpu_cmpxchg_double() succeeds()
- [CORRUPT STATE: c->slab==NULL, c->freelist!=NULL]
Quoted 1 line
From there, the object on
c->freelistwill get lost if task B is allowed to
continue from here: It will proceed to the retry_load_slab label, set c->slab, then jump to load_freelist, which clobbers c->freelist.
But if we instead continue as follows, we get worse corruption:
- task A: run __slab_free() on object from other struct slab:
- CPU_PARTIAL_FREE case (slab was on no list, is now on pcpu partial)
- task A: run slab_alloc_node() with NUMA node constraint:
- fastpath fails (c->slab is NULL)
- call __slab_alloc()
- slub_get_cpu_ptr() (disables preemption)
- enter ___slab_alloc()
- c->slab is NULL: goto new_slab
- slub_percpu_partial() is non-NULL
- set c->slab to slub_percpu_partial(c)
- [CORRUPT STATE: c->slab points to slab-1, c->freelist has objects from slab-2]
- goto redo
- node_match() fails
- goto deactivate_slab
- existing c->freelist is passed into deactivate_slab()
- inuse count of slab-1 is decremented to account for object from slab-2
At this point, the inuse count of slab-1 is 1 lower than it should be. This means that if we free all allocated objects in slab-1 except for one, SLUB will think that slab-1 is completely unused, and may free its page, leading to use-after-free.
--- mm/slub.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
mm/slub.c +2 -2
@@ -2162,6 +2162,7 @@ redo: c->page =NULL ; c->freelist =NULL ; + c->tid =next_tid (c->tid); }/*
@@ -2295,8 +2296,6 @@ static inline void flush_slab(struct kme {stat (s,CPUSLAB_FLUSH );deactivate_slab (s, c->page, c->freelist, c); - - c->tid =next_tid (c->tid); }/*
@@ -2583,6 +2582,7 @@ redo:if (!freelist) { c->page =NULL ; + c->tid =next_tid (c->tid);stat (s,DEACTIVATE_BYPASS ); goto new_slab; }
Greg Kroah-Hartman
maintainerPATCH 3/31 can: bcm: use call_rcu() instead of costly synchronize_rcu()
In reply to Greg Kroah-HartmanFrom: Oliver Hartkopp <[email protected]>
commit f1b4e32aca0811aa011c76e5d6cf2fa19224b386 upstream.
In commit d5f9023fa61e ("can: bcm: delay release of struct bcm_op after synchronize_rcu()") Thadeu Lima de Souza Cascardo introduced two synchronize_rcu() calls in bcm_release() (only once at socket close) and in bcm_delete_rx_op() (called on removal of each single bcm_op).
Unfortunately this slow removal of the bcm_op's affects user space applications like cansniffer where the modification of a filter removes 2048 bcm_op's which blocks the cansniffer application for 40(!) seconds.
In commit 181d4447905d ("can: gw: use call_rcu() instead of costly synchronize_rcu()") Eric Dumazet replaced the synchronize_rcu() calls with several call_rcu()'s to safely remove the data structures after the removal of CAN ID subscriptions with can_rx_unregister() calls.
This patch adopts Erics approach for the can-bcm which should be applicable since the removal of tasklet_kill() in bcm_remove_op() and the introduction of the HRTIMER_MODE_SOFT timer handling in Linux 5.4.
--- net/can/bcm.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
net/can/bcm.c +14 -4
@@ -99,6 +99,7 @@ static inline u64 get_u64(const struct cstruct bcm_op {struct list_head list; +struct rcu_head rcu;int ifindex;canid_t can_id;u32 flags;
@@ -717,10 +718,9 @@ static struct bcm_op *bcm_find_op(structreturn NULL ; } -static void bcm_remove_op (struct bcm_op *op) +static void bcm_free_op_rcu (struct rcu_head *rcu_head) { -hrtimer_cancel (&op->timer); -hrtimer_cancel (&op->thrtimer); + struct bcm_op *op = container_of(rcu_head, struct bcm_op, rcu);if ((op->frames) && (op->frames != &op->sframe))kfree (op->frames);
@@ -731,6 +731,14 @@ static void bcm_remove_op(struct bcm_opkfree (op); } +static void bcm_remove_op (struct bcm_op *op) +{ +hrtimer_cancel (&op->timer); +hrtimer_cancel (&op->thrtimer); + +call_rcu (&op->rcu, bcm_free_op_rcu); +} +static void bcm_rx_unreg (struct net_device *dev,struct bcm_op *op) {if (op->rx_reg_dev == dev) {
@@ -756,6 +764,9 @@ static int bcm_delete_rx_op(struct list_if ((op->can_id == mh->can_id) && (op->ifindex == ifindex) && (op->flags &CAN_FD_FRAME ) == (mh->flags &CAN_FD_FRAME )) { +/* disable automatic timer on frame reception */ + op->flags |=RX_NO_AUTOTIMER ; +/* * Don't care if we're bound or not (due to netdev * problems) can_rx_unregister() is always a save
@@ -784,7 +795,6 @@ static int bcm_delete_rx_op(struct list_ bcm_rx_handler, op);list_del (&op->list); -synchronize_rcu ();bcm_remove_op (op);return 1 ;/* done */ }
Greg Kroah-Hartman
maintainerPATCH 4/31 can: grcan: grcan_probe(): remove extra of_node_get()
In reply to Greg Kroah-HartmanFrom: Liang He <[email protected]>
commit 562fed945ea482833667f85496eeda766d511386 upstream.
In grcan_probe(), of_find_node_by_path() has already increased the refcount. There is no need to call of_node_get() again, so remove it.
--- drivers/net/can/grcan.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/can/grcan.c +0 -1
@@ -1664,7 +1664,6 @@ static int grcan_probe(struct platform_d*/ sysid_parent =of_find_node_by_path ("/ambapp0" );if (sysid_parent) { -of_node_get (sysid_parent); err =of_property_read_u32 (sysid_parent,"systemid" , &sysid);if (!err && ((sysid &GRLIB_VERSION_MASK ) >=GRCAN_TXBUG_SAFE_GRLIB_VERSION ))
Greg Kroah-Hartman
maintainerPATCH 5/31 can: gs_usb: gs_usb_open/close(): fix memory leak
In reply to Greg Kroah-HartmanFrom: Rhett Aultman <[email protected]>
commit 2bda24ef95c0311ab93bda00db40486acf30bd0a upstream.
The gs_usb driver appears to suffer from a malady common to many USB CAN adapter drivers in that it performs usb_alloc_coherent() to allocate a number of USB request blocks (URBs) for RX, and then later relies on usb_kill_anchored_urbs() to free them, but this doesn't actually free them. As a result, this may be leaking DMA memory that's been used by the driver.
This commit is an adaptation of the techniques found in the esd_usb2 driver where a similar design pattern led to a memory leak. It explicitly frees the RX URBs and their DMA memory via a call to usb_free_coherent(). Since the RX URBs were allocated in the gs_can_open(), we remove them in gs_can_close() rather than in the disconnect function as was done in esd_usb2.
For more information, see the 928150fad41b ("can: esd_usb2: fix memory leak").
--- drivers/net/can/usb/gs_usb.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
drivers/net/can/usb/gs_usb.c +21 -2
@@ -192,6 +192,8 @@ struct gs_can {struct usb_anchor tx_submitted;atomic_t active_tx_urbs; +void *rxbuf[GS_MAX_RX_URBS ]; +dma_addr_t rxbuf_dma[GS_MAX_RX_URBS ]; };/* usb interface struct */
@@ -600,6 +602,7 @@ static int gs_can_open(struct net_devicefor (i =0 ; i <GS_MAX_RX_URBS ; i++) {struct urb *urb;u8 *buf; +dma_addr_t buf_dma;/* alloc rx urb */ urb =usb_alloc_urb (0 ,GFP_KERNEL );
@@ -610,7 +613,7 @@ static int gs_can_open(struct net_device buf =usb_alloc_coherent (dev->udev,sizeof (struct gs_host_frame ),GFP_KERNEL , - &urb->transfer_dma); + &buf_dma);if (!buf) {netdev_err (netdev,"No memory left for USB buffer\n" );
@@ -618,6 +621,8 @@ static int gs_can_open(struct net_devicereturn -ENOMEM ; } + urb->transfer_dma = buf_dma; +/* fill, anchor, and submit rx urb */ usb_fill_bulk_urb(urb, dev->udev,
@@ -641,10 +646,17 @@ static int gs_can_open(struct net_device rc);usb_unanchor_urb (urb); +usb_free_coherent (dev->udev, +sizeof (struct gs_host_frame ), + buf, + buf_dma);usb_free_urb (urb);break ; } + dev->rxbuf[i] = buf; + dev->rxbuf_dma[i] = buf_dma; +/* Drop reference, * USB core will take care of freeing it */
@@ -709,13 +721,20 @@ static int gs_can_close(struct net_devicint rc;struct gs_can *dev =netdev_priv (netdev);struct gs_usb *parent = dev->parent; +unsigned int i;netif_stop_queue (netdev);/* Stop polling */ parent->active_channels--; -if (!parent->active_channels) +if (!parent->active_channels) {usb_kill_anchored_urbs (&parent->rx_submitted); +for (i =0 ; i <GS_MAX_RX_URBS ; i++) +usb_free_coherent (dev->udev, +sizeof (struct gs_host_frame ), + dev->rxbuf[i], + dev->rxbuf_dma[i]); + }/* Stop sending URBs */ usb_kill_anchored_urbs (&dev->tx_submitted);
Greg Kroah-Hartman
maintainerPATCH 6/31 usbnet: fix memory leak in error case
In reply to Greg Kroah-HartmanFrom: Oliver Neukum <[email protected]>
commit b55a21b764c1e182014630fa5486d717484ac58f upstream.
usbnet_write_cmd_async() mixed up which buffers
need to be freed in which error case.
v2: add Fixes tag
v3: fix uninitialized buf pointer
--- drivers/net/usb/usbnet.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
drivers/net/usb/usbnet.c +12 -5
@@ -2131,7 +2131,7 @@ static void usbnet_async_cmd_cb(struct uint usbnet_write_cmd_async (struct usbnet *dev,u8 cmd,u8 reqtype,u16 value,u16 index,const void *data,u16 size) { -struct usb_ctrlrequest *req =NULL ; +struct usb_ctrlrequest *req;struct urb *urb;int err = -ENOMEM ;void *buf =NULL ;
@@ -2149,7 +2149,7 @@ int usbnet_write_cmd_async(struct usbnetif (!buf) {netdev_err (dev->net,"Error allocating buffer" " in %s!\n" , __func__); - goto fail_free; + goto fail_free_urb; } }
@@ -2173,14 +2173,21 @@ int usbnet_write_cmd_async(struct usbnetif (err <0 ) {netdev_err (dev->net,"Error submitting the control" " message: status=%d\n" , err); - goto fail_free; + goto fail_free_all; }return 0 ; +fail_free_all: +kfree (req); fail_free_buf:kfree (buf); -fail_free: -kfree (req); +/* +* avoid a double free +* needed because the flag can be set only +* after filling the URB +*/ + urb->transfer_flags =0 ; +fail_free_urb:usb_free_urb (urb); fail:return err;
Greg Kroah-Hartman
maintainerPATCH 7/31 net: rose: fix UAF bug caused by rose_t0timer_expiry
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 148ca04518070910739dfc4eeda765057856403d upstream.
There are UAF bugs caused by rose_t0timer_expiry(). The root cause is that del_timer() could not stop the timer handler that is running and there is no synchronization. One of the race conditions is shown below:
(thread 1) | (thread 2)
| rose_device_event
| rose_rt_device_down
| rose_remove_neigh
rose_t0timer_expiry | rose_stop_t0timer(rose_neigh)
... | del_timer(&neigh->t0timer)
| kfree(rose_neigh) //[1]FREE
neigh->dce_mode //[2]USE |The rose_neigh is deallocated in position [1] and use in position [2].
The crash trace triggered by POC is like below:
BUG: KASAN: use-after-free in expire_timers+0x144/0x320 Write of size 8 at addr ffff888009b19658 by task swapper/0/0 ... Call Trace: <IRQ> dump_stack_lvl+0xbf/0xee print_address_description+0x7b/0x440 print_report+0x101/0x230 ? expire_timers+0x144/0x320 kasan_report+0xed/0x120 ? expire_timers+0x144/0x320 expire_timers+0x144/0x320 __run_timers+0x3ff/0x4d0 run_timer_softirq+0x41/0x80 __do_softirq+0x233/0x544 ...
This patch changes rose_stop_ftimer() and rose_stop_t0timer() in rose_remove_neigh() to del_timer_sync() in order that the timer handler could be finished before the resources such as rose_neigh and so on are deallocated. As a result, the UAF bugs could be mitigated.
--- net/rose/rose_route.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/rose/rose_route.c +2 -2
@@ -230,8 +230,8 @@ static void rose_remove_neigh(struct ros {struct rose_neigh *s; -rose_stop_ftimer (rose_neigh); -rose_stop_t0timer (rose_neigh); +del_timer_sync (&rose_neigh->ftimer); +del_timer_sync (&rose_neigh->t0timer);skb_queue_purge (&rose_neigh->queue);
Greg Kroah-Hartman
maintainerPATCH 8/31 iommu/vt-d: Fix PCI bus rescan device hot add
In reply to Greg Kroah-HartmanFrom: Yian Chen <[email protected]>
commit 316f92a705a4c2bf4712135180d56f3cca09243a upstream.
Notifier calling chain uses priority to determine the execution order of the notifiers or listeners registered to the chain. PCI bus device hot add utilizes the notification mechanism.
The current code sets low priority (INT_MIN) to Intel dmar_pci_bus_notifier and postpones DMAR decoding after adding new device into IOMMU. The result is that struct device pointer cannot be found in DRHD search for the new device's DMAR/IOMMU. Subsequently, the device is put under the "catch-all" IOMMU instead of the correct one. This could cause system hang when device TLB invalidation is sent to the wrong IOMMU. Invalidation timeout error and hard lockup have been observed and data inconsistency/crush may occur as well.
This patch fixes the issue by setting a positive priority(1) for dmar_pci_bus_notifier while the priority of IOMMU bus notifier uses the default value(0), therefore DMAR decoding will be in advance of DRHD search for a new device to find the correct IOMMU.
Following is a 2-step example that triggers the bug by simulating PCI device hot add behavior in Intel Sapphire Rapids server.
echo 1 > /sys/bus/pci/devices/0000:6a:01.0/remove
echo 1 > /sys/bus/pci/rescan
--- drivers/iommu/dmar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iommu/dmar.c +1 -1
@@ -374,7 +374,7 @@ static int dmar_pci_bus_notifier(structstatic struct notifier_block dmar_pci_bus_nb = { .notifier_call = dmar_pci_bus_notifier, - .priority =INT_MIN , + .priority =1 , }; static struct dmar_drhd_unit *
Greg Kroah-Hartman
maintainerPATCH 9/31 fbcon: Disallow setting font bigger than screen size
In reply to Greg Kroah-HartmanFrom: Helge Deller <[email protected]>
commit 65a01e601dbba8b7a51a2677811f70f783766682 upstream.
Prevent that users set a font size which is bigger than the physical screen. It's unlikely this may happen (because screens are usually much larger than the fonts and each font char is limited to 32x32 pixels), but it may happen on smaller screens/LCD displays.
--- drivers/video/fbdev/core/fbcon.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/video/fbdev/core/fbcon.c +5 -0
@@ -2468,6 +2468,11 @@ static int fbcon_set_font(struct vc_dataif (charcount !=256 && charcount !=512 )return -EINVAL ; +/* font bigger than screen resolution ? */ +if (w >FBCON_SWAP (info->var.rotate, info->var.xres, info->var.yres) || + h >FBCON_SWAP (info->var.rotate, info->var.yres, info->var.xres)) +return -EINVAL ; +/* Make sure drawing engine can handle the font */ if (!(info->pixmap.blit_x & (1 << (font->width -1 ))) || !(info->pixmap.blit_y & (1 << (font->height -1 ))))
Greg Kroah-Hartman
maintainerPATCH 10/31 video: of_display_timing.h: include errno.h
In reply to Greg Kroah-HartmanFrom: Hsin-Yi Wang <[email protected]>
commit 3663a2fb325b8782524f3edb0ae32d6faa615109 upstream.
If CONFIG_OF is not enabled, default of_get_display_timing() returns an errno, so include the header.
--- include/video/of_display_timing.h | 2 ++ 1 file changed, 2 insertions(+)
include/video/of_display_timing.h +2 -0
@@ -9,6 +9,8 @@#ifndef __LINUX_OF_DISPLAY_TIMING_H#define __LINUX_OF_DISPLAY_TIMING_H +#include <linux/errno.h> +struct device_node ;struct display_timing ;struct display_timings ;
Greg Kroah-Hartman
maintainerPATCH 11/31 powerpc/powernv: delay rng platform device creation until later in boot
In reply to Greg Kroah-HartmanFrom: Jason A. Donenfeld <[email protected]>
commit 887502826549caa7e4215fd9e628f48f14c0825a upstream.
The platform device for the rng must be created much later in boot. Otherwise it tries to connect to a parent that doesn't yet exist, resulting in this splat:
[ 0.000478] kobject: '(null)' ((____ptrval____)): is not initialized, yet kobject_get() is being called. [ 0.002925] [c000000002a0fb30] [c00000000073b0bc] kobject_get+0x8c/0x100 (unreliable) [ 0.003071] [c000000002a0fba0] [c00000000087e464] device_add+0xf4/0xb00 [ 0.003194] [c000000002a0fc80] [c000000000a7f6e4] of_device_add+0x64/0x80 [ 0.003321] [c000000002a0fcb0] [c000000000a800d0] of_platform_device_create_pdata+0xd0/0x1b0 [ 0.003476] [c000000002a0fd00] [c00000000201fa44] pnv_get_random_long_early+0x240/0x2e4 [ 0.003623] [c000000002a0fe20] [c000000002060c38] random_init+0xc0/0x214
This patch fixes the issue by doing the platform device creation inside of machine_subsys_initcall.
--- arch/powerpc/platforms/powernv/rng.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
arch/powerpc/platforms/powernv/rng.c +10 -6
@@ -180,12 +180,8 @@ static int __init pnv_get_random_long_ea NULL) != pnv_get_random_long_early)return 0 ; -for_each_compatible_node (dn,NULL ,"ibm,power-rng" ) { -if (rng_create (dn)) -continue ; -/* Create devices for hwrng driver */ -of_platform_device_create (dn,NULL ,NULL ); - } +for_each_compatible_node (dn,NULL ,"ibm,power-rng" ) +rng_create (dn);if (!ppc_md.get_random_seed)return 0 ;
@@ -209,10 +205,18 @@ void __init pnv_rng_init(void)static int __init pnv_rng_late_init (void ) { +struct device_node *dn;unsigned long v; +/* In case it wasn't called during init for some other reason. */ if (ppc_md.get_random_seed == pnv_get_random_long_early)pnv_get_random_long_early (&v); + +if (ppc_md.get_random_seed == powernv_get_random_long) { +for_each_compatible_node (dn,NULL ,"ibm,power-rng" ) +of_platform_device_create (dn,NULL ,NULL ); + } +return 0 ; }machine_subsys_initcall (powernv, pnv_rng_late_init);
Greg Kroah-Hartman
maintainerPATCH 12/31 can: kvaser_usb: replace run-time checks with struct kvaser_usb_driver_info
In reply to Greg Kroah-HartmanFrom: Jimmy Assarsson <[email protected]>
commit 49f274c72357d2d74cba70b172cf369768909707 upstream.
Unify and move compile-time known information into new struct kvaser_usb_driver_info, in favor of run-time checks.
All Kvaser USBcanII supports listen-only mode and error counter reporting.
--- drivers/net/can/usb/kvaser_usb/kvaser_usb.h | 22 +- drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c | 244 ++++++++++++----------- drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | 24 +- 3 files changed, 155 insertions(+), 135 deletions(-)
drivers/net/can/usb/kvaser_usb/kvaser_usb.h +12 -10
@@ -35,9 +35,9 @@#define KVASER_USB_RX_BUFFER_SIZE 3072#define KVASER_USB_MAX_NET_DEVICES 5 -/* USB devices features */ -#define KVASER_USB_HAS_SILENT_MODE BIT(0) -#define KVASER_USB_HAS_TXRX_ERRORS BIT(1) +/* Kvaser USB device quirks */ +#define KVASER_USB_QUIRK_HAS_SILENT_MODE BIT(0) +#define KVASER_USB_QUIRK_HAS_TXRX_ERRORS BIT(1)/* Device capabilities */ #define KVASER_USB_CAP_BERR_CAP 0x01
@@ -65,12 +65,7 @@ struct kvaser_usb_dev_card_data_hydra {struct kvaser_usb_dev_card_data {u32 ctrlmode_supported;u32 capabilities; -union { -struct { -enum kvaser_usb_leaf_family family; - } leaf; -struct kvaser_usb_dev_card_data_hydra hydra; - }; +struct kvaser_usb_dev_card_data_hydra hydra; };/* Context for an outstanding, not yet ACKed, transmission */
@@ -84,7 +79,7 @@ struct kvaser_usb {struct usb_device *udev;struct usb_interface *intf;struct kvaser_usb_net_priv *nets[KVASER_USB_MAX_NET_DEVICES ]; -const struct kvaser_usb_dev_ops *ops; +const struct kvaser_usb_driver_info *driver_info;const struct kvaser_usb_dev_cfg *cfg;struct usb_endpoint_descriptor *bulk_in, *bulk_out;
@@ -166,6 +161,12 @@ struct kvaser_usb_dev_ops { int *cmd_len, u16 transid); }; +struct kvaser_usb_driver_info { +u32 quirks; +enum kvaser_usb_leaf_family family; +const struct kvaser_usb_dev_ops *ops; +}; +struct kvaser_usb_dev_cfg {const struct can_clock clock;const unsigned int timestamp_freq;
@@ -185,4 +186,5 @@ int kvaser_usb_send_cmd_async(struct kva int len);int kvaser_usb_can_rx_over_error (struct net_device *netdev); +#endif /* KVASER_USB_H */
drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c +131 -113
409 lines not on this page · raw message
drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c +12 -12
@@ -405,7 +405,7 @@ kvaser_usb_leaf_frame_to_cmd(const strucsizeof (struct kvaser_cmd_tx_can ); cmd->u.tx_can.channel = priv->channel; -switch (dev->card_data.leaf.family) { +switch (dev->driver_info->family) {case KVASER_LEAF : cmd_tx_can_flags = &cmd->u.tx_can.leaf.flags;break ;
@@ -551,7 +551,7 @@ static int kvaser_usb_leaf_get_software_if (err)return err; -switch (dev->card_data.leaf.family) { +switch (dev->driver_info->family) {case KVASER_LEAF :kvaser_usb_leaf_get_software_info_leaf (dev, &cmd.u.leaf.softinfo);break ;
@@ -598,7 +598,7 @@ static int kvaser_usb_leaf_get_card_info dev->nchannels = cmd.u.cardinfo.nchannels;if (dev->nchannels >KVASER_USB_MAX_NET_DEVICES || - (dev->card_data.leaf.family ==KVASER_USBCAN && + (dev->driver_info->family ==KVASER_USBCAN && dev->nchannels >MAX_USBCAN_NET_DEVICES ))return -EINVAL ;
@@ -734,7 +734,7 @@ kvaser_usb_leaf_rx_error_update_can_stat new_state < CAN_STATE_BUS_OFF) priv->can.can_stats.restarts++; -switch (dev->card_data.leaf.family) { +switch (dev->driver_info->family) {case KVASER_LEAF :if (es->leaf.error_factor) { priv->can.can_stats.bus_error++;
@@ -813,7 +813,7 @@ static void kvaser_usb_leaf_rx_error(con } } -switch (dev->card_data.leaf.family) { +switch (dev->driver_info->family) {case KVASER_LEAF :if (es->leaf.error_factor) { cf->can_id |=CAN_ERR_BUSERROR |CAN_ERR_PROT ;
@@ -1005,7 +1005,7 @@ static void kvaser_usb_leaf_rx_can_msg(c stats = &priv->netdev->stats;if ((cmd->u.rx_can_header.flag &MSG_FLAG_ERROR_FRAME ) && - (dev->card_data.leaf.family ==KVASER_LEAF && + (dev->driver_info->family ==KVASER_LEAF && cmd->id ==CMD_LEAF_LOG_MESSAGE )) {kvaser_usb_leaf_leaf_rx_error (dev, cmd);return ;
@@ -1021,7 +1021,7 @@ static void kvaser_usb_leaf_rx_can_msg(creturn ; } -switch (dev->card_data.leaf.family) { +switch (dev->driver_info->family) {case KVASER_LEAF : rx_data = cmd->u.leaf.rx_can.data;break ;
@@ -1036,7 +1036,7 @@ static void kvaser_usb_leaf_rx_can_msg(creturn ; } -if (dev->card_data.leaf.family ==KVASER_LEAF && cmd->id == +if (dev->driver_info->family ==KVASER_LEAF && cmd->id ==CMD_LEAF_LOG_MESSAGE ) { cf->can_id =le32_to_cpu (cmd->u.leaf.log_message.id);if (cf->can_id &KVASER_EXTENDED_FRAME )
@@ -1133,14 +1133,14 @@ static void kvaser_usb_leaf_handle_commabreak ;case CMD_LEAF_LOG_MESSAGE : -if (dev->card_data.leaf.family !=KVASER_LEAF ) +if (dev->driver_info->family !=KVASER_LEAF ) goto warn;kvaser_usb_leaf_rx_can_msg (dev, cmd);break ;case CMD_CHIP_STATE_EVENT :case CMD_CAN_ERROR_EVENT : -if (dev->card_data.leaf.family ==KVASER_LEAF ) +if (dev->driver_info->family ==KVASER_LEAF )kvaser_usb_leaf_leaf_rx_error (dev, cmd);else kvaser_usb_leaf_usbcan_rx_error (dev, cmd);
@@ -1152,12 +1152,12 @@ static void kvaser_usb_leaf_handle_comma/* Ignored commands */ case CMD_USBCAN_CLOCK_OVERFLOW_EVENT : -if (dev->card_data.leaf.family !=KVASER_USBCAN ) +if (dev->driver_info->family !=KVASER_USBCAN ) goto warn;break ;case CMD_FLUSH_QUEUE_REPLY : -if (dev->card_data.leaf.family !=KVASER_LEAF ) +if (dev->driver_info->family !=KVASER_LEAF ) goto warn;break ;
Greg Kroah-Hartman
maintainerPATCH 13/31 can: kvaser_usb: kvaser_usb_leaf: fix CAN clock frequency regression
In reply to Greg Kroah-HartmanFrom: Jimmy Assarsson <[email protected]>
commit e6c80e601053ffdac5709f11ff3ec1e19ed05f7b upstream.
The firmware of M32C based Leaf devices expects bittiming parameters calculated for 16MHz clock. Since we use the actual clock frequency of the device, the device may end up with wrong bittiming parameters, depending on user requested parameters.
This regression affects M32C based Leaf devices with non-16MHz clock.
--- drivers/net/can/usb/kvaser_usb/kvaser_usb.h | 1 drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c | 29 +++++++++++++++-------- drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | 25 ++++++++++++------- 3 files changed, 36 insertions(+), 19 deletions(-)
drivers/net/can/usb/kvaser_usb/kvaser_usb.h +1 -0
@@ -38,6 +38,7 @@/* Kvaser USB device quirks */ #define KVASER_USB_QUIRK_HAS_SILENT_MODE BIT(0)#define KVASER_USB_QUIRK_HAS_TXRX_ERRORS BIT(1) +#define KVASER_USB_QUIRK_IGNORE_CLK_FREQ BIT(2)/* Device capabilities */ #define KVASER_USB_CAP_BERR_CAP 0x01
drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c +19 -10
@@ -92,26 +92,33 @@ static const struct kvaser_usb_driver_in };static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf = { - .quirks =0 , + .quirks =KVASER_USB_QUIRK_IGNORE_CLK_FREQ , .family =KVASER_LEAF , .ops = &kvaser_usb_leaf_dev_ops, };static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf_err = { - .quirks =KVASER_USB_QUIRK_HAS_TXRX_ERRORS , + .quirks =KVASER_USB_QUIRK_HAS_TXRX_ERRORS | +KVASER_USB_QUIRK_IGNORE_CLK_FREQ , .family =KVASER_LEAF , .ops = &kvaser_usb_leaf_dev_ops, };static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf_err_listen = { .quirks =KVASER_USB_QUIRK_HAS_TXRX_ERRORS | -KVASER_USB_QUIRK_HAS_SILENT_MODE , +KVASER_USB_QUIRK_HAS_SILENT_MODE | +KVASER_USB_QUIRK_IGNORE_CLK_FREQ , .family =KVASER_LEAF , .ops = &kvaser_usb_leaf_dev_ops, }; +static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leafimx = { + .quirks =0 , + .ops = &kvaser_usb_leaf_dev_ops, +}; +static const struct usb_device_id kvaser_usb_table[] = { -/* Leaf USB product IDs */ +/* Leaf M32C USB product IDs */ {USB_DEVICE (KVASER_VENDOR_ID ,USB_LEAF_DEVEL_PRODUCT_ID ), .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf }, {USB_DEVICE (KVASER_VENDOR_ID ,USB_LEAF_LITE_PRODUCT_ID ),
@@ -152,16 +159,18 @@ static const struct usb_device_id kvaser .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err }, { USB_DEVICE(KVASER_VENDOR_ID, USB_CAN_R_PRODUCT_ID), .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err }, + +/* Leaf i.MX28 USB product IDs */ { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID), - .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf }, + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx }, { USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID), - .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf }, + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx }, { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM_PRODUCT_ID), - .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf }, + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx }, { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_2HS_PRODUCT_ID), - .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf }, + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx }, { USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_2HS_PRODUCT_ID), - .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf }, + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },/* USBCANII USB product IDs */ { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN2_PRODUCT_ID),
@@ -190,7 +199,7 @@ static const struct usb_device_id kvaser .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_2HS_V2_PRODUCT_ID), .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, - { USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_2CANLIN_PRODUCT_ID), + { USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_CANLIN_PRODUCT_ID), .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, { USB_DEVICE(KVASER_VENDOR_ID, USB_ATI_USBCAN_PRO_2HS_V2_PRODUCT_ID), .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c +16 -9
@@ -525,16 +525,23 @@ static void kvaser_usb_leaf_get_software dev->fw_version =le32_to_cpu (softinfo->fw_version); dev->max_tx_urbs =le16_to_cpu (softinfo->max_outstanding_tx); -switch (sw_options &KVASER_USB_LEAF_SWOPTION_FREQ_MASK ) { -case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK : +if (dev->driver_info->quirks &KVASER_USB_QUIRK_IGNORE_CLK_FREQ ) { +/* Firmware expects bittiming parameters calculated for 16MHz +* clock, regardless of the actual clock +*/ dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz; -break ; -case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK : - dev->cfg = &kvaser_usb_leaf_dev_cfg_24mhz; -break ; -case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK : - dev->cfg = &kvaser_usb_leaf_dev_cfg_32mhz; -break ; + }else { +switch (sw_options &KVASER_USB_LEAF_SWOPTION_FREQ_MASK ) { +case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK : + dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz; +break ; +case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK : + dev->cfg = &kvaser_usb_leaf_dev_cfg_24mhz; +break ; +case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK : + dev->cfg = &kvaser_usb_leaf_dev_cfg_32mhz; +break ; + } } }
Greg Kroah-Hartman
maintainerPATCH 14/31 can: kvaser_usb: kvaser_usb_leaf: fix bittiming limits
In reply to Greg Kroah-HartmanFrom: Jimmy Assarsson <[email protected]>
commit b3b6df2c56d80b8c6740433cff5f016668b8de70 upstream.
Use correct bittiming limits depending on device. For devices based on USBcanII, Leaf M32C or Leaf i.MX28.
--- drivers/net/can/usb/kvaser_usb/kvaser_usb.h | 2 drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c | 4 - drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | 76 ++++++++++++---------- 3 files changed, 47 insertions(+), 35 deletions(-)
drivers/net/can/usb/kvaser_usb/kvaser_usb.h +2 -0
@@ -188,4 +188,6 @@ int kvaser_usb_send_cmd_async(struct kvaint kvaser_usb_can_rx_over_error (struct net_device *netdev); +extern const struct can_bittiming_const kvaser_usb_flexc_bittiming_const; +#endif /* KVASER_USB_H */
drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c +2 -2
@@ -371,7 +371,7 @@ static const struct can_bittiming_const .brp_inc = 1, }; -static const struct can_bittiming_const kvaser_usb_hydra_flexc_bittiming_c = { +const struct can_bittiming_const kvaser_usb_flexc_bittiming_const = { .name ="kvaser_usb_flex" , .tseg1_min =4 , .tseg1_max =16 ,
@@ -2024,5 +2024,5 @@ static const struct kvaser_usb_dev_cfg k .freq = 24000000, }, .timestamp_freq = 1, - .bittiming_const = &kvaser_usb_hydra_flexc_bittiming_c, + .bittiming_const = &kvaser_usb_flexc_bittiming_const, };
drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c +43 -33
131 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 15/31 xfs: remove incorrect ASSERT in xfs_rename
In reply to Greg Kroah-HartmanFrom: Eric Sandeen <[email protected]>
commit e445976537ad139162980bee015b7364e5b64fff upstream.
This ASSERT in xfs_rename is a) incorrect, because (RENAME_WHITEOUT|RENAME_NOREPLACE) is a valid combination, and
b) unnecessary, because actual invalid flag combinations are already handled at the vfs level in do_renameat2() before we get called. So, remove it.
--- fs/xfs/xfs_inode.c | 1 - 1 file changed, 1 deletion(-)
fs/xfs/xfs_inode.c +0 -1
@@ -2899,7 +2899,6 @@ xfs_rename(* appropriately. */ if (flags &RENAME_WHITEOUT ) { -ASSERT (!(flags & (RENAME_NOREPLACE |RENAME_EXCHANGE ))); error =xfs_rename_alloc_whiteout (target_dp, &wip);if (error)return error;
Greg Kroah-Hartman
maintainerPATCH 16/31 ARM: meson: Fix refcount leak in meson_smp_prepare_cpus
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 34d2cd3fccced12b958b8848e3eff0ee4296764c ]
of_find_compatible_node() returns a node pointer with refcount incremented, we should use of_node_put() on it when done. Add missing of_node_put() to avoid refcount leak.
--- arch/arm/mach-meson/platsmp.c | 2 ++ 1 file changed, 2 insertions(+)
arch/arm/mach-meson/platsmp.c +2 -0
@@ -81,6 +81,7 @@ static void __init meson_smp_prepare_cpus(const char *scu_compatible, } sram_base =of_iomap (node,0 ); +of_node_put (node);if (!sram_base) {pr_err ("Couldn't map SRAM registers\n" );return ;
@@ -101,6 +102,7 @@ static void __init meson_smp_prepare_cpus(const char *scu_compatible, } scu_base =of_iomap (node,0 ); +of_node_put (node);if (!scu_base) {pr_err ("Couldn't map SCU registers\n" );return ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 17/31 pinctrl: sunxi: a83t: Fix NAND function name for some pins
In reply to Greg Kroah-HartmanFrom: Samuel Holland <[email protected]>
[ Upstream commit aaefa29270d9551b604165a08406543efa9d16f5 ]
The other NAND pins on Port C use the "nand0" function name. "nand0" also matches all of the other Allwinner SoCs.
--- drivers/pinctrl/sunxi/pinctrl-sun8i-a83t.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/pinctrl/sunxi/pinctrl-sun8i-a83t.c +5 -5
@@ -158,26 +158,26 @@ static const struct sunxi_desc_pin sun8i_a83t_pins[] = {SUNXI_PIN (SUNXI_PINCTRL_PIN (C ,14 ),SUNXI_FUNCTION (0x0 ,"gpio_in" ),SUNXI_FUNCTION (0x1 ,"gpio_out" ), -SUNXI_FUNCTION (0x2 ,"nand" ),/* DQ6 */ +SUNXI_FUNCTION (0x2 ,"nand0" ),/* DQ6 */ SUNXI_FUNCTION (0x3 ,"mmc2" )),/* D6 */ SUNXI_PIN (SUNXI_PINCTRL_PIN (C ,15 ),SUNXI_FUNCTION (0x0 ,"gpio_in" ),SUNXI_FUNCTION (0x1 ,"gpio_out" ), -SUNXI_FUNCTION (0x2 ,"nand" ),/* DQ7 */ +SUNXI_FUNCTION (0x2 ,"nand0" ),/* DQ7 */ SUNXI_FUNCTION (0x3 ,"mmc2" )),/* D7 */ SUNXI_PIN (SUNXI_PINCTRL_PIN (C ,16 ),SUNXI_FUNCTION (0x0 ,"gpio_in" ),SUNXI_FUNCTION (0x1 ,"gpio_out" ), -SUNXI_FUNCTION (0x2 ,"nand" ),/* DQS */ +SUNXI_FUNCTION (0x2 ,"nand0" ),/* DQS */ SUNXI_FUNCTION (0x3 ,"mmc2" )),/* RST */ SUNXI_PIN (SUNXI_PINCTRL_PIN (C ,17 ),SUNXI_FUNCTION (0x0 ,"gpio_in" ),SUNXI_FUNCTION (0x1 ,"gpio_out" ), -SUNXI_FUNCTION (0x2 ,"nand" )),/* CE2 */ +SUNXI_FUNCTION (0x2 ,"nand0" )),/* CE2 */ SUNXI_PIN (SUNXI_PINCTRL_PIN (C ,18 ),SUNXI_FUNCTION (0x0 ,"gpio_in" ),SUNXI_FUNCTION (0x1 ,"gpio_out" ), -SUNXI_FUNCTION (0x2 ,"nand" )),/* CE3 */ +SUNXI_FUNCTION (0x2 ,"nand0" )),/* CE3 */ /* Hole */ SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 2), SUNXI_FUNCTION(0x0, "gpio_in"),
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 18/31 ARM: at91: pm: use proper compatible for sama5d2s rtc
In reply to Greg Kroah-HartmanFrom: Claudiu Beznea <[email protected]>
[ Upstream commit ddc980da8043779119acaca106c6d9b445c9b65b ]
Use proper compatible strings for SAMA5D2's RTC IPs. This is necessary for configuring wakeup sources for ULP1 PM mode.
--- arch/arm/mach-at91/pm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-at91/pm.c +1 -1
@@ -95,7 +95,7 @@ static const struct wakeup_source_info ws_info[] = {static const struct of_device_id sama5d2_ws_ids[] = { { .compatible ="atmel,sama5d2-gem" , .data = &ws_info[0 ] }, - { .compatible ="atmel,at91rm9200-rtc" , .data = &ws_info[1 ] }, + { .compatible ="atmel,sama5d2-rtc" , .data = &ws_info[1 ] }, { .compatible ="atmel,sama5d3-udc" , .data = &ws_info[2 ] }, { .compatible ="atmel,at91rm9200-ohci" , .data = &ws_info[2 ] }, { .compatible ="usb-ohci" , .data = &ws_info[2 ] },
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 19/31 ibmvnic: Properly dispose of all skbs during a failover.
In reply to Greg Kroah-HartmanFrom: Rick Lindsley <[email protected]>
[ Upstream commit 1b18f09d31cfa7148df15a7d5c5e0e86f105f7d1 ]
During a reset, there may have been transmits in flight that are no longer valid and cannot be fulfilled. Resetting and clearing the queues is insufficient; each skb also needs to be explicitly freed so that upper levels are not left waiting for confirmation of a transmit that will never happen. If this happens frequently enough, the apparent backlog will cause TCP to begin "congestion control" unnecessarily, culminating in permanently decreased throughput.
--- drivers/net/ethernet/ibm/ibmvnic.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/ethernet/ibm/ibmvnic.c +9 -0
@@ -4691,6 +4691,15 @@ static int ibmvnic_reset_init(struct ibmvnic_adapter *adapter)release_sub_crqs (adapter,0 ); rc =init_sub_crqs (adapter); }else { +/* no need to reinitialize completely, but we do +* need to clean up transmits that were in flight +* when we processed the reset. Failure to do so +* will confound the upper layer, usually TCP, by +* creating the illusion of transmits that are +* awaiting completion. +*/ +clean_tx_pools (adapter); + rc =reset_sub_crq_queues (adapter); } }else {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 20/31 selftests: forwarding: fix flood_unicast_test when h2 supports IFF_UNICAST_FLT
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit b8e629b05f5d23f9649c901bef09fab8b0c2e4b9 ]
As mentioned in the blamed commit, flood_unicast_test() works by checking the match count on a tc filter placed on the receiving interface.
But the second host interface (host2_if) has no interest in receiving a packet with MAC DA de:ad:be:ef:13:37, so its RX filter drops it even before the ingress tc filter gets to be executed. So we will incorrectly get the message "Packet was not flooded when should", when in fact, the packet was flooded as expected but dropped due to an unrelated reason, at some other layer on the receiving side.
Force h2 to accept this packet by temporarily placing it in promiscuous mode. Alternatively we could either deliver to its MAC address or use tcpdump_start, but this has the fewest complications.
This fixes the "flooding" test from bridge_vlan_aware.sh and bridge_vlan_unaware.sh, which calls flood_test from the lib.
--- tools/testing/selftests/net/forwarding/lib.sh | 2 ++ 1 file changed, 2 insertions(+)
tools/testing/selftests/net/forwarding/lib.sh +2 -0
@@ -885,6 +885,7 @@ flood_test_do() # Add an ACL on `host2_if` which will tell us whether the packet # was flooded to it or not. + ip link set $host2_if promisc on tc qdisc add dev $host2_if ingress tc filter add dev $host2_if ingress protocol ip pref 1 handle 101 \ flower dst_mac $mac action drop
@@ -902,6 +903,7 @@ flood_test_do() tc filter del dev $host2_if ingress protocol ip pref 1 handle 101 flower tc qdisc del dev $host2_if ingress + ip link set $host2_if promisc off return $err }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 21/31 selftests: forwarding: fix learning_test when h1 supports IFF_UNICAST_FLT
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 1a635d3e1c80626237fdae47a5545b6655d8d81c ]
The first host interface has by default no interest in receiving packets MAC DA de:ad:be:ef:13:37, so it might drop them before they hit the tc filter and this might confuse the selftest.
Enable promiscuous mode such that the filter properly counts received packets.
--- tools/testing/selftests/net/forwarding/lib.sh | 2 ++ 1 file changed, 2 insertions(+)
tools/testing/selftests/net/forwarding/lib.sh +2 -0
@@ -819,6 +819,7 @@ learning_test() # FDB entry was installed. bridge link set dev $br_port1 flood off + ip link set $host1_if promisc on tc qdisc add dev $host1_if ingress tc filter add dev $host1_if ingress protocol ip pref 1 handle 101 \ flower dst_mac $mac action drop
@@ -868,6 +869,7 @@ learning_test() tc filter del dev $host1_if ingress protocol ip pref 1 handle 101 flower tc qdisc del dev $host1_if ingress + ip link set $host1_if promisc off bridge link set dev $br_port1 flood on
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 22/31 selftests: forwarding: fix error message in learning_test
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 83844aacab2015da1dba1df0cc61fc4b4c4e8076 ]
When packets are not received, they aren't received on $host1_if, so the message talking about the second host not receiving them is incorrect. Fix it.
--- tools/testing/selftests/net/forwarding/lib.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/forwarding/lib.sh +1 -1
@@ -830,7 +830,7 @@ learning_test() tc -j -s filter show dev $host1_if ingress \ | jq -e ".[] | select(.options.handle == 101) \ | select(.options.actions[0].stats.packets == 1)" &> /dev/null - check_fail $? "Packet reached second host when should not" + check_fail $? "Packet reached first host when should not" $MZ $host1_if -c 1 -p 64 -a $mac -t ip -q sleep 1
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 23/31 i2c: cadence: Unregister the clk notifier in error path
In reply to Greg Kroah-HartmanFrom: Satish Nagireddy <[email protected]>
[ Upstream commit 3501f0c663063513ad604fb1b3f06af637d3396d ]
This patch ensures that the clock notifier is unregistered when driver probe is returning error.
--- drivers/i2c/busses/i2c-cadence.c | 1 + 1 file changed, 1 insertion(+)
drivers/i2c/busses/i2c-cadence.c +1 -0
@@ -990,6 +990,7 @@ static int cdns_i2c_probe(struct platform_device *pdev)return 0 ; err_clk_dis: +clk_notifier_unregister (id->clk, &id->clk_rate_change_nb);clk_disable_unprepare (id->clk);pm_runtime_set_suspended (&pdev->dev);pm_runtime_disable (&pdev->dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 24/31 misc: rtsx_usb: fix use of dma mapped buffer for usb bulk transfer
In reply to Greg Kroah-HartmanFrom: Shuah Khan <[email protected]>
commit eb7f8e28420372787933eec079735c35034bda7d upstream.
rtsx_usb driver allocates coherent dma buffer for urb transfers. This buffer is passed to usb_bulk_msg() and usb core tries to map already mapped buffer running into a dma mapping error.
xhci_hcd 0000:01:00.0: rejecting DMA map of vmalloc memory
WARNING: CPU: 1 PID: 279 at include/linux/dma-mapping.h:326 usb_ hcd_map_urb_for_dma+0x7d6/0x820
...
xhci_map_urb_for_dma+0x291/0x4e0 usb_hcd_submit_urb+0x199/0x12b0 ... usb_submit_urb+0x3b8/0x9e0 usb_start_wait_urb+0xe3/0x2d0 usb_bulk_msg+0x115/0x240 rtsx_usb_transfer_data+0x185/0x1a8 [rtsx_usb] rtsx_usb_send_cmd+0xbb/0x123 [rtsx_usb] rtsx_usb_write_register+0x12c/0x143 [rtsx_usb] rtsx_usb_probe+0x226/0x4b2 [rtsx_usb]
Fix it to use kmalloc() to get DMA-able memory region instead.
--- drivers/misc/cardreader/rtsx_usb.c | 13 +++++++------ include/linux/rtsx_usb.h | 1 - 2 files changed, 7 insertions(+), 7 deletions(-)
drivers/misc/cardreader/rtsx_usb.c +7 -6
@@ -642,8 +642,7 @@ static int rtsx_usb_probe(struct usb_int ucr->pusb_dev = usb_dev; - ucr->iobuf =usb_alloc_coherent (ucr->pusb_dev,IOBUF_SIZE , -GFP_KERNEL , &ucr->iobuf_dma); + ucr->iobuf =kmalloc (IOBUF_SIZE ,GFP_KERNEL );if (!ucr->iobuf)return -ENOMEM ;
@@ -679,8 +678,9 @@ static int rtsx_usb_probe(struct usb_int out_init_fail:usb_set_intfdata (ucr->pusb_intf,NULL ); -usb_free_coherent (ucr->pusb_dev,IOBUF_SIZE , ucr->iobuf, - ucr->iobuf_dma); +kfree (ucr->iobuf); + ucr->iobuf =NULL ; + ucr->cmd_buf = ucr->rsp_buf =NULL ;return ret; }
@@ -693,8 +693,9 @@ static void rtsx_usb_disconnect(struct umfd_remove_devices (&intf->dev);usb_set_intfdata (ucr->pusb_intf,NULL ); -usb_free_coherent (ucr->pusb_dev,IOBUF_SIZE , ucr->iobuf, - ucr->iobuf_dma); +kfree (ucr->iobuf); + ucr->iobuf =NULL ; + ucr->cmd_buf = ucr->rsp_buf =NULL ; }#ifdef CONFIG_PM
include/linux/rtsx_usb.h +0 -1
@@ -66,7 +66,6 @@ struct rtsx_ucr {struct usb_interface *pusb_intf;struct usb_sg_request current_sg;unsigned char *iobuf; -dma_addr_t iobuf_dma;struct timer_list sg_timer;struct mutex dev_mutex;
Greg Kroah-Hartman
maintainerPATCH 25/31 misc: rtsx_usb: use separate command and response buffers
In reply to Greg Kroah-HartmanFrom: Shuah Khan <[email protected]>
commit 3776c78559853fd151be7c41e369fd076fb679d5 upstream.
rtsx_usb uses same buffer for command and response. There could be a potential conflict using the same buffer for both especially if retries and timeouts are involved.
Use separate command and response buffers to avoid conflicts.
--- drivers/misc/cardreader/rtsx_usb.c | 26 +++++++++++++++++--------- include/linux/rtsx_usb.h | 1 - 2 files changed, 17 insertions(+), 10 deletions(-)
drivers/misc/cardreader/rtsx_usb.c +17 -9
@@ -642,15 +642,18 @@ static int rtsx_usb_probe(struct usb_int ucr->pusb_dev = usb_dev; - ucr->iobuf =kmalloc (IOBUF_SIZE ,GFP_KERNEL ); -if (!ucr->iobuf) + ucr->cmd_buf =kmalloc (IOBUF_SIZE ,GFP_KERNEL ); +if (!ucr->cmd_buf)return -ENOMEM ; + ucr->rsp_buf =kmalloc (IOBUF_SIZE ,GFP_KERNEL ); +if (!ucr->rsp_buf) + goto out_free_cmd_buf; +usb_set_intfdata (intf, ucr); ucr->vendor_id = id->idVendor; ucr->product_id = id->idProduct; - ucr->cmd_buf = ucr->rsp_buf = ucr->iobuf;mutex_init (&ucr->dev_mutex);
@@ -678,9 +681,11 @@ static int rtsx_usb_probe(struct usb_int out_init_fail:usb_set_intfdata (ucr->pusb_intf,NULL ); -kfree (ucr->iobuf); - ucr->iobuf =NULL ; - ucr->cmd_buf = ucr->rsp_buf =NULL ; +kfree (ucr->rsp_buf); + ucr->rsp_buf =NULL ; +out_free_cmd_buf: +kfree (ucr->cmd_buf); + ucr->cmd_buf =NULL ;return ret; }
@@ -693,9 +698,12 @@ static void rtsx_usb_disconnect(struct umfd_remove_devices (&intf->dev);usb_set_intfdata (ucr->pusb_intf,NULL ); -kfree (ucr->iobuf); - ucr->iobuf =NULL ; - ucr->cmd_buf = ucr->rsp_buf =NULL ; + +kfree (ucr->cmd_buf); + ucr->cmd_buf =NULL ; + +kfree (ucr->rsp_buf); + ucr->rsp_buf =NULL ; }#ifdef CONFIG_PM
include/linux/rtsx_usb.h +0 -1
@@ -65,7 +65,6 @@ struct rtsx_ucr {struct usb_device *pusb_dev;struct usb_interface *pusb_intf;struct usb_sg_request current_sg; -unsigned char *iobuf;struct timer_list sg_timer;struct mutex dev_mutex;
Greg Kroah-Hartman
maintainerPATCH 26/31 misc: rtsx_usb: set return value in rsp_buf alloc err path
In reply to Greg Kroah-HartmanFrom: Shuah Khan <[email protected]>
commit 2cd37c2e72449a7add6da1183d20a6247d6db111 upstream.
Set return value in rsp_buf alloc error path before going to error handling.
drivers/misc/cardreader/rtsx_usb.c:639:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (!ucr->rsp_buf)
^~~~~~~~~~~~~
drivers/misc/cardreader/rtsx_usb.c:678:9: note: uninitialized use occurs here
return ret;
^~~
drivers/misc/cardreader/rtsx_usb.c:639:2: note: remove the 'if' if its condition is always false
if (!ucr->rsp_buf)
^~~~~~~~~~~~~~~~~~
drivers/misc/cardreader/rtsx_usb.c:622:9: note: initialize the variable 'ret' to silence this warning
int ret;
^
= 0--- drivers/misc/cardreader/rtsx_usb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/misc/cardreader/rtsx_usb.c +3 -1
@@ -647,8 +647,10 @@ static int rtsx_usb_probe(struct usb_intreturn -ENOMEM ; ucr->rsp_buf =kmalloc (IOBUF_SIZE ,GFP_KERNEL ); -if (!ucr->rsp_buf) +if (!ucr->rsp_buf) { + ret = -ENOMEM ; goto out_free_cmd_buf; + }usb_set_intfdata (intf, ucr);
Greg Kroah-Hartman
maintainerPATCH 27/31 ida: dont use BUG_ON() for debugging
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit fc82bbf4dede758007763867d0282353c06d1121 upstream.
This is another old BUG_ON() that just shouldn't exist (see also commita382f8fee42c: "signal handling: don't use BUG_ON() for debugging").
In fact, as Matthew Wilcox points out, this condition shouldn't really even result in a warning, since a negative id allocation result is just a normal allocation failure:
"I wonder if we should even warn here -- sure, the caller is trying to
free something that wasn't allocated, but we don't warn for kfree(NULL)"
and goes on to point out how that current error check is only causing people to unnecessarily do their own index range checking before freeing it.
This was noted by Itay Iellin, because the bluetooth HCI socket cookie code does *not* do that range checking, and ends up just freeing the error case too, triggering the BUG_ON().
The HCI code requires CAP_NET_RAW, and seems to just result in an ugly splat, but there really is no reason to BUG_ON() here, and we have generally striven for allocation models where it's always ok to just do
free(alloc());
even if the allocation were to fail for some random reason (usually obviously that "random" reason being some resource limit).
--- lib/idr.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
lib/idr.c +3 -1
@@ -573,7 +573,9 @@ void ida_free(struct ida *ida, unsigned {unsigned long flags; -BUG_ON ((int )id <0 ); +if ((int )id <0 ) +return ; +xa_lock_irqsave (&ida->ida_rt, flags);ida_remove (ida, id);xa_unlock_irqrestore (&ida->ida_rt, flags);
Greg Kroah-Hartman
maintainerPATCH 28/31 dmaengine: pl330: Fix lockdep warning about non-static key
In reply to Greg Kroah-HartmanFrom: Dmitry Osipenko <[email protected]>
commit b64b3b2f1d81f83519582e1feee87d77f51f5f17 upstream.
The DEFINE_SPINLOCK() macro shouldn't be used for dynamically allocated spinlocks. The lockdep warns about this and disables locking validator. Fix the warning by making lock static.
INFO: trying to register non-static key.
The code is fine but needs lockdep annotation, or maybe you didn't initialize this object before use? turning off the locking correctness validator.
Hardware name: Radxa ROCK Pi 4C (DT) Call trace: dump_backtrace.part.0+0xcc/0xe0 show_stack+0x18/0x6c dump_stack_lvl+0x8c/0xb8 dump_stack+0x18/0x34 register_lock_class+0x4a8/0x4cc __lock_acquire+0x78/0x20cc lock_acquire.part.0+0xe0/0x230 lock_acquire+0x68/0x84 _raw_spin_lock_irqsave+0x84/0xc4 add_desc+0x44/0xc0 pl330_get_desc+0x15c/0x1d0 pl330_prep_dma_cyclic+0x100/0x270 snd_dmaengine_pcm_trigger+0xec/0x1c0 dmaengine_pcm_trigger+0x18/0x24 ...
--- drivers/dma/pl330.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/pl330.c +1 -1
@@ -2568,7 +2568,7 @@ static struct dma_pl330_desc *pl330_get_/* If the DMAC pool is empty, alloc new */ if (!desc) { -DEFINE_SPINLOCK (lock); +static DEFINE_SPINLOCK (lock);LIST_HEAD (pool);if (!add_desc (&pool, &lock,GFP_ATOMIC ,1 ))
Greg Kroah-Hartman
maintainerPATCH 29/31 dmaengine: at_xdma: handle errors of at_xdmac_alloc_desc() correctly
In reply to Greg Kroah-HartmanFrom: Michael Walle <[email protected]>
commit 3770d92bd5237d686e49da7b2fb86f53ee6ed259 upstream.
It seems that it is valid to have less than the requested number of descriptors. But what is not valid and leads to subsequent errors is to have zero descriptors. In that case, abort the probing.
--- drivers/dma/at_xdmac.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/dma/at_xdmac.c +5 -0
@@ -1804,6 +1804,11 @@ static int at_xdmac_alloc_chan_resourcesfor (i =0 ; i < init_nr_desc_per_channel; i++) { desc =at_xdmac_alloc_desc (chan,GFP_ATOMIC );if (!desc) { +if (i ==0 ) { +dev_warn (chan2dev (chan), +"can't allocate any descriptors\n" ); +return -EIO ; + }dev_warn (chan2dev (chan),"only %d descriptors have been allocated\n" , i);break ;
Greg Kroah-Hartman
maintainerPATCH 30/31 dmaengine: ti: Fix refcount leak in ti_dra7_xbar_route_allocate
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
commit c132fe78ad7b4ce8b5d49a501a15c29d08eeb23a upstream.
of_parse_phandle() returns a node pointer with refcount incremented, we should use of_node_put() on it when not needed anymore.
Add missing of_node_put() in to fix this.
--- drivers/dma/ti/dma-crossbar.c | 1 + 1 file changed, 1 insertion(+)
drivers/dma/ti/dma-crossbar.c +1 -0
@@ -274,6 +274,7 @@ static void *ti_dra7_xbar_route_allocatemutex_unlock (&xbar->mutex);dev_err (&pdev->dev,"Run out of free DMA requests\n" );kfree (map); +of_node_put (dma_spec->np);return ERR_PTR (-ENOMEM ); }set_bit (map->xbar_out, xbar->dma_inuse);
Greg Kroah-Hartman
maintainerPATCH 31/31 dmaengine: ti: Add missing put_device in ti_dra7_xbar_route_allocate
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
commit 615a4bfc426e11dba05c2cf343f9ac752fb381d2 upstream.
of_find_device_by_node() takes reference, we should use put_device() to release it when not need anymore.
--- drivers/dma/ti/dma-crossbar.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/dma/ti/dma-crossbar.c +4 -0
@@ -251,6 +251,7 @@ static void *ti_dra7_xbar_route_allocateif (dma_spec->args[0 ] >= xbar->xbar_requests) {dev_err (&pdev->dev,"Invalid XBAR request number: %d\n" , dma_spec->args[0 ]); +put_device (&pdev->dev);return ERR_PTR (-EINVAL ); }
@@ -258,12 +259,14 @@ static void *ti_dra7_xbar_route_allocate dma_spec->np =of_parse_phandle (ofdma->of_node,"dma-masters" ,0 );if (!dma_spec->np) {dev_err (&pdev->dev,"Can't get DMA master\n" ); +put_device (&pdev->dev);return ERR_PTR (-EINVAL ); } map =kzalloc (sizeof (*map),GFP_KERNEL );if (!map) {of_node_put (dma_spec->np); +put_device (&pdev->dev);return ERR_PTR (-ENOMEM ); }
@@ -275,6 +278,7 @@ static void *ti_dra7_xbar_route_allocatedev_err (&pdev->dev,"Run out of free DMA requests\n" );kfree (map);of_node_put (dma_spec->np); +put_device (&pdev->dev);return ERR_PTR (-ENOMEM ); }set_bit (map->xbar_out, xbar->dma_inuse);
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 4.19.252 release. There are 31 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-4.19.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.252 release. There are 31 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Jul 2022 09:05:28 +0000. Anything received after that time might be too late.
Build results:
total: 157 pass: 157 fail: 0 Qemu test results: total: 425 pass: 425 fail: 0
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.252 release. There are 31 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Jul 2022 09:05:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.252-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.252 release. There are 31 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Jul 2022 09:05:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.252-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.
## Build
* kernel: 4.19.252-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-4.19.y
* git commit: 72d6154340a122052ef914485fa4176f1c50464d
* git describe: v4.19.251-32-g72d6154340a1
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-4.19.y/build/v4.19.251-32-g72d6154340a1
## Test Regressions (compared to v4.19.251)
No test regressions found.
## Metric Regressions (compared to v4.19.251)
No metric regressions found.
## Test Fixes (compared to v4.19.251)
No test fixes found.
## Metric Fixes (compared to v4.19.251)
No metric fixes found.
## Test result summary
total: 109848, pass: 97331, fail: 268, skip: 11146, xfail: 1103
## Build Summary
* arc: 10 total, 10 passed, 0 failed
* arm: 291 total, 286 passed, 5 failed
* arm64: 58 total, 57 passed, 1 failed
* i386: 26 total, 23 passed, 3 failed
* mips: 38 total, 38 passed, 0 failed
* parisc: 12 total, 12 passed, 0 failed
* powerpc: 55 total, 54 passed, 1 failed
* s390: 12 total, 12 passed, 0 failed
* sh: 24 total, 24 passed, 0 failed
* sparc: 12 total, 12 passed, 0 failed
* x86_64: 52 total, 51 passed, 1 failed
## Test suites summary
* fwts
* igt-gpu-tools
* kunit
* kvm-unit-tests
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-cap_bounds
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-filecaps
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-fsx
* ltp-hugetlb
* ltp-io
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-open-posix-tests
* ltp-pty
* ltp-sched
* ltp-securebits
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* network-basic-tests
* packetdrill
* rcutorture
* ssuite
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.252 release. There are 31 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Jul 2022 09:05:28 +0000. Anything received after that time might be too late.
Build test (gcc version 11.3.1 20220706):
mips: 63 configs -> no failure
arm: 115 configs -> no failure
arm64: 2 configs -> no failurex86_64: 4 configs -> no failure
alpha allmodconfig -> no failure
powerpc allmodconfig -> no failure
riscv allmodconfig -> no failure
s390 allmodconfig -> no failure
xtensa allmodconfig -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
[1]. https://openqa.qa.codethink.co.uk/tests/1489
--
Regards
Sudip