5.10.248-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainerPATCH 280/451 team: fix check for port enabled in team_queue_override_port_prio_changed()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Pirko <[email protected]>
[ Upstream commit 932ac51d9953eaf77a1252f79b656d4ca86163c6 ]
There has been a syzkaller bug reported recently with the following trace:
list_del corruption, ffff888058bea080->prev is LIST_POISON2 (dead000000000122)
------------[ cut here ]------------ kernel BUG at lib/list_debug.c:59! Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI CPU: 3 UID: 0 PID: 21246 Comm: syz.0.2928 Not tainted syzkaller #0 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 RIP: 0010:__list_del_entry_valid_or_report+0x13e/0x200 lib/list_debug.c:59 Code: 48 c7 c7 e0 71 f0 8b e8 30 08 ef fc 90 0f 0b 48 89 ef e8 a5 02 55 fd 48 89 ea 48 89 de 48 c7 c7 40 72 f0 8b e8 13 08 ef fc 90 <0f> 0b 48 89 ef e8 88 02 55 fd 48 89 ea 48 b8 00 00 00 00 00 fc ff RSP: 0018:ffffc9000d49f370 EFLAGS: 00010286 RAX: 000000000000004e RBX: ffff888058bea080 RCX: ffffc9002817d000 RDX: 0000000000000000 RSI: ffffffff819becc6 RDI: 0000000000000005 RBP: dead000000000122 R08: 0000000000000005 R09: 0000000000000000 R10: 0000000080000000 R11: 0000000000000001 R12: ffff888039e9c230 R13: ffff888058bea088 R14: ffff888058bea080 R15: ffff888055461480 FS: 00007fbbcfe6f6c0(0000) GS:ffff8880d6d0a000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000000110c3afcb0 CR3: 00000000382c7000 CR4: 0000000000352ef0 Call Trace: <TASK> __list_del_entry_valid include/linux/list.h:132 [inline] __list_del_entry include/linux/list.h:223 [inline] list_del_rcu include/linux/rculist.h:178 [inline] __team_queue_override_port_del drivers/net/team/team_core.c:826 [inline] __team_queue_override_port_del drivers/net/team/team_core.c:821 [inline] team_queue_override_port_prio_changed drivers/net/team/team_core.c:883 [inline] team_priority_option_set+0x171/0x2f0 drivers/net/team/team_core.c:1534 team_option_set drivers/net/team/team_core.c:376 [inline] team_nl_options_set_doit+0x8ae/0xe60 drivers/net/team/team_core.c:2653 genl_family_rcv_msg_doit+0x209/0x2f0 net/netlink/genetlink.c:1115 genl_family_rcv_msg net/netlink/genetlink.c:1195 [inline] genl_rcv_msg+0x55c/0x800 net/netlink/genetlink.c:1210 netlink_rcv_skb+0x158/0x420 net/netlink/af_netlink.c:2552 genl_rcv+0x28/0x40 net/netlink/genetlink.c:1219 netlink_unicast_kernel net/netlink/af_netlink.c:1320 [inline] netlink_unicast+0x5aa/0x870 net/netlink/af_netlink.c:1346 netlink_sendmsg+0x8c8/0xdd0 net/netlink/af_netlink.c:1896 sock_sendmsg_nosec net/socket.c:727 [inline] __sock_sendmsg net/socket.c:742 [inline] ____sys_sendmsg+0xa98/0xc70 net/socket.c:2630 ___sys_sendmsg+0x134/0x1d0 net/socket.c:2684 __sys_sendmsg+0x16d/0x220 net/socket.c:2716 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xcd/0xfa0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f
The problem is in this flow:
1) Port is enabled, queue_id != 0, in qom_list
2) Port gets disabled
-> team_port_disable()
-> team_queue_override_port_del()
-> del (removed from list)
3) Port is disabled, queue_id != 0, not in any list
4) Priority changes
-> team_queue_override_port_prio_changed()
-> checks: port disabled && queue_id != 0
-> calls del - hits the BUG as it is removed alreadyTo fix this, change the check in team_queue_override_port_prio_changed() so it returns early if port is not enabled.
--- drivers/net/team/team.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/team/team.c +1 -1
@@ -872,7 +872,7 @@ static void __team_queue_override_enabled_check(struct team *team)static void team_queue_override_port_prio_changed (struct team *team,struct team_port *port) { -if (!port->queue_id ||team_port_enabled (port)) +if (!port->queue_id || !team_port_enabled (port))return ;__team_queue_override_port_del (team, port);__team_queue_override_port_add (team, port);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 281/451 net: usb: rtl8150: fix memory leak on usb_submit_urb() failure
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Deepakkumar Karn <[email protected]>
[ Upstream commit 12cab1191d9890097171156d06bfa8d31f1e39c8 ]
In async_set_registers(), when usb_submit_urb() fails, the allocated
async_req structure and URB are not freed, causing a memory leak.
The completion callback async_set_reg_cb() is responsible for freeing these allocations, but it is only called after the URB is successfully submitted and completes (successfully or with error). If submission fails, the callback never runs and the memory is leaked.
Fix this by freeing both the URB and the request structure in the error path when usb_submit_urb() fails.
--- drivers/net/usb/rtl8150.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/usb/rtl8150.c +2 -0
@@ -211,6 +211,8 @@ static int async_set_registers(rtl8150_t *dev, u16 indx, u16 size, u16 reg)if (res == -ENODEV )netif_device_detach (dev->netdev);dev_err (&dev->udev->dev,"%s failed with %d\n" , __func__, res); +kfree (req); +usb_free_urb (async_urb); }return res; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 282/451 genalloc.h: fix htmldocs warning
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Morton <[email protected]>
[ Upstream commit 5393802c94e0ab1295c04c94c57bcb00222d4674 ]
WARNING: include/linux/genalloc.h:52 function parameter 'start_addr' not described in 'genpool_algo_t'
--- include/linux/genalloc.h | 1 + 1 file changed, 1 insertion(+)
include/linux/genalloc.h +1 -0
@@ -44,6 +44,7 @@ struct gen_pool;* @nr: The number of zeroed bits we're looking for * @data: optional additional data used by the callback * @pool: the pool being allocated from +* @start_addr: start address of memory chunk */ typedef unsigned long (*genpool_algo_t)(unsigned long *map, unsigned long size,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 283/451 firewire: nosy: switch from pci_ to dma_ API
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 01d12a6656f7fa239cddbd713656be83cdbdc9b3 ]
The wrappers in include/linux/pci-dma-compat.h should go away.
The patch has been generated with the coccinelle script below and has been hand modified to replace GFP_ with a correct flag.
It has been compile tested.
When memory is allocated in 'add_card()', GFP_KERNEL can be used because this flag is already used a few lines above and no lock is taken in the between.
While at it, also remove some useless casting.
@@ @@
- PCI_DMA_BIDIRECTIONAL
+ DMA_BIDIRECTIONAL
@@ @@
- PCI_DMA_TODEVICE
+ DMA_TO_DEVICE
@@ @@
- PCI_DMA_FROMDEVICE
+ DMA_FROM_DEVICE
@@ @@
- PCI_DMA_NONE
+ DMA_NONE
@@
expression e1, e2, e3;
@@
- pci_alloc_consistent(e1, e2, e3)
+ dma_alloc_coherent(&e1->dev, e2, e3, GFP_)
@@
expression e1, e2, e3;
@@
- pci_zalloc_consistent(e1, e2, e3)
+ dma_alloc_coherent(&e1->dev, e2, e3, GFP_)
@@
expression e1, e2, e3, e4;
@@
- pci_free_consistent(e1, e2, e3, e4)
+ dma_free_coherent(&e1->dev, e2, e3, e4)
@@
expression e1, e2, e3, e4;
@@
- pci_map_single(e1, e2, e3, e4)
+ dma_map_single(&e1->dev, e2, e3, e4)
@@
expression e1, e2, e3, e4;
@@
- pci_unmap_single(e1, e2, e3, e4)
+ dma_unmap_single(&e1->dev, e2, e3, e4)
@@
expression e1, e2, e3, e4, e5;
@@
- pci_map_page(e1, e2, e3, e4, e5)
+ dma_map_page(&e1->dev, e2, e3, e4, e5)
@@
expression e1, e2, e3, e4;
@@
- pci_unmap_page(e1, e2, e3, e4)
+ dma_unmap_page(&e1->dev, e2, e3, e4)
@@
expression e1, e2, e3, e4;
@@
- pci_map_sg(e1, e2, e3, e4)
+ dma_map_sg(&e1->dev, e2, e3, e4)
@@
expression e1, e2, e3, e4;
@@
- pci_unmap_sg(e1, e2, e3, e4)
+ dma_unmap_sg(&e1->dev, e2, e3, e4)
@@
expression e1, e2, e3, e4;
@@
- pci_dma_sync_single_for_cpu(e1, e2, e3, e4)
+ dma_sync_single_for_cpu(&e1->dev, e2, e3, e4)
@@
expression e1, e2, e3, e4;
@@
- pci_dma_sync_single_for_device(e1, e2, e3, e4)
+ dma_sync_single_for_device(&e1->dev, e2, e3, e4)
@@
expression e1, e2, e3, e4;
@@
- pci_dma_sync_sg_for_cpu(e1, e2, e3, e4)
+ dma_sync_sg_for_cpu(&e1->dev, e2, e3, e4)
@@
expression e1, e2, e3, e4;
@@
- pci_dma_sync_sg_for_device(e1, e2, e3, e4)
+ dma_sync_sg_for_device(&e1->dev, e2, e3, e4)
@@
expression e1, e2;
@@
- pci_dma_mapping_error(e1, e2)
+ dma_mapping_error(&e1->dev, e2)
@@
expression e1, e2;
@@
- pci_set_dma_mask(e1, e2)
+ dma_set_mask(&e1->dev, e2)
@@
expression e1, e2;
@@
- pci_set_consistent_dma_mask(e1, e2)
+ dma_set_coherent_mask(&e1->dev, e2)
Stable-dep-of: c48c0fd0e196 ("firewire: nosy: Fix dma_free_coherent() size")
--- drivers/firewire/nosy.c | 43 +++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 19 deletions(-)
drivers/firewire/nosy.c +24 -19
@@ -513,12 +513,12 @@ remove_card(struct pci_dev *dev)wake_up_interruptible (&client->buffer.wait);spin_unlock_irq (&lynx->client_list_lock); -pci_free_consistent (lynx->pci_device,sizeof (struct pcl ), - lynx->rcv_start_pcl, lynx->rcv_start_pcl_bus); -pci_free_consistent (lynx->pci_device,sizeof (struct pcl ), - lynx->rcv_pcl, lynx->rcv_pcl_bus); -pci_free_consistent (lynx->pci_device,PAGE_SIZE , - lynx->rcv_buffer, lynx->rcv_buffer_bus); +dma_free_coherent (&lynx->pci_device->dev,sizeof (struct pcl ), + lynx->rcv_start_pcl, lynx->rcv_start_pcl_bus); +dma_free_coherent (&lynx->pci_device->dev,sizeof (struct pcl ), + lynx->rcv_pcl, lynx->rcv_pcl_bus); +dma_free_coherent (&lynx->pci_device->dev,PAGE_SIZE , lynx->rcv_buffer, + lynx->rcv_buffer_bus);iounmap (lynx->registers);pci_disable_device (dev);
@@ -534,7 +534,7 @@ add_card(struct pci_dev *dev, const struct pci_device_id *unused)u32 p, end;int ret, i; -if (pci_set_dma_mask (dev,DMA_BIT_MASK (32 ))) { +if (dma_set_mask (&dev->dev,DMA_BIT_MASK (32 ))) {dev_err (&dev->dev,"DMA address limits not supported for PCILynx hardware\n" );return -ENXIO ;
@@ -566,12 +566,16 @@ add_card(struct pci_dev *dev, const struct pci_device_id *unused) goto fail_deallocate_lynx; } - lynx->rcv_start_pcl =pci_alloc_consistent (lynx->pci_device, -sizeof (struct pcl ), &lynx->rcv_start_pcl_bus); - lynx->rcv_pcl =pci_alloc_consistent (lynx->pci_device, -sizeof (struct pcl ), &lynx->rcv_pcl_bus); - lynx->rcv_buffer =pci_alloc_consistent (lynx->pci_device, -RCV_BUFFER_SIZE , &lynx->rcv_buffer_bus); + lynx->rcv_start_pcl =dma_alloc_coherent (&lynx->pci_device->dev, +sizeof (struct pcl ), + &lynx->rcv_start_pcl_bus, +GFP_KERNEL ); + lynx->rcv_pcl =dma_alloc_coherent (&lynx->pci_device->dev, +sizeof (struct pcl ), + &lynx->rcv_pcl_bus,GFP_KERNEL ); + lynx->rcv_buffer =dma_alloc_coherent (&lynx->pci_device->dev, +RCV_BUFFER_SIZE , + &lynx->rcv_buffer_bus,GFP_KERNEL );if (lynx->rcv_start_pcl ==NULL || lynx->rcv_pcl ==NULL || lynx->rcv_buffer ==NULL ) {
@@ -669,14 +673,15 @@ add_card(struct pci_dev *dev, const struct pci_device_id *unused) fail_deallocate_buffers:if (lynx->rcv_start_pcl) -pci_free_consistent (lynx->pci_device,sizeof (struct pcl ), - lynx->rcv_start_pcl, lynx->rcv_start_pcl_bus); +dma_free_coherent (&lynx->pci_device->dev,sizeof (struct pcl ), + lynx->rcv_start_pcl, + lynx->rcv_start_pcl_bus);if (lynx->rcv_pcl) -pci_free_consistent (lynx->pci_device,sizeof (struct pcl ), - lynx->rcv_pcl, lynx->rcv_pcl_bus); +dma_free_coherent (&lynx->pci_device->dev,sizeof (struct pcl ), + lynx->rcv_pcl, lynx->rcv_pcl_bus);if (lynx->rcv_buffer) -pci_free_consistent (lynx->pci_device,PAGE_SIZE , - lynx->rcv_buffer, lynx->rcv_buffer_bus); +dma_free_coherent (&lynx->pci_device->dev,PAGE_SIZE , + lynx->rcv_buffer, lynx->rcv_buffer_bus);iounmap (lynx->registers); fail_deallocate_lynx:
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 284/451 firewire: nosy: Fix dma_free_coherent() size
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit c48c0fd0e19684b6ecdb4108a429e3a4e73f5e21 ]
It looks like the buffer allocated and mapped in add_card() is done with size RCV_BUFFER_SIZE which is 16 KB and 4KB.
--- drivers/firewire/nosy.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/firewire/nosy.c +5 -5
@@ -36,6 +36,8 @@static char driver_name[] =KBUILD_MODNAME ; +#define RCV_BUFFER_SIZE (16 * 1024) +/* this is the physical layout of a PCL, its size is 128 bytes */ struct pcl {__le32 next;
@@ -517,16 +519,14 @@ remove_card(struct pci_dev *dev) lynx->rcv_start_pcl, lynx->rcv_start_pcl_bus);dma_free_coherent (&lynx->pci_device->dev,sizeof (struct pcl ), lynx->rcv_pcl, lynx->rcv_pcl_bus); -dma_free_coherent (&lynx->pci_device->dev,PAGE_SIZE , lynx->rcv_buffer, - lynx->rcv_buffer_bus); +dma_free_coherent (&lynx->pci_device->dev,RCV_BUFFER_SIZE , + lynx->rcv_buffer, lynx->rcv_buffer_bus);iounmap (lynx->registers);pci_disable_device (dev);lynx_put (lynx); } -#define RCV_BUFFER_SIZE (16 * 1024) -static int add_card (struct pci_dev *dev,const struct pci_device_id *unused) {
@@ -680,7 +680,7 @@ add_card(struct pci_dev *dev, const struct pci_device_id *unused)dma_free_coherent (&lynx->pci_device->dev,sizeof (struct pcl ), lynx->rcv_pcl, lynx->rcv_pcl_bus);if (lynx->rcv_buffer) -dma_free_coherent (&lynx->pci_device->dev,PAGE_SIZE , +dma_free_coherent (&lynx->pci_device->dev,RCV_BUFFER_SIZE , lynx->rcv_buffer, lynx->rcv_buffer_bus);iounmap (lynx->registers);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 285/451 net: dsa: b53: skip multicast entries for fdb_dump()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit d42bce414d1c5c0b536758466a1f63ac358e613c ]
port_fdb_dump() is supposed to only add fdb entries, but we iterate over the full ARL table, which also includes multicast entries.
So check if the entry is a multicast entry before passing it on to the callback().
Additionally, the port of those entries is a bitmask, not a port number, so any included entries would have even be for the wrong port.
--- drivers/net/dsa/b53/b53_common.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/dsa/b53/b53_common.c +3 -0
@@ -1761,6 +1761,9 @@ static int b53_fdb_copy(int port, const struct b53_arl_entry *ent,if (!ent->is_valid)return 0 ; +if (is_multicast_ether_addr (ent->mac)) +return 0 ; +if (port != ent->port)return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 286/451 net: bridge: Describe @tunnel_hash member in net_bridge_vlan_group struct
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bagas Sanjaya <[email protected]>
[ Upstream commit f79f9b7ace1713e4b83888c385f5f55519dfb687 ]
Sphinx reports kernel-doc warning:
WARNING: ./net/bridge/br_private.h:267 struct member 'tunnel_hash' not described in 'net_bridge_vlan_group'
Fix it by describing @tunnel_hash member.
--- net/bridge/br_private.h | 1 + 1 file changed, 1 insertion(+)
net/bridge/br_private.h +1 -0
@@ -158,6 +158,7 @@ struct net_bridge_vlan {* struct net_bridge_vlan_group * * @vlan_hash: VLAN entry rhashtable +* @tunnel_hash: Hash table to map from tunnel key ID (e.g. VXLAN VNI) to VLAN * @vlan_list: sorted VLAN entry list * @num_vlans: number of total VLAN entries * @pvid: PVID VLAN id
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 287/451 octeontx2-pf: fix "UBSAN: shift-out-of-bounds error"
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anshumali Gaur <[email protected]>
[ Upstream commit 85f4b0c650d9f9db10bda8d3acfa1af83bf78cf7 ]
This patch ensures that the RX ring size (rx_pending) is not set below the permitted length. This avoids UBSAN shift-out-of-bounds errors when users passes small or zero ring sizes via ethtool -G.
--- drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c +8 -0
@@ -382,6 +382,14 @@ static int otx2_set_ringparam(struct net_device *netdev,*/ if (rx_count < pfvf->hw.rq_skid) rx_count = pfvf->hw.rq_skid; + +if (ring->rx_pending <16 ) { +netdev_err (netdev, +"rx ring size %u invalid, min is 16\n" , + ring->rx_pending); +return -EINVAL ; + } + rx_count =Q_COUNT (Q_SIZE (rx_count,3 ));/* Due pipelining impact minimum 2000 unused SQ CQE's
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 288/451 ipv6: BUG() in pskb_expand_head() as part of calipso_skbuff_setattr()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Rosenberg <[email protected]>
[ Upstream commit 58fc7342b529803d3c221101102fe913df7adb83 ]
There exists a kernel oops caused by a BUG_ON(nhead < 0) at net/core/skbuff.c:2232 in pskb_expand_head().
This bug is triggered as part of the calipso_skbuff_setattr() routine when skb_cow() is passed headroom > INT_MAX (i.e. (int)(skb_headroom(skb) + len_delta) < 0).
The root cause of the bug is due to an implicit integer cast in __skb_cow(). The check (headroom > skb_headroom(skb)) is meant to ensure that delta = headroom - skb_headroom(skb) is never negative, otherwise we will trigger a BUG_ON in pskb_expand_head(). However, if headroom > INT_MAX and delta <= -NET_SKB_PAD, the check passes, delta becomes negative, and pskb_expand_head() is passed a negative value for nhead.
Fix the trigger condition in calipso_skbuff_setattr(). Avoid passing "negative" headroom sizes to skb_cow() within calipso_skbuff_setattr() by only using skb_cow() to grow headroom.
PoC:
Using `netlabelctl` tool:
netlabelctl map del default
netlabelctl calipso add pass doi:7
netlabelctl map add default address:0::1/128 protocol:calipso,7
Then run the following PoC:
int fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
// setup msghdr
int cmsg_size = 2;
int cmsg_len = 0x60;
struct msghdr msg;
struct sockaddr_in6 dest_addr;
struct cmsghdr * cmsg = (struct cmsghdr *) calloc(1,
sizeof(struct cmsghdr) + cmsg_len);
msg.msg_name = &dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_iov = NULL;
msg.msg_iovlen = 0;
msg.msg_control = cmsg;
msg.msg_controllen = cmsg_len;
msg.msg_flags = 0;
// setup sockaddr
dest_addr.sin6_family = AF_INET6;
dest_addr.sin6_port = htons(31337);
dest_addr.sin6_flowinfo = htonl(31337);
dest_addr.sin6_addr = in6addr_loopback;
dest_addr.sin6_scope_id = 31337;
// setup cmsghdr
cmsg->cmsg_len = cmsg_len;
cmsg->cmsg_level = IPPROTO_IPV6;
cmsg->cmsg_type = IPV6_HOPOPTS;
char * hop_hdr = (char *)cmsg + sizeof(struct cmsghdr);
hop_hdr[1] = 0x9; //set hop size - (0x9 + 1) * 8 = 80
sendmsg(fd, &msg, 0);--- net/ipv6/calipso.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv6/calipso.c +2 -1
@@ -1345,7 +1345,8 @@ static int calipso_skbuff_setattr(struct sk_buff *skb,/* At this point new_end aligns to 4n, so (new_end & 4) pads to 8n */ pad = ((new_end &4 ) + (end &7 )) &7 ; len_delta = new_end - (int )end + pad; - ret_val =skb_cow (skb,skb_headroom (skb) + len_delta); + ret_val =skb_cow (skb, +skb_headroom (skb) + (len_delta >0 ? len_delta :0 ));if (ret_val <0 )return ret_val;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 289/451 ipv4: Fix reference count leak when using error routes with nexthop objects
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit ac782f4e3bfcde145b8a7f8af31d9422d94d172a ]
When a nexthop object is deleted, it is marked as dead and then fib_table_flush() is called to flush all the routes that are using the dead nexthop.
The current logic in fib_table_flush() is to only flush error routes (e.g., blackhole) when it is called as part of network namespace dismantle (i.e., with flush_all=true). Therefore, error routes are not flushed when their nexthop object is deleted:
# ip link add name dummy1 up type dummy # ip nexthop add id 1 dev dummy1 # ip route add 198.51.100.1/32 nhid 1 # ip route add blackhole 198.51.100.2/32 nhid 1 # ip nexthop del id 1 # ip route show blackhole 198.51.100.2 nhid 1 dev dummy1
As such, they keep holding a reference on the nexthop object which in turn holds a reference on the nexthop device, resulting in a reference count leak:
# ip link del dev dummy1 [ 70.516258] unregister_netdevice: waiting for dummy1 to become free. Usage count = 2
Fix by flushing error routes when their nexthop is marked as dead.
IPv6 does not suffer from this problem.
--- net/ipv4/fib_trie.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/ipv4/fib_trie.c +4 -3
@@ -2005,10 +2005,11 @@ int fib_table_flush(struct net *net, struct fib_table *tb, bool flush_all)continue ; } -/* Do not flush error routes if network namespace is -* not being dismantled +/* When not flushing the entire table, skip error +* routes that are not marked for deletion. */ -if (!flush_all && fib_props[fa->fa_type].error) { +if (!flush_all && fib_props[fa->fa_type].error && + !(fi->fib_flags &RTNH_F_DEAD )) { slen = fa->fa_slen;continue ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 290/451 net: rose: fix invalid array index in rose_kill_by_device()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pwnverse <[email protected]>
[ Upstream commit 6595beb40fb0ec47223d3f6058ee40354694c8e4 ]
rose_kill_by_device() collects sockets into a local array[] and then iterates over them to disconnect sockets bound to a device being brought down.
The loop mistakenly indexes array[cnt] instead of array[i]. For cnt < ARRAY_SIZE(array), this reads an uninitialized entry; for cnt == ARRAY_SIZE(array), it is an out-of-bounds read. Either case can lead to an invalid socket pointer dereference and also leaks references taken via sock_hold().
Fix the index to use i.
--- net/rose/af_rose.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/rose/af_rose.c +1 -1
@@ -204,7 +204,7 @@ static void rose_kill_by_device(struct net_device *dev)spin_unlock_bh (&rose_list_lock);for (i =0 ; i < cnt; i++) { - sk = array[cnt]; + sk = array[i]; rose =rose_sk (sk);lock_sock (sk);spin_lock_bh (&rose_list_lock);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 291/451 RDMA/efa: Remove possible negative shift
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Margolin <[email protected]>
[ Upstream commit 85463eb6a46caf2f1e0e1a6d0731f2f3bab17780 ]
The page size used for device might in some cases be smaller than PAGE_SIZE what results in a negative shift when calculating the number of host pages in PAGE_SIZE for a debug log. Remove the debug line together with the calculation.
--- drivers/infiniband/hw/efa/efa_verbs.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/infiniband/hw/efa/efa_verbs.c +0 -4
@@ -1145,13 +1145,9 @@ static int umem_to_page_list(struct efa_dev *dev, u32 hp_cnt, u8 hp_shift) { -u32 pages_in_hp =BIT (hp_shift -PAGE_SHIFT );struct ib_block_iter biter;unsigned int hp_idx =0 ; -ibdev_dbg (&dev->ibdev,"hp_cnt[%u], pages_in_hp[%u]\n" , - hp_cnt, pages_in_hp); -rdma_umem_for_each_dma_block (umem, &biter,BIT (hp_shift)) page_list[hp_idx++] =rdma_block_iter_dma_address (&biter);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 292/451 RDMA/core: Fix logic error in ib_get_gids_from_rdma_hdr()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jang Ingyu <[email protected]>
[ Upstream commit 8aaa848eaddd9ef8680fc6aafbd3a0646da5df40 ]
Fix missing comparison operator for RDMA_NETWORK_ROCE_V1 in the conditional statement. The constant was used directly instead of being compared with net_type, causing the condition to always evaluate to true.
--- drivers/infiniband/core/verbs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/core/verbs.c +1 -1
@@ -735,7 +735,7 @@ int ib_get_gids_from_rdma_hdr(const union rdma_network_hdr *hdr, (struct in6_addr *)dgid);return 0 ; }else if (net_type ==RDMA_NETWORK_IPV6 || - net_type ==RDMA_NETWORK_IB ||RDMA_NETWORK_ROCE_V1 ) { + net_type ==RDMA_NETWORK_IB || net_type ==RDMA_NETWORK_ROCE_V1 ) { *dgid = hdr->ibgrh.dgid; *sgid = hdr->ibgrh.sgid;return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 293/451 RDMA/bnxt_re: Fix incorrect BAR check in bnxt_qplib_map_creq_db()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit 145a417a39d7efbc881f52e829817376972b278c ]
RCFW_COMM_CONS_PCI_BAR_REGION is defined as BAR 2, so checking !creq_db->reg.bar_id is incorrect and always false.
pci_resource_start() returns the BAR base address, and a value of 0 indicates that the BAR is unassigned. Update the condition to test bar_base == 0 instead.
This ensures the driver detects and logs an error for an unassigned RCFW communication BAR.
--- drivers/infiniband/hw/bnxt_re/qplib_rcfw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c +1 -1
@@ -775,7 +775,7 @@ static int bnxt_qplib_map_creq_db(struct bnxt_qplib_rcfw *rcfw, u32 reg_offt) creq_db->reg.bar_id =RCFW_COMM_CONS_PCI_BAR_REGION ; creq_db->reg.bar_base =pci_resource_start (pdev, creq_db->reg.bar_id); -if (!creq_db->reg.bar_id) +if (!creq_db->reg.bar_base)dev_err (&pdev->dev,"QPLIB: CREQ BAR region %d resc start is 0!" , creq_db->reg.bar_id);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 294/451 RDMA/bnxt_re: Fix IB_SEND_IP_CSUM handling in post_send
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit f01765a2361323e78e3d91b1cb1d5527a83c5cf7 ]
The bnxt_re SEND path checks wr->send_flags to enable features such as IP checksum offload. However, send_flags is a bitmask and may contain multiple flags (e.g. IB_SEND_SIGNALED | IB_SEND_IP_CSUM), while the existing code uses a switch() statement that only matches when send_flags is exactly IB_SEND_IP_CSUM.
As a result, checksum offload is not enabled when additional SEND flags are present.
Replace the switch() with a bitmask test:
if (wr->send_flags & IB_SEND_IP_CSUM)
This ensures IP checksum offload is enabled correctly when multiple SEND flags are used.
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +1 -6
@@ -2647,14 +2647,9 @@ int bnxt_re_post_send(struct ib_qp *ib_qp, const struct ib_send_wr *wr, wqe.rawqp1.lflags |=SQ_SEND_RAWETH_QP1_LFLAGS_ROCE_CRC ; } -switch (wr->send_flags) { -case IB_SEND_IP_CSUM : +if (wr->send_flags &IB_SEND_IP_CSUM ) wqe.rawqp1.lflags |=SQ_SEND_RAWETH_QP1_LFLAGS_IP_CHKSUM ; -break ; -default : -break ; - } fallthrough;case IB_WR_SEND_WITH_INV : rc =bnxt_re_build_send_wqe (qp, wr, &wqe);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 295/451 RDMA/bnxt_re: Fix to use correct page size for PDE table
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalesh AP <[email protected]>
[ Upstream commit 3d70e0fb0f289b0c778041c5bb04d099e1aa7c1c ]
In bnxt_qplib_alloc_init_hwq(), while allocating memory for PDE table driver incorrectly is using the "pg_size" value passed to the function. Fixed to use the right value 4K. Also, fixed the allocation size for PBL table.
--- drivers/infiniband/hw/bnxt_re/qplib_res.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_res.c +2 -2
@@ -242,7 +242,7 @@ int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq,if (npbl %BIT (MAX_PDL_LVL_SHIFT )) npde++;/* Alloc PDE pages */ - sginfo.pgsize = npde * pg_size; + sginfo.pgsize = npde *ROCE_PG_SIZE_4K ; sginfo.npages =1 ; rc =__alloc_pbl (res, &hwq->pbl[PBL_LVL_0 ], &sginfo);if (rc)
@@ -250,7 +250,7 @@ int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq,/* Alloc PBL pages */ sginfo.npages = npbl; - sginfo.pgsize =PAGE_SIZE ; + sginfo.pgsize =ROCE_PG_SIZE_4K ; rc =__alloc_pbl (res, &hwq->pbl[PBL_LVL_1 ], &sginfo);if (rc) goto fail;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 296/451 RDMA/bnxt_re: fix dma_free_coherent() pointer
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit fcd431a9627f272b4c0bec445eba365fe2232a94 ]
The dma_alloc_coherent() allocates a dma-mapped buffer, pbl->pg_arr[i]. The dma_free_coherent() should pass the same buffer to dma_free_coherent() and not page-aligned.
--- drivers/infiniband/hw/bnxt_re/qplib_res.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_res.c +1 -3
@@ -70,9 +70,7 @@ static void __free_pbl(struct bnxt_qplib_res *res, struct bnxt_qplib_pbl *pbl,for (i =0 ; i < pbl->pg_count; i++) {if (pbl->pg_arr[i])dma_free_coherent (&pdev->dev, pbl->pg_size, - (void *)((unsigned long ) - pbl->pg_arr[i] & -PAGE_MASK ), + pbl->pg_arr[i], pbl->pg_map_arr[i]);else dev_warn(&pdev->dev,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 297/451 selftests/ftrace: traceonoff_triggers: strip off names
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yipeng Zou <[email protected]>
[ Upstream commit b889b4fb4cbea3ca7eb9814075d6a51936394bd9 ]
The func_traceonoff_triggers.tc sometimes goes to fail on my board, Kunpeng-920.
[root@localhost]# ./ftracetest ./test.d/ftrace/func_traceonoff_triggers.tc -l fail.log === Ftrace unit tests === [1] ftrace - test for function traceon/off triggers [FAIL] [2] (instance) ftrace - test for function traceon/off triggers [UNSUPPORTED]
I look up the log, and it shows that the md5sum is different between csum1 and csum2.
++ cnt=611
++ sleep .1
+++ cnt_trace
+++ grep -v '^#' trace
+++ wc -l
++ cnt2=611
++ '[' 611 -ne 611 ']'
+++ cat tracing_on
++ on=0
++ '[' 0 '!=' 0 ']'
+++ md5sum trace
++ csum1='76896aa74362fff66a6a5f3cf8a8a500 trace'
++ sleep .1
+++ md5sum trace
++ csum2='ee8625a21c058818fc26e45c1ed3f6de trace'
++ '[' '76896aa74362fff66a6a5f3cf8a8a500 trace' '!=' 'ee8625a21c058818fc26e45c1ed3f6de trace' ']' ++ fail 'Tracing file is still changing'
++ echo Tracing file is still changing
Tracing file is still changing
++ exit_fail
++ exit 1
So I directly dump the trace file before md5sum, the diff shows that:
[root@localhost]# diff trace_1.log trace_2.log -y --suppress-common-lines dockerd-12285 [036] d.... 18385.510290: sched_stat | <...>-12285 [036] d.... 18385.510290: sched_stat dockerd-12285 [036] d.... 18385.510291: sched_swit | <...>-12285 [036] d.... 18385.510291: sched_swit <...>-740 [044] d.... 18385.602859: sched_stat | kworker/44:1-740 [044] d.... 18385.602859: sched_stat <...>-740 [044] d.... 18385.602860: sched_swit | kworker/44:1-740 [044] d.... 18385.602860: sched_swit
And we can see that <...> filed be filled with names.
We can strip off the names there to fix that.
After strip off the names:
kworker/u257:0-12 [019] d..2. 2528.758910: sched_stat | -12 [019] d..2. 2528.758910: sched_stat_runtime: comm=k kworker/u257:0-12 [019] d..2. 2528.758912: sched_swit | -12 [019] d..2. 2528.758912: sched_switch: prev_comm=kw <idle>-0 [000] d.s5. 2528.762318: sched_waki | -0 [000] d.s5. 2528.762318: sched_waking: comm=sshd pi <idle>-0 [037] dNh2. 2528.762326: sched_wake | -0 [037] dNh2. 2528.762326: sched_wakeup: comm=sshd pi <idle>-0 [037] d..2. 2528.762334: sched_swit | -0 [037] d..2. 2528.762334: sched_switch: prev_comm=sw
--- tools/testing/selftests/ftrace/test.d/ftrace/func_traceonoff_triggers.tc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/testing/selftests/ftrace/test.d/ftrace/func_traceonoff_triggers.tc +3 -2
@@ -90,9 +90,10 @@ if [ $on != "0" ]; then fail "Tracing is not off" fi -csum1=`md5sum trace` +# Cannot rely on names being around as they are only cached, strip them +csum1=`cat trace | sed -e 's/^ *[^ ]*\(-[0-9][0-9]*\)/\1/' | md5sum` sleep $SLEEP_TIME -csum2=`md5sum trace` +csum2=`cat trace | sed -e 's/^ *[^ ]*\(-[0-9][0-9]*\)/\1/' | md5sum` if [ "$csum1" != "$csum2" ]; then fail "Tracing file is still changing"
Greg Kroah-Hartman
maintainerPATCH 298/451 ASoC: stm32: sai: fix device leak on probe
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit e26ff429eaf10c4ef1bc3dabd9bf27eb54b7e1f4 upstream.
Make sure to drop the reference taken when looking up the sync provider device and its driver data during DAI probe on probe failures and on unbind.
Note that holding a reference to a device does not prevent its driver data from going away so there is no point in keeping the reference.
--- sound/soc/stm/stm32_sai.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/stm/stm32_sai.c +1 -1
@@ -127,6 +127,7 @@ static int stm32_sai_set_sync(struct stm } sai_provider =platform_get_drvdata (pdev); +put_device (&pdev->dev);if (!sai_provider) {dev_err (&sai_client->pdev->dev,"SAI sync provider data not found\n" );
@@ -143,7 +144,6 @@ static int stm32_sai_set_sync(struct stm ret =stm32_sai_sync_conf_provider (sai_provider, synco); error: -put_device (&pdev->dev);of_node_put (np_provider);return ret; }
Greg Kroah-Hartman
maintainerPATCH 299/451 ASoC: qcom: q6asm-dai: perform correct state check before closing
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit bfbb12dfa144d45575bcfe139a71360b3ce80237 upstream.
Do not stop a q6asm stream if its not started, this can result in unnecessary dsp command which will timeout anyway something like below:
q6asm-dai ab00000.remoteproc:glink-edge:apr:service@7:dais: CMD 10bcd timeout
Fix this by correctly checking the state.
--- sound/soc/qcom/qdsp6/q6asm-dai.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/soc/qcom/qdsp6/q6asm-dai.c +2 -1
@@ -237,13 +237,14 @@ static int q6asm_dai_prepare(struct snd_ prtd->pcm_count =snd_pcm_lib_period_bytes (substream); prtd->pcm_irq_pos =0 ;/* rate and channels are sent to audio driver */ -if (prtd->state) { +if (prtd->state ==Q6ASM_STREAM_RUNNING ) {/* clear the previous setup if any */ q6asm_cmd (prtd->audio_client, prtd->stream_id,CMD_CLOSE );q6asm_unmap_memory_regions (substream->stream, prtd->audio_client);q6routing_stream_close (soc_prtd->dai_link->id, substream->stream); + prtd->state =Q6ASM_STREAM_STOPPED ; } ret = q6asm_map_memory_regions(substream->stream, prtd->audio_client,
Greg Kroah-Hartman
maintainerPATCH 300/451 ASoC: qcom: q6adm: the the copp device only during last instance
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit 74cc4f3ea4e99262ba0d619c6a4ee33e2cd47f65 upstream.
A matching Common object post processing instance is normally resused across multiple streams. However currently we close this on DSP even though there is a refcount on this copp object, this can result in below error.
q6routing ab00000.remoteproc:glink-edge:apr:service@8:routing: Found Matching Copp 0x0 qcom-q6adm aprsvc:service:4:8: cmd = 0x10325 return error = 0x2 q6routing ab00000.remoteproc:glink-edge:apr:service@8:routing: DSP returned error[2] q6routing ab00000.remoteproc:glink-edge:apr:service@8:routing: Found Matching Copp 0x0 qcom-q6adm aprsvc:service:4:8: cmd = 0x10325 return error = 0x2 q6routing ab00000.remoteproc:glink-edge:apr:service@8:routing: DSP returned error[2] qcom-q6adm aprsvc:service:4:8: cmd = 0x10327 return error = 0x2 qcom-q6adm aprsvc:service:4:8: DSP returned error[2]
qcom-q6adm aprsvc:service:4:8: Failed to close copp -22
qcom-q6adm aprsvc:service:4:8: cmd = 0x10327 return error = 0x2 qcom-q6adm aprsvc:service:4:8: DSP returned error[2]
qcom-q6adm aprsvc:service:4:8: Failed to close copp -22
Fix this by addressing moving the adm_close to copp_kref destructor callback.
--- sound/soc/qcom/qdsp6/q6adm.c | 146 ++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 75 deletions(-)
sound/soc/qcom/qdsp6/q6adm.c +71 -75
@@ -109,11 +109,75 @@ static struct q6copp *q6adm_find_copp(st } +static int q6adm_apr_send_copp_pkt (struct q6adm *adm,struct q6copp *copp, +struct apr_pkt *pkt,uint32_t rsp_opcode) +{ +struct device *dev = adm->dev; +uint32_t opcode = pkt->hdr.opcode; +int ret; + +mutex_lock (&adm->lock); + copp->result.opcode =0 ; + copp->result.status =0 ; + ret =apr_send_pkt (adm->apr, pkt); +if (ret <0 ) { +dev_err (dev,"Failed to send APR packet\n" ); + ret = -EINVAL ; + goto err; + } + +/* Wait for the callback with copp id */ +if (rsp_opcode) + ret =wait_event_timeout (copp->wait, + (copp->result.opcode == opcode) || + (copp->result.opcode == rsp_opcode), +msecs_to_jiffies (TIMEOUT_MS )); +else + ret =wait_event_timeout (copp->wait, + (copp->result.opcode == opcode), +msecs_to_jiffies (TIMEOUT_MS )); + +if (!ret) { +dev_err (dev,"ADM copp cmd timedout\n" ); + ret = -ETIMEDOUT ; + }else if (copp->result.status >0 ) { +dev_err (dev,"DSP returned error[%d]\n" , + copp->result.status); + ret = -EINVAL ; + } + +err: +mutex_unlock (&adm->lock); +return ret; +} + +static int q6adm_device_close (struct q6adm *adm,struct q6copp *copp, +int port_id,int copp_idx) +{ +struct apr_pkt close; + + close.hdr.hdr_field =APR_HDR_FIELD (APR_MSG_TYPE_SEQ_CMD , +APR_HDR_LEN (APR_HDR_SIZE ), +APR_PKT_VER ); + close.hdr.pkt_size =sizeof (close); + close.hdr.src_port = port_id; + close.hdr.dest_port = copp->id; + close.hdr.token = port_id <<16 | copp_idx; + close.hdr.opcode =ADM_CMD_DEVICE_CLOSE_V5 ; + +return q6adm_apr_send_copp_pkt (adm, copp, &close,0 ); +} +static void q6adm_free_copp (struct kref *ref) { struct q6copp *c = container_of(ref, struct q6copp, refcount);struct q6adm *adm = c->adm;unsigned long flags; +int ret; + + ret =q6adm_device_close (adm, c, c->afe_port, c->copp_idx); +if (ret <0 ) +dev_err (adm->dev,"Failed to close copp %d\n" , ret);spin_lock_irqsave (&adm->copps_list_lock, flags);clear_bit (c->copp_idx, &adm->copp_bitmap[c->afe_port]);
@@ -155,13 +219,13 @@ static int q6adm_callback(struct apr_devswitch (result->opcode) {case ADM_CMD_DEVICE_OPEN_V5 :case ADM_CMD_DEVICE_CLOSE_V5 : - copp =q6adm_find_copp (adm, port_idx, copp_idx); -if (!copp) -return 0 ; - - copp->result = *result; -wake_up (&copp->wait); -kref_put (&copp->refcount, q6adm_free_copp); +list_for_each_entry (copp, &adm->copps_list, node) { +if ((port_idx == copp->afe_port) && (copp_idx == copp->copp_idx)) { + copp->result = *result; +wake_up (&copp->wait); +break ; + } + }break ;case ADM_CMD_MATRIX_MAP_ROUTINGS_V5 : adm->result = *result;
@@ -234,65 +298,6 @@ static struct q6copp *q6adm_alloc_copp(sreturn c; } -static int q6adm_apr_send_copp_pkt (struct q6adm *adm,struct q6copp *copp, -struct apr_pkt *pkt,uint32_t rsp_opcode) -{ -struct device *dev = adm->dev; -uint32_t opcode = pkt->hdr.opcode; -int ret; - -mutex_lock (&adm->lock); - copp->result.opcode =0 ; - copp->result.status =0 ; - ret =apr_send_pkt (adm->apr, pkt); -if (ret <0 ) { -dev_err (dev,"Failed to send APR packet\n" ); - ret = -EINVAL ; - goto err; - } - -/* Wait for the callback with copp id */ -if (rsp_opcode) - ret =wait_event_timeout (copp->wait, - (copp->result.opcode == opcode) || - (copp->result.opcode == rsp_opcode), -msecs_to_jiffies (TIMEOUT_MS )); -else - ret =wait_event_timeout (copp->wait, - (copp->result.opcode == opcode), -msecs_to_jiffies (TIMEOUT_MS )); - -if (!ret) { -dev_err (dev,"ADM copp cmd timedout\n" ); - ret = -ETIMEDOUT ; - }else if (copp->result.status >0 ) { -dev_err (dev,"DSP returned error[%d]\n" , - copp->result.status); - ret = -EINVAL ; - } - -err: -mutex_unlock (&adm->lock); -return ret; -} - -static int q6adm_device_close (struct q6adm *adm,struct q6copp *copp, -int port_id,int copp_idx) -{ -struct apr_pkt close; - - close.hdr.hdr_field =APR_HDR_FIELD (APR_MSG_TYPE_SEQ_CMD , -APR_HDR_LEN (APR_HDR_SIZE ), -APR_PKT_VER ); - close.hdr.pkt_size =sizeof (close); - close.hdr.src_port = port_id; - close.hdr.dest_port = copp->id; - close.hdr.token = port_id <<16 | copp_idx; - close.hdr.opcode =ADM_CMD_DEVICE_CLOSE_V5 ; - -return q6adm_apr_send_copp_pkt (adm, copp, &close,0 ); -} - static struct q6copp *q6adm_find_matching_copp(struct q6adm *adm, int port_id, int topology, int mode, int rate,
@@ -567,15 +572,6 @@ EXPORT_SYMBOL_GPL(q6adm_matrix_map);*/ int q6adm_close (struct device *dev,struct q6copp *copp) { -struct q6adm *adm =dev_get_drvdata (dev->parent); -int ret =0 ; - - ret =q6adm_device_close (adm, copp, copp->afe_port, copp->copp_idx); -if (ret <0 ) { -dev_err (adm->dev,"Failed to close copp %d\n" , ret); -return ret; - } -kref_put (&copp->refcount, q6adm_free_copp);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 301/451 ASoC: qcom: qdsp6: q6asm-dai: set 10 ms period and buffer alignment.
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit 81c53b52de21b8d5a3de55ebd06b6bf188bf7efd upstream.
DSP expects the periods to be aligned to fragment sizes, currently setting up to hw constriants on periods bytes is not going to work correctly as we can endup with periods sizes aligned to 32 bytes however not aligned to fragment size.
Update the constriants to use fragment size, and also set at step of 10ms for period size to accommodate DSP requirements of 10ms latency.
--- sound/soc/qcom/qdsp6/q6asm-dai.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/qcom/qdsp6/q6asm-dai.c +2 -2
@@ -413,13 +413,13 @@ static int q6asm_dai_open(struct snd_soc } ret =snd_pcm_hw_constraint_step (runtime,0 , -SNDRV_PCM_HW_PARAM_PERIOD_BYTES ,32 ); +SNDRV_PCM_HW_PARAM_PERIOD_SIZE ,480 );if (ret <0 ) {dev_err (dev,"constraint for period bytes step ret = %d\n" , ret); } ret =snd_pcm_hw_constraint_step (runtime,0 , -SNDRV_PCM_HW_PARAM_BUFFER_BYTES ,32 ); +SNDRV_PCM_HW_PARAM_BUFFER_SIZE ,480 );if (ret <0 ) {dev_err (dev,"constraint for buffer bytes step ret = %d\n" , ret);
Greg Kroah-Hartman
maintainerPATCH 302/451 iommu/exynos: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 05913cc43cb122f9afecdbe775115c058b906e1b upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
Note that commit 1a26044954a6 ("iommu/exynos: add missing put_device() call in exynos_iommu_of_xlate()") fixed the leak in a couple of error paths, but the reference is still leaking on success.
--- drivers/iommu/exynos-iommu.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/iommu/exynos-iommu.c +3 -6
@@ -1299,17 +1299,14 @@ static int exynos_iommu_of_xlate(structreturn -ENODEV ; data =platform_get_drvdata (sysmmu); -if (!data) { -put_device (&sysmmu->dev); +put_device (&sysmmu->dev); +if (!data)return -ENODEV ; - }if (!owner) { owner =kzalloc (sizeof (*owner),GFP_KERNEL ); -if (!owner) { -put_device (&sysmmu->dev); +if (!owner)return -ENOMEM ; - }INIT_LIST_HEAD (&owner->controllers);mutex_init (&owner->rpm_lock);
Greg Kroah-Hartman
maintainerPATCH 303/451 iommu/ipmmu-vmsa: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 80aa518452c4aceb9459f9a8e3184db657d1b441 upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
--- drivers/iommu/ipmmu-vmsa.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/ipmmu-vmsa.c +2 -0
@@ -732,6 +732,8 @@ static int ipmmu_init_platform_device(stdev_iommu_priv_set (dev,platform_get_drvdata (ipmmu_pdev)); +put_device (&ipmmu_pdev->dev); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 304/451 iommu/mediatek-v1: fix device leak on probe_device()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit c77ad28bfee0df9cbc719eb5adc9864462cfb65b upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during probe_device().
--- drivers/iommu/mtk_iommu_v1.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/mtk_iommu_v1.c +2 -0
@@ -393,6 +393,8 @@ static int mtk_iommu_create_mapping(strureturn -EINVAL ;dev_iommu_priv_set (dev,platform_get_drvdata (m4updev)); + +put_device (&m4updev->dev); } ret =iommu_fwspec_add_ids (dev, args->args,1 );
Greg Kroah-Hartman
maintainerPATCH 305/451 iommu/mediatek: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit b3f1ee18280363ef17f82b564fc379ceba9ec86f upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
--- drivers/iommu/mtk_iommu.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/mtk_iommu.c +2 -0
@@ -526,6 +526,8 @@ static int mtk_iommu_of_xlate(struct devreturn -EINVAL ;dev_iommu_priv_set (dev,platform_get_drvdata (m4updev)); + +put_device (&m4updev->dev); }return iommu_fwspec_add_ids (dev, args->args,1 );
Greg Kroah-Hartman
maintainerPATCH 306/451 iommu/omap: fix device leaks on probe_device()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit b5870691065e6bbe6ba0650c0412636c6a239c5a upstream.
Make sure to drop the references taken to the iommu platform devices when looking up their driver data during probe_device().
Note that the arch data device pointer added by commit 604629bcb505 ("iommu/omap: add support for late attachment of iommu devices") has never been used. Remove it to underline that the references are not needed.
--- drivers/iommu/omap-iommu.c | 2 +- drivers/iommu/omap-iommu.h | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-)
drivers/iommu/omap-iommu.c +1 -1
@@ -1686,6 +1686,7 @@ static struct iommu_device *omap_iommu_p } oiommu =platform_get_drvdata (pdev); +put_device (&pdev->dev);if (!oiommu) {of_node_put (np);kfree (arch_data);
@@ -1693,7 +1694,6 @@ static struct iommu_device *omap_iommu_p } tmp->iommu_dev = oiommu; - tmp->dev = &pdev->dev;of_node_put (np); }
drivers/iommu/omap-iommu.h +0 -2
@@ -88,7 +88,6 @@ struct omap_iommu {/** * struct omap_iommu_arch_data - omap iommu private data * @iommu_dev: handle of the OMAP iommu device -* @dev: handle of the iommu device * * This is an omap iommu private data object, which binds an iommu user * to its iommu device. This object should be placed at the iommu user's
@@ -97,7 +96,6 @@ struct omap_iommu {*/ struct omap_iommu_arch_data {struct omap_iommu *iommu_dev; -struct device *dev; };struct cr_regs {
Greg Kroah-Hartman
maintainerPATCH 307/451 iommu/sun50i: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit f916109bf53864605d10bf6f4215afa023a80406 upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
--- drivers/iommu/sun50i-iommu.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/sun50i-iommu.c +2 -0
@@ -767,6 +767,8 @@ static int sun50i_iommu_of_xlate(structdev_iommu_priv_set (dev,platform_get_drvdata (iommu_pdev)); +put_device (&iommu_pdev->dev); +return iommu_fwspec_add_ids (dev, &id,1 ); }
Greg Kroah-Hartman
maintainerPATCH 308/451 HID: logitech-dj: Remove duplicate error logging
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit ca389a55d8b2d86a817433bf82e0602b68c4d541 upstream.
logi_dj_recv_query_paired_devices() and logi_dj_recv_switch_to_dj_mode() both have 2 callers which all log an error if the function fails. Move the error logging to inside these 2 functions to remove the duplicated error logging in the callers.
While at it also move the logi_dj_recv_send_report() call error handling in logi_dj_recv_switch_to_dj_mode() to directly after the call. That call only fails if the report cannot be found and in that case it does nothing, so the msleep() is not necessary on failures.
--- drivers/hid/hid-logitech-dj.c | 56 +++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 33 deletions(-)
drivers/hid/hid-logitech-dj.c +23 -33
@@ -755,7 +755,6 @@ static void delayedwork_callback(structstruct dj_workitem workitem;unsigned long flags;int count; -int retval;dbg_hid ("%s\n" , __func__);
@@ -792,11 +791,7 @@ static void delayedwork_callback(structlogi_dj_recv_destroy_djhid_device (djrcv_dev, &workitem);break ;case WORKITEM_TYPE_UNKNOWN : - retval =logi_dj_recv_query_paired_devices (djrcv_dev); -if (retval) { -hid_err (djrcv_dev->hidpp,"%s: logi_dj_recv_query_paired_devices error: %d\n" , - __func__, retval); - } +logi_dj_recv_query_paired_devices (djrcv_dev);break ;case WORKITEM_TYPE_EMPTY :dbg_hid ("%s: device list is empty\n" , __func__);
@@ -1173,8 +1168,10 @@ static int logi_dj_recv_query_paired_dev djrcv_dev->last_query = jiffies; -if (djrcv_dev->type != recvr_type_dj) -return logi_dj_recv_query_hidpp_devices (djrcv_dev); +if (djrcv_dev->type != recvr_type_dj) { + retval =logi_dj_recv_query_hidpp_devices (djrcv_dev); + goto out; + } dj_report =kzalloc (sizeof (struct dj_report ),GFP_KERNEL );if (!dj_report)
@@ -1184,6 +1181,10 @@ static int logi_dj_recv_query_paired_dev dj_report->report_type =REPORT_TYPE_CMD_GET_PAIRED_DEVICES ; retval =logi_dj_recv_send_report (djrcv_dev, dj_report);kfree (dj_report); +out: +if (retval <0 ) +hid_err (djrcv_dev->hidpp,"%s error:%d\n" , __func__, retval); +return retval; }
@@ -1209,6 +1210,8 @@ static int logi_dj_recv_switch_to_dj_mod (u8 )timeout; retval =logi_dj_recv_send_report (djrcv_dev, dj_report); +if (retval) + goto out;/* * Ugly sleep to work around a USB 3.0 bug when the receiver is
@@ -1217,11 +1220,6 @@ static int logi_dj_recv_switch_to_dj_mod* 50 msec should gives enough time to the receiver to be ready. */ msleep (50 ); - -if (retval) { -kfree (dj_report); -return retval; - } }/*
@@ -1247,7 +1245,12 @@ static int logi_dj_recv_switch_to_dj_modHIDPP_REPORT_SHORT_LENGTH ,HID_OUTPUT_REPORT , HID_REQ_SET_REPORT); +out:kfree (dj_report); + +if (retval <0 ) +hid_err (hdev,"%s error:%d\n" , __func__, retval); +return retval; }
@@ -1753,11 +1756,8 @@ static int logi_dj_probe(struct hid_deviif (has_hidpp) { retval =logi_dj_recv_switch_to_dj_mode (djrcv_dev,0 ); -if (retval <0 ) { -hid_err (hdev,"%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n" , - __func__, retval); +if (retval <0 ) goto switch_to_dj_mode_fail; - } }/* This is enabling the polling urb on the IN endpoint */
@@ -1775,15 +1775,11 @@ static int logi_dj_probe(struct hid_devispin_lock_irqsave (&djrcv_dev->lock, flags); djrcv_dev->ready = true;spin_unlock_irqrestore (&djrcv_dev->lock, flags); - retval =logi_dj_recv_query_paired_devices (djrcv_dev); -if (retval <0 ) { -hid_err (hdev,"%s: logi_dj_recv_query_paired_devices error:%d\n" , - __func__, retval); -/* -* This can happen with a KVM, let the probe succeed, -* logi_dj_recv_queue_unknown_work will retry later. -*/ - } +/* +* This can fail with a KVM. Ignore errors to let the probe +* succeed, logi_dj_recv_queue_unknown_work will retry later. +*/ +logi_dj_recv_query_paired_devices (djrcv_dev); }return 0 ;
@@ -1800,18 +1796,12 @@ hid_hw_start_fail:#ifdef CONFIG_PM static int logi_dj_reset_resume (struct hid_device *hdev) { -int retval;struct dj_receiver_dev *djrcv_dev =hid_get_drvdata (hdev);if (!djrcv_dev || djrcv_dev->hidpp != hdev)return 0 ; - retval =logi_dj_recv_switch_to_dj_mode (djrcv_dev,0 ); -if (retval <0 ) { -hid_err (hdev,"%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n" , - __func__, retval); - } - +logi_dj_recv_switch_to_dj_mode (djrcv_dev,0 );return 0 ; }#endif
Greg Kroah-Hartman
maintainerPATCH 309/451 PCI/PM: Reinstate clearing state_saved in legacy and !PM codepaths
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
commit 894f475f88e06c0f352c829849560790dbdedbe5 upstream.
When a PCI device is suspended, it is normally the PCI core's job to save Config Space and put the device into a low power state. However drivers are allowed to assume these responsibilities. When they do, the PCI core can tell by looking at the state_saved flag in struct pci_dev: The flag is cleared before commencing the suspend sequence and it is set when pci_save_state() is called. If the PCI core finds the flag set late in the suspend sequence, it refrains from calling pci_save_state() itself.
But there are two corner cases where the PCI core neglects to clear the flag before commencing the suspend sequence:
* If a driver has legacy PCI PM callbacks, pci_legacy_suspend() neglects to clear the flag. The (stale) flag is subsequently queried by pci_legacy_suspend() itself and pci_legacy_suspend_late().
* If a device has no driver or its driver has no PCI PM callbacks, pci_pm_freeze() neglects to clear the flag. The (stale) flag is subsequently queried by pci_pm_freeze_noirq().
The flag may be set prior to suspend if the device went through error
recovery: Drivers commonly invoke pci_restore_state() + pci_save_state() to restore Config Space after reset.
The flag may also be set if drivers call pci_save_state() on probe to allow for recovery from subsequent errors.
The result is that pci_legacy_suspend_late() and pci_pm_freeze_noirq() don't call pci_save_state() and so the state that will be restored on resume is the one recorded on last error recovery or on probe, not the one that the device had on suspend. If the two states happen to be identical, there's no problem.
Reinstate clearing the flag in pci_legacy_suspend() and pci_pm_freeze(). The two functions used to do that until commit 4b77b0a2ba27 ("PCI: Clear saved_state after the state has been restored") deemed it unnecessary because it assumed that it's sufficient to clear the flag on resume in pci_restore_state(). The commit seemingly did not take into account that pci_save_state() and pci_restore_state() are not only used by power management code, but also for error recovery.
Devices without driver or whose driver has no PCI PM callbacks may be in runtime suspend when pci_pm_freeze() is called. Their state has already been saved, so don't clear the flag to skip a pointless pci_save_state() in pci_pm_freeze_noirq().
None of the drivers with legacy PCI PM callbacks seem to use runtime PM, so clear the flag unconditionally in their case.
--- drivers/pci/pci-driver.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/pci/pci-driver.c +4 -0
@@ -584,6 +584,8 @@ static int pci_legacy_suspend(struct devstruct pci_dev *pci_dev =to_pci_dev (dev);struct pci_driver *drv = pci_dev->driver; + pci_dev->state_saved = false; +if (drv && drv->suspend) {pci_power_t prev = pci_dev->current_state;int error;
@@ -985,6 +987,8 @@ static int pci_pm_freeze(struct device *if (!pm) {pci_pm_default_suspend (pci_dev); +if (!pm_runtime_suspended (dev)) + pci_dev->state_saved = false;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 310/451 leds: leds-lp50xx: Allow LED 0 to be added to module bank
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Hitz <[email protected]>
commit 26fe74d598c32e7bc6f150edfc4aa43e1bee55db upstream.
led_banks contains LED module number(s) that should be grouped into the module bank. led_banks is 0-initialized.
By checking the led_banks entries for 0, un-set entries are detected. But a 0-entry also indicates that LED module 0 should be grouped into the module bank.
By only iterating over the available entries no check for unused entries is required and LED module 0 can be added to bank.
--- drivers/leds/leds-lp50xx.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/leds/leds-lp50xx.c +4 -6
@@ -348,17 +348,15 @@ out:return ret; } -static int lp50xx_set_banks (struct lp50xx *priv,u32 led_banks[]) +static int lp50xx_set_banks (struct lp50xx *priv,u32 led_banks[],int num_leds) {u8 led_config_lo, led_config_hi;u32 bank_enable_mask =0 ;int ret;int i; -for (i =0 ; i < priv->chip_info->max_modules; i++) { -if (led_banks[i]) - bank_enable_mask |= (1 << led_banks[i]); - } +for (i =0 ; i < num_leds; i++) + bank_enable_mask |= (1 << led_banks[i]); led_config_lo = (u8)(bank_enable_mask &0xff ); led_config_hi = (u8)(bank_enable_mask >>8 ) &0xff ;
@@ -416,7 +414,7 @@ static int lp50xx_probe_leds(struct fwnoreturn ret; } - ret =lp50xx_set_banks (priv, led_banks); + ret =lp50xx_set_banks (priv, led_banks, num_leds);if (ret) {dev_err (&priv->client->dev,"Cannot setup banked LEDs\n" );return ret;
Greg Kroah-Hartman
maintainerPATCH 311/451 leds: leds-lp50xx: LP5009 supports 3 modules for a total of 9 LEDs
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Hitz <[email protected]>
commit 5246e3673eeeccb4f5bf4f42375dd495d465ac15 upstream.
LP5009 supports 9 LED outputs that are grouped into 3 modules.
--- drivers/leds/leds-lp50xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/leds/leds-lp50xx.c +1 -1
@@ -57,7 +57,7 @@/* There are 3 LED outputs per bank */ #define LP50XX_LEDS_PER_MODULE 3 -#define LP5009_MAX_LED_MODULES 2 +#define LP5009_MAX_LED_MODULES 3#define LP5012_MAX_LED_MODULES 4#define LP5018_MAX_LED_MODULES 6#define LP5024_MAX_LED_MODULES 8
Greg Kroah-Hartman
maintainerPATCH 312/451 mfd: altera-sysmgr: Fix device leak on sysmgr regmap lookup
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit ccb7cd3218e48665f3c7e19eede0da5f069c323d upstream.
Make sure to drop the reference taken to the sysmgr platform device when retrieving its driver data.
Note that holding a reference to a device does not prevent its driver data from going away.
--- drivers/mfd/altera-sysmgr.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/mfd/altera-sysmgr.c +2 -0
@@ -118,6 +118,8 @@ struct regmap *altr_sysmgr_regmap_lookup sysmgr =dev_get_drvdata (dev); +put_device (dev); +return sysmgr->regmap; }EXPORT_SYMBOL_GPL (altr_sysmgr_regmap_lookup_by_phandle);
Greg Kroah-Hartman
maintainerPATCH 313/451 mfd: max77620: Fix potential IRQ chip conflict when probing two devices
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit 2bac49bad1f3553cc3b3bfb22cc194e9bd9e8427 upstream.
MAX77620 is most likely always a single device on the board, however nothing stops board designers to have two of them, thus same device driver could probe twice. Or user could manually try to probing second time.
Device driver is not ready for that case, because it allocates statically 'struct regmap_irq_chip' as non-const and stores during probe in 'irq_drv_data' member a pointer to per-probe state container ('struct max77620_chip'). devm_regmap_add_irq_chip() does not make a copy of 'struct regmap_irq_chip' but store the pointer.
Second probe - either successful or failure - would overwrite the 'irq_drv_data' from previous device probe, so interrupts would be executed in a wrong context.
--- drivers/mfd/max77620.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
drivers/mfd/max77620.c +11 -4
@@ -254,7 +254,7 @@ static int max77620_irq_global_unmask(voreturn ret; } -static struct regmap_irq_chip max77620_top_irq_chip = { +static const struct regmap_irq_chip max77620_top_irq_chip = { .name ="max77620-top" , .irqs = max77620_top_irqs, .num_irqs =ARRAY_SIZE (max77620_top_irqs),
@@ -499,6 +499,7 @@ static int max77620_probe(struct i2c_cli {const struct regmap_config *rmap_config;struct max77620_chip *chip; +struct regmap_irq_chip *chip_desc;const struct mfd_cell *mfd_cells;int n_mfd_cells;bool pm_off;
@@ -509,6 +510,14 @@ static int max77620_probe(struct i2c_clireturn -ENOMEM ;i2c_set_clientdata (client, chip); + + chip_desc =devm_kmemdup (&client->dev, &max77620_top_irq_chip, +sizeof (max77620_top_irq_chip), +GFP_KERNEL ); +if (!chip_desc) +return -ENOMEM ; + chip_desc->irq_drv_data = chip; + chip->dev = &client->dev; chip->chip_irq = client->irq; chip->chip_id = (enum max77620_chip_id )id->driver_data;
@@ -545,11 +554,9 @@ static int max77620_probe(struct i2c_cliif (ret <0 )return ret; - max77620_top_irq_chip.irq_drv_data = chip; ret =devm_regmap_add_irq_chip (chip->dev, chip->rmap, client->irq,IRQF_ONESHOT |IRQF_SHARED ,0 , - &max77620_top_irq_chip, - &chip->top_irq_data); + chip_desc, &chip->top_irq_data);if (ret <0 ) {dev_err (chip->dev,"Failed to add regmap irq: %d\n" , ret);return ret;
Greg Kroah-Hartman
maintainerPATCH 314/451 media: rc: st_rc: Fix reset control resource leak
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotian Zhang <[email protected]>
commit 1240abf4b71f632f0117b056e22488e4d9808938 upstream.
The driver calls reset_control_get_optional_exclusive() but never calls reset_control_put() in error paths or in the remove function. This causes a resource leak when probe fails after successfully acquiring the reset control, or when the driver is unloaded.
Switch to devm_reset_control_get_optional_exclusive() to automatically manage the reset control resource.
--- drivers/media/rc/st_rc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/rc/st_rc.c +1 -1
@@ -279,7 +279,7 @@ static int st_rc_probe(struct platform_delse rc_dev->rx_base = rc_dev->base; - rc_dev->rstc =reset_control_get_optional_exclusive (dev,NULL ); + rc_dev->rstc =devm_reset_control_get_optional_exclusive (dev,NULL );if (IS_ERR (rc_dev->rstc)) { ret =PTR_ERR (rc_dev->rstc); goto err;
Greg Kroah-Hartman
maintainerPATCH 315/451 parisc: entry.S: fix space adjustment on interruption for 64-bit userspace
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Schnelle <[email protected]>
commit 1aa4524c0c1b54842c4c0a370171d11b12d0709b upstream.
In wide mode, the IASQ contain the upper part of the GVA during interruption. This needs to be reversed before the space is used - otherwise it contains parts of IAOQ. See Page 2-13 "Processing Resources / Interruption Instruction Address Queues" in the Parisc 2.0 Architecture Manual page 2-13 for an explanation.
The IAOQ/IASQ space_adjust was skipped for other interruptions than itlb misses. However, the code in handle_interruption() checks whether iasq[0] contains a valid space. Due to the not masked out bits this match failed and the process was killed.
Also add space_adjust for IAOQ1/IASQ1 so ptregs contains sane values.
--- arch/parisc/kernel/entry.S | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
arch/parisc/kernel/entry.S +8 -3
@@ -1072,8 +1072,6 @@ ENTRY_CFI(intr_save) /* for os_hpmc */ STREG %r17, PT_IOR(%r29) #if defined(CONFIG_64BIT) - b,n intr_save2 - skip_save_ior: /* We have a itlb miss, and when executing code above 4 Gb on ILP64, we * need to adjust iasq/iaoq here in the same way we adjusted isr/ior
@@ -1082,10 +1080,17 @@ skip_save_ior: bb,COND(>=),n %r8,PSW_W_BIT,intr_save2 LDREG PT_IASQ0(%r29), %r16 LDREG PT_IAOQ0(%r29), %r17 - /* adjust iasq/iaoq */ + /* adjust iasq0/iaoq0 */ space_adjust %r16,%r17,%r1 STREG %r16, PT_IASQ0(%r29) STREG %r17, PT_IAOQ0(%r29) + + LDREG PT_IASQ1(%r29), %r16 + LDREG PT_IAOQ1(%r29), %r17 + /* adjust iasq1/iaoq1 */ + space_adjust %r16,%r17,%r1 + STREG %r16, PT_IASQ1(%r29) + STREG %r17, PT_IAOQ1(%r29) #else skip_save_ior: #endif
Greg Kroah-Hartman
maintainerPATCH 316/451 parisc: entry: set W bit for !compat tasks in syscall_restore_rfi()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Schnelle <[email protected]>
commit 5fb1d3ce3e74a4530042795e1e065422295f1371 upstream.
When the kernel leaves to userspace via syscall_restore_rfi(), the W bit is not set in the new PSW. This doesn't cause any problems because there's no 64 bit userspace for parisc. Simple static binaries are usually loaded at addresses way below the 32 bit limit so the W bit doesn't matter.
Fix this by setting the W bit when TIF_32BIT is not set.
--- arch/parisc/kernel/asm-offsets.c | 2 ++ arch/parisc/kernel/entry.S | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-)
arch/parisc/kernel/asm-offsets.c +2 -0
@@ -262,6 +262,8 @@ int main(void)BLANK ();DEFINE (TIF_BLOCKSTEP_PA_BIT ,31 -TIF_BLOCKSTEP );DEFINE (TIF_SINGLESTEP_PA_BIT ,31 -TIF_SINGLESTEP ); +DEFINE (TIF_32BIT_PA_BIT ,31 -TIF_32BIT ); +BLANK ();DEFINE (ASM_PMD_SHIFT ,PMD_SHIFT );DEFINE (ASM_PGDIR_SHIFT ,PGDIR_SHIFT );
arch/parisc/kernel/entry.S +4 -1
@@ -1913,6 +1913,10 @@ syscall_restore_rfi: extru,= %r19,TIF_BLOCKSTEP_PA_BIT,1,%r0 depi -1,7,1,%r20 /* T bit */ +#ifdef CONFIG_64BIT + extru,<> %r19,TIF_32BIT_PA_BIT,1,%r0 + depi -1,4,1,%r20 /* W bit */ +#endif STREG %r20,TASK_PT_PSW(%r1) /* Always store space registers, since sr3 can be changed (e.g. fork) */
@@ -1926,7 +1930,6 @@ syscall_restore_rfi: STREG %r25,TASK_PT_IASQ0(%r1) STREG %r25,TASK_PT_IASQ1(%r1) - /* XXX W bit??? */ /* Now if old D bit is clear, it means we didn't save all registers * on syscall entry, so do that now. This only happens on TRACEME * calls, or if someone attached to us while we were on a syscall.
Greg Kroah-Hartman
maintainerPATCH 317/451 media: adv7842: Avoid possible out-of-bounds array accesses in adv7842_cp_log_status()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Abramov <[email protected]>
commit 8163419e3e05d71dcfa8fb49c8fdf8d76908fe51 upstream.
It's possible for cp_read() and hdmi_read() to return -EIO. Those values are further used as indexes for accessing arrays.
Fix that by checking return values where it's needed.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/media/i2c/adv7842.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/media/i2c/adv7842.c +5 -2
@@ -2671,6 +2671,7 @@ static int adv7842_cp_log_status(struct/* CP block */ struct adv7842_state *state =to_state (sd);struct v4l2_dv_timings timings; +int temp;u8 reg_io_0x02 =io_read (sd,0x02 );u8 reg_io_0x21 =io_read (sd,0x21 );u8 reg_rep_0x77 =rep_read (sd,0x77 );
@@ -2793,8 +2794,9 @@ static int adv7842_cp_log_status(struct (((reg_io_0x02 >>2 ) &0x01 ) ^ (reg_io_0x02 &0x01 )) ?"(16-235)" :"(0-255)" , (reg_io_0x02 & 0x08) ? "enabled" : "disabled"); + temp =cp_read (sd,0xf4 ) >>4 ;v4l2_info (sd,"Color space conversion: %s\n" , - csc_coeff_sel_rb[cp_read (sd,0xf4 ) >>4 ]); + temp <0 ?"" : csc_coeff_sel_rb[temp]);if (!is_digital_input (sd))return 0 ;
@@ -2824,8 +2826,9 @@ static int adv7842_cp_log_status(struct hdmi_read(sd, 0x5f));v4l2_info (sd,"AV Mute: %s\n" , (hdmi_read (sd,0x04 ) &0x40 ) ?"on" :"off" ); + temp =hdmi_read (sd,0x0b ) >>6 ;v4l2_info (sd,"Deep color mode: %s\n" , - deep_color_mode_txt[hdmi_read (sd,0x0b ) >>6 ]); + temp <0 ?"" : deep_color_mode_txt[temp]);adv7842_log_infoframes (sd);
Greg Kroah-Hartman
maintainerPATCH 318/451 dm-ebs: Mark full buffer dirty even on partial write
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uladzislau Rezki (Sony) <[email protected]>
commit 7fa3e7d114abc9cc71cc35d768e116641074ddb4 upstream.
When performing a read-modify-write(RMW) operation, any modification to a buffered block must cause the entire buffer to be marked dirty.
Marking only a subrange as dirty is incorrect because the underlying device block size(ubs) defines the minimum read/write granularity. A lower device can perform I/O only on regions which are fully aligned and sized to ubs.
This change ensures that write-back operations always occur in full ubs-sized chunks, matching the intended emulation semantics of the EBS target.
As for user space visible impact, submitting sub-ubs and misaligned I/O for devices which are tuned to ubs sizes only, will reject such requests, therefore it can lead to losing data. Example:
1) Create a 8K nvme device in qemu by adding
-device nvme,drive=drv0,serial=foo,logical_block_size=8192,physical_block_size=8192
2) Setup dm-ebs to emulate 512B to 8K mapping
urezki@pc638:~/bin$ cat dmsetup.sh
lower=/dev/nvme0n1
len=$(blockdev --getsz "$lower")
echo "0 $len ebs $lower 0 1 16" | dmsetup create nvme-8k urezki@pc638:~/bin$
offset 0, ebs=1 and ubs=16(in sectors).
3) Create an ext4 filesystem(default 4K block size)
urezki@pc638:~/bin$ sudo mkfs.ext4 -F /dev/dm-0
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 2072576 4k blocks and 518144 inodes
Filesystem UUID: bd0b6ca6-0506-4e31-86da-8d22c9d50b63
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: mkfs.ext4: Input/output error while writing out and closing file system
urezki@pc638:~/bin$ dmesg
<snip>
[ 1618.875449] buffer_io_error: 1028 callbacks suppressed [ 1618.875456] Buffer I/O error on dev dm-0, logical block 0, lost async page write [ 1618.875527] Buffer I/O error on dev dm-0, logical block 1, lost async page write [ 1618.875602] Buffer I/O error on dev dm-0, logical block 2, lost async page write [ 1618.875620] Buffer I/O error on dev dm-0, logical block 3, lost async page write [ 1618.875639] Buffer I/O error on dev dm-0, logical block 4, lost async page write [ 1618.894316] Buffer I/O error on dev dm-0, logical block 5, lost async page write [ 1618.894358] Buffer I/O error on dev dm-0, logical block 6, lost async page write [ 1618.894380] Buffer I/O error on dev dm-0, logical block 7, lost async page write [ 1618.894405] Buffer I/O error on dev dm-0, logical block 8, lost async page write [ 1618.894427] Buffer I/O error on dev dm-0, logical block 9, lost async page write
<snip>
Many I/O errors because the lower 8K device rejects sub-ubs/misaligned requests.
with a patch:
urezki@pc638:~/bin$ sudo mkfs.ext4 -F /dev/dm-0
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 2072576 4k blocks and 518144 inodes
Filesystem UUID: 9b54f44f-ef55-4bd4-9e40-c8b775a616ac
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
urezki@pc638:~/bin$ sudo mount /dev/dm-0 /mnt/ urezki@pc638:~/bin$ ls -al /mnt/ total 24 drwxr-xr-x 3 root root 4096 Oct 17 15:13 . drwxr-xr-x 19 root root 4096 Jul 10 19:42 .. drwx------ 2 root root 16384 Oct 17 15:13 lost+found urezki@pc638:~/bin$
After this change: mkfs completes; mount succeeds.
--- drivers/md/dm-ebs-target.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/dm-ebs-target.c +1 -1
@@ -101,7 +101,7 @@ static int __ebs_rw_bvec(struct ebs_c *e }else {flush_dcache_page (bv->bv_page);memcpy (ba, pa, cur_len); -dm_bufio_mark_partial_buffer_dirty (b, buf_off, buf_off + cur_len); +dm_bufio_mark_buffer_dirty (b); }dm_bufio_release (b);
Greg Kroah-Hartman
maintainerPATCH 319/451 fbdev: gbefb: fix to use physical address instead of dma address
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rene Rebe <[email protected]>
commit e3f44742bbb10537fe53d83d20dea2a7c167674d upstream.
While debuggigng why X would not start on mips64 Sgi/O2 I found the phys adress being off. Turns out the gbefb passed the internal dma_addr as phys. May be broken pre git history. Fix by converting dma_to_phys.
--- drivers/video/fbdev/gbefb.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/video/fbdev/gbefb.c +3 -2
@@ -12,6 +12,7 @@#include <linux/delay.h> #include <linux/platform_device.h> #include <linux/dma-mapping.h> +#include <linux/dma-direct.h> #include <linux/errno.h> #include <linux/gfp.h> #include <linux/fb.h>
@@ -65,7 +66,7 @@ struct gbefb_par {static unsigned int gbe_mem_size =CONFIG_FB_GBE_MEM *1024 *1024 ;static void *gbe_mem;static dma_addr_t gbe_dma_addr; -static unsigned long gbe_mem_phys; +static phys_addr_t gbe_mem_phys; static struct { uint16_t *cpu;
@@ -1189,7 +1190,7 @@ static int gbefb_probe(struct platform_d goto out_release_mem_region; } - gbe_mem_phys = (unsigned long ) gbe_dma_addr; + gbe_mem_phys =dma_to_phys (&p_dev->dev, gbe_dma_addr); } par = info->par;
Greg Kroah-Hartman
maintainerPATCH 320/451 fbdev: pxafb: Fix multiple clamped values in pxafb_adjust_timing
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thorsten Blum <[email protected]>
commit 0155e868cbc111846cc2809c1546ea53810a56ae upstream.
The variables were never clamped because the return value of clamp_val() was not used. Fix this by assigning the clamped values, and use clamp() instead of clamp_val().
--- drivers/video/fbdev/pxafb.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/video/fbdev/pxafb.c +6 -6
@@ -418,12 +418,12 @@ static int pxafb_adjust_timing(struct px var->yres =max_t (int, var->yres,MIN_YRES );if (!(fbi->lccr0 &LCCR0_LCDT )) { -clamp_val (var->hsync_len,1 ,64 ); -clamp_val (var->vsync_len,1 ,64 ); -clamp_val (var->left_margin,1 ,255 ); -clamp_val (var->right_margin,1 ,255 ); -clamp_val (var->upper_margin,1 ,255 ); -clamp_val (var->lower_margin,1 ,255 ); + var->hsync_len =clamp (var->hsync_len,1 ,64 ); + var->vsync_len =clamp (var->vsync_len,1 ,64 ); + var->left_margin =clamp (var->left_margin,1 ,255 ); + var->right_margin =clamp (var->right_margin,1 ,255 ); + var->upper_margin =clamp (var->upper_margin,1 ,255 ); + var->lower_margin =clamp (var->lower_margin,1 ,255 ); }/* make sure each line is aligned on word boundary */
Greg Kroah-Hartman
maintainerPATCH 321/451 fbdev: tcx.c fix mem_map to correct smem_start offset
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: René Rebe <[email protected]>
commit 35fa2b4bf96415b88d7edaa5cf8af5185d9ce76e upstream.
403ae52ac047 ("sparc: fix drivers/video/tcx.c warning") changed the physbase initializing breaking the user-space mmap, e.g. for Xorg entirely.
Fix fbdev mmap table so the sbus mmap helper work correctly, and not try to map vastly (physbase) offset memory.
--- drivers/video/fbdev/tcx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/fbdev/tcx.c +1 -1
@@ -436,7 +436,7 @@ static int tcx_probe(struct platform_dev j = i;break ; } - par->mmap_map[i].poff = op->resource[j].start; + par->mmap_map[i].poff = op->resource[j].start - info->fix.smem_start; } info->flags =FBINFO_DEFAULT ;
Greg Kroah-Hartman
maintainerPATCH 322/451 media: cec: Fix debugfs leak on bus_register() failure
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotian Zhang <[email protected]>
commit c43bcd2b2aa3c2ca9d2433c3990ecbc2c47d10eb upstream.
In cec_devnode_init(), the debugfs directory created with debugfs_create_dir() is not removed if bus_register() fails. This leaves a stale "cec" entry in debugfs and prevents proper module reloading.
Fix this by removing the debugfs directory in the error path.
--- drivers/media/cec/core/cec-core.c | 1 + 1 file changed, 1 insertion(+)
drivers/media/cec/core/cec-core.c +1 -0
@@ -433,6 +433,7 @@ static int __init cec_devnode_init(void) ret =bus_register (&cec_bus_type);if (ret <0 ) { +debugfs_remove_recursive (top_cec_dir);unregister_chrdev_region (cec_dev_t,CEC_NUM_DEVICES );pr_warn ("cec: bus_register failed\n" );return -EIO ;
Greg Kroah-Hartman
maintainerPATCH 323/451 media: msp3400: Avoid possible out-of-bounds array accesses in msp3400c_thread()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Abramov <[email protected]>
commit d2bceb2e20e783d57e739c71e4e50b4b9f4a3953 upstream.
It's possible for max1 to remain -1 if msp_read() always fail. This variable is further used as index for accessing arrays.
Fix that by checking max1 prior to array accesses.
It seems that restart is the preferable action in case of out-of-bounds value.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/media/i2c/msp3400-kthreads.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/i2c/msp3400-kthreads.c +2 -0
@@ -592,6 +592,8 @@ restart: "carrier2 val: %5d / %s\n", val, cd[i].name); } +if (max1 <0 || max1 >3 ) + goto restart;/* program the msp3400 according to the results */ state->main = msp3400c_carrier_detect_main[max1].cdo;switch (max1) {
Greg Kroah-Hartman
maintainerPATCH 324/451 media: TDA1997x: Remove redundant cancel_delayed_work in probe
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
commit 29de195ca39fc2ac0af6fd45522994df9f431f80 upstream.
The delayed_work delayed_work_enable_hpd is initialized with INIT_DELAYED_WORK(), but it is never scheduled in tda1997x_probe().
Calling cancel_delayed_work() on a work that has never been scheduled is redundant and unnecessary, as there is no pending work to cancel.
Remove the redundant cancel_delayed_work() from error handling path in tda1997x_probe() to avoid potential confusion.
--- drivers/media/i2c/tda1997x.c | 1 - 1 file changed, 1 deletion(-)
drivers/media/i2c/tda1997x.c +0 -1
@@ -2779,7 +2779,6 @@ err_free_media: err_free_handler:v4l2_ctrl_handler_free (&state->hdl); err_free_mutex: -cancel_delayed_work (&state->delayed_work_enable_hpd);mutex_destroy (&state->page_lock);mutex_destroy (&state->lock); err_free_state:
Re: [PATCH 5.10 324/451] media: TDA1997x: Remove redundant cancel_delayed_work in probe
Quoted 11 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
commit
29de195ca39fc2ac0af6fd45522994df9f431f80upstream.The
delayed_workdelayed_work_enable_hpdis initialized withINIT_DELAYED_WORK(), but it is never scheduled intda1997x_probe().
It seems like it can be scheduled as soon as the probe function calls v4l2_async_register_subdev().
Quoted 6 lines
Calling
cancel_delayed_work()on a work that has never been scheduled is redundant and unnecessary, as there is no pending work to cancel.Remove the redundant
cancel_delayed_work()from error handling path intda1997x_probe()to avoid potential confusion.
I don't believe this is redundant at all.
In any case, this doesn't seem to be a candidate for stable since a redundant cancel_delayed_work() is harmless.
Ben.
Quoted 21 lines
Fixes 9ac0038db9a7 ("media: i2c: Add TDA1997x HDMI receiver driver")Signed-off-by Duoming Zhou <[email protected]>Signed-off-by Hans Verkuil <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/media/i2c/tda1997x.c | 1 - 1 file changed, 1 deletion(-)drivers/media/i2c/tda1997x.c +0
-1@@ -2779,7 +2779,6 @@ err_free_media: err_free_handler:v4l2_ctrl_handler_free (&state->hdl); err_free_mutex: -cancel_delayed_work (&state->delayed_work_enable_hpd);mutex_destroy (&state->page_lock);mutex_destroy (&state->lock); err_free_state:
Signature · 2 lines
Ben Hutchings Larkinson's Law: All laws are basically false.
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 324/451] media: TDA1997x: Remove redundant cancel_delayed_work in probe
Quoted 20 lines · Ben Hutchings
Quoted 11 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
commit
29de195ca39fc2ac0af6fd45522994df9f431f80upstream.The
delayed_workdelayed_work_enable_hpdis initialized withINIT_DELAYED_WORK(), but it is never scheduled intda1997x_probe().It seems like it can be scheduled as soon as the probe function calls
v4l2_async_register_subdev().Quoted 4 lines
Calling
cancel_delayed_work()on a work that has never been scheduled is redundant and unnecessary, as there is no pending work to cancel.
Quoted 7 lines
Quoted 2 lines
Remove the redundant
cancel_delayed_work()from error handling path intda1997x_probe()to avoid potential confusion.I don't believe this is redundant at all.
In any case, this doesn't seem to be a candidate for stable since a redundant
cancel_delayed_work()is harmless.
Let's leave this as that's what is in Linus's tree, and the other stable releases.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 325/451 media: i2c: ADV7604: Remove redundant cancel_delayed_work in probe
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
commit 8f34f24355a607b98ecd9924837aab13c676eeca upstream.
The delayed_work delayed_work_enable_hotplug is initialized with INIT_DELAYED_WORK() in adv76xx_probe(), but it is never scheduled anywhere in the probe function.
Calling cancel_delayed_work() on a work that has never been scheduled is redundant and unnecessary, as there is no pending work to cancel.
Remove the redundant cancel_delayed_work() from error handling path and adjust the goto label accordingly to simplify the code and avoid potential confusion.
--- drivers/media/i2c/adv7604.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/media/i2c/adv7604.c +1 -3
@@ -3561,7 +3561,7 @@ static int adv76xx_probe(struct i2c_clie err =media_entity_pads_init (&sd->entity, state->source_pad +1 , state->pads);if (err) - goto err_work_queues; + goto err_i2c;/* Configure regmaps */ err =configure_regmaps (state);
@@ -3602,8 +3602,6 @@ static int adv76xx_probe(struct i2c_clie err_entity:media_entity_cleanup (&sd->entity); -err_work_queues: -cancel_delayed_work (&state->delayed_work_enable_hotplug); err_i2c:adv76xx_unregister_clients (state); err_hdl:
Greg Kroah-Hartman
maintainerPATCH 326/451 media: i2c: adv7842: Remove redundant cancel_delayed_work in probe
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
commit e66a5cc606c58e72f18f9cdd868a3672e918f9f8 upstream.
The delayed_work delayed_work_enable_hotplug is initialized with INIT_DELAYED_WORK() in adv7842_probe(), but it is never scheduled anywhere in the probe function.
Calling cancel_delayed_work() on a work that has never been scheduled is redundant and unnecessary, as there is no pending work to cancel.
Remove the redundant cancel_delayed_work() from error handling path and adjust the goto label accordingly to simplify the code and avoid potential confusion.
--- drivers/media/i2c/adv7842.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/media/i2c/adv7842.c +1 -3
@@ -3552,7 +3552,7 @@ static int adv7842_probe(struct i2c_clie state->pad.flags =MEDIA_PAD_FL_SOURCE ; err =media_entity_pads_init (&sd->entity,1 , &state->pad);if (err) - goto err_work_queues; + goto err_i2c; err =adv7842_core_init (sd);if (err)
@@ -3573,8 +3573,6 @@ static int adv7842_probe(struct i2c_clie err_entity:media_entity_cleanup (&sd->entity); -err_work_queues: -cancel_delayed_work (&state->delayed_work_enable_hotplug); err_i2c:adv7842_unregister_clients (sd); err_hdl:
Re: [PATCH 5.10 326/451] media: i2c: adv7842: Remove redundant cancel_delayed_work in probe
Quoted 12 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
commit
e66a5cc606c58e72f18f9cdd868a3672e918f9f8upstream.The
delayed_workdelayed_work_enable_hotplugis initialized withINIT_DELAYED_WORK()inadv7842_probe(), but it is never scheduled anywhere in the probe function.
Quoted 7 lines
Calling
cancel_delayed_work()on a work that has never been scheduled is redundant and unnecessary, as there is no pending work to cancel.Remove the redundant
cancel_delayed_work()from error handling path and adjust the goto label accordingly to simplify the code and avoid potential confusion.
I think this may have the same problem as #324, though I can't see exactly at what point the subdev is registered.
Ben.
Quoted 31 lines
Fixes a89bcd4c6c20 ("[media] adv7842: add new video decoder driver")Signed-off-by Duoming Zhou <[email protected]>Signed-off-by Hans Verkuil <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/media/i2c/adv7842.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)drivers/media/i2c/adv7842.c +1
-3@@ -3552,7 +3552,7 @@ static int adv7842_probe(struct i2c_clie state->pad.flags =MEDIA_PAD_FL_SOURCE ; err =media_entity_pads_init (&sd->entity,1 , &state->pad);if (err) - goto err_work_queues; + goto err_i2c; err =adv7842_core_init (sd);if (err)@@ -3573,8 +3573,6 @@ static int adv7842_probe(struct i2c_clie err_entity:media_entity_cleanup (&sd->entity); -err_work_queues: -cancel_delayed_work (&state->delayed_work_enable_hotplug); err_i2c:adv7842_unregister_clients (sd); err_hdl:
Signature · 2 lines
Ben Hutchings Larkinson's Law: All laws are basically false.
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 326/451] media: i2c: adv7842: Remove redundant cancel_delayed_work in probe
Quoted 17 lines · Ben Hutchings
Quoted 16 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
commit
e66a5cc606c58e72f18f9cdd868a3672e918f9f8upstream.The
delayed_workdelayed_work_enable_hotplugis initialized withINIT_DELAYED_WORK()inadv7842_probe(), but it is never scheduled anywhere in the probe function.Calling
cancel_delayed_work()on a work that has never been scheduled is redundant and unnecessary, as there is no pending work to cancel.
Quoted 6 lines
Quoted 3 lines
Remove the redundant
cancel_delayed_work()from error handling path and adjust the goto label accordingly to simplify the code and avoid potential confusion.I think this may have the same problem as #324, though I can't see exactly at what point the subdev is registered.
Again, I'll leave this for now, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 327/451 idr: fix idr_alloc() returning an ID out of range
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox (Oracle) <[email protected]>
commit c6e8e595a0798ad67da0f7bebaf69c31ef70dfff upstream.
If you use an IDR with a non-zero base, and specify a range that lies entirely below the base, 'max - base' becomes very large and idr_get_free() can return an ID that lies outside of the requested range.
--- lib/idr.c | 2 ++ tools/testing/radix-tree/idr-test.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+)
lib/idr.c +2 -0
@@ -40,6 +40,8 @@ int idr_alloc_u32(struct idr *idr, voidif (WARN_ON_ONCE (!(idr->idr_rt.xa_flags &ROOT_IS_IDR ))) idr->idr_rt.xa_flags |=IDR_RT_MARKER ; +if (max < base) +return -ENOSPC ; id = (id < base) ?0 : id - base;radix_tree_iter_init (&iter, id);
tools/testing/radix-tree/idr-test.c +21 -0
@@ -57,6 +57,26 @@ void idr_alloc_test(void)idr_destroy (&idr); } +void idr_alloc2_test (void ) +{ +int id; +struct idr idr =IDR_INIT_BASE (idr,1 ); + + id =idr_alloc (&idr, idr_alloc2_test,0 ,1 ,GFP_KERNEL ); +assert (id == -ENOSPC ); + + id =idr_alloc (&idr, idr_alloc2_test,1 ,2 ,GFP_KERNEL ); +assert (id ==1 ); + + id =idr_alloc (&idr, idr_alloc2_test,0 ,1 ,GFP_KERNEL ); +assert (id == -ENOSPC ); + + id =idr_alloc (&idr, idr_alloc2_test,0 ,2 ,GFP_KERNEL ); +assert (id == -ENOSPC ); + +idr_destroy (&idr); +} +void idr_replace_test (void ) {DEFINE_IDR (idr);
@@ -400,6 +420,7 @@ void idr_checks(void)idr_replace_test ();idr_alloc_test (); +idr_alloc2_test ();idr_null_test ();idr_nowait_test ();idr_get_next_test (0 );
Greg Kroah-Hartman
maintainerPATCH 328/451 RDMA/core: Check for the presence of LS_NLA_TYPE_DGID correctly
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
commit a7b8e876e0ef0232b8076972c57ce9a7286b47ca upstream.
The netlink response for RDMA_NL_LS_OP_IP_RESOLVE should always have a LS_NLA_TYPE_DGID attribute, it is invalid if it does not.
Use the nl parsing logic properly and call nla_parse_deprecated() to fill the nlattrs array and then directly index that array to get the data for the DGID. Just fail if it is NULL.
Remove the for loop searching for the nla, and squash the validation and parsing into one function.
Fixes an uninitialized read from the stack triggered by userspace if it does not provide the DGID to a kernel initiated RDMA_NL_LS_OP_IP_RESOLVE query.
BUG: KMSAN: uninit-value in hex_byte_pack include/linux/hex.h:13 [inline]
BUG: KMSAN: uninit-value in ip6_string+0xef4/0x13a0 lib/vsprintf.c:1490
hex_byte_pack include/linux/hex.h:13 [inline]
ip6_string+0xef4/0x13a0 lib/vsprintf.c:1490
ip6_addr_string+0x18a/0x3e0 lib/vsprintf.c:1509
ip_addr_string+0x245/0xee0 lib/vsprintf.c:1633
pointer+0xc09/0x1bd0 lib/vsprintf.c:2542
vsnprintf+0xf8a/0x1bd0 lib/vsprintf.c:2930
vprintk_store+0x3ae/0x1530 kernel/printk/printk.c:2279
vprintk_emit+0x307/0xcd0 kernel/printk/printk.c:2426
vprintk_default+0x3f/0x50 kernel/printk/printk.c:2465
vprintk+0x36/0x50 kernel/printk/printk_safe.c:82
_printk+0x17e/0x1b0 kernel/printk/printk.c:2475
ib_nl_process_good_ip_rsep drivers/infiniband/core/addr.c:128 [inline]
ib_nl_handle_ip_res_resp+0x963/0x9d0 drivers/infiniband/core/addr.c:141
rdma_nl_rcv_msg drivers/infiniband/core/netlink.c:-1 [inline]
rdma_nl_rcv_skb drivers/infiniband/core/netlink.c:239 [inline]
rdma_nl_rcv+0xefa/0x11c0 drivers/infiniband/core/netlink.c:259
netlink_unicast_kernel net/netlink/af_netlink.c:1320 [inline]
netlink_unicast+0xf04/0x12b0 net/netlink/af_netlink.c:1346
netlink_sendmsg+0x10b3/0x1250 net/netlink/af_netlink.c:1896
sock_sendmsg_nosec net/socket.c:714 [inline]
__sock_sendmsg+0x333/0x3d0 net/socket.c:729
____sys_sendmsg+0x7e0/0xd80 net/socket.c:2617
___sys_sendmsg+0x271/0x3b0 net/socket.c:2671
__sys_sendmsg+0x1aa/0x300 net/socket.c:2703
__compat_sys_sendmsg net/compat.c:346 [inline]
__do_compat_sys_sendmsg net/compat.c:353 [inline]
__se_compat_sys_sendmsg net/compat.c:350 [inline]
__ia32_compat_sys_sendmsg+0xa4/0x100 net/compat.c:350
ia32_sys_call+0x3f6c/0x4310 arch/x86/include/generated/asm/syscalls_32.h:371
do_syscall_32_irqs_on arch/x86/entry/syscall_32.c:83 [inline]
__do_fast_syscall_32+0xb0/0x150 arch/x86/entry/syscall_32.c:306
do_fast_syscall_32+0x38/0x80 arch/x86/entry/syscall_32.c:331
do_SYSENTER_32+0x1f/0x30 arch/x86/entry/syscall_32.c:3--- drivers/infiniband/core/addr.c | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-)
drivers/infiniband/core/addr.c +10 -23
@@ -81,37 +81,25 @@ static const struct nla_policy ib_nl_add .min = sizeof(struct rdma_nla_ls_gid)}, }; -static inline bool ib_nl_is_good_ip_resp (const struct nlmsghdr *nlh) +static void ib_nl_process_ip_rsep (const struct nlmsghdr *nlh) {struct nlattr *tb[LS_NLA_TYPE_MAX ] = {}; +union ib_gid gid; +struct addr_req *req; +int found =0 ;int ret;if (nlh->nlmsg_flags &RDMA_NL_LS_F_ERR ) -return false; +return ; ret =nla_parse_deprecated (tb,LS_NLA_TYPE_MAX -1 ,nlmsg_data (nlh),nlmsg_len (nlh), ib_nl_addr_policy,NULL );if (ret) -return false; - -return true; -} - -static void ib_nl_process_good_ip_rsep (const struct nlmsghdr *nlh) -{ -const struct nlattr *head, *curr; -union ib_gid gid; -struct addr_req *req; -int len, rem; -int found =0 ; - - head = (const struct nlattr *)nlmsg_data (nlh); - len =nlmsg_len (nlh); +return ; -nla_for_each_attr (curr, head, len, rem) { -if (curr->nla_type ==LS_NLA_TYPE_DGID ) -memcpy (&gid,nla_data (curr),nla_len (curr)); - } +if (!tb[LS_NLA_TYPE_DGID ]) +return ; +memcpy (&gid,nla_data (tb[LS_NLA_TYPE_DGID ]),sizeof (gid));spin_lock_bh (&lock);list_for_each_entry (req, &req_list, list) {
@@ -138,8 +126,7 @@ int ib_nl_handle_ip_res_resp(struct sk_b !(NETLINK_CB(skb).sk))return -EPERM ; -if (ib_nl_is_good_ip_resp (nlh)) -ib_nl_process_good_ip_rsep (nlh); +ib_nl_process_ip_rsep (nlh);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 329/451 RDMA/cm: Fix leaking the multicast GID table reference
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
commit 57f3cb6c84159d12ba343574df2115fb18dd83ca upstream.
If the CM ID is destroyed while the CM event for multicast creating is still queued the cancel_work_sync() will prevent the work from running which also prevents destroying the ah_attr. This leaks a refcount and triggers a WARN:
GID entry ref leak for dev syz1 index 2 ref=573
WARNING: CPU: 1 PID: 655 at drivers/infiniband/core/cache.c:809 release_gid_table drivers/infiniband/core/cache.c:806 [inline] WARNING: CPU: 1 PID: 655 at drivers/infiniband/core/cache.c:809 gid_table_release_one+0x284/0x3cc drivers/infiniband/core/cache.c:886
Destroy the ah_attr after canceling the work, it is safe to call this twice.
--- drivers/infiniband/core/cma.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/infiniband/core/cma.c +3 -0
@@ -1840,6 +1840,7 @@ static void destroy_mc(struct rdma_id_prib_sa_free_multicast (mc->sa_mc);if (rdma_protocol_roce (id_priv->id.device, id_priv->id.port_num)) { +struct rdma_cm_event *event = &mc->iboe_join.event;struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;struct net_device *ndev =NULL ;
@@ -1862,6 +1863,8 @@ static void destroy_mc(struct rdma_id_prdev_put (ndev);cancel_work_sync (&mc->iboe_join.work); +if (event->event ==RDMA_CM_EVENT_MULTICAST_JOIN ) +rdma_destroy_ah_attr (&event->param.ud.ah_attr); }kfree (mc); }
Greg Kroah-Hartman
maintainerPATCH 330/451 e1000: fix OOB in e1000_tbi_should_accept()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guangshuo Li <[email protected]>
commit 9c72a5182ed92904d01057f208c390a303f00a0f upstream.
In e1000_tbi_should_accept() we read the last byte of the frame via 'data[length - 1]' to evaluate the TBI workaround. If the descriptor- reported length is zero or larger than the actual RX buffer size, this read goes out of bounds and can hit unrelated slab objects. The issue is observed from the NAPI receive path (e1000_clean_rx_irq):
==================================================================
BUG: KASAN: slab-out-of-bounds in e1000_tbi_should_accept+0x610/0x790 Read of size 1 at addr ffff888014114e54 by task sshd/363 CPU: 0 PID: 363 Comm: sshd Not tainted 5.18.0-rc1 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014 Call Trace: <IRQ> dump_stack_lvl+0x5a/0x74 print_address_description+0x7b/0x440 print_report+0x101/0x200 kasan_report+0xc1/0xf0 e1000_tbi_should_accept+0x610/0x790 e1000_clean_rx_irq+0xa8c/0x1110 e1000_clean+0xde2/0x3c10 __napi_poll+0x98/0x380 net_rx_action+0x491/0xa20 __do_softirq+0x2c9/0x61d do_softirq+0xd1/0x120 </IRQ> <TASK> __local_bh_enable_ip+0xfe/0x130 ip_finish_output2+0x7d5/0xb00 __ip_queue_xmit+0xe24/0x1ab0 __tcp_transmit_skb+0x1bcb/0x3340 tcp_write_xmit+0x175d/0x6bd0 __tcp_push_pending_frames+0x7b/0x280 tcp_sendmsg_locked+0x2e4f/0x32d0 tcp_sendmsg+0x24/0x40 sock_write_iter+0x322/0x430 vfs_write+0x56c/0xa60 ksys_write+0xd1/0x190 do_syscall_64+0x43/0x90 entry_SYSCALL_64_after_hwframe+0x44/0xae RIP: 0033:0x7f511b476b10 Code: 73 01 c3 48 8b 0d 88 d3 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 0f 1f 44 00 00 83 3d f9 2b 2c 00 00 75 10 b8 01 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 31 c3 48 83 ec 08 e8 8e 9b 01 00 48 89 04 24 RSP: 002b:00007ffc9211d4e8 EFLAGS: 00000246 ORIG_RAX: 0000000000000001 RAX: ffffffffffffffda RBX: 0000000000004024 RCX: 00007f511b476b10 RDX: 0000000000004024 RSI: 0000559a9385962c RDI: 0000000000000003 RBP: 0000559a9383a400 R08: fffffffffffffff0 R09: 0000000000004f00 R10: 0000000000000070 R11: 0000000000000246 R12: 0000000000000000 R13: 00007ffc9211d57f R14: 0000559a9347bde7 R15: 0000000000000003 </TASK> Allocated by task 1: __kasan_krealloc+0x131/0x1c0 krealloc+0x90/0xc0 add_sysfs_param+0xcb/0x8a0 kernel_add_sysfs_param+0x81/0xd4 param_sysfs_builtin+0x138/0x1a6 param_sysfs_init+0x57/0x5b do_one_initcall+0x104/0x250 do_initcall_level+0x102/0x132 do_initcalls+0x46/0x74 kernel_init_freeable+0x28f/0x393 kernel_init+0x14/0x1a0 ret_from_fork+0x22/0x30 The buggy address belongs to the object at ffff888014114000 which belongs to the cache kmalloc-2k of size 2048 The buggy address is located 1620 bytes to the right of 2048-byte region [ffff888014114000, ffff888014114800] The buggy address belongs to the physical page: page:ffffea0000504400 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x14110 head:ffffea0000504400 order:3 compound_mapcount:0 compound_pincount:0 flags: 0x100000000010200(slab|head|node=0|zone=1) raw: 0100000000010200 0000000000000000 dead000000000001 ffff888013442000 raw: 0000000000000000 0000000000080008 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected ==================================================================
This happens because the TBI check unconditionally dereferences the last byte without validating the reported length first:
u8 last_byte = *(data + length - 1);
Fix by rejecting the frame early if the length is zero, or if it exceeds adapter->rx_buffer_len. This preserves the TBI workaround semantics for valid frames and prevents touching memory beyond the RX buffer.
--- drivers/net/ethernet/intel/e1000/e1000_main.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/e1000/e1000_main.c +9 -1
@@ -4090,7 +4090,15 @@ static bool e1000_tbi_should_accept(stru u32 length, const u8 *data) { struct e1000_hw *hw = &adapter->hw; -u8 last_byte = *(data + length -1 ); +u8 last_byte; + +/* Guard against OOB on data[length - 1] */ +if (unlikely (!length)) +return false; +/* Upper bound: length must not exceed rx_buffer_len */ +if (unlikely (length > adapter->rx_buffer_len)) +return false; + last_byte = *(data + length -1 );if (TBI_ACCEPT (hw, status, errors, length, last_byte)) {unsigned long irq_flags;
Greg Kroah-Hartman
maintainerPATCH 331/451 fjes: Add missing iounmap in fjes_hw_init()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haoxiang Li <[email protected]>
commit 15ef641a0c6728d25a400df73922e80ab2cf029c upstream.
In error paths, add fjes_hw_iounmap() to release the resource acquired by fjes_hw_iomap(). Add a goto label to do so.
--- drivers/net/fjes/fjes_hw.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/net/fjes/fjes_hw.c +9 -3
@@ -333,7 +333,7 @@ int fjes_hw_init(struct fjes_hw *hw) ret =fjes_hw_reset (hw);if (ret) -return ret; + goto err_iounmap;fjes_hw_set_irqmask (hw,REG_ICTL_MASK_ALL , true);
@@ -346,8 +346,10 @@ int fjes_hw_init(struct fjes_hw *hw) hw->max_epid =fjes_hw_get_max_epid (hw); hw->my_epid =fjes_hw_get_my_epid (hw); -if ((hw->max_epid ==0 ) || (hw->my_epid >= hw->max_epid)) -return -ENXIO ; +if ((hw->max_epid ==0 ) || (hw->my_epid >= hw->max_epid)) { + ret = -ENXIO ; + goto err_iounmap; + } ret =fjes_hw_setup (hw);
@@ -355,6 +357,10 @@ int fjes_hw_init(struct fjes_hw *hw) hw->hw_info.trace_size =FJES_DEBUG_BUFFER_SIZE ;return ret; + +err_iounmap: +fjes_hw_iounmap (hw); +return ret; }void fjes_hw_exit (struct fjes_hw *hw)
Greg Kroah-Hartman
maintainerPATCH 332/451 nfsd: Drop the client reference in client_states_open()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haoxiang Li <[email protected]>
commit 1f941b2c23fd34c6f3b76d36f9d0a2528fa92b8f upstream.
In error path, call drop_client() to drop the reference obtained by get_nfsdfs_clp().
--- fs/nfsd/nfs4state.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/nfsd/nfs4state.c +3 -1
@@ -2802,8 +2802,10 @@ static int client_states_open(struct inoreturn -ENXIO ; ret =seq_open (file, &states_seq_ops); -if (ret) +if (ret) { +drop_client (clp);return ret; + } s = file->private_data; s->private = clp;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 333/451 net: usb: sr9700: fix incorrect command used to write single register
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ethan Nelson-Moore <[email protected]>
commit fa0b198be1c6775bc7804731a43be5d899d19e7a upstream.
This fixes the device failing to initialize with "error reading MAC address" for me, probably because the incorrect write of NCR_RST to SR_NCR is not actually resetting the device.
--- drivers/net/usb/sr9700.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/usb/sr9700.c +2 -2
@@ -52,7 +52,7 @@ static int sr_read_reg(struct usbnet *destatic int sr_write_reg (struct usbnet *dev,u8 reg,u8 value) { -return usbnet_write_cmd (dev,SR_WR_REGS ,SR_REQ_WR_REG , +return usbnet_write_cmd (dev,SR_WR_REG ,SR_REQ_WR_REG , value, reg,NULL ,0 ); }
@@ -64,7 +64,7 @@ static void sr_write_async(struct usbnetstatic void sr_write_reg_async (struct usbnet *dev,u8 reg,u8 value) { -usbnet_write_cmd_async (dev,SR_WR_REGS ,SR_REQ_WR_REG , +usbnet_write_cmd_async (dev,SR_WR_REG ,SR_REQ_WR_REG , value, reg,NULL ,0 ); }
Greg Kroah-Hartman
maintainerPATCH 334/451 net: nfc: fix deadlock between nfc_unregister_device and rfkill_fop_write
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Deepanshu Kartikey <[email protected]>
commit 1ab526d97a57e44d26fadcc0e9adeb9c0c0182f5 upstream.
A deadlock can occur between nfc_unregister_device() and rfkill_fop_write() due to lock ordering inversion between device_lock and rfkill_global_mutex.
The problematic lock order is:
Thread A (rfkill_fop_write):
rfkill_fop_write()
mutex_lock(&rfkill_global_mutex)
rfkill_set_block()
nfc_rfkill_set_block()
nfc_dev_down()
device_lock(&dev->dev) <- waits for device_lockThread B (nfc_unregister_device):
nfc_unregister_device()
device_lock(&dev->dev)
rfkill_unregister()
mutex_lock(&rfkill_global_mutex) <- waits for rfkill_global_mutex
This creates a classic ABBA deadlock scenario.
Fix this by moving rfkill_unregister() and rfkill_destroy() outside the device_lock critical section. Store the rfkill pointer in a local variable before releasing the lock, then call rfkill_unregister() after releasing device_lock.
This change is safe because rfkill_fop_write() holds rfkill_global_mutex while calling the rfkill callbacks, and rfkill_unregister() also acquires rfkill_global_mutex before cleanup. Therefore, rfkill_unregister() will wait for any ongoing callback to complete before proceeding, and device_del() is only called after rfkill_unregister() returns, preventing any use-after-free.
The similar lock ordering in nfc_register_device() (device_lock -> rfkill_global_mutex via rfkill_register) is safe because during registration the device is not yet in rfkill_list, so no concurrent rfkill operations can occur on this device.
--- net/nfc/core.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
net/nfc/core.c +7 -2
@@ -1146,6 +1146,7 @@ EXPORT_SYMBOL(nfc_register_device);void nfc_unregister_device (struct nfc_dev *dev) {int rc; +struct rfkill *rfk =NULL ;pr_debug ("dev_name=%s\n" ,dev_name (&dev->dev));
@@ -1156,13 +1157,17 @@ void nfc_unregister_device(struct nfc_dedevice_lock (&dev->dev);if (dev->rfkill) { -rfkill_unregister (dev->rfkill); -rfkill_destroy (dev->rfkill); + rfk = dev->rfkill; dev->rfkill =NULL ; } dev->shutting_down = true;device_unlock (&dev->dev); +if (rfk) { +rfkill_unregister (rfk); +rfkill_destroy (rfk); + } +if (dev->ops->check_presence) {del_timer_sync (&dev->check_pres_timer);cancel_work_sync (&dev->check_pres_work);
Greg Kroah-Hartman
maintainerPATCH 335/451 net: macb: Relocate mog_init_rings() callback from macb_mac_link_up() to macb_open()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaolei Wang <[email protected]>
commit 99537d5c476cada9cf75aef9fa75579a31faadb9 upstream.
In the non-RT kernel, local_bh_disable() merely disables preemption, whereas it maps to an actual spin lock in the RT kernel. Consequently, when attempting to refill RX buffers via netdev_alloc_skb() in macb_mac_link_up(), a deadlock scenario arises as follows:
WARNING: possible circular locking dependency detected 6.18.0-08691-g2061f18ad76e #39 Not tainted
------------------------------------------------------
kworker/0:0/8 is trying to acquire lock:
ffff00080369bbe0 (&bp->lock){+.+.}-{3:3}, at: macb_start_xmit+0x808/0xb7c
but task is already holding lock:
ffff000803698e58 (&queue->tx_ptr_lock){+...}-{3:3}, at: macb_start_xmit +0x148/0xb7c
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #3 (&queue->tx_ptr_lock){+...}-{3:3}:
rt_spin_lock+0x50/0x1f0
macb_start_xmit+0x148/0xb7c
dev_hard_start_xmit+0x94/0x284
sch_direct_xmit+0x8c/0x37c
__dev_queue_xmit+0x708/0x1120
neigh_resolve_output+0x148/0x28c
ip6_finish_output2+0x2c0/0xb2c
__ip6_finish_output+0x114/0x308
ip6_output+0xc4/0x4a4
mld_sendpack+0x220/0x68c
mld_ifc_work+0x2a8/0x4f4
process_one_work+0x20c/0x5f8
worker_thread+0x1b0/0x35c
kthread+0x144/0x200
ret_from_fork+0x10/0x20-> #2 (_xmit_ETHER#2){+...}-{3:3}:
rt_spin_lock+0x50/0x1f0
sch_direct_xmit+0x11c/0x37c
__dev_queue_xmit+0x708/0x1120
neigh_resolve_output+0x148/0x28c
ip6_finish_output2+0x2c0/0xb2c
__ip6_finish_output+0x114/0x308
ip6_output+0xc4/0x4a4
mld_sendpack+0x220/0x68c
mld_ifc_work+0x2a8/0x4f4
process_one_work+0x20c/0x5f8
worker_thread+0x1b0/0x35c
kthread+0x144/0x200
ret_from_fork+0x10/0x20-> #1 ((softirq_ctrl.lock)){+.+.}-{3:3}:
lock_release+0x250/0x348
__local_bh_enable_ip+0x7c/0x240
__netdev_alloc_skb+0x1b4/0x1d8
gem_rx_refill+0xdc/0x240
gem_init_rings+0xb4/0x108
macb_mac_link_up+0x9c/0x2b4
phylink_resolve+0x170/0x614
process_one_work+0x20c/0x5f8
worker_thread+0x1b0/0x35c
kthread+0x144/0x200
ret_from_fork+0x10/0x20-> #0 (&bp->lock){+.+.}-{3:3}:
__lock_acquire+0x15a8/0x2084
lock_acquire+0x1cc/0x350
rt_spin_lock+0x50/0x1f0
macb_start_xmit+0x808/0xb7c
dev_hard_start_xmit+0x94/0x284
sch_direct_xmit+0x8c/0x37c
__dev_queue_xmit+0x708/0x1120
neigh_resolve_output+0x148/0x28c
ip6_finish_output2+0x2c0/0xb2c
__ip6_finish_output+0x114/0x308
ip6_output+0xc4/0x4a4
mld_sendpack+0x220/0x68c
mld_ifc_work+0x2a8/0x4f4
process_one_work+0x20c/0x5f8
worker_thread+0x1b0/0x35c
kthread+0x144/0x200
ret_from_fork+0x10/0x20other info that might help us debug this:
Chain exists of:
&bp->lock --> _xmit_ETHER#2 --> &queue->tx_ptr_lock
Possible unsafe locking scenario: CPU0 CPU1
---- ----
lock(&queue->tx_ptr_lock);
lock(_xmit_ETHER#2);
lock(&queue->tx_ptr_lock);
lock(&bp->lock);
*** DEADLOCK *** Call trace:
show_stack+0x18/0x24 (C)
dump_stack_lvl+0xa0/0xf0
dump_stack+0x18/0x24
print_circular_bug+0x28c/0x370
check_noncircular+0x198/0x1ac
__lock_acquire+0x15a8/0x2084
lock_acquire+0x1cc/0x350
rt_spin_lock+0x50/0x1f0
macb_start_xmit+0x808/0xb7c
dev_hard_start_xmit+0x94/0x284
sch_direct_xmit+0x8c/0x37c
__dev_queue_xmit+0x708/0x1120
neigh_resolve_output+0x148/0x28c
ip6_finish_output2+0x2c0/0xb2c
__ip6_finish_output+0x114/0x308
ip6_output+0xc4/0x4a4
mld_sendpack+0x220/0x68c
mld_ifc_work+0x2a8/0x4f4
process_one_work+0x20c/0x5f8
worker_thread+0x1b0/0x35c
kthread+0x144/0x200
ret_from_fork+0x10/0x20Notably, invoking the mog_init_rings() callback upon link establishment is unnecessary. Instead, we can exclusively call mog_init_rings() within the ndo_open() callback. This adjustment resolves the deadlock issue. Furthermore, since MACB_CAPS_MACB_IS_EMAC cases do not use mog_init_rings() when opening the network interface via at91ether_open(), moving mog_init_rings() to macb_open() also eliminates the MACB_CAPS_MACB_IS_EMAC check.
--- drivers/net/ethernet/cadence/macb_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/cadence/macb_main.c +2 -1
@@ -654,7 +654,6 @@ static void macb_mac_link_up(struct phyl/* Initialize rings & buffers as clearing MACB_BIT(TE) in link down * cleared the pipeline and control registers. */ - bp->macbgem_ops.mog_init_rings (bp);macb_init_buffers (bp);for (q =0 , queue = bp->queues; q < bp->num_queues; ++q, ++queue)
@@ -2287,6 +2286,8 @@ static void gem_init_rings(struct macb *unsigned int q;int i; + bp->macbgem_ops.mog_init_rings (bp); +for (q =0 , queue = bp->queues; q < bp->num_queues; ++q, ++queue) {for (i =0 ; i < bp->tx_ring_size; i++) { desc =macb_tx_desc (queue, i);
Re: [PATCH 5.10 335/451] net: macb: Relocate mog_init_rings() callback from macb_mac_link_up() to macb_open()
Quoted 7 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaolei Wang <[email protected]>
commit
99537d5c476cada9cf75aef9fa75579a31faadb9upstream.
[...]
Quoted 11 lines
drivers/net/ethernet/cadence/macb_main.c +0
-1@@ -654,7 +654,6 @@ static void macb_mac_link_up(struct phyl/* Initialize rings & buffers as clearing MACB_BIT(TE) in link down * cleared the pipeline and control registers. */ - bp->macbgem_ops.mog_init_rings (bp);macb_init_buffers (bp);for (q =0 , queue = bp->queues; q < bp->num_queues; ++q, ++queue)
drivers/net/ethernet/cadence/macb_main.c static void gem_init_rings(struct macb * · line 2290
Quoted 5 lines
drivers/net/ethernet/cadence/macb_main.c +2
-0@@ -2287,6 +2286,8 @@ static void gem_init_rings(struct macb *unsigned int q;int i; + bp->macbgem_ops.mog_init_rings (bp); +
This is in the wrong function; it needs to be inserted in macb_open() as in the upstream version.
Ben.
Quoted 5 lines
drivers/net/ethernet/cadence/macb_main.c +0
-0for (q =0 , queue = bp->queues; q < bp->num_queues; ++q, ++queue) {for (i =0 ; i < bp->tx_ring_size; i++) { desc =macb_tx_desc (queue, i);
Signature · 2 lines
Ben Hutchings Larkinson's Law: All laws are basically false.
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 335/451] net: macb: Relocate mog_init_rings() callback from macb_mac_link_up() to macb_open()
Quoted 23 lines · Ben Hutchings
Quoted 7 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaolei Wang <[email protected]>
commit
99537d5c476cada9cf75aef9fa75579a31faadb9upstream.[...]
Quoted 14 lines
drivers/net/ethernet/cadence/macb_main.c +0
-1@@ -654,7 +654,6 @@ static void macb_mac_link_up(struct phyl/* Initialize rings & buffers as clearing MACB_BIT(TE) in link down * cleared the pipeline and control registers. */ - bp->macbgem_ops.mog_init_rings (bp);macb_init_buffers (bp);for (q =0 , queue = bp->queues; q < bp->num_queues; ++q, ++queue)@@ -2287,6 +2286,8 @@ static void gem_init_rings(struct macb *unsigned int q;int i;
Quoted 5 lines
drivers/net/ethernet/cadence/macb_main.c static void gem_init_rings(struct macb * · line 2290
Quoted 2 lines
drivers/net/ethernet/cadence/macb_main.c +2
-0+ bp->macbgem_ops.mog_init_rings (bp); +This is in the wrong function; it needs to be inserted in
macb_open()as in the upstream version.
Now dropped.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 336/451 drm/msm/a6xx: Fix out of bound IO access in a6xx_get_gmu_registers
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
commit 779b68a5bf2764c8ed3aa800e41ba0d5d007e1e7 upstream.
REG_A6XX_GMU_AO_AHB_FENCE_CTRL register falls under GMU's register range. So, use gmu_write() routines to write to this register.
Patchwork: https://patchwork.freedesktop.org/patch/688993/
Message-ID: <[email protected]>
--- drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c +1 -1
@@ -794,7 +794,7 @@ static void a6xx_get_gmu_registers(strucreturn ;/* Set the fence to ALLOW mode so we can access the registers */ -gpu_write (gpu,REG_A6XX_GMU_AO_AHB_FENCE_CTRL ,0 ); +gmu_write (&a6xx_gpu->gmu,REG_A6XX_GMU_AO_AHB_FENCE_CTRL ,0 );_a6xx_get_gmu_registers (gpu, a6xx_state, &a6xx_gmu_reglist[2 ], &a6xx_state->gmu_registers[2 ], false);
Greg Kroah-Hartman
maintainerPATCH 337/451 drm/nouveau/dispnv50: Dont call drm_atomic_get_crtc_state() in prepare_fb
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lyude Paul <[email protected]>
commit 560271e10b2c86e95ea35afa9e79822e4847f07a upstream.
Since we recently started warning about uses of this function after the atomic check phase completes, we've started getting warnings about this in nouveau. It appears a misplaced drm_atomic_get_crtc_state() call has been hiding in our .prepare_fb callback for a while.
So, fix this by adding a new nv50_head_atom_get_new() function and use that in our .prepare_fb callback instead.
--- drivers/gpu/drm/nouveau/dispnv50/atom.h | 13 +++++++++++++ drivers/gpu/drm/nouveau/dispnv50/wndw.c | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-)
drivers/gpu/drm/nouveau/dispnv50/atom.h +13 -0
@@ -152,8 +152,21 @@ static inline struct nv50_head_atom * nv50_head_atom_get(struct drm_atomic_state *state, struct drm_crtc *crtc) { struct drm_crtc_state *statec = drm_atomic_get_crtc_state(state, crtc); +if (IS_ERR (statec))return (void *)statec; + +return nv50_head_atom (statec); +} + +static inline struct nv50_head_atom * +nv50_head_atom_get_new (struct drm_atomic_state *state,struct drm_crtc *crtc) +{ +struct drm_crtc_state *statec =drm_atomic_get_new_crtc_state (state, crtc); + +if (!statec) +return NULL ; +return nv50_head_atom (statec); }
drivers/gpu/drm/nouveau/dispnv50/wndw.c +1 -1
@@ -561,7 +561,7 @@ nv50_wndw_prepare_fb(struct drm_plane *p asyw->image.offset[0 ] = nvbo->offset;if (wndw->func->prepare) { - asyh =nv50_head_atom_get (asyw->state.state, asyw->state.crtc); + asyh =nv50_head_atom_get_new (asyw->state.state, asyw->state.crtc);if (IS_ERR (asyh))return PTR_ERR (asyh);
Re: [PATCH 5.10 337/451] drm/nouveau/dispnv50: Dont call drm_atomic_get_crtc_state() in prepare_fb
Quoted 15 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lyude Paul <[email protected]>
commit
560271e10b2c86e95ea35afa9e79822e4847f07aupstream.Since we recently started warning about uses of this function after the atomic check phase completes, we've started getting warnings about this in nouveau. It appears a misplaced
drm_atomic_get_crtc_state()call has been hiding in our .prepare_fb callback for a while.So, fix this by adding a new
nv50_head_atom_get_new()function and use that in our .prepare_fb callback instead.
[...]
Quoted 14 lines
drivers/gpu/drm/nouveau/dispnv50/atom.h +8
-0+static inline struct nv50_head_atom * +nv50_head_atom_get_new (struct drm_atomic_state *state,struct drm_crtc *crtc) +{ +struct drm_crtc_state *statec =drm_atomic_get_new_crtc_state (state, crtc); + +if (!statec) +return NULL ; +return nv50_head_atom (statec); }
drivers/gpu/drm/nouveau/dispnv50/wndw.c nv50_wndw_prepare_fb(struct drm_plane *p · line 566
Quoted 7 lines
drivers/gpu/drm/nouveau/dispnv50/wndw.c +1
-1@@ -561,7 +561,7 @@ nv50_wndw_prepare_fb(struct drm_plane *p asyw->image.offset[0 ] = nvbo->offset;if (wndw->func->prepare) { - asyh =nv50_head_atom_get (asyw->state.state, asyw->state.crtc); + asyh =nv50_head_atom_get_new (asyw->state.state, asyw->state.crtc);if (IS_ERR (asyh))return PTR_ERR (asyh);
But now the error check here doesn't work.
Ben.
Signature · 2 lines
Ben Hutchings Larkinson's Law: All laws are basically false.
Greg Kroah-Hartman
maintainerPATCH 338/451 RDMA/core: Fix "KASAN: slab-use-after-free Read in ib_register_device" problem
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhu Yanjun <[email protected]>
commit d0706bfd3ee40923c001c6827b786a309e2a8713 upstream.
Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:408 [inline] print_report+0xc3/0x670 mm/kasan/report.c:521 kasan_report+0xe0/0x110 mm/kasan/report.c:634 strlen+0x93/0xa0 lib/string.c:420 __fortify_strlen include/linux/fortify-string.h:268 [inline] get_kobj_path_length lib/kobject.c:118 [inline] kobject_get_path+0x3f/0x2a0 lib/kobject.c:158 kobject_uevent_env+0x289/0x1870 lib/kobject_uevent.c:545 ib_register_device drivers/infiniband/core/device.c:1472 [inline] ib_register_device+0x8cf/0xe00 drivers/infiniband/core/device.c:1393 rxe_register_device+0x275/0x320 drivers/infiniband/sw/rxe/rxe_verbs.c:1552 rxe_net_add+0x8e/0xe0 drivers/infiniband/sw/rxe/rxe_net.c:550 rxe_newlink+0x70/0x190 drivers/infiniband/sw/rxe/rxe.c:225 nldev_newlink+0x3a3/0x680 drivers/infiniband/core/nldev.c:1796 rdma_nl_rcv_msg+0x387/0x6e0 drivers/infiniband/core/netlink.c:195 rdma_nl_rcv_skb.constprop.0.isra.0+0x2e5/0x450 netlink_unicast_kernel net/netlink/af_netlink.c:1313 [inline] netlink_unicast+0x53a/0x7f0 net/netlink/af_netlink.c:1339 netlink_sendmsg+0x8d1/0xdd0 net/netlink/af_netlink.c:1883 sock_sendmsg_nosec net/socket.c:712 [inline] __sock_sendmsg net/socket.c:727 [inline] ____sys_sendmsg+0xa95/0xc70 net/socket.c:2566 ___sys_sendmsg+0x134/0x1d0 net/socket.c:2620 __sys_sendmsg+0x16d/0x220 net/socket.c:2652 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xcd/0x260 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f
This problem is similar to the problem that the
commit 1d6a9e7449e2 ("RDMA/core: Fix use-after-free when rename device name") fixes.
The root cause is: the function ib_device_rename() renames the name with lock. But in the function kobject_uevent(), this name is accessed without lock protection at the same time.
The solution is to add the lock protection when this name is accessed in the function kobject_uevent().
[ Ajay: Modified to apply on v5.10.y-v6.6.y
ib_device_notify_register() not present in v5.10.y-v6.6.y, so directly added lock for kobject_uevent() ]
--- drivers/infiniband/core/device.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/infiniband/core/device.c +5 -0
@@ -1396,8 +1396,13 @@ int ib_register_device(struct ib_devicereturn ret; }dev_set_uevent_suppress (&device->dev, false); + +down_read (&devices_rwsem); +/* Mark for userspace that device is ready */ kobject_uevent (&device->dev.kobj,KOBJ_ADD ); + +up_read (&devices_rwsem);ib_device_put (device);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 339/451 virtio_console: fix order of fields cols and rows
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maximilian Immanuel Brandtner <[email protected]>
commit 5326ab737a47278dbd16ed3ee7380b26c7056ddd upstream.
According to section 5.3.6.2 (Multiport Device Operation) of the virtio spec(version 1.2) a control buffer with the event VIRTIO_CONSOLE_RESIZE is followed by a virtio_console_resize struct containing cols then rows. The kernel implements this the wrong way around (rows then cols) resulting in the two values being swapped.
Message-Id: <[email protected]>
--- drivers/char/virtio_console.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/char/virtio_console.c +1 -1
@@ -1617,8 +1617,8 @@ static void handle_control_message(strucbreak ;case VIRTIO_CONSOLE_RESIZE : {struct { -__virtio16 rows;__virtio16 cols; +__virtio16 rows; } size;if (!is_console_port (port))
Greg Kroah-Hartman
maintainerPATCH 340/451 console: Delete unused con_font_copy() callback implementations
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peilin Ye <[email protected]>
commit 7a089ec7d77fe7d50f6bb7b178fa25eec9fd822b upstream.
Recently in commit 3c4e0dff2095 ("vt: Disable KD_FONT_OP_COPY") we disabled the KD_FONT_OP_COPY ioctl() option. Delete all the con_font_copy() callbacks, since we no longer use them.
Mark KD_FONT_OP_COPY as "obsolete" in include/uapi/linux/kd.h, just like what we have done for PPPIOCDETACH in commit af8d3c7c001a ("ppp: remove the PPPIOCDETACH ioctl").
--- drivers/usb/misc/sisusbvga/sisusb_con.c | 6 ------ drivers/video/console/dummycon.c | 6 ------ drivers/video/fbdev/core/fbcon.c | 11 ----------- include/linux/console.h | 1 - include/uapi/linux/kd.h | 2 +- 5 files changed, 1 insertion(+), 25 deletions(-)
drivers/usb/misc/sisusbvga/sisusb_con.c +0 -6
@@ -1358,11 +1358,6 @@ static int sisusbdummycon_font_default(sreturn 0 ; } -static int sisusbdummycon_font_copy (struct vc_data *vc,int con) -{ -return 0 ; -} -static const struct consw sisusb_dummy_con = { .owner =THIS_MODULE , .con_startup = sisusbdummycon_startup,
@@ -1377,7 +1372,6 @@ static const struct consw sisusb_dummy_c .con_blank = sisusbdummycon_blank, .con_font_set = sisusbdummycon_font_set, .con_font_default = sisusbdummycon_font_default, - .con_font_copy = sisusbdummycon_font_copy, };int
drivers/video/console/dummycon.c +0 -6
@@ -136,11 +136,6 @@ static int dummycon_font_default(structreturn 0 ; } -static int dummycon_font_copy (struct vc_data *vc,int con) -{ -return 0 ; -} -/* * The console `switch' structure for the dummy console *
@@ -161,6 +156,5 @@ const struct consw dummy_con = { .con_blank = dummycon_blank, .con_font_set = dummycon_font_set, .con_font_default = dummycon_font_default, - .con_font_copy = dummycon_font_copy, };EXPORT_SYMBOL_GPL (dummy_con);
drivers/video/fbdev/core/fbcon.c +0 -11
@@ -2471,16 +2471,6 @@ static int fbcon_do_set_font(struct vc_dreturn 0 ; } -static int fbcon_copy_font (struct vc_data *vc,int con) -{ -struct fbcon_display *od = &fb_display[con]; -struct console_font *f = &vc->vc_font; - -if (od->fontdata == f->data) -return 0 ;/* already the same font... */ -return fbcon_do_set_font (vc, f->width, f->height, od->fontdata, od->userfont); -} -/* * User asked to set font; we are guaranteed that * a) width and height are in range 1..32
@@ -3174,7 +3164,6 @@ static const struct consw fb_con = { .con_font_set = fbcon_set_font, .con_font_get = fbcon_get_font, .con_font_default = fbcon_set_def_font, - .con_font_copy = fbcon_copy_font, .con_set_palette = fbcon_set_palette, .con_invert_region = fbcon_invert_region, .con_screen_pos = fbcon_screen_pos,
include/linux/console.h +0 -1
@@ -62,7 +62,6 @@ struct consw {int (*con_font_get)(struct vc_data *vc,struct console_font *font);int (*con_font_default)(struct vc_data *vc,struct console_font *font,char *name); -int (*con_font_copy)(struct vc_data *vc,int con);int (*con_resize)(struct vc_data *vc,unsigned int width,unsigned int height,unsigned int user); void (*con_set_palette)(struct vc_data *vc,
include/uapi/linux/kd.h +1 -1
@@ -173,7 +173,7 @@ struct console_font {#define KD_FONT_OP_SET 0/* Set font */ #define KD_FONT_OP_GET 1/* Get font */ #define KD_FONT_OP_SET_DEFAULT 2/* Set font to default, data points to name / NULL */ -#define KD_FONT_OP_COPY 3/* Copy from another console */ +#define KD_FONT_OP_COPY 3/* Obsolete, do not use */ #define KD_FONT_FLAG_DONT_RECALC 1/* Don't recalculate hw charcell size [compat] */
Greg Kroah-Hartman
maintainerPATCH 341/451 console: Delete dummy con_font_set() and con_font_default() callback implementations
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peilin Ye <[email protected]>
commit 259a252c1f4e19045b06660f81014fb51e17f3f6 upstream.
.con_font_set and .con_font_default callbacks should not pass struct console_font * as a parameter, since struct console_font is a UAPI structure.
We are trying to let them use our new kernel font descriptor, struct font_desc instead. To make that work slightly easier, first delete all of their no-op implementations used by dummy consoles.
This will make KD_FONT_OP_SET and KD_FONT_OP_SET_DEFAULT ioctl() requests on dummy consoles start to fail and return -ENOSYS, which is intended, since no user should ever expect such operations to succeed on dummy consoles.
--- drivers/usb/misc/sisusbvga/sisusb_con.c | 15 --------------- drivers/video/console/dummycon.c | 14 -------------- 2 files changed, 29 deletions(-)
drivers/usb/misc/sisusbvga/sisusb_con.c +0 -15
@@ -1345,19 +1345,6 @@ static int sisusbdummycon_blank(struct vreturn 0 ; } -static int sisusbdummycon_font_set (struct vc_data *vc, -struct console_font *font, -unsigned int flags) -{ -return 0 ; -} - -static int sisusbdummycon_font_default (struct vc_data *vc, -struct console_font *font,char *name) -{ -return 0 ; -} -static const struct consw sisusb_dummy_con = { .owner =THIS_MODULE , .con_startup = sisusbdummycon_startup,
@@ -1370,8 +1357,6 @@ static const struct consw sisusb_dummy_c .con_scroll = sisusbdummycon_scroll, .con_switch = sisusbdummycon_switch, .con_blank = sisusbdummycon_blank, - .con_font_set = sisusbdummycon_font_set, - .con_font_default = sisusbdummycon_font_default, };int
drivers/video/console/dummycon.c +0 -14
@@ -124,18 +124,6 @@ static int dummycon_switch(struct vc_datreturn 0 ; } -static int dummycon_font_set (struct vc_data *vc,struct console_font *font, -unsigned int flags) -{ -return 0 ; -} - -static int dummycon_font_default (struct vc_data *vc, -struct console_font *font,char *name) -{ -return 0 ; -} -/* * The console `switch' structure for the dummy console *
@@ -154,7 +142,5 @@ const struct consw dummy_con = { .con_scroll = dummycon_scroll, .con_switch = dummycon_switch, .con_blank = dummycon_blank, - .con_font_set = dummycon_font_set, - .con_font_default = dummycon_font_default, };EXPORT_SYMBOL_GPL (dummy_con);
Greg Kroah-Hartman
maintainerPATCH 342/451 Fonts: Add charcount field to font_desc
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peilin Ye <[email protected]>
commit 4ee573086bd88ff3060dda07873bf755d332e9ba upstream.
Subsystems are hard-coding the number of characters of our built-in fonts as 256. Include that information in our kernel font descriptor, struct font_desc.
--- include/linux/font.h | 1 + lib/fonts/font_10x18.c | 1 + lib/fonts/font_6x10.c | 1 + lib/fonts/font_6x11.c | 1 + lib/fonts/font_6x8.c | 1 + lib/fonts/font_7x14.c | 1 + lib/fonts/font_8x16.c | 1 + lib/fonts/font_8x8.c | 1 + lib/fonts/font_acorn_8x8.c | 1 + lib/fonts/font_mini_4x6.c | 1 + lib/fonts/font_pearl_8x8.c | 1 + lib/fonts/font_sun12x22.c | 1 + lib/fonts/font_sun8x16.c | 1 + lib/fonts/font_ter16x32.c | 1 + 14 files changed, 14 insertions(+)
include/linux/font.h +1 -0
@@ -17,6 +17,7 @@ struct font_desc {int idx;const char *name;unsigned int width, height; +unsigned int charcount;const void *data;int pref; };
lib/fonts/font_10x18.c +1 -0
@@ -5137,6 +5137,7 @@ const struct font_desc font_10x18 = { .name = "10x18", .width = 10, .height = 18, + .charcount = 256, .data = fontdata_10x18.data, #ifdef __sparc__ .pref = 5,
lib/fonts/font_6x10.c +1 -0
@@ -3083,6 +3083,7 @@ const struct font_desc font_6x10 = { .name = "6x10", .width = 6, .height = 10, + .charcount = 256, .data = fontdata_6x10.data, .pref = 0, };
lib/fonts/font_6x11.c +1 -0
@@ -3346,6 +3346,7 @@ const struct font_desc font_vga_6x11 = { .name = "ProFont6x11", .width = 6, .height = 11, + .charcount = 256, .data = fontdata_6x11.data,/* Try avoiding this font if possible unless on MAC */ .pref = -2000,
lib/fonts/font_6x8.c +1 -0
@@ -2571,6 +2571,7 @@ const struct font_desc font_6x8 = { .name = "6x8", .width = 6, .height = 8, + .charcount = 256, .data = fontdata_6x8.data, .pref = 0, };
lib/fonts/font_7x14.c +1 -0
@@ -4113,6 +4113,7 @@ const struct font_desc font_7x14 = { .name = "7x14", .width = 7, .height = 14, + .charcount = 256, .data = fontdata_7x14.data, .pref = 0, };
lib/fonts/font_8x16.c +1 -0
@@ -4627,6 +4627,7 @@ const struct font_desc font_vga_8x16 = { .name = "VGA8x16", .width = 8, .height = 16, + .charcount = 256, .data = fontdata_8x16.data, .pref = 0, };
lib/fonts/font_8x8.c +1 -0
@@ -2578,6 +2578,7 @@ const struct font_desc font_vga_8x8 = { .name = "VGA8x8", .width = 8, .height = 8, + .charcount = 256, .data = fontdata_8x8.data, .pref = 0, };
lib/fonts/font_acorn_8x8.c +1 -0
@@ -270,6 +270,7 @@ const struct font_desc font_acorn_8x8 = .name = "Acorn8x8", .width = 8, .height = 8, + .charcount = 256, .data = acorndata_8x8.data, #ifdef CONFIG_ARCH_ACORN .pref = 20,
lib/fonts/font_mini_4x6.c +1 -0
@@ -2152,6 +2152,7 @@ const struct font_desc font_mini_4x6 = { .name = "MINI4x6", .width = 4, .height = 6, + .charcount = 256, .data = fontdata_mini_4x6.data, .pref = 3, };
lib/fonts/font_pearl_8x8.c +1 -0
@@ -2582,6 +2582,7 @@ const struct font_desc font_pearl_8x8 = .name = "PEARL8x8", .width = 8, .height = 8, + .charcount = 256, .data = fontdata_pearl8x8.data, .pref = 2, };
lib/fonts/font_sun12x22.c +1 -0
@@ -6156,6 +6156,7 @@ const struct font_desc font_sun_12x22 = .name = "SUN12x22", .width = 12, .height = 22, + .charcount = 256, .data = fontdata_sun12x22.data, #ifdef __sparc__ .pref = 5,
lib/fonts/font_sun8x16.c +1 -0
@@ -268,6 +268,7 @@ const struct font_desc font_sun_8x16 = { .name = "SUN8x16", .width = 8, .height = 16, + .charcount = 256, .data = fontdata_sun8x16.data, #ifdef __sparc__ .pref = 10,
lib/fonts/font_ter16x32.c +1 -0
@@ -2062,6 +2062,7 @@ const struct font_desc font_ter_16x32 = .name = "TER16x32", .width = 16, .height = 32, + .charcount = 256, .data = fontdata_ter16x32.data, #ifdef __sparc__ .pref = 5,
Greg Kroah-Hartman
maintainerPATCH 343/451 parisc/sticore: Avoid hard-coding built-in font charcount
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peilin Ye <[email protected]>
commit 4497364e5f61f9e8d4a6252bc6deb9597d68bbac upstream.
sti_select_fbfont() and sti_cook_fonts() are hard-coding the number of characters of our built-in fonts as 256. Recently, we included that information in our kernel font descriptor struct font_desc, so use fbfont->charcount instead of hard-coded values.
Depends on patch "Fonts: Add charcount field to font_desc".
--- drivers/video/console/sticore.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/video/console/sticore.c +4 -4
@@ -507,7 +507,7 @@ sti_select_fbfont(struct sti_cooked_rom fbfont->width, fbfont->height, fbfont->name); bpc = ((fbfont->width+7 )/8 ) * fbfont->height; - size = bpc *256 ; + size = bpc * fbfont->charcount; size +=sizeof (struct sti_rom_font ); nf =kzalloc (size,STI_LOWMEM );
@@ -515,7 +515,7 @@ sti_select_fbfont(struct sti_cooked_romreturn NULL ; nf->first_char =0 ; - nf->last_char =255 ; + nf->last_char = fbfont->charcount -1 ; nf->width = fbfont->width; nf->height = fbfont->height; nf->font_type =STI_FONT_HPROMAN8 ;
@@ -526,7 +526,7 @@ sti_select_fbfont(struct sti_cooked_rom dest = nf; dest +=sizeof (struct sti_rom_font ); -memcpy (dest, fbfont->data, bpc*256 ); +memcpy (dest, fbfont->data, bpc * fbfont->charcount); cooked_font =kzalloc (sizeof (*cooked_font),GFP_KERNEL );if (!cooked_font) {
@@ -661,7 +661,7 @@ static int sti_cook_fonts(struct sti_coovoid sti_font_convert_bytemode (struct sti_struct *sti,struct sti_cooked_font *f) {unsigned char *n, *p, *q; -int size = f->raw->bytes_per_char *256 +sizeof (struct sti_rom_font ); +int size = f->raw->bytes_per_char * (f->raw->last_char +1 ) +sizeof (struct sti_rom_font );struct sti_rom_font *old_font;if (sti->wordmode)
Greg Kroah-Hartman
maintainerPATCH 344/451 fbcon: Avoid using FNTCHARCNT() and hard-coded built-in font charcount
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peilin Ye <[email protected]>
commit a1ac250a82a5e97db71f14101ff7468291a6aaef upstream.
For user-provided fonts, the framebuffer layer is using a magic negative-indexing macro, FNTCHARCNT(), to keep track of their number of characters:
#define FNTCHARCNT(fd) (((int *)(fd))[-3])
For built-in fonts, it is using hard-coded values (256). This results in something like the following:
map.length = (ops->p->userfont) ? FNTCHARCNT(ops->p->fontdata) : 256;
This is unsatisfactory. In fact, there is already a charcount field in our virtual console descriptor (see struct console_font inside struct vc_data), let us use it:
map.length = vc->vc_font.charcount;
Recently we added a charcount field to struct font_desc. Use it to set vc->vc_font.charcount properly. The idea is:
- We only use FNTCHARCNT() on vc->vc_font.data and p->fontdata.
Assume FNTCHARCNT() is working as intended;
- Whenever `vc->vc_font.data` is set, also set `vc->vc_font.charcount`
properly;
- We can now replace `FNTCHARCNT(vc->vc_font.data)` with
`vc->vc_font.charcount`;
- Since `p->fontdata` always point to the same font data buffer with
`vc->vc_font.data`, we can also replace `FNTCHARCNT(p->fontdata)` with
`vc->vc_font.charcount`.In conclusion, set vc->vc_font.charcount properly in fbcon_startup(), fbcon_init(), fbcon_set_disp() and fbcon_do_set_font(), then replace FNTCHARCNT() with vc->vc_font.charcount. No more if-else between negative-indexing macros and hard-coded values.
Do not include <linux/font.h> in fbcon_rotate.c and tileblit.c, since they no longer need it.
Depends on patch "Fonts: Add charcount field to font_desc".
--- drivers/video/fbdev/core/fbcon.c | 57 +++++++++++--------------------- drivers/video/fbdev/core/fbcon_rotate.c | 3 - drivers/video/fbdev/core/tileblit.c | 4 -- 3 files changed, 23 insertions(+), 41 deletions(-)
drivers/video/fbdev/core/fbcon.c +21 -36
@@ -1006,7 +1006,7 @@ static const char *fbcon_startup(void) vc->vc_font.width = font->width; vc->vc_font.height = font->height; vc->vc_font.data = (void *)(p->fontdata = font->data); - vc->vc_font.charcount =256 ;/* FIXME Need to support more fonts */ + vc->vc_font.charcount = font->charcount; }else { p->fontdata = vc->vc_font.data; }
@@ -1034,7 +1034,7 @@ static void fbcon_init(struct vc_data *vstruct vc_data **default_mode = vc->vc_display_fg;struct vc_data *svc = *default_mode;struct fbcon_display *t, *p = &fb_display[vc->vc_num]; -int logo =1 , new_rows, new_cols, rows, cols, charcnt =256 ; +int logo =1 , new_rows, new_cols, rows, cols;int cap, ret;if (WARN_ON (info_idx ==-1 ))
@@ -1070,6 +1070,7 @@ static void fbcon_init(struct vc_data *v fvc->vc_font.data); vc->vc_font.width = fvc->vc_font.width; vc->vc_font.height = fvc->vc_font.height; + vc->vc_font.charcount = fvc->vc_font.charcount; p->userfont = t->userfont;if (p->userfont)
@@ -1085,17 +1086,13 @@ static void fbcon_init(struct vc_data *v vc->vc_font.width = font->width; vc->vc_font.height = font->height; vc->vc_font.data = (void *)(p->fontdata = font->data); - vc->vc_font.charcount =256 ;/* FIXME Need to -support more fonts */ + vc->vc_font.charcount = font->charcount; } } -if (p->userfont) - charcnt =FNTCHARCNT (p->fontdata); - vc->vc_can_do_color = (fb_get_color_depth (&info->var, &info->fix)!=1 ); vc->vc_complement_mask = vc->vc_can_do_color ?0x7700 :0x0800 ; -if (charcnt ==256 ) { +if (vc->vc_font.charcount ==256 ) { vc->vc_hi_font_mask =0 ; }else { vc->vc_hi_font_mask =0x100 ;
@@ -1367,7 +1364,7 @@ static void fbcon_set_disp(struct fb_infstruct vc_data **default_mode, *vc;struct vc_data *svc;struct fbcon_ops *ops = info->fbcon_par; -int rows, cols, charcnt =256 ; +int rows, cols; p = &fb_display[unit];
@@ -1387,12 +1384,11 @@ static void fbcon_set_disp(struct fb_inf vc->vc_font.data = (void *)(p->fontdata = t->fontdata); vc->vc_font.width = (*default_mode)->vc_font.width; vc->vc_font.height = (*default_mode)->vc_font.height; + vc->vc_font.charcount = (*default_mode)->vc_font.charcount; p->userfont = t->userfont;if (p->userfont)REFCOUNT (p->fontdata)++; } -if (p->userfont) - charcnt =FNTCHARCNT (p->fontdata); var->activate =FB_ACTIVATE_NOW ; info->var.activate = var->activate;
@@ -1402,7 +1398,7 @@ static void fbcon_set_disp(struct fb_inf ops->var = info->var; vc->vc_can_do_color = (fb_get_color_depth (&info->var, &info->fix)!=1 ); vc->vc_complement_mask = vc->vc_can_do_color ?0x7700 :0x0800 ; -if (charcnt ==256 ) { +if (vc->vc_font.charcount ==256 ) { vc->vc_hi_font_mask =0 ; }else { vc->vc_hi_font_mask =0x100 ;
@@ -2047,7 +2043,7 @@ static int fbcon_resize(struct vc_data **/ if (pitch <=0 )return -EINVAL ; - size =CALC_FONTSZ (vc->vc_font.height, pitch,FNTCHARCNT (vc->vc_font.data)); + size =CALC_FONTSZ (vc->vc_font.height, pitch, vc->vc_font.charcount);if (size >FNTSIZE (vc->vc_font.data))return -EINVAL ; }
@@ -2095,7 +2091,7 @@ static int fbcon_switch(struct vc_data *struct fbcon_ops *ops;struct fbcon_display *p = &fb_display[vc->vc_num];struct fb_var_screeninfo var; -int i, ret, prev_console, charcnt =256 ; +int i, ret, prev_console; info = registered_fb[con2fb_map[vc->vc_num]]; ops = info->fbcon_par;
@@ -2172,10 +2168,7 @@ static int fbcon_switch(struct vc_data * vc->vc_can_do_color = (fb_get_color_depth (&info->var, &info->fix)!=1 ); vc->vc_complement_mask = vc->vc_can_do_color ?0x7700 :0x0800 ; -if (p->userfont) - charcnt =FNTCHARCNT (vc->vc_font.data); - -if (charcnt >256 ) +if (vc->vc_font.charcount >256 ) vc->vc_complement_mask <<=1 ;updatescrollmode (p, info, vc);
@@ -2425,31 +2418,27 @@ static void set_vc_hi_font(struct vc_dat } } -static int fbcon_do_set_font (struct vc_data *vc,int w,int h, +static int fbcon_do_set_font (struct vc_data *vc,int w,int h,int charcount,const u8 * data,int userfont) {struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];struct fbcon_ops *ops = info->fbcon_par;struct fbcon_display *p = &fb_display[vc->vc_num];int resize; -int cnt;char *old_data =NULL ; resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);if (p->userfont) old_data = vc->vc_font.data; -if (userfont) - cnt =FNTCHARCNT (data); -else - cnt =256 ; vc->vc_font.data = (void *)(p->fontdata = data);if ((p->userfont = userfont))REFCOUNT (data)++; vc->vc_font.width = w; vc->vc_font.height = h; -if (vc->vc_hi_font_mask && cnt ==256 ) + vc->vc_font.charcount = charcount; +if (vc->vc_hi_font_mask && charcount ==256 )set_vc_hi_font (vc, false); -else if (!vc->vc_hi_font_mask && cnt ==512 ) +else if (!vc->vc_hi_font_mask && charcount ==512 )set_vc_hi_font (vc, true);if (resize) {
@@ -2531,9 +2520,10 @@ static int fbcon_set_font(struct vc_dataif (!new_data)return -ENOMEM ; +memset (new_data,0 ,FONT_EXTRA_WORDS *sizeof (int )); + new_data +=FONT_EXTRA_WORDS *sizeof (int );FNTSIZE (new_data) = size; -FNTCHARCNT (new_data) = charcount;REFCOUNT (new_data) =0 ;/* usage counter */ for (i=0 ; i< charcount; i++) {memcpy (new_data + i*h*pitch, data + i*32 *pitch, h*pitch);
@@ -2559,7 +2549,7 @@ static int fbcon_set_font(struct vc_databreak ; } } -return fbcon_do_set_font (vc, font->width, font->height, new_data,1 ); +return fbcon_do_set_font (vc, font->width, font->height, charcount, new_data,1 ); }static int fbcon_set_def_font (struct vc_data *vc,struct console_font *font,char *name)
@@ -2575,7 +2565,7 @@ static int fbcon_set_def_font(struct vc_ font->width = f->width; font->height = f->height; -return fbcon_do_set_font (vc, f->width, f->height, f->data,0 ); +return fbcon_do_set_font (vc, f->width, f->height, f->charcount, f->data,0 ); }static u16 palette_red[16 ];
@@ -3072,7 +3062,6 @@ void fbcon_get_requirement(struct fb_inf struct fb_blit_caps *caps) {struct vc_data *vc; -struct fbcon_display *p;if (caps->flags) {int i, charcnt;
@@ -3081,11 +3070,9 @@ void fbcon_get_requirement(struct fb_inf vc = vc_cons[i].d;if (vc && vc->vc_mode ==KD_TEXT && info->node == con2fb_map[i]) { - p = &fb_display[i]; caps->x |=1 << (vc->vc_font.width -1 ); caps->y |=1 << (vc->vc_font.height -1 ); - charcnt = (p->userfont) ? -FNTCHARCNT (p->fontdata) :256 ; + charcnt = vc->vc_font.charcount;if (caps->len < charcnt) caps->len = charcnt; }
@@ -3095,11 +3082,9 @@ void fbcon_get_requirement(struct fb_infif (vc && vc->vc_mode ==KD_TEXT && info->node == con2fb_map[fg_console]) { - p = &fb_display[fg_console]; caps->x =1 << (vc->vc_font.width -1 ); caps->y =1 << (vc->vc_font.height -1 ); - caps->len = (p->userfont) ? -FNTCHARCNT (p->fontdata) :256 ; + caps->len = vc->vc_font.charcount; } } }
drivers/video/fbdev/core/fbcon_rotate.c +1 -2
@@ -14,7 +14,6 @@#include <linux/fb.h> #include <linux/vt_kern.h> #include <linux/console.h> -#include <linux/font.h> #include <asm/types.h> #include "fbcon.h" #include "fbcon_rotate.h"
@@ -33,7 +32,7 @@ static int fbcon_rotate_font(struct fb_i src = ops->fontdata = vc->vc_font.data; ops->cur_rotate = ops->p->con_rotate; - len = (!ops->p->userfont) ?256 :FNTCHARCNT (src); + len = vc->vc_font.charcount; s_cellsize = ((vc->vc_font.width +7 )/8 ) * vc->vc_font.height; d_cellsize = s_cellsize;
drivers/video/fbdev/core/tileblit.c +1 -3
@@ -13,7 +13,6 @@#include <linux/fb.h> #include <linux/vt_kern.h> #include <linux/console.h> -#include <linux/font.h> #include <asm/types.h> #include "fbcon.h"
@@ -178,8 +177,7 @@ void fbcon_set_tileops(struct vc_data *v map.width = vc->vc_font.width; map.height = vc->vc_font.height; map.depth =1 ; - map.length = (ops->p->userfont) ? -FNTCHARCNT (ops->p->fontdata) :256 ; + map.length = vc->vc_font.charcount; map.data = ops->p->fontdata; info->tileops->fb_settile (info, &map); }
Greg Kroah-Hartman
maintainerPATCH 345/451 drm/vmwgfx: Fix a null-ptr access in the cursor snooper
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zack Rusin <[email protected]>
[ Upstream commit 5ac2c0279053a2c5265d46903432fb26ae2d0da2 ]
Check that the resource which is converted to a surface exists before trying to use the cursor snooper on it.
vmw_cmd_res_check allows explicit invalid (SVGA3D_INVALID_ID) identifiers because some svga commands accept SVGA3D_INVALID_ID to mean "no surface", unfortunately functions that accept the actual surfaces as objects might (and in case of the cursor snooper, do not) be able to handle null objects. Make sure that we validate not only the identifier (via the vmw_cmd_res_check) but also check that the actual resource exists before trying to do something with it.
Fixes unchecked null-ptr reference in the snooping code.
--- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +12 -5
@@ -1520,6 +1520,7 @@ static int vmw_cmd_dma(struct vmw_privat SVGA3dCmdHeader *header) {struct vmw_buffer_object *vmw_bo =NULL ; +struct vmw_resource *res;struct vmw_surface *srf =NULL ;VMW_DECLARE_CMD_VAR (*cmd, SVGA3dCmdSurfaceDMA);int ret;
@@ -1555,18 +1556,24 @@ static int vmw_cmd_dma(struct vmw_privat dirty = (cmd->body.transfer ==SVGA3D_WRITE_HOST_VRAM ) ?VMW_RES_DIRTY_SET :0 ; - ret =vmw_cmd_res_check (dev_priv, sw_context, vmw_res_surface, - dirty, user_surface_converter, - &cmd->body.host.sid,NULL ); + ret =vmw_cmd_res_check (dev_priv, sw_context, vmw_res_surface, dirty, + user_surface_converter, &cmd->body.host.sid, +NULL );if (unlikely (ret !=0 )) {if (unlikely (ret != -ERESTARTSYS ))VMW_DEBUG_USER ("could not find surface for DMA.\n" );return ret; } - srf =vmw_res_to_srf (sw_context->res_cache[vmw_res_surface].res); + res = sw_context->res_cache[vmw_res_surface].res; +if (!res) { +VMW_DEBUG_USER ("Invalid DMA surface.\n" ); +return -EINVAL ; + } -vmw_kms_cursor_snoop (srf, sw_context->fp->tfile, &vmw_bo->base, header); + srf =vmw_res_to_srf (res); +vmw_kms_cursor_snoop (srf, sw_context->fp->tfile, &vmw_bo->base, + header);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 346/451 usb: xhci: move link chain bit quirk checks into one helper function.
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Neronin <[email protected]>
commit 7476a2215c07703db5e95efaa3fc5b9f957b9417 upstream.
Older 0.95 xHCI hosts and some other specific newer hosts require the chain bit to be set for Link TRBs even if the link TRB is not in the middle of a transfer descriptor (TD).
move the checks for all those cases into one xhci_link_chain_quirk() function to clean up and avoid code duplication.
No functional changes.
[skip renaming chain_links flag, reword commit message -Mathias]
--- drivers/usb/host/xhci-mem.c | 10 ++-------- drivers/usb/host/xhci-ring.c | 8 ++------ drivers/usb/host/xhci.h | 7 +++++-- 3 files changed, 9 insertions(+), 16 deletions(-)
drivers/usb/host/xhci-mem.c +2 -8
@@ -133,10 +133,7 @@ static void xhci_link_rings(struct xhci_if (!ring || !first || !last)return ; -/* Set chain bit for 0.95 hosts, and for isoc rings on AMD 0.96 host */ - chain_links = !!(xhci_link_trb_quirk (xhci) || - (ring->type ==TYPE_ISOC && - (xhci->quirks & XHCI_AMD_0x96_HOST))); + chain_links =xhci_link_chain_quirk (xhci, ring->type); next = ring->enq_seg->next;xhci_link_segments (ring->enq_seg, first, ring->type, chain_links);
@@ -326,10 +323,7 @@ static int xhci_alloc_segments_for_ring(struct xhci_segment *prev;bool chain_links; -/* Set chain bit for 0.95 hosts, and for isoc rings on AMD 0.96 host */ - chain_links = !!(xhci_link_trb_quirk (xhci) || - (type ==TYPE_ISOC && - (xhci->quirks & XHCI_AMD_0x96_HOST))); + chain_links =xhci_link_chain_quirk (xhci, type); prev =xhci_segment_alloc (xhci, cycle_state, max_packet, flags);if (!prev)
drivers/usb/host/xhci-ring.c +2 -6
@@ -230,9 +230,7 @@ static void inc_enq(struct xhci_hcd *xhc* AMD 0.96 host, carry over the chain bit of the previous TRB * (which may mean the chain bit is cleared). */ -if (!(ring->type ==TYPE_ISOC && - (xhci->quirks & XHCI_AMD_0x96_HOST)) && - !xhci_link_trb_quirk (xhci)) { +if (!xhci_link_chain_quirk (xhci, ring->type)) { next->link.control &=cpu_to_le32 (~TRB_CHAIN ); next->link.control |=cpu_to_le32 (chain); }
@@ -3138,9 +3136,7 @@ static int prepare_ring(struct xhci_hcd/* If we're not dealing with 0.95 hardware or isoc rings * on AMD 0.96 host, clear the chain bit. */ -if (!xhci_link_trb_quirk (xhci) && - !(ep_ring->type ==TYPE_ISOC && - (xhci->quirks & XHCI_AMD_0x96_HOST))) +if (!xhci_link_chain_quirk (xhci, ep_ring->type)) ep_ring->enqueue->link.control &=cpu_to_le32 (~TRB_CHAIN );else
drivers/usb/host/xhci.h +5 -2
@@ -1998,9 +1998,12 @@ static inline void xhci_write_64(structlo_hi_writeq (val, regs); } -static inline int xhci_link_trb_quirk (struct xhci_hcd *xhci) + +/* Link TRB chain should always be set on 0.95 hosts, and AMD 0.96 ISOC rings */ +static inline bool xhci_link_chain_quirk (struct xhci_hcd *xhci,enum xhci_ring_type type) { -return xhci->quirks &XHCI_LINK_TRB_QUIRK ; +return (xhci->quirks &XHCI_LINK_TRB_QUIRK ) || + (type ==TYPE_ISOC && (xhci->quirks & XHCI_AMD_0x96_HOST)); }/* xHCI debugging */
Greg Kroah-Hartman
maintainerPATCH 347/451 usb: xhci: Apply the link chain quirk on NEC isoc endpoints
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Pecio <[email protected]>
commit bb0ba4cb1065e87f9cc75db1fa454e56d0894d01 upstream.
Two clearly different specimens of NEC uPD720200 (one with start/stop bug, one without) were seen to cause IOMMU faults after some Missed Service Errors. Faulting address is immediately after a transfer ring segment and patched dynamic debug messages revealed that the MSE was received when waiting for a TD near the end of that segment:
[ 1.041954] xhci_hcd: Miss service interval error for slot 1 ep 2 expected TD DMA ffa08fe0 [ 1.042120] xhci_hcd: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0005 address=0xffa09000 flags=0x0000] [ 1.042146] xhci_hcd: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0005 address=0xffa09040 flags=0x0000]
It gets even funnier if the next page is a ring segment accessible to the HC. Below, it reports MSE in segment at ff1e8000, plows through a zero-filled page at ff1e9000 and starts reporting events for TRBs in page at ff1ea000 every microframe, instead of jumping to seg ff1e6000.
[ 7.041671] xhci_hcd: Miss service interval error for slot 1 ep 2 expected TD DMA ff1e8fe0 [ 7.041999] xhci_hcd: Miss service interval error for slot 1 ep 2 expected TD DMA ff1e8fe0 [ 7.042011] xhci_hcd: WARN: buffer overrun event for slot 1 ep 2 on endpoint [ 7.042028] xhci_hcd: All TDs skipped for slot 1 ep 2. Clear skip flag. [ 7.042134] xhci_hcd: WARN: buffer overrun event for slot 1 ep 2 on endpoint [ 7.042138] xhci_hcd: ERROR Transfer event TRB DMA ptr not part of current TD ep_index 2 comp_code 31 [ 7.042144] xhci_hcd: Looking for event-dma 00000000ff1ea040 trb-start 00000000ff1e6820 trb-end 00000000ff1e6820 [ 7.042259] xhci_hcd: WARN: buffer overrun event for slot 1 ep 2 on endpoint [ 7.042262] xhci_hcd: ERROR Transfer event TRB DMA ptr not part of current TD ep_index 2 comp_code 31 [ 7.042266] xhci_hcd: Looking for event-dma 00000000ff1ea050 trb-start 00000000ff1e6820 trb-end 00000000ff1e6820
At some point completion events change from Isoch Buffer Overrun to Short Packet and the HC finally finds cycle bit mismatch in ff1ec000.
[ 7.098130] xhci_hcd: ERROR Transfer event TRB DMA ptr not part of current TD ep_index 2 comp_code 13 [ 7.098132] xhci_hcd: Looking for event-dma 00000000ff1ecc50 trb-start 00000000ff1e6820 trb-end 00000000ff1e6820 [ 7.098254] xhci_hcd: ERROR Transfer event TRB DMA ptr not part of current TD ep_index 2 comp_code 13 [ 7.098256] xhci_hcd: Looking for event-dma 00000000ff1ecc60 trb-start 00000000ff1e6820 trb-end 00000000ff1e6820 [ 7.098379] xhci_hcd: Overrun event on slot 1 ep 2
It's possible that data from the isochronous device were written to random buffers of pending TDs on other endpoints (either IN or OUT), other devices or even other HCs in the same IOMMU domain.
Lastly, an error from a different USB device on another HC. Was it caused by the above? I don't know, but it may have been. The disk was working without any other issues and generated PCIe traffic to starve the NEC of upstream BW and trigger those MSEs. The two HCs shared one x1 slot by means of a commercial "PCIe splitter" board.
[ 7.162604] usb 10-2: reset SuperSpeed USB device number 3 using xhci_hcd [ 7.178990] sd 9:0:0:0: [sdb] tag#0 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=DRIVER_OK cmd_age=0s [ 7.179001] sd 9:0:0:0: [sdb] tag#0 CDB: opcode=0x28 28 00 04 02 ae 00 00 02 00 00 [ 7.179004] I/O error, dev sdb, sector 67284480 op 0x0:(READ) flags 0x80700 phys_seg 5 prio class 0
Fortunately, it appears that this ridiculous bug is avoided by setting the chain bit of Link TRBs on isochronous rings. Other ancient HCs are known which also expect the bit to be set and they ignore Link TRBs if it's not. Reportedly, 0.95 spec guaranteed that the bit is set.
The bandwidth-starved NEC HC running a 32KB/uframe UVC endpoint reports tens of MSEs per second and runs into the bug within seconds. Chaining Link TRBs allows the same workload to run for many minutes, many times.
No negative side effects seen in UVC recording and UAC playback with a few devices at full speed, high speed and SuperSpeed.
The problem doesn't reproduce on the newer Renesas uPD720201/uPD720202 and on old Etron EJ168 and VIA VL805 (but the VL805 has other bug).
[shorten line length of log snippets in commit messge -Mathias]
--- drivers/usb/host/xhci.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/usb/host/xhci.h +11 -2
@@ -1999,11 +1999,20 @@ static inline void xhci_write_64(struct } -/* Link TRB chain should always be set on 0.95 hosts, and AMD 0.96 ISOC rings */ +/* +* Reportedly, some chapters of v0.95 spec said that Link TRB always has its chain bit set. +* Other chapters and later specs say that it should only be set if the link is inside a TD +* which continues from the end of one segment to the next segment. +* +* Some 0.95 hardware was found to misbehave if any link TRB doesn't have the chain bit set. +* +* 0.96 hardware from AMD and NEC was found to ignore unchained isochronous link TRBs when +* "resynchronizing the pipe" after a Missed Service Error. +*/ static inline bool xhci_link_chain_quirk (struct xhci_hcd *xhci,enum xhci_ring_type type) {return (xhci->quirks &XHCI_LINK_TRB_QUIRK ) || - (type ==TYPE_ISOC && (xhci->quirks & XHCI_AMD_0x96_HOST)); + (type ==TYPE_ISOC && (xhci->quirks & (XHCI_AMD_0x96_HOST |XHCI_NEC_HOST ))); }/* xHCI debugging */
Greg Kroah-Hartman
maintainerPATCH 348/451 ipv6: Fix potential uninit-value access in __ip6_make_skb()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shigeru Yoshida <[email protected]>
commit 4e13d3a9c25b7080f8a619f961e943fe08c2672c upstream.
As it was done in commit fc1092f51567 ("ipv4: Fix uninit-value access in __ip_make_skb()") for IPv4, check FLOWI_FLAG_KNOWN_NH on fl6->flowi6_flags instead of testing HDRINCL on the socket to avoid a race condition which causes uninit-value access.
[ Referred stable v6.1.y version of the patch to generate this one
v6.1 link: https://github.com/gregkh/linux/commit/a05c1ede50e9656f0752e523c7b54f3a3489e9a8 ]
--- net/ipv6/ip6_output.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv6/ip6_output.c +2 -1
@@ -1917,7 +1917,8 @@ struct sk_buff *__ip6_make_skb(struct sostruct inet6_dev *idev =ip6_dst_idev (skb_dst (skb));u8 icmp6_type; -if (sk->sk_socket->type ==SOCK_RAW && !inet_sk (sk)->hdrincl) +if (sk->sk_socket->type ==SOCK_RAW && + !(fl6->flowi6_flags &FLOWI_FLAG_KNOWN_NH )) icmp6_type = fl6->fl6_icmp_type;else icmp6_type =icmp6_hdr (skb)->icmp6_type;
Greg Kroah-Hartman
maintainerPATCH 349/451 ipv4: Fix uninit-value access in __ip_make_skb()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shigeru Yoshida <[email protected]>
commit fc1092f51567277509563800a3c56732070b6aa4 upstream.
KMSAN reported uninit-value access in __ip_make_skb() [1]. __ip_make_skb() tests HDRINCL to know if the skb has icmphdr. However, HDRINCL can cause a race condition. If calling setsockopt(2) with IP_HDRINCL changes HDRINCL while __ip_make_skb() is running, the function will access icmphdr in the skb even if it is not included. This causes the issue reported by KMSAN.
Check FLOWI_FLAG_KNOWN_NH on fl4->flowi4_flags instead of testing HDRINCL on the socket.
Also, fl4->fl4_icmp_type and fl4->fl4_icmp_code are not initialized. These are union in struct flowi4 and are implicitly initialized by flowi4_init_output(), but we should not rely on specific union layout.
Initialize these explicitly in raw_sendmsg().
[1]
BUG: KMSAN: uninit-value in __ip_make_skb+0x2b74/0x2d20 net/ipv4/ip_output.c:1481 __ip_make_skb+0x2b74/0x2d20 net/ipv4/ip_output.c:1481 ip_finish_skb include/net/ip.h:243 [inline] ip_push_pending_frames+0x4c/0x5c0 net/ipv4/ip_output.c:1508 raw_sendmsg+0x2381/0x2690 net/ipv4/raw.c:654 inet_sendmsg+0x27b/0x2a0 net/ipv4/af_inet.c:851 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg+0x274/0x3c0 net/socket.c:745 __sys_sendto+0x62c/0x7b0 net/socket.c:2191 __do_sys_sendto net/socket.c:2203 [inline] __se_sys_sendto net/socket.c:2199 [inline] __x64_sys_sendto+0x130/0x200 net/socket.c:2199 do_syscall_64+0xd8/0x1f0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x6d/0x75
Uninit was created at:
slab_post_alloc_hook mm/slub.c:3804 [inline] slab_alloc_node mm/slub.c:3845 [inline] kmem_cache_alloc_node+0x5f6/0xc50 mm/slub.c:3888 kmalloc_reserve+0x13c/0x4a0 net/core/skbuff.c:577 __alloc_skb+0x35a/0x7c0 net/core/skbuff.c:668 alloc_skb include/linux/skbuff.h:1318 [inline] __ip_append_data+0x49ab/0x68c0 net/ipv4/ip_output.c:1128 ip_append_data+0x1e7/0x260 net/ipv4/ip_output.c:1365 raw_sendmsg+0x22b1/0x2690 net/ipv4/raw.c:648 inet_sendmsg+0x27b/0x2a0 net/ipv4/af_inet.c:851 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg+0x274/0x3c0 net/socket.c:745 __sys_sendto+0x62c/0x7b0 net/socket.c:2191 __do_sys_sendto net/socket.c:2203 [inline] __se_sys_sendto net/socket.c:2199 [inline] __x64_sys_sendto+0x130/0x200 net/socket.c:2199 do_syscall_64+0xd8/0x1f0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x6d/0x75 CPU: 1 PID: 15709 Comm: syz-executor.7 Not tainted 6.8.0-11567-gb3603fcb79b1 #25 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-1.fc39 04/01/2014
[ Referred stable v6.1.y version of the patch to generate this one
v6.1 link: https://github.com/gregkh/linux/commit/55bf541e018b76b3750cb6c6ea18c46e1ac5562e ]
--- net/ipv4/ip_output.c | 3 ++- net/ipv4/raw.c | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-)
net/ipv4/ip_output.c +2 -1
@@ -1572,7 +1572,8 @@ struct sk_buff *__ip_make_skb(struct soc* so icmphdr does not in skb linear region and can not get icmp_type * by icmp_hdr(skb)->type. */ -if (sk->sk_type ==SOCK_RAW && !inet_sk (sk)->hdrincl) +if (sk->sk_type ==SOCK_RAW && + !(fl4->flowi4_flags &FLOWI_FLAG_KNOWN_NH )) icmp_type = fl4->fl4_icmp_type;else icmp_type =icmp_hdr (skb)->type;
net/ipv4/raw.c +3 -0
@@ -634,6 +634,9 @@ static int raw_sendmsg(struct sock *sk, (hdrincl ?FLOWI_FLAG_KNOWN_NH :0 ), daddr, saddr, 0, 0, sk->sk_uid); + fl4.fl4_icmp_type =0 ; + fl4.fl4_icmp_code =0 ; +if (!hdrincl) { rfv.msg = msg; rfv.hlen =0 ;
Greg Kroah-Hartman
maintainerPATCH 350/451 HID: core: Harden s32ton() against conversion to 0 bits
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Stern <[email protected]>
[ Upstream commit a6b87bfc2ab5bccb7ad953693c85d9062aef3fdd ]
Testing by the syzbot fuzzer showed that the HID core gets a shift-out-of-bounds exception when it tries to convert a 32-bit quantity to a 0-bit quantity. Ideally this should never occur, but there are buggy devices and some might have a report field with size set to zero; we shouldn't reject the report or the device just because of that.
Instead, harden the s32ton() routine so that it returns a reasonable result instead of crashing when it is called with the number of bits set to 0 -- the same as what snto32() does.
[ s32ton() was moved by c653ffc28340 ("HID: stop exporting hid_snto32()").
Minor context change fixed. ]
--- drivers/hid/hid-core.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/hid/hid-core.c +6 -1
@@ -1349,7 +1349,12 @@ EXPORT_SYMBOL_GPL(hid_snto32);static u32 s32ton (__s32 value,unsigned n) { -s32 a = value >> (n -1 ); +s32 a; + +if (!value || !n) +return 0 ; + + a = value >> (n -1 );if (a && a !=-1 )return value <0 ?1 << (n -1 ) : (1 << (n -1 )) -1 ;return value & ((1 << n) -1 );
Greg Kroah-Hartman
maintainerPATCH 351/451 xhci: dbgtty: fix device unregister
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Łukasz Bartosik <[email protected]>
[ Upstream commit 1f73b8b56cf35de29a433aee7bfff26cea98be3f ]
When DbC is disconnected then xhci_dbc_tty_unregister_device() is called. However if there is any user space process blocked on write to DbC terminal device then it will never be signalled and thus stay blocked indifinitely.
This fix adds a tty_vhangup() call in xhci_dbc_tty_unregister_device(). The tty_vhangup() wakes up any blocked writers and causes subsequent write attempts to DbC terminal device to fail.
--- drivers/usb/host/xhci-dbgtty.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/usb/host/xhci-dbgtty.c +6 -0
@@ -468,6 +468,12 @@ static void xhci_dbc_tty_unregister_deviif (!port->registered)return ; +/* +* Hang up the TTY. This wakes up any blocked +* writers and causes subsequent writes to fail. +*/ +tty_vhangup (port->port.tty); +tty_unregister_device (dbc_tty_driver,0 );xhci_dbc_tty_exit_port (port); port->registered = false;
Greg Kroah-Hartman
maintainerPATCH 352/451 usb: gadget: udc: fix use-after-free in usb_gadget_state_work
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jimmy Hu <[email protected]>
[ Upstream commit baeb66fbd4201d1c4325074e78b1f557dff89b5b ]
A race condition during gadget teardown can lead to a use-after-free in usb_gadget_state_work(), as reported by KASAN:
BUG: KASAN: invalid-access in sysfs_notify+0x2c/0xd0 Workqueue: events usb_gadget_state_work
The fundamental race occurs because a concurrent event (e.g., an interrupt) can call usb_gadget_set_state() and schedule gadget->work at any time during the cleanup process in usb_del_gadget().
Commit 399a45e5237c ("usb: gadget: core: flush gadget workqueue after device removal") attempted to fix this by moving flush_work() to after device_del(). However, this does not fully solve the race, as a new work item can still be scheduled *after* flush_work() completes but before the gadget's memory is freed, leading to the same use-after-free.
This patch fixes the race condition robustly by introducing a 'teardown' flag and a 'state_lock' spinlock to the usb_gadget struct. The flag is set during cleanup in usb_del_gadget() *before* calling flush_work() to prevent any new work from being scheduled once cleanup has commenced. The scheduling site, usb_gadget_set_state(), now checks this flag under the lock before queueing the work, thus safely closing the race window.
--- drivers/usb/gadget/udc/core.c | 17 ++++++++++++++++- include/linux/usb/gadget.h | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-)
drivers/usb/gadget/udc/core.c +16 -1
@@ -1037,8 +1037,13 @@ static void usb_gadget_state_work(structvoid usb_gadget_set_state (struct usb_gadget *gadget,enum usb_device_state state) { +unsigned long flags; + +spin_lock_irqsave (&gadget->state_lock, flags); gadget->state = state; -schedule_work (&gadget->work); +if (!gadget->teardown) +schedule_work (&gadget->work); +spin_unlock_irqrestore (&gadget->state_lock, flags); }EXPORT_SYMBOL_GPL (usb_gadget_set_state);
@@ -1199,6 +1204,8 @@ void usb_initialize_gadget(struct device void (*release)(struct device *dev)) {dev_set_name (&gadget->dev,"gadget" ); +spin_lock_init (&gadget->state_lock); + gadget->teardown = false;INIT_WORK (&gadget->work, usb_gadget_state_work); gadget->dev.parent = parent;
@@ -1376,6 +1383,7 @@ static void usb_gadget_remove_driver(strvoid usb_del_gadget (struct usb_gadget *gadget) {struct usb_udc *udc = gadget->udc; +unsigned long flags;if (!udc)return ;
@@ -1394,6 +1402,13 @@ void usb_del_gadget(struct usb_gadget *gmutex_unlock (&udc_lock);kobject_uevent (&udc->dev.kobj,KOBJ_REMOVE ); +/* +* Set the teardown flag before flushing the work to prevent new work +* from being scheduled while we are cleaning up. +*/ +spin_lock_irqsave (&gadget->state_lock, flags); + gadget->teardown = true; +spin_unlock_irqrestore (&gadget->state_lock, flags);flush_work (&gadget->work);device_unregister (&udc->dev);device_del (&gadget->dev);
include/linux/usb/gadget.h +5 -0
@@ -341,6 +341,9 @@ struct usb_gadget_ops {* @max_speed: Maximal speed the UDC can handle. UDC must support this * and all slower speeds. * @state: the state we are now (attached, suspended, configured, etc) +* @state_lock: Spinlock protecting the `state` and `teardown` members. +* @teardown: True if the device is undergoing teardown, used to prevent +* new work from being scheduled during cleanup. * @name: Identifies the controller hardware type. Used in diagnostics * and sometimes configuration. * @dev: Driver model state for this abstract device.
@@ -408,6 +411,8 @@ struct usb_gadget {enum usb_device_speed speed;enum usb_device_speed max_speed;enum usb_device_state state; +spinlock_t state_lock; +bool teardown;const char *name;struct device dev;unsigned isoch_delay;
Greg Kroah-Hartman
maintainerPATCH 353/451 net/mlx5e: Avoid field-overflowing memcpy()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
commit ad5185735f7dab342fdd0dd41044da4c9ccfef67 upstream.
In preparation for FORTIFY_SOURCE performing compile-time and run-time field bounds checking for memcpy(), memmove(), and memset(), avoid intentionally writing across neighboring fields.
Use flexible arrays instead of zero-element arrays (which look like they are always overflowing) and split the cross-field memcpy() into two halves that can be appropriately bounds-checked by the compiler.
We were doing:
#define ETH_HLEN 14
#define VLAN_HLEN 4
...
#define MLX5E_XDP_MIN_INLINE (ETH_HLEN + VLAN_HLEN)
...
struct mlx5e_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(wq, pi);
...
struct mlx5_wqe_eth_seg *eseg = &wqe->eth;
struct mlx5_wqe_data_seg *dseg = wqe->data;
...
memcpy(eseg->inline_hdr.start, xdptxd->data, MLX5E_XDP_MIN_INLINE);target is wqe->eth.inline_hdr.start (which the compiler sees as being 2 bytes in size), but copying 18, intending to write across start (really vlan_tci, 2 bytes). The remaining 16 bytes get written into wqe->data[0], covering byte_count (4 bytes), lkey (4 bytes), and addr (8 bytes).
struct mlx5e_tx_wqe {
struct mlx5_wqe_ctrl_seg ctrl; /* 0 16 */
struct mlx5_wqe_eth_seg eth; /* 16 16 */
struct mlx5_wqe_data_seg data[]; /* 32 0 */
/* size: 32, cachelines: 1, members: 3 */
/* last cacheline: 32 bytes */
};struct mlx5_wqe_eth_seg {
u8 swp_outer_l4_offset; /* 0 1 */
u8 swp_outer_l3_offset; /* 1 1 */
u8 swp_inner_l4_offset; /* 2 1 */
u8 swp_inner_l3_offset; /* 3 1 */
u8 cs_flags; /* 4 1 */
u8 swp_flags; /* 5 1 */
__be16 mss; /* 6 2 */
__be32 flow_table_metadata; /* 8 4 */
union {
struct {
__be16 sz; /* 12 2 */
u8 start[2]; /* 14 2 */
} inline_hdr; /* 12 4 */
struct {
__be16 type; /* 12 2 */
__be16 vlan_tci; /* 14 2 */
} insert; /* 12 4 */
__be32 trailer; /* 12 4 */
}; /* 12 4 */
/* size: 16, cachelines: 1, members: 9 */
/* last cacheline: 16 bytes */
};struct mlx5_wqe_data_seg {
__be32 byte_count; /* 0 4 */
__be32 lkey; /* 4 4 */
__be64 addr; /* 8 8 */ /* size: 16, cachelines: 1, members: 3 */
/* last cacheline: 16 bytes */
};So, split the memcpy() so the compiler can reason about the buffer sizes.
"pahole" shows no size nor member offset changes to struct mlx5e_tx_wqe nor struct mlx5e_umr_wqe. "objdump -d" shows no meaningful object code changes (i.e. only source line number induced differences and optimizations).
--- drivers/net/ethernet/mellanox/mlx5/core/en.h | 4 ++-- drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en.h +2 -2
@@ -199,7 +199,7 @@ static inline int mlx5e_get_max_num_chanstruct mlx5e_tx_wqe {struct mlx5_wqe_ctrl_seg ctrl;struct mlx5_wqe_eth_seg eth; -struct mlx5_wqe_data_seg data[0 ]; +struct mlx5_wqe_data_seg data[]; };struct mlx5e_rx_wqe_ll {
@@ -215,7 +215,7 @@ struct mlx5e_umr_wqe {struct mlx5_wqe_ctrl_seg ctrl;struct mlx5_wqe_umr_ctrl_seg uctrl;struct mlx5_mkey_seg mkc; -struct mlx5_mtt inline_mtts[0 ]; +struct mlx5_mtt inline_mtts[]; };extern const char mlx5e_self_tests[][ETH_GSTRING_LEN ];
drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c +3 -1
@@ -341,8 +341,10 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq/* copy the inline part if required */ if (sq->min_inline_mode !=MLX5_INLINE_MODE_NONE ) { -memcpy (eseg->inline_hdr.start, xdptxd->data,MLX5E_XDP_MIN_INLINE ); +memcpy (eseg->inline_hdr.start, xdptxd->data,sizeof (eseg->inline_hdr.start)); eseg->inline_hdr.sz =cpu_to_be16 (MLX5E_XDP_MIN_INLINE ); +memcpy (dseg, xdptxd->data +sizeof (eseg->inline_hdr.start), +MLX5E_XDP_MIN_INLINE -sizeof (eseg->inline_hdr.start)); dma_len -=MLX5E_XDP_MIN_INLINE ; dma_addr +=MLX5E_XDP_MIN_INLINE ; dseg++;
Greg Kroah-Hartman
maintainerPATCH 354/451 ALSA: wavefront: Clear substream pointers on close
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
[ Upstream commit e11c5c13ce0ab2325d38fe63500be1dd88b81e38 ]
Clear substream pointers in close functions to avoid leaving dangling pointers, helping to improve code safety and
prevents potential issues.
--- sound/isa/wavefront/wavefront_midi.c | 2 ++ 1 file changed, 2 insertions(+)
sound/isa/wavefront/wavefront_midi.c +2 -0
@@ -291,6 +291,7 @@ static int snd_wavefront_midi_input_closreturn -EIO ;spin_lock_irqsave (&midi->open, flags); + midi->substream_input[mpu] =NULL ; midi->mode[mpu] &= ~MPU401_MODE_INPUT ;spin_unlock_irqrestore (&midi->open, flags);
@@ -314,6 +315,7 @@ static int snd_wavefront_midi_output_cloreturn -EIO ;spin_lock_irqsave (&midi->open, flags); + midi->substream_output[mpu] =NULL ; midi->mode[mpu] &= ~MPU401_MODE_OUTPUT ;spin_unlock_irqrestore (&midi->open, flags);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 355/451 ALSA: wavefront: Fix integer overflow in sample size validation
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
[ Upstream commit 0c4a13ba88594fd4a27292853e736c6b4349823d ]
The wavefront_send_sample() function has an integer overflow issue when validating sample size. The header->size field is u32 but gets cast to int for comparison with dev->freemem
Fix by using unsigned comparison to avoid integer overflow.
--- sound/isa/wavefront/wavefront_synth.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/isa/wavefront/wavefront_synth.c +2 -2
@@ -944,9 +944,9 @@ wavefront_send_sample (snd_wavefront_t *if (header->size) { dev->freemem =wavefront_freemem (dev); -if (dev->freemem < (int )header->size) { +if (dev->freemem <0 || dev->freemem < header->size) {snd_printk ("insufficient memory to " -"load %d byte sample.\n" , +"load %u byte sample.\n" , header->size);return -ENOMEM ; }
Greg Kroah-Hartman
maintainerPATCH 356/451 ext4: fix string copying in parse_apply_sb_mount_options()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
[ Upstream commit ee5a977b4e771cc181f39d504426dbd31ed701cc ]
strscpy_pad() can't be used to copy a non-NUL-term string into a NUL-term string of possibly bigger size. Commit 0efc5990bca5 ("string.h: Introduce memtostr() and memtostr_pad()") provides additional information in that regard. So if this happens, the following warning is observed:
strnlen: detected buffer overflow: 65 byte read of buffer size 64
WARNING: CPU: 0 PID: 28655 at lib/string_helpers.c:1032 __fortify_report+0x96/0xc0 lib/string_helpers.c:1032 Modules linked in: CPU: 0 UID: 0 PID: 28655 Comm: syz-executor.3 Not tainted 6.12.54-syzkaller-00144-g5f0270f1ba00 #0 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 RIP: 0010:__fortify_report+0x96/0xc0 lib/string_helpers.c:1032 Call Trace: <TASK> __fortify_panic+0x1f/0x30 lib/string_helpers.c:1039 strnlen include/linux/fortify-string.h:235 [inline] sized_strscpy include/linux/fortify-string.h:309 [inline] parse_apply_sb_mount_options fs/ext4/super.c:2504 [inline] __ext4_fill_super fs/ext4/super.c:5261 [inline] ext4_fill_super+0x3c35/0xad00 fs/ext4/super.c:5706 get_tree_bdev_flags+0x387/0x620 fs/super.c:1636 vfs_get_tree+0x93/0x380 fs/super.c:1814 do_new_mount fs/namespace.c:3553 [inline] path_mount+0x6ae/0x1f70 fs/namespace.c:3880 do_mount fs/namespace.c:3893 [inline] __do_sys_mount fs/namespace.c:4103 [inline] __se_sys_mount fs/namespace.c:4080 [inline] __x64_sys_mount+0x280/0x300 fs/namespace.c:4080 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x64/0x140 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x76/0x7e
Since userspace is expected to provide s_mount_opts field to be at most 63 characters long with the ending byte being NUL-term, use a 64-byte buffer which matches the size of s_mount_opts, so that strscpy_pad() does its job properly. Return with error if the user still managed to provide a non-NUL-term string here.
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
Message-ID: <[email protected]>
--- fs/ext4/super.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
fs/ext4/super.c +4 -3
@@ -4282,10 +4282,11 @@ static int ext4_fill_super(struct super_ }if (sbi->s_es->s_mount_opts[0 ]) { -char s_mount_opts[65 ]; +char s_mount_opts[64 ]; -strscpy_pad (s_mount_opts, sbi->s_es->s_mount_opts, -sizeof (s_mount_opts)); +if (strscpy_pad (s_mount_opts, sbi->s_es->s_mount_opts, +sizeof (s_mount_opts)) <0 ) + goto failed_mount;if (!parse_options (s_mount_opts, sb, &journal_devnum, &journal_ioprio,0 )) { ext4_msg(sb, KERN_WARNING,
Greg Kroah-Hartman
maintainerPATCH 357/451 btrfs: dont rewrite ret from inode_permission
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josef Bacik <[email protected]>
[ Upstream commit 0185c2292c600993199bc6b1f342ad47a9e8c678 ]
In our user safe ino resolve ioctl we'll just turn any ret into -EACCES from inode_permission(). This is redundant, and could potentially be wrong if we had an ENOMEM in the security layer or some such other error, so simply return the actual return value.
Note: The patch was taken from v5 of fscrypt patchset
(https://lore.kernel.org/linux-btrfs/[email protected]/)
which was handled over time by various people: Omar Sandoval, Sweet Tea Dorminy, Josef Bacik.
--- fs/btrfs/ioctl.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
fs/btrfs/ioctl.c +1 -3
@@ -2573,10 +2573,8 @@ static int btrfs_search_path_in_tree_use } ret =inode_permission (temp_inode,MAY_READ |MAY_EXEC );iput (temp_inode); -if (ret) { - ret = -EACCES ; +if (ret) goto out_put; - }if (key.offset == upper_limit.objectid)break ;
Greg Kroah-Hartman
maintainerPATCH 358/451 xfs: fix a memory leak in xfs_buf_item_init()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haoxiang Li <[email protected]>
[ Upstream commit fc40459de82543b565ebc839dca8f7987f16f62e ]
xfs_buf_item_get_format() may allocate memory for bip->bli_formats, free the memory in the error path.
--- fs/xfs/xfs_buf_item.c | 1 + 1 file changed, 1 insertion(+)
fs/xfs/xfs_buf_item.c +1 -0
@@ -744,6 +744,7 @@ xfs_buf_item_init( map_size =DIV_ROUND_UP (chunks,NBWORD );if (map_size >XFS_BLF_DATAMAP_SIZE ) { +xfs_buf_item_free_format (bip);kmem_cache_free (xfs_buf_item_zone, bip); xfs_err(mp, "buffer item dirty bitmap (%u uints) too small to reflect %u bytes!",
Greg Kroah-Hartman
maintainerPATCH 359/451 f2fs: use global inline_xattr_slab instead of per-sb slab cache
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 1f27ef42bb0b7c0740c5616ec577ec188b8a1d05 ]
As Hong Yun reported in mailing list:
loop7: detected capacity change from 0 to 131072
------------[ cut here ]------------ kmem_cache of name 'f2fs_xattr_entry-7:7' already exists WARNING: CPU: 0 PID: 24426 at mm/slab_common.c:110 kmem_cache_sanity_check mm/slab_common.c:109 [inline] WARNING: CPU: 0 PID: 24426 at mm/slab_common.c:110 __kmem_cache_create_args+0xa6/0x320 mm/slab_common.c:307 CPU: 0 UID: 0 PID: 24426 Comm: syz.7.1370 Not tainted 6.17.0-rc4 #1 PREEMPT(full) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 RIP: 0010:kmem_cache_sanity_check mm/slab_common.c:109 [inline] RIP: 0010:__kmem_cache_create_args+0xa6/0x320 mm/slab_common.c:307 Call Trace: __kmem_cache_create include/linux/slab.h:353 [inline] f2fs_kmem_cache_create fs/f2fs/f2fs.h:2943 [inline] f2fs_init_xattr_caches+0xa5/0xe0 fs/f2fs/xattr.c:843 f2fs_fill_super+0x1645/0x2620 fs/f2fs/super.c:4918 get_tree_bdev_flags+0x1fb/0x260 fs/super.c:1692 vfs_get_tree+0x43/0x140 fs/super.c:1815 do_new_mount+0x201/0x550 fs/namespace.c:3808 do_mount fs/namespace.c:4136 [inline] __do_sys_mount fs/namespace.c:4347 [inline] __se_sys_mount+0x298/0x2f0 fs/namespace.c:4324 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0x8e/0x3a0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x76/0x7e
The bug can be reproduced w/ below scripts:
- mount /dev/vdb /mnt1
- mount /dev/vdc /mnt2
- umount /mnt1
- mounnt /dev/vdb /mnt1
The reason is if we created two slab caches, named f2fs_xattr_entry-7:3 and f2fs_xattr_entry-7:7, and they have the same slab size. Actually, slab system will only create one slab cache core structure which has slab name of "f2fs_xattr_entry-7:3", and two slab caches share the same structure and cache address.
So, if we destroy f2fs_xattr_entry-7:3 cache w/ cache address, it will decrease reference count of slab cache, rather than release slab cache entirely, since there is one more user has referenced the cache.
Then, if we try to create slab cache w/ name "f2fs_xattr_entry-7:3" again, slab system will find that there is existed cache which has the same name and trigger the warning.
Let's changes to use global inline_xattr_slab instead of per-sb slab cache for fixing.
--- fs/f2fs/f2fs.h | 3 --- fs/f2fs/super.c | 15 +++++++-------- fs/f2fs/xattr.c | 32 +++++++++++--------------------- fs/f2fs/xattr.h | 10 ++++++---- 4 files changed, 24 insertions(+), 36 deletions(-)
fs/f2fs/f2fs.h +0 -3
@@ -1573,9 +1573,6 @@ struct f2fs_sb_info {struct workqueue_struct *post_read_wq;/* post read workqueue */ -struct kmem_cache *inline_xattr_slab;/* inline xattr entry */ -unsigned int inline_xattr_slab_size;/* default inline xattr slab size */ -#ifdef CONFIG_F2FS_FS_COMPRESSION struct kmem_cache *page_array_slab;/* page array entry */ unsigned int page_array_slab_size;/* default page array slab size */
fs/f2fs/super.c +7 -8
@@ -1351,7 +1351,6 @@ static void f2fs_put_super(struct super_destroy_device_list (sbi);f2fs_destroy_page_array_cache (sbi); -f2fs_destroy_xattr_caches (sbi);mempool_destroy (sbi->write_io_dummy);#ifdef CONFIG_QUOTA for (i =0 ; i <MAXQUOTAS ; i++)
@@ -3722,13 +3721,9 @@ try_onemore: } } -/* init per sbi slab cache */ - err =f2fs_init_xattr_caches (sbi); -if (err) - goto free_io_dummy; err =f2fs_init_page_array_cache (sbi);if (err) - goto free_xattr_cache; + goto free_io_dummy;/* get an inode for meta space */ sbi->meta_inode =f2fs_iget (sb,F2FS_META_INO (sbi));
@@ -4021,8 +4016,6 @@ free_meta_inode: sbi->meta_inode =NULL ; free_page_array_cache:f2fs_destroy_page_array_cache (sbi); -free_xattr_cache: -f2fs_destroy_xattr_caches (sbi); free_io_dummy:mempool_destroy (sbi->write_io_dummy); free_percpu:
@@ -4174,7 +4167,12 @@ static int __init init_f2fs_fs(void) err =f2fs_init_compress_cache ();if (err) goto free_compress_mempool; + err =f2fs_init_xattr_cache (); +if (err) + goto free_compress_cache;return 0 ; +free_compress_cache: +f2fs_destroy_compress_cache (); free_compress_mempool:f2fs_destroy_compress_mempool (); free_bioset:
@@ -4210,6 +4208,7 @@ fail: static void __exit exit_f2fs_fs(void) { +f2fs_destroy_xattr_cache ();f2fs_destroy_compress_cache ();f2fs_destroy_compress_mempool ();f2fs_destroy_bioset ();
fs/f2fs/xattr.c +11 -21
@@ -23,11 +23,12 @@#include "xattr.h" #include "segment.h" +static struct kmem_cache *inline_xattr_slab;static void *xattr_alloc (struct f2fs_sb_info *sbi,int size,bool *is_inline) { -if (likely (size == sbi->inline_xattr_slab_size)) { +if (likely (size ==DEFAULT_XATTR_SLAB_SIZE )) { *is_inline = true; -return kmem_cache_zalloc (sbi->inline_xattr_slab,GFP_NOFS ); +return kmem_cache_zalloc (inline_xattr_slab,GFP_NOFS ); } *is_inline = false;return f2fs_kzalloc (sbi, size,GFP_NOFS );
@@ -37,7 +38,7 @@ static void xattr_free(struct f2fs_sb_in bool is_inline) {if (is_inline) -kmem_cache_free (sbi->inline_xattr_slab, xattr_addr); +kmem_cache_free (inline_xattr_slab, xattr_addr);else kfree (xattr_addr); }
@@ -814,25 +815,14 @@ int f2fs_setxattr(struct inode *inode, ireturn err; } -int f2fs_init_xattr_caches (struct f2fs_sb_info *sbi) +int __init f2fs_init_xattr_cache (void ) { -dev_t dev = sbi->sb->s_bdev->bd_dev; -char slab_name[32 ]; - -sprintf (slab_name,"f2fs_xattr_entry-%u:%u" ,MAJOR (dev),MINOR (dev)); - - sbi->inline_xattr_slab_size =F2FS_OPTION (sbi).inline_xattr_size * -sizeof (__le32) +XATTR_PADDING_SIZE ; - - sbi->inline_xattr_slab =f2fs_kmem_cache_create (slab_name, - sbi->inline_xattr_slab_size); -if (!sbi->inline_xattr_slab) -return -ENOMEM ; - -return 0 ; + inline_xattr_slab =f2fs_kmem_cache_create ("f2fs_xattr_entry" , +DEFAULT_XATTR_SLAB_SIZE ); +return inline_xattr_slab ?0 : -ENOMEM ; } -void f2fs_destroy_xattr_caches (struct f2fs_sb_info *sbi) +void f2fs_destroy_xattr_cache (void ) { -kmem_cache_destroy (sbi->inline_xattr_slab); -} +kmem_cache_destroy (inline_xattr_slab); +}
fs/f2fs/xattr.h +6 -4
@@ -88,6 +88,8 @@ struct f2fs_xattr_entry { F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) - \ DEF_INLINE_RESERVED_SIZE - \ MIN_INLINE_DENTRY_SIZE / sizeof(__le32)) +#define DEFAULT_XATTR_SLAB_SIZE (DEFAULT_INLINE_XATTR_ADDRS * \ + sizeof(__le32) + XATTR_PADDING_SIZE)/* * On-disk structure of f2fs_xattr
@@ -131,8 +133,8 @@ extern int f2fs_setxattr(struct inode *,extern int f2fs_getxattr (struct inode *,int ,const char *,void *,size_t ,struct page *);extern ssize_t f2fs_listxattr (struct dentry *,char *,size_t ); -extern int f2fs_init_xattr_caches (struct f2fs_sb_info *); -extern void f2fs_destroy_xattr_caches (struct f2fs_sb_info *); +extern int __init f2fs_init_xattr_cache (void ); +extern void f2fs_destroy_xattr_cache (void );#else #define f2fs_xattr_handlers NULL
@@ -149,8 +151,8 @@ static inline int f2fs_getxattr(struct i {return -EOPNOTSUPP ; } -static inline int f2fs_init_xattr_caches (struct f2fs_sb_info *sbi) {return 0 ; } -static inline void f2fs_destroy_xattr_caches (struct f2fs_sb_info *sbi) { } +static inline int __init f2fs_init_xattr_cache (void ) {return 0 ; } +static inline void f2fs_destroy_xattr_cache (void ) { }#endif #ifdef CONFIG_F2FS_FS_SECURITY
Greg Kroah-Hartman
maintainerPATCH 360/451 f2fs: fix to detect recoverable inode during dryrun of find_fsync_dnodes()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 68d05693f8c031257a0822464366e1c2a239a512 ]
mkfs.f2fs -f /dev/vdd
mount /dev/vdd /mnt/f2fs
touch /mnt/f2fs/foo
sync # avoid CP_UMOUNT_FLAG in last f2fs_checkpoint.ckpt_flags
touch /mnt/f2fs/barf2fs_io fsync /mnt/f2fs/barf2fs_io shutdown 2 /mnt/f2fs
umount /mnt/f2fs
blockdev --setro /dev/vdd
mount /dev/vdd /mnt/f2fs
mount: /mnt/f2fs: WARNING: source write-protected, mounted read-only.
For the case if we create and fsync a new inode before sudden power-cut, without norecovery or disable_roll_forward mount option, the following mount will succeed w/o recovering last fsynced inode.
The problem here is that we only check inode_list list after find_fsync_dnodes() in f2fs_recover_fsync_data() to find out whether there is recoverable data in the iamge, but there is a missed case, if last fsynced inode is not existing in last checkpoint, then, we will fail to get its inode due to nat of inode node is not existing in last checkpoint, so the inode won't be linked in inode_list.
Let's detect such case in dyrun mode to fix this issue.
After this change, mount will fail as expected below:
mount: /mnt/f2fs: cannot mount /dev/vdd read-only.
dmesg(1) may have more information after failed mount system call.
demsg:
F2FS-fs (vdd): Need to recover fsync data, but write access unavailable, please try mount w/ disable_roll_forward or norecovery
--- fs/f2fs/recovery.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
fs/f2fs/recovery.c +6 -3
@@ -328,7 +328,7 @@ static int recover_inode(struct inode *i }static int find_fsync_dnodes (struct f2fs_sb_info *sbi,struct list_head *head, -bool check_only) +bool check_only,bool *new_inode) {struct curseg_info *curseg;struct page *page =NULL ;
@@ -385,6 +385,8 @@ static int find_fsync_dnodes(struct f2fsif (IS_ERR (entry)) { err =PTR_ERR (entry);if (err == -ENOENT ) { +if (check_only) + *new_inode = true; err =0 ; goto next; }
@@ -789,6 +791,7 @@ int f2fs_recover_fsync_data(struct f2fs_unsigned long s_flags = sbi->sb->s_flags;bool need_writecp = false;bool fix_curseg_write_pointer = false; +bool new_inode = false;#ifdef CONFIG_QUOTA int quota_enabled;#endif
@@ -813,8 +816,8 @@ int f2fs_recover_fsync_data(struct f2fs_mutex_lock (&sbi->cp_mutex);/* step #1: find fsynced inode numbers */ - err =find_fsync_dnodes (sbi, &inode_list, check_only); -if (err ||list_empty (&inode_list)) + err =find_fsync_dnodes (sbi, &inode_list, check_only, &new_inode); +if (err <0 || (list_empty (&inode_list) && (!check_only || !new_inode))) goto skip;if (check_only) {
Greg Kroah-Hartman
maintainerPATCH 361/451 f2fs: fix to propagate error from f2fs_enable_checkpoint()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit be112e7449a6e1b54aa9feac618825d154b3a5c7 ]
In order to let userspace detect such error rather than suffering silent failure.
--- fs/f2fs/super.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-)
fs/f2fs/super.c +15 -9
@@ -1836,9 +1836,10 @@ restore_flag:return err; } -static void f2fs_enable_checkpoint (struct f2fs_sb_info *sbi) +static int f2fs_enable_checkpoint (struct f2fs_sb_info *sbi) {int retry =DEFAULT_RETRY_IO_COUNT ; +int ret;/* we should flush all the data to keep data consistency */ do {
@@ -1857,7 +1858,11 @@ static void f2fs_enable_checkpoint(strucset_sbi_flag (sbi,SBI_IS_DIRTY );up_write (&sbi->gc_lock); -f2fs_sync_fs (sbi->sb,1 ); + ret =f2fs_sync_fs (sbi->sb,1 ); +if (ret) +f2fs_err (sbi,"%s sync_fs failed, ret: %d" , __func__, ret); + +return ret; }static int f2fs_remount (struct super_block *sb,int *flags,char *data)
@@ -2005,7 +2010,9 @@ static int f2fs_remount(struct super_bloif (err) goto restore_gc; }else { -f2fs_enable_checkpoint (sbi); + err =f2fs_enable_checkpoint (sbi); +if (err) + goto restore_gc; } }
@@ -3933,13 +3940,12 @@ reset_checkpoint:/* f2fs_recover_fsync_data() cleared this already */ clear_sbi_flag (sbi,SBI_POR_DOING ); -if (test_opt (sbi,DISABLE_CHECKPOINT )) { +if (test_opt (sbi,DISABLE_CHECKPOINT )) err =f2fs_disable_checkpoint (sbi); -if (err) - goto sync_free_meta; - }else if (is_set_ckpt_flags (sbi,CP_DISABLED_FLAG )) { -f2fs_enable_checkpoint (sbi); - } +else if (is_set_ckpt_flags (sbi,CP_DISABLED_FLAG )) + err =f2fs_enable_checkpoint (sbi); +if (err) + goto sync_free_meta;/* * If filesystem is not mounted as read-only then
Greg Kroah-Hartman
maintainerPATCH 362/451 f2fs: fix to avoid updating zero-sized extent in extent cache
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 7c37c79510329cd951a4dedf3f7bf7e2b18dccec ]
As syzbot reported:
F2FS-fs (loop0): __update_extent_tree_range: extent len is zero, type: 0, extent [0, 0, 0], age [0, 0]
------------[ cut here ]------------ kernel BUG at fs/f2fs/extent_cache.c:678! Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI CPU: 0 UID: 0 PID: 5336 Comm: syz.0.0 Not tainted syzkaller #0 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 RIP: 0010:__update_extent_tree_range+0x13bc/0x1500 fs/f2fs/extent_cache.c:678 Call Trace: <TASK> f2fs_update_read_extent_cache_range+0x192/0x3e0 fs/f2fs/extent_cache.c:1085 f2fs_do_zero_range fs/f2fs/file.c:1657 [inline] f2fs_zero_range+0x10c1/0x1580 fs/f2fs/file.c:1737 f2fs_fallocate+0x583/0x990 fs/f2fs/file.c:2030 vfs_fallocate+0x669/0x7e0 fs/open.c:342 ioctl_preallocate fs/ioctl.c:289 [inline] file_ioctl+0x611/0x780 fs/ioctl.c:-1 do_vfs_ioctl+0xb33/0x1430 fs/ioctl.c:576 __do_sys_ioctl fs/ioctl.c:595 [inline] __se_sys_ioctl+0x82/0x170 fs/ioctl.c:583 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f07bc58eec9
In error path of f2fs_zero_range(), it may add a zero-sized extent into extent cache, it should be avoided.
--- fs/f2fs/file.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/f2fs/file.c +2 -1
@@ -1458,7 +1458,8 @@ static int f2fs_do_zero_range(struct dnof2fs_set_data_blkaddr (dn); } -f2fs_update_extent_cache_range (dn, start,0 , index - start); +if (index > start) +f2fs_update_extent_cache_range (dn, start,0 , index - start);return ret; }
Greg Kroah-Hartman
maintainerPATCH 363/451 usb: dwc3: keep susphy enabled during exit to avoid controller faults
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Udipto Goswami <[email protected]>
[ Upstream commit e1003aa7ec9eccdde4c926bd64ef42816ad55f25 ]
On some platforms, switching USB roles from host to device can trigger controller faults due to premature PHY power-down. This occurs when the PHY is disabled too early during teardown, causing synchronization issues between the PHY and controller.
Keep susphy enabled during dwc3_host_exit() and dwc3_gadget_exit() ensures the PHY remains in a low-power state capable of handling required commands during role switch.
--- drivers/usb/dwc3/gadget.c | 2 +- drivers/usb/dwc3/host.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/usb/dwc3/gadget.c +1 -1
@@ -4109,7 +4109,7 @@ void dwc3_gadget_exit(struct dwc3 *dwc)if (!dwc->gadget)return ; -dwc3_enable_susphy (dwc, false); +dwc3_enable_susphy (dwc, true);usb_del_gadget (dwc->gadget);dwc3_gadget_free_endpoints (dwc);usb_put_gadget (dwc->gadget);
drivers/usb/dwc3/host.c +1 -1
@@ -155,7 +155,7 @@ err:void dwc3_host_exit (struct dwc3 *dwc) { -dwc3_enable_susphy (dwc, false); +dwc3_enable_susphy (dwc, true);platform_device_unregister (dwc->xhci); dwc->xhci =NULL ; }
Greg Kroah-Hartman
maintainerPATCH 364/451 mptcp: pm: ignore unknown endpoint flags
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Matthieu Baerts (NGI0)" <[email protected]>
[ Upstream commit 0ace3297a7301911e52d8195cb1006414897c859 ]
Before this patch, the kernel was saving any flags set by the userspace, even unknown ones. This doesn't cause critical issues because the kernel is only looking at specific ones. But on the other hand, endpoints dumps could tell the userspace some recent flags seem to be supported on older kernel versions.
Instead, ignore all unknown flags when parsing them. By doing that, the userspace can continue to set unsupported flags, but it has a way to verify what is supported by the kernel.
Note that it sounds better to continue accepting unsupported flags not to change the behaviour, but also that eases things on the userspace side by adding "optional" endpoint types only supported by newer kernel versions without having to deal with the different kernel versions.
A note for the backports: there will be conflicts in mptcp.h on older versions not having the mentioned flags, the new line should still be added last, and the '5' needs to be adapted to have the same value as the last entry.
--- include/uapi/linux/mptcp.h | 1 + net/mptcp/pm_netlink.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-)
include/uapi/linux/mptcp.h +1 -0
@@ -72,6 +72,7 @@ enum {#define MPTCP_PM_ADDR_FLAG_SIGNAL (1 << 0)#define MPTCP_PM_ADDR_FLAG_SUBFLOW (1 << 1)#define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2) +#define MPTCP_PM_ADDR_FLAGS_MASK GENMASK(2, 0)enum {MPTCP_PM_CMD_UNSPEC ,
net/mptcp/pm_netlink.c +2 -1
@@ -721,7 +721,8 @@ skip_family: entry->addr.id =nla_get_u8 (tb[MPTCP_PM_ADDR_ATTR_ID ]);if (tb[MPTCP_PM_ADDR_ATTR_FLAGS ]) - entry->addr.flags =nla_get_u32 (tb[MPTCP_PM_ADDR_ATTR_FLAGS ]); + entry->addr.flags =nla_get_u32 (tb[MPTCP_PM_ADDR_ATTR_FLAGS ]) & +MPTCP_PM_ADDR_FLAGS_MASK ;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 365/451 usb: ohci-nxp: Use helper function devm_clk_get_enabled()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Zekun <[email protected]>
[ Upstream commit c146ede472717f352b7283a525bd9a1a2b15e2cf ]
devm_clk_get() and clk_prepare_enable() can be replaced by helper function devm_clk_get_enabled(). Let's use devm_clk_get_enabled() to simplify code and avoid calling clk_disable_unprepare().
Stable-dep-of: b4c61e542faf ("usb: ohci-nxp: fix device leak on probe failure")
--- drivers/usb/host/ohci-nxp.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-)
drivers/usb/host/ohci-nxp.c +4 -14
@@ -51,8 +51,6 @@ static struct hc_driver __read_mostly ohstatic struct i2c_client *isp1301_i2c_client; -static struct clk *usb_host_clk; -static void isp1301_configure_lpc32xx (void ) {/* LPC32XX only supports DAT_SE0 USB mode */
@@ -155,6 +153,7 @@ static int ohci_hcd_nxp_probe(struct plastruct resource *res;int ret =0 , irq;struct device_node *isp1301_node; +struct clk *usb_host_clk;if (pdev->dev.of_node) { isp1301_node = of_parse_phandle(pdev->dev.of_node,
@@ -180,26 +179,20 @@ static int ohci_hcd_nxp_probe(struct pla }/* Enable USB host clock */ - usb_host_clk =devm_clk_get (&pdev->dev,NULL ); + usb_host_clk =devm_clk_get_enabled (&pdev->dev,NULL );if (IS_ERR (usb_host_clk)) { -dev_err (&pdev->dev,"failed to acquire USB OHCI clock\n" ); +dev_err (&pdev->dev,"failed to acquire and start USB OHCI clock\n" ); ret =PTR_ERR (usb_host_clk); goto fail_disable; } - ret =clk_prepare_enable (usb_host_clk); -if (ret <0 ) { -dev_err (&pdev->dev,"failed to start USB OHCI clock\n" ); - goto fail_disable; - } -isp1301_configure (); hcd =usb_create_hcd (driver, &pdev->dev,dev_name (&pdev->dev));if (!hcd) {dev_err (&pdev->dev,"Failed to allocate HC buffer\n" ); ret = -ENOMEM ; - goto fail_hcd; + goto fail_disable; } res =platform_get_resource (pdev,IORESOURCE_MEM ,0 );
@@ -230,8 +223,6 @@ static int ohci_hcd_nxp_probe(struct plaohci_nxp_stop_hc (); fail_resource:usb_put_hcd (hcd); -fail_hcd: -clk_disable_unprepare (usb_host_clk); fail_disable: isp1301_i2c_client =NULL ;return ret;
@@ -244,7 +235,6 @@ static int ohci_hcd_nxp_remove(struct plusb_remove_hcd (hcd);ohci_nxp_stop_hc ();usb_put_hcd (hcd); -clk_disable_unprepare (usb_host_clk); isp1301_i2c_client =NULL ;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 366/451 usb: ohci-nxp: fix device leak on probe failure
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
[ Upstream commit b4c61e542faf8c9131d69ecfc3ad6de96d1b2ab8 ]
Make sure to drop the reference taken when looking up the PHY I2C device during probe on probe failure (e.g. probe deferral) and on driver unbind.
--- drivers/usb/host/ohci-nxp.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/host/ohci-nxp.c +2 -0
@@ -224,6 +224,7 @@ static int ohci_hcd_nxp_probe(struct pla fail_resource:usb_put_hcd (hcd); fail_disable: +put_device (&isp1301_i2c_client->dev); isp1301_i2c_client =NULL ;return ret; }
@@ -235,6 +236,7 @@ static int ohci_hcd_nxp_remove(struct plusb_remove_hcd (hcd);ohci_nxp_stop_hc ();usb_put_hcd (hcd); +put_device (&isp1301_i2c_client->dev); isp1301_i2c_client =NULL ;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 367/451 jbd2: fix the inconsistency between checksum and data in memory for journal sb
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ye Bin <[email protected]>
[ Upstream commit 6abfe107894af7e8ce3a2e120c619d81ee764ad5 ]
Copying the file system while it is mounted as read-only results in a mount failure:
[~]# mkfs.ext4 -F /dev/sdc
[~]# mount /dev/sdc -o ro /mnt/test
[~]# dd if=/dev/sdc of=/dev/sda bs=1M
[~]# mount /dev/sda /mnt/test1
[ 1094.849826] JBD2: journal checksum error [ 1094.850927] EXT4-fs (sda): Could not load journal inode
mount: mount /dev/sda on /mnt/test1 failed: Bad message
The process described above is just an abstracted way I came up with to reproduce the issue. In the actual scenario, the file system was mounted read-only and then copied while it was still mounted. It was found that the mount operation failed. The user intended to verify the data or use it as a backup, and this action was performed during a version upgrade. Above issue may happen as follows:ext4_fill_super
set_journal_csum_feature_set(sb)
if (ext4_has_metadata_csum(sb))
incompat = JBD2_FEATURE_INCOMPAT_CSUM_V3;
if (test_opt(sb, JOURNAL_CHECKSUM)
jbd2_journal_set_features(sbi->s_journal, compat, 0, incompat);
lock_buffer(journal->j_sb_buffer);
sb->s_feature_incompat |= cpu_to_be32(incompat);
//The data in the journal sb was modified, but the checksum was not
updated, so the data remaining in memory has a mismatch between the
data and the checksum.
unlock_buffer(journal->j_sb_buffer);In this case, the journal sb copied over is in a state where the checksum and data are inconsistent, so mounting fails.
To solve the above issue, update the checksum in memory after modifying the journal sb.
Message-ID: <[email protected]>
--- fs/jbd2/journal.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
fs/jbd2/journal.c +14 -0
@@ -2224,6 +2224,12 @@ int jbd2_journal_set_features(journal_t sb->s_feature_compat |=cpu_to_be32 (compat); sb->s_feature_ro_compat |=cpu_to_be32 (ro); sb->s_feature_incompat |=cpu_to_be32 (incompat); +/* +* Update the checksum now so that it is valid even for read-only +* filesystems where jbd2_write_superblock() doesn't get called. +*/ +if (jbd2_journal_has_csum_v2or3 (journal)) + sb->s_checksum =jbd2_superblock_csum (journal, sb);unlock_buffer (journal->j_sb_buffer); journal->j_revoke_records_per_block =journal_revoke_records_per_block (journal);
@@ -2254,9 +2260,17 @@ void jbd2_journal_clear_features(journal sb = journal->j_superblock; +lock_buffer (journal->j_sb_buffer); sb->s_feature_compat &= ~cpu_to_be32 (compat); sb->s_feature_ro_compat &= ~cpu_to_be32 (ro); sb->s_feature_incompat &= ~cpu_to_be32 (incompat); +/* +* Update the checksum now so that it is valid even for read-only +* filesystems where jbd2_write_superblock() doesn't get called. +*/ +if (jbd2_journal_has_csum_v2or3 (journal)) + sb->s_checksum =jbd2_superblock_csum (journal, sb); +unlock_buffer (journal->j_sb_buffer); journal->j_revoke_records_per_block =journal_revoke_records_per_block (journal); }
Greg Kroah-Hartman
maintainerPATCH 368/451 tpm: Cap the number of PCR banks
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Sakkinen <[email protected]>
[ Upstream commit faf07e611dfa464b201223a7253e9dc5ee0f3c9e ]
tpm2_get_pcr_allocation() does not cap any upper limit for the number of banks. Cap the limit to eight banks so that out of bounds values coming from external I/O cause on only limited harm.
--- drivers/char/tpm/tpm-chip.c | 1 - drivers/char/tpm/tpm1-cmd.c | 5 ----- drivers/char/tpm/tpm2-cmd.c | 8 +++----- include/linux/tpm.h | 9 ++++++--- 4 files changed, 9 insertions(+), 14 deletions(-)
drivers/char/tpm/tpm-chip.c +0 -1
@@ -269,7 +269,6 @@ static void tpm_dev_release(struct devickfree (chip->work_space.context_buf);kfree (chip->work_space.session_buf); -kfree (chip->allocated_banks);kfree (chip); }
drivers/char/tpm/tpm1-cmd.c +0 -5
@@ -794,11 +794,6 @@ int tpm1_pm_suspend(struct tpm_chip *chi*/ int tpm1_get_pcr_allocation (struct tpm_chip *chip) { - chip->allocated_banks =kcalloc (1 ,sizeof (*chip->allocated_banks), -GFP_KERNEL ); -if (!chip->allocated_banks) -return -ENOMEM ; - chip->allocated_banks[0 ].alg_id =TPM_ALG_SHA1 ; chip->allocated_banks[0 ].digest_size = hash_digest_size[HASH_ALGO_SHA1 ]; chip->allocated_banks[0 ].crypto_id =HASH_ALGO_SHA1 ;
drivers/char/tpm/tpm2-cmd.c +3 -5
@@ -574,11 +574,9 @@ ssize_t tpm2_get_pcr_allocation(struct t nr_possible_banks =be32_to_cpup ( (__be32 *)&buf.data[TPM_HEADER_SIZE +5 ]); - - chip->allocated_banks =kcalloc (nr_possible_banks, -sizeof (*chip->allocated_banks), -GFP_KERNEL ); -if (!chip->allocated_banks) { +if (nr_possible_banks >TPM2_MAX_PCR_BANKS ) { +pr_err ("tpm: out of bank capacity: %u > %u\n" , + nr_possible_banks,TPM2_MAX_PCR_BANKS ); rc = -ENOMEM ; goto out; }
include/linux/tpm.h +6 -3
@@ -25,7 +25,10 @@#include <crypto/hash_info.h> #define TPM_DIGEST_SIZE 20/* Max TPM v1.2 PCR size */ -#define TPM_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE + +#define TPM2_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE +#define TPM2_MAX_PCR_BANKS 8 +#define TPM_MAX_DIGEST_SIZE TPM2_MAX_DIGEST_SIZEstruct tpm_chip ;struct trusted_key_payload ;
@@ -44,7 +47,7 @@ enum tpm_algorithms {struct tpm_digest {u16 alg_id; -u8 digest[TPM_MAX_DIGEST_SIZE ]; +u8 digest[TPM2_MAX_DIGEST_SIZE ]; } __packed;struct tpm_bank_info {
@@ -150,7 +153,7 @@ struct tpm_chip {unsigned int groups_cnt;u32 nr_allocated_banks; -struct tpm_bank_info *allocated_banks; +struct tpm_bank_info allocated_banks[TPM2_MAX_PCR_BANKS ];#ifdef CONFIG_ACPI acpi_handle acpi_dev_handle;char ppi_version[TPM_PPI_VERSION_LEN +1 ];
Greg Kroah-Hartman
maintainerPATCH 369/451 NFSD: Clear SECLABEL in the suppattr_exclcreat bitmap
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit 27d17641cacfedd816789b75d342430f6b912bd2 ]
Quoted 1 line
Quoted 1 line
From RFC 8881:
5.8.1.14. Attribute 75: suppattr_exclcreat
Quoted 4 lines
The bit vector that would set all REQUIRED and RECOMMENDED attributes that are supported by the
EXCLUSIVE4_1method of file creation via the OPEN operation. The scope of this attribute applies to all objects with a matching fsid.
There's nothing in RFC 8881 that states that suppattr_exclcreat is or is not allowed to contain bits for attributes that are clear in the reported supported_attrs bitmask. But it doesn't make sense for an NFS server to indicate that it /doesn't/ implement an attribute, but then also indicate that clients /are/ allowed to set that attribute using OPEN(create) with EXCLUSIVE4_1.
Ensure that the SECURITY_LABEL and ACL bits are not set in the suppattr_exclcreat bitmask when they are also not set in the supported_attrs bitmask.
--- fs/nfsd/nfs4xdr.c | 5 +++++ 1 file changed, 5 insertions(+)
fs/nfsd/nfs4xdr.c +5 -0
@@ -3408,6 +3408,11 @@ out_acl:u32 supp[3 ];memcpy (supp, nfsd_suppattrs[minorversion],sizeof (supp)); +if (!IS_POSIXACL (d_inode (dentry))) + supp[0 ] &= ~FATTR4_WORD0_ACL ; +if (!contextsupport) + supp[2 ] &= ~FATTR4_WORD2_SECURITY_LABEL ; + supp[0 ] &=NFSD_SUPPATTR_EXCLCREAT_WORD0 ; supp[1 ] &=NFSD_SUPPATTR_EXCLCREAT_WORD1 ; supp[2 ] &=NFSD_SUPPATTR_EXCLCREAT_WORD2 ;
Greg Kroah-Hartman
maintainerPATCH 370/451 SUNRPC: svcauth_gss: avoid NULL deref on zero length gss_token in gss_read_proxy_verf
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joshua Rogers <[email protected]>
[ Upstream commit d4b69a6186b215d2dc1ebcab965ed88e8d41768d ]
A zero length gss_token results in pages == 0 and in_token->pages[0] is NULL. The code unconditionally evaluates page_address(in_token->pages[0]) for the initial memcpy, which can dereference NULL even when the copy length is 0. Guard the first memcpy so it only runs when length > 0.
--- net/sunrpc/auth_gss/svcauth_gss.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/sunrpc/auth_gss/svcauth_gss.c +2 -1
@@ -1177,7 +1177,8 @@ static int gss_read_proxy_verf(struct sv } length = min_t(unsigned int, inlen, argv->iov_len); -memcpy (page_address (in_token->pages[0 ]), argv->iov_base, length); +if (length) +memcpy (page_address (in_token->pages[0 ]), argv->iov_base, length); inlen -= length; to_offs = length;
Greg Kroah-Hartman
maintainerPATCH 371/451 hwmon: replace snprintf in show functions with sysfs_emit
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit 1f4d4af4d7a1c794a4f003f75fcfd38fafb5dff3 ]
coccicheck complains about the use of snprintf() in sysfs show functions.
drivers/hwmon/ina3221.c:701:8-16: WARNING: use scnprintf or sprintf
This results in a large number of patch submissions. Fix it all in one go using the following coccinelle rules. Use sysfs_emit instead of scnprintf or sprintf since that makes more sense.
@depends on patch@
identifier show, dev, attr, buf;
@@
ssize_t show(struct device *dev, struct device_attribute *attr, char *buf)
{
<...
return
- snprintf(buf, \( PAGE_SIZE \| PAGE_SIZE - 1 \),
+ sysfs_emit(buf,
...);
...>
}@depends on patch@
identifier show, dev, attr, buf, rc;
@@
ssize_t show(struct device *dev, struct device_attribute *attr, char *buf)
{
<...
rc =
- snprintf(buf, \( PAGE_SIZE \| PAGE_SIZE - 1 \),
+ sysfs_emit(buf,
...);
...>
}While at it, remove unnecessary braces and as well as unnecessary else after return statements to address checkpatch warnings in the resulting patch.
Stable-dep-of: b8d5acdcf525 ("hwmon: (max16065) Use local variable to avoid TOCTOU")
--- drivers/hwmon/applesmc.c | 34 +++++++++--------- drivers/hwmon/ina209.c | 6 +-- drivers/hwmon/ina2xx.c | 2 - drivers/hwmon/ina3221.c | 2 - drivers/hwmon/lineage-pem.c | 8 ++-- drivers/hwmon/ltc2945.c | 4 +- drivers/hwmon/ltc2990.c | 2 - drivers/hwmon/ltc4151.c | 2 - drivers/hwmon/ltc4215.c | 8 ++-- drivers/hwmon/ltc4222.c | 4 +- drivers/hwmon/ltc4260.c | 4 +- drivers/hwmon/ltc4261.c | 4 +- drivers/hwmon/max16065.c | 14 +++---- drivers/hwmon/occ/common.c | 69 ++++++++++++++++++------------------- drivers/hwmon/occ/sysfs.c | 4 +- drivers/hwmon/pmbus/inspur-ipsps.c | 28 +++++++-------- drivers/hwmon/pmbus/pmbus_core.c | 8 ++-- drivers/hwmon/s3c-hwmon.c | 4 +- drivers/hwmon/sch5627.c | 24 ++++++------ drivers/hwmon/sch5636.c | 20 +++++----- drivers/hwmon/smm665.c | 4 +- drivers/hwmon/stts751.c | 20 +++++----- drivers/hwmon/vexpress-hwmon.c | 12 +++--- drivers/hwmon/xgene-hwmon.c | 14 +++---- 24 files changed, 151 insertions(+), 150 deletions(-)
drivers/hwmon/applesmc.c +17 -17
@@ -741,7 +741,7 @@ static void applesmc_idev_poll(struct instatic ssize_t applesmc_name_show (struct device *dev,struct device_attribute *attr,char *buf) { -return snprintf (buf,PAGE_SIZE ,"applesmc\n" ); +return sysfs_emit (buf,"applesmc\n" ); } static ssize_t applesmc_position_show(struct device *dev,
@@ -763,8 +763,8 @@ static ssize_t applesmc_position_show(st out:if (ret)return ret; -else -return snprintf (buf,PAGE_SIZE ,"(%d,%d,%d)\n" , x, y, z); + +return sysfs_emit (buf,"(%d,%d,%d)\n" , x, y, z); } static ssize_t applesmc_light_show(struct device *dev,
@@ -804,8 +804,8 @@ static ssize_t applesmc_light_show(struc out:if (ret)return ret; -else -return snprintf (sysfsbuf,PAGE_SIZE ,"(%d,%d)\n" , left, right); + +return sysfs_emit (sysfsbuf,"(%d,%d)\n" , left, right); }/* Displays sensor key as label */
@@ -814,7 +814,7 @@ static ssize_t applesmc_show_sensor_labe {const char *key = smcreg.index[to_index (devattr)]; -return snprintf (sysfsbuf,PAGE_SIZE ,"%s\n" , key); +return sysfs_emit (sysfsbuf,"%s\n" , key); }/* Displays degree Celsius * 1000 */
@@ -832,7 +832,7 @@ static ssize_t applesmc_show_temperature temp =250 * (value >>6 ); -return snprintf (sysfsbuf,PAGE_SIZE ,"%d\n" , temp); +return sysfs_emit (sysfsbuf,"%d\n" , temp); } static ssize_t applesmc_show_fan_speed(struct device *dev,
@@ -851,7 +851,7 @@ static ssize_t applesmc_show_fan_speed(sreturn ret; speed = ((buffer[0 ] <<8 | buffer[1 ]) >>2 ); -return snprintf (sysfsbuf,PAGE_SIZE ,"%u\n" , speed); +return sysfs_emit (sysfsbuf,"%u\n" , speed); } static ssize_t applesmc_store_fan_speed(struct device *dev,
@@ -891,7 +891,7 @@ static ssize_t applesmc_show_fan_manual(return ret; manual = ((buffer[0 ] <<8 | buffer[1 ]) >>to_index (attr)) &0x01 ; -return snprintf (sysfsbuf,PAGE_SIZE ,"%d\n" , manual); +return sysfs_emit (sysfsbuf,"%d\n" , manual); } static ssize_t applesmc_store_fan_manual(struct device *dev,
@@ -943,14 +943,14 @@ static ssize_t applesmc_show_fan_positioif (ret)return ret; -else -return snprintf (sysfsbuf,PAGE_SIZE ,"%s\n" , buffer+4 ); + +return sysfs_emit (sysfsbuf,"%s\n" , buffer +4 ); }static ssize_t applesmc_calibrate_show (struct device *dev,struct device_attribute *attr,char *sysfsbuf) { -return snprintf (sysfsbuf,PAGE_SIZE ,"(%d,%d)\n" , rest_x, rest_y); +return sysfs_emit (sysfsbuf,"(%d,%d)\n" , rest_x, rest_y); } static ssize_t applesmc_calibrate_store(struct device *dev,
@@ -992,7 +992,7 @@ static ssize_t applesmc_key_count_show(s count = ((u32 )buffer[0 ]<<24 ) + ((u32 )buffer[1 ]<<16 ) + ((u32 )buffer[2 ]<<8 ) + buffer[3 ]; -return snprintf (sysfsbuf,PAGE_SIZE ,"%d\n" , count); +return sysfs_emit (sysfsbuf,"%d\n" , count); } static ssize_t applesmc_key_at_index_read_show(struct device *dev,
@@ -1020,7 +1020,7 @@ static ssize_t applesmc_key_at_index_datif (IS_ERR (entry))return PTR_ERR (entry); -return snprintf (sysfsbuf,PAGE_SIZE ,"%d\n" , entry->len); +return sysfs_emit (sysfsbuf,"%d\n" , entry->len); } static ssize_t applesmc_key_at_index_type_show(struct device *dev,
@@ -1032,7 +1032,7 @@ static ssize_t applesmc_key_at_index_typif (IS_ERR (entry))return PTR_ERR (entry); -return snprintf (sysfsbuf,PAGE_SIZE ,"%s\n" , entry->type); +return sysfs_emit (sysfsbuf,"%s\n" , entry->type); } static ssize_t applesmc_key_at_index_name_show(struct device *dev,
@@ -1044,13 +1044,13 @@ static ssize_t applesmc_key_at_index_namif (IS_ERR (entry))return PTR_ERR (entry); -return snprintf (sysfsbuf,PAGE_SIZE ,"%s\n" , entry->key); +return sysfs_emit (sysfsbuf,"%s\n" , entry->key); }static ssize_t applesmc_key_at_index_show (struct device *dev,struct device_attribute *attr,char *sysfsbuf) { -return snprintf (sysfsbuf,PAGE_SIZE ,"%d\n" , key_at_index); +return sysfs_emit (sysfsbuf,"%d\n" , key_at_index); } static ssize_t applesmc_key_at_index_store(struct device *dev,
drivers/hwmon/ina209.c +3 -3
@@ -259,7 +259,7 @@ static ssize_t ina209_interval_show(stru {struct ina209_data *data =dev_get_drvdata (dev); -return snprintf (buf,PAGE_SIZE ,"%d\n" , data->update_interval); +return sysfs_emit (buf,"%d\n" , data->update_interval); }/*
@@ -343,7 +343,7 @@ static ssize_t ina209_value_show(structreturn PTR_ERR (data); val =ina209_from_reg (attr->index, data->regs[attr->index]); -return snprintf (buf,PAGE_SIZE ,"%ld\n" , val); +return sysfs_emit (buf,"%ld\n" , val); } static ssize_t ina209_alarm_show(struct device *dev,
@@ -363,7 +363,7 @@ static ssize_t ina209_alarm_show(struct* All alarms are in the INA209_STATUS register. To avoid a long * switch statement, the mask is passed in attr->index */ -return snprintf (buf,PAGE_SIZE ,"%u\n" , !!(status & mask)); +return sysfs_emit (buf,"%u\n" , !!(status & mask)); }/* Shunt voltage, history, limits, alarms */
drivers/hwmon/ina2xx.c +1 -1
@@ -386,7 +386,7 @@ static ssize_t ina226_alert_show(struct val =ina226_reg_to_alert (data, attr->index, regval); } - ret =snprintf (buf,PAGE_SIZE ,"%d\n" , val); + ret =sysfs_emit (buf,"%d\n" , val); abort:mutex_unlock (&data->config_lock);return ret;
drivers/hwmon/ina3221.c +1 -1
@@ -698,7 +698,7 @@ static ssize_t ina3221_shunt_show(structunsigned int channel = sd_attr->index;struct ina3221_input *input = &ina->inputs[channel]; -return snprintf (buf,PAGE_SIZE ,"%d\n" , input->shunt_resistor); +return sysfs_emit (buf,"%d\n" , input->shunt_resistor); } static ssize_t ina3221_shunt_store(struct device *dev,
drivers/hwmon/lineage-pem.c +4 -4
@@ -280,7 +280,7 @@ static ssize_t pem_bool_show(struct devireturn PTR_ERR (data); status = data->data_string[attr->nr] & attr->index; -return snprintf (buf,PAGE_SIZE ,"%d\n" , !!status); +return sysfs_emit (buf,"%d\n" , !!status); } static ssize_t pem_data_show(struct device *dev, struct device_attribute *da,
@@ -296,7 +296,7 @@ static ssize_t pem_data_show(struct devi value =pem_get_data (data->data_string,sizeof (data->data_string), attr->index); -return snprintf (buf,PAGE_SIZE ,"%ld\n" , value); +return sysfs_emit (buf,"%ld\n" , value); } static ssize_t pem_input_show(struct device *dev, struct device_attribute *da,
@@ -312,7 +312,7 @@ static ssize_t pem_input_show(struct dev value =pem_get_input (data->input_string,sizeof (data->input_string), attr->index); -return snprintf (buf,PAGE_SIZE ,"%ld\n" , value); +return sysfs_emit (buf,"%ld\n" , value); } static ssize_t pem_fan_show(struct device *dev, struct device_attribute *da,
@@ -328,7 +328,7 @@ static ssize_t pem_fan_show(struct devic value =pem_get_fan (data->fan_speed,sizeof (data->fan_speed), attr->index); -return snprintf (buf,PAGE_SIZE ,"%ld\n" , value); +return sysfs_emit (buf,"%ld\n" , value); }/* Voltages */
drivers/hwmon/ltc2945.c +2 -2
@@ -226,7 +226,7 @@ static ssize_t ltc2945_value_show(struct value =ltc2945_reg_to_val (dev, attr->index);if (value <0 )return value; -return snprintf (buf,PAGE_SIZE ,"%lld\n" , value); +return sysfs_emit (buf,"%lld\n" , value); } static ssize_t ltc2945_value_store(struct device *dev,
@@ -335,7 +335,7 @@ static ssize_t ltc2945_bool_show(structif (fault)/* Clear reported faults in chip register */ regmap_update_bits (regmap,LTC2945_FAULT , attr->index,0 ); -return snprintf (buf,PAGE_SIZE ,"%d\n" , !!fault); +return sysfs_emit (buf,"%d\n" , !!fault); }/* Input voltages */
drivers/hwmon/ltc2990.c +1 -1
@@ -147,7 +147,7 @@ static ssize_t ltc2990_value_show(structif (unlikely (ret <0 ))return ret; -return snprintf (buf,PAGE_SIZE ,"%d\n" , value); +return sysfs_emit (buf,"%d\n" , value); } static umode_t ltc2990_attrs_visible(struct kobject *kobj,
drivers/hwmon/ltc4151.c +1 -1
@@ -128,7 +128,7 @@ static ssize_t ltc4151_value_show(structreturn PTR_ERR (data); value =ltc4151_get_value (data, attr->index); -return snprintf (buf,PAGE_SIZE ,"%d\n" , value); +return sysfs_emit (buf,"%d\n" , value); }/*
drivers/hwmon/ltc4215.c +4 -4
@@ -139,7 +139,7 @@ static ssize_t ltc4215_voltage_show(strustruct sensor_device_attribute *attr =to_sensor_dev_attr (da);const int voltage =ltc4215_get_voltage (dev, attr->index); -return snprintf (buf,PAGE_SIZE ,"%d\n" , voltage); +return sysfs_emit (buf,"%d\n" , voltage); } static ssize_t ltc4215_current_show(struct device *dev,
@@ -147,7 +147,7 @@ static ssize_t ltc4215_current_show(stru {const unsigned int curr =ltc4215_get_current (dev); -return snprintf (buf,PAGE_SIZE ,"%u\n" , curr); +return sysfs_emit (buf,"%u\n" , curr); } static ssize_t ltc4215_power_show(struct device *dev,
@@ -159,7 +159,7 @@ static ssize_t ltc4215_power_show(struct/* current in mA * voltage in mV == power in uW */ const unsigned int power =abs (output_voltage * curr); -return snprintf (buf,PAGE_SIZE ,"%u\n" , power); +return sysfs_emit (buf,"%u\n" , power); } static ssize_t ltc4215_alarm_show(struct device *dev,
@@ -170,7 +170,7 @@ static ssize_t ltc4215_alarm_show(structconst u8 reg = data->regs[LTC4215_STATUS ];const u32 mask = attr->index; -return snprintf (buf,PAGE_SIZE ,"%u\n" , !!(reg & mask)); +return sysfs_emit (buf,"%u\n" , !!(reg & mask)); }/*
drivers/hwmon/ltc4222.c +2 -2
@@ -94,7 +94,7 @@ static ssize_t ltc4222_value_show(struct value =ltc4222_get_value (dev, attr->index);if (value <0 )return value; -return snprintf (buf,PAGE_SIZE ,"%d\n" , value); +return sysfs_emit (buf,"%d\n" , value); } static ssize_t ltc4222_bool_show(struct device *dev,
@@ -112,7 +112,7 @@ static ssize_t ltc4222_bool_show(structif (fault)/* Clear reported faults in chip register */ regmap_update_bits (regmap, attr->nr, attr->index,0 ); -return snprintf (buf,PAGE_SIZE ,"%d\n" , !!fault); +return sysfs_emit (buf,"%d\n" , !!fault); }/* Voltages */
drivers/hwmon/ltc4260.c +2 -2
@@ -79,7 +79,7 @@ static ssize_t ltc4260_value_show(struct value =ltc4260_get_value (dev, attr->index);if (value <0 )return value; -return snprintf (buf,PAGE_SIZE ,"%d\n" , value); +return sysfs_emit (buf,"%d\n" , value); } static ssize_t ltc4260_bool_show(struct device *dev,
@@ -98,7 +98,7 @@ static ssize_t ltc4260_bool_show(structif (fault)/* Clear reported faults in chip register */ regmap_update_bits (regmap,LTC4260_FAULT , attr->index,0 ); -return snprintf (buf,PAGE_SIZE ,"%d\n" , !!fault); +return sysfs_emit (buf,"%d\n" , !!fault); }/* Voltages */
drivers/hwmon/ltc4261.c +2 -2
@@ -130,7 +130,7 @@ static ssize_t ltc4261_value_show(structreturn PTR_ERR (data); value =ltc4261_get_value (data, attr->index); -return snprintf (buf,PAGE_SIZE ,"%d\n" , value); +return sysfs_emit (buf,"%d\n" , value); } static ssize_t ltc4261_bool_show(struct device *dev,
@@ -147,7 +147,7 @@ static ssize_t ltc4261_bool_show(structif (fault)/* Clear reported faults in chip register */ i2c_smbus_write_byte_data (data->client,LTC4261_FAULT , ~fault); -return snprintf (buf,PAGE_SIZE ,"%d\n" , fault ?1 :0 ); +return sysfs_emit (buf,"%d\n" , fault ?1 :0 ); }/*
drivers/hwmon/max16065.c +7 -7
@@ -195,7 +195,7 @@ static ssize_t max16065_alarm_show(struci2c_smbus_write_byte_data (data->client,MAX16065_FAULT (attr2->nr), val); -return snprintf (buf,PAGE_SIZE ,"%d\n" , !!val); +return sysfs_emit (buf,"%d\n" , !!val); } static ssize_t max16065_input_show(struct device *dev,
@@ -208,8 +208,8 @@ static ssize_t max16065_input_show(strucif (unlikely (adc <0 ))return adc; -return snprintf (buf,PAGE_SIZE ,"%d\n" , -ADC_TO_MV (adc, data->range[attr->index])); +return sysfs_emit (buf,"%d\n" , +ADC_TO_MV (adc, data->range[attr->index])); } static ssize_t max16065_current_show(struct device *dev,
@@ -220,8 +220,8 @@ static ssize_t max16065_current_show(strif (unlikely (data->curr_sense <0 ))return data->curr_sense; -return snprintf (buf,PAGE_SIZE ,"%d\n" , -ADC_TO_CURR (data->curr_sense, data->curr_gain)); +return sysfs_emit (buf,"%d\n" , +ADC_TO_CURR (data->curr_sense, data->curr_gain)); } static ssize_t max16065_limit_store(struct device *dev,
@@ -257,8 +257,8 @@ static ssize_t max16065_limit_show(strucstruct sensor_device_attribute_2 *attr2 =to_sensor_dev_attr_2 (da);struct max16065_data *data =dev_get_drvdata (dev); -return snprintf (buf,PAGE_SIZE ,"%d\n" , - data->limit[attr2->nr][attr2->index]); +return sysfs_emit (buf,"%d\n" , + data->limit[attr2->nr][attr2->index]); }/* Construct a sensor_device_attribute structure for each register */
drivers/hwmon/occ/common.c +35 -34
181 lines not on this page · raw message
drivers/hwmon/occ/sysfs.c +2 -2
@@ -67,7 +67,7 @@ static ssize_t occ_sysfs_show(struct devreturn -EINVAL ; } -return snprintf (buf,PAGE_SIZE -1 ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t occ_error_show(struct device *dev,
@@ -77,7 +77,7 @@ static ssize_t occ_error_show(struct devocc_update_response (occ); -return snprintf (buf,PAGE_SIZE -1 ,"%d\n" , occ->error); +return sysfs_emit (buf,"%d\n" , occ->error); } static SENSOR_DEVICE_ATTR(occ_master, 0444, occ_sysfs_show, NULL, 0);
drivers/hwmon/pmbus/inspur-ipsps.c +14 -14
@@ -70,7 +70,7 @@ static ssize_t ipsps_string_show(struct p =memscan (data,'#' , rc); *p ='\0' ; -return snprintf (buf,PAGE_SIZE ,"%s\n" , data); +return sysfs_emit (buf,"%s\n" , data); } static ssize_t ipsps_fw_version_show(struct device *dev,
@@ -91,9 +91,9 @@ static ssize_t ipsps_fw_version_show(strif (rc !=6 )return -EPROTO ; -return snprintf (buf,PAGE_SIZE ,"%u.%02u%u-%u.%02u\n" , - data[1 ], data[2 ]/* < 100 */ , data[3 ]/*< 10*/ , - data[4 ], data[5 ]/* < 100 */ ); +return sysfs_emit (buf,"%u.%02u%u-%u.%02u\n" , + data[1 ], data[2 ]/* < 100 */ , data[3 ]/*< 10*/ , + data[4 ], data[5 ]/* < 100 */ ); } static ssize_t ipsps_mode_show(struct device *dev,
@@ -111,19 +111,19 @@ static ssize_t ipsps_mode_show(struct deswitch (rc) {case MODE_ACTIVE : -return snprintf (buf,PAGE_SIZE ,"[%s] %s %s\n" , -MODE_ACTIVE_STRING , -MODE_STANDBY_STRING ,MODE_REDUNDANCY_STRING ); +return sysfs_emit (buf,"[%s] %s %s\n" , +MODE_ACTIVE_STRING , +MODE_STANDBY_STRING ,MODE_REDUNDANCY_STRING );case MODE_STANDBY : -return snprintf (buf,PAGE_SIZE ,"%s [%s] %s\n" , -MODE_ACTIVE_STRING , -MODE_STANDBY_STRING ,MODE_REDUNDANCY_STRING ); +return sysfs_emit (buf,"%s [%s] %s\n" , +MODE_ACTIVE_STRING , +MODE_STANDBY_STRING ,MODE_REDUNDANCY_STRING );case MODE_REDUNDANCY : -return snprintf (buf,PAGE_SIZE ,"%s %s [%s]\n" , -MODE_ACTIVE_STRING , -MODE_STANDBY_STRING ,MODE_REDUNDANCY_STRING ); +return sysfs_emit (buf,"%s %s [%s]\n" , +MODE_ACTIVE_STRING , +MODE_STANDBY_STRING ,MODE_REDUNDANCY_STRING );default : -return snprintf (buf,PAGE_SIZE ,"unspecified\n" ); +return sysfs_emit (buf,"unspecified\n" ); } }
drivers/hwmon/pmbus/pmbus_core.c +4 -4
@@ -962,7 +962,7 @@ static ssize_t pmbus_show_boolean(struct val =pmbus_get_boolean (client, boolean, attr->index);if (val <0 )return val; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t pmbus_show_sensor(struct device *dev,
@@ -978,7 +978,7 @@ static ssize_t pmbus_show_sensor(structif (sensor->data <0 ) ret = sensor->data;else - ret =snprintf (buf,PAGE_SIZE ,"%lld\n" ,pmbus_reg2data (data, sensor)); + ret =sysfs_emit (buf,"%lld\n" ,pmbus_reg2data (data, sensor));mutex_unlock (&data->update_lock);return ret; }
@@ -1014,7 +1014,7 @@ static ssize_t pmbus_show_label(struct d {struct pmbus_label *label =to_pmbus_label (da); -return snprintf (buf,PAGE_SIZE ,"%s\n" , label->label); +return sysfs_emit (buf,"%s\n" , label->label); }static int pmbus_add_attribute (struct pmbus_data *data,struct attribute *attr)
@@ -2054,7 +2054,7 @@ static ssize_t pmbus_show_samples(structif (val <0 )return val; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t pmbus_set_samples(struct device *dev,
drivers/hwmon/s3c-hwmon.c +2 -2
@@ -166,7 +166,7 @@ static ssize_t s3c_hwmon_ch_show(struct ret *= cfg->mult; ret =DIV_ROUND_CLOSEST (ret, cfg->div); -return snprintf (buf,PAGE_SIZE ,"%d\n" , ret); +return sysfs_emit (buf,"%d\n" , ret); }/**
@@ -187,7 +187,7 @@ static ssize_t s3c_hwmon_label_show(stru cfg = pdata->in[sen_attr->index]; -return snprintf (buf,PAGE_SIZE ,"%s\n" , cfg->name); +return sysfs_emit (buf,"%s\n" , cfg->name); }/**
drivers/hwmon/sch5627.c +12 -12
@@ -195,7 +195,7 @@ static int reg_to_rpm(u16 reg)static ssize_t name_show (struct device *dev,struct device_attribute *devattr,char *buf) { -return snprintf (buf,PAGE_SIZE ,"%s\n" ,DEVNAME ); +return sysfs_emit (buf,"%s\n" ,DEVNAME ); } static ssize_t temp_show(struct device *dev, struct device_attribute *devattr,
@@ -209,7 +209,7 @@ static ssize_t temp_show(struct device *return PTR_ERR (data); val =reg_to_temp (data->temp[attr->index]); -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t temp_fault_show(struct device *dev,
@@ -221,7 +221,7 @@ static ssize_t temp_fault_show(struct deif (IS_ERR (data))return PTR_ERR (data); -return snprintf (buf,PAGE_SIZE ,"%d\n" , data->temp[attr->index] ==0 ); +return sysfs_emit (buf,"%d\n" , data->temp[attr->index] ==0 ); } static ssize_t temp_max_show(struct device *dev,
@@ -232,7 +232,7 @@ static ssize_t temp_max_show(struct deviint val; val =reg_to_temp_limit (data->temp_max[attr->index]); -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t temp_crit_show(struct device *dev,
@@ -243,7 +243,7 @@ static ssize_t temp_crit_show(struct devint val; val =reg_to_temp_limit (data->temp_crit[attr->index]); -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t fan_show(struct device *dev, struct device_attribute *devattr,
@@ -260,7 +260,7 @@ static ssize_t fan_show(struct device *dif (val <0 )return val; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t fan_fault_show(struct device *dev,
@@ -272,8 +272,8 @@ static ssize_t fan_fault_show(struct devif (IS_ERR (data))return PTR_ERR (data); -return snprintf (buf,PAGE_SIZE ,"%d\n" , - data->fan[attr->index] ==0xffff ); +return sysfs_emit (buf,"%d\n" , + data->fan[attr->index] ==0xffff ); } static ssize_t fan_min_show(struct device *dev,
@@ -285,7 +285,7 @@ static ssize_t fan_min_show(struct devicif (val <0 )return val; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t in_show(struct device *dev, struct device_attribute *devattr,
@@ -301,7 +301,7 @@ static ssize_t in_show(struct device *de val =DIV_ROUND_CLOSEST ( data->in[attr->index] *SCH5627_REG_IN_FACTOR [attr->index],10000 ); -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t in_label_show(struct device *dev,
@@ -309,8 +309,8 @@ static ssize_t in_label_show(struct devi {struct sensor_device_attribute *attr =to_sensor_dev_attr (devattr); -return snprintf (buf,PAGE_SIZE ,"%s\n" , -SCH5627_IN_LABELS [attr->index]); +return sysfs_emit (buf,"%s\n" , +SCH5627_IN_LABELS [attr->index]); }static DEVICE_ATTR_RO (name);
drivers/hwmon/sch5636.c +10 -10
@@ -160,7 +160,7 @@ static int reg_to_rpm(u16 reg)static ssize_t name_show (struct device *dev,struct device_attribute *devattr,char *buf) { -return snprintf (buf,PAGE_SIZE ,"%s\n" ,DEVNAME ); +return sysfs_emit (buf,"%s\n" ,DEVNAME ); } static ssize_t in_value_show(struct device *dev,
@@ -176,7 +176,7 @@ static ssize_t in_value_show(struct devi val =DIV_ROUND_CLOSEST ( data->in[attr->index] *SCH5636_REG_IN_FACTORS [attr->index],255 ); -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t in_label_show(struct device *dev,
@@ -184,8 +184,8 @@ static ssize_t in_label_show(struct devi {struct sensor_device_attribute *attr =to_sensor_dev_attr (devattr); -return snprintf (buf,PAGE_SIZE ,"%s\n" , -SCH5636_IN_LABELS [attr->index]); +return sysfs_emit (buf,"%s\n" , +SCH5636_IN_LABELS [attr->index]); } static ssize_t temp_value_show(struct device *dev,
@@ -199,7 +199,7 @@ static ssize_t temp_value_show(struct dereturn PTR_ERR (data); val = (data->temp_val[attr->index] -64 ) *1000 ; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t temp_fault_show(struct device *dev,
@@ -213,7 +213,7 @@ static ssize_t temp_fault_show(struct dereturn PTR_ERR (data); val = (data->temp_ctrl[attr->index] &SCH5636_TEMP_WORKING ) ?0 :1 ; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t temp_alarm_show(struct device *dev,
@@ -227,7 +227,7 @@ static ssize_t temp_alarm_show(struct dereturn PTR_ERR (data); val = (data->temp_ctrl[attr->index] &SCH5636_TEMP_ALARM ) ?1 :0 ; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t fan_value_show(struct device *dev,
@@ -244,7 +244,7 @@ static ssize_t fan_value_show(struct devif (val <0 )return val; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t fan_fault_show(struct device *dev,
@@ -258,7 +258,7 @@ static ssize_t fan_fault_show(struct devreturn PTR_ERR (data); val = (data->fan_ctrl[attr->index] &SCH5636_FAN_NOT_PRESENT ) ?1 :0 ; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t fan_alarm_show(struct device *dev,
@@ -272,7 +272,7 @@ static ssize_t fan_alarm_show(struct devreturn PTR_ERR (data); val = (data->fan_ctrl[attr->index] &SCH5636_FAN_ALARM ) ?1 :0 ; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); }static struct sensor_device_attribute sch5636_attr[] = {
drivers/hwmon/smm665.c +2 -2
@@ -351,7 +351,7 @@ static ssize_t smm665_show_crit_alarm(stif (data->faults & (1 << attr->index)) val =1 ; -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); } static ssize_t smm665_show_input(struct device *dev,
@@ -366,7 +366,7 @@ static ssize_t smm665_show_input(structreturn PTR_ERR (data); val =smm665_convert (data->adc[adc], adc); -return snprintf (buf,PAGE_SIZE ,"%d\n" , val); +return sysfs_emit (buf,"%d\n" , val); }#define SMM665_SHOW (what) \
drivers/hwmon/stts751.c +10 -10
@@ -387,7 +387,7 @@ static ssize_t max_alarm_show(struct devif (ret <0 )return ret; -return snprintf (buf,PAGE_SIZE ,"%d\n" , priv->max_alert); +return sysfs_emit (buf,"%d\n" , priv->max_alert); } static ssize_t min_alarm_show(struct device *dev,
@@ -404,7 +404,7 @@ static ssize_t min_alarm_show(struct devif (ret <0 )return ret; -return snprintf (buf,PAGE_SIZE ,"%d\n" , priv->min_alert); +return sysfs_emit (buf,"%d\n" , priv->min_alert); } static ssize_t input_show(struct device *dev, struct device_attribute *attr,
@@ -419,7 +419,7 @@ static ssize_t input_show(struct deviceif (ret <0 )return ret; -return snprintf (buf,PAGE_SIZE ,"%d\n" , priv->temp); +return sysfs_emit (buf,"%d\n" , priv->temp); } static ssize_t therm_show(struct device *dev, struct device_attribute *attr,
@@ -427,7 +427,7 @@ static ssize_t therm_show(struct device {struct stts751_priv *priv =dev_get_drvdata (dev); -return snprintf (buf,PAGE_SIZE ,"%d\n" , priv->therm); +return sysfs_emit (buf,"%d\n" , priv->therm); } static ssize_t therm_store(struct device *dev, struct device_attribute *attr,
@@ -469,7 +469,7 @@ static ssize_t hyst_show(struct device * {struct stts751_priv *priv =dev_get_drvdata (dev); -return snprintf (buf,PAGE_SIZE ,"%d\n" , priv->hyst); +return sysfs_emit (buf,"%d\n" , priv->hyst); } static ssize_t hyst_store(struct device *dev, struct device_attribute *attr,
@@ -509,7 +509,7 @@ static ssize_t therm_trip_show(struct deif (ret <0 )return ret; -return snprintf (buf,PAGE_SIZE ,"%d\n" , priv->therm_trip); +return sysfs_emit (buf,"%d\n" , priv->therm_trip); } static ssize_t max_show(struct device *dev, struct device_attribute *attr,
@@ -517,7 +517,7 @@ static ssize_t max_show(struct device *d {struct stts751_priv *priv =dev_get_drvdata (dev); -return snprintf (buf,PAGE_SIZE ,"%d\n" , priv->event_max); +return sysfs_emit (buf,"%d\n" , priv->event_max); } static ssize_t max_store(struct device *dev, struct device_attribute *attr,
@@ -551,7 +551,7 @@ static ssize_t min_show(struct device *d {struct stts751_priv *priv =dev_get_drvdata (dev); -return snprintf (buf,PAGE_SIZE ,"%d\n" , priv->event_min); +return sysfs_emit (buf,"%d\n" , priv->event_min); } static ssize_t min_store(struct device *dev, struct device_attribute *attr,
@@ -585,8 +585,8 @@ static ssize_t interval_show(struct devi {struct stts751_priv *priv =dev_get_drvdata (dev); -return snprintf (buf,PAGE_SIZE ,"%d\n" , - stts751_intervals[priv->interval]); +return sysfs_emit (buf,"%d\n" , + stts751_intervals[priv->interval]); } static ssize_t interval_store(struct device *dev,
drivers/hwmon/vexpress-hwmon.c +6 -6
@@ -27,7 +27,7 @@ static ssize_t vexpress_hwmon_label_show {const char *label =of_get_property (dev->of_node,"label" ,NULL ); -return snprintf (buffer,PAGE_SIZE ,"%s\n" , label); +return sysfs_emit (buffer,"%s\n" , label); } static ssize_t vexpress_hwmon_u32_show(struct device *dev,
@@ -41,8 +41,8 @@ static ssize_t vexpress_hwmon_u32_show(sif (err)return err; -return snprintf (buffer,PAGE_SIZE ,"%u\n" , value / -to_sensor_dev_attr (dev_attr)->index); +return sysfs_emit (buffer,"%u\n" , value / +to_sensor_dev_attr (dev_attr)->index); } static ssize_t vexpress_hwmon_u64_show(struct device *dev,
@@ -60,9 +60,9 @@ static ssize_t vexpress_hwmon_u64_show(sif (err)return err; -return snprintf (buffer,PAGE_SIZE ,"%llu\n" , -div_u64 (((u64 )value_hi <<32 ) | value_lo, -to_sensor_dev_attr (dev_attr)->index)); +return sysfs_emit (buffer,"%llu\n" , +div_u64 (((u64 )value_hi <<32 ) | value_lo, +to_sensor_dev_attr (dev_attr)->index)); } static umode_t vexpress_hwmon_attr_is_visible(struct kobject *kobj,
drivers/hwmon/xgene-hwmon.c +7 -7
@@ -329,14 +329,14 @@ static ssize_t temp1_input_show(struct d temp =sign_extend32 (val,TEMP_NEGATIVE_BIT ); -return snprintf (buf,PAGE_SIZE ,"%d\n" ,CELSIUS_TO_mCELSIUS (temp)); +return sysfs_emit (buf,"%d\n" ,CELSIUS_TO_mCELSIUS (temp)); }static ssize_t temp1_label_show (struct device *dev,struct device_attribute *attr,char *buf) { -return snprintf (buf,PAGE_SIZE ,"SoC Temperature\n" ); +return sysfs_emit (buf,"SoC Temperature\n" ); } static ssize_t temp1_critical_alarm_show(struct device *dev,
@@ -345,21 +345,21 @@ static ssize_t temp1_critical_alarm_show {struct xgene_hwmon_dev *ctx =dev_get_drvdata (dev); -return snprintf (buf,PAGE_SIZE ,"%d\n" , ctx->temp_critical_alarm); +return sysfs_emit (buf,"%d\n" , ctx->temp_critical_alarm); }static ssize_t power1_label_show (struct device *dev,struct device_attribute *attr,char *buf) { -return snprintf (buf,PAGE_SIZE ,"CPU power\n" ); +return sysfs_emit (buf,"CPU power\n" ); }static ssize_t power2_label_show (struct device *dev,struct device_attribute *attr,char *buf) { -return snprintf (buf,PAGE_SIZE ,"IO power\n" ); +return sysfs_emit (buf,"IO power\n" ); } static ssize_t power1_input_show(struct device *dev,
@@ -374,7 +374,7 @@ static ssize_t power1_input_show(structif (rc <0 )return rc; -return snprintf (buf,PAGE_SIZE ,"%u\n" ,mWATT_TO_uWATT (val)); +return sysfs_emit (buf,"%u\n" ,mWATT_TO_uWATT (val)); } static ssize_t power2_input_show(struct device *dev,
@@ -389,7 +389,7 @@ static ssize_t power2_input_show(structif (rc <0 )return rc; -return snprintf (buf,PAGE_SIZE ,"%u\n" ,mWATT_TO_uWATT (val)); +return sysfs_emit (buf,"%u\n" ,mWATT_TO_uWATT (val)); }static DEVICE_ATTR_RO (temp1_label);
Greg Kroah-Hartman
maintainerPATCH 372/451 hwmon: (max16065) Use local variable to avoid TOCTOU
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gui-Dong Han <[email protected]>
[ Upstream commit b8d5acdcf525f44e521ca4ef51dce4dac403dab4 ]
In max16065_current_show, data->curr_sense is read twice: once for the error check and again for the calculation. Since i2c_smbus_read_byte_data returns negative error codes on failure, if the data changes to an error code between the check and the use, ADC_TO_CURR results in an incorrect calculation.
Read data->curr_sense into a local variable to ensure consistency. Note that data->curr_gain is constant and safe to access directly.
This aligns max16065_current_show with max16065_input_show, which already uses a local variable for the same reason.
--- drivers/hwmon/max16065.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/hwmon/max16065.c +4 -3
@@ -216,12 +216,13 @@ static ssize_t max16065_current_show(str struct device_attribute *da, char *buf) { struct max16065_data *data = max16065_update_device(dev); +int curr_sense = data->curr_sense; -if (unlikely (data->curr_sense <0 )) -return data->curr_sense; +if (unlikely (curr_sense <0 )) +return curr_sense;return sysfs_emit (buf,"%d\n" , -ADC_TO_CURR (data->curr_sense, data->curr_gain)); +ADC_TO_CURR (curr_sense, data->curr_gain)); } static ssize_t max16065_limit_store(struct device *dev,
Re: [PATCH 5.10 372/451] hwmon: (max16065) Use local variable to avoid TOCTOU
Quoted 8 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gui-Dong Han <[email protected]>
[ Upstream commit
b8d5acdcf525f44e521ca4ef51dce4dac403dab4]
Quoted 7 lines
In
max16065_current_show,data->curr_senseis read twice: once for the error check and again for the calculation. Sincei2c_smbus_read_byte_datareturns negative error codes on failure, if the data changes to an error code between the check and the use,ADC_TO_CURRresults in an incorrect calculation.Read
data->curr_senseinto a local variable to ensure consistency.
Simply copying shared data to a local variable before using it cannot fix a data race. The compiler is allowed to optimise away that copy and keep using data->curr_sense, since it can see that the current thread does not change data->curr_sense.
You have to, at minimum, use READ_ONCE() here and WRITE_ONCE() when writing to max16065_data::curr_sense to ensure that the compiler does not optimise away the copy.
Quoted 5 lines
Note
thatdata->curr_gainis constant and safe to access directly.This aligns
max16065_current_showwithmax16065_input_show, which already uses a local variable for the same reason.
Then there are 2 functions that need a further fix...
Ben.
Quoted 33 lines
Link https://lore.kernel.org/all/CALbr=LYJ_ehtp53HXEVkSpYoub+XYSTU8Rg=o1xxMJ8=5z8B-g@mail.gmail.com/ open hereFixes f5bae2642e3d ("hwmon: Driver for MAX16065 System Manager and compatibles")Signed-off-by Gui-Dong Han <[email protected]>Signed-off-by Guenter Roeck <[email protected]>Signed-off-by Sasha Levin <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/hwmon/max16065.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)drivers/hwmon/max16065.c +4
-3@@ -216,12 +216,13 @@ static ssize_t max16065_current_show(str struct device_attribute *da, char *buf) { struct max16065_data *data = max16065_update_device(dev); +int curr_sense = data->curr_sense; -if (unlikely (data->curr_sense <0 )) -return data->curr_sense; +if (unlikely (curr_sense <0 )) +return curr_sense;return sysfs_emit (buf,"%d\n" , -ADC_TO_CURR (data->curr_sense, data->curr_gain)); +ADC_TO_CURR (curr_sense, data->curr_gain)); } static ssize_t max16065_limit_store(struct device *dev,
Signature · 2 lines
Ben Hutchings Larkinson's Law: All laws are basically false.
Greg Kroah-Hartman
maintainerPATCH 373/451 crypto: af_alg - zero initialize memory allocated via sock_kmalloc
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shivani Agarwal <[email protected]>
[ Upstream commit 6f6e309328d53a10c0fe1f77dec2db73373179b6 ]
Several crypto user API contexts and requests allocated with sock_kmalloc() were left uninitialized, relying on callers to set fields explicitly. This resulted in the use of uninitialized data in certain error paths or when new fields are added in the future.
The ACVP patches also contain two user-space interface files:algif_kpp.c and algif_akcipher.c. These too rely on proper initialization of their context structures.
A particular issue has been observed with the newly added 'inflight' variable introduced in af_alg_ctx by commit:
67b164a871af ("crypto: af_alg - Disallow multiple in-flight AIO requests")
Because the context is not memset to zero after allocation, the inflight variable has contained garbage values. As a result, af_alg_alloc_areq() has incorrectly returned -EBUSY randomly when the garbage value was interpreted as true:
https://github.com/gregkh/linux/blame/master/crypto/af_alg.c#L1209
The check directly tests ctx->inflight without explicitly comparing against true/false. Since inflight is only ever set to true or false later, an uninitialized value has triggered -EBUSY failures. Zero-initializing memory allocated with sock_kmalloc() ensures inflight and other fields start in a known state, removing random issues caused by uninitialized data.
--- crypto/af_alg.c | 5 ++--- crypto/algif_hash.c | 3 +-- crypto/algif_rng.c | 3 +-- 3 files changed, 4 insertions(+), 7 deletions(-)
crypto/af_alg.c +2 -3
@@ -1127,14 +1127,13 @@ struct af_alg_async_req *af_alg_alloc_arif (unlikely (!areq))return ERR_PTR (-ENOMEM ); +memset (areq,0 , areqlen); + ctx->inflight = true; areq->areqlen = areqlen; areq->sk = sk; - areq->last_rsgl =NULL ;INIT_LIST_HEAD (&areq->rsgl_list); - areq->tsgl =NULL ; - areq->tsgl_entries =0 ;return areq; }
crypto/algif_hash.c +1 -2
@@ -423,9 +423,8 @@ static int hash_accept_parent_nokey(voidif (!ctx)return -ENOMEM ; - ctx->result =NULL ; +memset (ctx,0 , len); ctx->len = len; - ctx->more = false;crypto_init_wait (&ctx->wait); ask->private = ctx;
crypto/algif_rng.c +1 -2
@@ -250,9 +250,8 @@ static int rng_accept_parent(void *privaif (!ctx)return -ENOMEM ; +memset (ctx,0 , len); ctx->len = len; - ctx->addtl =NULL ; - ctx->addtl_len =0 ;/* * No seeding done at that point -- if multiple accepts are
Greg Kroah-Hartman
maintainerPATCH 374/451 ARM: dts: microchip: sama5d2: fix spi flexcom fifo size to 32
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Ferre <[email protected]>
[ Upstream commit 7d5864dc5d5ea6a35983dd05295fb17f2f2f44ce ]
Unlike standalone spi peripherals, on sama5d2, the flexcom spi have fifo size of 32 data. Fix flexcom/spi nodes where this property is wrong.
--- arch/arm/boot/dts/sama5d2.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm/boot/dts/sama5d2.dtsi +5 -5
@@ -555,7 +555,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(12))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
@@ -625,7 +625,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(14))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
@@ -835,7 +835,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(16))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
@@ -925,7 +925,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(18))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
@@ -976,7 +976,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(20))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
Re: [PATCH 5.10 374/451] ARM: dts: microchip: sama5d2: fix spi flexcom fifo size to 32
Quoted 24 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Ferre <[email protected]>
[ Upstream commit
7d5864dc5d5ea6a35983dd05295fb17f2f2f44ce]Unlike standalone spi peripherals, on sama5d2, the flexcom spi have fifo size of 32 data. Fix flexcom/spi nodes where this property is wrong.
Fixes 6b9a3584c7ed ("ARM: dts: at91: sama5d2: Add missing flexcom definitions")Cc [email protected] # 5.8+Signed-off-by Nicolas Ferre <[email protected]>Signed-off-by Claudiu Beznea <[email protected]>Signed-off-by Sasha Levin <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- arch/arm/boot/dts/sama5d2.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)arch/arm/boot/dts/sama5d2.dtsi +0
-0
[...]
arch/arm/boot/dts/sama5d2.dtsi line 931
Quoted 9 lines
arch/arm/boot/dts/sama5d2.dtsi +1
-1@@ -925,7 +925,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(18))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
[...]
This hunk (only) of the backport ends up changing the wrong node - it should be applied to spi5, not i2c5. The starting line should be 905, not 925.
Ben.
Signature · 2 lines
Ben Hutchings Larkinson's Law: All laws are basically false.
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 374/451] ARM: dts: microchip: sama5d2: fix spi flexcom fifo size to 32
Quoted 37 lines · Ben Hutchings
Quoted 24 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Ferre <[email protected]>
[ Upstream commit
7d5864dc5d5ea6a35983dd05295fb17f2f2f44ce]Unlike standalone spi peripherals, on sama5d2, the flexcom spi have fifo size of 32 data. Fix flexcom/spi nodes where this property is wrong.
Fixes 6b9a3584c7ed ("ARM: dts: at91: sama5d2: Add missing flexcom definitions")Cc [email protected] # 5.8+Signed-off-by Nicolas Ferre <[email protected]>Signed-off-by Claudiu Beznea <[email protected]>Signed-off-by Sasha Levin <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- arch/arm/boot/dts/sama5d2.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)arch/arm/boot/dts/sama5d2.dtsi +0
-0[...]
Quoted 9 lines
arch/arm/boot/dts/sama5d2.dtsi +1
-1@@ -925,7 +925,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(18))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };[...]
Quoted 3 lines
This hunk (only) of the backport ends up changing the wrong node - it should be applied to spi5, not i2c5. The starting line should be 905, not 925.
Yeah, something went wrong with the backport, I'll drop this from all queues.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 375/451 iommu/qcom: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
[ Upstream commit 6a3908ce56e6879920b44ef136252b2f0c954194 ]
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
Note that commit e2eae09939a8 ("iommu/qcom: add missing put_device() call in qcom_iommu_of_xlate()") fixed the leak in a couple of error paths, but the reference is still leaking on success and late failures.
--- drivers/iommu/arm/arm-smmu/qcom_iommu.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/iommu/arm/arm-smmu/qcom_iommu.c +4 -6
@@ -586,15 +586,15 @@ static int qcom_iommu_of_xlate(struct de qcom_iommu =platform_get_drvdata (iommu_pdev); +put_device (&iommu_pdev->dev); +/* make sure the asid specified in dt is valid, so we don't have * to sanity check this elsewhere, since 'asid - 1' is used to * index into qcom_iommu->ctxs: */ if (WARN_ON (asid <1 ) || -WARN_ON (asid > qcom_iommu->num_ctxs)) { -put_device (&iommu_pdev->dev); +WARN_ON (asid > qcom_iommu->num_ctxs))return -EINVAL ; - }if (!dev_iommu_priv_get (dev)) {dev_iommu_priv_set (dev, qcom_iommu);
@@ -603,10 +603,8 @@ static int qcom_iommu_of_xlate(struct de* multiple different iommu devices. Multiple context * banks are ok, but multiple devices are not: */ -if (WARN_ON (qcom_iommu !=dev_iommu_priv_get (dev))) { -put_device (&iommu_pdev->dev); +if (WARN_ON (qcom_iommu !=dev_iommu_priv_get (dev)))return -EINVAL ; - } }return iommu_fwspec_add_ids (dev, &asid,1 );
Greg Kroah-Hartman
maintainerPATCH 376/451 powerpc/64s/slb: Fix SLB multihit issue during SLB preload
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Donet Tom <[email protected]>
[ Upstream commit 00312419f0863964625d6dcda8183f96849412c6 ]
On systems using the hash MMU, there is a software SLB preload cache that mirrors the entries loaded into the hardware SLB buffer. This preload cache is subject to periodic eviction — typically after every 256 context switches — to remove old entry.
To optimize performance, the kernel skips switch_mmu_context() in switch_mm_irqs_off() when the prev and next mm_struct are the same. However, on hash MMU systems, this can lead to inconsistencies between the hardware SLB and the software preload cache.
If an SLB entry for a process is evicted from the software cache on one CPU, and the same process later runs on another CPU without executing switch_mmu_context(), the hardware SLB may retain stale entries. If the kernel then attempts to reload that entry, it can trigger an SLB multi-hit error.
The following timeline shows how stale SLB entries are created and can cause a multi-hit error when a process moves between CPUs without a MMU context switch.
CPU 0 CPU 1
----- -----
Process P
exec swapper/1
load_elf_binary
begin_new_exc
activate_mm
switch_mm_irqs_off
switch_mmu_context
switch_slb
/*
* This invalidates all
* the entries in the HW
* and setup the new HW
* SLB entries as per the
* preload cache.
*/context_switchsched_migrate_task migrates process P to cpu-1
Process swapper/0 context switch (to process P)
(uses mm_struct of Process P) switch_mm_irqs_off()
switch_slb
load_slb++
/*
* load_slb becomes 0 here
* and we evict an entry from
* the preload cache with
* preload_age(). We still
* keep HW SLB and preload
* cache in sync, that is
* because all HW SLB entries
* anyways gets evicted in
* switch_slb during SLBIA.
* We then only add those
* entries back in HW SLB,
* which are currently
* present in preload_cache
* (after eviction). */
load_elf_binary continues...
setup_new_exec()
slb_setup_new_exec()
sched_switch event sched_migrate_task migrates process P to cpu-0
context_switch from swapper/0 to Process P
switch_mm_irqs_off()
/*
* Since both prev and next mm struct are same we don't call
* switch_mmu_context(). This will cause the HW SLB and SW preload
* cache to go out of sync in preload_new_slb_context. Because there
* was an SLB entry which was evicted from both HW and preload cache
* on cpu-1. Now later in preload_new_slb_context(), when we will try
* to add the same preload entry again, we will add this to the SW
* preload cache and then will add it to the HW SLB. Since on cpu-0
* this entry was never invalidated, hence adding this entry to the HW
* SLB will cause a SLB multi-hit error.
*/load_elf_binary continues...
START_THREAD
start_thread
preload_new_slb_context
/*
* This tries to add a new EA to preload cache which was earlier
* evicted from both cpu-1 HW SLB and preload cache. This caused the
* HW SLB of cpu-0 to go out of sync with the SW preload cache. The
* reason for this was, that when we context switched back on CPU-0,
* we should have ideally called switch_mmu_context() which will
* bring the HW SLB entries on CPU-0 in sync with SW preload cache
* entries by setting up the mmu context properly. But we didn't do
* that since the prev mm_struct running on cpu-0 was same as the
* next mm_struct (which is true for swapper / kernel threads). So
* now when we try to add this new entry into the HW SLB of cpu-0,
* we hit a SLB multi-hit error.
*/
WARNING: CPU: 0 PID: 1810970 at arch/powerpc/mm/book3s64/slb.c:62 assert_slb_presence+0x2c/0x50(48 results) 02:47:29 [20157/42149] Modules linked in: CPU: 0 UID: 0 PID: 1810970 Comm: dd Not tainted 6.16.0-rc3-dirty #12 VOLUNTARY Hardware name: IBM pSeries (emulated by qemu) POWER8 (architected) 0x4d0200 0xf000004 of:SLOF,HEAD hv:linux,kvm pSeries NIP: c00000000015426c LR: c0000000001543b4 CTR: 0000000000000000 REGS: c0000000497c77e0 TRAP: 0700 Not tainted (6.16.0-rc3-dirty) MSR: 8000000002823033 <SF,VEC,VSX,FP,ME,IR,DR,RI,LE> CR: 28888482 XER: 00000000 CFAR: c0000000001543b0 IRQMASK: 3 <...> NIP [c00000000015426c] assert_slb_presence+0x2c/0x50 LR [c0000000001543b4] slb_insert_entry+0x124/0x390 Call Trace: 0x7fffceb5ffff (unreliable) preload_new_slb_context+0x100/0x1a0 start_thread+0x26c/0x420 load_elf_binary+0x1b04/0x1c40 bprm_execve+0x358/0x680 do_execveat_common+0x1f8/0x240 sys_execve+0x58/0x70 system_call_exception+0x114/0x300 system_call_common+0x160/0x2c4
Quoted 1 line
Quoted 1 line
From the above analysis, during early exec the hardware SLB is cleared,
and entries from the software preload cache are reloaded into hardware by switch_slb. However, preload_new_slb_context and slb_setup_new_exec also attempt to load some of the same entries, which can trigger a multi-hit. In most cases, these additional preloads simply hit existing entries and add nothing new. Removing these functions avoids redundant preloads and eliminates the multi-hit issue. This patch removes these two functions.
We tested process switching performance using the context_switch benchmark on POWER9/hash, and observed no regression.
Without this patch: 129041 ops/sec With this patch: 129341 ops/sec
We also measured SLB faults during boot, and the counts are essentially the same with and without this patch.
SLB faults without this patch: 19727 SLB faults with this patch: 19786
--- arch/powerpc/kernel/process.c | 5 - arch/powerpc/mm/book3s64/internal.h | 1 arch/powerpc/mm/book3s64/mmu_context.c | 2 arch/powerpc/mm/book3s64/slb.c | 88 --------------------------------- 4 files changed, 96 deletions(-)
arch/powerpc/kernel/process.c +0 -5
@@ -1767,8 +1767,6 @@ int copy_thread(unsigned long clone_flagreturn 0 ; } -void preload_new_slb_context (unsigned long start,unsigned long sp); -/* * Set up a thread for executing a new program */
@@ -1776,9 +1774,6 @@ void start_thread(struct pt_regs *regs, {#ifdef CONFIG_PPC64 unsigned long load_addr = regs->gpr[2 ];/* saved by ELF_PLAT_INIT */ - -if (IS_ENABLED (CONFIG_PPC_BOOK3S_64 ) && !radix_enabled ()) -preload_new_slb_context (start, sp);#endif /*
arch/powerpc/mm/book3s64/internal.h +0 -1
@@ -13,6 +13,5 @@ static inline bool stress_slb(void) return static_branch_unlikely(&stress_slb_key); } -void slb_setup_new_exec (void );#endif /* ARCH_POWERPC_MM_BOOK3S64_INTERNAL_H */
arch/powerpc/mm/book3s64/mmu_context.c +0 -2
@@ -147,8 +147,6 @@ static int hash__init_new_context(structvoid hash__setup_new_exec (void ) {slice_setup_new_exec (); - -slb_setup_new_exec (); }static int radix__init_new_context (struct mm_struct *mm)
arch/powerpc/mm/book3s64/slb.c +0 -88
94 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 377/451 PCI: brcmstb: Fix disabling L0s capability
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jim Quinlan <[email protected]>
[ Upstream commit 9583f9d22991d2cfb5cc59a2552040c4ae98d998 ]
caab002d5069 ("PCI: brcmstb: Disable L0s component of ASPM if requested") set PCI_EXP_LNKCAP_ASPM_L1 and (optionally) PCI_EXP_LNKCAP_ASPM_L0S in PCI_EXP_LNKCAP (aka PCIE_RC_CFG_PRIV1_LINK_CAPABILITY in brcmstb).
But instead of using PCI_EXP_LNKCAP_ASPM_L1 and PCI_EXP_LNKCAP_ASPM_L0S directly, it used PCIE_LINK_STATE_L1 and PCIE_LINK_STATE_L0S, which are Linux-created values that only coincidentally matched the PCIe spec. b478e162f227 ("PCI/ASPM: Consolidate link state defines") later changed them so they no longer matched the PCIe spec, so the bits ended up in the wrong place in PCI_EXP_LNKCAP.
Use PCI_EXP_LNKCAP_ASPM_L0S to clear L0s support when there's an 'aspm-no-l0s' property. Rely on brcmstb hardware to advertise L0s and/or L1 support otherwise.
--- drivers/pci/controller/pcie-brcmstb.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
drivers/pci/controller/pcie-brcmstb.c +3 -7
@@ -43,7 +43,6 @@#define PCIE_RC_CFG_PRIV1_ID_VAL3_CLASS_CODE_MASK 0xffffff#define PCIE_RC_CFG_PRIV1_LINK_CAPABILITY 0x04dc -#define PCIE_RC_CFG_PRIV1_LINK_CAPABILITY_ASPM_SUPPORT_MASK 0xc00#define PCIE_RC_DL_MDIO_ADDR 0x1100#define PCIE_RC_DL_MDIO_WR_DATA 0x1104
@@ -865,7 +864,7 @@ static int brcm_pcie_setup(struct brcm_pint num_out_wins =0 ;u16 nlw, cls, lnksta;int i, ret, memc; -u32 tmp, burst, aspm_support; +u32 tmp, burst;/* Reset the bridge */ pcie->bridge_sw_init_set (pcie,1 );
@@ -987,12 +986,9 @@ static int brcm_pcie_setup(struct brcm_p }/* Don't advertise L0s capability if 'aspm-no-l0s' */ - aspm_support =PCIE_LINK_STATE_L1 ; -if (!of_property_read_bool (pcie->np,"aspm-no-l0s" )) - aspm_support |=PCIE_LINK_STATE_L0S ; tmp =readl (base +PCIE_RC_CFG_PRIV1_LINK_CAPABILITY ); -u32p_replace_bits (&tmp, aspm_support, -PCIE_RC_CFG_PRIV1_LINK_CAPABILITY_ASPM_SUPPORT_MASK ); +if (of_property_read_bool (pcie->np,"aspm-no-l0s" )) + tmp &= ~PCI_EXP_LNKCAP_ASPM_L0S ;writel (tmp, base +PCIE_RC_CFG_PRIV1_LINK_CAPABILITY );/*
Greg Kroah-Hartman
maintainerPATCH 378/451 powerpc/pseries/cmm: call balloon_devinfo_init() also without CONFIG_BALLOON_COMPACTION
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
[ Upstream commit fc6bcf9ac4de76f5e7bcd020b3c0a86faff3f2d5 ]
Patch series "powerpc/pseries/cmm: two smaller fixes".
Two smaller fixes identified while doing a bigger rework.
This patch (of 2):
We always have to initialize the balloon_dev_info, even when compaction is not configured in: otherwise the containing list and the lock are left uninitialized.
Likely not many such configs exist in practice, but let's CC stable to be sure.
This was found by code inspection.
--- arch/powerpc/platforms/pseries/cmm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/pseries/cmm.c +1 -1
@@ -570,7 +570,6 @@ static int cmm_balloon_compaction_init(v {int rc; -balloon_devinfo_init (&b_dev_info); b_dev_info.migratepage = cmm_migratepage; balloon_mnt =kern_mount (&balloon_fs);
@@ -624,6 +623,7 @@ static int cmm_init(void)if (!firmware_has_feature (FW_FEATURE_CMO ) && !simulate)return -EOPNOTSUPP ; +balloon_devinfo_init (&b_dev_info); rc =cmm_balloon_compaction_init ();if (rc)return rc;
Greg Kroah-Hartman
maintainerPATCH 379/451 media: renesas: rcar_drif: fix device node reference leak in rcar_drif_bond_enabled
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miaoqian Lin <[email protected]>
[ Upstream commit 445e1658894fd74eab7e53071fa16233887574ed ]
The function calls of_parse_phandle() which returns
a device node with an incremented reference count. When the bonded device is not available, the function
returns NULL without releasing the reference, causing a reference leak.
Add of_node_put(np) to release the device node reference. The of_node_put function handles NULL pointers.
Found through static analysis by reviewing the doc of of_parse_phandle() and cross-checking its usage patterns across the codebase.
--- drivers/media/platform/rcar_drif.c | 1 + 1 file changed, 1 insertion(+)
drivers/media/platform/rcar_drif.c +1 -0
@@ -1253,6 +1253,7 @@ static struct device_node *rcar_drif_bonif (np &&of_device_is_available (np))return np; +of_node_put (np);return NULL ; }
Greg Kroah-Hartman
maintainerPATCH 380/451 ASoC: stm: Use dev_err_probe() helper
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuninori Morimoto <[email protected]>
[ Upstream commit efc162cbd480f1fb47d439c193ec9731bcc6c749 ]
Use the dev_err_probe() helper, instead of open-coding the same operation.
Stable-dep-of: 312ec2f0d9d1 ("ASoC: stm32: sai: fix clk prepare imbalance on probe failure")
--- sound/soc/stm/stm32_i2s.c | 62 ++++++++++++++---------------------------- sound/soc/stm/stm32_sai.c | 37 ++++++++----------------- sound/soc/stm/stm32_sai_sub.c | 25 +++++----------- sound/soc/stm/stm32_spdifrx.c | 44 ++++++++++------------------- 4 files changed, 57 insertions(+), 111 deletions(-)
sound/soc/stm/stm32_i2s.c +21 -41
@@ -830,36 +830,24 @@ static int stm32_i2s_parse_dt(struct pla/* Get clocks */ i2s->pclk =devm_clk_get (&pdev->dev,"pclk" ); -if (IS_ERR (i2s->pclk)) { -if (PTR_ERR (i2s->pclk) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"Could not get pclk: %ld\n" , -PTR_ERR (i2s->pclk)); -return PTR_ERR (i2s->pclk); - } +if (IS_ERR (i2s->pclk)) +return dev_err_probe (&pdev->dev,PTR_ERR (i2s->pclk), +"Could not get pclk\n" ); i2s->i2sclk =devm_clk_get (&pdev->dev,"i2sclk" ); -if (IS_ERR (i2s->i2sclk)) { -if (PTR_ERR (i2s->i2sclk) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"Could not get i2sclk: %ld\n" , -PTR_ERR (i2s->i2sclk)); -return PTR_ERR (i2s->i2sclk); - } +if (IS_ERR (i2s->i2sclk)) +return dev_err_probe (&pdev->dev,PTR_ERR (i2s->i2sclk), +"Could not get i2sclk\n" ); i2s->x8kclk =devm_clk_get (&pdev->dev,"x8k" ); -if (IS_ERR (i2s->x8kclk)) { -if (PTR_ERR (i2s->x8kclk) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"Could not get x8k parent clock: %ld\n" , -PTR_ERR (i2s->x8kclk)); -return PTR_ERR (i2s->x8kclk); - } +if (IS_ERR (i2s->x8kclk)) +return dev_err_probe (&pdev->dev,PTR_ERR (i2s->x8kclk), +"Could not get x8k parent clock\n" ); i2s->x11kclk =devm_clk_get (&pdev->dev,"x11k" ); -if (IS_ERR (i2s->x11kclk)) { -if (PTR_ERR (i2s->x11kclk) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"Could not get x11k parent clock: %ld\n" , -PTR_ERR (i2s->x11kclk)); -return PTR_ERR (i2s->x11kclk); - } +if (IS_ERR (i2s->x11kclk)) +return dev_err_probe (&pdev->dev,PTR_ERR (i2s->x11kclk), +"Could not get x11k parent clock\n" );/* Get irqs */ irq =platform_get_irq (pdev,0 );
@@ -875,12 +863,10 @@ static int stm32_i2s_parse_dt(struct pla/* Reset */ rst =devm_reset_control_get_optional_exclusive (&pdev->dev,NULL ); -if (IS_ERR (rst)) { -if (PTR_ERR (rst) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"Reset controller error %ld\n" , -PTR_ERR (rst)); -return PTR_ERR (rst); - } +if (IS_ERR (rst)) +return dev_err_probe (&pdev->dev,PTR_ERR (rst), +"Reset controller error\n" ); +reset_control_assert (rst);udelay (2 );reset_control_deassert (rst);
@@ -922,19 +908,13 @@ static int stm32_i2s_probe(struct platfo i2s->regmap =devm_regmap_init_mmio_clk (&pdev->dev,"pclk" , i2s->base, i2s->regmap_conf); -if (IS_ERR (i2s->regmap)) { -if (PTR_ERR (i2s->regmap) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"Regmap init error %ld\n" , -PTR_ERR (i2s->regmap)); -return PTR_ERR (i2s->regmap); - } +if (IS_ERR (i2s->regmap)) +return dev_err_probe (&pdev->dev,PTR_ERR (i2s->regmap), +"Regmap init error\n" ); ret =snd_dmaengine_pcm_register (&pdev->dev, &stm32_i2s_pcm_config,0 ); -if (ret) { -if (ret != -EPROBE_DEFER ) -dev_err (&pdev->dev,"PCM DMA register error %d\n" , ret); -return ret; - } +if (ret) +return dev_err_probe (&pdev->dev, ret,"PCM DMA register error\n" ); ret =snd_soc_register_component (&pdev->dev, &stm32_i2s_component, i2s->dai_drv,1 );
sound/soc/stm/stm32_sai.c +13 -24
@@ -173,29 +173,20 @@ static int stm32_sai_probe(struct platfoif (!STM_SAI_IS_F4 (sai)) { sai->pclk =devm_clk_get (&pdev->dev,"pclk" ); -if (IS_ERR (sai->pclk)) { -if (PTR_ERR (sai->pclk) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"missing bus clock pclk: %ld\n" , -PTR_ERR (sai->pclk)); -return PTR_ERR (sai->pclk); - } +if (IS_ERR (sai->pclk)) +return dev_err_probe (&pdev->dev,PTR_ERR (sai->pclk), +"missing bus clock pclk\n" ); } sai->clk_x8k =devm_clk_get (&pdev->dev,"x8k" ); -if (IS_ERR (sai->clk_x8k)) { -if (PTR_ERR (sai->clk_x8k) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"missing x8k parent clock: %ld\n" , -PTR_ERR (sai->clk_x8k)); -return PTR_ERR (sai->clk_x8k); - } +if (IS_ERR (sai->clk_x8k)) +return dev_err_probe (&pdev->dev,PTR_ERR (sai->clk_x8k), +"missing x8k parent clock\n" ); sai->clk_x11k =devm_clk_get (&pdev->dev,"x11k" ); -if (IS_ERR (sai->clk_x11k)) { -if (PTR_ERR (sai->clk_x11k) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"missing x11k parent clock: %ld\n" , -PTR_ERR (sai->clk_x11k)); -return PTR_ERR (sai->clk_x11k); - } +if (IS_ERR (sai->clk_x11k)) +return dev_err_probe (&pdev->dev,PTR_ERR (sai->clk_x11k), +"missing x11k parent clock\n" );/* init irqs */ sai->irq =platform_get_irq (pdev,0 );
@@ -204,12 +195,10 @@ static int stm32_sai_probe(struct platfo/* reset */ rst =devm_reset_control_get_optional_exclusive (&pdev->dev,NULL ); -if (IS_ERR (rst)) { -if (PTR_ERR (rst) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"Reset controller error %ld\n" , -PTR_ERR (rst)); -return PTR_ERR (rst); - } +if (IS_ERR (rst)) +return dev_err_probe (&pdev->dev,PTR_ERR (rst), +"Reset controller error\n" ); +reset_control_assert (rst);udelay (2 );reset_control_deassert (rst);
sound/soc/stm/stm32_sai_sub.c +8 -17
@@ -1380,12 +1380,9 @@ static int stm32_sai_sub_parse_of(struct*/ sai->regmap =devm_regmap_init_mmio (&pdev->dev, base, sai->regmap_config); -if (IS_ERR (sai->regmap)) { -if (PTR_ERR (sai->regmap) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"Regmap init error %ld\n" , -PTR_ERR (sai->regmap)); -return PTR_ERR (sai->regmap); - } +if (IS_ERR (sai->regmap)) +return dev_err_probe (&pdev->dev,PTR_ERR (sai->regmap), +"Regmap init error\n" );/* Get direction property */ if (of_property_match_string (np,"dma-names" ,"tx" ) >=0 ) {
@@ -1473,12 +1470,9 @@ static int stm32_sai_sub_parse_of(structof_node_put (args.np); sai->sai_ck =devm_clk_get (&pdev->dev,"sai_ck" ); -if (IS_ERR (sai->sai_ck)) { -if (PTR_ERR (sai->sai_ck) != -EPROBE_DEFER ) -dev_err (&pdev->dev,"Missing kernel clock sai_ck: %ld\n" , -PTR_ERR (sai->sai_ck)); -return PTR_ERR (sai->sai_ck); - } +if (IS_ERR (sai->sai_ck)) +return dev_err_probe (&pdev->dev,PTR_ERR (sai->sai_ck), +"Missing kernel clock sai_ck\n" ); ret =clk_prepare (sai->pdata->pclk);if (ret <0 )
@@ -1552,11 +1546,8 @@ static int stm32_sai_sub_probe(struct pl conf = &stm32_sai_pcm_config_spdif; ret =snd_dmaengine_pcm_register (&pdev->dev, conf,0 ); -if (ret) { -if (ret != -EPROBE_DEFER ) -dev_err (&pdev->dev,"Could not register pcm dma\n" ); -return ret; - } +if (ret) +return dev_err_probe (&pdev->dev, ret,"Could not register pcm dma\n" ); ret =snd_soc_register_component (&pdev->dev, &stm32_component, &sai->cpu_dai_drv,1 );
sound/soc/stm/stm32_spdifrx.c +15 -29
74 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 381/451 ASoC: stm32: sai: Use the devm_clk_get_optional() helper
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 374628fb668e50b42fe81f2a63af616182415bcd ]
Use devm_clk_get_optional() instead of hand writing it. This saves some LoC and improves the semantic.
Stable-dep-of: 312ec2f0d9d1 ("ASoC: stm32: sai: fix clk prepare imbalance on probe failure")
--- sound/soc/stm/stm32_sai_sub.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
sound/soc/stm/stm32_sai_sub.c +3 -6
@@ -1487,12 +1487,9 @@ static int stm32_sai_sub_parse_of(structif (ret <0 )return ret; }else { - sai->sai_mclk =devm_clk_get (&pdev->dev,"MCLK" ); -if (IS_ERR (sai->sai_mclk)) { -if (PTR_ERR (sai->sai_mclk) != -ENOENT ) -return PTR_ERR (sai->sai_mclk); - sai->sai_mclk =NULL ; - } + sai->sai_mclk =devm_clk_get_optional (&pdev->dev,"MCLK" ); +if (IS_ERR (sai->sai_mclk)) +return PTR_ERR (sai->sai_mclk); }return 0 ;
Greg Kroah-Hartman
maintainerPATCH 382/451 ASoC: stm32: sai: fix clk prepare imbalance on probe failure
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
[ Upstream commit 312ec2f0d9d1a5656f76d770bbf1d967e9289aa7 ]
Make sure to unprepare the parent clock also on probe failures (e.g. probe deferral).
--- sound/soc/stm/stm32_sai_sub.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
sound/soc/stm/stm32_sai_sub.c +21 -7
@@ -1485,14 +1485,21 @@ static int stm32_sai_sub_parse_of(structif (of_find_property (np,"#clock-cells" ,NULL )) { ret =stm32_sai_add_mclk_provider (sai);if (ret <0 ) -return ret; + goto err_unprepare_pclk; }else { sai->sai_mclk =devm_clk_get_optional (&pdev->dev,"MCLK" ); -if (IS_ERR (sai->sai_mclk)) -return PTR_ERR (sai->sai_mclk); +if (IS_ERR (sai->sai_mclk)) { + ret =PTR_ERR (sai->sai_mclk); + goto err_unprepare_pclk; + } }return 0 ; + +err_unprepare_pclk: +clk_unprepare (sai->pdata->pclk); + +return ret; }static int stm32_sai_sub_probe (struct platform_device *pdev)
@@ -1536,26 +1543,33 @@ static int stm32_sai_sub_probe(struct pl IRQF_SHARED, dev_name(&pdev->dev), sai);if (ret) {dev_err (&pdev->dev,"IRQ request returned %d\n" , ret); -return ret; + goto err_unprepare_pclk; }if (STM_SAI_PROTOCOL_IS_SPDIF (sai)) conf = &stm32_sai_pcm_config_spdif; ret =snd_dmaengine_pcm_register (&pdev->dev, conf,0 ); -if (ret) -return dev_err_probe (&pdev->dev, ret,"Could not register pcm dma\n" ); +if (ret) { + ret =dev_err_probe (&pdev->dev, ret,"Could not register pcm dma\n" ); + goto err_unprepare_pclk; + } ret =snd_soc_register_component (&pdev->dev, &stm32_component, &sai->cpu_dai_drv,1 );if (ret) {snd_dmaengine_pcm_unregister (&pdev->dev); -return ret; + goto err_unprepare_pclk; }pm_runtime_enable (&pdev->dev);return 0 ; + +err_unprepare_pclk: +clk_unprepare (sai->pdata->pclk); + +return ret; }static int stm32_sai_sub_remove (struct platform_device *pdev)
Greg Kroah-Hartman
maintainerPATCH 383/451 mm/balloon_compaction: make balloon page compaction callbacks static
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miaohe Lin <[email protected]>
[ Upstream commit 504c1cabe325df65c18ef38365ddd1a41c6b591b ]
Since commit b1123ea6d3b3 ("mm: balloon: use general non-lru movable page feature"), these functions are called via balloon_aops callbacks. They're not called directly outside this file. So make them static and clean up the relevant code.
Stable-dep-of: 0da2ba35c0d5 ("powerpc/pseries/cmm: adjust BALLOON_MIGRATE when migrating pages")
--- include/linux/balloon_compaction.h | 22 ---------------------- mm/balloon_compaction.c | 6 +++--- 2 files changed, 3 insertions(+), 25 deletions(-)
include/linux/balloon_compaction.h +0 -22
@@ -80,12 +80,6 @@ static inline void balloon_devinfo_init(#ifdef CONFIG_BALLOON_COMPACTION extern const struct address_space_operations balloon_aops; -extern bool balloon_page_isolate (struct page *page, -isolate_mode_t mode); -extern void balloon_page_putback (struct page *page); -extern int balloon_page_migrate (struct address_space *mapping, -struct page *newpage, -struct page *page,enum migrate_mode mode);/* * balloon_page_insert - insert a page into the balloon's page list and make
@@ -155,22 +149,6 @@ static inline void balloon_page_delete(slist_del (&page->lru); } -static inline bool balloon_page_isolate (struct page *page) -{ -return false; -} - -static inline void balloon_page_putback (struct page *page) -{ -return ; -} - -static inline int balloon_page_migrate (struct page *newpage, -struct page *page,enum migrate_mode mode) -{ -return 0 ; -} -static inline gfp_t balloon_mapping_gfp_mask (void ) {return GFP_HIGHUSER ;
mm/balloon_compaction.c +3 -3
@@ -203,7 +203,7 @@ EXPORT_SYMBOL_GPL(balloon_page_dequeue);#ifdef CONFIG_BALLOON_COMPACTION -bool balloon_page_isolate (struct page *page,isolate_mode_t mode) +static bool balloon_page_isolate (struct page *page,isolate_mode_t mode) {struct balloon_dev_info *b_dev_info =balloon_page_device (page);
@@ -217,7 +217,7 @@ bool balloon_page_isolate(struct page *preturn true; } -void balloon_page_putback (struct page *page) +static void balloon_page_putback (struct page *page) {struct balloon_dev_info *b_dev_info =balloon_page_device (page);unsigned long flags;
@@ -230,7 +230,7 @@ void balloon_page_putback(struct page *p/* move_to_new_page() counterpart for a ballooned page */ -int balloon_page_migrate (struct address_space *mapping, +static int balloon_page_migrate (struct address_space *mapping,struct page *newpage,struct page *page,enum migrate_mode mode) {
Greg Kroah-Hartman
maintainerPATCH 384/451 mm/balloon_compaction: we cannot have isolated pages in the balloon list
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
[ Upstream commit fb05f992b6bbb4702307d96f00703ee637b24dbf ]
Patch series "mm/migration: rework movable_ops page migration (part 1)", v2.
In the future, as we decouple "struct page" from "struct folio", pages that support "non-lru page migration" -- movable_ops page migration such as memory balloons and zsmalloc -- will no longer be folios. They will not have ->mapping, ->lru, and likely no refcount and no page lock. But they will have a type and flags 🙂
This is the first part (other parts not written yet) of decoupling movable_ops page migration from folio migration.
In this series, we get rid of the ->mapping usage, and start cleaning up the code + separating it from folio migration.
Migration core will have to be further reworked to not treat movable_ops pages like folios. This is the first step into that direction.
This patch (of 29):
The core will set PG_isolated only after mops->isolate_page() was called. In case of the balloon, that is where we will remove it from the balloon list. So we cannot have isolated pages in the balloon list.
Let's drop this unnecessary check.
Stable-dep-of: 0da2ba35c0d5 ("powerpc/pseries/cmm: adjust BALLOON_MIGRATE when migrating pages")
--- mm/balloon_compaction.c | 6 ------ 1 file changed, 6 deletions(-)
mm/balloon_compaction.c +0 -6
@@ -93,12 +93,6 @@ size_t balloon_page_list_dequeue(structif (!trylock_page (page))continue ; -if (IS_ENABLED (CONFIG_BALLOON_COMPACTION ) && -PageIsolated (page)) { -/* raced with isolation */ -unlock_page (page); -continue ; - }balloon_page_delete (page);__count_vm_event (BALLOON_DEFLATE );list_add (&page->lru, pages);
Greg Kroah-Hartman
maintainerPATCH 385/451 mm/balloon_compaction: convert balloon_page_delete() to balloon_page_finalize()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
[ Upstream commit 15504b1163007bbfbd9a63460d5c14737c16e96d ]
Let's move the removal of the page from the balloon list into the single caller, to remove the dependency on the PG_isolated flag and clarify locking requirements.
Note that for now, balloon_page_delete() was used on two paths:
(1) Removing a page from the balloon for deflation through balloon_page_list_dequeue()
(2) Removing an isolated page from the balloon for migration in the per-driver migration handlers. Isolated pages were already removed from the balloon list during isolation.
So instead of relying on the flag, we can just distinguish both cases directly and handle it accordingly in the caller.
We'll shuffle the operations a bit such that they logically make more sense (e.g., remove from the list before clearing flags).
In balloon migration functions we can now move the balloon_page_finalize() out of the balloon lock and perform the finalization just before dropping the balloon reference.
Document that the page lock is currently required when modifying the movability aspects of a page; hopefully we can soon decouple this from the page lock.
Stable-dep-of: 0da2ba35c0d5 ("powerpc/pseries/cmm: adjust BALLOON_MIGRATE when migrating pages")
--- arch/powerpc/platforms/pseries/cmm.c | 2 - drivers/misc/vmw_balloon.c | 3 -- drivers/virtio/virtio_balloon.c | 4 --- include/linux/balloon_compaction.h | 43 +++++++++++++---------------------- mm/balloon_compaction.c | 3 +- 5 files changed, 21 insertions(+), 34 deletions(-)
arch/powerpc/platforms/pseries/cmm.c +1 -1
@@ -550,7 +550,6 @@ static int cmm_migratepage(struct balloospin_lock_irqsave (&b_dev_info->pages_lock, flags);balloon_page_insert (b_dev_info, newpage); -balloon_page_delete (page); b_dev_info->isolated_pages--;spin_unlock_irqrestore (&b_dev_info->pages_lock, flags);
@@ -560,6 +559,7 @@ static int cmm_migratepage(struct balloo*/ plpar_page_set_active (page); +balloon_page_finalize (page);/* balloon page list reference */ put_page (page);
drivers/misc/vmw_balloon.c +1 -2
@@ -1810,8 +1810,7 @@ static int vmballoon_migratepage(struct* @pages_lock . We keep holding @comm_lock since we will need it in a * second. */ -balloon_page_delete (page); - +balloon_page_finalize (page);put_page (page);/* Inflate */
drivers/virtio/virtio_balloon.c +1 -3
@@ -796,15 +796,13 @@ static int virtballoon_migratepage(structell_host (vb, vb->inflate_vq);/* balloon's page migration 2nd step -- deflate "page" */ -spin_lock_irqsave (&vb_dev_info->pages_lock, flags); -balloon_page_delete (page); -spin_unlock_irqrestore (&vb_dev_info->pages_lock, flags); vb->num_pfns =VIRTIO_BALLOON_PAGES_PER_PAGE ;set_page_pfns (vb, vb->pfns, page);tell_host (vb, vb->deflate_vq);mutex_unlock (&vb->balloon_lock); +balloon_page_finalize (page);put_page (page);/* balloon reference */ return MIGRATEPAGE_SUCCESS ;
include/linux/balloon_compaction.h +16 -27
61 lines not on this page · raw message
mm/balloon_compaction.c +2 -1
@@ -93,7 +93,8 @@ size_t balloon_page_list_dequeue(structif (!trylock_page (page))continue ; -balloon_page_delete (page); +list_del (&page->lru); +balloon_page_finalize (page);__count_vm_event (BALLOON_DEFLATE );list_add (&page->lru, pages);unlock_page (page);
Greg Kroah-Hartman
maintainerPATCH 386/451 powerpc/pseries/cmm: adjust BALLOON_MIGRATE when migrating pages
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
[ Upstream commit 0da2ba35c0d532ca0fe7af698b17d74c4d084b9a ]
Let's properly adjust BALLOON_MIGRATE like the other drivers.
Note that the INFLATE/DEFLATE events are triggered from the core when enqueueing/dequeueing pages.
This was found by code inspection.
--- arch/powerpc/platforms/pseries/cmm.c | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/platforms/pseries/cmm.c +1 -0
@@ -550,6 +550,7 @@ static int cmm_migratepage(struct balloospin_lock_irqsave (&b_dev_info->pages_lock, flags);balloon_page_insert (b_dev_info, newpage); +__count_vm_event (BALLOON_MIGRATE ); b_dev_info->isolated_pages--;spin_unlock_irqrestore (&b_dev_info->pages_lock, flags);
Greg Kroah-Hartman
maintainerPATCH 387/451 media: mediatek: vcodec: Fix a reference leak in mtk_vcodec_fw_vpu_init()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haoxiang Li <[email protected]>
[ Upstream commit cdd0f118ef87db8a664fb5ea366fd1766d2df1cd ]
vpu_get_plat_device() increases the reference count of the returned platform device. However, when devm_kzalloc() fails, the reference is not released, causing a reference leak.
Fix this by calling put_device() on fw_pdev->dev before returning on the error path.
--- drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_vpu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_vpu.c +3 -1
@@ -94,8 +94,10 @@ struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_vpu_wdt_reg_handler (fw_pdev, mtk_vcodec_vpu_reset_handler, dev, rst_id); fw =devm_kzalloc (&dev->plat_dev->dev,sizeof (*fw),GFP_KERNEL ); -if (!fw) +if (!fw) { +put_device (&fw_pdev->dev);return ERR_PTR (-ENOMEM ); + } fw->type =VPU ; fw->ops = &mtk_vcodec_vpu_msg; fw->pdev = fw_pdev;
Greg Kroah-Hartman
maintainerPATCH 388/451 media: vpif_capture: fix section mismatch
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
[ Upstream commit 0ef841113724166c3c484d0e9ae6db1eb5634fde ]
Platform drivers can be probed after their init sections have been discarded (e.g. on probe deferral or manual rebind through sysfs) so the probe function must not live in init.
Note that commit ffa1b391c61b ("V4L/DVB: vpif_cap/disp: Removed section mismatch warning") incorrectly suppressed the modpost warning.
--- drivers/media/platform/davinci/vpif_capture.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/media/platform/davinci/vpif_capture.c +2 -2
@@ -1614,7 +1614,7 @@ err_cleanup:* This creates device entries by register itself to the V4L2 driver and * initializes fields of each channel objects */ -static __init int vpif_probe (struct platform_device *pdev) +static int vpif_probe (struct platform_device *pdev) {struct vpif_subdev_info *subdevdata;struct i2c_adapter *i2c_adap;
@@ -1817,7 +1817,7 @@ static int vpif_resume(struct device *de static SIMPLE_DEV_PM_OPS(vpif_pm_ops, vpif_suspend, vpif_resume); -static __refdata struct platform_driver vpif_driver = { +static struct platform_driver vpif_driver = { .driver = { .name =VPIF_DRIVER_NAME , .pm = &vpif_pm_ops,
Greg Kroah-Hartman
maintainerPATCH 389/451 media: samsung: exynos4-is: fix potential ABBA deadlock on init
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Szyprowski <[email protected]>
[ Upstream commit 17dc8ccd6dd5ffe30aa9b0d36e2af1389344ce2b ]
v4l2_device_register_subdev_nodes() must called without taking media_dev->graph_mutex to avoid potential AB-BA deadlock on further subdevice driver initialization.
--- drivers/media/platform/exynos4-is/media-dev.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/media/platform/exynos4-is/media-dev.c +6 -4
@@ -1409,12 +1409,14 @@ static int subdev_notifier_complete(strumutex_lock (&fmd->media_dev.graph_mutex); ret =fimc_md_create_links (fmd); -if (ret <0 ) - goto unlock; +if (ret <0 ) { +mutex_unlock (&fmd->media_dev.graph_mutex); +return ret; + } - ret =v4l2_device_register_subdev_nodes (&fmd->v4l2_dev); -unlock:mutex_unlock (&fmd->media_dev.graph_mutex); + + ret =v4l2_device_register_subdev_nodes (&fmd->v4l2_dev);if (ret <0 )return ret;
Greg Kroah-Hartman
maintainerPATCH 390/451 lockd: fix vfs_test_lock() calls
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
[ Upstream commit a49a2a1baa0c553c3548a1c414b6a3c005a8deba ]
Usage of vfs_test_lock() is somewhat confused. Documentation suggests it is given a "lock" but this is not the case. It is given a struct file_lock which contains some details of the sort of lock it should be looking for.
In particular passing a "file_lock" containing fl_lmops or fl_ops is meaningless and possibly confusing.
This is particularly problematic in lockd. nlmsvc_testlock() receives an initialised "file_lock" from xdr-decode, including manager ops and an owner. It then mistakenly passes this to vfs_test_lock() which might replace the owner and the ops. This can lead to confusion when freeing the lock.
The primary role of the 'struct file_lock' passed to vfs_test_lock() is to report a conflicting lock that was found, so it makes more sense for nlmsvc_testlock() to pass "conflock", which it uses for returning the conflicting lock.
With this change, freeing of the lock is not confused and code in __nlm4svc_proc_test() and __nlmsvc_proc_test() can be simplified.
Documentation for vfs_test_lock() is improved to reflect its real purpose, and a WARN_ON_ONCE() is added to avoid a similar problem in the future.
--- fs/lockd/svc4proc.c | 4 +--- fs/lockd/svclock.c | 21 ++++++++++++--------- fs/lockd/svcproc.c | 5 +---- fs/locks.c | 13 +++++++++++-- 4 files changed, 25 insertions(+), 18 deletions(-)
fs/lockd/svc4proc.c +1 -3
@@ -96,7 +96,6 @@ __nlm4svc_proc_test(struct svc_rqst *rqsstruct nlm_args *argp = rqstp->rq_argp;struct nlm_host *host;struct nlm_file *file; -struct nlm_lockowner *test_owner;__be32 rc = rpc_success;dprintk ("lockd: TEST4 called\n" );
@@ -106,7 +105,6 @@ __nlm4svc_proc_test(struct svc_rqst *rqsif ((resp->status =nlm4svc_retrieve_args (rqstp, argp, &host, &file)))return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; - test_owner = argp->lock.fl.fl_owner;/* Now check for conflicting locks */ resp->status =nlmsvc_testlock (rqstp, file, host, &argp->lock, &resp->lock, &resp->cookie);if (resp->status == nlm_drop_reply)
@@ -114,7 +112,7 @@ __nlm4svc_proc_test(struct svc_rqst *rqselse dprintk ("lockd: TEST4 status %d\n" ,ntohl (resp->status)); -nlmsvc_put_lockowner (test_owner); +nlmsvc_release_lockowner (&argp->lock);nlmsvc_release_host (host);nlm_release_file (file);return rc;
fs/lockd/svclock.c +12 -9
@@ -604,7 +604,13 @@ nlmsvc_testlock(struct svc_rqst *rqstp, } mode =lock_to_openmode (&lock->fl); - error =vfs_test_lock (file->f_file[mode], &lock->fl); +locks_init_lock (&conflock->fl); +/* vfs_test_lock only uses start, end, and owner, but tests fl_file */ + conflock->fl.fl_file = lock->fl.fl_file; + conflock->fl.fl_start = lock->fl.fl_start; + conflock->fl.fl_end = lock->fl.fl_end; + conflock->fl.fl_owner = lock->fl.fl_owner; + error =vfs_test_lock (file->f_file[mode], &conflock->fl);if (error) {/* We can't currently deal with deferred test requests */ if (error ==FILE_LOCK_DEFERRED )
@@ -614,22 +620,19 @@ nlmsvc_testlock(struct svc_rqst *rqstp, goto out; } -if (lock->fl.fl_type ==F_UNLCK ) { +if (conflock->fl.fl_type ==F_UNLCK ) { ret = nlm_granted; goto out; }dprintk ("lockd: conflicting lock(ty=%d, %Ld-%Ld)\n" , - lock->fl.fl_type, (long long )lock->fl.fl_start, - (long long )lock->fl.fl_end); + conflock->fl.fl_type, (long long )conflock->fl.fl_start, + (long long )conflock->fl.fl_end); conflock->caller ="somehost" ;/* FIXME */ conflock->len =strlen (conflock->caller); conflock->oh.len =0 ;/* don't return OH info */ - conflock->svid = lock->fl.fl_pid; - conflock->fl.fl_type = lock->fl.fl_type; - conflock->fl.fl_start = lock->fl.fl_start; - conflock->fl.fl_end = lock->fl.fl_end; -locks_release_private (&lock->fl); + conflock->svid = conflock->fl.fl_pid; +locks_release_private (&conflock->fl); ret = nlm_lck_denied; out:
fs/lockd/svcproc.c +1 -4
@@ -117,7 +117,6 @@ __nlmsvc_proc_test(struct svc_rqst *rqststruct nlm_args *argp = rqstp->rq_argp;struct nlm_host *host;struct nlm_file *file; -struct nlm_lockowner *test_owner;__be32 rc = rpc_success;dprintk ("lockd: TEST called\n" );
@@ -127,8 +126,6 @@ __nlmsvc_proc_test(struct svc_rqst *rqstif ((resp->status =nlmsvc_retrieve_args (rqstp, argp, &host, &file)))return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; - test_owner = argp->lock.fl.fl_owner; -/* Now check for conflicting locks */ resp->status =cast_status (nlmsvc_testlock (rqstp, file, host, &argp->lock, &resp->lock, &resp->cookie));if (resp->status == nlm_drop_reply)
@@ -137,7 +134,7 @@ __nlmsvc_proc_test(struct svc_rqst *rqstdprintk ("lockd: TEST status %d vers %d\n" ,ntohl (resp->status), rqstp->rq_vers); -nlmsvc_put_lockowner (test_owner); +nlmsvc_release_lockowner (&argp->lock);nlmsvc_release_host (host);nlm_release_file (file);return rc;
fs/locks.c +11 -2
@@ -2325,13 +2325,22 @@ SYSCALL_DEFINE2(flock, unsigned int, fd,/** * vfs_test_lock - test file byte range lock * @filp: The file to test lock for -* @fl: The lock to test; also used to hold result +* @fl: The byte-range in the file to test; also used to hold result * +* On entry, @fl does not contain a lock, but identifies a range (fl_start, fl_end) +* in the file (c.flc_file), and an owner (c.flc_owner) for whom existing locks +* should be ignored. c.flc_type and c.flc_flags are ignored. +* Both fl_lmops and fl_ops in @fl must be NULL. * Returns -ERRNO on failure. Indicates presence of conflicting lock by -* setting conf->fl_type to something other than F_UNLCK. +* setting fl->fl_type to something other than F_UNLCK. +* +* If vfs_test_lock() does find a lock and return it, the caller must +* use locks_free_lock() or locks_release_private() on the returned lock. */ int vfs_test_lock (struct file *filp,struct file_lock *fl) { +WARN_ON_ONCE (fl->fl_ops || fl->fl_lmops); +WARN_ON_ONCE (filp != fl->fl_file);if (filp->f_op->lock)return filp->f_op->lock (filp,F_GETLK , fl);posix_test_lock (filp, fl);
Greg Kroah-Hartman
maintainerPATCH 391/451 drm/gma500: Remove unused helper psb_fbdev_fb_setcolreg()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
[ Upstream commit be729f9de6c64240645dc80a24162ac4d3fe00a8 ]
Remove psb_fbdev_fb_setcolreg(), which hasn't been called in almost a decade.
Gma500 commit 4d8d096e9ae8 ("gma500: introduce the framebuffer support code") added the helper psb_fbdev_fb_setcolreg() for setting the fbdev palette via fbdev's fb_setcolreg callback. Later
commit 3da6c2f3b730 ("drm/gma500: use DRM_FB_HELPER_DEFAULT_OPS for fb_ops") set several default helpers for fbdev emulation, including fb_setcmap.
The fbdev subsystem always prefers fb_setcmap over fb_setcolreg. [1] Hence, the gma500 code is no longer in use and gma500 has been using drm_fb_helper_setcmap() for several years without issues.
--- drivers/gpu/drm/gma500/framebuffer.c | 44 ----------------------------------- 1 file changed, 44 deletions(-)
drivers/gpu/drm/gma500/framebuffer.c +0 -44
@@ -34,47 +34,6 @@ static const struct drm_framebuffer_func .create_handle = drm_gem_fb_create_handle, }; -#define CMAP_TOHW (_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16) - -static int psbfb_setcolreg (unsigned regno,unsigned red,unsigned green, -unsigned blue,unsigned transp, -struct fb_info *info) -{ -struct drm_fb_helper *fb_helper = info->par; -struct drm_framebuffer *fb = fb_helper->fb; -uint32_t v; - -if (!fb) -return -ENOMEM ; - -if (regno >255 ) -return 1 ; - - red =CMAP_TOHW (red, info->var.red.length); - blue =CMAP_TOHW (blue, info->var.blue.length); - green =CMAP_TOHW (green, info->var.green.length); - transp =CMAP_TOHW (transp, info->var.transp.length); - - v = (red << info->var.red.offset) | - (green << info->var.green.offset) | - (blue << info->var.blue.offset) | - (transp << info->var.transp.offset); - -if (regno <16 ) { -switch (fb->format->cpp[0 ] *8 ) { -case 16 : - ((uint32_t *) info->pseudo_palette)[regno] = v; -break ; -case 24 : -case 32 : - ((uint32_t *) info->pseudo_palette)[regno] = v; -break ; - } - } - -return 0 ; -} -static int psbfb_pan (struct fb_var_screeninfo *var,struct fb_info *info) {struct drm_fb_helper *fb_helper = info->par;
@@ -167,7 +126,6 @@ static int psbfb_mmap(struct fb_info *instatic const struct fb_ops psbfb_ops = { .owner =THIS_MODULE ,DRM_FB_HELPER_DEFAULT_OPS , - .fb_setcolreg = psbfb_setcolreg, .fb_fillrect = drm_fb_helper_cfb_fillrect, .fb_copyarea = psbfb_copyarea, .fb_imageblit = drm_fb_helper_cfb_imageblit,
@@ -178,7 +136,6 @@ static const struct fb_ops psbfb_ops = {static const struct fb_ops psbfb_roll_ops = { .owner =THIS_MODULE ,DRM_FB_HELPER_DEFAULT_OPS , - .fb_setcolreg = psbfb_setcolreg, .fb_fillrect = drm_fb_helper_cfb_fillrect, .fb_copyarea = drm_fb_helper_cfb_copyarea, .fb_imageblit = drm_fb_helper_cfb_imageblit,
@@ -189,7 +146,6 @@ static const struct fb_ops psbfb_roll_opstatic const struct fb_ops psbfb_unaccel_ops = { .owner =THIS_MODULE ,DRM_FB_HELPER_DEFAULT_OPS , - .fb_setcolreg = psbfb_setcolreg, .fb_fillrect = drm_fb_helper_cfb_fillrect, .fb_copyarea = drm_fb_helper_cfb_copyarea, .fb_imageblit = drm_fb_helper_cfb_imageblit,
Greg Kroah-Hartman
maintainerPATCH 392/451 wifi: mac80211: Discard Beacon frames to non-broadcast address
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jouni Malinen <[email protected]>
[ Upstream commit 193d18f60588e95d62e0f82b6a53893e5f2f19f8 ]
Beacon frames are required to be sent to the broadcast address, see IEEE Std 802.11-2020, 11.1.3.1 ("The Address 1 field of the Beacon .. frame shall be set to the broadcast address"). A unicast Beacon frame might be used as a targeted attack to get one of the associated STAs to do something (e.g., using CSA to move it to another channel). As such, it is better have strict filtering for this on the received side and discard all Beacon frames that are sent to an unexpected address.
This is even more important for cases where beacon protection is used. The current implementation in mac80211 is correctly discarding unicast Beacon frames if the Protected Frame bit in the Frame Control field is set to 0. However, if that bit is set to 1, the logic used for checking for configured BIGTK(s) does not actually work. If the driver does not have logic for dropping unicast Beacon frames with Protected Frame bit 1, these frames would be accepted in mac80211 processing as valid Beacon frames even though they are not protected. This would allow beacon protection to be bypassed. While the logic for checking beacon protection could be extended to cover this corner case, a more generic check for discard all Beacon frames based on A1=unicast address covers this without needing additional changes.
Address all these issues by dropping received Beacon frames if they are sent to a non-broadcast address.
--- net/mac80211/rx.c | 5 +++++ 1 file changed, 5 insertions(+)
net/mac80211/rx.c +5 -0
@@ -3189,6 +3189,11 @@ ieee80211_rx_h_mgmt_check(struct ieee802if (!ieee80211_is_mgmt (mgmt->frame_control))return RX_DROP_MONITOR ; +/* Drop non-broadcast Beacon frames */ +if (ieee80211_is_beacon (mgmt->frame_control) && + !is_broadcast_ether_addr (mgmt->da)) +return RX_DROP_MONITOR ; +if (rx->sdata->vif.type ==NL80211_IFTYPE_AP &&ieee80211_is_beacon (mgmt->frame_control) && !(rx->flags &IEEE80211_RX_BEACON_REPORTED )) {
Greg Kroah-Hartman
maintainerPATCH 393/451 NFSD: NFSv4 file creation neglects setting ACL
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit 913f7cf77bf14c13cfea70e89bcb6d0b22239562 ]
An NFSv4 client that sets an ACL with a named principal during file creation retrieves the ACL afterwards, and finds that it is only a default ACL (based on the mode bits) and not the ACL that was requested during file creation. This violates RFC 8881 section 6.4.1.3: "the ACL attribute is set as given".
The issue occurs in nfsd_create_setattr(). On 6.1.y, the check to determine whether nfsd_setattr() should be called is simply "iap->ia_valid", which only accounts for iattr changes. When only an ACL is present (and no iattr fields are set), nfsd_setattr() is skipped and the POSIX ACL is never applied to the inode.
Subsequently, when the client retrieves the ACL, the server finds no POSIX ACL on the inode and returns one generated from the file's mode bits rather than returning the originally-specified ACL.
--- fs/nfsd/vfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfsd/vfs.c +1 -1
@@ -1335,7 +1335,7 @@ nfsd_create_setattr(struct svc_rqst *rqs* Callers expect new file metadata to be committed even * if the attributes have not changed. */ -if (iap->ia_valid) +if (iap->ia_valid || attrs->na_pacl || attrs->na_dpacl) status =nfsd_setattr (rqstp, resfhp, attrs,0 , (time64_t )0 );else status =nfserrno (commit_metadata (resfhp));
Re: [PATCH 5.10 393/451] NFSD: NFSv4 file creation neglects setting ACL
Quoted 24 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit
913f7cf77bf14c13cfea70e89bcb6d0b22239562]An NFSv4 client that sets an ACL with a named principal during file creation retrieves the ACL afterwards, and finds that it is only a default ACL (based on the mode bits) and not the ACL that was requested during file creation. This violates RFC 8881 section 6.4.1.3: "the ACL attribute is set as given".
The issue occurs in
nfsd_create_setattr(). On 6.1.y, the check to determine whethernfsd_setattr()should be called is simply "iap->ia_valid", which only accounts for iattr changes. When only an ACL is present (and no iattr fields are set),nfsd_setattr()is skipped and the POSIX ACL is never applied to the inode.Subsequently, when the client retrieves the ACL, the server finds no POSIX ACL on the inode and returns one generated from the file's mode bits rather than returning the originally-specified ACL.
Quoted 5 lines
Reported-by Aurelien Couderc <[email protected]>Fixes c0cbe70742f4 ("NFSD: add posix ACLs to struct nfsd_attrs")[ cel: Adjust nfsd_create_setattr() instead of nfsd_attrs_valid() ]Signed-off-by Chuck Lever <[email protected]>
Would it make sense to also backport:
commit 442d27ff09a218b61020ab56387dbc508ad6bfa6
Author: Stephen Smalley <[email protected]> Date: Fri May 3 09:09:06 2024 -0400
nfsd: set security label during create operations
? It seems like that's fixing a similar kind of bug, and would also make the upstream version of this apply cleanly.
Ben.
Quoted 18 lines
Signed-off-by Greg Kroah-Hartman <[email protected]>--- fs/nfsd/vfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)fs/nfsd/vfs.c +1
-1@@ -1335,7 +1335,7 @@ nfsd_create_setattr(struct svc_rqst *rqs* Callers expect new file metadata to be committed even * if the attributes have not changed. */ -if (iap->ia_valid) +if (iap->ia_valid || attrs->na_pacl || attrs->na_dpacl) status =nfsd_setattr (rqstp, resfhp, attrs,0 , (time64_t )0 );else status =nfserrno (commit_metadata (resfhp));
Signature · 2 lines
Ben Hutchings Larkinson's Law: All laws are basically false.
Re: [PATCH 5.10 393/451] NFSD: NFSv4 file creation neglects setting ACL
Quoted 33 lines · Ben Hutchings
Quoted 24 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit
913f7cf77bf14c13cfea70e89bcb6d0b22239562]An NFSv4 client that sets an ACL with a named principal during file creation retrieves the ACL afterwards, and finds that it is only a default ACL (based on the mode bits) and not the ACL that was requested during file creation. This violates RFC 8881 section 6.4.1.3: "the ACL attribute is set as given".
The issue occurs in
nfsd_create_setattr(). On 6.1.y, the check to determine whethernfsd_setattr()should be called is simply "iap->ia_valid", which only accounts for iattr changes. When only an ACL is present (and no iattr fields are set),nfsd_setattr()is skipped and the POSIX ACL is never applied to the inode.Subsequently, when the client retrieves the ACL, the server finds no POSIX ACL on the inode and returns one generated from the file's mode bits rather than returning the originally-specified ACL.
Quoted 5 lines
Reported-by Aurelien Couderc <[email protected]>Fixes c0cbe70742f4 ("NFSD: add posix ACLs to struct nfsd_attrs")[ cel: Adjust nfsd_create_setattr() instead of nfsd_attrs_valid() ]Signed-off-by Chuck Lever <[email protected]>Would it make sense to also backport:
Quoted 8 lines
commit
442d27ff09a218b61020ab56387dbc508ad6bfa6Author: Stephen Smalley <[email protected]> Date: Fri May 3 09:09:06 2024 -0400nfsd: set security label during create operations
? It seems like that's fixing a similar kind of bug, and would also make the upstream version of this apply cleanly.
I'll have another look. I think 442d27ff09a218b61020ab56387dbc508ad6bfa6 had some significant pre-requisites.
Quoted 19 lines
Quoted 18 lines
Signed-off-by Greg Kroah-Hartman <[email protected]>--- fs/nfsd/vfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)fs/nfsd/vfs.c +1
-1@@ -1335,7 +1335,7 @@ nfsd_create_setattr(struct svc_rqst *rqs* Callers expect new file metadata to be committed even * if the attributes have not changed. */ -if (iap->ia_valid) +if (iap->ia_valid || attrs->na_pacl || attrs->na_dpacl) status =nfsd_setattr (rqstp, resfhp, attrs,0 , (time64_t )0 );else status =nfserrno (commit_metadata (resfhp));
Signature · 1 line
Chuck Lever
Re: [PATCH 5.10 393/451] NFSD: NFSv4 file creation neglects setting ACL
In reply to Ben HutchingsQuoted 33 lines · Ben Hutchings
Quoted 24 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit
913f7cf77bf14c13cfea70e89bcb6d0b22239562]An NFSv4 client that sets an ACL with a named principal during file creation retrieves the ACL afterwards, and finds that it is only a default ACL (based on the mode bits) and not the ACL that was requested during file creation. This violates RFC 8881 section 6.4.1.3: "the ACL attribute is set as given".
The issue occurs in
nfsd_create_setattr(). On 6.1.y, the check to determine whethernfsd_setattr()should be called is simply "iap->ia_valid", which only accounts for iattr changes. When only an ACL is present (and no iattr fields are set),nfsd_setattr()is skipped and the POSIX ACL is never applied to the inode.Subsequently, when the client retrieves the ACL, the server finds no POSIX ACL on the inode and returns one generated from the file's mode bits rather than returning the originally-specified ACL.
Quoted 5 lines
Reported-by Aurelien Couderc <[email protected]>Fixes c0cbe70742f4 ("NFSD: add posix ACLs to struct nfsd_attrs")[ cel: Adjust nfsd_create_setattr() instead of nfsd_attrs_valid() ]Signed-off-by Chuck Lever <[email protected]>Would it make sense to also backport:
Quoted 8 lines
commit
442d27ff09a218b61020ab56387dbc508ad6bfa6Author: Stephen Smalley <[email protected]> Date: Fri May 3 09:09:06 2024 -0400nfsd: set security label during create operations
? It seems like that's fixing a similar kind of bug, and would also make the upstream version of this apply cleanly.
"nfsd: set security label during create operations" does not itself apply cleanly to v5.10.y, and neither do at least four of its pre- requisites. There is enough missing context and functionality that I decided it was better to simply apply "neglects setting ACL" with adjustments.
The question of whether "set security label" also needs to be applied to v5.10 seems independent to me (but is still a valid question).
Quoted 21 lines
Ben.
Quoted 18 lines
Signed-off-by Greg Kroah-Hartman <[email protected]>--- fs/nfsd/vfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)fs/nfsd/vfs.c +1
-1@@ -1335,7 +1335,7 @@ nfsd_create_setattr(struct svc_rqst *rqs* Callers expect new file metadata to be committed even * if the attributes have not changed. */ -if (iap->ia_valid) +if (iap->ia_valid || attrs->na_pacl || attrs->na_dpacl) status =nfsd_setattr (rqstp, resfhp, attrs,0 , (time64_t )0 );else status =nfserrno (commit_metadata (resfhp));
Signature · 1 line
Chuck Lever
Greg Kroah-Hartman
maintainerPATCH 394/451 mm/mprotect: use long for page accountings and retval
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Xu <[email protected]>
commit a79390f5d6a78647fd70856bd42b22d994de0ba2 upstream.
Switch to use type "long" for page accountings and retval across the whole procedure of change_protection().
The change should have shrinked the possible maximum page number to be half comparing to previous (ULONG_MAX / 2), but it shouldn't overflow on any system either because the maximum possible pages touched by change protection should be ULONG_MAX / PAGE_SIZE.
Two reasons to switch from "unsigned long" to "long":
1. It suites better on count_vm_numa_events(), whose 2nd parameter takes a long type.
2. It paves way for returning negative (error) values in the future.
Currently the only caller that consumes this retval is change_prot_numa(), where the unsigned long was converted to an int. Since at it, touching up the numa code to also take a long, so it'll avoid any possible overflow too during the int-size convertion.
--- include/linux/hugetlb.h | 4 ++-- include/linux/mm.h | 2 +- mm/hugetlb.c | 4 ++-- mm/mempolicy.c | 2 +- mm/mprotect.c | 34 +++++++++++++++++----------------- 5 files changed, 23 insertions(+), 23 deletions(-)
include/linux/hugetlb.h +2 -2
@@ -184,7 +184,7 @@ struct page *follow_huge_pgd(struct mm_sint pmd_huge (pmd_t pmd);int pud_huge (pud_t pud); -unsigned long hugetlb_change_protection (struct vm_area_struct *vma, +long hugetlb_change_protection (struct vm_area_struct *vma,unsigned long address,unsigned long end,pgprot_t newprot);bool is_hugetlb_entry_migration (pte_t pte);
@@ -342,7 +342,7 @@ static inline void move_hugetlb_state(st { } -static inline unsigned long hugetlb_change_protection ( +static inline long hugetlb_change_protection (struct vm_area_struct *vma,unsigned long address,unsigned long end,pgprot_t newprot) {
include/linux/mm.h +1 -1
@@ -1876,7 +1876,7 @@ extern unsigned long move_page_tables(st#define MM_CP_UFFD_WP_ALL (MM_CP_UFFD_WP | \ MM_CP_UFFD_WP_RESOLVE) -extern unsigned long change_protection (struct vm_area_struct *vma,unsigned long start, +extern long change_protection (struct vm_area_struct *vma,unsigned long start,unsigned long end,pgprot_t newprot,unsigned long cp_flags); extern int mprotect_fixup(struct vm_area_struct *vma,
mm/hugetlb.c +2 -2
@@ -5051,7 +5051,7 @@ same_page:#define flush_hugetlb_tlb_range (vma, addr, end) flush_tlb_range(vma, addr, end)#endif -unsigned long hugetlb_change_protection (struct vm_area_struct *vma, +long hugetlb_change_protection (struct vm_area_struct *vma,unsigned long address,unsigned long end,pgprot_t newprot) {struct mm_struct *mm = vma->vm_mm;
@@ -5059,7 +5059,7 @@ unsigned long hugetlb_change_protection(pte_t *ptep;pte_t pte;struct hstate *h =hstate_vma (vma); -unsigned long pages =0 ; +long pages =0 ;bool shared_pmd = false;struct mmu_notifier_range range;
mm/mempolicy.c +1 -1
@@ -653,7 +653,7 @@ unlock:unsigned long change_prot_numa (struct vm_area_struct *vma,unsigned long addr,unsigned long end) { -int nr_updated; +long nr_updated; nr_updated =change_protection (vma, addr, end,PAGE_NONE ,MM_CP_PROT_NUMA );if (nr_updated)
mm/mprotect.c +17 -17
@@ -35,13 +35,13 @@#include "internal.h" -static unsigned long change_pte_range (struct vm_area_struct *vma,pmd_t *pmd, +static long change_pte_range (struct vm_area_struct *vma,pmd_t *pmd,unsigned long addr,unsigned long end,pgprot_t newprot,unsigned long cp_flags) {pte_t *pte, oldpte;spinlock_t *ptl; -unsigned long pages =0 ; +long pages =0 ;int target_node =NUMA_NO_NODE ;bool dirty_accountable = cp_flags &MM_CP_DIRTY_ACCT ;bool prot_numa = cp_flags &MM_CP_PROT_NUMA ;
@@ -209,13 +209,13 @@ static inline int pmd_none_or_clear_bad_return 0 ; } -static inline unsigned long change_pmd_range (struct vm_area_struct *vma, +static inline long change_pmd_range (struct vm_area_struct *vma,pud_t *pud,unsigned long addr,unsigned long end,pgprot_t newprot,unsigned long cp_flags) {pmd_t *pmd;unsigned long next; -unsigned long pages =0 ; +long pages =0 ;unsigned long nr_huge_updates =0 ;struct mmu_notifier_range range;
@@ -223,7 +223,7 @@ static inline unsigned long change_pmd_r pmd =pmd_offset (pud, addr); do { - unsigned long this_pages; + long this_pages; next = pmd_addr_end(addr, end);
@@ -281,13 +281,13 @@ next:return pages; } -static inline unsigned long change_pud_range (struct vm_area_struct *vma, -p4d_t *p4d,unsigned long addr,unsigned long end, -pgprot_t newprot,unsigned long cp_flags) +static inline long change_pud_range (struct vm_area_struct *vma,p4d_t *p4d, +unsigned long addr,unsigned long end,pgprot_t newprot, +unsigned long cp_flags) {pud_t *pud;unsigned long next; -unsigned long pages =0 ; +long pages =0 ; pud =pud_offset (p4d, addr); do {
@@ -301,13 +301,13 @@ static inline unsigned long change_pud_rreturn pages; } -static inline unsigned long change_p4d_range (struct vm_area_struct *vma, -pgd_t *pgd,unsigned long addr,unsigned long end, -pgprot_t newprot,unsigned long cp_flags) +static inline long change_p4d_range (struct vm_area_struct *vma,pgd_t *pgd, +unsigned long addr,unsigned long end,pgprot_t newprot, +unsigned long cp_flags) {p4d_t *p4d;unsigned long next; -unsigned long pages =0 ; +long pages =0 ; p4d =p4d_offset (pgd, addr); do {
@@ -321,7 +321,7 @@ static inline unsigned long change_p4d_rreturn pages; } -static unsigned long change_protection_range (struct vm_area_struct *vma, +static long change_protection_range (struct vm_area_struct *vma,unsigned long addr,unsigned long end,pgprot_t newprot,unsigned long cp_flags) {
@@ -329,7 +329,7 @@ static unsigned long change_protection_rpgd_t *pgd;unsigned long next;unsigned long start = addr; -unsigned long pages =0 ; +long pages =0 ;BUG_ON (addr >= end); pgd =pgd_offset (mm, addr);
@@ -351,11 +351,11 @@ static unsigned long change_protection_rreturn pages; } -unsigned long change_protection (struct vm_area_struct *vma,unsigned long start, +long change_protection (struct vm_area_struct *vma,unsigned long start,unsigned long end,pgprot_t newprot,unsigned long cp_flags) { -unsigned long pages; +long pages;BUG_ON ((cp_flags &MM_CP_UFFD_WP_ALL ) ==MM_CP_UFFD_WP_ALL );
Re: [PATCH 5.10 394/451] mm/mprotect: use long for page accountings and retval
Quoted 10 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Xu <[email protected]>
commit
a79390f5d6a78647fd70856bd42b22d994de0ba2upstream.Switch to use type "long" for page accountings and retval across the whole procedure of
change_protection().
[...]
This was a dependency for a backport of commit 670ddd8cdcbd "mm/mprotect: delete pmd_none_or_clear_bad_unless_trans_huge()", but that's not in the queue. It seems pointless to apply this by itself.
Ben.
Signature · 2 lines
Ben Hutchings Larkinson's Law: All laws are basically false.
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 394/451] mm/mprotect: use long for page accountings and retval
Quoted 9 lines · Ben Hutchings
Quoted 8 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Xu <[email protected]>
commit
a79390f5d6a78647fd70856bd42b22d994de0ba2upstream.
Quoted 7 lines
Quoted 2 lines
Switch to use type "long" for page accountings and retval across the whole procedure of
change_protection().[...]
This was a dependency for a backport of commit
670ddd8cdcbd"mm/mprotect: deletepmd_none_or_clear_bad_unless_trans_huge()", but that's not in the queue. It seems pointless to apply this by itself.
Now dropped, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 395/451 scsi: iscsi: Move pool freeing
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Christie <[email protected]>
[ Upstream commit a1f3486b3b095ed2259d7a1fc021a8b6e72a5365 ]
This doesn't fix any bugs, but it makes more sense to free the pool after we have removed the session. At that time we know nothing is touching any of the session fields, because all devices have been removed and scans are stopped.
--- drivers/scsi/libiscsi.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/libiscsi.c +1 -2
@@ -2902,10 +2902,9 @@ void iscsi_session_teardown(struct iscsistruct module *owner = cls_session->transport->owner;struct Scsi_Host *shost = session->host; -iscsi_pool_free (&session->cmdpool); -iscsi_remove_session (cls_session); +iscsi_pool_free (&session->cmdpool);kfree (session->password);kfree (session->password_in);kfree (session->username);
Greg Kroah-Hartman
maintainerPATCH 396/451 scsi: iscsi_tcp: Fix UAF during logout when accessing the shost ipaddress
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Christie <[email protected]>
[ Upstream commit 6f1d64b13097e85abda0f91b5638000afc5f9a06 ]
Bug report and analysis from Ding Hui.
During iSCSI session logout, if another task accesses the shost ipaddress attr, we can get a KASAN UAF report like this:
[ 276.942144] BUG: KASAN: use-after-free in _raw_spin_lock_bh+0x78/0xe0 [ 276.942535] Write of size 4 at addr ffff8881053b45b8 by task cat/4088 [ 276.943511] CPU: 2 PID: 4088 Comm: cat Tainted: G E 6.1.0-rc8+ #3 [ 276.943997] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020 [ 276.944470] Call Trace: [ 276.944943] <TASK> [ 276.945397] dump_stack_lvl+0x34/0x48 [ 276.945887] print_address_description.constprop.0+0x86/0x1e7 [ 276.946421] print_report+0x36/0x4f [ 276.947358] kasan_report+0xad/0x130 [ 276.948234] kasan_check_range+0x35/0x1c0 [ 276.948674] _raw_spin_lock_bh+0x78/0xe0 [ 276.949989] iscsi_sw_tcp_host_get_param+0xad/0x2e0 [iscsi_tcp] [ 276.951765] show_host_param_ISCSI_HOST_PARAM_IPADDRESS+0xe9/0x130 [scsi_transport_iscsi] [ 276.952185] dev_attr_show+0x3f/0x80 [ 276.953005] sysfs_kf_seq_show+0x1fb/0x3e0 [ 276.953401] seq_read_iter+0x402/0x1020 [ 276.954260] vfs_read+0x532/0x7b0 [ 276.955113] ksys_read+0xed/0x1c0 [ 276.955952] do_syscall_64+0x38/0x90 [ 276.956347] entry_SYSCALL_64_after_hwframe+0x63/0xcd [ 276.956769] RIP: 0033:0x7f5d3a679222 [ 276.957161] Code: c0 e9 b2 fe ff ff 50 48 8d 3d 32 c0 0b 00 e8 a5 fe 01 00 0f 1f 44 00 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 0f 05 <48> 3d 00 f0 ff ff 77 56 c3 0f 1f 44 00 00 48 83 ec 28 48 89 54 24 [ 276.958009] RSP: 002b:00007ffc864d16a8 EFLAGS: 00000246 ORIG_RAX: 0000000000000000 [ 276.958431] RAX: ffffffffffffffda RBX: 0000000000020000 RCX: 00007f5d3a679222 [ 276.958857] RDX: 0000000000020000 RSI: 00007f5d3a4fe000 RDI: 0000000000000003 [ 276.959281] RBP: 00007f5d3a4fe000 R08: 00000000ffffffff R09: 0000000000000000 [ 276.959682] R10: 0000000000000022 R11: 0000000000000246 R12: 0000000000020000 [ 276.960126] R13: 0000000000000003 R14: 0000000000000000 R15: 0000557a26dada58 [ 276.960536] </TASK> [ 276.961357] Allocated by task 2209: [ 276.961756] kasan_save_stack+0x1e/0x40 [ 276.962170] kasan_set_track+0x21/0x30 [ 276.962557] __kasan_kmalloc+0x7e/0x90 [ 276.962923] __kmalloc+0x5b/0x140 [ 276.963308] iscsi_alloc_session+0x28/0x840 [scsi_transport_iscsi] [ 276.963712] iscsi_session_setup+0xda/0xba0 [libiscsi] [ 276.964078] iscsi_sw_tcp_session_create+0x1fd/0x330 [iscsi_tcp] [ 276.964431] iscsi_if_create_session.isra.0+0x50/0x260 [scsi_transport_iscsi] [ 276.964793] iscsi_if_recv_msg+0xc5a/0x2660 [scsi_transport_iscsi] [ 276.965153] iscsi_if_rx+0x198/0x4b0 [scsi_transport_iscsi] [ 276.965546] netlink_unicast+0x4d5/0x7b0 [ 276.965905] netlink_sendmsg+0x78d/0xc30 [ 276.966236] sock_sendmsg+0xe5/0x120 [ 276.966576] ____sys_sendmsg+0x5fe/0x860 [ 276.966923] ___sys_sendmsg+0xe0/0x170 [ 276.967300] __sys_sendmsg+0xc8/0x170 [ 276.967666] do_syscall_64+0x38/0x90 [ 276.968028] entry_SYSCALL_64_after_hwframe+0x63/0xcd [ 276.968773] Freed by task 2209: [ 276.969111] kasan_save_stack+0x1e/0x40 [ 276.969449] kasan_set_track+0x21/0x30 [ 276.969789] kasan_save_free_info+0x2a/0x50 [ 276.970146] __kasan_slab_free+0x106/0x190 [ 276.970470] __kmem_cache_free+0x133/0x270 [ 276.970816] device_release+0x98/0x210 [ 276.971145] kobject_cleanup+0x101/0x360 [ 276.971462] iscsi_session_teardown+0x3fb/0x530 [libiscsi] [ 276.971775] iscsi_sw_tcp_session_destroy+0xd8/0x130 [iscsi_tcp] [ 276.972143] iscsi_if_recv_msg+0x1bf1/0x2660 [scsi_transport_iscsi] [ 276.972485] iscsi_if_rx+0x198/0x4b0 [scsi_transport_iscsi] [ 276.972808] netlink_unicast+0x4d5/0x7b0 [ 276.973201] netlink_sendmsg+0x78d/0xc30 [ 276.973544] sock_sendmsg+0xe5/0x120 [ 276.973864] ____sys_sendmsg+0x5fe/0x860 [ 276.974248] ___sys_sendmsg+0xe0/0x170 [ 276.974583] __sys_sendmsg+0xc8/0x170 [ 276.974891] do_syscall_64+0x38/0x90 [ 276.975216] entry_SYSCALL_64_after_hwframe+0x63/0xcd
We can easily reproduce by two tasks:
1. while :; do iscsiadm -m node --login; iscsiadm -m node --logout; done
2. while :; do cat \/sys/devices/platform/host*/iscsi_host/host*/ipaddress; done
iscsid | cat
--------------------------------+---------------------------------------
|- iscsi_sw_tcp_session_destroy |
|- iscsi_session_teardown |
|- device_release |
|- iscsi_session_release ||- dev_attr_show
|- kfree | |- show_host_param_
| ISCSI_HOST_PARAM_IPADDRESS
| |- iscsi_sw_tcp_host_get_param
| |- r/w tcp_sw_host->session (UAF)
|- iscsi_host_remove |
|- iscsi_host_free |Fix the above bug by splitting the session removal into 2 parts:
1. removal from iSCSI class which includes sysfs and removal from host tracking.
2. freeing of session.
During iscsi_tcp host and session removal we can remove the session from sysfs then remove the host from sysfs. At this point we know userspace is not accessing the kernel via sysfs so we can free the session and host.
[Shivani: The false parameter was not passed to iscsi_host_remove() because,
in Linux 5.10.y, the default behavior of iscsi_host_remove() already assumes false.]
--- drivers/scsi/iscsi_tcp.c | 11 +++++++++-- drivers/scsi/libiscsi.c | 38 +++++++++++++++++++++++++++++++------- include/scsi/libiscsi.h | 2 ++ 3 files changed, 42 insertions(+), 9 deletions(-)
drivers/scsi/iscsi_tcp.c +9 -2
@@ -933,10 +933,17 @@ static void iscsi_sw_tcp_session_destroyif (WARN_ON_ONCE (session->leadconn))return ; +iscsi_session_remove (cls_session); +/* +* Our get_host_param needs to access the session, so remove the +* host from sysfs before freeing the session to make sure userspace +* is no longer accessing the callout. +*/ +iscsi_host_remove (shost); +iscsi_tcp_r2tpool_free (cls_session->dd_data); -iscsi_session_teardown (cls_session); -iscsi_host_remove (shost); +iscsi_session_free (cls_session);iscsi_host_free (shost); }
drivers/scsi/libiscsi.c +31 -7
@@ -2892,17 +2892,32 @@ dec_session_count: }EXPORT_SYMBOL_GPL (iscsi_session_setup); -/** -* iscsi_session_teardown - destroy session, host, and cls_session -* @cls_session: iscsi session +/* +* issi_session_remove - Remove session from iSCSI class. */ -void iscsi_session_teardown (struct iscsi_cls_session *cls_session) +void iscsi_session_remove (struct iscsi_cls_session *cls_session) {struct iscsi_session *session = cls_session->dd_data; -struct module *owner = cls_session->transport->owner;struct Scsi_Host *shost = session->host;iscsi_remove_session (cls_session); +/* +* host removal only has to wait for its children to be removed from +* sysfs, and iscsi_tcp needs to do iscsi_host_remove before freeing +* the session, so drop the session count here. +*/ +iscsi_host_dec_session_cnt (shost); +} +EXPORT_SYMBOL_GPL (iscsi_session_remove); + +/** +* iscsi_session_free - Free iscsi session and it's resources +* @cls_session: iscsi session +*/ +void iscsi_session_free (struct iscsi_cls_session *cls_session) +{ +struct iscsi_session *session = cls_session->dd_data; +struct module *owner = cls_session->transport->owner;iscsi_pool_free (&session->cmdpool);kfree (session->password);
@@ -2920,10 +2935,19 @@ void iscsi_session_teardown(struct iscsikfree (session->discovery_parent_type);iscsi_free_session (cls_session); - -iscsi_host_dec_session_cnt (shost);module_put (owner); } +EXPORT_SYMBOL_GPL (iscsi_session_free); + +/** +* iscsi_session_teardown - destroy session and cls_session +* @cls_session: iscsi session +*/ +void iscsi_session_teardown (struct iscsi_cls_session *cls_session) +{ +iscsi_session_remove (cls_session); +iscsi_session_free (cls_session); +}EXPORT_SYMBOL_GPL (iscsi_session_teardown);/**
include/scsi/libiscsi.h +2 -0
@@ -401,6 +401,8 @@ extern int iscsi_target_alloc(struct scsextern struct iscsi_cls_session *iscsi_session_setup (struct iscsi_transport *,struct Scsi_Host *shost,uint16_t ,int ,int ,uint32_t ,unsigned int ); +void iscsi_session_remove (struct iscsi_cls_session *cls_session); +void iscsi_session_free (struct iscsi_cls_session *cls_session);extern void iscsi_session_teardown (struct iscsi_cls_session *);extern void iscsi_session_recovery_timedout (struct iscsi_cls_session *); extern int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
Greg Kroah-Hartman
maintainerPATCH 397/451 cpufreq: scmi: Fix null-ptr-deref in scmi_cpufreq_get_rate()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Henry Martin <[email protected]>
[ Upstream commit 484d3f15cc6cbaa52541d6259778e715b2c83c54 ]
cpufreq_cpu_get_raw() can return NULL when the target CPU is not present in the policy->cpus mask. scmi_cpufreq_get_rate() does not check for this case, which results in a NULL pointer dereference.
Add NULL check after cpufreq_cpu_get_raw() to prevent this issue.
--- drivers/cpufreq/scmi-cpufreq.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/cpufreq/scmi-cpufreq.c +8 -2
@@ -29,12 +29,18 @@ static const struct scmi_handle *handle;static unsigned int scmi_cpufreq_get_rate (unsigned int cpu) { -struct cpufreq_policy *policy =cpufreq_cpu_get_raw (cpu); +struct cpufreq_policy *policy; +struct scmi_data *priv;const struct scmi_perf_ops *perf_ops = handle->perf_ops; -struct scmi_data *priv = policy->driver_data;unsigned long rate;int ret; + policy =cpufreq_cpu_get_raw (cpu); +if (unlikely (!policy)) +return 0 ; + + priv = policy->driver_data; + ret = perf_ops->freq_get (handle, priv->domain_id, &rate, false);if (ret)return 0 ;
Greg Kroah-Hartman
maintainerPATCH 398/451 ovl: Use "buf" flexible array for memcpy() destination
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
commit cf8aa9bf97cadf85745506c6a3e244b22c268d63 upstream.
The "buf" flexible array needs to be the memcpy() destination to avoid false positive run-time warning from the recent FORTIFY_SOURCE hardening:
memcpy: detected field-spanning write (size 93) of single field "&fh->fb" at fs/overlayfs/export.c:799 (size 21)
--- fs/overlayfs/export.c | 2 +- fs/overlayfs/overlayfs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
fs/overlayfs/export.c +1 -1
@@ -788,7 +788,7 @@ static struct ovl_fh *ovl_fid_to_fh(strureturn ERR_PTR (-ENOMEM );/* Copy unaligned inner fh into aligned buffer */ -memcpy (&fh->fb, fid, buflen -OVL_FH_WIRE_OFFSET ); +memcpy (fh->buf, fid, buflen -OVL_FH_WIRE_OFFSET );return fh; }
fs/overlayfs/overlayfs.h +1 -1
@@ -104,7 +104,7 @@ struct ovl_fh {u8 padding[3 ];/* make sure fb.fid is 32bit aligned */ union {struct ovl_fb fb; -u8 buf[0 ]; + DECLARE_FLEX_ARRAY(u8, buf); }; } __packed;
Greg Kroah-Hartman
maintainerPATCH 399/451 btrfs: do not clean up repair bio if submit fails
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josef Bacik <[email protected]>
[ Upstream commit 8cbc3001a3264d998d6b6db3e23f935c158abd4d ]
The submit helper will always run bio_endio() on the bio if it fails to submit, so cleaning up the bio just leads to a variety of use-after-free and NULL pointer dereference bugs because we race with the endio function that is cleaning up the bio. Instead just return BLK_STS_OK as the repair function has to continue to process the rest of the pages, and the endio for the repair bio will do the appropriate cleanup for the page that it was given.
--- fs/btrfs/extent_io.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
fs/btrfs/extent_io.c +7 -8
@@ -2655,7 +2655,6 @@ blk_status_t btrfs_submit_read_repair(stbool need_validation;struct bio *repair_bio;struct btrfs_io_bio *repair_io_bio; -blk_status_t status;btrfs_debug (fs_info,"repair read error: read error at %llu" , start);
@@ -2699,13 +2698,13 @@ blk_status_t btrfs_submit_read_repair(st"repair read error: submitting new read to mirror %d, in_validation=%d" , failrec->this_mirror, failrec->in_validation); - status =submit_bio_hook (inode, repair_bio, failrec->this_mirror, - failrec->bio_flags); -if (status) { -free_io_failure (failure_tree, tree, failrec); -bio_put (repair_bio); - } -return status; +/* +* At this point we have a bio, so any errors from submit_bio_hook() +* will be handled by the endio on the repair_bio, so we can't return an +* error here. +*/ +submit_bio_hook (inode, repair_bio, failrec->this_mirror, failrec->bio_flags); +return BLK_STS_OK ; }/* lots and lots of room for performance fixes in the end_bio funcs */
Greg Kroah-Hartman
maintainerPATCH 400/451 bus: fsl-mc-bus: fix KASAN use-after-free in fsl_mc_bus_remove()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shin'ichiro Kawasaki <[email protected]>
commit 928ea98252ad75118950941683893cf904541da9 upstream.
In fsl_mc_bus_remove(), mc->root_mc_bus_dev->mc_io is passed to fsl_destroy_mc_io(). However, mc->root_mc_bus_dev is already freed in fsl_mc_device_remove(). Then reference to mc->root_mc_bus_dev->mc_io triggers KASAN use-after-free. To avoid the use-after-free, keep the reference to mc->root_mc_bus_dev->mc_io in a local variable and pass to fsl_destroy_mc_io().
This patch needs rework to apply to kernels older than v5.15.
--- drivers/bus/fsl-mc/fsl-mc-bus.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/bus/fsl-mc/fsl-mc-bus.c +3 -3
@@ -1085,14 +1085,14 @@ error_cleanup_mc_io:static int fsl_mc_bus_remove (struct platform_device *pdev) {struct fsl_mc *mc =platform_get_drvdata (pdev); +struct fsl_mc_io *mc_io;if (!fsl_mc_is_root_dprc (&mc->root_mc_bus_dev->dev))return -EINVAL ; + mc_io = mc->root_mc_bus_dev->mc_io;fsl_mc_device_remove (mc->root_mc_bus_dev); - -fsl_destroy_mc_io (mc->root_mc_bus_dev->mc_io); - mc->root_mc_bus_dev->mc_io =NULL ; +fsl_destroy_mc_io (mc_io);return 0 ; }