5.10.173-rc1 review
Subsystems (7)
Greg Kroah-Hartman
maintainerPATCH 442/529 ubifs: Rectify space budget for ubifs_symlink() if symlink is encrypted
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit c2c36cc6ca23e614f9e4238d0ecf48549ee9002a ]
Fix bad space budget when symlink file is encrypted. Bad space budget may let make_reservation() return with -ENOSPC, which could turn ubifs to read-only mode in do_writepage() process.
Fetch a reproducer in [Link].
--- fs/ubifs/dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ubifs/dir.c +1 -1
@@ -1117,7 +1117,6 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry,int err, sz_change, len =strlen (symname);struct fscrypt_str disk_link;struct ubifs_budget_req req = { .new_ino =1 , .new_dent =1 , - .new_ino_d =ALIGN (len,8 ), .dirtied_ino =1 };struct fscrypt_name nm;
@@ -1133,6 +1132,7 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry,* Budget request settings: new inode, new direntry and changing parent * directory inode. */ + req.new_ino_d =ALIGN (disk_link.len -1 ,8 ); err =ubifs_budget_space (c, &req);if (err)return err;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 443/529 ubifs: Rectify space budget for ubifs_xrename()
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit 1b2ba09060e41adb356b9ae58ef94a7390928004 ]
There is no space budget for ubifs_xrename(). It may let make_reservation() return with -ENOSPC, which could turn ubifs to read-only mode in do_writepage() process. Fix it by adding space budget for ubifs_xrename().
Fetch a reproducer in [Link].
--- fs/ubifs/dir.c | 5 +++++ 1 file changed, 5 insertions(+)
fs/ubifs/dir.c +5 -0
@@ -1530,6 +1530,10 @@ static int ubifs_xrename(struct inode *old_dir, struct dentry *old_dentry,return err; } + err =ubifs_budget_space (c, &req); +if (err) + goto out; +lock_4_inodes (old_dir, new_dir,NULL ,NULL ); time =current_time (old_dir);
@@ -1555,6 +1559,7 @@ static int ubifs_xrename(struct inode *old_dir, struct dentry *old_dentry,unlock_4_inodes (old_dir, new_dir,NULL ,NULL );ubifs_release_budget (c, &req); +out:fscrypt_free_filename (&fst_nm);fscrypt_free_filename (&snd_nm);return err;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 444/529 ubifs: Fix wrong dirty space budget for dirty inode
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit b248eaf049d9cdc5eb76b59399e4d3de233f02ac ]
Each dirty inode should reserve 'c->bi.inode_budget' bytes in space budget calculation. Currently, space budget for dirty inode reports more space than what UBIFS actually needs to write.
--- fs/ubifs/budget.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ubifs/budget.c +1 -1
@@ -403,7 +403,7 @@ static int calc_dd_growth(const struct ubifs_info *c, dd_growth = req->dirtied_page ? c->bi.page_budget :0 ;if (req->dirtied_ino) - dd_growth += c->bi.inode_budget << (req->dirtied_ino -1 ); + dd_growth += c->bi.inode_budget * req->dirtied_ino;if (req->mod_dent) dd_growth += c->bi.dent_budget; dd_growth += req->dirtied_ino_d;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 445/529 ubifs: do_rename: Fix wrong space budget when target inodes nlink > 1
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit 25fce616a61fc2f1821e4a9ce212d0e064707093 ]
If target inode is a special file (eg. block/char device) with nlink count greater than 1, the inode with ui->data will be re-written on disk. However, UBIFS losts target inode's data_len while doing space budget. Bad space budget may let make_reservation() return with -ENOSPC, which could turn ubifs to read-only mode in do_writepage() process.
Fetch a reproducer in [Link].
--- fs/ubifs/dir.c | 2 ++ 1 file changed, 2 insertions(+)
fs/ubifs/dir.c +2 -0
@@ -1288,6 +1288,8 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry,if (unlink) {ubifs_assert (c,inode_is_locked (new_inode)); +/* Budget for old inode's data when its nlink > 1. */ + req.dirtied_ino_d =ALIGN (ubifs_inode (new_inode)->data_len,8 ); err =ubifs_purge_xattrs (new_inode);if (err)return err;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 446/529 ubifs: Reserve one leb for each journal head while doing budget
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit e874dcde1cbf82c786c0e7f2899811c02630cc52 ]
UBIFS calculates available space by c->main_bytes - c->lst.total_used (which means non-index lebs' free and dirty space is accounted into total available), then index lebs and four lebs (one for gc_lnum, one for deletions, two for journal heads) are deducted.
In following situation, ubifs may get -ENOSPC from make_reservation():
LEB 84: DATAHD free 122880 used 1920 dirty 2176 dark 6144 LEB 110:DELETION free 126976 used 0 dirty 0 dark 6144 (empty) LEB 201:gc_lnum free 126976 used 0 dirty 0 dark 6144 LEB 272:GCHD free 77824 used 47672 dirty 1480 dark 6144
LEB 356:BASEHD free 0 used 39776 dirty 87200 dark 6144
OTHERS: index lebs, zero-available non-index lebs
UBIFS calculates the available bytes is 6888 (How to calculate it:
126976 * 5[remain main bytes] - 1920[used] - 47672[used] - 39776[used] - 126976 * 1[deletions] - 126976 * 1[gc_lnum] - 126976 * 2[journal heads]
- 6144 * 5[dark] = 6888) after doing budget, however UBIFS cannot use BASEHD's dirty space(87200), because UBIFS cannot find next BASEHD to reclaim current BASEHD. (c->bi.min_idx_lebs equals to c->lst.idx_lebs, the empty leb won't be found by ubifs_find_free_space(), and dirty index lebs won't be picked as gced lebs. All non-index lebs has dirty space less then c->dead_wm, non-index lebs won't be picked as gced lebs either. So new free lebs won't be produced.). See more details in Link.
To fix it, reserve one leb for each journal head while doing budget.
--- fs/ubifs/budget.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
fs/ubifs/budget.c +3 -4
@@ -212,11 +212,10 @@ long long ubifs_calc_available(const struct ubifs_info *c, int min_idx_lebs) subtract_lebs +=1 ;/* -* The GC journal head LEB is not really accessible. And since -* different write types go to different heads, we may count only on -* one head's space. +* Since different write types go to different heads, we should +* reserve one leb for each head. */ - subtract_lebs += c->jhead_cnt -1 ; + subtract_lebs += c->jhead_cnt;/* We also reserve one LEB for deletions, which bypass budgeting */ subtract_lebs +=1 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 447/529 ubi: Fix use-after-free when volume resizing failed
In reply to Greg Kroah-HartmanFrom: Li Zetao <[email protected]>
[ Upstream commit 9af31d6ec1a4be4caab2550096c6bd2ba8fba472 ]
There is an use-after-free problem reported by KASAN:
==================================================================
BUG: KASAN: use-after-free in ubi_eba_copy_table+0x11f/0x1c0 [ubi] Read of size 8 at addr ffff888101eec008 by task ubirsvol/4735 CPU: 2 PID: 4735 Comm: ubirsvol Not tainted 6.1.0-rc1-00003-g84fa3304a7fc-dirty #14 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-1.fc33 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0x34/0x44 print_report+0x171/0x472 kasan_report+0xad/0x130 ubi_eba_copy_table+0x11f/0x1c0 [ubi] ubi_resize_volume+0x4f9/0xbc0 [ubi] ubi_cdev_ioctl+0x701/0x1850 [ubi] __x64_sys_ioctl+0x11d/0x170 do_syscall_64+0x35/0x80 entry_SYSCALL_64_after_hwframe+0x46/0xb0 </TASK>
When ubi_change_vtbl_record() returns an error in ubi_resize_volume(), "new_eba_tbl" will be freed on error handing path, but it is holded by "vol->eba_tbl" in ubi_eba_replace_table(). It means that the liftcycle of "vol->eba_tbl" and "vol" are different, so when resizing volume in next time, it causing an use-after-free fault.
Fix it by not freeing "new_eba_tbl" after it replaced in ubi_eba_replace_table(), while will be freed in next volume resizing.
--- drivers/mtd/ubi/vmt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/mtd/ubi/vmt.c +3 -1
@@ -464,7 +464,7 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs)for (i =0 ; i < -pebs; i++) { err =ubi_eba_unmap_leb (ubi, vol, reserved_pebs + i);if (err) - goto out_acc; + goto out_free; }spin_lock (&ubi->volumes_lock); ubi->rsvd_pebs += pebs;
@@ -512,6 +512,8 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs) ubi->avail_pebs += pebs;spin_unlock (&ubi->volumes_lock); } +return err; + out_free:kfree (new_eba_tbl);return err;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 448/529 ubi: Fix unreferenced object reported by kmemleak in ubi_resize_volume()
In reply to Greg Kroah-HartmanFrom: Li Zetao <[email protected]>
[ Upstream commit 1e591ea072df7211f64542a09482b5f81cb3ad27 ]
There is a memory leaks problem reported by kmemleak:
unreferenced object 0xffff888102007a00 (size 128):
comm "ubirsvol", pid 32090, jiffies 4298464136 (age 2361.231s) hex dump (first 32 bytes):
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
backtrace:
[<ffffffff8176cecd>] __kmalloc+0x4d/0x150 [<ffffffffa02a9a36>] ubi_eba_create_table+0x76/0x170 [ubi] [<ffffffffa029764e>] ubi_resize_volume+0x1be/0xbc0 [ubi] [<ffffffffa02a3321>] ubi_cdev_ioctl+0x701/0x1850 [ubi] [<ffffffff81975d2d>] __x64_sys_ioctl+0x11d/0x170 [<ffffffff83c142a5>] do_syscall_64+0x35/0x80 [<ffffffff83e0006a>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
This is due to a mismatch between create and destroy interfaces, and in detail that "new_eba_tbl" created by ubi_eba_create_table() but destroyed by kfree(), while will causing "new_eba_tbl->entries" not freed.
Fix it by replacing kfree(new_eba_tbl) withubi_eba_destroy_table(new_eba_tbl)
--- drivers/mtd/ubi/vmt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/vmt.c +1 -1
@@ -515,7 +515,7 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs)return err; out_free: -kfree (new_eba_tbl); +ubi_eba_destroy_table (new_eba_tbl);return err; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 449/529 ubifs: Fix memory leak in alloc_wbufs()
In reply to Greg Kroah-HartmanFrom: Li Zetao <[email protected]>
[ Upstream commit 4a1ff3c5d04b9079b4f768d9a71b51c4af578dd2 ]
kmemleak reported a sequence of memory leaks, and show them as following:
unreferenced object 0xffff8881575f8400 (size 1024):
comm "mount", pid 19625, jiffies 4297119604 (age 20.383s)
hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<ffffffff8176cecd>] __kmalloc+0x4d/0x150
[<ffffffffa0406b2b>] ubifs_mount+0x307b/0x7170 [ubifs]
[<ffffffff819fa8fd>] legacy_get_tree+0xed/0x1d0
[<ffffffff81936f2d>] vfs_get_tree+0x7d/0x230
[<ffffffff819b2bd4>] path_mount+0xdd4/0x17b0
[<ffffffff819b37aa>] __x64_sys_mount+0x1fa/0x270
[<ffffffff83c14295>] do_syscall_64+0x35/0x80
[<ffffffff83e0006a>] entry_SYSCALL_64_after_hwframe+0x46/0xb0 unreferenced object 0xffff8881798a6e00 (size 512):
comm "mount", pid 19677, jiffies 4297121912 (age 37.816s)
hex dump (first 32 bytes):
6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
backtrace:
[<ffffffff8176cecd>] __kmalloc+0x4d/0x150
[<ffffffffa0418342>] ubifs_wbuf_init+0x52/0x480 [ubifs]
[<ffffffffa0406ca5>] ubifs_mount+0x31f5/0x7170 [ubifs]
[<ffffffff819fa8fd>] legacy_get_tree+0xed/0x1d0
[<ffffffff81936f2d>] vfs_get_tree+0x7d/0x230
[<ffffffff819b2bd4>] path_mount+0xdd4/0x17b0
[<ffffffff819b37aa>] __x64_sys_mount+0x1fa/0x270
[<ffffffff83c14295>] do_syscall_64+0x35/0x80
[<ffffffff83e0006a>] entry_SYSCALL_64_after_hwframe+0x46/0xb0The problem is that the ubifs_wbuf_init() returns an error in the loop which in the alloc_wbufs(), then the wbuf->buf and wbuf->inodes that were successfully alloced before are not freed.
Fix it by adding error hanging path in alloc_wbufs() which frees the memory alloced before when ubifs_wbuf_init() returns an error.
--- fs/ubifs/super.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
fs/ubifs/super.c +13 -4
@@ -833,7 +833,7 @@ static int alloc_wbufs(struct ubifs_info *c)INIT_LIST_HEAD (&c->jheads[i].buds_list); err =ubifs_wbuf_init (c, &c->jheads[i].wbuf);if (err) -return err; + goto out_wbuf; c->jheads[i].wbuf.sync_callback = &bud_wbuf_callback; c->jheads[i].wbuf.jhead = i;
@@ -841,7 +841,7 @@ static int alloc_wbufs(struct ubifs_info *c) c->jheads[i].log_hash =ubifs_hash_get_desc (c);if (IS_ERR (c->jheads[i].log_hash)) { err =PTR_ERR (c->jheads[i].log_hash); - goto out; + goto out_log_hash; } }
@@ -854,9 +854,18 @@ static int alloc_wbufs(struct ubifs_info *c)return 0 ; -out: -while (i--) +out_log_hash: +kfree (c->jheads[i].wbuf.buf); +kfree (c->jheads[i].wbuf.inodes); + +out_wbuf: +while (i--) { +kfree (c->jheads[i].wbuf.buf); +kfree (c->jheads[i].wbuf.inodes);kfree (c->jheads[i].log_hash); + } +kfree (c->jheads); + c->jheads =NULL ;return err; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 450/529 ubi: Fix possible null-ptr-deref in ubi_free_volume()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit c15859bfd326c10230f09cb48a17f8a35f190342 ]
It willl cause null-ptr-deref in the following case:
uif_init()
ubi_add_volume()
cdev_add() -> if it fails, call kill_volumes()
device_register()kill_volumes() -> if ubi_add_volume() fails call this function
ubi_free_volume()
cdev_del()
device_unregister() -> trying to delete a not added device,
it causes null-ptr-derefSo in ubi_free_volume(), it delete devices whether they are added or not, it will causes null-ptr-deref.
Handle the error case whlie calling ubi_add_volume() to fix this problem. If add volume fails, set the corresponding vol to null, so it can not be accessed in kill_volumes() and release the resource in ubi_add_volume() error path.
--- drivers/mtd/ubi/build.c | 1 + drivers/mtd/ubi/vmt.c | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-)
drivers/mtd/ubi/build.c +1 -0
@@ -467,6 +467,7 @@ static int uif_init(struct ubi_device *ubi) err =ubi_add_volume (ubi, ubi->volumes[i]);if (err) {ubi_err (ubi,"cannot add volume %d" , i); + ubi->volumes[i] =NULL ; goto out_volumes; } }
drivers/mtd/ubi/vmt.c +6 -6
@@ -582,6 +582,7 @@ int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol)if (err) {ubi_err (ubi,"cannot add character device for volume %d, error %d" , vol_id, err); +vol_release (&vol->dev);return err; }
@@ -592,15 +593,14 @@ int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol) vol->dev.groups = volume_dev_groups;dev_set_name (&vol->dev,"%s_%d" , ubi->ubi_name, vol->vol_id); err =device_register (&vol->dev); -if (err) - goto out_cdev; +if (err) { +cdev_del (&vol->cdev); +put_device (&vol->dev); +return err; + }self_check_volumes (ubi);return err; - -out_cdev: -cdev_del (&vol->cdev); -return err; }/**
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 451/529 ubifs: Re-statistic cleaned znode count if commit failed
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit 944e096aa24071d3fe22822f6249d3ae309e39ea ]
Dirty znodes will be written on flash in committing process with following states:
process A | znode state
------------------------------------------------------do_commit | DIRTY_ZNODE
ubifs_tnc_start_commit | DIRTY_ZNODE
get_znodes_to_commit | DIRTY_ZNODE | COW_ZNODE
layout_commit | DIRTY_ZNODE | COW_ZNODE
fill_gap | 0
write master | 0 or OBSOLETE_ZNODE
process B | znode state
------------------------------------------------------do_commit | DIRTY_ZNODE[1]
ubifs_tnc_start_commit | DIRTY_ZNODE
get_znodes_to_commit | DIRTY_ZNODE | COW_ZNODE
ubifs_tnc_end_commit | DIRTY_ZNODE | COW_ZNODE
write_index | 0 write master | 0 or OBSOLETE_ZNODE[2] or | DIRTY_ZNODE[3]
[1] znode is dirtied without concurrent committing process
[2] znode is copied up (re-dirtied by other process) before cleaned up in committing process
[3] znode is re-dirtied after cleaned up in committing process
Currently, the clean znode count is updated in free_obsolete_znodes(), which is called only in normal path. If do_commit failed, clean znode count won't be updated, which triggers a failure ubifs assertion[4] in ubifs_tnc_close():
ubifs_assert_failed [ubifs]: UBIFS assert failed: freed == n
[4] Commit 380347e9ca7682 ("UBIFS: Add an assertion for clean_zn_cnt").
Fix it by re-statisticing cleaned znode count in tnc_destroy_cnext().
Fetch a reproducer in [Link].
--- fs/ubifs/tnc.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
fs/ubifs/tnc.c +15 -0
@@ -3053,6 +3053,21 @@ static void tnc_destroy_cnext(struct ubifs_info *c) cnext = cnext->cnext;if (ubifs_zn_obsolete (znode))kfree (znode); +else if (!ubifs_zn_cow (znode)) { +/* +* Don't forget to update clean znode count after +* committing failed, because ubifs will check this +* count while closing tnc. Non-obsolete znode could +* be re-dirtied during committing process, so dirty +* flag is untrustable. The flag 'COW_ZNODE' is set +* for each dirty znode before committing, and it is +* cleared as long as the znode become clean, so we +* can statistic clean znode count according to this +* flag. +*/ +atomic_long_inc (&c->clean_zn_cnt); +atomic_long_inc (&ubifs_clean_zn_cnt); + } }while (cnext && cnext != c->cnext); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 452/529 ubifs: dirty_cow_znode: Fix memleak in error handling path
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit 122deabfe1428bffe95e2bf364ff8a5059bdf089 ]
Following process will cause a memleak for copied up znode:
dirty_cow_znode
zn = copy_znode(c, znode);
err = insert_old_idx(c, zbr->lnum, zbr->offs);
if (unlikely(err))
return ERR_PTR(err); // No one refers to zn.
Fix it by adding copied znode back to tnc, then it will be freed by ubifs_destroy_tnc_subtree() while closing tnc.
Fetch a reproducer in [Link].
--- fs/ubifs/tnc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
fs/ubifs/tnc.c +8 -1
@@ -267,11 +267,18 @@ static struct ubifs_znode *dirty_cow_znode(struct ubifs_info *c,if (zbr->len) { err =insert_old_idx (c, zbr->lnum, zbr->offs);if (unlikely (err)) -return ERR_PTR (err); +/* +* Obsolete znodes will be freed by tnc_destroy_cnext() +* or free_obsolete_znodes(), copied up znodes should +* be added back to tnc and freed by +* ubifs_destroy_tnc_subtree(). +*/ + goto out; err =add_idx_dirt (c, zbr->lnum, zbr->len); }else err =0 ; +out: zbr->znode = zn; zbr->lnum =0 ; zbr->offs =0 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 453/529 ubifs: ubifs_writepage: Mark page dirty after writing inode failed
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit fb8bc4c74ae4526d9489362ab2793a936d072b84 ]
There are two states for ubifs writing pages:
1. Dirty, Private
2. Not Dirty, Not Private
There is a third possibility which maybe related to [1] that page is private but not dirty caused by following process:
PA
lock(page)ubifs_write_end
attach_page_private // set Private
__set_page_dirty_nobuffers // set Dirty
unlock(page)
write_cache_pages
lock(page)
clear_page_dirty_for_io(page) // clear Dirty
ubifs_writepage
write_inode
// fail, goto out, following codes are not executed
// do_writepage
// set_page_writeback // set Writeback
// detach_page_private // clear Private
// end_page_writeback // clear Writeback
out:
unlock(page) // Private, Not Dirty
PB
ksys_fadvise64_64
generic_fadvise
invalidate_inode_page
// page is neither Dirty nor Writeback
invalidate_complete_page
// page_has_private is true
try_to_release_page
ubifs_releasepage
ubifs_assert(c, 0) !!!Then we may get following assertion failed:
UBIFS error (ubi0:0 pid 1492): ubifs_assert_failed [ubifs]:
UBIFS assert failed: 0, in fs/ubifs/file.c:1499 UBIFS warning (ubi0:0 pid 1492): ubifs_ro_mode [ubifs]:
switched to read-only mode, error -22
CPU: 2 PID: 1492 Comm: aa Not tainted 5.16.0-rc2-00012-g7bb767dee0ba-dirty
Call Trace:
dump_stack+0x13/0x1b
ubifs_ro_mode+0x54/0x60 [ubifs]
ubifs_assert_failed+0x4b/0x80 [ubifs]
ubifs_releasepage+0x7e/0x1e0 [ubifs]
try_to_release_page+0x57/0xe0
invalidate_inode_page+0xfb/0x130
invalidate_mapping_pagevec+0x12/0x20
generic_fadvise+0x303/0x3c0
vfs_fadvise+0x35/0x40
ksys_fadvise64_64+0x4c/0xb0Jump [2] to find a reproducer.
[1] https://linux-mtd.infradead.narkive.com/NQoBeT1u/patch-rfc-ubifs-fix-assert-failed-in-ubifs-set-page-dirty
[2] https://bugzilla.kernel.org/show_bug.cgi?id=215357
--- fs/ubifs/file.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
fs/ubifs/file.c +9 -3
@@ -1031,7 +1031,7 @@ static int ubifs_writepage(struct page *page, struct writeback_control *wbc)if (page->index >= synced_i_size >>PAGE_SHIFT ) { err = inode->i_sb->s_op->write_inode (inode,NULL );if (err) - goto out_unlock; + goto out_redirty;/* * The inode has been written, but the write-buffer has * not been synchronized, so in case of an unclean
@@ -1059,11 +1059,17 @@ static int ubifs_writepage(struct page *page, struct writeback_control *wbc)if (i_size > synced_i_size) { err = inode->i_sb->s_op->write_inode (inode,NULL );if (err) - goto out_unlock; + goto out_redirty; }return do_writepage (page, len); - +out_redirty: +/* +* redirty_page_for_writepage() won't call ubifs_dirty_inode() because +* it passes I_DIRTY_PAGES flag while calling __mark_inode_dirty(), so +* there is no need to do space budget for dirty inode. +*/ +redirty_page_for_writepage (wbc, page); out_unlock:unlock_page (page);return err;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 454/529 ubi: fastmap: Fix missed fm_anchor PEB in wear-leveling after disabling fastmap
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit 76f9476ece445a07aeb72df9d896cd563fb5b50f ]
After disabling fastmap(ubi->fm_disabled = 1), fastmap won't be updated, fm_anchor PEB is missed being scheduled for erasing. Besides, fm_anchor PEB may have smallest erase count, it doesn't participate wear-leveling. The difference of erase count between fm_anchor PEB and other PEBs will be larger and larger later on.
In which situation fastmap can be disabled? Initially, we have an UBI image with fastmap. Then the image will be atttached without module parameter 'fm_autoconvert', ubi turns to full scanning mode in one random attaching process(eg. bad fastmap caused by powercut), ubi fastmap is disabled since then.
Fix it by not getting fm_anchor if fastmap is disabled in ubi_refill_pools().
Fetch a reproducer in [Link].
--- drivers/mtd/ubi/fastmap-wl.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/mtd/ubi/fastmap-wl.c +7 -5
@@ -146,13 +146,15 @@ void ubi_refill_pools(struct ubi_device *ubi)if (ubi->fm_anchor) {wl_tree_add (ubi->fm_anchor, &ubi->free); ubi->free_count++; + ubi->fm_anchor =NULL ; } -/* -* All available PEBs are in ubi->free, now is the time to get -* the best anchor PEBs. -*/ - ubi->fm_anchor =ubi_wl_get_fm_peb (ubi,1 ); +if (!ubi->fm_disabled) +/* +* All available PEBs are in ubi->free, now is the time to get +* the best anchor PEBs. +*/ + ubi->fm_anchor =ubi_wl_get_fm_peb (ubi,1 );for (;;) { enough =0 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 455/529 ubi: Fix UAF wear-leveling entry in eraseblk_count_seq_show()
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit a240bc5c43130c6aa50831d7caaa02a1d84e1bce ]
Wear-leveling entry could be freed in error path, which may be accessed again in eraseblk_count_seq_show(), for example:
__erase_worker eraseblk_count_seq_show
wl = ubi->lookuptbl[*block_number]
if (wl)
wl_entry_destroy
ubi->lookuptbl[e->pnum] = NULL
kmem_cache_free(ubi_wl_entry_slab, e)
erase_count = wl->ec // UAF!Wear-leveling entry updating/accessing in ubi->lookuptbl should be protected by ubi->wl_lock, fix it by adding ubi->wl_lock to serialize wl entry accessing between wl_entry_destroy() and eraseblk_count_seq_show().
Fetch a reproducer in [Link].
--- drivers/mtd/ubi/wl.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/mtd/ubi/wl.c +8 -1
@@ -885,8 +885,11 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk, err =do_sync_erase (ubi, e1, vol_id, lnum,0 );if (err) { -if (e2) +if (e2) { +spin_lock (&ubi->wl_lock);wl_entry_destroy (ubi, e2); +spin_unlock (&ubi->wl_lock); + } goto out_ro; }
@@ -1121,14 +1124,18 @@ static int __erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk)/* Re-schedule the LEB for erasure */ err1 =schedule_erase (ubi, e, vol_id, lnum,0 , false);if (err1) { +spin_lock (&ubi->wl_lock);wl_entry_destroy (ubi, e); +spin_unlock (&ubi->wl_lock); err = err1; goto out_ro; }return err; } +spin_lock (&ubi->wl_lock);wl_entry_destroy (ubi, e); +spin_unlock (&ubi->wl_lock);if (err != -EIO )/* * If this is not %-EIO, we have no idea what to do. Scheduling
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 456/529 ubi: ubi_wl_put_peb: Fix infinite loop when wear-leveling work failed
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit 4d57a7333e26040f2b583983e1970d9d460e56b0 ]
Following process will trigger an infinite loop in ubi_wl_put_peb():
ubifs_bgt ubi_bgtubifs_leb_unmap
ubi_leb_unmap
ubi_eba_unmap_leb
ubi_wl_put_peb wear_leveling_worker
e1 = rb_entry(rb_first(&ubi->used)
e2 = get_peb_for_wl(ubi)
ubi_io_read_vid_hdr // return err (flash fault)
out_error:
ubi->move_from = ubi->move_to = NULL
wl_entry_destroy(ubi, e1)
ubi->lookuptbl[e->pnum] = NULL
retry:
e = ubi->lookuptbl[pnum]; // return NULL
if (e == ubi->move_from) { // NULL == NULL gets true
goto retry; // infinite loop !!!$ top PID USER PR NI VIRT RES SHR S %CPU %MEM COMMAND 7676 root 20 0 0 0 0 R 100.0 0.0 ubifs_bgt0_0
Fix it by:
1) Letting ubi_wl_put_peb() returns directly if wearl leveling entry has
been removed from 'ubi->lookuptbl'.
2) Using 'ubi->wl_lock' protecting wl entry deletion to preventing an use-after-free problem for wl entry in ubi_wl_put_peb().
Fetch a reproducer in [Link].
--- drivers/mtd/ubi/wl.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/mtd/ubi/wl.c +14 -2
@@ -971,11 +971,11 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk,spin_lock (&ubi->wl_lock); ubi->move_from = ubi->move_to =NULL ; ubi->move_to_put = ubi->wl_scheduled =0 ; +wl_entry_destroy (ubi, e1); +wl_entry_destroy (ubi, e2);spin_unlock (&ubi->wl_lock);ubi_free_vid_buf (vidb); -wl_entry_destroy (ubi, e1); -wl_entry_destroy (ubi, e2); out_ro:ubi_ro_mode (ubi);
@@ -1251,6 +1251,18 @@ int ubi_wl_put_peb(struct ubi_device *ubi, int vol_id, int lnum, retry:spin_lock (&ubi->wl_lock); e = ubi->lookuptbl[pnum]; +if (!e) { +/* +* This wl entry has been removed for some errors by other +* process (eg. wear leveling worker), corresponding process +* (except __erase_worker, which cannot concurrent with +* ubi_wl_put_peb) will set ubi ro_mode at the same time, +* just ignore this wl entry. +*/ +spin_unlock (&ubi->wl_lock); +up_read (&ubi->fm_protect); +return 0 ; + }if (e == ubi->move_from) {/* * User is putting the physical eraseblock which was selected to
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 457/529 x86: um: vdso: Add %rcx and %r11 to the syscall clobber list
In reply to Greg Kroah-HartmanFrom: Ammar Faizi <[email protected]>
[ Upstream commit 5541992e512de8c9133110809f767bd1b54ee10d ]
The 'syscall' instruction clobbers '%rcx' and '%r11', but they are not listed in the inline Assembly that performs the syscall instruction.
No real bug is found. It wasn't buggy by luck because '%rcx' and '%r11' are caller-saved registers, and not used in the functions, and the functions are never inlined.
Add them to the clobber list for code correctness.
--- arch/x86/um/vdso/um_vdso.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
arch/x86/um/vdso/um_vdso.c +8 -4
@@ -17,8 +17,10 @@ int __vdso_clock_gettime(clockid_t clock, struct __kernel_old_timespec *ts) {long ret; - asm("syscall" :"=a" (ret) : -"0" (__NR_clock_gettime),"D" (clock),"S" (ts) :"memory" ); + asm("syscall" + :"=a" (ret) + :"0" (__NR_clock_gettime),"D" (clock),"S" (ts) + :"rcx" ,"r11" ,"memory" );return ret; }
@@ -29,8 +31,10 @@ int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz) {long ret; - asm("syscall" :"=a" (ret) : -"0" (__NR_gettimeofday),"D" (tv),"S" (tz) :"memory" ); + asm("syscall" + :"=a" (ret) + :"0" (__NR_gettimeofday),"D" (tv),"S" (tz) + :"rcx" ,"r11" ,"memory" );return ret; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 458/529 watchdog: at91sam9_wdt: use devm_request_irq to avoid missing free_irq() in error path
In reply to Greg Kroah-HartmanFrom: ruanjinjie <[email protected]>
[ Upstream commit 07bec0e09c1afbab4c5674fd2341f4f52d594f30 ]
free_irq() is missing in case of error in at91_wdt_init(), use devm_request_irq to fix that.
--- drivers/watchdog/at91sam9_wdt.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/watchdog/at91sam9_wdt.c +3 -4
@@ -206,10 +206,9 @@ static int at91_wdt_init(struct platform_device *pdev, struct at91wdt *wdt) "min heartbeat and max heartbeat might be too close for the system to handle it correctly\n");if ((tmp &AT91_WDT_WDFIEN ) && wdt->irq) { - err =request_irq (wdt->irq, wdt_interrupt, -IRQF_SHARED |IRQF_IRQPOLL | -IRQF_NO_SUSPEND , - pdev->name, wdt); + err =devm_request_irq (dev, wdt->irq, wdt_interrupt, +IRQF_SHARED |IRQF_IRQPOLL |IRQF_NO_SUSPEND , + pdev->name, wdt);if (err)return err; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 459/529 watchdog: Fix kmemleak in watchdog_cdev_register
In reply to Greg Kroah-HartmanFrom: Chen Jun <[email protected]>
[ Upstream commit 13721a2ac66b246f5802ba1b75ad8637e53eeecc ]
kmemleak reports memory leaks in watchdog_dev_register, as follows:
unreferenced object 0xffff888116233000 (size 2048):
comm ""modprobe"", pid 28147, jiffies 4353426116 (age 61.741s) hex dump (first 32 bytes):
80 fa b9 05 81 88 ff ff 08 30 23 16 81 88 ff ff .........0#.....
08 30 23 16 81 88 ff ff 00 00 00 00 00 00 00 00 .0#.............
backtrace:
[<000000007f001ffd>] __kmem_cache_alloc_node+0x157/0x220
[<000000006a389304>] kmalloc_trace+0x21/0x110
[<000000008d640eea>] watchdog_dev_register+0x4e/0x780 [watchdog]
[<0000000053c9f248>] __watchdog_register_device+0x4f0/0x680 [watchdog]
[<00000000b2979824>] watchdog_register_device+0xd2/0x110 [watchdog]
[<000000001f730178>] 0xffffffffc10880ae
[<000000007a1a8bcc>] do_one_initcall+0xcb/0x4d0
[<00000000b98be325>] do_init_module+0x1ca/0x5f0
[<0000000046d08e7c>] load_module+0x6133/0x70f0
...unreferenced object 0xffff888105b9fa80 (size 16):
comm ""modprobe"", pid 28147, jiffies 4353426116 (age 61.741s) hex dump (first 16 bytes):
77 61 74 63 68 64 6f 67 31 00 b9 05 81 88 ff ff watchdog1.......
backtrace:
[<000000007f001ffd>] __kmem_cache_alloc_node+0x157/0x220
[<00000000486ab89b>] __kmalloc_node_track_caller+0x44/0x1b0
[<000000005a39aab0>] kvasprintf+0xb5/0x140
[<0000000024806f85>] kvasprintf_const+0x55/0x180
[<000000009276cb7f>] kobject_set_name_vargs+0x56/0x150
[<00000000a92e820b>] dev_set_name+0xab/0xe0
[<00000000cec812c6>] watchdog_dev_register+0x285/0x780 [watchdog]
[<0000000053c9f248>] __watchdog_register_device+0x4f0/0x680 [watchdog]
[<00000000b2979824>] watchdog_register_device+0xd2/0x110 [watchdog]
[<000000001f730178>] 0xffffffffc10880ae
[<000000007a1a8bcc>] do_one_initcall+0xcb/0x4d0
[<00000000b98be325>] do_init_module+0x1ca/0x5f0
[<0000000046d08e7c>] load_module+0x6133/0x70f0
...The reason is that put_device is not be called if cdev_device_add fails and wdd->id != 0.
watchdog_cdev_register
wd_data = kzalloc [1]
err = dev_set_name [2]
..
err = cdev_device_add
if (err) {
if (wdd->id == 0) { // wdd->id != 0
..
}
return err; // [1],[2] would be leakedTo fix it, call put_device in all wdd->id cases.
--- drivers/watchdog/watchdog_dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/watchdog/watchdog_dev.c +1 -1
@@ -1037,8 +1037,8 @@ static int watchdog_cdev_register(struct watchdog_device *wdd)if (wdd->id ==0 ) {misc_deregister (&watchdog_miscdev); old_wd_data =NULL ; -put_device (&wd_data->dev); } +put_device (&wd_data->dev);return err; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 460/529 watchdog: pcwd_usb: Fix attempting to access uninitialized memory
In reply to Greg Kroah-HartmanFrom: Li Hua <[email protected]>
[ Upstream commit 7d06c07c67100fd0f8e6b3ab7145ce789f788117 ]
The stack variable msb and lsb may be used uninitialized in function usb_pcwd_get_temperature and usb_pcwd_get_timeleft when usb card no response.
The build waring is:drivers/watchdog/pcwd_usb.c:336:22: error: ‘lsb’ is used uninitialized in this function [-Werror=uninitialized]
*temperature = (lsb * 9 / 5) + 32;
~~~~^~~
drivers/watchdog/pcwd_usb.c:328:21: note: ‘lsb’ was declared here
unsigned char msb, lsb;
^~~cc1: all warnings being treated as errorsscripts/Makefile.build:250: recipe for target 'drivers/watchdog/pcwd_usb.o' failed make[3]: *** [drivers/watchdog/pcwd_usb.o] Error 1
--- drivers/watchdog/pcwd_usb.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/watchdog/pcwd_usb.c +4 -2
@@ -325,7 +325,8 @@ static int usb_pcwd_set_heartbeat(struct usb_pcwd_private *usb_pcwd, int t)static int usb_pcwd_get_temperature (struct usb_pcwd_private *usb_pcwd,int *temperature) { -unsigned char msb, lsb; +unsigned char msb =0x00 ; +unsigned char lsb =0x00 ;usb_pcwd_send_command (usb_pcwd,CMD_READ_TEMP , &msb, &lsb);
@@ -341,7 +342,8 @@ static int usb_pcwd_get_temperature(struct usb_pcwd_private *usb_pcwd,static int usb_pcwd_get_timeleft (struct usb_pcwd_private *usb_pcwd,int *time_left) { -unsigned char msb, lsb; +unsigned char msb =0x00 ; +unsigned char lsb =0x00 ;/* Read the time that's left before rebooting */ /* Note: if the board is not yet armed then we will read 0xFFFF */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 461/529 netfilter: ctnetlink: fix possible refcount leak in ctnetlink_create_conntrack()
In reply to Greg Kroah-HartmanFrom: Hangyu Hua <[email protected]>
[ Upstream commit ac4893980bbe79ce383daf9a0885666a30fe4c83 ]
nf_ct_put() needs to be called to put the refcount got by nf_conntrack_find_get() to avoid refcount leak when nf_conntrack_hash_check_insert() fails.
--- net/netfilter/nf_conntrack_netlink.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/netfilter/nf_conntrack_netlink.c +4 -1
@@ -2359,12 +2359,15 @@ ctnetlink_create_conntrack(struct net *net, err =nf_conntrack_hash_check_insert (ct);if (err <0 ) - goto err2; + goto err3;rcu_read_unlock ();return ct; +err3: +if (ct->master) +nf_ct_put (ct->master); err2:rcu_read_unlock (); err1:
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 462/529 netfilter: ebtables: fix table blob use-after-free
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit e58a171d35e32e6e8c37cfe0e8a94406732a331f ]
We are not allowed to return an error at this point. Looking at the code it looks like ret is always 0 at this point, but its not.
t = find_table_lock(net, repl->name, &ret, &ebt_mutex);
... this can return a valid table, with ret != 0.
This bug causes update of table->private with the new blob, but then frees the blob right away in the caller.
Syzbot report:
BUG: KASAN: vmalloc-out-of-bounds in __ebt_unregister_table+0xc00/0xcd0 net/bridge/netfilter/ebtables.c:1168 Read of size 4 at addr ffffc90005425000 by task kworker/u4:4/74 Workqueue: netns cleanup_net Call Trace: kasan_report+0xbf/0x1f0 mm/kasan/report.c:517 __ebt_unregister_table+0xc00/0xcd0 net/bridge/netfilter/ebtables.c:1168 ebt_unregister_table+0x35/0x40 net/bridge/netfilter/ebtables.c:1372 ops_exit_list+0xb0/0x170 net/core/net_namespace.c:169 cleanup_net+0x4ee/0xb10 net/core/net_namespace.c:613
...
ip(6)tables appears to be ok (ret should be 0 at this point) but make this more obvious.
--- net/bridge/netfilter/ebtables.c | 2 +- net/ipv4/netfilter/ip_tables.c | 3 +-- net/ipv6/netfilter/ip6_tables.c | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-)
net/bridge/netfilter/ebtables.c +1 -1
@@ -1049,7 +1049,7 @@ static int do_replace_finish(struct net *net, struct ebt_replace *repl,audit_log_nfcfg (repl->name,AF_BRIDGE , repl->nentries,AUDIT_XT_OP_REPLACE ,GFP_KERNEL ); -return ret; +return 0 ; free_unlock:mutex_unlock (&ebt_mutex);
net/ipv4/netfilter/ip_tables.c +1 -2
@@ -1044,7 +1044,6 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks,struct xt_counters *counters;struct ipt_entry *iter; - ret =0 ; counters =xt_counters_alloc (num_counters);if (!counters) { ret = -ENOMEM ;
@@ -1090,7 +1089,7 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks,net_warn_ratelimited ("iptables: counters copy to user failed while replacing table\n" ); }vfree (counters); -return ret; +return 0 ; put_module:module_put (t->me);
net/ipv6/netfilter/ip6_tables.c +1 -2
@@ -1062,7 +1062,6 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks,struct xt_counters *counters;struct ip6t_entry *iter; - ret =0 ; counters =xt_counters_alloc (num_counters);if (!counters) { ret = -ENOMEM ;
@@ -1108,7 +1107,7 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks,net_warn_ratelimited ("ip6tables: counters copy to user failed while replacing table\n" ); }vfree (counters); -return ret; +return 0 ; put_module:module_put (t->me);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 463/529 ipv6: Add lwtunnel encap size of all siblings in nexthop calculation
In reply to Greg Kroah-HartmanFrom: Lu Wei <[email protected]>
[ Upstream commit 4cc59f386991ec9374cb4bc83dbe1c0b5a95033f ]
In function rt6_nlmsg_size(), the length of nexthop is calculated by multipling the nexthop length of fib6_info and the number of siblings. However if the fib6_info has no lwtunnel but the siblings have lwtunnels, the nexthop length is less than it should be, and it will trigger a warning in inet6_rt_notify() as follows:
WARNING: CPU: 0 PID: 6082 at net/ipv6/route.c:6180 inet6_rt_notify+0x120/0x130 ...... Call Trace: <TASK> fib6_add_rt2node+0x685/0xa30 fib6_add+0x96/0x1b0 ip6_route_add+0x50/0xd0 inet6_rtm_newroute+0x97/0xa0 rtnetlink_rcv_msg+0x156/0x3d0 netlink_rcv_skb+0x5a/0x110 netlink_unicast+0x246/0x350 netlink_sendmsg+0x250/0x4c0 sock_sendmsg+0x66/0x70 ___sys_sendmsg+0x7c/0xd0 __sys_sendmsg+0x5d/0xb0 do_syscall_64+0x3f/0x90 entry_SYSCALL_64_after_hwframe+0x72/0xdc
This bug can be reproduced by script:
ip -6 addr add 2002::2/64 dev ens2
ip -6 route add 100::/64 via 2002::1 dev ens2 metric 100
for i in 10 20 30 40 50 60 70;
do
ip link add link ens2 name ipv_$i type ipvlan ip -6 addr add 2002::$i/64 dev ipv_$i ifconfig ipv_$i up
done
for i in 10 20 30 40 50 60;
do
ip -6 route append 100::/64 encap ip6 dst 2002::$i via 2002::1
dev ipv_$i metric 100
done
ip -6 route append 100::/64 via 2002::1 dev ipv_70 metric 100
This patch fixes it by adding nexthop_len of every siblings using rt6_nh_nlmsg_size().
--- net/ipv6/route.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
net/ipv6/route.c +6 -5
@@ -5444,16 +5444,17 @@ static size_t rt6_nlmsg_size(struct fib6_info *f6i)nexthop_for_each_fib6_nh (f6i->nh, rt6_nh_nlmsg_size, &nexthop_len); }else { +struct fib6_info *sibling, *next_sibling;struct fib6_nh *nh = f6i->fib6_nh; nexthop_len =0 ;if (f6i->fib6_nsiblings) { - nexthop_len =nla_total_size (0 )/* RTA_MULTIPATH */ - +NLA_ALIGN (sizeof (struct rtnexthop )) - +nla_total_size (16 )/* RTA_GATEWAY */ - +lwtunnel_get_encap_size (nh->fib_nh_lws); +rt6_nh_nlmsg_size (nh, &nexthop_len); - nexthop_len *= f6i->fib6_nsiblings; +list_for_each_entry_safe (sibling, next_sibling, + &f6i->fib6_siblings, fib6_siblings) { +rt6_nh_nlmsg_size (sibling->fib6_nh, &nexthop_len); + } } nexthop_len +=lwtunnel_get_encap_size (nh->fib_nh_lws); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 464/529 sctp: add a refcnt in sctp_stream_priorities to avoid a nested loop
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit 68ba44639537de6f91fe32783766322d41848127 ]
With this refcnt added in sctp_stream_priorities, we don't need to traverse all streams to check if the prio is used by other streams when freeing one stream's prio in sctp_sched_prio_free_sid(). This can avoid a nested loop (up to 65535 * 65535), which may cause a stuck as Ying reported:
watchdog: BUG: soft lockup - CPU#23 stuck for 26s! [ksoftirqd/23:136]
Call Trace:
<TASK>
sctp_sched_prio_free_sid+0xab/0x100 [sctp]
sctp_stream_free_ext+0x64/0xa0 [sctp]
sctp_stream_free+0x31/0x50 [sctp]
sctp_association_free+0xa5/0x200 [sctp]Note that it doesn't need to use refcount_t type for this counter, as its accessing is always protected under the sock lock.
v1->v2:
- add a check in sctp_sched_prio_set to avoid the possible prio_head refcnt overflow.
--- include/net/sctp/structs.h | 1 + net/sctp/stream_sched_prio.c | 52 +++++++++++++++--------------------- 2 files changed, 22 insertions(+), 31 deletions(-)
include/net/sctp/structs.h +1 -0
@@ -1394,6 +1394,7 @@ struct sctp_stream_priorities {/* The next stream in line */ struct sctp_stream_out_ext *next;__u16 prio; +__u16 users; };struct sctp_stream_out_ext {
net/sctp/stream_sched_prio.c +21 -31
99 lines not on this page · raw message
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 465/529 net: fix __dev_kfree_skb_any() vs drop monitor
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit ac3ad19584b26fae9ac86e4faebe790becc74491 ]
dev_kfree_skb() is aliased to consume_skb().
When a driver is dropping a packet by calling dev_kfree_skb_any() we should propagate the drop reason instead of pretending the packet was consumed.
Note: Now we have enum skb_drop_reason we could remove enum skb_free_reason (for linux-6.4)
v2: added an unlikely(), suggested by Yunsheng Lin.
--- net/core/dev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/core/dev.c +3 -1
@@ -3119,8 +3119,10 @@ void __dev_kfree_skb_any(struct sk_buff *skb, enum skb_free_reason reason) {if (in_irq () ||irqs_disabled ())__dev_kfree_skb_irq (skb, reason); +else if (unlikely (reason ==SKB_REASON_DROPPED )) +kfree_skb (skb);else -dev_kfree_skb (skb); +consume_skb (skb); }EXPORT_SYMBOL (__dev_kfree_skb_any);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 466/529 9p/xen: fix version parsing
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
[ Upstream commit f1956f4ec15195ec60976d9b5625326285ab102e ]
When connecting the Xen 9pfs frontend to the backend, the "versions" Xenstore entry written by the backend is parsed in a wrong way.
The "versions" entry is defined to contain the versions supported by the backend separated by commas (e.g. "1,2"). Today only version "1" is defined. Unfortunately the frontend doesn't look for "1" being listed in the entry, but it is expecting the entry to have the value "1".
This will result in failure as soon as the backend will support e.g. versions "1" and "2".
Fix that by scanning the entry correctly.
--- net/9p/trans_xen.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
net/9p/trans_xen.c +8 -2
@@ -399,13 +399,19 @@ static int xen_9pfs_front_probe(struct xenbus_device *dev,int ret, i;struct xenbus_transaction xbt;struct xen_9pfs_front_priv *priv =NULL ; -char *versions; +char *versions, *v;unsigned int max_rings, max_ring_order, len =0 ; versions =xenbus_read (XBT_NIL , dev->otherend,"versions" , &len);if (IS_ERR (versions))return PTR_ERR (versions); -if (strcmp (versions,"1" )) { +for (v = versions; *v; v++) { +if (simple_strtoul (v, &v,10 ) ==1 ) { + v =NULL ; +break ; + } + } +if (v) {kfree (versions);return -EINVAL ; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 467/529 9p/xen: fix connection sequence
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
[ Upstream commit c15fe55d14b3b4ded5af2a3260877460a6ffb8ad ]
Today the connection sequence of the Xen 9pfs frontend doesn't match the documented sequence. It can work reliably only for a PV 9pfs device having been added at boot time already, as the frontend is not waiting for the backend to have set its state to "XenbusStateInitWait" before reading the backend properties from Xenstore.
Fix that by following the documented sequence [1] (the documentation has a bug, so the reference is for the patch fixing that).
[1]: https://lore.kernel.org/xen-devel/[email protected]/T/#u
--- net/9p/trans_xen.c | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-)
net/9p/trans_xen.c +23 -15
@@ -393,12 +393,11 @@ static int xen_9pfs_front_alloc_dataring(struct xenbus_device *dev,return ret; } -static int xen_9pfs_front_probe (struct xenbus_device *dev, -const struct xenbus_device_id *id) +static int xen_9pfs_front_init (struct xenbus_device *dev) {int ret, i;struct xenbus_transaction xbt; -struct xen_9pfs_front_priv *priv =NULL ; +struct xen_9pfs_front_priv *priv =dev_get_drvdata (&dev->dev);char *versions, *v;unsigned int max_rings, max_ring_order, len =0 ;
@@ -426,11 +425,6 @@ static int xen_9pfs_front_probe(struct xenbus_device *dev,if (p9_xen_trans.maxsize >XEN_FLEX_RING_SIZE (max_ring_order)) p9_xen_trans.maxsize =XEN_FLEX_RING_SIZE (max_ring_order) /2 ; - priv =kzalloc (sizeof (*priv),GFP_KERNEL ); -if (!priv) -return -ENOMEM ; - - priv->dev = dev; priv->num_rings =XEN_9PFS_NUM_RINGS ; priv->rings =kcalloc (priv->num_rings,sizeof (*priv->rings),GFP_KERNEL );
@@ -489,23 +483,35 @@ static int xen_9pfs_front_probe(struct xenbus_device *dev, goto error; } -write_lock (&xen_9pfs_lock); -list_add_tail (&priv->list, &xen_9pfs_devs); -write_unlock (&xen_9pfs_lock); -dev_set_drvdata (&dev->dev, priv); -xenbus_switch_state (dev, XenbusStateInitialised); -return 0 ; error_xenbus:xenbus_transaction_end (xbt,1 );xenbus_dev_fatal (dev, ret,"writing xenstore" ); error: -dev_set_drvdata (&dev->dev,NULL );xen_9pfs_front_free (priv);return ret; } +static int xen_9pfs_front_probe (struct xenbus_device *dev, +const struct xenbus_device_id *id) +{ +struct xen_9pfs_front_priv *priv =NULL ; + + priv =kzalloc (sizeof (*priv),GFP_KERNEL ); +if (!priv) +return -ENOMEM ; + + priv->dev = dev; +dev_set_drvdata (&dev->dev, priv); + +write_lock (&xen_9pfs_lock); +list_add_tail (&priv->list, &xen_9pfs_devs); +write_unlock (&xen_9pfs_lock); + +return 0 ; +} +static int xen_9pfs_front_resume (struct xenbus_device *dev) {dev_warn (&dev->dev,"suspend/resume unsupported\n" );
@@ -524,6 +530,8 @@ static void xen_9pfs_front_changed(struct xenbus_device *dev,break ;case XenbusStateInitWait: +if (!xen_9pfs_front_init (dev)) +xenbus_switch_state (dev, XenbusStateInitialised);break ;case XenbusStateConnected:
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 468/529 9p/rdma: unmap receive dma buffer in rdma_request()/post_recv()
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 74a25e6e916cb57dab4267a96fbe8864ed21abdb ]
When down_interruptible() or ib_post_send() failed in rdma_request(), receive dma buffer is not unmapped. Add unmap action to error path. Also if ib_post_recv() failed in post_recv(), dma buffer is not unmapped. Add unmap action to error path.
--- net/9p/trans_rdma.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
net/9p/trans_rdma.c +12 -3
@@ -386,6 +386,7 @@ post_recv(struct p9_client *client, struct p9_rdma_context *c)struct p9_trans_rdma *rdma = client->trans;struct ib_recv_wr wr;struct ib_sge sge; +int ret; c->busa = ib_dma_map_single(rdma->cm_id->device, c->rc.sdata, client->msize,
@@ -403,7 +404,12 @@ post_recv(struct p9_client *client, struct p9_rdma_context *c) wr.wr_cqe = &c->cqe; wr.sg_list = &sge; wr.num_sge =1 ; -return ib_post_recv (rdma->qp, &wr,NULL ); + + ret =ib_post_recv (rdma->qp, &wr,NULL ); +if (ret) +ib_dma_unmap_single (rdma->cm_id->device, c->busa, + client->msize,DMA_FROM_DEVICE ); +return ret; error:p9_debug (P9_DEBUG_ERROR ,"EIO\n" );
@@ -500,7 +506,7 @@ static int rdma_request(struct p9_client *client, struct p9_req_t *req)if (down_interruptible (&rdma->sq_sem)) { err = -EINTR ; - goto send_error; + goto dma_unmap; }/* Mark request as `sent' *before* we actually send it,
@@ -510,11 +516,14 @@ static int rdma_request(struct p9_client *client, struct p9_req_t *req) req->status =REQ_STATUS_SENT ; err =ib_post_send (rdma->qp, &wr,NULL );if (err) - goto send_error; + goto dma_unmap;/* Success */ return 0 ; +dma_unmap: +ib_dma_unmap_single (rdma->cm_id->device, c->busa, + c->req->tc.size,DMA_TO_DEVICE );/* Handle errors that happened during or while preparing the send: */ send_error: req->status =REQ_STATUS_ERROR ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 469/529 net/mlx5: Geneve, Fix handling of Geneve object id as error code
In reply to Greg Kroah-HartmanFrom: Maor Dickman <[email protected]>
[ Upstream commit d28a06d7dbedc598a06bd1e53a28125f87ca5d0c ]
On success, mlx5_geneve_tlv_option_create returns non negative Geneve object id. In case the object id is positive value the caller functions will handle it as an error (non zero) and will fail to offload the Geneve rule.
Fix this by changing caller function ,mlx5_geneve_tlv_option_add, to return 0 in case valid non negative object id was provided.
--- drivers/net/ethernet/mellanox/mlx5/core/lib/geneve.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/lib/geneve.c +1 -0
@@ -105,6 +105,7 @@ int mlx5_geneve_tlv_option_add(struct mlx5_geneve *geneve, struct geneve_opt *op geneve->opt_type = opt->type; geneve->obj_id = res; geneve->refcount++; + res =0 ; } unlock:
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 470/529 nfc: fix memory leak of se_io context in nfc_genl_se_io
In reply to Greg Kroah-HartmanFrom: Fedor Pchelkin <[email protected]>
[ Upstream commit 25ff6f8a5a3b8dc48e8abda6f013e8cc4b14ffea ]
The callback context for sending/receiving APDUs to/from the selected secure element is allocated inside nfc_genl_se_io and supposed to be eventually freed in se_io_cb callback function. However, there are several error paths where the bwi_timer is not charged to call se_io_cb later, and the cb_context is leaked.
The patch proposes to free the cb_context explicitly on those error paths.
At the moment we can't simply check 'dev->ops->se_io()' return value as it may be negative in both cases: when the timer was charged and was not.
--- drivers/nfc/st-nci/se.c | 6 ++++++ drivers/nfc/st21nfca/se.c | 6 ++++++ net/nfc/netlink.c | 4 ++++ 3 files changed, 16 insertions(+)
drivers/nfc/st-nci/se.c +6 -0
@@ -664,6 +664,12 @@ int st_nci_se_io(struct nci_dev *ndev, u32 se_idx,ST_NCI_EVT_TRANSMIT_DATA , apdu, apdu_length);default : +/* Need to free cb_context here as at the moment we can't +* clearly indicate to the caller if the callback function +* would be called (and free it) or not. In both cases a +* negative value may be returned to the caller. +*/ +kfree (cb_context);return -ENODEV ; } }
drivers/nfc/st21nfca/se.c +6 -0
@@ -236,6 +236,12 @@ int st21nfca_hci_se_io(struct nfc_hci_dev *hdev, u32 se_idx,ST21NFCA_EVT_TRANSMIT_DATA , apdu, apdu_length);default : +/* Need to free cb_context here as at the moment we can't +* clearly indicate to the caller if the callback function +* would be called (and free it) or not. In both cases a +* negative value may be returned to the caller. +*/ +kfree (cb_context);return -ENODEV ; } }
net/nfc/netlink.c +4 -0
@@ -1442,7 +1442,11 @@ static int nfc_se_io(struct nfc_dev *dev, u32 se_idx, rc = dev->ops->se_io (dev, se_idx, apdu, apdu_length, cb, cb_context); +device_unlock (&dev->dev); +return rc; + error: +kfree (cb_context);device_unlock (&dev->dev);return rc; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 471/529 net/sched: act_sample: fix action bind logic
In reply to Greg Kroah-HartmanFrom: Pedro Tammela <[email protected]>
[ Upstream commit 4a20056a49a1854966562241922f68197f950539 ]
The TC architecture allows filters and actions to be created independently. In filters the user can reference action objects using:
tc action add action sample ... index 1
tc filter add ... action pedit index 1
In the current code for act_sample this is broken as it checks netlink attributes for create/update before actually checking if we are binding to an existing action.
tdc results:
1..29
ok 1 9784 - Add valid sample action with mandatory arguments
ok 2 5c91 - Add valid sample action with mandatory arguments and continue control action ok 3 334b - Add valid sample action with mandatory arguments and drop control action ok 4 da69 - Add valid sample action with mandatory arguments and reclassify control action ok 5 13ce - Add valid sample action with mandatory arguments and pipe control action ok 6 1886 - Add valid sample action with mandatory arguments and jump control action ok 7 7571 - Add sample action with invalid rate
ok 8 b6d4 - Add sample action with mandatory arguments and invalid control action ok 9 a874 - Add invalid sample action without mandatory arguments
ok 10 ac01 - Add invalid sample action without mandatory argument rate
ok 11 4203 - Add invalid sample action without mandatory argument group
ok 12 14a7 - Add invalid sample action without mandatory argument group
ok 13 8f2e - Add valid sample action with trunc argument
ok 14 45f8 - Add sample action with maximum rate argument
ok 15 ad0c - Add sample action with maximum trunc argument
ok 16 83a9 - Add sample action with maximum group argument
ok 17 ed27 - Add sample action with invalid rate argument
ok 18 2eae - Add sample action with invalid group argument
ok 19 6ff3 - Add sample action with invalid trunc size
ok 20 2b2a - Add sample action with invalid index
ok 21 dee2 - Add sample action with maximum allowed index
ok 22 560e - Add sample action with cookie
ok 23 704a - Replace existing sample action with new rate argument
ok 24 60eb - Replace existing sample action with new group argument
ok 25 2cce - Replace existing sample action with new trunc argument
ok 26 59d1 - Replace existing sample action with new control argument
ok 27 0a6e - Replace sample action with invalid goto chain control
ok 28 3872 - Delete sample action with valid index
ok 29 a394 - Delete sample action with invalid index
--- net/sched/act_sample.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
net/sched/act_sample.c +9 -2
@@ -54,8 +54,8 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, sample_policy, NULL);if (ret <0 )return ret; -if (!tb[TCA_SAMPLE_PARMS ] || !tb[TCA_SAMPLE_RATE ] || - !tb[TCA_SAMPLE_PSAMPLE_GROUP ]) + +if (!tb[TCA_SAMPLE_PARMS ])return -EINVAL ; parm =nla_data (tb[TCA_SAMPLE_PARMS ]);
@@ -79,6 +79,13 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla,tcf_idr_release (*a, bind);return -EEXIST ; } + +if (!tb[TCA_SAMPLE_RATE ] || !tb[TCA_SAMPLE_PSAMPLE_GROUP ]) { +NL_SET_ERR_MSG (extack,"sample rate and group are required" ); + err = -EINVAL ; + goto release_idr; + } + err =tcf_action_check_ctrlact (parm->action, tp, &goto_ch, extack);if (err <0 ) goto release_idr;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 472/529 ARM: dts: spear320-hmi: correct STMPE GPIO compatible
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 33a0c1b850c8c85f400531dab3a0b022cdb164b1 ]
The compatible is st,stmpe-gpio.
--- arch/arm/boot/dts/spear320-hmi.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/spear320-hmi.dts +1 -1
@@ -242,7 +242,7 @@ irq-trigger = <0x1>; stmpegpio: stmpe-gpio { - compatible = "stmpe,gpio"; + compatible = "st,stmpe-gpio"; reg = <0>; gpio-controller; #gpio-cells = <2>;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 473/529 tcp: tcp_check_req() can be called from process context
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 580f98cc33a260bb8c6a39ae2921b29586b84fdf ]
This is a follow up of commit 0a375c822497 ("tcp: tcp_rtx_synack() can be called from process context").
Frederick Lawler reported another "__this_cpu_add() in preemptible" warning caused by the same reason.
In my former patch I took care of tcp_rtx_synack()
but forgot that tcp_check_req() also contained some SNMP updates.
Note that some parts of tcp_check_req() always run in BH context, I added a comment to clarify this.
--- net/ipv4/tcp_minisocks.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/ipv4/tcp_minisocks.c +5 -2
@@ -565,6 +565,9 @@ EXPORT_SYMBOL(tcp_create_openreq_child);* validation and inside tcp_v4_reqsk_send_ack(). Can we do better? * * We don't need to initialize tmp_opt.sack_ok as we don't use the results +* +* Note: If @fastopen is true, this can be called from process context. +* Otherwise, this is from BH context. */ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
@@ -717,7 +720,7 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb, &tcp_rsk(req)->last_oow_ack_time)) req->rsk_ops->send_ack (sk, skb, req);if (paws_reject) -__NET_INC_STATS (sock_net (sk),LINUX_MIB_PAWSESTABREJECTED ); +NET_INC_STATS (sock_net (sk),LINUX_MIB_PAWSESTABREJECTED );return NULL ; }
@@ -736,7 +739,7 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,* "fourth, check the SYN bit" */ if (flg & (TCP_FLAG_RST |TCP_FLAG_SYN )) { -__TCP_INC_STATS (sock_net (sk),TCP_MIB_ATTEMPTFAILS ); +TCP_INC_STATS (sock_net (sk),TCP_MIB_ATTEMPTFAILS ); goto embryonic_reset; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 474/529 vc_screen: modify vcs_size() handling in vcs_read()
In reply to Greg Kroah-HartmanFrom: George Kennedy <[email protected]>
[ Upstream commit 46d733d0efc79bc8430d63b57ab88011806d5180 ]
Restore the vcs_size() handling in vcs_read() to what it had been in previous version.
--- drivers/tty/vt/vc_screen.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/tty/vt/vc_screen.c +1 -3
@@ -415,10 +415,8 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)*/ size =vcs_size (vc, attr, uni_mode);if (size <0 ) { -if (read) -break ; ret = size; - goto unlock_out; +break ; }if (pos >= size)break ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 475/529 rtc: sun6i: Always export the internal oscillator
In reply to Greg Kroah-HartmanFrom: Samuel Holland <[email protected]>
[ Upstream commit 344f4030f6c50a9db2d03021884c4bf36191b53a ]
On all variants of the hardware, the internal oscillator is one possible parent for the AR100 clock. It needs to be exported so we can model that relationship correctly in the devicetree.
--- drivers/rtc/rtc-sun6i.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-)
drivers/rtc/rtc-sun6i.c +4 -12
@@ -128,7 +128,6 @@ struct sun6i_rtc_clk_data { unsigned int fixed_prescaler : 16; unsigned int has_prescaler : 1; unsigned int has_out_clk : 1; - unsigned int export_iosc : 1; unsigned int has_losc_en : 1; unsigned int has_auto_swt : 1; };
@@ -260,10 +259,8 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,/* Yes, I know, this is ugly. */ sun6i_rtc = rtc; -/* Only read IOSC name from device tree if it is exported */ -if (rtc->data->export_iosc) -of_property_read_string_index (node,"clock-output-names" ,2 , - &iosc_name); +of_property_read_string_index (node,"clock-output-names" ,2 , + &iosc_name); rtc->int_osc = clk_hw_register_fixed_rate_with_accuracy(NULL, iosc_name,
@@ -304,13 +301,10 @@ static void __init sun6i_rtc_clk_init(struct device_node *node, goto err_register; } - clk_data->num =2 ; + clk_data->num =3 ; clk_data->hws[0 ] = &rtc->hw; clk_data->hws[1 ] =__clk_get_hw (rtc->ext_losc); -if (rtc->data->export_iosc) { - clk_data->hws[2 ] = rtc->int_osc; - clk_data->num =3 ; - } + clk_data->hws[2 ] = rtc->int_osc;of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);return ;
@@ -350,7 +344,6 @@ static const struct sun6i_rtc_clk_data sun8i_h3_rtc_data = { .fixed_prescaler = 32, .has_prescaler = 1, .has_out_clk = 1, - .export_iosc = 1, };static void __init sun8i_h3_rtc_clk_init (struct device_node *node)
@@ -368,7 +361,6 @@ static const struct sun6i_rtc_clk_data sun50i_h6_rtc_data = { .fixed_prescaler = 32, .has_prescaler = 1, .has_out_clk = 1, - .export_iosc = 1, .has_losc_en = 1, .has_auto_swt = 1, };
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 476/529 scsi: ipr: Work around fortify-string warning
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit ee4e7dfe4ffc9ca50c6875757bd119abfe22b5c5 ]
The ipr_log_vpd_compact() function triggers a fortified memcpy() warning about a potential string overflow with all versions of clang:
In file included from drivers/scsi/ipr.c:43:
In file included from include/linux/string.h:254:include/linux/fortify-string.h:520:4: error: call to '__write_overflow_field' declared with 'warning' attribute: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror,-Wattribute-warning]
__write_overflow_field(p_size_field, size);
^include/linux/fortify-string.h:520:4: error: call to '__write_overflow_field' declared with 'warning' attribute: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror,-Wattribute-warning] 2 errors generated.
I don't see anything actually wrong with the function, but this is the only instance I can reproduce of the fortification going wrong in the kernel at the moment, so the easiest solution may be to rewrite the function into something that does not trigger the warning.
Instead of having a combined buffer for vendor/device/serial strings, use three separate local variables and just truncate the whitespace individually.
--- drivers/scsi/ipr.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-)
drivers/scsi/ipr.c +21 -20
@@ -1516,23 +1516,22 @@ static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd) }/** -* strip_and_pad_whitespace - Strip and pad trailing whitespace. -* @i: index into buffer -* @buf: string to modify +* strip_whitespace - Strip and pad trailing whitespace. +* @i: size of buffer +* @buf: string to modify * -* This function will strip all trailing whitespace, pad the end -* of the string with a single space, and NULL terminate the string. +* This function will strip all trailing whitespace and +* NUL terminate the string. * -* Return value: -* new length of string **/ -static int strip_and_pad_whitespace (int i,char *buf) +static void strip_whitespace (int i,char *buf) { +if (i <1 ) +return ; + i--;while (i && buf[i] ==' ' ) i--; - buf[i+1 ] =' ' ; - buf[i+2 ] ='\0' ; -return i +2 ; + buf[i+1 ] ='\0' ; }/**
@@ -1547,19 +1546,21 @@ static int strip_and_pad_whitespace(int i, char *buf)static void ipr_log_vpd_compact (char *prefix,struct ipr_hostrcb *hostrcb,struct ipr_vpd *vpd) { -char buffer[IPR_VENDOR_ID_LEN +IPR_PROD_ID_LEN +IPR_SERIAL_NUM_LEN +3 ]; -int i =0 ; +char vendor_id[IPR_VENDOR_ID_LEN +1 ]; +char product_id[IPR_PROD_ID_LEN +1 ]; +char sn[IPR_SERIAL_NUM_LEN +1 ]; -memcpy (buffer, vpd->vpids.vendor_id,IPR_VENDOR_ID_LEN ); - i =strip_and_pad_whitespace (IPR_VENDOR_ID_LEN -1 , buffer); +memcpy (vendor_id, vpd->vpids.vendor_id,IPR_VENDOR_ID_LEN ); +strip_whitespace (IPR_VENDOR_ID_LEN , vendor_id); -memcpy (&buffer[i], vpd->vpids.product_id,IPR_PROD_ID_LEN ); - i =strip_and_pad_whitespace (i +IPR_PROD_ID_LEN -1 , buffer); +memcpy (product_id, vpd->vpids.product_id,IPR_PROD_ID_LEN ); +strip_whitespace (IPR_PROD_ID_LEN , product_id); -memcpy (&buffer[i], vpd->sn,IPR_SERIAL_NUM_LEN ); - buffer[IPR_SERIAL_NUM_LEN + i] ='\0' ; +memcpy (sn, vpd->sn,IPR_SERIAL_NUM_LEN ); +strip_whitespace (IPR_SERIAL_NUM_LEN , sn); -ipr_hcam_err (hostrcb,"%s VPID/SN: %s\n" , prefix, buffer); +ipr_hcam_err (hostrcb,"%s VPID/SN: %s %s %s\n" , prefix, + vendor_id, product_id, sn); }/**
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 477/529 loop: loop_set_status_from_info() check before assignment
In reply to Greg Kroah-HartmanFrom: Zhong Jinghua <[email protected]>
[ Upstream commit 9f6ad5d533d1c71e51bdd06a5712c4fbc8768dfa ]
In loop_set_status_from_info(), lo->lo_offset and lo->lo_sizelimit should be checked before reassignment, because if an overflow error occurs, the original correct value will be changed to the wrong value, and it will not be changed back.
More, the original patch did not solve the problem, the value was set and ioctl returned an error, but the subsequent io used the value in the loop driver, which still caused an alarm:
loop_handle_cmd
do_req_filebacked
loff_t pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset; lo_rw_aio
cmd->iocb.ki_pos = pos
--- drivers/block/loop.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/block/loop.c +4 -4
@@ -1029,13 +1029,13 @@ loop_set_status_from_info(struct loop_device *lo,if (err)return err; +/* Avoid assigning overflow values */ +if (info->lo_offset >LLONG_MAX || info->lo_sizelimit >LLONG_MAX ) +return -EOVERFLOW ; + lo->lo_offset = info->lo_offset; lo->lo_sizelimit = info->lo_sizelimit; -/* loff_t vars have been assigned __u64 */ -if (lo->lo_offset <0 || lo->lo_sizelimit <0 ) -return -EOVERFLOW ; -memcpy (lo->lo_file_name, info->lo_file_name,LO_NAME_SIZE );memcpy (lo->lo_crypt_name, info->lo_crypt_name,LO_NAME_SIZE ); lo->lo_file_name[LO_NAME_SIZE -1 ] =0 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 478/529 ASoC: adau7118: dont disable regulators on device unbind
In reply to Greg Kroah-HartmanFrom: Nuno Sá <[email protected]>
[ Upstream commit b5bfa7277ee7d944421e0ef193586c6e34d7492c ]
The regulators are supposed to be controlled through the set_bias_level() component callback. Moreover, the regulators are not enabled during probe and so, this would lead to a regulator unbalanced use count.
--- sound/soc/codecs/adau7118.c | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-)
sound/soc/codecs/adau7118.c +1 -18
@@ -445,22 +445,6 @@ static const struct snd_soc_component_driver adau7118_component_driver = { .non_legacy_dai_naming = 1, }; -static void adau7118_regulator_disable (void *data) -{ -struct adau7118_data *st = data; -int ret; -/* -* If we fail to disable DVDD, don't bother in trying IOVDD. We -* actually don't want to be left in the situation where DVDD -* is enabled and IOVDD is disabled. -*/ - ret =regulator_disable (st->dvdd); -if (ret) -return ; - -regulator_disable (st->iovdd); -} -static int adau7118_regulator_setup (struct adau7118_data *st) { st->iovdd =devm_regulator_get (st->dev,"iovdd" );
@@ -482,8 +466,7 @@ static int adau7118_regulator_setup(struct adau7118_data *st)regcache_cache_only (st->map, true); } -return devm_add_action_or_reset (st->dev, adau7118_regulator_disable, - st); +return 0 ; }static int adau7118_parset_dt (const struct adau7118_data *st)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 479/529 ASoC: zl38060: Remove spurious gpiolib select
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
[ Upstream commit 8e70aaae32b72d3088d18a3447b67112b3f5979a ]
The usage of GPIOs is optional in the code so don't force on gpiolib when building it, avoiding warnings in randconfigs.
Stable-dep-of: 0de2cc3707b6 ("ASoC: zl38060 add gpiolib dependency")
--- sound/soc/codecs/Kconfig | 1 - 1 file changed, 1 deletion(-)
sound/soc/codecs/Kconfig +0 -1
@@ -1701,7 +1701,6 @@ config SND_SOC_WSA881X config SND_SOC_ZL38060 tristate "Microsemi ZL38060 Connected Home Audio Processor" depends on SPI_MASTER - select GPIOLIB select REGMAP help Support for ZL38060 Connected Home Audio Processor from Microsemi,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 480/529 ASoC: zl38060 add gpiolib dependency
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 0de2cc3707b6b6e2ad40bd24ce09a5c1f65d01e1 ]
Without gpiolib, this driver fails to link:
arm-linux-gnueabi-ld: sound/soc/codecs/zl38060.o: in function `chip_gpio_get':
zl38060.c:(.text+0x30): undefined reference to `gpiochip_get_data'
arm-linux-gnueabi-ld: sound/soc/codecs/zl38060.o: in function `zl38_spi_probe':
zl38060.c:(.text+0xa18): undefined reference to `devm_gpiochip_add_data_with_key'
This appears to have been in the driver since the start, but is hard to hit in randconfig testing since gpiolib is almost always selected by something else.
--- sound/soc/codecs/Kconfig | 1 + 1 file changed, 1 insertion(+)
sound/soc/codecs/Kconfig +1 -0
@@ -1701,6 +1701,7 @@ config SND_SOC_WSA881X config SND_SOC_ZL38060 tristate "Microsemi ZL38060 Connected Home Audio Processor" depends on SPI_MASTER + depends on GPIOLIB select REGMAP help Support for ZL38060 Connected Home Audio Processor from Microsemi,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 481/529 thermal: intel: quark_dts: fix error pointer dereference
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit f1b930e740811d416de4d2074da48b6633a672c8 ]
If alloc_soc_dts() fails, then we can just return. Trying to free "soc_dts" will lead to an Oops.
--- drivers/thermal/intel/intel_quark_dts_thermal.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-)
drivers/thermal/intel/intel_quark_dts_thermal.c +2 -10
@@ -415,22 +415,14 @@ MODULE_DEVICE_TABLE(x86cpu, qrk_thermal_ids);static int __init intel_quark_thermal_init (void ) { -int err =0 ; -if (!x86_match_cpu (qrk_thermal_ids) || !iosf_mbi_available ())return -ENODEV ; soc_dts =alloc_soc_dts (); -if (IS_ERR (soc_dts)) { - err =PTR_ERR (soc_dts); - goto err_free; - } +if (IS_ERR (soc_dts)) +return PTR_ERR (soc_dts);return 0 ; - -err_free: -free_soc_dts (soc_dts); -return err; } static void __exit intel_quark_thermal_exit(void)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 482/529 thermal: intel: BXT_PMIC: select REGMAP instead of depending on it
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit 1467fb960349dfa5e300658f1a409dde2cfb0c51 ]
REGMAP is a hidden (not user visible) symbol. Users cannot set it directly thru "make *config", so drivers should select it instead of depending on it if they need it.
Consistently using "select" or "depends on" can also help reduce Kconfig circular dependency issues.
Therefore, change the use of "depends on REGMAP" to "select REGMAP".
--- drivers/thermal/intel/Kconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/thermal/intel/Kconfig +2 -1
@@ -60,7 +60,8 @@ endmenu config INTEL_BXT_PMIC_THERMAL tristate "Intel Broxton PMIC thermal driver" - depends on X86 && INTEL_SOC_PMIC_BXTWC && REGMAP + depends on X86 && INTEL_SOC_PMIC_BXTWC + select REGMAP help Select this driver for Intel Broxton PMIC with ADC channels monitoring system temperature measurements and alerts.
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 483/529 tracing: Add NULL checks for buffer in ring_buffer_free_read_page()
In reply to Greg Kroah-HartmanFrom: Jia-Ju Bai <[email protected]>
[ Upstream commit 3e4272b9954094907f16861199728f14002fcaf6 ]
In a previous commit 7433632c9ff6, buffer, buffer->buffers and buffer->buffers[cpu] in ring_buffer_wake_waiters() can be NULL, and thus the related checks are added.
However, in the same call stack, these variables are also used in ring_buffer_free_read_page():
tracing_buffers_release()
ring_buffer_wake_waiters(iter->array_buffer->buffer)
cpu_buffer = buffer->buffers[cpu] -> Add checks by previous commit
ring_buffer_free_read_page(iter->array_buffer->buffer)
cpu_buffer = buffer->buffers[cpu] -> No checkThus, to avod possible null-pointer derefernces, the related checks should be added.
These results are reported by a static tool designed by myself.
--- kernel/trace/ring_buffer.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
kernel/trace/ring_buffer.c +6 -1
@@ -5302,11 +5302,16 @@ EXPORT_SYMBOL_GPL(ring_buffer_alloc_read_page);*/ void ring_buffer_free_read_page (struct trace_buffer *buffer,int cpu,void *data) { -struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu]; +struct ring_buffer_per_cpu *cpu_buffer;struct buffer_data_page *bpage = data;struct page *page =virt_to_page (bpage);unsigned long flags; +if (!buffer || !buffer->buffers || !buffer->buffers[cpu]) +return ; + + cpu_buffer = buffer->buffers[cpu]; +/* If the page is still in use someplace else, we can't reuse it */ if (page_ref_count (page) >1 ) goto out;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 484/529 firmware/efi sysfb_efi: Add quirk for Lenovo IdeaPad Duet 3
In reply to Greg Kroah-HartmanFrom: Darrell Kavanagh <[email protected]>
[ Upstream commit e1d447157f232c650e6f32c9fb89ff3d0207c69a ]
Another Lenovo convertable which reports a landscape resolution of 1920x1200 with a pitch of (1920 * 4) bytes, while the actual framebuffer has a resolution of 1200x1920 with a pitch of (1200 * 4) bytes.
--- arch/x86/kernel/sysfb_efi.c | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/x86/kernel/sysfb_efi.c +8 -0
@@ -264,6 +264,14 @@ static const struct dmi_system_id efifb_dmi_swap_width_height[] __initconst = { "Lenovo ideapad D330-10IGM"), }, }, + { + /* Lenovo IdeaPad Duet 3 10IGL5 with 1200x1920 portrait screen */ + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, + "IdeaPad Duet 3 10IGL5"), + }, + }, {}, };
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 485/529 bootconfig: Increase max nodes of bootconfig from 1024 to 8192 for DCC support
In reply to Greg Kroah-HartmanFrom: Souradeep Chowdhury <[email protected]>
[ Upstream commit 6c40624930c58529185a257380442547580ed837 ]
The Data Capture and Compare(DCC) is a debugging tool that uses the bootconfig for configuring the register values during boot-time. Increase the max nodes supported by bootconfig to cater to the requirements of the Data Capture and Compare Driver.
--- include/linux/bootconfig.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/bootconfig.h +1 -1
@@ -29,7 +29,7 @@ struct xbc_node {/* Maximum size of boot config is 32KB - 1 */ #define XBC_DATA_MAX (XBC_VALUE - 1) -#define XBC_NODE_MAX 1024 +#define XBC_NODE_MAX 8192#define XBC_KEYLEN_MAX 256#define XBC_DEPTH_MAX 16
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 486/529 mfd: arizona: Use pm_runtime_resume_and_get() to prevent refcnt leak
In reply to Greg Kroah-HartmanFrom: Liang He <[email protected]>
[ Upstream commit 4414a7ab80cebf715045e3c4d465feefbad21139 ]
In arizona_clk32k_enable(), we should use pm_runtime_resume_and_get() as pm_runtime_get_sync() will increase the refcnt even when it returns an error.
--- drivers/mfd/arizona-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mfd/arizona-core.c +1 -1
@@ -45,7 +45,7 @@ int arizona_clk32k_enable(struct arizona *arizona)if (arizona->clk32k_ref ==1 ) {switch (arizona->pdata.clk32k_src) {case ARIZONA_32KZ_MCLK1 : - ret =pm_runtime_get_sync (arizona->dev); + ret =pm_runtime_resume_and_get (arizona->dev);if (ret !=0 ) goto err_ref; ret =clk_prepare_enable (arizona->mclk[ARIZONA_MCLK1 ]);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 487/529 IB/hfi1: Update RMT size calculation
In reply to Greg Kroah-HartmanFrom: Dean Luick <[email protected]>
[ Upstream commit 892ede5a77f337831609fb9c248ac60948061894 ]
Fix possible RMT overflow: Use the correct netdev size. Don't allow adjusted user contexts to go negative.
Fix QOS calculation: Send kernel context count as an argument since dd->n_krcv_queues is not yet set up in earliest call. Do not include the control context in the QOS calculation. Use the same sized variable to find the max of krcvq[] entries.
Update the RMT count explanation to make more sense.
--- drivers/infiniband/hw/hfi1/chip.c | 59 +++++++++++++++++-------------- 1 file changed, 32 insertions(+), 27 deletions(-)
drivers/infiniband/hw/hfi1/chip.c +32 -27
@@ -1097,7 +1097,7 @@ static void read_link_down_reason(struct hfi1_devdata *dd, u8 *ldr);static void handle_temp_err (struct hfi1_devdata *dd);static void dc_shutdown (struct hfi1_devdata *dd);static void dc_start (struct hfi1_devdata *dd); -static int qos_rmt_entries (struct hfi1_devdata *dd,unsigned int *mp, +static int qos_rmt_entries (unsigned int n_krcv_queues,unsigned int *mp,unsigned int *np);static void clear_full_mgmt_pkey (struct hfi1_pportdata *ppd);static int wait_link_transfer_active (struct hfi1_devdata *dd,int wait_ms);
@@ -13403,7 +13403,6 @@ static int set_up_context_variables(struct hfi1_devdata *dd)int ret;unsigned ngroups;int rmt_count; -int user_rmt_reduced;u32 n_usr_ctxts;u32 send_contexts =chip_send_contexts (dd);u32 rcv_contexts =chip_rcv_contexts (dd);
@@ -13462,28 +13461,34 @@ static int set_up_context_variables(struct hfi1_devdata *dd) (num_kernel_contexts + n_usr_ctxts), &node_affinity.real_cpu_mask);/* -* The RMT entries are currently allocated as shown below: -* 1. QOS (0 to 128 entries); -* 2. FECN (num_kernel_context - 1 + num_user_contexts + -* num_netdev_contexts); -* 3. netdev (num_netdev_contexts). -* It should be noted that FECN oversubscribe num_netdev_contexts -* entries of RMT because both netdev and PSM could allocate any receive -* context between dd->first_dyn_alloc_text and dd->num_rcv_contexts, -* and PSM FECN must reserve an RMT entry for each possible PSM receive -* context. +* RMT entries are allocated as follows: +* 1. QOS (0 to 128 entries) +* 2. FECN (num_kernel_context - 1 [a] + num_user_contexts + +* num_netdev_contexts [b]) +* 3. netdev (NUM_NETDEV_MAP_ENTRIES) +* +* Notes: +* [a] Kernel contexts (except control) are included in FECN if kernel +* TID_RDMA is active. +* [b] Netdev and user contexts are randomly allocated from the same +* context pool, so FECN must cover all contexts in the pool. */ - rmt_count =qos_rmt_entries (dd,NULL ,NULL ) + (num_netdev_contexts *2 ); -if (HFI1_CAP_IS_KSET (TID_RDMA )) - rmt_count += num_kernel_contexts -1 ; -if (rmt_count + n_usr_ctxts >NUM_MAP_ENTRIES ) { - user_rmt_reduced =NUM_MAP_ENTRIES - rmt_count; -dd_dev_err (dd, -"RMT size is reducing the number of user receive contexts from %u to %d\n" , - n_usr_ctxts, - user_rmt_reduced); -/* recalculate */ - n_usr_ctxts = user_rmt_reduced; + rmt_count =qos_rmt_entries (num_kernel_contexts -1 ,NULL ,NULL ) + + (HFI1_CAP_IS_KSET (TID_RDMA ) ? num_kernel_contexts -1 + :0 ) + + n_usr_ctxts + + num_netdev_contexts + +NUM_NETDEV_MAP_ENTRIES ; +if (rmt_count >NUM_MAP_ENTRIES ) { +int over = rmt_count -NUM_MAP_ENTRIES ; +/* try to squish user contexts, minimum of 1 */ +if (over >= n_usr_ctxts) { +dd_dev_err (dd,"RMT overflow: reduce the requested number of contexts\n" ); +return -EINVAL ; + } +dd_dev_err (dd,"RMT overflow: reducing # user contexts from %u to %u\n" , + n_usr_ctxts, n_usr_ctxts - over); + n_usr_ctxts -= over; }/* the first N are kernel contexts, the rest are user/netdev contexts */
@@ -14340,15 +14345,15 @@ static void clear_rsm_rule(struct hfi1_devdata *dd, u8 rule_index) }/* return the number of RSM map table entries that will be used for QOS */ -static int qos_rmt_entries (struct hfi1_devdata *dd,unsigned int *mp, +static int qos_rmt_entries (unsigned int n_krcv_queues,unsigned int *mp,unsigned int *np) {int i;unsigned int m, n; -u8 max_by_vl =0 ; +uint max_by_vl =0 ;/* is QOS active at all? */ -if (dd->n_krcv_queues <=MIN_KERNEL_KCTXTS || +if (n_krcv_queues <MIN_KERNEL_KCTXTS || num_vls ==1 || krcvqsset <=1 ) goto no_qos;
@@ -14406,7 +14411,7 @@ static void init_qos(struct hfi1_devdata *dd, struct rsm_map_table *rmt)if (!rmt) goto bail; - rmt_entries =qos_rmt_entries (dd, &m, &n); + rmt_entries =qos_rmt_entries (dd->n_krcv_queues -1 , &m, &n);if (rmt_entries ==0 ) goto bail; qpns_per_vl =1 << m;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 488/529 media: uvcvideo: Handle cameras with invalid descriptors
In reply to Greg Kroah-HartmanFrom: Ricardo Ribalda <[email protected]>
[ Upstream commit 41ddb251c68ac75c101d3a50a68c4629c9055e4c ]
If the source entity does not contain any pads, do not create a link.
--- drivers/media/usb/uvc/uvc_entity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/usb/uvc/uvc_entity.c +1 -1
@@ -37,7 +37,7 @@ static int uvc_mc_create_links(struct uvc_video_chain *chain,continue ; remote =uvc_entity_by_id (chain->dev, entity->baSourceID[i]); -if (remote ==NULL ) +if (remote ==NULL || remote->num_pads ==0 )return -EINVAL ; source = (UVC_ENTITY_TYPE (remote) ==UVC_TT_STREAMING )
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 489/529 media: uvcvideo: Handle errors from calls to usb_string
In reply to Greg Kroah-HartmanFrom: Guenter Roeck <[email protected]>
[ Upstream commit 4867bb590ae445bcfaa711a86b603c97e94574b3 ]
On a Webcam from Quanta, we see the following error.
usb 3-5: New USB device found, idVendor=0408, idProduct=30d2, bcdDevice= 0.03 usb 3-5: New USB device strings: Mfr=3, Product=1, SerialNumber=2 usb 3-5: Product: USB2.0 HD UVC WebCam
usb 3-5: Manufacturer: Quanta
usb 3-5: SerialNumber: 0x0001
...
uvcvideo: Found UVC 1.10 device USB2.0 HD UVC WebCam (0408:30d2)
uvcvideo: Failed to initialize entity for entity 5
uvcvideo: Failed to register entities (-22).
The Webcam reports an entity of type UVC_VC_EXTENSION_UNIT. It reports a string index of '7' associated with that entity. The attempt to read that string from the camera fails with error -32 (-EPIPE). usb_string() returns that error, but it is ignored. As result, the entity name is empty. This later causes v4l2_device_register_subdev() to return -EINVAL, and no entities are registered as result.
While this appears to be a firmware problem with the camera, the kernel should still handle the situation gracefully. To do that, check the return value from usb_string(). If it reports an error, assign the entity's default name.
--- drivers/media/usb/uvc/uvc_driver.c | 48 ++++++++++++------------------ 1 file changed, 19 insertions(+), 29 deletions(-)
drivers/media/usb/uvc/uvc_driver.c +19 -29
@@ -1121,10 +1121,8 @@ static int uvc_parse_vendor_control(struct uvc_device *dev, + n;memcpy (unit->extension.bmControls, &buffer[23 +p],2 *n); -if (buffer[24 +p+2 *n] !=0 ) -usb_string (udev, buffer[24 +p+2 *n], unit->name, -sizeof (unit->name)); -else +if (buffer[24 +p+2 *n] ==0 || +usb_string (udev, buffer[24 +p+2 *n], unit->name,sizeof (unit->name)) <0 )sprintf (unit->name,"Extension %u" , buffer[3 ]);list_add_tail (&unit->list, &dev->entities);
@@ -1249,15 +1247,15 @@ static int uvc_parse_standard_control(struct uvc_device *dev,memcpy (term->media.bmTransportModes, &buffer[10 +n], p); } -if (buffer[7 ] !=0 ) -usb_string (udev, buffer[7 ], term->name, -sizeof (term->name)); -else if (UVC_ENTITY_TYPE (term) ==UVC_ITT_CAMERA ) -sprintf (term->name,"Camera %u" , buffer[3 ]); -else if (UVC_ENTITY_TYPE (term) ==UVC_ITT_MEDIA_TRANSPORT_INPUT ) -sprintf (term->name,"Media %u" , buffer[3 ]); -else -sprintf (term->name,"Input %u" , buffer[3 ]); +if (buffer[7 ] ==0 || +usb_string (udev, buffer[7 ], term->name,sizeof (term->name)) <0 ) { +if (UVC_ENTITY_TYPE (term) ==UVC_ITT_CAMERA ) +sprintf (term->name,"Camera %u" , buffer[3 ]); +if (UVC_ENTITY_TYPE (term) ==UVC_ITT_MEDIA_TRANSPORT_INPUT ) +sprintf (term->name,"Media %u" , buffer[3 ]); +else +sprintf (term->name,"Input %u" , buffer[3 ]); + }list_add_tail (&term->list, &dev->entities);break ;
@@ -1289,10 +1287,8 @@ static int uvc_parse_standard_control(struct uvc_device *dev,memcpy (term->baSourceID, &buffer[7 ],1 ); -if (buffer[8 ] !=0 ) -usb_string (udev, buffer[8 ], term->name, -sizeof (term->name)); -else +if (buffer[8 ] ==0 || +usb_string (udev, buffer[8 ], term->name,sizeof (term->name)) <0 )sprintf (term->name,"Output %u" , buffer[3 ]);list_add_tail (&term->list, &dev->entities);
@@ -1314,10 +1310,8 @@ static int uvc_parse_standard_control(struct uvc_device *dev,memcpy (unit->baSourceID, &buffer[5 ], p); -if (buffer[5 +p] !=0 ) -usb_string (udev, buffer[5 +p], unit->name, -sizeof (unit->name)); -else +if (buffer[5 +p] ==0 || +usb_string (udev, buffer[5 +p], unit->name,sizeof (unit->name)) <0 )sprintf (unit->name,"Selector %u" , buffer[3 ]);list_add_tail (&unit->list, &dev->entities);
@@ -1347,10 +1341,8 @@ static int uvc_parse_standard_control(struct uvc_device *dev,if (dev->uvc_version >=0x0110 ) unit->processing.bmVideoStandards = buffer[9 +n]; -if (buffer[8 +n] !=0 ) -usb_string (udev, buffer[8 +n], unit->name, -sizeof (unit->name)); -else +if (buffer[8 +n] ==0 || +usb_string (udev, buffer[8 +n], unit->name,sizeof (unit->name)) <0 )sprintf (unit->name,"Processing %u" , buffer[3 ]);list_add_tail (&unit->list, &dev->entities);
@@ -1378,10 +1370,8 @@ static int uvc_parse_standard_control(struct uvc_device *dev, unit->extension.bmControls = (u8 *)unit +sizeof (*unit);memcpy (unit->extension.bmControls, &buffer[23 +p], n); -if (buffer[23 +p+n] !=0 ) -usb_string (udev, buffer[23 +p+n], unit->name, -sizeof (unit->name)); -else +if (buffer[23 +p+n] ==0 || +usb_string (udev, buffer[23 +p+n], unit->name,sizeof (unit->name)) <0 )sprintf (unit->name,"Extension %u" , buffer[3 ]);list_add_tail (&unit->list, &dev->entities);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 490/529 media: uvcvideo: Quirk for autosuspend in Logitech B910 and C910
In reply to Greg Kroah-HartmanFrom: Ricardo Ribalda <[email protected]>
[ Upstream commit 136effa754b57632f99574fc4a3433e0cfc031d9 ]
Logitech B910 and C910 firmware are unable to recover from a USB autosuspend. When it resumes, the device is in a state where it only produces invalid frames. Eg:
$ echo 0xFFFF > /sys/module/uvcvideo/parameters/trace # enable verbose log $ yavta -c1 -n1 --file='frame#.jpg' --format MJPEG --size=1920x1080 /dev/video1 [350438.435219] uvcvideo: uvc_v4l2_open [350438.529794] uvcvideo: Resuming interface 2 [350438.529801] uvcvideo: Resuming interface 3 [350438.529991] uvcvideo: Trying format 0x47504a4d (MJPG): 1920x1080. [350438.529996] uvcvideo: Using default frame interval 33333.3 us (30.0 fps). [350438.551496] uvcvideo: uvc_v4l2_mmap [350438.555890] uvcvideo: Device requested 3060 B/frame bandwidth. [350438.555896] uvcvideo: Selecting alternate setting 11 (3060 B/frame bandwidth). [350438.556362] uvcvideo: Allocated 5 URB buffers of 32x3060 bytes each. [350439.316468] uvcvideo: Marking buffer as bad (error bit set). [350439.316475] uvcvideo: Frame complete (EOF found). [350439.316477] uvcvideo: EOF in empty payload. [350439.316484] uvcvideo: frame 1 stats: 149/261/417 packets, 1/149/417 pts (early initial), 416/417 scr, last pts/stc/sof 2976325734/2978107243/249 [350439.384510] uvcvideo: Marking buffer as bad (error bit set). [350439.384516] uvcvideo: Frame complete (EOF found). [350439.384518] uvcvideo: EOF in empty payload. [350439.384525] uvcvideo: frame 2 stats: 265/379/533 packets, 1/265/533 pts (early initial), 532/533 scr, last pts/stc/sof 2979524454/2981305193/316 [350439.448472] uvcvideo: Marking buffer as bad (error bit set). [350439.448478] uvcvideo: Frame complete (EOF found). [350439.448480] uvcvideo: EOF in empty payload. [350439.448487] uvcvideo: frame 3 stats: 265/377/533 packets, 1/265/533 pts (early initial), 532/533 scr, last pts/stc/sof 2982723174/2984503144/382 ...(loop)...
The devices can leave this invalid state if the alternate setting of the streaming interface is toggled.
This patch adds a quirk for this device so it can be autosuspended properly.
lsusb -v:
Bus 001 Device 049: ID 046d:0821 Logitech, Inc. HD Webcam C910 Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
idVendor 0x046d Logitech, Inc.
idProduct 0x0821 HD Webcam C910
bcdDevice 0.10
iManufacturer 0 iProduct 0 iSerial 1 390022B0 bNumConfigurations 1
--- drivers/media/usb/uvc/uvc_driver.c | 18 ++++++++++++++++++ drivers/media/usb/uvc/uvc_video.c | 11 +++++++++++ drivers/media/usb/uvc/uvcvideo.h | 1 + 3 files changed, 30 insertions(+)
drivers/media/usb/uvc/uvc_driver.c +18 -0
@@ -2555,6 +2555,24 @@ static const struct usb_device_id uvc_ids[] = { .bInterfaceSubClass = 1, .bInterfaceProtocol = 0, .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, +/* Logitech, Webcam C910 */ + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor = 0x046d, + .idProduct = 0x0821, + .bInterfaceClass = USB_CLASS_VIDEO, + .bInterfaceSubClass = 1, + .bInterfaceProtocol = 0, + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_WAKE_AUTOSUSPEND)}, + /* Logitech, Webcam B910 */ + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor = 0x046d, + .idProduct = 0x0823, + .bInterfaceClass = USB_CLASS_VIDEO, + .bInterfaceSubClass = 1, + .bInterfaceProtocol = 0, + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_WAKE_AUTOSUSPEND)}, /* Logitech Quickcam Fusion */ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO,
drivers/media/usb/uvc/uvc_video.c +11 -0
@@ -1903,6 +1903,17 @@ static int uvc_video_start_transfer(struct uvc_streaming *stream,uvc_trace (UVC_TRACE_VIDEO ,"Selecting alternate setting %u " "(%u B/frame bandwidth).\n" , altsetting, best_psize); +/* +* Some devices, namely the Logitech C910 and B910, are unable +* to recover from a USB autosuspend, unless the alternate +* setting of the streaming interface is toggled. +*/ +if (stream->dev->quirks &UVC_QUIRK_WAKE_AUTOSUSPEND ) { +usb_set_interface (stream->dev->udev, intfnum, + altsetting); +usb_set_interface (stream->dev->udev, intfnum,0 ); + } + ret =usb_set_interface (stream->dev->udev, intfnum, altsetting);if (ret <0 )return ret;
drivers/media/usb/uvc/uvcvideo.h +1 -0
@@ -203,6 +203,7 @@#define UVC_QUIRK_RESTORE_CTRLS_ON_INIT 0x00000400#define UVC_QUIRK_FORCE_Y8 0x00000800#define UVC_QUIRK_FORCE_BPP 0x00001000 +#define UVC_QUIRK_WAKE_AUTOSUSPEND 0x00002000/* Format flags */ #define UVC_FMT_FLAG_COMPRESSED 0x00000001
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 491/529 media: uvcvideo: Silence memcpy() run-time false positive warnings
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
[ Upstream commit b839212988575c701aab4d3d9ca15e44c87e383c ]
The memcpy() in uvc_video_decode_meta() intentionally copies across the length and flags members and into the trailing buf flexible array. Split the copy so that the compiler can better reason about (the lack of) buffer overflows here. Avoid the run-time false positive warning:
memcpy: detected field-spanning write (size 12) of single field "&meta->length" at drivers/media/usb/uvc/uvc_video.c:1355 (size 1)
Additionally fix a typo in the documentation for struct uvc_meta_buf.
--- drivers/media/usb/uvc/uvc_video.c | 4 +++- include/uapi/linux/uvcvideo.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-)
drivers/media/usb/uvc/uvc_video.c +3 -1
@@ -1308,7 +1308,9 @@ static void uvc_video_decode_meta(struct uvc_streaming *stream,if (has_scr)memcpy (stream->clock.last_scr, scr,6 ); -memcpy (&meta->length, mem, length); + meta->length = mem[0 ]; + meta->flags = mem[1 ]; +memcpy (meta->buf, &mem[2 ], length -2 ); meta_buf->bytesused += length +sizeof (meta->ns) +sizeof (meta->sof); uvc_trace(UVC_TRACE_FRAME,
include/uapi/linux/uvcvideo.h +1 -1
@@ -86,7 +86,7 @@ struct uvc_xu_control_query {* struct. The first two fields are added by the driver, they can be used for * clock synchronisation. The rest is an exact copy of a UVC payload header. * Only complete objects with complete buffers are included. Therefore it's -* always sizeof(meta->ts) + sizeof(meta->sof) + meta->length bytes large. +* always sizeof(meta->ns) + sizeof(meta->sof) + meta->length bytes large. */ struct uvc_meta_buf {__u64 ns;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 492/529 staging: emxx_udc: Add checks for dma_alloc_coherent()
In reply to Greg Kroah-HartmanFrom: Yuan Can <[email protected]>
[ Upstream commit f6510a93cfd8c6c79b4dda0f2967cdc6df42eff4 ]
As the dma_alloc_coherent may return NULL, the return value needs to be checked to avoid NULL poineter dereference.
--- drivers/staging/emxx_udc/emxx_udc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/staging/emxx_udc/emxx_udc.c +6 -1
@@ -2591,10 +2591,15 @@ static int nbu2ss_ep_queue(struct usb_ep *_ep, req->unaligned = false;if (req->unaligned) { -if (!ep->virt_buf) +if (!ep->virt_buf) { ep->virt_buf =dma_alloc_coherent (udc->dev,PAGE_SIZE , &ep->phys_buf,GFP_ATOMIC |GFP_DMA ); +if (!ep->virt_buf) { +spin_unlock_irqrestore (&udc->lock, flags); +return -ENOMEM ; + } + }if (ep->epnum >0 ) {if (ep->direct ==USB_DIR_IN ) memcpy(ep->virt_buf, req->req.buf,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 493/529 tty: fix out-of-bounds access in tty_driver_lookup_tty()
In reply to Greg Kroah-HartmanFrom: Sven Schnelle <[email protected]>
[ Upstream commit db4df8e9d79e7d37732c1a1b560958e8dadfefa1 ]
When specifying an invalid console= device like console=tty3270, tty_driver_lookup_tty() returns the tty struct without checking whether index is a valid number.
To reproduce:
qemu-system-x86_64 -enable-kvm -nographic -serial mon:stdio \
-kernel ../linux-build-x86/arch/x86/boot/bzImage \
-append "console=ttyS0 console=tty3270"
This crashes with:
[ 0.770599] BUG: kernel NULL pointer dereference, address: 00000000000000ef [ 0.771265] #PF: supervisor read access in kernel mode [ 0.771773] #PF: error_code(0x0000) - not-present page [ 0.772609] Oops: 0000 [#1] PREEMPT SMP PTI [ 0.774878] RIP: 0010:tty_open+0x268/0x6f0 [ 0.784013] chrdev_open+0xbd/0x230 [ 0.784444] ? cdev_device_add+0x80/0x80 [ 0.784920] do_dentry_open+0x1e0/0x410 [ 0.785389] path_openat+0xca9/0x1050 [ 0.785813] do_filp_open+0xaa/0x150 [ 0.786240] file_open_name+0x133/0x1b0 [ 0.786746] filp_open+0x27/0x50 [ 0.787244] console_on_rootfs+0x14/0x4d [ 0.787800] kernel_init_freeable+0x1e4/0x20d [ 0.788383] ? rest_init+0xc0/0xc0 [ 0.788881] kernel_init+0x11/0x120 [ 0.789356] ret_from_fork+0x22/0x30
--- drivers/tty/tty_io.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/tty/tty_io.c +5 -3
@@ -1237,14 +1237,16 @@ static struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver, {struct tty_struct *tty; -if (driver->ops->lookup) +if (driver->ops->lookup) {if (!file) tty =ERR_PTR (-EIO );else tty = driver->ops->lookup (driver, file, idx); -else + }else { +if (idx >= driver->num) +return ERR_PTR (-EINVAL ); tty = driver->ttys[idx]; - + }if (!IS_ERR (tty))tty_kref_get (tty);return tty;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 494/529 tty: serial: fsl_lpuart: disable the CTS when send break signal
In reply to Greg Kroah-HartmanFrom: Sherry Sun <[email protected]>
[ Upstream commit c4c81db5cf8bc53d6160c3abf26d382c841aa434 ]
LPUART IP has a bug that it treats the CTS as higher priority than the break signal, which cause the break signal sending through UARTCTRL_SBK may impacted by the CTS input if the HW flow control is enabled.
Add this workaround patch to fix the IP bug, we can disable CTS before asserting SBK to avoid any interference from CTS, and re-enable it when break off.
Such as for the bluetooth chip power save feature, host can let the BT chip get into sleep state by sending a UART break signal, and wake it up by turning off the UART break. If the BT chip enters the sleep mode successfully, it will pull up the CTS line, if the BT chip is woken up, it will pull down the CTS line. If without this workaround patch, the UART TX pin cannot send the break signal successfully as it affected by the BT CTS pin. After adding this patch, the BT power save feature can work well.
--- drivers/tty/serial/fsl_lpuart.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-)
drivers/tty/serial/fsl_lpuart.c +22 -2
@@ -1448,12 +1448,32 @@ static void lpuart_break_ctl(struct uart_port *port, int break_state)static void lpuart32_break_ctl (struct uart_port *port,int break_state) { -unsigned long temp; +unsigned long temp, modem; +struct tty_struct *tty; +unsigned int cflag =0 ; + + tty =tty_port_tty_get (&port->state->port); +if (tty) { + cflag = tty->termios.c_cflag; +tty_kref_put (tty); + } temp =lpuart32_read (port,UARTCTRL ) & ~UARTCTRL_SBK ; + modem =lpuart32_read (port,UARTMODIR ); -if (break_state !=0 ) +if (break_state !=0 ) { temp |=UARTCTRL_SBK ; +/* +* LPUART CTS has higher priority than SBK, need to disable CTS before +* asserting SBK to avoid any interference if flow control is enabled. +*/ +if (cflag &CRTSCTS && modem &UARTMODIR_TXCTSE ) +lpuart32_write (port, modem & ~UARTMODIR_TXCTSE ,UARTMODIR ); + }else { +/* Re-enable the CTS when break off. */ +if (cflag &CRTSCTS && !(modem &UARTMODIR_TXCTSE )) +lpuart32_write (port, modem |UARTMODIR_TXCTSE ,UARTMODIR ); + }lpuart32_write (port, temp,UARTCTRL ); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 495/529 serial: sc16is7xx: setup GPIO controller later in probe
In reply to Greg Kroah-HartmanFrom: Isaac True <[email protected]>
[ Upstream commit c8f71b49ee4d28930c4a6798d1969fa91dc4ef3e ]
The GPIO controller component of the sc16is7xx driver is setup too early, which can result in a race condition where another device tries to utilise the GPIO lines before the sc16is7xx device has finished initialising.
This issue manifests itself as an Oops when the GPIO lines are configured:
Unable to handle kernel read from unreadable memory at virtual address
...
pc : sc16is7xx_gpio_direction_output+0x68/0x108 [sc16is7xx]
lr : sc16is7xx_gpio_direction_output+0x4c/0x108 [sc16is7xx]
...
Call trace:
sc16is7xx_gpio_direction_output+0x68/0x108 [sc16is7xx]
gpiod_direction_output_raw_commit+0x64/0x318
gpiod_direction_output+0xb0/0x170
create_gpio_led+0xec/0x198
gpio_led_probe+0x16c/0x4f0
platform_drv_probe+0x5c/0xb0
really_probe+0xe8/0x448
driver_probe_device+0xe8/0x138
__device_attach_driver+0x94/0x118
bus_for_each_drv+0x8c/0xe0
__device_attach+0x100/0x1b8
device_initial_probe+0x28/0x38
bus_probe_device+0xa4/0xb0
deferred_probe_work_func+0x90/0xe0
process_one_work+0x1c4/0x480
worker_thread+0x54/0x430
kthread+0x138/0x150
ret_from_fork+0x10/0x1cThis patch moves the setup of the GPIO controller functions to later in the probe function, ensuring the sc16is7xx device has already finished initialising by the time other devices try to make use of the GPIO lines. The error handling has also been reordered to reflect the new initialisation order.
--- drivers/tty/serial/sc16is7xx.c | 51 +++++++++++++++++----------------- 1 file changed, 26 insertions(+), 25 deletions(-)
drivers/tty/serial/sc16is7xx.c +26 -25
@@ -1243,25 +1243,6 @@ static int sc16is7xx_probe(struct device *dev, }sched_set_fifo (s->kworker_task); -#ifdef CONFIG_GPIOLIB -if (devtype->nr_gpio) { -/* Setup GPIO cotroller */ - s->gpio.owner =THIS_MODULE ; - s->gpio.parent = dev; - s->gpio.label =dev_name (dev); - s->gpio.direction_input = sc16is7xx_gpio_direction_input; - s->gpio.get = sc16is7xx_gpio_get; - s->gpio.direction_output = sc16is7xx_gpio_direction_output; - s->gpio.set = sc16is7xx_gpio_set; - s->gpio.base =-1 ; - s->gpio.ngpio = devtype->nr_gpio; - s->gpio.can_sleep =1 ; - ret =gpiochip_add_data (&s->gpio, s); -if (ret) - goto out_thread; - } -#endif -/* reset device, purging any pending irq / data */ regmap_write (s->regmap,SC16IS7XX_IOCONTROL_REG <<SC16IS7XX_REG_SHIFT ,SC16IS7XX_IOCONTROL_SRESET_BIT );
@@ -1327,6 +1308,25 @@ static int sc16is7xx_probe(struct device *dev, s->p[u].irda_mode = true; } +#ifdef CONFIG_GPIOLIB +if (devtype->nr_gpio) { +/* Setup GPIO cotroller */ + s->gpio.owner =THIS_MODULE ; + s->gpio.parent = dev; + s->gpio.label =dev_name (dev); + s->gpio.direction_input = sc16is7xx_gpio_direction_input; + s->gpio.get = sc16is7xx_gpio_get; + s->gpio.direction_output = sc16is7xx_gpio_direction_output; + s->gpio.set = sc16is7xx_gpio_set; + s->gpio.base =-1 ; + s->gpio.ngpio = devtype->nr_gpio; + s->gpio.can_sleep =1 ; + ret =gpiochip_add_data (&s->gpio, s); +if (ret) + goto out_thread; + } +#endif +/* * Setup interrupt. We first try to acquire the IRQ line as level IRQ. * If that succeeds, we can allow sharing the interrupt as well.
@@ -1346,18 +1346,19 @@ static int sc16is7xx_probe(struct device *dev,if (!ret)return 0 ; -out_ports: -for (i--; i >=0 ; i--) { -uart_remove_one_port (&sc16is7xx_uart, &s->p[i].port); -clear_bit (s->p[i].port.line, &sc16is7xx_lines); - } -#ifdef CONFIG_GPIOLIB if (devtype->nr_gpio)gpiochip_remove (&s->gpio); out_thread:#endif + +out_ports: +for (i--; i >=0 ; i--) { +uart_remove_one_port (&sc16is7xx_uart, &s->p[i].port); +clear_bit (s->p[i].port.line, &sc16is7xx_lines); + } +kthread_stop (s->kworker_task); out_clk:
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 496/529 mei: bus-fixup:upon error print return values of send and receive
In reply to Greg Kroah-HartmanFrom: Alexander Usyskin <[email protected]>
[ Upstream commit 4b8659e2c258e4fdac9ccdf06cc20c0677894ef9 ]
For easier debugging, upon error, print also return values from __mei_cl_recv() and __mei_cl_send() functions.
--- drivers/misc/mei/bus-fixup.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/misc/mei/bus-fixup.c +4 -4
@@ -172,7 +172,7 @@ static int mei_fwver(struct mei_cl_device *cldev) ret =__mei_cl_send (cldev->cl, (u8 *)&req,sizeof (req),MEI_CL_IO_TX_BLOCKING );if (ret <0 ) { -dev_err (&cldev->dev,"Could not send ReqFWVersion cmd\n" ); +dev_err (&cldev->dev,"Could not send ReqFWVersion cmd ret = %d\n" , ret);return ret; }
@@ -184,7 +184,7 @@ static int mei_fwver(struct mei_cl_device *cldev)* Should be at least one version block, * error out if nothing found */ -dev_err (&cldev->dev,"Could not read FW version\n" ); +dev_err (&cldev->dev,"Could not read FW version ret = %d\n" , bytes_recv);return -EIO ; }
@@ -332,7 +332,7 @@ static int mei_nfc_if_version(struct mei_cl *cl, ret =__mei_cl_send (cl, (u8 *)&cmd,sizeof (cmd),MEI_CL_IO_TX_BLOCKING );if (ret <0 ) { -dev_err (bus->dev,"Could not send IF version cmd\n" ); +dev_err (bus->dev,"Could not send IF version cmd ret = %d\n" , ret);return ret; }
@@ -346,7 +346,7 @@ static int mei_nfc_if_version(struct mei_cl *cl, ret =0 ; bytes_recv =__mei_cl_recv (cl, (u8 *)reply, if_version_length,0 ,0 );if (bytes_recv <0 || (size_t )bytes_recv < if_version_length) { -dev_err (bus->dev,"Could not read IF version\n" ); +dev_err (bus->dev,"Could not read IF version ret = %d\n" , bytes_recv); ret = -EIO ; goto err; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 497/529 tools/iio/iio_utils:fix memory leak
In reply to Greg Kroah-HartmanFrom: Yulong Zhang <[email protected]>
[ Upstream commit f2edf0c819a4823cd6c288801ce737e8d4fcde06 ]
1. fopen sysfs without fclose.
2. asprintf filename without free.
3. if asprintf return error,do not need to free the buffer.
--- tools/iio/iio_utils.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-)
tools/iio/iio_utils.c +6 -17
@@ -262,6 +262,7 @@ int iioutils_get_param_float(float *output, const char *param_name,if (fscanf (sysfsfp,"%f" , output) !=1 ) ret = errno ? -errno : -ENODATA ; +fclose (sysfsfp);break ; } error_free_filename:
@@ -342,9 +343,9 @@ int build_channel_array(const char *device_dir, } sysfsfp =fopen (filename,"r" ); +free (filename);if (!sysfsfp) { ret = -errno; -free (filename); goto error_close_dir; }
@@ -354,7 +355,6 @@ int build_channel_array(const char *device_dir,if (fclose (sysfsfp))perror ("build_channel_array(): Failed to close file" ); -free (filename); goto error_close_dir; }if (ret ==1 )
@@ -362,11 +362,9 @@ int build_channel_array(const char *device_dir,if (fclose (sysfsfp)) { ret = -errno; -free (filename); goto error_close_dir; } -free (filename); } *ci_array =malloc (sizeof (**ci_array) * (*counter));
@@ -392,9 +390,9 @@ int build_channel_array(const char *device_dir, } sysfsfp =fopen (filename,"r" ); +free (filename);if (!sysfsfp) { ret = -errno; -free (filename); count--; goto error_cleanup_array; }
@@ -402,20 +400,17 @@ int build_channel_array(const char *device_dir, errno =0 ;if (fscanf (sysfsfp,"%i" , ¤t_enabled) !=1 ) { ret = errno ? -errno : -ENODATA ; -free (filename); count--; goto error_cleanup_array; }if (fclose (sysfsfp)) { ret = -errno; -free (filename); count--; goto error_cleanup_array; }if (!current_enabled) { -free (filename); count--;continue ; }
@@ -426,7 +421,6 @@ int build_channel_array(const char *device_dir,strlen (ent->d_name) - strlen("_en"));if (!current->name) { -free (filename); ret = -ENOMEM ; count--; goto error_cleanup_array;
@@ -436,7 +430,6 @@ int build_channel_array(const char *device_dir, ret =iioutils_break_up_name (current->name, ¤t->generic_name);if (ret) { -free (filename);free (current->name); count--; goto error_cleanup_array;
@@ -447,17 +440,16 @@ int build_channel_array(const char *device_dir, scan_el_dir, current->name);if (ret <0 ) { -free (filename); ret = -ENOMEM ; goto error_cleanup_array; } sysfsfp =fopen (filename,"r" ); +free (filename);if (!sysfsfp) { ret = -errno; -fprintf (stderr,"failed to open %s\n" , - filename); -free (filename); +fprintf (stderr,"failed to open %s/%s_index\n" , + scan_el_dir, current->name); goto error_cleanup_array; }
@@ -467,17 +459,14 @@ int build_channel_array(const char *device_dir,if (fclose (sysfsfp))perror ("build_channel_array(): Failed to close file" ); -free (filename); goto error_cleanup_array; }if (fclose (sysfsfp)) { ret = -errno; -free (filename); goto error_cleanup_array; } -free (filename);/* Find the scale */ ret = iioutils_get_param_float(¤t->scale, "scale",
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 498/529 iio: accel: mma9551_core: Prevent uninitialized variable in mma9551_read_status_word()
In reply to Greg Kroah-HartmanFrom: Harshit Mogalapalli <[email protected]>
[ Upstream commit e56d2c34ce9dc122b1a618172ec0e05e50adb9e9 ]
Smatch Warns: drivers/iio/accel/mma9551_core.c:357
mma9551_read_status_word() error: uninitialized symbol 'v'.
When (offset >= 1 << 12) is true mma9551_transfer() will return -EINVAL without 'v' being initialized, so check for the error and return.
Note: Not a bug as such because the caller checks return value and doesn't not use this parameter in the problem case.
--- drivers/iio/accel/mma9551_core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/iio/accel/mma9551_core.c +4 -1
@@ -354,9 +354,12 @@ int mma9551_read_status_word(struct i2c_client *client, u8 app_id, ret =mma9551_transfer (client, app_id,MMA9551_CMD_READ_STATUS , reg,NULL ,0 , (u8 *)&v,2 ); +if (ret <0 ) +return ret; + *val =be16_to_cpu (v); -return ret; +return 0 ; }EXPORT_SYMBOL (mma9551_read_status_word);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 499/529 iio: accel: mma9551_core: Prevent uninitialized variable in mma9551_read_config_word()
In reply to Greg Kroah-HartmanFrom: Harshit Mogalapalli <[email protected]>
[ Upstream commit 64a68158738ec8f520347144352f7a09bdb9e169 ]
Smatch Warns:drivers/iio/accel/mma9551_core.c:299
mma9551_read_config_word() error: uninitialized symbol 'v'.
When (offset >= 1 << 12) is true mma9551_transfer() will return -EINVAL without 'v' being initialized, so check for the error and return.
Note: No actual bug as caller checks the return value and does not use the parameter in the problem case.
--- drivers/iio/accel/mma9551_core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/iio/accel/mma9551_core.c +4 -1
@@ -296,9 +296,12 @@ int mma9551_read_config_word(struct i2c_client *client, u8 app_id, ret =mma9551_transfer (client, app_id,MMA9551_CMD_READ_CONFIG , reg,NULL ,0 , (u8 *)&v,2 ); +if (ret <0 ) +return ret; + *val =be16_to_cpu (v); -return ret; +return 0 ; }EXPORT_SYMBOL (mma9551_read_config_word);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 500/529 PCI: loongson: Prevent LS7A MRRS increases
In reply to Greg Kroah-HartmanFrom: Huacai Chen <[email protected]>
[ Upstream commit 8b3517f88ff2983f52698893519227c10aac90b2 ]
Except for isochronous-configured devices, software may set Max_Read_Request_Size (MRRS) to any value up to 4096. If a device issues a read request with size greater than the completer's Max_Payload_Size (MPS), the completer is required to break the response into multiple completions.
Instead of correctly responding with multiple completions to a large read request, some LS7A Root Ports respond with a Completer Abort. To prevent this, the MRRS must be limited to an implementation-specific value.
The OS cannot detect that value, so rely on BIOS to configure MRRS before booting, and quirk the Root Ports so we never set an MRRS larger than that BIOS value for any downstream device.
N.B. Hot-added devices are not configured by BIOS, and they power up with MRRS = 512 bytes, so these devices will be limited to 512 bytes. If the LS7A limit is smaller, those hot-added devices may not work correctly, but per [1], hotplug is not supported with this chipset revision.
[1] https://lore.kernel.org/r/[email protected]
--- drivers/pci/controller/pci-loongson.c | 44 +++++++++------------------ drivers/pci/pci.c | 10 ++++++ include/linux/pci.h | 1 + 3 files changed, 26 insertions(+), 29 deletions(-)
drivers/pci/controller/pci-loongson.c +15 -29
@@ -60,37 +60,23 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON ,DEV_LS7A_LPC , system_bus_quirk); -static void loongson_mrrs_quirk (struct pci_dev *dev) +static void loongson_mrrs_quirk (struct pci_dev *pdev) { -struct pci_bus *bus = dev->bus; -struct pci_dev *bridge; -static const struct pci_device_id bridge_devids[] = { - {PCI_VDEVICE (LOONGSON ,DEV_PCIE_PORT_0 ) }, - {PCI_VDEVICE (LOONGSON ,DEV_PCIE_PORT_1 ) }, - {PCI_VDEVICE (LOONGSON ,DEV_PCIE_PORT_2 ) }, - {0 , }, - }; - -/* look for the matching bridge */ -while (!pci_is_root_bus (bus)) { - bridge = bus->self; - bus = bus->parent; -/* -* Some Loongson PCIe ports have a h/w limitation of -* 256 bytes maximum read request size. They can't handle -* anything larger than this. So force this limit on -* any devices attached under these ports. -*/ -if (pci_match_id (bridge_devids, bridge)) { -if (pcie_get_readrq (dev) >256 ) { -pci_info (dev,"limiting MRRS to 256\n" ); -pcie_set_readrq (dev,256 ); - } -break ; - } - } +/* +* Some Loongson PCIe ports have h/w limitations of maximum read +* request size. They can't handle anything larger than this. So +* force this limit on any devices attached under these ports. +*/ +struct pci_host_bridge *bridge =pci_find_host_bridge (pdev->bus); + + bridge->no_inc_mrrs =1 ; } -DECLARE_PCI_FIXUP_ENABLE (PCI_ANY_ID ,PCI_ANY_ID , loongson_mrrs_quirk); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , +DEV_PCIE_PORT_0 , loongson_mrrs_quirk); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , +DEV_PCIE_PORT_1 , loongson_mrrs_quirk); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , +DEV_PCIE_PORT_2 , loongson_mrrs_quirk);static void __iomem *cfg1_map (struct loongson_pci *priv,int bus,unsigned int devfn,int where)
drivers/pci/pci.c +10 -0
@@ -5739,6 +5739,7 @@ int pcie_set_readrq(struct pci_dev *dev, int rq) {u16 v;int ret; +struct pci_host_bridge *bridge =pci_find_host_bridge (dev->bus);if (rq <128 || rq >4096 || !is_power_of_2 (rq))return -EINVAL ;
@@ -5757,6 +5758,15 @@ int pcie_set_readrq(struct pci_dev *dev, int rq) v = (ffs (rq) -8 ) <<12 ; +if (bridge->no_inc_mrrs) { +int max_mrrs =pcie_get_readrq (dev); + +if (rq > max_mrrs) { +pci_info (dev,"can't set Max_Read_Request_Size to %d; max is %d\n" , rq, max_mrrs); +return -EINVAL ; + } + } + ret =pcie_capability_clear_and_set_word (dev,PCI_EXP_DEVCTL ,PCI_EXP_DEVCTL_READRQ , v);
include/linux/pci.h +1 -0
@@ -539,6 +539,7 @@ struct pci_host_bridge {struct msi_controller *msi; unsigned int ignore_reset_delay:1; /* For entire hierarchy */ unsigned int no_ext_tags:1; /* No Extended Tags */ + unsigned int no_inc_mrrs:1; /* No Increase MRRS */ unsigned int native_aer:1; /* OS may use PCIe AER */ unsigned int native_pcie_hotplug:1; /* OS may use PCIe hotplug */ unsigned int native_shpc_hotplug:1; /* OS may use SHPC hotplug */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 501/529 usb: host: xhci: mvebu: Iterate over array indexes instead of using pointer math
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
[ Upstream commit 0fbd2cda92cdb00f72080665554a586f88bca821 ]
Walking the dram->cs array was seen as accesses beyond the first array item by the compiler. Instead, use the array index directly. This allows for run-time bounds checking under CONFIG_UBSAN_BOUNDS as well. Seen with GCC 13 with -fstrict-flex-arrays:
In function 'xhci_mvebu_mbus_config',
inlined from 'xhci_mvebu_mbus_init_quirk' at ../drivers/usb/host/xhci-mvebu.c:66:2:../drivers/usb/host/xhci-mvebu.c:37:28: warning: array subscript 0 is outside array bounds of 'const struct mbus_dram_window[0]' [-Warray-bounds=]
37 | writel(((cs->size - 1) & 0xffff0000) | (cs->mbus_attr << 8) |
| ~~^~~~~~
--- drivers/usb/host/xhci-mvebu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/xhci-mvebu.c +1 -1
@@ -33,7 +33,7 @@ static void xhci_mvebu_mbus_config(void __iomem *base,/* Program each DRAM CS in a seperate window */ for (win =0 ; win < dram->num_cs; win++) { -const struct mbus_dram_window *cs = dram->cs + win; +const struct mbus_dram_window *cs = &dram->cs[win]; writel(((cs->size - 1) & 0xffff0000) | (cs->mbus_attr << 8) | (dram->mbus_dram_target_id << 4) | 1,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 502/529 USB: ene_usb6250: Allocate enough memory for full object
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
[ Upstream commit ce33e64c1788912976b61314b56935abd4bc97ef ]
The allocation of PageBuffer is 512 bytes in size, but the dereferencing of struct ms_bootblock_idi (also size 512) happens at a calculated offset within the allocation, which means the object could potentially extend beyond the end of the allocation. Avoid this case by just allocating enough space to catch any accesses beyond the end. Seen with GCC 13:
../drivers/usb/storage/ene_ub6250.c: In function 'ms_lib_process_bootblock':../drivers/usb/storage/ene_ub6250.c:1050:44: warning: array subscript 'struct ms_bootblock_idi[0]' is partly outside array bounds of 'unsigned char[512]' [-Warray-bounds=]
1050 | if (le16_to_cpu(idi->wIDIgeneralConfiguration) != MS_IDI_GENERAL_CONF)
| ^~../include/uapi/linux/byteorder/little_endian.h:37:51: note: in definition of macro '__le16_to_cpu'
37 | #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
| ^../drivers/usb/storage/ene_ub6250.c:1050:29: note: in expansion of macro 'le16_to_cpu'
1050 | if (le16_to_cpu(idi->wIDIgeneralConfiguration) != MS_IDI_GENERAL_CONF)
| ^~~~~~~~~~~
In file included from ../drivers/usb/storage/ene_ub6250.c:5:
In function 'kmalloc',
inlined from 'ms_lib_process_bootblock' at ../drivers/usb/storage/ene_ub6250.c:942:15:
../include/linux/slab.h:580:24: note: at offset [256, 512] into object of size 512 allocated by 'kmalloc_trace'
580 | return kmalloc_trace(
| ^~~~~~~~~~~~~~
581 | kmalloc_caches[kmalloc_type(flags)][index],
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
582 | flags, size);
| ~~~~~~~~~~~~--- drivers/usb/storage/ene_ub6250.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/storage/ene_ub6250.c +1 -1
@@ -938,7 +938,7 @@ static int ms_lib_process_bootblock(struct us_data *us, u16 PhyBlock, u8 *PageDastruct ms_lib_type_extdat ExtraData;struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra; - PageBuffer =kmalloc (MS_BYTES_PER_PAGE ,GFP_KERNEL ); + PageBuffer =kzalloc (MS_BYTES_PER_PAGE *2 ,GFP_KERNEL );if (PageBuffer ==NULL )return (u32)-1 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 503/529 usb: uvc: Enumerate valid values for color matching
In reply to Greg Kroah-HartmanFrom: Daniel Scally <[email protected]>
[ Upstream commit e16cab9c1596e251761d2bfb5e1467950d616963 ]
The color matching descriptors defined in the UVC Specification contain 3 fields with discrete numeric values representing particular settings. Enumerate those values so that later code setting them can be more readable.
--- include/uapi/linux/usb/video.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
include/uapi/linux/usb/video.h +30 -0
@@ -179,6 +179,36 @@#define UVC_CONTROL_CAP_AUTOUPDATE (1 << 3)#define UVC_CONTROL_CAP_ASYNCHRONOUS (1 << 4) +/* 3.9.2.6 Color Matching Descriptor Values */ +enum uvc_color_primaries_values { +UVC_COLOR_PRIMARIES_UNSPECIFIED , +UVC_COLOR_PRIMARIES_BT_709_SRGB , +UVC_COLOR_PRIMARIES_BT_470_2_M , +UVC_COLOR_PRIMARIES_BT_470_2_B_G , +UVC_COLOR_PRIMARIES_SMPTE_170M , +UVC_COLOR_PRIMARIES_SMPTE_240M , +}; + +enum uvc_transfer_characteristics_values { +UVC_TRANSFER_CHARACTERISTICS_UNSPECIFIED , +UVC_TRANSFER_CHARACTERISTICS_BT_709 , +UVC_TRANSFER_CHARACTERISTICS_BT_470_2_M , +UVC_TRANSFER_CHARACTERISTICS_BT_470_2_B_G , +UVC_TRANSFER_CHARACTERISTICS_SMPTE_170M , +UVC_TRANSFER_CHARACTERISTICS_SMPTE_240M , +UVC_TRANSFER_CHARACTERISTICS_LINEAR , +UVC_TRANSFER_CHARACTERISTICS_SRGB , +}; + +enum uvc_matrix_coefficients { +UVC_MATRIX_COEFFICIENTS_UNSPECIFIED , +UVC_MATRIX_COEFFICIENTS_BT_709 , +UVC_MATRIX_COEFFICIENTS_FCC , +UVC_MATRIX_COEFFICIENTS_BT_470_2_B_G , +UVC_MATRIX_COEFFICIENTS_SMPTE_170M , +UVC_MATRIX_COEFFICIENTS_SMPTE_240M , +}; +/* ------------------------------------------------------------------------ * UVC structures */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 504/529 usb: gadget: uvc: Make bSourceID read/write
In reply to Greg Kroah-HartmanFrom: Daniel Scally <[email protected]>
[ Upstream commit b3c839bd8a07d303bc59a900d55dd35c7826562c ]
At the moment, the UVC function graph is hardcoded IT -> PU -> OT. To add XU support we need the ability to insert the XU descriptors into the chain. To facilitate that, make the output terminal's bSourceID attribute writeable so that we can configure its source.
--- .../ABI/testing/configfs-usb-gadget-uvc | 2 +- drivers/usb/gadget/function/uvc_configfs.c | 59 ++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-)
Documentation/ABI/testing/configfs-usb-gadget-uvc +1 -1
@@ -51,7 +51,7 @@ Date: Dec 2014 KernelVersion: 4.0 Description: Default output terminal descriptors - All attributes read only: + All attributes read only except bSourceID: ============== ============================================= iTerminal index of string descriptor
drivers/usb/gadget/function/uvc_configfs.c +58 -1
69 lines not on this page · raw message
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 505/529 PCI: Align extra resources for hotplug bridges properly
In reply to Greg Kroah-HartmanFrom: Mika Westerberg <[email protected]>
[ Upstream commit 08f0a15ee8adb4846b08ca5d5c175fbf0f652bc9 ]
After division the extra resource space per hotplug bridge may not be aligned according to the window alignment, so align it before passing it down for further distribution.
--- drivers/pci/setup-bus.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-)
drivers/pci/setup-bus.c +19 -6
@@ -2004,6 +2004,7 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus,* resource space between hotplug bridges. */ for_each_pci_bridge (dev, bus) { +struct resource *res;struct pci_bus *b; b = dev->subordinate;
@@ -2015,16 +2016,28 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus,* hotplug-capable downstream ports taking alignment into * account. */ - io.end = io.start + io_per_hp -1 ; - mmio.end = mmio.start + mmio_per_hp -1 ; - mmio_pref.end = mmio_pref.start + mmio_pref_per_hp -1 ; + res = &dev->resource[PCI_BRIDGE_IO_WINDOW ]; + align =pci_resource_alignment (dev, res); + io.end = align ? io.start +ALIGN_DOWN (io_per_hp, align) -1 + : io.start + io_per_hp -1 ; + + res = &dev->resource[PCI_BRIDGE_MEM_WINDOW ]; + align =pci_resource_alignment (dev, res); + mmio.end = align ? mmio.start +ALIGN_DOWN (mmio_per_hp, align) -1 + : mmio.start + mmio_per_hp -1 ; + + res = &dev->resource[PCI_BRIDGE_PREF_MEM_WINDOW ]; + align =pci_resource_alignment (dev, res); + mmio_pref.end = align ? mmio_pref.start + +ALIGN_DOWN (mmio_pref_per_hp, align) -1 + : mmio_pref.start + mmio_pref_per_hp -1 ;pci_bus_distribute_available_resources (b, add_list, io, mmio, mmio_pref); - io.start += io_per_hp; - mmio.start += mmio_per_hp; - mmio_pref.start += mmio_pref_per_hp; + io.start += io.end +1 ; + mmio.start += mmio.end +1 ; + mmio_pref.start += mmio_pref.end +1 ; } }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 506/529 PCI: Take other bus devices into account when distributing resources
In reply to Greg Kroah-HartmanFrom: Mika Westerberg <[email protected]>
[ Upstream commit 9db0b9b6a14249ef65a5f1e5e3b37762af96f425 ]
A PCI bridge may reside on a bus with other devices as well. The resource distribution code does not take this into account and therefore it expands the bridge resource windows too much, not leaving space for the other devices (or functions of a multifunction device). This leads to an issue that Jonathan reported when running QEMU with the following topology (QEMU parameters):
-device pcie-root-port,port=0,id=root_port13,chassis=0,slot=2 \ -device x3130-upstream,id=sw1,bus=root_port13,multifunction=on \ -device e1000,bus=root_port13,addr=0.1 \ -device xio3130-downstream,id=fun1,bus=sw1,chassis=0,slot=3 \ -device e1000,bus=fun1
The first e1000 NIC here is another function in the switch upstream port. This leads to following errors:
pci 0000:00:04.0: bridge window [mem 0x10200000-0x103fffff] to [bus 02-04] pci 0000:02:00.0: bridge window [mem 0x10200000-0x103fffff] to [bus 03-04] pci 0000:02:00.1: BAR 0: failed to assign [mem size 0x00020000] e1000 0000:02:00.1: can't ioremap BAR 0: [??? 0x00000000 flags 0x0]
Fix this by taking into account bridge windows, device BARs and SR-IOV PF BARs on the bus (PF BARs include space for VF BARS so only account PF BARs), including the ones belonging to bridges themselves if it has any.
--- drivers/pci/setup-bus.c | 176 ++++++++++++++++++++++++---------------- 1 file changed, 106 insertions(+), 70 deletions(-)
drivers/pci/setup-bus.c +106 -70
@@ -1878,12 +1878,67 @@ static void adjust_bridge_window(struct pci_dev *bridge, struct resource *res, add_size = size - new_size;pci_dbg (bridge,"bridge window %pR shrunken by %pa\n" , res, &add_size); + }else { +return ; } res->end = res->start + new_size -1 ;remove_from_list (add_list, res); } +static void remove_dev_resource (struct resource *avail,struct pci_dev *dev, +struct resource *res) +{ +resource_size_t size, align, tmp; + + size =resource_size (res); +if (!size) +return ; + + align =pci_resource_alignment (dev, res); + align = align ?ALIGN (avail->start, align) - avail->start :0 ; + tmp = align + size; + avail->start =min (avail->start + tmp, avail->end +1 ); +} + +static void remove_dev_resources (struct pci_dev *dev,struct resource *io, +struct resource *mmio, +struct resource *mmio_pref) +{ +int i; + +for (i =0 ; i <PCI_NUM_RESOURCES ; i++) { +struct resource *res = &dev->resource[i]; + +if (resource_type (res) ==IORESOURCE_IO ) { +remove_dev_resource (io, dev, res); + }else if (resource_type (res) ==IORESOURCE_MEM ) { + +/* +* Make sure prefetchable memory is reduced from +* the correct resource. Specifically we put 32-bit +* prefetchable memory in non-prefetchable window +* if there is an 64-bit pretchable window. +* +* See comments in __pci_bus_size_bridges() for +* more information. +*/ +if ((res->flags &IORESOURCE_PREFETCH ) && + ((res->flags &IORESOURCE_MEM_64 ) == + (mmio_pref->flags &IORESOURCE_MEM_64 ))) +remove_dev_resource (mmio_pref, dev, res); +else +remove_dev_resource (mmio, dev, res); + } + } +} + +/* +* io, mmio and mmio_pref contain the total amount of bridge window space +* available. This includes the minimal space needed to cover all the +* existing devices on the bus and the possible extra space that can be +* shared with the bridges. +*/ static void pci_bus_distribute_available_resources(struct pci_bus *bus, struct list_head *add_list, struct resource io,
@@ -1893,7 +1948,7 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus,unsigned int normal_bridges =0 , hotplug_bridges =0 ;struct resource *io_res, *mmio_res, *mmio_pref_res;struct pci_dev *dev, *bridge = bus->self; -resource_size_t io_per_hp, mmio_per_hp, mmio_pref_per_hp, align; +resource_size_t io_per_b, mmio_per_b, mmio_pref_per_b, align; io_res = &bridge->resource[PCI_BRIDGE_IO_WINDOW ]; mmio_res = &bridge->resource[PCI_BRIDGE_MEM_WINDOW ];
@@ -1937,100 +1992,81 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus, normal_bridges++; } -/* -* There is only one bridge on the bus so it gets all available -* resources which it can then distribute to the possible hotplug -* bridges below. -*/ -if (hotplug_bridges + normal_bridges ==1 ) { - dev = list_first_entry(&bus->devices, struct pci_dev, bus_list); -if (dev->subordinate) -pci_bus_distribute_available_resources (dev->subordinate, - add_list, io, mmio, mmio_pref); -return ; - } - -if (hotplug_bridges ==0 ) +if (!(hotplug_bridges + normal_bridges))return ;/* -* Calculate the total amount of extra resource space we can -* pass to bridges below this one. This is basically the -* extra space reduced by the minimal required space for the -* non-hotplug bridges. +* Calculate the amount of space we can forward from "bus" to any +* downstream buses, i.e., the space left over after assigning the +* BARs and windows on "bus". */ -for_each_pci_bridge (dev, bus) { -resource_size_t used_size; -struct resource *res; - -if (dev->is_hotplug_bridge) -continue ; - -/* -* Reduce the available resource space by what the -* bridge and devices below it occupy. -*/ - res = &dev->resource[PCI_BRIDGE_IO_WINDOW ]; - align =pci_resource_alignment (dev, res); - align = align ?ALIGN (io.start, align) - io.start :0 ; - used_size = align +resource_size (res); -if (!res->parent) - io.start =min (io.start + used_size, io.end +1 ); - - res = &dev->resource[PCI_BRIDGE_MEM_WINDOW ]; - align =pci_resource_alignment (dev, res); - align = align ?ALIGN (mmio.start, align) - mmio.start :0 ; - used_size = align +resource_size (res); -if (!res->parent) - mmio.start =min (mmio.start + used_size, mmio.end +1 ); - - res = &dev->resource[PCI_BRIDGE_PREF_MEM_WINDOW ]; - align =pci_resource_alignment (dev, res); - align = align ?ALIGN (mmio_pref.start, align) - - mmio_pref.start :0 ; - used_size = align +resource_size (res); -if (!res->parent) - mmio_pref.start =min (mmio_pref.start + used_size, - mmio_pref.end +1 ); +list_for_each_entry (dev, &bus->devices, bus_list) { +if (!dev->is_virtfn) +remove_dev_resources (dev, &io, &mmio, &mmio_pref); } - io_per_hp =div64_ul (resource_size (&io), hotplug_bridges); - mmio_per_hp =div64_ul (resource_size (&mmio), hotplug_bridges); - mmio_pref_per_hp =div64_ul (resource_size (&mmio_pref), - hotplug_bridges); -/* -* Go over devices on this bus and distribute the remaining -* resource space between hotplug bridges. +* If there is at least one hotplug bridge on this bus it gets all +* the extra resource space that was left after the reductions +* above. +* +* If there are no hotplug bridges the extra resource space is +* split between non-hotplug bridges. This is to allow possible +* hotplug bridges below them to get the extra space as well. */ +if (hotplug_bridges) { + io_per_b =div64_ul (resource_size (&io), hotplug_bridges); + mmio_per_b =div64_ul (resource_size (&mmio), hotplug_bridges); + mmio_pref_per_b =div64_ul (resource_size (&mmio_pref), + hotplug_bridges); + }else { + io_per_b =div64_ul (resource_size (&io), normal_bridges); + mmio_per_b =div64_ul (resource_size (&mmio), normal_bridges); + mmio_pref_per_b =div64_ul (resource_size (&mmio_pref), + normal_bridges); + } +for_each_pci_bridge (dev, bus) {struct resource *res;struct pci_bus *b; b = dev->subordinate; -if (!b || !dev->is_hotplug_bridge) +if (!b)continue ; +if (hotplug_bridges && !dev->is_hotplug_bridge) +continue ; + + res = &dev->resource[PCI_BRIDGE_IO_WINDOW ];/* -* Distribute available extra resources equally between -* hotplug-capable downstream ports taking alignment into -* account. +* Make sure the split resource space is properly aligned +* for bridge windows (align it down to avoid going above +* what is available). */ - res = &dev->resource[PCI_BRIDGE_IO_WINDOW ]; align =pci_resource_alignment (dev, res); - io.end = align ? io.start +ALIGN_DOWN (io_per_hp, align) -1 - : io.start + io_per_hp -1 ; + io.end = align ? io.start +ALIGN_DOWN (io_per_b, align) -1 + : io.start + io_per_b -1 ; + +/* +* The x_per_b holds the extra resource space that can be +* added for each bridge but there is the minimal already +* reserved as well so adjust x.start down accordingly to +* cover the whole space. +*/ + io.start -=resource_size (res); res = &dev->resource[PCI_BRIDGE_MEM_WINDOW ]; align =pci_resource_alignment (dev, res); - mmio.end = align ? mmio.start +ALIGN_DOWN (mmio_per_hp, align) -1 - : mmio.start + mmio_per_hp -1 ; + mmio.end = align ? mmio.start +ALIGN_DOWN (mmio_per_b, align) -1 + : mmio.start + mmio_per_b -1 ; + mmio.start -=resource_size (res); res = &dev->resource[PCI_BRIDGE_PREF_MEM_WINDOW ]; align =pci_resource_alignment (dev, res); mmio_pref.end = align ? mmio_pref.start + -ALIGN_DOWN (mmio_pref_per_hp, align) -1 - : mmio_pref.start + mmio_pref_per_hp -1 ; +ALIGN_DOWN (mmio_pref_per_b, align) -1 + : mmio_pref.start + mmio_pref_per_b -1 ; + mmio_pref.start -=resource_size (res);pci_bus_distribute_available_resources (b, add_list, io, mmio, mmio_pref);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 507/529 kernel/fail_function: fix memory leak with using debugfs_lookup()
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
[ Upstream commit 2bb3669f576559db273efe49e0e69f82450efbca ]
When calling debugfs_lookup() the result must have dput() called on it, otherwise the memory will leak over time. To make things simpler, just call debugfs_lookup_and_remove() instead which handles all of the logic at once.
--- kernel/fail_function.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
kernel/fail_function.c +1 -4
@@ -163,10 +163,7 @@ static void fei_debugfs_add_attr(struct fei_attr *attr)static void fei_debugfs_remove_attr (struct fei_attr *attr) { -struct dentry *dir; - - dir =debugfs_lookup (attr->kp.symbol_name, fei_debugfs_dir); -debugfs_remove_recursive (dir); +debugfs_lookup_and_remove (attr->kp.symbol_name, fei_debugfs_dir); }static int fei_kprobe_handler (struct kprobe *kp,struct pt_regs *regs)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 508/529 PCI: loongson: Add more devices that need MRRS quirk
In reply to Greg Kroah-HartmanFrom: Huacai Chen <[email protected]>
[ Upstream commit c768f8c5f40fcdc6f058cc2f02592163d6c6716c ]
Loongson-2K SOC and LS7A2000 chipset add new PCI IDs that need MRRS quirk. Add them.
--- drivers/pci/controller/pci-loongson.c | 33 +++++++++++++++++++-------- 1 file changed, 24 insertions(+), 9 deletions(-)
drivers/pci/controller/pci-loongson.c +24 -9
@@ -13,9 +13,14 @@#include "../pci.h" /* Device IDs */ -#define DEV_PCIE_PORT_0 0x7a09 -#define DEV_PCIE_PORT_1 0x7a19 -#define DEV_PCIE_PORT_2 0x7a29 +#define DEV_LS2K_PCIE_PORT0 0x1a05 +#define DEV_LS7A_PCIE_PORT0 0x7a09 +#define DEV_LS7A_PCIE_PORT1 0x7a19 +#define DEV_LS7A_PCIE_PORT2 0x7a29 +#define DEV_LS7A_PCIE_PORT3 0x7a39 +#define DEV_LS7A_PCIE_PORT4 0x7a49 +#define DEV_LS7A_PCIE_PORT5 0x7a59 +#define DEV_LS7A_PCIE_PORT6 0x7a69#define DEV_LS2K_APB 0x7a02#define DEV_LS7A_CONF 0x7a10
@@ -38,11 +43,11 @@ static void bridge_class_quirk(struct pci_dev *dev) dev->class =PCI_CLASS_BRIDGE_PCI <<8 ; }DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , -DEV_PCIE_PORT_0 , bridge_class_quirk); +DEV_LS7A_PCIE_PORT0 , bridge_class_quirk);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , -DEV_PCIE_PORT_1 , bridge_class_quirk); +DEV_LS7A_PCIE_PORT1 , bridge_class_quirk);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , -DEV_PCIE_PORT_2 , bridge_class_quirk); +DEV_LS7A_PCIE_PORT2 , bridge_class_quirk);static void system_bus_quirk (struct pci_dev *pdev) {
@@ -72,11 +77,21 @@ static void loongson_mrrs_quirk(struct pci_dev *pdev) bridge->no_inc_mrrs =1 ; }DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , -DEV_PCIE_PORT_0 , loongson_mrrs_quirk); +DEV_LS2K_PCIE_PORT0 , loongson_mrrs_quirk);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , -DEV_PCIE_PORT_1 , loongson_mrrs_quirk); +DEV_LS7A_PCIE_PORT0 , loongson_mrrs_quirk);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , -DEV_PCIE_PORT_2 , loongson_mrrs_quirk); +DEV_LS7A_PCIE_PORT1 , loongson_mrrs_quirk); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , +DEV_LS7A_PCIE_PORT2 , loongson_mrrs_quirk); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , +DEV_LS7A_PCIE_PORT3 , loongson_mrrs_quirk); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , +DEV_LS7A_PCIE_PORT4 , loongson_mrrs_quirk); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , +DEV_LS7A_PCIE_PORT5 , loongson_mrrs_quirk); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_LOONGSON , +DEV_LS7A_PCIE_PORT6 , loongson_mrrs_quirk);static void __iomem *cfg1_map (struct loongson_pci *priv,int bus,unsigned int devfn,int where)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 509/529 PCI: Add ACS quirk for Wangxun NICs
In reply to Greg Kroah-HartmanFrom: Mengyuan Lou <[email protected]>
[ Upstream commit a2b9b123ccac913e9f9b80337d687a2fe786a634 ]
Wangxun has verified there is no peer-to-peer between functions for the below selection of SFxxx, RP1000 and RP2000 NICS. They may be multi-function devices, but the hardware does not advertise ACS capability.
Add an ACS quirk for these devices so the functions can be in independent IOMMU groups.
--- drivers/pci/quirks.c | 22 ++++++++++++++++++++++ include/linux/pci_ids.h | 2 ++ 2 files changed, 24 insertions(+)
drivers/pci/quirks.c +22 -0
@@ -4797,6 +4797,26 @@ static int pci_quirk_brcm_acs(struct pci_dev *dev, u16 acs_flags) PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF); } +/* +* Wangxun 10G/1G NICs have no ACS capability, and on multi-function +* devices, peer-to-peer transactions are not be used between the functions. +* So add an ACS quirk for below devices to isolate functions. +* SFxxx 1G NICs(em). +* RP1000/RP2000 10G NICs(sp). +*/ +static int pci_quirk_wangxun_nic_acs (struct pci_dev *dev,u16 acs_flags) +{ +switch (dev->device) { + case 0x0100 ... 0x010F: +case 0x1001 : +case 0x2001 : +return pci_acs_ctrl_enabled (acs_flags, +PCI_ACS_SV |PCI_ACS_RR |PCI_ACS_CR |PCI_ACS_UF ); + } + +return false; +} + static const struct pci_dev_acs_enabled { u16 vendor; u16 device;
@@ -4942,6 +4962,8 @@ static const struct pci_dev_acs_enabled { { PCI_VENDOR_ID_NXP, 0x8d9b, pci_quirk_nxp_rp_acs },/* Zhaoxin Root/Downstream Ports */ { PCI_VENDOR_ID_ZHAOXIN, PCI_ANY_ID, pci_quirk_zhaoxin_pcie_ports_acs }, +/* Wangxun nics */ + { PCI_VENDOR_ID_WANGXUN, PCI_ANY_ID, pci_quirk_wangxun_nic_acs }, { 0 } };
include/linux/pci_ids.h +2 -0
@@ -3033,6 +3033,8 @@#define PCI_DEVICE_ID_INTEL_VMD_9A0B 0x9a0b#define PCI_DEVICE_ID_INTEL_S21152BB 0xb152 +#define PCI_VENDOR_ID_WANGXUN 0x8088 +#define PCI_VENDOR_ID_SCALEMP 0x8686#define PCI_DEVICE_ID_SCALEMP_VSMP_CTL 0x1010
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 510/529 phy: rockchip-typec: Fix unsigned comparison with less than zero
In reply to Greg Kroah-HartmanFrom: Jiapeng Chong <[email protected]>
[ Upstream commit f765c59c5a72546a2d74a92ae5d0eb0329d8e247 ]
The dp and ufp are defined as bool type, the return value type of function extcon_get_state should be int, so the type of dp and ufp are modified to int.
./drivers/phy/rockchip/phy-rockchip-typec.c:827:12-14: WARNING: Unsigned expression compared with zero: dp > 0.
--- drivers/phy/rockchip/phy-rockchip-typec.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/phy/rockchip/phy-rockchip-typec.c +1 -2
@@ -808,9 +808,8 @@ static int tcphy_get_mode(struct rockchip_typec_phy *tcphy)struct extcon_dev *edev = tcphy->extcon;union extcon_property_value property;unsigned int id; -bool ufp, dp;u8 mode; -int ret; +int ret, ufp, dp;if (!edev)return MODE_DFP_USB ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 511/529 soundwire: cadence: Remove wasted space in response_buf
In reply to Greg Kroah-HartmanFrom: Richard Fitzgerald <[email protected]>
[ Upstream commit 827c32d0df4bbe0d1c47d79f6a5eabfe9ac75216 ]
The response_buf was declared much larger (128 entries) than the number of responses that could ever be written into it. The Cadence IP is configurable up to a maximum of 32 entries, and the datasheet says that RX_FIFO_AVAIL can be 2 larger than this. So allow up to 34 responses.
Also add checking in cdns_read_response() to prevent overflowing reponse_buf if RX_FIFO_AVAIL contains an unexpectedly large number.
--- drivers/soundwire/cadence_master.c | 7 +++++++ drivers/soundwire/cadence_master.h | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-)
drivers/soundwire/cadence_master.c +7 -0
@@ -725,8 +725,15 @@ static void cdns_read_response(struct sdw_cdns *cdns)u32 num_resp, cmd_base;int i; +/* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */ +BUILD_BUG_ON (ARRAY_SIZE (cdns->response_buf) <CDNS_MCP_CMD_LEN +2 ); + num_resp =cdns_readl (cdns,CDNS_MCP_FIFOSTAT ); num_resp &=CDNS_MCP_RX_FIFO_AVAIL ; +if (num_resp >ARRAY_SIZE (cdns->response_buf)) { +dev_warn (cdns->dev,"RX AVAIL %d too long\n" , num_resp); + num_resp =ARRAY_SIZE (cdns->response_buf); + } cmd_base =CDNS_MCP_CMD_BASE ;
drivers/soundwire/cadence_master.h +12 -1
@@ -8,6 +8,12 @@#define SDW_CADENCE_GSYNC_KHZ 4/* 4 kHz */ #define SDW_CADENCE_GSYNC_HZ (SDW_CADENCE_GSYNC_KHZ * 1000) +/* +* The Cadence IP supports up to 32 entries in the FIFO, though implementations +* can configure the IP to have a smaller FIFO. +*/ +#define CDNS_MCP_IP_MAX_CMD_LEN 32 +/** * struct sdw_cdns_pdi: PDI (Physical Data Interface) instance *
@@ -119,7 +125,12 @@ struct sdw_cdns {struct sdw_bus bus;unsigned int instance; -u32 response_buf[0x80 ]; +/* +* The datasheet says the RX FIFO AVAIL can be 2 entries more +* than the FIFO capacity, so allow for this. +*/ +u32 response_buf[CDNS_MCP_IP_MAX_CMD_LEN +2 ]; +struct completion tx_complete;struct sdw_defer *defer;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 512/529 soundwire: cadence: Drain the RX FIFO after an IO timeout
In reply to Greg Kroah-HartmanFrom: Richard Fitzgerald <[email protected]>
[ Upstream commit 0603a47bd3a8f439d7844b841eee1819353063e0 ]
If wait_for_completion_timeout() times-out in _cdns_xfer_msg() it is possible that something could have been written to the RX FIFO. In this case, we should drain the RX FIFO so that anything in it doesn't carry over and mess up the next transfer.
Obviously, if we got to this state something went wrong, and we don't really know the state of everything. The cleanup in this situation cannot be bullet-proof but we should attempt to avoid breaking future transaction, if only to reduce the amount of error noise when debugging the failure from a kernel log.
Note that this patch only implements the draining for blocking (non-deferred) transfers. The deferred API doesn't have any proper handling of error conditions and would need some re-design before implementing cleanup. That is a task for a separate patch...
--- drivers/soundwire/cadence_master.c | 50 ++++++++++++++++-------------- 1 file changed, 27 insertions(+), 23 deletions(-)
drivers/soundwire/cadence_master.c +27 -23
@@ -511,6 +511,29 @@ cdns_fill_msg_resp(struct sdw_cdns *cdns,return SDW_CMD_OK ; } +static void cdns_read_response (struct sdw_cdns *cdns) +{ +u32 num_resp, cmd_base; +int i; + +/* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */ +BUILD_BUG_ON (ARRAY_SIZE (cdns->response_buf) <CDNS_MCP_CMD_LEN +2 ); + + num_resp =cdns_readl (cdns,CDNS_MCP_FIFOSTAT ); + num_resp &=CDNS_MCP_RX_FIFO_AVAIL ; +if (num_resp >ARRAY_SIZE (cdns->response_buf)) { +dev_warn (cdns->dev,"RX AVAIL %d too long\n" , num_resp); + num_resp =ARRAY_SIZE (cdns->response_buf); + } + + cmd_base =CDNS_MCP_CMD_BASE ; + +for (i =0 ; i < num_resp; i++) { + cdns->response_buf[i] =cdns_readl (cdns, cmd_base); + cmd_base +=CDNS_MCP_CMD_WORD_LEN ; + } +} +static enum sdw_command_response _cdns_xfer_msg (struct sdw_cdns *cdns,struct sdw_msg *msg,int cmd,int offset,int count,bool defer)
@@ -552,6 +575,10 @@ _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,dev_err (cdns->dev,"IO transfer timed out, cmd %d device %d addr %x len %d\n" , cmd, msg->dev_num, msg->addr, msg->len); msg->len =0 ; + +/* Drain anything in the RX_FIFO */ +cdns_read_response (cdns); +return SDW_CMD_TIMEOUT ; }
@@ -720,29 +747,6 @@ EXPORT_SYMBOL(cdns_reset_page_addr);* IRQ handling */ -static void cdns_read_response (struct sdw_cdns *cdns) -{ -u32 num_resp, cmd_base; -int i; - -/* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */ -BUILD_BUG_ON (ARRAY_SIZE (cdns->response_buf) <CDNS_MCP_CMD_LEN +2 ); - - num_resp =cdns_readl (cdns,CDNS_MCP_FIFOSTAT ); - num_resp &=CDNS_MCP_RX_FIFO_AVAIL ; -if (num_resp >ARRAY_SIZE (cdns->response_buf)) { -dev_warn (cdns->dev,"RX AVAIL %d too long\n" , num_resp); - num_resp =ARRAY_SIZE (cdns->response_buf); - } - - cmd_base =CDNS_MCP_CMD_BASE ; - -for (i =0 ; i < num_resp; i++) { - cdns->response_buf[i] =cdns_readl (cdns, cmd_base); - cmd_base +=CDNS_MCP_CMD_WORD_LEN ; - } -} -static int cdns_update_slave_status (struct sdw_cdns *cdns,u32 slave0,u32 slave1) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 513/529 net: tls: avoid hanging tasks on the tx_lock
In reply to Greg Kroah-HartmanFrom: Jakub Kicinski <[email protected]>
commit f3221361dc85d4de22586ce8441ec2c67b454f5d upstream.
syzbot sent a hung task report and Eric explains that adversarial receiver may keep RWIN at 0 for a long time, so we are not guaranteed to make forward progress. Thread which took tx_lock and went to sleep may not release tx_lock for hours. Use interruptible sleep where possible and reschedule the work if it can't take the lock.
Testing: existing selftest passes
--- net/tls/tls_sw.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-)
net/tls/tls_sw.c +19 -7
@@ -949,7 +949,9 @@ int tls_sw_sendmsg(struct sock *sk, stru MSG_CMSG_COMPAT))return -EOPNOTSUPP ; -mutex_lock (&tls_ctx->tx_lock); + ret =mutex_lock_interruptible (&tls_ctx->tx_lock); +if (ret) +return ret;lock_sock (sk);if (unlikely (msg->msg_controllen)) {
@@ -1283,7 +1285,9 @@ int tls_sw_sendpage(struct sock *sk, str MSG_SENDPAGE_NOTLAST | MSG_SENDPAGE_NOPOLICY))return -EOPNOTSUPP ; -mutex_lock (&tls_ctx->tx_lock); + ret =mutex_lock_interruptible (&tls_ctx->tx_lock); +if (ret) +return ret;lock_sock (sk); ret =tls_sw_do_sendpage (sk, page, offset, size, flags);release_sock (sk);
@@ -2266,11 +2270,19 @@ static void tx_work_handler(struct work_if (!test_and_clear_bit (BIT_TX_SCHEDULED , &ctx->tx_bitmask))return ; -mutex_lock (&tls_ctx->tx_lock); -lock_sock (sk); -tls_tx_records (sk,-1 ); -release_sock (sk); -mutex_unlock (&tls_ctx->tx_lock); + +if (mutex_trylock (&tls_ctx->tx_lock)) { +lock_sock (sk); +tls_tx_records (sk,-1 ); +release_sock (sk); +mutex_unlock (&tls_ctx->tx_lock); + }else if (!test_and_set_bit (BIT_TX_SCHEDULED , &ctx->tx_bitmask)) { +/* Someone is holding the tx_lock, they will likely run Tx +* and cancel the work on their way out of the lock section. +* Schedule a long delay just in case. +*/ +schedule_delayed_work (&ctx->tx_work.work,msecs_to_jiffies (10 )); + } }void tls_sw_write_space (struct sock *sk,struct tls_context *ctx)
Greg Kroah-Hartman
maintainerPATCH 514/529 x86/resctrl: Apply READ_ONCE/WRITE_ONCE to task_struct.{rmid,closid}
In reply to Greg Kroah-HartmanFrom: Valentin Schneider <[email protected]>
commit 6d3b47ddffed70006cf4ba360eef61e9ce097d8f upstream.
A CPU's current task can have its {closid, rmid} fields read locally while they are being concurrently written to from another CPU. This can happen anytime __resctrl_sched_in() races with either __rdtgroup_move_task() or rdt_move_group_tasks().
Prevent load / store tearing for those accesses by giving them the READ_ONCE() / WRITE_ONCE() treatment.
--- arch/x86/include/asm/resctrl.h | 11 +++++++---- arch/x86/kernel/cpu/resctrl/rdtgroup.c | 10 +++++----- 2 files changed, 12 insertions(+), 9 deletions(-)
arch/x86/include/asm/resctrl.h +7 -4
@@ -56,19 +56,22 @@ static void __resctrl_sched_in(void)struct resctrl_pqr_state *state =this_cpu_ptr (&pqr_state);u32 closid = state->default_closid;u32 rmid = state->default_rmid; +u32 tmp;/* * If this task has a closid/rmid assigned, use it. * Else use the closid/rmid assigned to this cpu. */ if (static_branch_likely (&rdt_alloc_enable_key)) { -if (current->closid) - closid = current->closid; + tmp =READ_ONCE (current->closid); +if (tmp) + closid = tmp; }if (static_branch_likely (&rdt_mon_enable_key)) { -if (current->rmid) - rmid = current->rmid; + tmp =READ_ONCE (current->rmid); +if (tmp) + rmid = tmp; }if (closid != state->cur_closid || rmid != state->cur_rmid) {
arch/x86/kernel/cpu/resctrl/rdtgroup.c +5 -5
@@ -563,11 +563,11 @@ static int __rdtgroup_move_task(struct t*/ if (rdtgrp->type ==RDTCTRL_GROUP ) { - tsk->closid = rdtgrp->closid; - tsk->rmid = rdtgrp->mon.rmid; +WRITE_ONCE (tsk->closid, rdtgrp->closid); +WRITE_ONCE (tsk->rmid, rdtgrp->mon.rmid); }else if (rdtgrp->type ==RDTMON_GROUP ) {if (rdtgrp->mon.parent->closid == tsk->closid) { - tsk->rmid = rdtgrp->mon.rmid; +WRITE_ONCE (tsk->rmid, rdtgrp->mon.rmid); }else {rdt_last_cmd_puts ("Can't move task to different control group\n" );return -EINVAL ;
@@ -2312,8 +2312,8 @@ static void rdt_move_group_tasks(structfor_each_process_thread (p, t) {if (!from ||is_closid_match (t, from) ||is_rmid_match (t, from)) { - t->closid = to->closid; - t->rmid = to->mon.rmid; +WRITE_ONCE (t->closid, to->closid); +WRITE_ONCE (t->rmid, to->mon.rmid);/* * Order the closid/rmid stores above before the loads
Greg Kroah-Hartman
maintainerPATCH 515/529 x86/resctl: fix scheduler confusion with current
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 7fef099702527c3b2c5234a2ea6a24411485a13a upstream.
The implementation of 'current' on x86 is very intentionally special: it is a very common thing to look up, and it uses 'this_cpu_read_stable()' to get the current thread pointer efficiently from per-cpu storage.
And the keyword in there is 'stable': the current thread pointer never changes as far as a single thread is concerned. Even if when a thread is preempted, or moved to another CPU, or even across an explicit call 'schedule()' that thread will still have the same value for 'current'.
It is, after all, the kernel base pointer to thread-local storage. That's why it's stable to begin with, but it's also why it's important enough that we have that special 'this_cpu_read_stable()' access for it.
So this is all done very intentionally to allow the compiler to treat 'current' as a value that never visibly changes, so that the compiler can do CSE and combine multiple different 'current' accesses into one.
However, there is obviously one very special situation when the currently running thread does actually change: inside the scheduler itself.
So the scheduler code paths are special, and do not have a 'current' thread at all. Instead there are _two_ threads: the previous and the next thread - typically called 'prev' and 'next' (or prev_p/next_p) internally.
So this is all actually quite straightforward and simple, and not all that complicated.
Except for when you then have special code that is run in scheduler context, that code then has to be aware that 'current' isn't really a valid thing. Did you mean 'prev'? Did you mean 'next'?
In fact, even if then look at the code, and you use 'current' after the new value has been assigned to the percpu variable, we have explicitly told the compiler that 'current' is magical and always stable. So the compiler is quite free to use an older (or newer) value of 'current', and the actual assignment to the percpu storage is not relevant even if it might look that way.
Which is exactly what happened in the resctl code, that blithely used 'current' in '__resctrl_sched_in()' when it really wanted the new process state (as implied by the name: we're scheduling 'into' that new resctl state). And clang would end up just using the old thread pointer value at least in some configurations.
This could have happened with gcc too, and purely depends on random compiler details. Clang just seems to have been more aggressive about moving the read of the per-cpu current_task pointer around.
The fix is trivial: just make the resctl code adhere to the scheduler rules of using the prev/next thread pointer explicitly, instead of using 'current' in a situation where it just wasn't valid.
That same code is then also used outside of the scheduler context (when a thread resctl state is explicitly changed), and then we will just pass in 'current' as that pointer, of course. There is no ambiguity in that case.
The fix may be trivial, but noticing and figuring out what went wrong was not. The credit for that goes to Stephane Eranian.
--- arch/x86/include/asm/resctrl.h | 12 ++++++------ arch/x86/kernel/cpu/resctrl/rdtgroup.c | 4 ++-- arch/x86/kernel/process_32.c | 2 +- arch/x86/kernel/process_64.c | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-)
arch/x86/include/asm/resctrl.h +6 -6
@@ -51,7 +51,7 @@ DECLARE_STATIC_KEY_FALSE(rdt_mon_enable_* simple as possible. * Must be called with preemption disabled. */ -static void __resctrl_sched_in (void ) +static inline void __resctrl_sched_in (struct task_struct *tsk) {struct resctrl_pqr_state *state =this_cpu_ptr (&pqr_state);u32 closid = state->default_closid;
@@ -63,13 +63,13 @@ static void __resctrl_sched_in(void)* Else use the closid/rmid assigned to this cpu. */ if (static_branch_likely (&rdt_alloc_enable_key)) { - tmp =READ_ONCE (current->closid); + tmp =READ_ONCE (tsk->closid);if (tmp) closid = tmp; }if (static_branch_likely (&rdt_mon_enable_key)) { - tmp =READ_ONCE (current->rmid); + tmp =READ_ONCE (tsk->rmid);if (tmp) rmid = tmp; }
@@ -81,17 +81,17 @@ static void __resctrl_sched_in(void) } } -static inline void resctrl_sched_in (void ) +static inline void resctrl_sched_in (struct task_struct *tsk) {if (static_branch_likely (&rdt_enable_key)) -__resctrl_sched_in (); +__resctrl_sched_in (tsk); }void resctrl_cpu_detect (struct cpuinfo_x86 *c);#else -static inline void resctrl_sched_in (void ) {} +static inline void resctrl_sched_in (struct task_struct *tsk) {}static inline void resctrl_cpu_detect (struct cpuinfo_x86 *c) {}#endif /* CONFIG_X86_CPU_RESCTRL */
arch/x86/kernel/cpu/resctrl/rdtgroup.c +2 -2
@@ -311,7 +311,7 @@ static void update_cpu_closid_rmid(void* executing task might have its own closid selected. Just reuse * the context switch code. */ -resctrl_sched_in (); +resctrl_sched_in (current); }/*
@@ -532,7 +532,7 @@ static void _update_task_closid_rmid(voi* Otherwise, the MSR is updated when the task is scheduled in. */ if (task == current) -resctrl_sched_in (); +resctrl_sched_in (task); }static void update_task_closid_rmid (struct task_struct *t)
arch/x86/kernel/process_32.c +1 -1
@@ -214,7 +214,7 @@ __switch_to(struct task_struct *prev_p,switch_fpu_finish (next_p);/* Load the Intel cache allocation PQR MSR. */ -resctrl_sched_in (); +resctrl_sched_in (next_p);return prev_p; }
arch/x86/kernel/process_64.c +1 -1
@@ -629,7 +629,7 @@ __switch_to(struct task_struct *prev_p, }/* Load the Intel cache allocation PQR MSR. */ -resctrl_sched_in (); +resctrl_sched_in (next_p);return prev_p; }
Greg Kroah-Hartman
maintainerPATCH 516/529 drm/display/dp_mst: Fix down/up message handling after sink disconnect
In reply to Greg Kroah-HartmanFrom: Imre Deak <[email protected]>
commit 1d082618bbf3b6755b8cc68c0a8122af2842d593 upstream.
If the sink gets disconnected during receiving a multi-packet DP MST AUX down-reply/up-request sideband message, the state keeping track of which packets have been received already is not reset. This results in a failed sanity check for the subsequent message packet received after a sink is reconnected (due to the pending message not yet completed with an end-of-message-transfer packet), indicated by the
"sideband msg set header failed"
error.
Fix the above by resetting the up/down message reception state after a disconnect event.
--- drivers/gpu/drm/drm_dp_mst_topology.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/drm_dp_mst_topology.c +3 -0
@@ -3769,6 +3769,9 @@ int drm_dp_mst_topology_mgr_set_mst(struset_bit (0 , &mgr->payload_mask); mgr->vcpi_mask =0 ; mgr->payload_id_table_cleared = false; + +memset (&mgr->down_rep_recv,0 ,sizeof (mgr->down_rep_recv)); +memset (&mgr->up_req_recv,0 ,sizeof (mgr->up_req_recv)); } out_unlock:
Greg Kroah-Hartman
maintainerPATCH 517/529 drm/display/dp_mst: Fix down message handling after a packet reception error
In reply to Greg Kroah-HartmanFrom: Imre Deak <[email protected]>
commit 1241aedb6b5c7a5a8ad73e5eb3a41cfe18a3e00e upstream.
After an error during receiving a packet for a multi-packet DP MST sideband message, the state tracking which packets have been received already is not reset. This prevents the reception of subsequent down messages (due to the pending message not yet completed with an end-of-message-transfer packet).
Fix the above by resetting the reception state after a packet error.
--- drivers/gpu/drm/drm_dp_mst_topology.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_dp_mst_topology.c +1 -1
@@ -3988,7 +3988,7 @@ static int drm_dp_mst_handle_down_rep(ststruct drm_dp_sideband_msg_rx *msg = &mgr->down_rep_recv;if (!drm_dp_get_one_sb_msg (mgr, false, &mstb)) - goto out; + goto out_clear_reply;/* Multi-packet message transmission, don't clear the reply */ if (!msg->have_eomt)
Greg Kroah-Hartman
maintainerPATCH 518/529 Bluetooth: hci_sock: purge socket queues in the destruct() callback
In reply to Greg Kroah-HartmanFrom: Nguyen Dinh Phi <[email protected]>
commit 709fca500067524381e28a5f481882930eebac88 upstream.
The receive path may take the socket right before hci_sock_release(), but it may enqueue the packets to the socket queues after the call to skb_queue_purge(), therefore the socket can be destroyed without clear its queues completely.
Moving these skb_queue_purge() to the hci_sock_destruct() will fix this issue, because nothing is referencing the socket at this point.
--- net/bluetooth/hci_sock.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
net/bluetooth/hci_sock.c +7 -4
@@ -888,10 +888,6 @@ static int hci_sock_release(struct socke }sock_orphan (sk); - -skb_queue_purge (&sk->sk_receive_queue); -skb_queue_purge (&sk->sk_write_queue); -release_sock (sk);sock_put (sk);return 0 ;
@@ -2012,6 +2008,12 @@ done:return err; } +static void hci_sock_destruct (struct sock *sk) +{ +skb_queue_purge (&sk->sk_receive_queue); +skb_queue_purge (&sk->sk_write_queue); +} +static const struct proto_ops hci_sock_ops = { .family =PF_BLUETOOTH , .owner =THIS_MODULE ,
@@ -2065,6 +2067,7 @@ static int hci_sock_create(struct net *n sock->state =SS_UNCONNECTED ; sk->sk_state =BT_OPEN ; + sk->sk_destruct = hci_sock_destruct;bt_sock_link (&hci_sk_list, sk);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 519/529 tcp: Fix listen() regression in 5.10.163
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
commit fdaf88531cfd17b2a710cceb3141ef6f9085ff40 upstream.
When we backport dadd0dcaa67d ("net/ulp: prevent ULP without clone op from entering the LISTEN status"), we have accidentally backported a part of 7a7160edf1bf ("net: Return errno in sk->sk_prot->get_port().") and removed err = -EADDRINUSE in inet_csk_listen_start().
Thus, listen() no longer returns -EADDRINUSE even if ->get_port() failed as reported in [0].
We set -EADDRINUSE to err just before ->get_port() to fix the regression.
[0]: https://lore.kernel.org/stable/[email protected]/
--- net/ipv4/inet_connection_sock.c | 1 + 1 file changed, 1 insertion(+)
net/ipv4/inet_connection_sock.c +1 -0
@@ -946,6 +946,7 @@ int inet_csk_listen_start(struct sock *s* It is OK, because this socket enters to hash table only * after validation is complete. */ + err = -EADDRINUSE ;inet_sk_state_store (sk,TCP_LISTEN );if (!sk->sk_prot->get_port (sk, inet->inet_num)) { inet->inet_sport =htons (inet->inet_num);
Greg Kroah-Hartman
maintainerPATCH 520/529 drm/virtio: Fix error code in virtio_gpu_object_shmem_init()
In reply to Greg Kroah-HartmanFrom: Harshit Mogalapalli <[email protected]>
In virtio_gpu_object_shmem_init() we are passing NULL to PTR_ERR, which is returning 0/success.
Fix this by storing error value in 'ret' variable before assigning shmem->pages to NULL.
Found using static analysis with Smatch.
--- drivers/gpu/drm/virtio/virtgpu_object.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/virtio/virtgpu_object.c +2 -1
@@ -159,8 +159,9 @@ static int virtio_gpu_object_shmem_init( shmem->pages =drm_gem_shmem_get_sg_table (&bo->base.base);if (IS_ERR (shmem->pages)) {drm_gem_shmem_unpin (&bo->base.base); + ret =PTR_ERR (shmem->pages); shmem->pages =NULL ; -return PTR_ERR (shmem->pages); +return ret; }if (use_dma_api) {
Greg Kroah-Hartman
maintainerPATCH 521/529 media: uvcvideo: Provide sync and async uvc_ctrl_status_event
In reply to Greg Kroah-HartmanFrom: Ricardo Ribalda <[email protected]>
commit d9c8763e61295be0a21dc04ad9c379d5d17c3d86 upstream.
Split the functionality of void uvc_ctrl_status_event_work in two, so it can be called by functions outside interrupt context and not part of an URB.
--- drivers/media/usb/uvc/uvc_ctrl.c | 25 +++++++++++++++---------- drivers/media/usb/uvc/uvc_status.c | 3 ++- drivers/media/usb/uvc/uvcvideo.h | 4 +++- 3 files changed, 20 insertions(+), 12 deletions(-)
drivers/media/usb/uvc/uvc_ctrl.c +15 -10
@@ -1275,17 +1275,12 @@ static void uvc_ctrl_send_slave_event(stuvc_ctrl_send_event (chain, handle, ctrl, mapping, val, changes); } -static void uvc_ctrl_status_event_work (struct work_struct *work) +void uvc_ctrl_status_event (struct uvc_video_chain *chain, +struct uvc_control *ctrl,const u8 *data) { - struct uvc_device *dev = container_of(work, struct uvc_device, - async_ctrl.work); -struct uvc_ctrl_work *w = &dev->async_ctrl; -struct uvc_video_chain *chain = w->chain;struct uvc_control_mapping *mapping; -struct uvc_control *ctrl = w->ctrl;struct uvc_fh *handle;unsigned int i; -int ret;mutex_lock (&chain->ctrl_mutex);
@@ -1293,7 +1288,7 @@ static void uvc_ctrl_status_event_work(s ctrl->handle =NULL ;list_for_each_entry (mapping, &ctrl->info.mappings, list) { -s32 value =__uvc_ctrl_get_value (mapping, w->data); +s32 value =__uvc_ctrl_get_value (mapping, data);/* * handle may be NULL here if the device sends auto-update
@@ -1312,6 +1307,16 @@ static void uvc_ctrl_status_event_work(s }mutex_unlock (&chain->ctrl_mutex); +} + +static void uvc_ctrl_status_event_work (struct work_struct *work) +{ + struct uvc_device *dev = container_of(work, struct uvc_device, + async_ctrl.work); +struct uvc_ctrl_work *w = &dev->async_ctrl; +int ret; + +uvc_ctrl_status_event (w->chain, w->ctrl, w->data);/* Resubmit the URB. */ w->urb->interval = dev->int_ep->desc.bInterval;
@@ -1321,8 +1326,8 @@ static void uvc_ctrl_status_event_work(s ret); } -bool uvc_ctrl_status_event (struct urb *urb,struct uvc_video_chain *chain, -struct uvc_control *ctrl,const u8 *data) +bool uvc_ctrl_status_event_async (struct urb *urb,struct uvc_video_chain *chain, +struct uvc_control *ctrl,const u8 *data) {struct uvc_device *dev = chain->dev;struct uvc_ctrl_work *w = &dev->async_ctrl;
drivers/media/usb/uvc/uvc_status.c +2 -1
@@ -179,7 +179,8 @@ static bool uvc_event_control(struct urbswitch (status->bAttribute) {case UVC_CTRL_VALUE_CHANGE : -return uvc_ctrl_status_event (urb, chain, ctrl, status->bValue); +return uvc_ctrl_status_event_async (urb, chain, ctrl, + status->bValue);case UVC_CTRL_INFO_CHANGE :case UVC_CTRL_FAILURE_CHANGE :
drivers/media/usb/uvc/uvcvideo.h +3 -1
@@ -839,7 +839,9 @@ int uvc_ctrl_add_mapping(struct uvc_videint uvc_ctrl_init_device (struct uvc_device *dev);void uvc_ctrl_cleanup_device (struct uvc_device *dev);int uvc_ctrl_restore_values (struct uvc_device *dev); -bool uvc_ctrl_status_event (struct urb *urb,struct uvc_video_chain *chain, +bool uvc_ctrl_status_event_async (struct urb *urb,struct uvc_video_chain *chain, +struct uvc_control *ctrl,const u8 *data); +void uvc_ctrl_status_event (struct uvc_video_chain *chain,struct uvc_control *ctrl,const u8 *data);int uvc_ctrl_begin (struct uvc_video_chain *chain);
Greg Kroah-Hartman
maintainerPATCH 522/529 media: uvcvideo: Fix race condition with usb_kill_urb
In reply to Greg Kroah-HartmanFrom: Ricardo Ribalda <[email protected]>
commit 619d9b710cf06f7a00a17120ca92333684ac45a8 upstream.
usb_kill_urb warranties that all the handlers are finished when it returns, but does not protect against threads that might be handling asynchronously the urb.
For UVC, the function uvc_ctrl_status_event_async() takes care of control changes asynchronously.
If the code is executed in the following order:
CPU 0 CPU 1
===== =====uvc_status_complete()
uvc_status_stop()uvc_ctrl_status_event_work()
uvc_status_start() -> FAIL
Then uvc_status_start will keep failing and this error will be shown:
<4>[ 5.540139] URB 0000000000000000 submitted while active
drivers/usb/core/urb.c:378 usb_submit_urb+0x4c3/0x528
Let's improve the current situation, by not re-submiting the urb if we are stopping the status event. Also process the queued work (if any) during stop.
CPU 0 CPU 1
===== =====uvc_status_complete()
uvc_status_stop() uvc_status_start()uvc_ctrl_status_event_work() -> FAIL
Hopefully, with the usb layer protection this should be enough to cover all the cases.
--- drivers/media/usb/uvc/uvc_ctrl.c | 5 +++++ drivers/media/usb/uvc/uvc_status.c | 37 +++++++++++++++++++++++++++++++++++++ drivers/media/usb/uvc/uvcvideo.h | 1 + 3 files changed, 43 insertions(+)
drivers/media/usb/uvc/uvc_ctrl.c +5 -0
@@ -6,6 +6,7 @@* Laurent Pinchart ([email protected]) */ +#include <asm/barrier.h> #include <linux/kernel.h> #include <linux/list.h> #include <linux/module.h>
@@ -1318,6 +1319,10 @@ static void uvc_ctrl_status_event_work(suvc_ctrl_status_event (w->chain, w->ctrl, w->data); +/* The barrier is needed to synchronize with uvc_status_stop(). */ +if (smp_load_acquire (&dev->flush_status)) +return ; +/* Resubmit the URB. */ w->urb->interval = dev->int_ep->desc.bInterval; ret =usb_submit_urb (w->urb,GFP_KERNEL );
drivers/media/usb/uvc/uvc_status.c +37 -0
@@ -6,6 +6,7 @@* Laurent Pinchart ([email protected]) */ +#include <asm/barrier.h> #include <linux/kernel.h> #include <linux/input.h> #include <linux/slab.h>
@@ -310,5 +311,41 @@ int uvc_status_start(struct uvc_device *void uvc_status_stop (struct uvc_device *dev) { +struct uvc_ctrl_work *w = &dev->async_ctrl; + +/* +* Prevent the asynchronous control handler from requeing the URB. The +* barrier is needed so the flush_status change is visible to other +* CPUs running the asynchronous handler before usb_kill_urb() is +* called below. +*/ +smp_store_release (&dev->flush_status, true); + +/* +* Cancel any pending asynchronous work. If any status event was queued, +* process it synchronously. +*/ +if (cancel_work_sync (&w->work)) +uvc_ctrl_status_event (w->chain, w->ctrl, w->data); + +/* Kill the urb. */ usb_kill_urb (dev->int_urb); + +/* +* The URB completion handler may have queued asynchronous work. This +* won't resubmit the URB as flush_status is set, but it needs to be +* cancelled before returning or it could then race with a future +* uvc_status_start() call. +*/ +if (cancel_work_sync (&w->work)) +uvc_ctrl_status_event (w->chain, w->ctrl, w->data); + +/* +* From this point, there are no events on the queue and the status URB +* is dead. No events will be queued until uvc_status_start() is called. +* The barrier is needed to make sure that flush_status is visible to +* uvc_ctrl_status_event_work() when uvc_status_start() will be called +* again. +*/ +smp_store_release (&dev->flush_status, false); }
drivers/media/usb/uvc/uvcvideo.h +1 -0
@@ -670,6 +670,7 @@ struct uvc_device {/* Status Interrupt Endpoint */ struct usb_host_endpoint *int_ep;struct urb *int_urb; +bool flush_status;u8 *status;struct input_dev *input;char input_phys[64 ];
Greg Kroah-Hartman
maintainerPATCH 523/529 Revert "scsi: mpt3sas: Fix return value check of dma_get_required_mask()"
In reply to Greg Kroah-HartmanFrom: Salvatore Bonaccorso <[email protected]>
This reverts commit e0e0747de0ea3dd87cdbb0393311e17471a9baf1.
As noted in 1a2dcbdde82e ("scsi: mpt3sas: re-do lost mpt3sas DMA mask fix") in mainline there was a mis-merge in commit 62e6e5940c0c ("Merge tag 'scsi-misc' ofgit://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi"). causing that the fix needed to be redone later on again. To make series of patches apply cleanly to the stable series where e0e0747de0ea ("scsi: mpt3sas:
Fix return value check of dma_get_required_mask()") was backported, revert the aforementioned commit.
No upstream commit exists for this commit.
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +1 -1
@@ -2825,7 +2825,7 @@ _base_config_dma_addressing(struct MPT3Sif (ioc->is_mcpu_endpoint ||sizeof (dma_addr_t) ==4 || ioc->use_32bit_dma || -dma_get_required_mask (&pdev->dev) <=DMA_BIT_MASK (32 )) +dma_get_required_mask (&pdev->dev) <=32 ) ioc->dma_mask =32 ;/* Set 63 bit DMA mask for all SAS3 and SAS35 controllers */ else if (ioc->hba_mpi_version_belonged >MPI2_VERSION )
Greg Kroah-Hartman
maintainerPATCH 524/529 scsi: mpt3sas: Dont change DMA mask while reallocating pools
In reply to Greg Kroah-HartmanFrom: Sreekanth Reddy <[email protected]>
commit 9df650963bf6d6c2c3fcd325d8c44ca2b99554fe upstream.
When a pool crosses the 4GB boundary region then before reallocating pools change the coherent DMA mask to 32 bits and keep the normal DMA mask set to 63/64 bits.
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +14 -7
@@ -2822,19 +2822,26 @@ static int _base_config_dma_addressing(struct MPT3SAS_ADAPTER *ioc, struct pci_dev *pdev) { struct sysinfo s; +u64 coherent_dma_mask, dma_mask; -if (ioc->is_mcpu_endpoint || -sizeof (dma_addr_t) ==4 || ioc->use_32bit_dma || -dma_get_required_mask (&pdev->dev) <=32 ) +if (ioc->is_mcpu_endpoint ||sizeof (dma_addr_t) ==4 || +dma_get_required_mask (&pdev->dev) <=32 ) { ioc->dma_mask =32 ; + coherent_dma_mask = dma_mask =DMA_BIT_MASK (32 );/* Set 63 bit DMA mask for all SAS3 and SAS35 controllers */ -else if (ioc->hba_mpi_version_belonged >MPI2_VERSION ) + }else if (ioc->hba_mpi_version_belonged >MPI2_VERSION ) { ioc->dma_mask =63 ; -else + coherent_dma_mask = dma_mask =DMA_BIT_MASK (63 ); + }else { ioc->dma_mask =64 ; + coherent_dma_mask = dma_mask =DMA_BIT_MASK (64 ); + } -if (dma_set_mask (&pdev->dev,DMA_BIT_MASK (ioc->dma_mask)) || -dma_set_coherent_mask (&pdev->dev,DMA_BIT_MASK (ioc->dma_mask))) +if (ioc->use_32bit_dma) + coherent_dma_mask =DMA_BIT_MASK (32 ); + +if (dma_set_mask (&pdev->dev, dma_mask) || +dma_set_coherent_mask (&pdev->dev, coherent_dma_mask))return -ENODEV ;if (ioc->dma_mask >32 ) {
Greg Kroah-Hartman
maintainerPATCH 525/529 scsi: mpt3sas: re-do lost mpt3sas DMA mask fix
In reply to Greg Kroah-HartmanFrom: Sreekanth Reddy <[email protected]>
commit 1a2dcbdde82e3a5f1db9b2f4c48aa1aeba534fb2 upstream.
This is a re-do of commit e0e0747de0ea ("scsi: mpt3sas: Fix return value check of dma_get_required_mask()"), which I ended up undoing in a mis-merge in commit 62e6e5940c0c ("Merge tag 'scsi-misc' ofgit://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi").
The original commit message was
scsi: mpt3sas: Fix return value check of dma_get_required_mask()
Fix the incorrect return value check of dma_get_required_mask(). Due to this incorrect check, the driver was always setting the DMA mask to 63 bit.
and this fix was lost when I mis-merged the conflict with commit 9df650963bf6 ("scsi: mpt3sas: Don't change DMA mask while reallocating pools").
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +1 -1
@@ -2825,7 +2825,7 @@ _base_config_dma_addressing(struct MPT3Su64 coherent_dma_mask, dma_mask;if (ioc->is_mcpu_endpoint ||sizeof (dma_addr_t) ==4 || -dma_get_required_mask (&pdev->dev) <=32 ) { +dma_get_required_mask (&pdev->dev) <=DMA_BIT_MASK (32 )) { ioc->dma_mask =32 ; coherent_dma_mask = dma_mask =DMA_BIT_MASK (32 );/* Set 63 bit DMA mask for all SAS3 and SAS35 controllers */
Greg Kroah-Hartman
maintainerPATCH 526/529 scsi: mpt3sas: Remove usage of dma_get_required_mask() API
In reply to Greg Kroah-HartmanFrom: Sreekanth Reddy <[email protected]>
commit 06e472acf964649a58b7de35fc9cdc3151acb970 upstream.
Remove the usage of dma_get_required_mask() API. Directly set the DMA mask to 63/64 if the system is a 64bit machine.
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +1 -2
@@ -2824,8 +2824,7 @@ _base_config_dma_addressing(struct MPT3Sstruct sysinfo s;u64 coherent_dma_mask, dma_mask; -if (ioc->is_mcpu_endpoint ||sizeof (dma_addr_t) ==4 || -dma_get_required_mask (&pdev->dev) <=DMA_BIT_MASK (32 )) { +if (ioc->is_mcpu_endpoint ||sizeof (dma_addr_t) ==4 ) { ioc->dma_mask =32 ; coherent_dma_mask = dma_mask =DMA_BIT_MASK (32 );/* Set 63 bit DMA mask for all SAS3 and SAS35 controllers */
Greg Kroah-Hartman
maintainerPATCH 527/529 malidp: Fix NULL vs IS_ERR() checking
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
commit 15342f930ebebcfe36f2415049736a77d7d2e045 upstream.
The get_sg_table() function does not return NULL. It returns error pointers.
--- drivers/gpu/drm/arm/malidp_planes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/arm/malidp_planes.c +1 -1
@@ -348,7 +348,7 @@ static bool malidp_check_pages_thresholdelse sgt = obj->funcs->get_sg_table (obj); -if (!sgt) +if (IS_ERR (sgt))return false; sgl = sgt->sgl;
Greg Kroah-Hartman
maintainerPATCH 528/529 usb: gadget: uvc: fix missing mutex_unlock() if kstrtou8() fails
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
commit 7ebb605d2283fb2647b4fa82030307ce00bee436 upstream.
If kstrtou8() fails, the mutex_unlock() is missed, move kstrtou8() before mutex_lock() to fix it up.
--- drivers/usb/gadget/function/uvc_configfs.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/usb/gadget/function/uvc_configfs.c +4 -4
@@ -546,6 +546,10 @@ static ssize_t uvcg_default_output_b_souint result;u8 num; + result =kstrtou8 (page,0 , &num); +if (result) +return result; +mutex_lock (su_mutex);/* for navigating configfs hierarchy */ opts_item = group->cg_item.ci_parent->ci_parent->
@@ -553,10 +557,6 @@ static ssize_t uvcg_default_output_b_sou opts =to_f_uvc_opts (opts_item); cd = &opts->uvc_output_terminal; - result =kstrtou8 (page,0 , &num); -if (result) -return result; -mutex_lock (&opts->lock); cd->bSourceID = num;mutex_unlock (&opts->lock);
Greg Kroah-Hartman
maintainerPATCH 529/529 s390/dasd: add missing discipline function
In reply to Greg Kroah-HartmanFrom: Stefan Haberland <[email protected]>
commit c0c8a8397fa8a74d04915f4d3d28cb4a5d401427 upstream.
Fix crash with illegal operation exception in dasd_device_tasklet. Commit b72949328869 ("s390/dasd: Prepare for additional path event handling") renamed the verify_path function for ECKD but not for FBA and DIAG. This leads to a panic when the path verification function is called for a FBA or DIAG device.
Fix by defining a wrapper function for dasd_generic_verify_path().
--- drivers/s390/block/dasd_diag.c | 8 +++++++- drivers/s390/block/dasd_fba.c | 8 +++++++- drivers/s390/block/dasd_int.h | 1 - 3 files changed, 14 insertions(+), 3 deletions(-)
drivers/s390/block/dasd_diag.c +7 -1
@@ -642,12 +642,18 @@ static void dasd_diag_setup_blk_queue(stblk_queue_segment_boundary (q,PAGE_SIZE -1 ); } +static int dasd_diag_pe_handler (struct dasd_device *device, +__u8 tbvpm,__u8 fcsecpm) +{ +return dasd_generic_verify_path (device, tbvpm); +} +static struct dasd_discipline dasd_diag_discipline = { .owner =THIS_MODULE , .name ="DIAG" , .ebcname ="DIAG" , .check_device = dasd_diag_check_device, - .verify_path = dasd_generic_verify_path, + .pe_handler = dasd_diag_pe_handler, .fill_geometry = dasd_diag_fill_geometry, .setup_blk_queue = dasd_diag_setup_blk_queue, .start_IO = dasd_start_diag,
drivers/s390/block/dasd_fba.c +7 -1
@@ -803,13 +803,19 @@ static void dasd_fba_setup_blk_queue(strblk_queue_flag_set (QUEUE_FLAG_DISCARD , q); } +static int dasd_fba_pe_handler (struct dasd_device *device, +__u8 tbvpm,__u8 fcsecpm) +{ +return dasd_generic_verify_path (device, tbvpm); +} +static struct dasd_discipline dasd_fba_discipline = { .owner =THIS_MODULE , .name ="FBA " , .ebcname ="FBA " , .check_device = dasd_fba_check_characteristics, .do_analysis = dasd_fba_do_analysis, - .verify_path = dasd_generic_verify_path, + .pe_handler = dasd_fba_pe_handler, .setup_blk_queue = dasd_fba_setup_blk_queue, .fill_geometry = dasd_fba_fill_geometry, .start_IO = dasd_start_IO,
drivers/s390/block/dasd_int.h +0 -1
@@ -298,7 +298,6 @@ struct dasd_discipline {* e.g. verify that new path is compatible with the current * configuration. */ -int (*verify_path)(struct dasd_device *,__u8 );int (*pe_handler)(struct dasd_device *,__u8 );/*
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.173 release. There are 529 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 12 Mar 2023 13:36:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.173-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.10:
11 builds: 11 pass, 0 fail
28 boots: 28 pass, 0 fail
75 tests: 75 pass, 0 failLinux version: 5.10.173-rc1-g420427e5b0dd
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.173 release. There are 529 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 12 Mar 2023 13:36:38 +0000. Anything received after that time might be too late.
s390:
drivers/s390/block/dasd_diag.c:656:23: error: initialization of 'int (*)(struct dasd_device *, __u8)' {aka 'int (*)(struct dasd_device *, unsigned char)'} from incompatible pointer type 'int (*)(struct dasd_device *, __u8, __u8)' {aka 'int (*)(struct dasd_device *, unsigned char, unsigned char)'} [-Werror=incompatible-pointer-types]
656 | .pe_handler = dasd_diag_pe_handler,
This problem affects the v5.4.y and v5.10.y release candidates.
Guenter
Greg Kroah-Hartman
maintainerQuoted 10 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.173 release. There are 529 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 12 Mar 2023 13:36:38 +0000. Anything received after that time might be too late.
Quoted 6 lines
s390:
drivers/s390/block/dasd_diag.c:656:23: error: initialization of 'int (*)(structdasd_device*,__u8)' {aka 'int (*)(structdasd_device*, unsigned char)'} from incompatible pointer type 'int (*)(structdasd_device*,__u8,__u8)' {aka 'int (*)(structdasd_device*, unsigned char, unsigned char)'} [-Werror=incompatible-pointer-types]
656 | .pe_handler =dasd_diag_pe_handler,This problem affects the v5.4.y and v5.10.y release candidates.
Ick, ok, that's my fault, I'll drop the patch I half-backported for 5.4.y and 5.10.y and push out -rc2 versions with the fix.
thanks,
greg k-h
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.173 release. There are 529 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 12 Mar 2023 13:36:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.173-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.173 release. There are 529 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 12 Mar 2023 13:36:38 +0000. Anything received after that time might be too late.
Build results:
total: 162 pass: 160 fail: 2 Failed builds: s390:defconfig s390:allmodconfig Qemu test results: total: 485 pass: 480 fail: 5
Failed tests:
s390:defconfig:nolocktests:smp2:net,default:initrd s390:defconfig:nolocktests:smp2:virtio-blk-ccw:net,virtio-net-pci:rootfs s390:defconfig:nolocktests:smp2:scsi[virtio-ccw]:net,default:rootfs s390:defconfig:nolocktests:virtio-pci:net,virtio-net-pci:rootfs s390:defconfig:nolocktests:scsi[virtio-pci]:net,default:rootfs
Failures as already reported.
Guenter
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.173 release. There are 529 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 12 Mar 2023 13:36:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.173-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
As others reported, s390 build regressions are noticed.
* s390, build failures
- clang-16-defconfig
- gcc-12-defconfig
- gcc-8-defconfig-fe40093d
## Build
* kernel: 5.10.173-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-5.10.y
* git commit: 420427e5b0dd499d0e1ba2ccbd30717bb5b36335
* git describe: v5.10.172-530-g420427e5b0dd
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.10.y/build/v5.10.172-530-g420427e5b0dd
## Test Regressions (compared to v5.10.172)
* s390, build
- clang-16-defconfig
- gcc-12-defconfig
- gcc-8-defconfig-fe40093d
## Metric Regressions (compared to v5.10.172)
## Test Fixes (compared to v5.10.172)
## Metric Fixes (compared to v5.10.172)
## Test result summary
total: 114034, pass: 92733, fail: 3011, skip: 18038, xfail: 252
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 112 total, 111 passed, 1 failed
* arm64: 39 total, 37 passed, 2 failed
* i386: 30 total, 28 passed, 2 failed
* mips: 24 total, 24 passed, 0 failed
* parisc: 6 total, 6 passed, 0 failed
* powerpc: 23 total, 18 passed, 5 failed
* riscv: 9 total, 9 passed, 0 failed
* s390: 9 total, 6 passed, 3 failed
* sh: 12 total, 12 passed, 0 failed
* sparc: 6 total, 6 passed, 0 failed
* x86_64: 33 total, 31 passed, 2 failed
## Test suites summary
* boot
* fwts
* kselftest-android
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers-dma-buf
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-firmware
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-net-forwarding
* kselftest-net-mptcp
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-cap_bounds
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-filecaps
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-fsx
* ltp-hugetlb
* ltp-io
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-open-posix-tests
* ltp-pty
* ltp-sched
* ltp-securebits
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* network-basic-tests
* packetdrill
* perf
* rcutorture
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.173 release. There are 529 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 12 Mar 2023 13:36:38 +0000. Anything received after that time might be too late.
Build test (gcc version 11.3.1 20230210):
mips: 63 configs -> no failure
arm: 104 configs -> no failure
arm64: 3 configs -> no failurex86_64: 4 configs -> no failure alpha allmodconfig -> no failure powerpc allmodconfig -> no failure riscv allmodconfig -> no failure s390 allmodconfig -> failure
xtensa allmodconfig -> no failure
Note:
s390 build failed with the error:drivers/s390/block/dasd_diag.c:656:23: error: initialization of 'int (*)(struct dasd_device *, __u8)' {aka 'int (*)(struct dasd_device *, unsigned char)'} from incompatible pointer type 'int (*)(struct dasd_device *, __u8, __u8)' {aka 'int (*)(struct dasd_device *, unsigned char, unsigned char)'} [-Werror=incompatible-pointer-types]
656 | .pe_handler = dasd_diag_pe_handler,
| ^~~~~~~~~~~~~~~~~~~~
drivers/s390/block/dasd_diag.c:656:23: note: (near initialization for 'dasd_diag_discipline.pe_handler')
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
arm64: Booted on rpi4b (4GB model). No regression. [2]
[1]. https://openqa.qa.codethink.co.uk/tests/3079
[2]. https://openqa.qa.codethink.co.uk/tests/3083
Signature · 2 lines
Regards Sudip
Greg Kroah-Hartman
maintainerQuoted 22 lines · Sudip Mukherjee
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.173 release. There are 529 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun, 12 Mar 2023 13:36:38 +0000. Anything received after that time might be too late.
Build test (gcc version 11.3.1 20230210):
mips: 63 configs -> no failure
arm: 104 configs -> no failure
arm64: 3 configs -> no failurex86_64: 4 configs -> no failure alpha allmodconfig -> no failure powerpc allmodconfig -> no failure riscv allmodconfig -> no failure s390 allmodconfig -> failure
xtensa allmodconfig -> no failure
Quoted 6 lines
Note:
s390 build failed with the error:drivers/s390/block/dasd_diag.c:656:23: error: initialization of 'int (*)(structdasd_device*,__u8)' {aka 'int (*)(structdasd_device*, unsigned char)'} from incompatible pointer type 'int (*)(structdasd_device*,__u8,__u8)' {aka 'int (*)(structdasd_device*, unsigned char, unsigned char)'} [-Werror=incompatible-pointer-types]
656 | .pe_handler =dasd_diag_pe_handler,| ^~~~~~~~~~~~~~~~~~~~
drivers/s390/block/dasd_diag.c:656:23: note: (near initialization for 'dasd_diag_discipline.pe_handler')
Should be fixed in -rc2.
thanks,
greg k-h