6.10.10-rc1 review
Subsystems (8)
Greg Kroah-Hartman
maintainerPATCH 271/375 lib/generic-radix-tree.c: Fix rare race in __genradix_ptr_alloc()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kent Overstreet <[email protected]>
[ Upstream commit b2f11c6f3e1fc60742673b8675c95b78447f3dae ]
If we need to increase the tree depth, allocate a new node, and then race with another thread that increased the tree depth before us, we'll still have a preallocated node that might be used later.
If we then use that node for a new non-root node, it'll still have a pointer to the old root instead of being zeroed - fix this by zeroing it in the cmpxchg failure path.
--- lib/generic-radix-tree.c | 2 ++ 1 file changed, 2 insertions(+)
lib/generic-radix-tree.c +2 -0
@@ -121,6 +121,8 @@ void *__genradix_ptr_alloc(struct __genradix *radix, size_t offset,if ((v =cmpxchg_release (&radix->root, r, new_root)) == r) { v = new_root; new_node =NULL ; + }else { + new_node->children[0 ] =NULL ; } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 272/375 net: hns3: void array out of bound when loop tnl_num
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peiyang Wang <[email protected]>
[ Upstream commit 86db7bfb06704ef17340eeae71c832f21cfce35c ]
When query reg inf of SSU, it loops tnl_num times. However, tnl_num comes from hardware and the length of array is a fixed value. To void array out of bound, make sure the loop time is not greater than the length of array
--- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c +3 -3
@@ -1598,8 +1598,7 @@ static void hclge_query_reg_info_of_ssu(struct hclge_dev *hdev) {u32 loop_para[HCLGE_MOD_MSG_PARA_ARRAY_MAX_SIZE ] = {0 };struct hclge_mod_reg_common_msg msg; -u8 i, j, num; -u32 loop_time; +u8 i, j, num, loop_time; num =ARRAY_SIZE (hclge_ssu_reg_common_msg);for (i =0 ; i < num; i++) {
@@ -1609,7 +1608,8 @@ static void hclge_query_reg_info_of_ssu(struct hclge_dev *hdev) loop_time =1 ; loop_para[0 ] =0 ;if (msg.need_para) { - loop_time = hdev->ae_dev->dev_specs.tnl_num; + loop_time =min (hdev->ae_dev->dev_specs.tnl_num, +HCLGE_MOD_MSG_PARA_ARRAY_MAX_SIZE );for (j =0 ; j < loop_time; j++) loop_para[j] = j +1 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 273/375 kunit/overflow: Fix UB in overflow_allocation_test
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Orlov <[email protected]>
[ Upstream commit 92e9bac18124682c4b99ede9ee3bcdd68f121e92 ]
The 'device_name' array doesn't exist out of the 'overflow_allocation_test' function scope. However, it is being used as a driver name when calling 'kunit_driver_create' from 'kunit_device_register'. It produces the kernel panic with KASAN enabled.
Since this variable is used in one place only, remove it and pass the device name into kunit_device_register directly as an ascii string.
--- lib/overflow_kunit.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
lib/overflow_kunit.c +1 -2
@@ -668,7 +668,6 @@ DEFINE_TEST_ALLOC(devm_kzalloc, devm_kfree, 1, 1, 0);static void overflow_allocation_test (struct kunit *test) { -const char device_name[] ="overflow-test" ;struct device *dev;int count =0 ;
@@ -678,7 +677,7 @@ static void overflow_allocation_test(struct kunit *test) }while (0 )/* Create dummy device for devm_kmalloc()-family tests. */ - dev =kunit_device_register (test, device_name); + dev =kunit_device_register (test,"overflow-test" );KUNIT_ASSERT_FALSE_MSG (test,IS_ERR (dev),"Cannot register test device\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 274/375 MIPS: cevt-r4k: Dont call get_c0_compare_int if timer irq is installed
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiaxun Yang <[email protected]>
[ Upstream commit 50f2b98dc83de7809a5c5bf0ccf9af2e75c37c13 ]
This avoids warning:
[ 0.118053] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:283
Caused by get_c0_compare_int on secondary CPU.
We also skipped saving IRQ number to struct clock_event_device *cd as it's never used by clockevent core, as per comments it's only meant for "non CPU local devices".
--- arch/mips/kernel/cevt-r4k.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
arch/mips/kernel/cevt-r4k.c +7 -8
@@ -303,13 +303,6 @@ int r4k_clockevent_init(void)if (!c0_compare_int_usable ())return -ENXIO ; -/* -* With vectored interrupts things are getting platform specific. -* get_c0_compare_int is a hook to allow a platform to return the -* interrupt number of its liking. -*/ - irq =get_c0_compare_int (); - cd = &per_cpu (mips_clockevent_device, cpu); cd->name ="MIPS" ;
@@ -320,7 +313,6 @@ int r4k_clockevent_init(void) min_delta =calculate_min_delta (); cd->rating =300 ; - cd->irq = irq; cd->cpumask =cpumask_of (cpu); cd->set_next_event = mips_next_event; cd->event_handler = mips_event_handler;
@@ -332,6 +324,13 @@ int r4k_clockevent_init(void) cp0_timer_irq_installed =1 ; +/* +* With vectored interrupts things are getting platform specific. +* get_c0_compare_int is a hook to allow a platform to return the +* interrupt number of its liking. +*/ + irq =get_c0_compare_int (); +if (request_irq (irq, c0_compare_interrupt, flags,"timer" , c0_compare_interrupt))pr_err ("Failed to request irq %d (timer)\n" , irq);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 275/375 spi: spi-fsl-lpspi: limit PRESCALE bit in TCR register
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carlos Song <[email protected]>
[ Upstream commit 783bf5d09f86b9736605f3e01a3472e55ef98ff8 ]
Referring to the errata ERR051608 of I.MX93, LPSPI TCR[PRESCALE] can only be configured to be 0 or 1, other values are not valid and will cause LPSPI to not work.
Add the prescale limitation for LPSPI in I.MX93. Other platforms are not affected.
--- drivers/spi/spi-fsl-lpspi.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-)
drivers/spi/spi-fsl-lpspi.c +29 -2
@@ -82,6 +82,10 @@#define TCR_RXMSK BIT(19)#define TCR_TXMSK BIT(18) +struct fsl_lpspi_devtype_data { +u8 prescale_max; +}; +struct lpspi_config {u8 bpw;u8 chip_select;
@@ -119,10 +123,25 @@ struct fsl_lpspi_data {bool usedma;struct completion dma_rx_completion;struct completion dma_tx_completion; + +const struct fsl_lpspi_devtype_data *devtype_data; +}; + +/* +* ERR051608 fixed or not: +* https://www.nxp.com/docs/en/errata/i.MX93_1P87f.pdf +*/ +static struct fsl_lpspi_devtype_data imx93_lpspi_devtype_data = { + .prescale_max =1 , +}; + +static struct fsl_lpspi_devtype_data imx7ulp_lpspi_devtype_data = { + .prescale_max =8 , };static const struct of_device_id fsl_lpspi_dt_ids[] = { - { .compatible ="fsl,imx7ulp-spi" , }, + { .compatible ="fsl,imx7ulp-spi" , .data = &imx7ulp_lpspi_devtype_data,}, + { .compatible ="fsl,imx93-spi" , .data = &imx93_lpspi_devtype_data,}, {/* sentinel */ } };MODULE_DEVICE_TABLE (of, fsl_lpspi_dt_ids);
@@ -297,9 +316,11 @@ static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi) {struct lpspi_config config = fsl_lpspi->config;unsigned int perclk_rate, scldiv, div; +u8 prescale_max;u8 prescale; perclk_rate =clk_get_rate (fsl_lpspi->clk_per); + prescale_max = fsl_lpspi->devtype_data->prescale_max;if (!config.speed_hz) { dev_err(fsl_lpspi->dev,
@@ -315,7 +336,7 @@ static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi) div =DIV_ROUND_UP (perclk_rate, config.speed_hz); -for (prescale =0 ; prescale <8 ; prescale++) { +for (prescale =0 ; prescale < prescale_max; prescale++) { scldiv = div / (1 << prescale) -2 ;if (scldiv <256 ) { fsl_lpspi->config.prescale = prescale;
@@ -822,6 +843,7 @@ static int fsl_lpspi_init_rpm(struct fsl_lpspi_data *fsl_lpspi)static int fsl_lpspi_probe (struct platform_device *pdev) { +const struct fsl_lpspi_devtype_data *devtype_data;struct fsl_lpspi_data *fsl_lpspi;struct spi_controller *controller;struct resource *res;
@@ -830,6 +852,10 @@ static int fsl_lpspi_probe(struct platform_device *pdev)u32 temp;bool is_target; + devtype_data =of_device_get_match_data (&pdev->dev); +if (!devtype_data) +return -ENODEV ; + is_target =of_property_read_bool ((&pdev->dev)->of_node,"spi-slave" );if (is_target) controller = devm_spi_alloc_target(&pdev->dev,
@@ -848,6 +874,7 @@ static int fsl_lpspi_probe(struct platform_device *pdev) fsl_lpspi->is_target = is_target; fsl_lpspi->is_only_cs1 =of_property_read_bool ((&pdev->dev)->of_node,"fsl,spi-only-use-cs1-sel" ); + fsl_lpspi->devtype_data = devtype_data;init_completion (&fsl_lpspi->xfer_done);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 276/375 ata: pata_macio: Use WARN instead of BUG
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
[ Upstream commit d4bc0a264fb482b019c84fbc7202dd3cab059087 ]
The overflow/underflow conditions in pata_macio_qc_prep() should never happen. But if they do there's no need to kill the system entirely, a WARN and failing the IO request should be sufficient and might allow the system to keep running.
--- drivers/ata/pata_macio.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/ata/pata_macio.c +5 -2
@@ -554,7 +554,8 @@ static enum ata_completion_errors pata_macio_qc_prep(struct ata_queued_cmd *qc)while (sg_len) {/* table overflow should never happen */ -BUG_ON (pi++ >=MAX_DCMDS ); +if (WARN_ON_ONCE (pi >=MAX_DCMDS )) +return AC_ERR_SYSTEM ; len = (sg_len <MAX_DBDMA_SEG ) ? sg_len :MAX_DBDMA_SEG ; table->command =cpu_to_le16 (write ?OUTPUT_MORE :INPUT_MORE );
@@ -566,11 +567,13 @@ static enum ata_completion_errors pata_macio_qc_prep(struct ata_queued_cmd *qc) addr += len; sg_len -= len; ++table; + ++pi; } }/* Should never happen according to Tejun */ -BUG_ON (!pi); +if (WARN_ON_ONCE (!pi)) +return AC_ERR_SYSTEM ;/* Convert the last command to an input/output */ table--;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 277/375 smb/server: fix potential null-ptr-deref of lease_ctx_info in smb2_open()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: ChenXiaoSong <[email protected]>
[ Upstream commit 4e8771a3666c8f216eefd6bd2fd50121c6c437db ]
null-ptr-deref will occur when (req_op_level == SMB2_OPLOCK_LEVEL_LEASE) and parse_lease_state() return NULL.
Fix this by check if 'lease_ctx_info' is NULL.
Additionally, remove the redundant parentheses inparse_durable_handle_context().
--- fs/smb/server/oplock.c | 2 +- fs/smb/server/smb2pdu.c | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-)
fs/smb/server/oplock.c +1 -1
@@ -1510,7 +1510,7 @@ void create_lease_buf(u8 *rbuf, struct lease *lease)* parse_lease_state() - parse lease context containted in file open request * @open_req: buffer containing smb2 file open(create) request * -* Return: oplock state, -ENOENT if create lease context not found +* Return: allocated lease context object on success, otherwise NULL */ struct lease_ctx_info *parse_lease_state (void *open_req) {
fs/smb/server/smb2pdu.c +5 -5
@@ -2771,8 +2771,8 @@ static int parse_durable_handle_context(struct ksmbd_work *work, } } -if (((lc && (lc->req_state &SMB2_LEASE_HANDLE_CACHING_LE )) || - req_op_level ==SMB2_OPLOCK_LEVEL_BATCH )) { +if ((lc && (lc->req_state &SMB2_LEASE_HANDLE_CACHING_LE )) || + req_op_level ==SMB2_OPLOCK_LEVEL_BATCH ) { dh_info->CreateGuid = durable_v2_blob->CreateGuid; dh_info->persistent =
@@ -2792,8 +2792,8 @@ static int parse_durable_handle_context(struct ksmbd_work *work, goto out; } -if (((lc && (lc->req_state &SMB2_LEASE_HANDLE_CACHING_LE )) || - req_op_level ==SMB2_OPLOCK_LEVEL_BATCH )) { +if ((lc && (lc->req_state &SMB2_LEASE_HANDLE_CACHING_LE )) || + req_op_level ==SMB2_OPLOCK_LEVEL_BATCH ) {ksmbd_debug (SMB ,"Request for durable open\n" ); dh_info->type = dh_idx; }
@@ -3415,7 +3415,7 @@ int smb2_open(struct ksmbd_work *work) goto err_out1; } }else { -if (req_op_level ==SMB2_OPLOCK_LEVEL_LEASE ) { +if (req_op_level ==SMB2_OPLOCK_LEVEL_LEASE && lc) {if (S_ISDIR (file_inode (filp)->i_mode)) { lc->req_state &= ~SMB2_LEASE_WRITE_CACHING_LE ; lc->is_dir = true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 278/375 NFSv4: Add missing rescheduling points in nfs_client_return_marked_delegations
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit a017ad1313fc91bdf235097fd0a02f673fc7bb11 ]
We're seeing reports of soft lockups when iterating through the loops, so let's add rescheduling points.
--- fs/nfs/super.c | 2 ++ 1 file changed, 2 insertions(+)
fs/nfs/super.c +2 -0
@@ -47,6 +47,7 @@#include <linux/vfs.h> #include <linux/inet.h> #include <linux/in6.h> +#include <linux/sched.h> #include <linux/slab.h> #include <net/ipv6.h> #include <linux/netdevice.h>
@@ -228,6 +229,7 @@ static int __nfs_list_for_each_server(struct list_head *head, ret =fn (server, data);if (ret) goto out; +cond_resched ();rcu_read_lock (); }rcu_read_unlock ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 279/375 drm/amdgpu: Fix two reset triggered in a row
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunxiang Li <[email protected]>
[ Upstream commit f4322b9f8ad5f9f62add288c785d2e10bb6a5efe ]
Some times a hang GPU causes multiple reset sources to schedule resets. The second source will be able to trigger an unnecessary reset if they schedule after we call amdgpu_device_stop_pending_resets.
Move amdgpu_device_stop_pending_resets to after the reset is done. Since at this point the GPU is supposedly in a good state, any reset scheduled after this point would be a legitimate reset.
Remove unnecessary and incorrect checks for amdgpu_in_reset that was kinda serving this purpose.
Stable-dep-of: 6e4aa08fa9c6 ("drm/amdgpu: Fix amdgpu_device_reset_sriov retry logic")
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 19 ++++++++++--------- drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 2 +- drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | 2 +- drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c | 2 +- drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +10 -9
@@ -5072,8 +5072,6 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, retry:amdgpu_amdkfd_pre_reset (adev); -amdgpu_device_stop_pending_resets (adev); -if (from_hypervisor) r =amdgpu_virt_request_full_gpu (adev, true);else
@@ -5828,13 +5826,6 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev, r, adev_to_drm(tmp_adev)->unique); tmp_adev->asic_reset_res = r; } - -if (!amdgpu_sriov_vf (tmp_adev)) -/* -* Drop all pending non scheduler resets. Scheduler resets -* were already dropped during drm_sched_stop -*/ -amdgpu_device_stop_pending_resets (tmp_adev); }/* Actual ASIC resets if needed.*/
@@ -5856,6 +5847,16 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev, goto retry; } +list_for_each_entry (tmp_adev, device_list_handle, reset_list) { +/* +* Drop any pending non scheduler resets queued before reset is done. +* Any reset scheduled after this point would be valid. Scheduler resets +* were already dropped during drm_sched_stop and no new ones can come +* in before drm_sched_start. +*/ +amdgpu_device_stop_pending_resets (tmp_adev); + } + skip_hw_reset:/* Post ASIC reset for all devs .*/
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +1 -1
@@ -601,7 +601,7 @@ static void amdgpu_virt_update_vf2pf_work_item(struct work_struct *work)if (ret) { adev->virt.vf2pf_update_retry_cnt++;if ((adev->virt.vf2pf_update_retry_cnt >=AMDGPU_VF2PF_UPDATE_MAX_RETRY_LIMIT ) && -amdgpu_sriov_runtime (adev) && !amdgpu_in_reset (adev)) { +amdgpu_sriov_runtime (adev)) {amdgpu_ras_set_fed (adev, true);if (amdgpu_reset_domain_schedule (adev->reset_domain, &adev->kfd.reset_work))
drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c +1 -1
@@ -319,7 +319,7 @@ static int xgpu_ai_mailbox_rcv_irq(struct amdgpu_device *adev,switch (event) {case IDH_FLR_NOTIFICATION : -if (amdgpu_sriov_runtime (adev) && !amdgpu_in_reset (adev)) +if (amdgpu_sriov_runtime (adev)) WARN_ONCE(!amdgpu_reset_domain_schedule(adev->reset_domain, &adev->virt.flr_work), "Failed to queue work! at %s",
drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c +1 -1
@@ -358,7 +358,7 @@ static int xgpu_nv_mailbox_rcv_irq(struct amdgpu_device *adev,switch (event) {case IDH_FLR_NOTIFICATION : -if (amdgpu_sriov_runtime (adev) && !amdgpu_in_reset (adev)) +if (amdgpu_sriov_runtime (adev)) WARN_ONCE(!amdgpu_reset_domain_schedule(adev->reset_domain, &adev->virt.flr_work), "Failed to queue work! at %s",
drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c +1 -1
@@ -560,7 +560,7 @@ static int xgpu_vi_mailbox_rcv_irq(struct amdgpu_device *adev, r =xgpu_vi_mailbox_rcv_msg (adev,IDH_FLR_NOTIFICATION );/* only handle FLR_NOTIFY now */ -if (!r && !amdgpu_in_reset (adev)) +if (!r) WARN_ONCE(!amdgpu_reset_domain_schedule(adev->reset_domain, &adev->virt.flr_work), "Failed to queue work! at %s",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 280/375 drm/amdgpu: Add reset_context flag for host FLR
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunxiang Li <[email protected]>
[ Upstream commit 25c01191c2555351922e5515b6b6d31357975031 ]
There are other reset sources that pass NULL as the job pointer, such as amdgpu_amdkfd_reset_work. Therefore, using the job pointer to check if the FLR comes from the host does not work.
Add a flag in reset_context to explicitly mark host triggered reset, and set this flag when we receive host reset notification.
Stable-dep-of: 6e4aa08fa9c6 ("drm/amdgpu: Fix amdgpu_device_reset_sriov retry logic")
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 13 ++++++++----- drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h | 1 + drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | 1 + drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c | 1 + drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c | 1 + 5 files changed, 12 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +8 -5
@@ -5057,13 +5057,13 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev)* amdgpu_device_reset_sriov - reset ASIC for SR-IOV vf * * @adev: amdgpu_device pointer -* @from_hypervisor: request from hypervisor +* @reset_context: amdgpu reset context pointer * * do VF FLR and reinitialize Asic * return 0 means succeeded otherwise failed */ static int amdgpu_device_reset_sriov (struct amdgpu_device *adev, -bool from_hypervisor) +struct amdgpu_reset_context *reset_context) {int r;struct amdgpu_hive_info *hive =NULL ;
@@ -5072,12 +5072,15 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, retry:amdgpu_amdkfd_pre_reset (adev); -if (from_hypervisor) +if (test_bit (AMDGPU_HOST_FLR , &reset_context->flags)) { +clear_bit (AMDGPU_HOST_FLR , &reset_context->flags); r =amdgpu_virt_request_full_gpu (adev, true); -else + }else { r =amdgpu_virt_reset_gpu (adev); + }if (r)return r; +amdgpu_ras_set_fed (adev, false);amdgpu_irq_gpu_reset_resume_helper (adev);
@@ -5831,7 +5834,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,/* Actual ASIC resets if needed.*/ /* Host driver will handle XGMI hive reset for SRIOV */ if (amdgpu_sriov_vf (adev)) { - r =amdgpu_device_reset_sriov (adev, job ? false : true); + r =amdgpu_device_reset_sriov (adev, reset_context);if (r) adev->asic_reset_res = r;
drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h +1 -0
@@ -33,6 +33,7 @@ enum AMDGPU_RESET_FLAGS {AMDGPU_NEED_FULL_RESET =0 ,AMDGPU_SKIP_HW_RESET =1 ,AMDGPU_SKIP_COREDUMP =2 , + AMDGPU_HOST_FLR = 3, }; struct amdgpu_reset_context {
drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c +1 -0
@@ -292,6 +292,7 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work) reset_context.method =AMD_RESET_METHOD_NONE ; reset_context.reset_req_dev = adev;clear_bit (AMDGPU_NEED_FULL_RESET , &reset_context.flags); +set_bit (AMDGPU_HOST_FLR , &reset_context.flags);amdgpu_device_gpu_recover (adev,NULL , &reset_context); }
drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c +1 -0
@@ -328,6 +328,7 @@ static void xgpu_nv_mailbox_flr_work(struct work_struct *work) reset_context.method =AMD_RESET_METHOD_NONE ; reset_context.reset_req_dev = adev;clear_bit (AMDGPU_NEED_FULL_RESET , &reset_context.flags); +set_bit (AMDGPU_HOST_FLR , &reset_context.flags);amdgpu_device_gpu_recover (adev,NULL , &reset_context); }
drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c +1 -0
@@ -529,6 +529,7 @@ static void xgpu_vi_mailbox_flr_work(struct work_struct *work) reset_context.method =AMD_RESET_METHOD_NONE ; reset_context.reset_req_dev = adev;clear_bit (AMDGPU_NEED_FULL_RESET , &reset_context.flags); +set_bit (AMDGPU_HOST_FLR , &reset_context.flags);amdgpu_device_gpu_recover (adev,NULL , &reset_context); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 281/375 drm/amdgpu: Fix amdgpu_device_reset_sriov retry logic
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunxiang Li <[email protected]>
[ Upstream commit 6e4aa08fa9c6c0c027fc86f242517c925d159393 ]
The retry loop for SRIOV reset have refcount and memory leak issue. Depending on which function call fails it can potentially call amdgpu_amdkfd_pre/post_reset different number of times and causes kfd_locked count to be wrong. This will block all future attempts at opening /dev/kfd. The retry loop also leakes resources by calling amdgpu_virt_init_data_exchange multiple times without calling the corresponding fini function.
Align with the bare-metal reset path which doesn't have these issues. This means taking the amdgpu_amdkfd_pre/post_reset functions out of the reset loop and calling amdgpu_device_pre_asic_reset each retry which properly free the resources from previous try by calling amdgpu_virt_fini_data_exchange.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 47 ++++++++++------------ 1 file changed, 22 insertions(+), 25 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +22 -25
@@ -5067,10 +5067,6 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, {int r;struct amdgpu_hive_info *hive =NULL ; -int retry_limit =0 ; - -retry: -amdgpu_amdkfd_pre_reset (adev);if (test_bit (AMDGPU_HOST_FLR , &reset_context->flags)) {clear_bit (AMDGPU_HOST_FLR , &reset_context->flags);
@@ -5090,7 +5086,7 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,/* Resume IP prior to SMC */ r =amdgpu_device_ip_reinit_early_sriov (adev);if (r) - goto error; +return r;amdgpu_virt_init_data_exchange (adev);
@@ -5101,38 +5097,35 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,/* now we are okay to resume SMC/CP/SDMA */ r =amdgpu_device_ip_reinit_late_sriov (adev);if (r) - goto error; +return r; hive =amdgpu_get_xgmi_hive (adev);/* Update PSP FW topology after reset */ if (hive && adev->gmc.xgmi.num_physical_nodes >1 ) r =amdgpu_xgmi_update_topology (hive, adev); -if (hive)amdgpu_put_xgmi_hive (hive); +if (r) +return r; -if (!r) { - r =amdgpu_ib_ring_tests (adev); - -amdgpu_amdkfd_post_reset (adev); - } + r =amdgpu_ib_ring_tests (adev); +if (r) +return r; -error: -if (!r && adev->virt.gim_feature &AMDGIM_FEATURE_GIM_FLR_VRAMLOST ) { +if (adev->virt.gim_feature &AMDGIM_FEATURE_GIM_FLR_VRAMLOST ) {amdgpu_inc_vram_lost (adev); r =amdgpu_device_recover_vram (adev); } -amdgpu_virt_release_full_gpu (adev, true); +if (r) +return r; -if (AMDGPU_RETRY_SRIOV_RESET (r)) { -if (retry_limit <AMDGPU_MAX_RETRY_LIMIT ) { - retry_limit++; - goto retry; - }else -DRM_ERROR ("GPU reset retry is beyond the retry limit\n" ); - } +/* need to be called during full access so we can't do it later like +* bare-metal does. +*/ +amdgpu_amdkfd_post_reset (adev); +amdgpu_virt_release_full_gpu (adev, true); -return r; +return 0 ; }/**
@@ -5694,6 +5687,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,int i, r =0 ;bool need_emergency_restart = false;bool audio_suspended = false; +int retry_limit =AMDGPU_MAX_RETRY_LIMIT ;/* * Special case: RAS triggered and full reset isn't supported
@@ -5775,8 +5769,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,cancel_delayed_work_sync (&tmp_adev->delayed_init_work); -if (!amdgpu_sriov_vf (tmp_adev)) -amdgpu_amdkfd_pre_reset (tmp_adev); +amdgpu_amdkfd_pre_reset (tmp_adev);/* * Mark these ASICs to be reseted as untracked first
@@ -5835,6 +5828,10 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,/* Host driver will handle XGMI hive reset for SRIOV */ if (amdgpu_sriov_vf (adev)) { r =amdgpu_device_reset_sriov (adev, reset_context); +if (AMDGPU_RETRY_SRIOV_RESET (r) && (retry_limit--) >0 ) { +amdgpu_virt_release_full_gpu (adev, true); + goto retry; + }if (r) adev->asic_reset_res = r;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 282/375 fs: only copy to userspace on success in listmount()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Brauner <[email protected]>
commit 8d42877ad65b02741c9099392a001b7209baa5d4 upstream.
Avoid copying when we failed to, or didn't have any mounts to list.
--- fs/namespace.c | 2 ++ 1 file changed, 2 insertions(+)
fs/namespace.c +2 -0
@@ -5138,6 +5138,8 @@ SYSCALL_DEFINE4(listmount, const structscoped_guard (rwsem_read, &namespace_sem) ret = do_listmount(kreq.mnt_id, kreq.param, kmnt_ids, nr_mnt_ids); +if (ret <=0 ) +return ret;if (copy_to_user (mnt_ids, kmnt_ids, ret *sizeof (*mnt_ids)))return -EFAULT ;
Greg Kroah-Hartman
maintainerPATCH 283/375 tcp: process the 3rd ACK with sk_socket for TFO/MPTCP
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
commit c1668292689ad2ee16c9c1750a8044b0b0aad663 upstream.
The 'Fixes' commit recently changed the behaviour of TCP by skipping the processing of the 3rd ACK when a sk->sk_socket is set. The goal was to skip tcp_ack_snd_check() in tcp_rcv_state_process() not to send an unnecessary ACK in case of simultaneous connect(). Unfortunately, that had an impact on TFO and MPTCP.
I started to look at the impact on MPTCP, because the MPTCP CI found some issues with the MPTCP Packetdrill tests [1]. Then Paolo Abeni suggested me to look at the impact on TFO with "plain" TCP.
For MPTCP, when receiving the 3rd ACK of a request adding a new path (MP_JOIN), sk->sk_socket will be set, and point to the MPTCP sock that has been created when the MPTCP connection got established before with the first path. The newly added 'goto' will then skip the processing of the segment text (step 7) and not go through tcp_data_queue() where the MPTCP options are validated, and some actions are triggered, e.g. sending the MPJ 4th ACK [2] as demonstrated by the new errors when running a packetdrill test [3] establishing a second subflow.
This doesn't fully break MPTCP, mainly the 4th MPJ ACK that will be delayed. Still, we don't want to have this behaviour as it delays the switch to the fully established mode, and invalid MPTCP options in this 3rd ACK will not be caught any more. This modification also affects the MPTCP + TFO feature as well, and being the reason why the selftests started to be unstable the last few days [4].
For TFO, the existing 'basic-cookie-not-reqd' test [5] was no longer
passing: if the 3rd ACK contains data, and the connection is accept()ed before receiving them, these data would no longer be processed, and thus not ACKed.
One last thing about MPTCP, in case of simultaneous connect(), a fallback to TCP will be done, which seems fine:
../common/defaults.sh
0 socket(..., SOCK_STREAM|SOCK_NONBLOCK, IPPROTO_MPTCP) = 3
+0 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+0 > S 0:0(0) <mss 1460, sackOK, TS val 100 ecr 0, nop, wscale 8, mpcapable v1 flags[flag_h] nokey> +0 < S 0:0(0) win 1000 <mss 1460, sackOK, TS val 407 ecr 0, nop, wscale 8, mpcapable v1 flags[flag_h] nokey> +0 > S. 0:0(0) ack 1 <mss 1460, sackOK, TS val 330 ecr 0, nop, wscale 8, mpcapable v1 flags[flag_h] nokey>
+0 < S. 0:0(0) ack 1 win 65535 <mss 1460, sackOK, TS val 700 ecr 100, nop, wscale 8, mpcapable v1 flags[flag_h] key[skey=2]>
+0 > . 1:1(0) ack 1 <nop, nop, TS val 845707014 ecr 700, nop, nop, sack 0:1>
Simultaneous SYN-data crossing is also not supported by TFO, see [6].
Kuniyuki Iwashima suggested to restrict the processing to SYN+ACK only:
that's a more generic solution than the one initially proposed, and also enough to fix the issues described above.
Later on, Eric Dumazet mentioned that an ACK should still be sent in reaction to the second SYN+ACK that is received: not sending a DUPACK here seems wrong and could hurt:
0 socket(..., SOCK_STREAM|SOCK_NONBLOCK, IPPROTO_TCP) = 3
+0 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+0 > S 0:0(0) <mss 1460, sackOK, TS val 1000 ecr 0,nop,wscale 8>
+0 < S 0:0(0) win 1000 <mss 1000, sackOK, nop, nop>
+0 > S. 0:0(0) ack 1 <mss 1460, sackOK, TS val 3308134035 ecr 0,nop,wscale 8>
+0 < S. 0:0(0) ack 1 win 1000 <mss 1000, sackOK, nop, nop>
+0 > . 1:1(0) ack 1 <nop, nop, sack 0:1> // <== Here
So in this version, the 'goto consume' is dropped, to always send an ACK when switching from TCP_SYN_RECV to TCP_ESTABLISHED. This ACK will be seen as a DUPACK -- with DSACK if SACK has been negotiated -- in case of simultaneous SYN crossing: that's what is expected here.
--- net/ipv4/tcp_input.c | 3 --- 1 file changed, 3 deletions(-)
net/ipv4/tcp_input.c +0 -3
@@ -6825,9 +6825,6 @@ tcp_rcv_state_process(struct sock *sk, stcp_fast_path_on (tp);if (sk->sk_shutdown &SEND_SHUTDOWN )tcp_shutdown (sk,SEND_SHUTDOWN ); - -if (sk->sk_socket) - goto consume;break ;case TCP_FIN_WAIT1 : {
Greg Kroah-Hartman
maintainerPATCH 284/375 staging: iio: frequency: ad9834: Validate frequency parameter value
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksandr Mishin <[email protected]>
commit b48aa991758999d4e8f9296c5bbe388f293ef465 upstream.
In ad9834_write_frequency() clk_get_rate() can return 0. In such case ad9834_calc_freqreg() call will lead to division by zero. Checking 'if (fout > (clk_freq / 2))' doesn't protect in case of 'fout' is 0. ad9834_write_frequency() is called from ad9834_write(), where fout is taken from text buffer, which can contain any value.
Modify parameters checking.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/staging/iio/frequency/ad9834.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/iio/frequency/ad9834.c +1 -1
@@ -114,7 +114,7 @@ static int ad9834_write_frequency(struct clk_freq =clk_get_rate (st->mclk); -if (fout > (clk_freq /2 )) +if (!clk_freq || fout > (clk_freq /2 ))return -EINVAL ; regval =ad9834_calc_freqreg (clk_freq, fout);
Greg Kroah-Hartman
maintainerPATCH 285/375 iio: buffer-dmaengine: fix releasing dma channel on error
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Lechner <[email protected]>
commit 84c65d8008764a8fb4e627ff02de01ec4245f2c4 upstream.
If dma_get_slave_caps() fails, we need to release the dma channel before returning an error to avoid leaking the channel.
--- drivers/iio/buffer/industrialio-buffer-dmaengine.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/iio/buffer/industrialio-buffer-dmaengine.c +3 -1
@@ -193,7 +193,7 @@ static struct iio_buffer *iio_dmaengine_ ret =dma_get_slave_caps (chan, &caps);if (ret <0 ) - goto err_free; + goto err_release;/* Needs to be aligned to the maximum of the minimums */ if (caps.src_addr_widths)
@@ -219,6 +219,8 @@ static struct iio_buffer *iio_dmaengine_return &dmaengine_buffer->queue.buffer; +err_release: +dma_release_channel (chan); err_free:kfree (dmaengine_buffer);return ERR_PTR (ret);
Greg Kroah-Hartman
maintainerPATCH 286/375 iio: fix scale application in iio_convert_raw_to_processed_unlocked
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matteo Martelli <[email protected]>
commit 8a3dcc970dc57b358c8db2702447bf0af4e0d83a upstream.
When the scale_type is IIO_VAL_INT_PLUS_MICRO or IIO_VAL_INT_PLUS_NANO the scale passed as argument is only applied to the fractional part of the value. Fix it by also multiplying the integer part by the scale provided.
--- drivers/iio/inkern.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/iio/inkern.c +4 -4
@@ -647,17 +647,17 @@ static int iio_convert_raw_to_processed_break ;case IIO_VAL_INT_PLUS_MICRO :if (scale_val2 <0 ) - *processed = -raw64 * scale_val; + *processed = -raw64 * scale_val * scale;else - *processed = raw64 * scale_val; + *processed = raw64 * scale_val * scale; *processed +=div_s64 (raw64 * (s64 )scale_val2 * scale,1000000LL );break ;case IIO_VAL_INT_PLUS_NANO :if (scale_val2 <0 ) - *processed = -raw64 * scale_val; + *processed = -raw64 * scale_val * scale;else - *processed = raw64 * scale_val; + *processed = raw64 * scale_val * scale; *processed +=div_s64 (raw64 * (s64 )scale_val2 * scale,1000000000LL );break ;
Greg Kroah-Hartman
maintainerPATCH 287/375 iio: imu: inv_mpu6050: fix interrupt status read for old buggy chips
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jean-Baptiste Maneyrol <[email protected]>
commit 0a3b517c8089aa4cf339f41460d542c681409386 upstream.
Interrupt status read seems to be broken on some old MPU-6050 like chips. Fix by reverting to previous driver behavior bypassing interrupt status read. This is working because these chips are not supporting WoM and data ready is the only interrupt source.
--- drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c +11 -2
@@ -248,12 +248,20 @@ static irqreturn_t inv_mpu6050_interruptint result;switch (st->chip_type) { +case INV_MPU6000 :case INV_MPU6050 : +case INV_MPU9150 : +/* +* WoM is not supported and interrupt status read seems to be broken for +* some chips. Since data ready is the only interrupt, bypass interrupt +* status read and always assert data ready bit. +*/ + wom_bits =0 ; + int_status =INV_MPU6050_BIT_RAW_DATA_RDY_INT ; + goto data_ready_interrupt;case INV_MPU6500 :case INV_MPU6515 :case INV_MPU6880 : -case INV_MPU6000 : -case INV_MPU9150 :case INV_MPU9250 :case INV_MPU9255 : wom_bits =INV_MPU6500_BIT_WOM_INT ;
@@ -279,6 +287,7 @@ static irqreturn_t inv_mpu6050_interrupt } } +data_ready_interrupt:/* handle raw data interrupt */ if (int_status &INV_MPU6050_BIT_RAW_DATA_RDY_INT ) { indio_dev->pollfunc->timestamp = st->it_timestamp;
Greg Kroah-Hartman
maintainerPATCH 288/375 iio: adc: ad7124: fix config comparison
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dumitru Ceclan <[email protected]>
commit 2f6b92d0f69f04d9e2ea0db1228ab7f82f3173af upstream.
The ad7124_find_similar_live_cfg() computes the compare size by substracting the address of the cfg struct from the address of the live field. Because the live field is the first field in the struct, the result is 0.
Also, the memcmp() call is made from the start of the cfg struct, which includes the live and cfg_slot fields, which are not relevant for the comparison.
Fix by grouping the relevant fields with struct_group() and use the size of the group to compute the compare size; make the memcmp() call from the address of the group.
--- drivers/iio/adc/ad7124.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-)
drivers/iio/adc/ad7124.c +15 -11
@@ -147,15 +147,18 @@ struct ad7124_chip_info {struct ad7124_channel_config {bool live;unsigned int cfg_slot; -enum ad7124_ref_sel refsel; -bool bipolar; -bool buf_positive; -bool buf_negative; -unsigned int vref_mv; -unsigned int pga_bits; -unsigned int odr; -unsigned int odr_sel_bits; -unsigned int filter_type; +/* Following fields are used to compare equality. */ + struct_group(config_props, + enum ad7124_ref_sel refsel; +bool bipolar; +bool buf_positive; +bool buf_negative; +unsigned int vref_mv; +unsigned int pga_bits; +unsigned int odr; +unsigned int odr_sel_bits; +unsigned int filter_type; + ); };struct ad7124_channel {
@@ -334,11 +337,12 @@ static struct ad7124_channel_config *ad7ptrdiff_t cmp_size;int i; - cmp_size = (u8 *)&cfg->live - (u8 *)cfg; + cmp_size = sizeof_field(struct ad7124_channel_config, config_props);for (i =0 ; i < st->num_channels; i++) { cfg_aux = &st->channels[i].cfg; -if (cfg_aux->live && !memcmp (cfg, cfg_aux, cmp_size)) +if (cfg_aux->live && + !memcmp (&cfg->config_props, &cfg_aux->config_props, cmp_size))return cfg_aux; }
Greg Kroah-Hartman
maintainerPATCH 289/375 iio: adc: ad7606: remove frstdata check for serial mode
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guillaume Stols <[email protected]>
commit 90826e08468ba7fb35d8b39645b22d9e80004afe upstream.
The current implementation attempts to recover from an eventual glitch in the clock by checking frstdata state after reading the first channel's sample: If frstdata is low, it will reset the chip and return -EIO.
This will only work in parallel mode, where frstdata pin is set low after the 2nd sample read starts.
For the serial mode, according to the datasheet, "The FRSTDATA output returns to a logic low following the 16th SCLK falling edge.", thus after the Xth pulse, X being the number of bits in a sample, the check will always be true, and the driver will not work at all in serial mode if frstdata(optional) is defined in the devicetree as it will reset the chip, and return -EIO every time read_sample is called.
Hence, this check must be removed for serial mode.
--- drivers/iio/adc/ad7606.c | 28 +------------------------ drivers/iio/adc/ad7606.h | 2 + drivers/iio/adc/ad7606_par.c | 48 ++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 49 insertions(+), 29 deletions(-)
drivers/iio/adc/ad7606.c +2 -26
@@ -49,7 +49,7 @@ static const unsigned int ad7616_oversam 1, 2, 4, 8, 16, 32, 64, 128, }; -static int ad7606_reset (struct ad7606_state *st) +int ad7606_reset (struct ad7606_state *st) {if (st->gpio_reset) {gpiod_set_value (st->gpio_reset,1 );
@@ -60,6 +60,7 @@ static int ad7606_reset(struct ad7606_streturn -ENODEV ; } +EXPORT_SYMBOL_NS_GPL (ad7606_reset,IIO_AD7606 ); static int ad7606_reg_access(struct iio_dev *indio_dev, unsigned int reg,
@@ -88,31 +89,6 @@ static int ad7606_read_samples(struct ad {unsigned int num = st->chip_info->num_channels -1 ;u16 *data = st->data; -int ret; - -/* -* The frstdata signal is set to high while and after reading the sample -* of the first channel and low for all other channels. This can be used -* to check that the incoming data is correctly aligned. During normal -* operation the data should never become unaligned, but some glitch or -* electrostatic discharge might cause an extra read or clock cycle. -* Monitoring the frstdata signal allows to recover from such failure -* situations. -*/ - -if (st->gpio_frstdata) { - ret = st->bops->read_block (st->dev,1 , data); -if (ret) -return ret; - -if (!gpiod_get_value (st->gpio_frstdata)) { -ad7606_reset (st); -return -EIO ; - } - - data++; - num--; - }return st->bops->read_block (st->dev, num, data); }
drivers/iio/adc/ad7606.h +2 -0
@@ -151,6 +151,8 @@ int ad7606_probe(struct device *dev, int const char *name, unsigned int id, const struct ad7606_bus_ops *bops); +int ad7606_reset (struct ad7606_state *st); +enum ad7606_supported_device_ids {ID_AD7605_4 ,ID_AD7606_8 ,
drivers/iio/adc/ad7606_par.c +45 -3
67 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 290/375 iio: adc: ad_sigma_delta: fix irq_flags on irq request
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sa <[email protected]>
commit e81bb580ec08d7503c14c92157d810d306290003 upstream.
With commit 7b0c9f8fa3d2 ("iio: adc: ad_sigma_delta: Add optional irq selection"), we can get the irq line from struct ad_sigma_delta_info instead of the spi device. However, in devm_ad_sd_probe_trigger(), when getting the irq_flags with irq_get_trigger_type() we are still using the spi device irq instead of the one used for devm_request_irq().
--- drivers/iio/adc/ad_sigma_delta.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/adc/ad_sigma_delta.c +1 -1
@@ -568,7 +568,7 @@ EXPORT_SYMBOL_NS_GPL(ad_sd_validate_trigstatic int devm_ad_sd_probe_trigger (struct device *dev,struct iio_dev *indio_dev) {struct ad_sigma_delta *sigma_delta =iio_device_get_drvdata (indio_dev); -unsigned long irq_flags =irq_get_trigger_type (sigma_delta->spi->irq); +unsigned long irq_flags =irq_get_trigger_type (sigma_delta->irq_line);int ret;if (dev != &sigma_delta->spi->dev) {
Greg Kroah-Hartman
maintainerPATCH 291/375 iio: adc: ad7124: fix chip ID mismatch
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dumitru Ceclan <[email protected]>
commit 96f9ab0d5933c1c00142dd052f259fce0bc3ced2 upstream.
The ad7124_soft_reset() function has the assumption that the chip will assert the "power-on reset" bit in the STATUS register after a software reset without any delay. The POR bit =0 is used to check if the chip initialization is done.
A chip ID mismatch probe error appears intermittently when the probe continues too soon and the ID register does not contain the expected value.
Fix by adding a 200us delay after the software reset command is issued.
--- drivers/iio/adc/ad7124.c | 1 + 1 file changed, 1 insertion(+)
drivers/iio/adc/ad7124.c +1 -0
@@ -766,6 +766,7 @@ static int ad7124_soft_reset(struct ad71if (ret <0 )return ret; +fsleep (200 ); timeout =100 ; do { ret = ad_sd_read_reg(&st->sd, AD7124_STATUS, 1, &readval);
Greg Kroah-Hartman
maintainerPATCH 292/375 iio: adc: ad7124: fix DT configuration parsing
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dumitru Ceclan <[email protected]>
commit 61cbfb5368dd50ed0d65ce21d305aa923581db2b upstream.
The cfg pointer is set before reading the channel number that the configuration should point to. This causes configurations to be shifted by one channel.
For example setting bipolar to the first channel defined in the DT will cause bipolar mode to be active on the second defined channel.
Fix by moving the cfg pointer setting after reading the channel number.
--- drivers/iio/adc/ad7124.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/iio/adc/ad7124.c +1 -2
@@ -842,8 +842,6 @@ static int ad7124_parse_channel_config(s st->channels = channels;device_for_each_child_node_scoped (dev, child) { - cfg = &st->channels[channel].cfg; - ret =fwnode_property_read_u32 (child,"reg" , &channel);if (ret)return ret;
@@ -861,6 +859,7 @@ static int ad7124_parse_channel_config(s st->channels[channel].ain =AD7124_CHANNEL_AINP (ain[0 ]) |AD7124_CHANNEL_AINM (ain[1 ]); + cfg = &st->channels[channel].cfg; cfg->bipolar =fwnode_property_read_bool (child,"bipolar" ); ret =fwnode_property_read_u32 (child,"adi,reference-select" , &tmp);
Greg Kroah-Hartman
maintainerPATCH 293/375 usb: dwc3: core: update LC timer as per USB Spec V3.2
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Faisal Hassan <[email protected]>
commit 9149c9b0c7e046273141e41eebd8a517416144ac upstream.
This fix addresses STAR 9001285599, which only affects DWC_usb3 version 3.20a. The timer value for PM_LC_TIMER in DWC_usb3 3.20a for the Link ECN changes is incorrect. If the PM TIMER ECN is enabled via GUCTL2[19], the link compliance test (TD7.21) may fail. If the ECN is not enabled (GUCTL2[19] = 0), the controller will use the old timer value (5us), which is still acceptable for the link compliance test. Therefore, clear GUCTL2[19] to pass the USB link compliance test: TD 7.21.
--- drivers/usb/dwc3/core.c | 15 +++++++++++++++ drivers/usb/dwc3/core.h | 2 ++ 2 files changed, 17 insertions(+)
drivers/usb/dwc3/core.c +15 -0
@@ -1368,6 +1368,21 @@ static int dwc3_core_init(struct dwc3 *d }/* +* STAR 9001285599: This issue affects DWC_usb3 version 3.20a +* only. If the PM TIMER ECM is enabled through GUCTL2[19], the +* link compliance test (TD7.21) may fail. If the ECN is not +* enabled (GUCTL2[19] = 0), the controller will use the old timer +* value (5us), which is still acceptable for the link compliance +* test. Therefore, do not enable PM TIMER ECM in 3.20a by +* setting GUCTL2[19] by default; instead, use GUCTL2[19] = 0. +*/ + if (DWC3_VER_IS(DWC3, 320A)) { + reg =dwc3_readl (dwc->regs,DWC3_GUCTL2 ); + reg &= ~DWC3_GUCTL2_LC_TIMER ; +dwc3_writel (dwc->regs,DWC3_GUCTL2 , reg); + } + +/* * When configured in HOST mode, after issuing U3/L2 exit controller * fails to send proper CRC checksum in CRC5 feild. Because of this * behaviour Transaction Error is generated, resulting in reset and
drivers/usb/dwc3/core.h +2 -0
@@ -417,6 +417,7 @@/* Global User Control Register 2 */ #define DWC3_GUCTL2_RST_ACTBITLATER BIT(14) +#define DWC3_GUCTL2_LC_TIMER BIT(19)/* Global User Control Register 3 */ #define DWC3_GUCTL3_SPLITDISABLE BIT(14)
@@ -1262,6 +1263,7 @@ struct dwc3 {#define DWC3_REVISION_290A 0x5533290a#define DWC3_REVISION_300A 0x5533300a#define DWC3_REVISION_310A 0x5533310a +#define DWC3_REVISION_320A 0x5533320a#define DWC3_REVISION_330A 0x5533330a#define DWC31_REVISION_ANY 0x0
Greg Kroah-Hartman
maintainerPATCH 294/375 usb: cdns2: Fix controller reset issue
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pawel Laszczak <[email protected]>
commit e2940928115e83d707b21bf00b0db7d6c15f8341 upstream.
Patch fixes the procedure of resetting controller. The CPUCTRL register is write only and reading returns 0. Waiting for reset to complite is incorrect.
--- drivers/usb/gadget/udc/cdns2/cdns2-gadget.c | 12 +++--------- drivers/usb/gadget/udc/cdns2/cdns2-gadget.h | 9 +++++++++ 2 files changed, 12 insertions(+), 9 deletions(-)
drivers/usb/gadget/udc/cdns2/cdns2-gadget.c +3 -9
@@ -2251,7 +2251,6 @@ static int cdns2_gadget_start(struct cdn {u32 max_speed;void *buf; -int val;int ret; pdev->usb_regs = pdev->regs;
@@ -2261,14 +2260,9 @@ static int cdns2_gadget_start(struct cdn pdev->adma_regs = pdev->regs +CDNS2_ADMA_REGS_OFFSET ;/* Reset controller. */ -set_reg_bit_8 (&pdev->usb_regs->cpuctrl,CPUCTRL_SW_RST ); - - ret =readl_poll_timeout_atomic (&pdev->usb_regs->cpuctrl, val, - !(val &CPUCTRL_SW_RST ),1 ,10000 ); -if (ret) { -dev_err (pdev->dev,"Error: reset controller timeout\n" ); -return -EINVAL ; - } +writeb (CPUCTRL_SW_RST |CPUCTRL_UPCLK |CPUCTRL_WUEN , + &pdev->usb_regs->cpuctrl); +usleep_range (5 ,10 );usb_initialize_gadget (pdev->dev, &pdev->gadget,NULL );
drivers/usb/gadget/udc/cdns2/cdns2-gadget.h +9 -0
@@ -292,8 +292,17 @@ struct cdns2_usb_regs {#define SPEEDCTRL_HSDISABLE BIT(7)/* CPUCTRL- bitmasks. */ +/* UP clock enable */ +#define CPUCTRL_UPCLK BIT(0)/* Controller reset bit. */ #define CPUCTRL_SW_RST BIT(1) +/** +* If the wuen bit is ‘1’, the upclken is automatically set to ‘1’ after +* detecting rising edge of wuintereq interrupt. If the wuen bit is ‘0’, +* the wuintereq interrupt is ignored. +*/ +#define CPUCTRL_WUEN BIT(7) +/** * struct cdns2_adma_regs - ADMA controller registers.
Greg Kroah-Hartman
maintainerPATCH 295/375 usb: dwc3: Avoid waking up gadget during startxfer
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Prashanth K <[email protected]>
commit 00dcf2fa449f23a263343d7fe051741bdde65d0b upstream.
When operating in High-Speed, it is observed that DSTS[USBLNKST] doesn't update link state immediately after receiving the wakeup interrupt. Since wakeup event handler calls the resume callbacks, there is a chance that function drivers can perform an ep queue, which in turn tries to perform remote wakeup from send_gadget_ep_cmd(STARTXFER). This happens because DSTS[[21:18] wasn't updated to U0 yet, it's observed that the latency of DSTS can be in order of milli-seconds. Hence avoid calling gadget_wakeup during startxfer to prevent unnecessarily issuing remote wakeup to host.
--- drivers/usb/dwc3/gadget.c | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-)
drivers/usb/dwc3/gadget.c +17 -24
@@ -287,6 +287,23 @@ static int __dwc3_gadget_wakeup(struct d* * Caller should handle locking. This function will issue @cmd with given * @params to @dep and wait for its completion. +* +* According to the programming guide, if the link state is in L1/L2/U3, +* then sending the Start Transfer command may not complete. The +* programming guide suggested to bring the link state back to ON/U0 by +* performing remote wakeup prior to sending the command. However, don't +* initiate remote wakeup when the user/function does not send wakeup +* request via wakeup ops. Send the command when it's allowed. +* +* Notes: +* For L1 link state, issuing a command requires the clearing of +* GUSB2PHYCFG.SUSPENDUSB2, which turns on the signal required to complete +* the given command (usually within 50us). This should happen within the +* command timeout set by driver. No additional step is needed. +* +* For L2 or U3 link state, the gadget is in USB suspend. Care should be +* taken when sending Start Transfer command to ensure that it's done after +* USB resume. */ int dwc3_send_gadget_ep_cmd (struct dwc3_ep *dep,unsigned int cmd,struct dwc3_gadget_ep_cmd_params *params)
@@ -327,30 +344,6 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_dwc3_writel (dwc->regs,DWC3_GUSB2PHYCFG (0 ), reg); } -if (DWC3_DEPCMD_CMD (cmd) ==DWC3_DEPCMD_STARTTRANSFER ) { -int link_state; - -/* -* Initiate remote wakeup if the link state is in U3 when -* operating in SS/SSP or L1/L2 when operating in HS/FS. If the -* link state is in U1/U2, no remote wakeup is needed. The Start -* Transfer command will initiate the link recovery. -*/ - link_state =dwc3_gadget_get_link_state (dwc); -switch (link_state) { -case DWC3_LINK_STATE_U2 : -if (dwc->gadget->speed >=USB_SPEED_SUPER ) -break ; - - fallthrough; -case DWC3_LINK_STATE_U3 : - ret =__dwc3_gadget_wakeup (dwc, false); -dev_WARN_ONCE (dwc->dev, ret,"wakeup failed --> %d\n" , - ret); -break ; - } - } -/* * For some commands such as Update Transfer command, DEPCMDPARn * registers are reserved. Since the driver often sends Update Transfer
Greg Kroah-Hartman
maintainerPATCH 296/375 usb: typec: ucsi: Fix the partner PD revision
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heikki Krogerus <[email protected]>
commit de3d7969f6a80aa5abbbc0f39897495ae35548d0 upstream.
The Partner PD Revision field in GET_CONNECTOR_CAPABILITY data structure was introduced in UCSI v2.1. In ucsi_check_connector_capability() the version was assumed to be 2.0, and in ucsi_register_partner() the field is accessed completely unconditionally.
Fixing the version in ucsi_check_connector_capability(), and replacing the unconditional pd_revision assignment with a direct call to ucsi_check_connector_capability() in ucsi_register_port(). After this the revision is also checked only if there is a PD contract.
--- drivers/usb/typec/ucsi/ucsi.c | 50 +++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 24 deletions(-)
drivers/usb/typec/ucsi/ucsi.c +26 -24
@@ -961,6 +961,27 @@ static void ucsi_unregister_cable(struct con->cable =NULL ; } +static int ucsi_check_connector_capability (struct ucsi_connector *con) +{ +u64 command; +int ret; + +if (!con->partner || con->ucsi->version <UCSI_VERSION_2_1 ) +return 0 ; + + command =UCSI_GET_CONNECTOR_CAPABILITY |UCSI_CONNECTOR_NUMBER (con->num); + ret =ucsi_send_command (con->ucsi, command, &con->cap,sizeof (con->cap)); +if (ret <0 ) { +dev_err (con->ucsi->dev,"GET_CONNECTOR_CAPABILITY failed (%d)\n" , ret); +return ret; + } + +typec_partner_set_pd_revision (con->partner, +UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV_AS_BCD (con->cap.flags)); + +return ret; +} +static void ucsi_pwr_opmode_change (struct ucsi_connector *con) {switch (UCSI_CONSTAT_PWR_OPMODE (con->status.flags)) {
@@ -970,6 +991,7 @@ static void ucsi_pwr_opmode_change(strucucsi_partner_task (con, ucsi_get_src_pdos,30 ,0 );ucsi_partner_task (con, ucsi_check_altmodes,30 ,0 );ucsi_partner_task (con, ucsi_register_partner_pdos,1 ,HZ ); +ucsi_partner_task (con, ucsi_check_connector_capability,1 ,HZ );break ;case UCSI_CONSTAT_PWR_OPMODE_TYPEC1_5 : con->rdo =0 ;
@@ -1013,7 +1035,6 @@ static int ucsi_register_partner(struct desc.identity = &con->partner_identity; desc.usb_pd = pwr_opmode ==UCSI_CONSTAT_PWR_OPMODE_PD ; - desc.pd_revision =UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV_AS_BCD (con->cap.flags); partner =typec_register_partner (con->port, &desc);if (IS_ERR (partner)) {
@@ -1090,27 +1111,6 @@ static void ucsi_partner_change(struct u con->num, u_role); } -static int ucsi_check_connector_capability (struct ucsi_connector *con) -{ -u64 command; -int ret; - -if (!con->partner || con->ucsi->version <UCSI_VERSION_2_0 ) -return 0 ; - - command =UCSI_GET_CONNECTOR_CAPABILITY |UCSI_CONNECTOR_NUMBER (con->num); - ret =ucsi_send_command (con->ucsi, command, &con->cap,sizeof (con->cap)); -if (ret <0 ) { -dev_err (con->ucsi->dev,"GET_CONNECTOR_CAPABILITY failed (%d)\n" , ret); -return ret; - } - -typec_partner_set_pd_revision (con->partner, -UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV_AS_BCD (con->cap.flags)); - -return ret; -} -static int ucsi_check_connection (struct ucsi_connector *con) {u8 prev_flags = con->status.flags;
@@ -1225,15 +1225,16 @@ static void ucsi_handle_connector_changeif (con->status.flags &UCSI_CONSTAT_CONNECTED ) {ucsi_register_partner (con);ucsi_partner_task (con, ucsi_check_connection,1 ,HZ ); -ucsi_partner_task (con, ucsi_check_connector_capability,1 ,HZ );if (con->ucsi->cap.features &UCSI_CAP_GET_PD_MESSAGE )ucsi_partner_task (con, ucsi_get_partner_identity,1 ,HZ );if (con->ucsi->cap.features &UCSI_CAP_CABLE_DETAILS )ucsi_partner_task (con, ucsi_check_cable,1 ,HZ );if (UCSI_CONSTAT_PWR_OPMODE (con->status.flags) == -UCSI_CONSTAT_PWR_OPMODE_PD ) +UCSI_CONSTAT_PWR_OPMODE_PD ) {ucsi_partner_task (con, ucsi_register_partner_pdos,1 ,HZ ); +ucsi_partner_task (con, ucsi_check_connector_capability,1 ,HZ ); + } }else {ucsi_unregister_partner (con); }
@@ -1650,6 +1651,7 @@ static int ucsi_register_port(struct ucsucsi_register_device_pdos (con);ucsi_get_src_pdos (con);ucsi_check_altmodes (con); +ucsi_check_connector_capability (con); }trace_ucsi_register_port (con->num, &con->status);
Greg Kroah-Hartman
maintainerPATCH 297/375 misc: fastrpc: Fix double free of buf in error path
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sukrut Bellary <[email protected]>
commit e8c276d4dc0e19ee48385f74426aebc855b49aaf upstream.
smatch warning:drivers/misc/fastrpc.c:1926 fastrpc_req_mmap() error: double free of 'buf'
In fastrpc_req_mmap() error path, the fastrpc buffer is freed in fastrpc_req_munmap_impl() if unmap is successful.
But in the end, there is an unconditional call to fastrpc_buf_free(). So the above case triggers the double free of fastrpc buf.
--- drivers/misc/fastrpc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/misc/fastrpc.c +2 -3
@@ -1912,7 +1912,8 @@ static int fastrpc_req_mmap(struct fastr &args[0]);if (err) {dev_err (dev,"mmap error (len 0x%08llx)\n" , buf->size); - goto err_invoke; +fastrpc_buf_free (buf); +return err; }/* update the buffer to be able to deallocate the memory on the DSP */
@@ -1950,8 +1951,6 @@ static int fastrpc_req_mmap(struct fastr err_assign:fastrpc_req_munmap_impl (fl, buf); -err_invoke: -fastrpc_buf_free (buf);return err; }
Greg Kroah-Hartman
maintainerPATCH 298/375 binder: fix UAF caused by offsets overwrite
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carlos Llamas <[email protected]>
commit 4df153652cc46545722879415937582028c18af5 upstream.
Binder objects are processed and copied individually into the target buffer during transactions. Any raw data in-between these objects is copied as well. However, this raw data copy lacks an out-of-bounds check. If the raw data exceeds the data section size then the copy overwrites the offsets section. This eventually triggers an error that attempts to unwind the processed objects. However, at this point the offsets used to index these objects are now corrupted.
Unwinding with corrupted offsets can result in decrements of arbitrary nodes and lead to their premature release. Other users of such nodes are left with a dangling pointer triggering a use-after-free. This issue is made evident by the following KASAN report (trimmed):
==================================================================
BUG: KASAN: slab-use-after-free in _raw_spin_lock+0xe4/0x19c Write of size 4 at addr ffff47fc91598f04 by task binder-util/743 CPU: 9 UID: 0 PID: 743 Comm: binder-util Not tainted 6.11.0-rc4 #1 Hardware name: linux,dummy-virt (DT) Call trace: _raw_spin_lock+0xe4/0x19c binder_free_buf+0x128/0x434 binder_thread_write+0x8a4/0x3260 binder_ioctl+0x18f0/0x258c [...] Allocated by task 743: __kmalloc_cache_noprof+0x110/0x270 binder_new_node+0x50/0x700 binder_transaction+0x413c/0x6da8 binder_thread_write+0x978/0x3260 binder_ioctl+0x18f0/0x258c [...] Freed by task 745: kfree+0xbc/0x208 binder_thread_read+0x1c5c/0x37d4 binder_ioctl+0x16d8/0x258c [...] ==================================================================
To avoid this issue, let's check that the raw data copy is within the boundaries of the data section.
--- drivers/android/binder.c | 1 + 1 file changed, 1 insertion(+)
drivers/android/binder.c +1 -0
@@ -3342,6 +3342,7 @@ static void binder_transaction(struct bi*/ copy_size = object_offset - user_offset; if (copy_size && (user_offset > object_offset || + object_offset > tr->data_size || binder_alloc_copy_user_to_buffer( &target_proc->alloc, t->buffer, user_offset,
Greg Kroah-Hartman
maintainerPATCH 299/375 dt-bindings: nvmem: Use soc-nvmem node name instead of nvmem
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Simek <[email protected]>
commit a759d1f25182f51210c8831d71ce7ee81e0930f4 upstream.
Based on commit d8764d347bd7 ("dt-bindings: firmware: xilinx: Describe soc-nvmem subnode") soc-nvmem should be used instead of simple nvmem that's why also update example to have it described correctly everywhere.
--- Documentation/devicetree/bindings/nvmem/xlnx,zynqmp-nvmem.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/devicetree/bindings/nvmem/xlnx,zynqmp-nvmem.yaml +1 -1
@@ -28,7 +28,7 @@ unevaluatedProperties: false examples: - | - nvmem { + soc-nvmem { compatible = "xlnx,zynqmp-nvmem-fw"; nvmem-layout { compatible = "fixed-layout";
Signature · 1 line
2.46.0
Greg Kroah-Hartman
maintainerPATCH 300/375 nvmem: u-boot-env: error if NVMEM device is too small
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Thomson <[email protected]>
commit 8679e8b4a1ebdb40c4429e49368d29353e07b601 upstream.
Verify data size before trying to parse it to avoid reading out of buffer. This could happen in case of problems at MTD level or invalid DT bindings.
--- drivers/nvmem/u-boot-env.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/nvmem/u-boot-env.c +7 -0
@@ -176,6 +176,13 @@ static int u_boot_env_parse(struct u_boo data_offset = offsetof(struct u_boot_env_image_broadcom , data);break ; } + +if (dev_size < data_offset) { +dev_err (dev,"Device too small for u-boot-env\n" ); + err = -EIO ; + goto err_kfree; + } + crc32_addr = (__le32 *)(buf + crc32_offset); crc32 =le32_to_cpu (*crc32_addr); crc32_data_len = dev_size - crc32_data_offset;
Greg Kroah-Hartman
maintainerPATCH 301/375 nvmem: Fix return type of devm_nvmem_device_get() in kerneldoc
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit c69f37f6559a8948d70badd2b179db7714dedd62 upstream.
devm_nvmem_device_get() returns an nvmem device, not an nvmem cell.
--- drivers/nvmem/core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/nvmem/core.c +3 -3
@@ -1258,13 +1258,13 @@ void nvmem_device_put(struct nvmem_devicEXPORT_SYMBOL_GPL (nvmem_device_put);/** -* devm_nvmem_device_get() - Get nvmem cell of device form a given id +* devm_nvmem_device_get() - Get nvmem device of device form a given id * * @dev: Device that requests the nvmem device. * @id: name id for the requested nvmem device. * -* Return: ERR_PTR() on error or a valid pointer to a struct nvmem_cell -* on success. The nvmem_cell will be freed by the automatically once the +* Return: ERR_PTR() on error or a valid pointer to a struct nvmem_device +* on success. The nvmem_device will be freed by the automatically once the * device is freed. */ struct nvmem_device *devm_nvmem_device_get (struct device *dev,const char *id)
Greg Kroah-Hartman
maintainerPATCH 302/375 uio_hv_generic: Fix kernel NULL pointer dereference in hv_uio_rescind
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Saurabh Sengar <[email protected]>
commit fb1adbd7e50f3d2de56d0a2bb0700e2e819a329e upstream.
For primary VM Bus channels, primary_channel pointer is always NULL. This pointer is valid only for the secondary channels. Also, rescind callback is meant for primary channels only.
Fix NULL pointer dereference by retrieving the device_obj from the parent for the primary channel.
--- drivers/uio/uio_hv_generic.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/uio/uio_hv_generic.c +2 -1
@@ -106,10 +106,11 @@ static void hv_uio_channel_cb(void *cont/* * Callback from vmbus_event when channel is rescinded. +* It is meant for rescind of primary channels only. */ static void hv_uio_rescind (struct vmbus_channel *channel) { -struct hv_device *hv_dev = channel->primary_channel->device_obj; +struct hv_device *hv_dev = channel->device_obj;struct hv_uio_private_data *pdata =hv_get_drvdata (hv_dev);/*
Greg Kroah-Hartman
maintainerPATCH 303/375 Drivers: hv: vmbus: Fix rescind handling in uio_hv_generic
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naman Jain <[email protected]>
commit 6fd28941447bf2c8ca0f26fda612a1cabc41663f upstream.
Rescind offer handling relies on rescind callbacks for some of the resources cleanup, if they are registered. It does not unregister vmbus device for the primary channel closure, when callback is registered. Without it, next onoffer does not come, rescind flag remains set and device goes to unusable state.
Add logic to unregister vmbus for the primary channel in rescind callback to ensure channel removal and relid release, and to ensure that next onoffer can be received and handled properly.
--- drivers/hv/vmbus_drv.c | 1 + drivers/uio/uio_hv_generic.c | 8 ++++++++ 2 files changed, 9 insertions(+)
drivers/hv/vmbus_drv.c +1 -0
@@ -1952,6 +1952,7 @@ void vmbus_device_unregister(struct hv_d*/ device_unregister (&device_obj->device); } +EXPORT_SYMBOL_GPL (vmbus_device_unregister);#ifdef CONFIG_ACPI /*
drivers/uio/uio_hv_generic.c +8 -0
@@ -121,6 +121,14 @@ static void hv_uio_rescind(struct vmbus_/* Wake up reader */ uio_event_notify (&pdata->info); + +/* +* With rescind callback registered, rescind path will not unregister the device +* from vmbus when the primary channel is rescinded. +* Without it, rescind handling is incomplete and next onoffer msg does not come. +* Unregister the device from vmbus here. +*/ +vmbus_device_unregister (channel->device_obj); }/* Sysfs API to allow mmap of the ring buffers
Greg Kroah-Hartman
maintainerPATCH 304/375 VMCI: Fix use-after-free when removing resource in vmci_resource_remove()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Fernandez Gonzalez <[email protected]>
commit 48b9a8dabcc3cf5f961b2ebcd8933bf9204babb7 upstream.
When removing a resource from vmci_resource_table in vmci_resource_remove(), the search is performed using the resource handle by comparing context and resource fields.
It is possible though to create two resources with different types but same handle (same context and resource fields).
When trying to remove one of the resources, vmci_resource_remove() may not remove the intended one, but the object will still be freed as in the case of the datagram type in vmci_datagram_destroy_handle(). vmci_resource_table will still hold a pointer to this freed resource leading to a use-after-free vulnerability.
BUG: KASAN: use-after-free in vmci_handle_is_equal include/linux/vmw_vmci_defs.h:142 [inline] BUG: KASAN: use-after-free in vmci_resource_remove+0x3a1/0x410 drivers/misc/vmw_vmci/vmci_resource.c:147 Read of size 4 at addr ffff88801c16d800 by task syz-executor197/1592 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x82/0xa9 lib/dump_stack.c:106 print_address_description.constprop.0+0x21/0x366 mm/kasan/report.c:239 __kasan_report.cold+0x7f/0x132 mm/kasan/report.c:425 kasan_report+0x38/0x51 mm/kasan/report.c:442 vmci_handle_is_equal include/linux/vmw_vmci_defs.h:142 [inline] vmci_resource_remove+0x3a1/0x410 drivers/misc/vmw_vmci/vmci_resource.c:147 vmci_qp_broker_detach+0x89a/0x11b9 drivers/misc/vmw_vmci/vmci_queue_pair.c:2182 ctx_free_ctx+0x473/0xbe1 drivers/misc/vmw_vmci/vmci_context.c:444 kref_put include/linux/kref.h:65 [inline] vmci_ctx_put drivers/misc/vmw_vmci/vmci_context.c:497 [inline] vmci_ctx_destroy+0x170/0x1d6 drivers/misc/vmw_vmci/vmci_context.c:195 vmci_host_close+0x125/0x1ac drivers/misc/vmw_vmci/vmci_host.c:143 __fput+0x261/0xa34 fs/file_table.c:282 task_work_run+0xf0/0x194 kernel/task_work.c:164 tracehook_notify_resume include/linux/tracehook.h:189 [inline] exit_to_user_mode_loop+0x184/0x189 kernel/entry/common.c:187 exit_to_user_mode_prepare+0x11b/0x123 kernel/entry/common.c:220 __syscall_exit_to_user_mode_work kernel/entry/common.c:302 [inline] syscall_exit_to_user_mode+0x18/0x42 kernel/entry/common.c:313 do_syscall_64+0x41/0x85 arch/x86/entry/common.c:86 entry_SYSCALL_64_after_hwframe+0x6e/0x0
This change ensures the type is also checked when removing the resource from vmci_resource_table in vmci_resource_remove().
--- drivers/misc/vmw_vmci/vmci_resource.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/misc/vmw_vmci/vmci_resource.c +2 -1
@@ -144,7 +144,8 @@ void vmci_resource_remove(struct vmci_respin_lock (&vmci_resource_table.lock);hlist_for_each_entry (r, &vmci_resource_table.entries[idx], node) { -if (vmci_handle_is_equal (r->handle, resource->handle)) { +if (vmci_handle_is_equal (r->handle, resource->handle) && + resource->type == r->type) {hlist_del_init_rcu (&r->node);break ; }
Greg Kroah-Hartman
maintainerPATCH 305/375 clocksource/drivers/imx-tpm: Fix return -ETIME when delta exceeds INT_MAX
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacky Bai <[email protected]>
commit 5b8843fcd49827813da80c0f590a17ae4ce93c5d upstream.
In tpm_set_next_event(delta), return -ETIME by wrong cast to int when delta is larger than INT_MAX.
For example:
tpm_set_next_event(delta = 0xffff_fffe)
{
...
next = tpm_read_counter(); // assume next is 0x10
next += delta; // next will 0xffff_fffe + 0x10 = 0x1_0000_000e
now = tpm_read_counter(); // now is 0x10
...
return (int)(next - now) <= 0 ? -ETIME : 0;
^^^^^^^^^^
0x1_0000_000e - 0x10 = 0xffff_fffe, which is -2 when
cast to int. So return -ETIME.
}To fix this, introduce a 'prev' variable and check if 'now - prev' is larger than delta.
--- drivers/clocksource/timer-imx-tpm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/clocksource/timer-imx-tpm.c +4 -4
@@ -83,10 +83,10 @@ static u64 notrace tpm_read_sched_clock(static int tpm_set_next_event (unsigned long delta,struct clock_event_device *evt) { -unsigned long next, now; +unsigned long next, prev, now; - next =tpm_read_counter (); - next += delta; + prev =tpm_read_counter (); + next = prev + delta;writel (next, timer_base +TPM_C0V ); now =tpm_read_counter ();
@@ -96,7 +96,7 @@ static int tpm_set_next_event(unsigned l* of writing CNT registers which may cause the min_delta event got * missed, so we need add a ETIME check here in case it happened. */ -return (int )(next - now) <=0 ? -ETIME :0 ; +return (now - prev) >= delta ? -ETIME :0 ; }static int tpm_set_state_oneshot (struct clock_event_device *evt)
Greg Kroah-Hartman
maintainerPATCH 306/375 clocksource/drivers/imx-tpm: Fix next event not taking effect sometime
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacky Bai <[email protected]>
commit 3d5c2f8e75a55cfb11a85086c71996af0354a1fb upstream.
The value written into the TPM CnV can only be updated into the hardware when the counter increases. Additional writes to the CnV write buffer are ignored until the register has been updated. Therefore, we need to check if the CnV has been updated before continuing. This may require waiting for 1 counter cycle in the worst case.
--- drivers/clocksource/timer-imx-tpm.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/clocksource/timer-imx-tpm.c +8 -0
@@ -91,6 +91,14 @@ static int tpm_set_next_event(unsigned l now =tpm_read_counter ();/* +* Need to wait CNT increase at least 1 cycle to make sure +* the C0V has been updated into HW. +*/ +if ((next &0xffffffff ) !=readl (timer_base +TPM_C0V )) +while (now ==tpm_read_counter ()) + ; + +/* * NOTE: We observed in a very small probability, the bus fabric * contention between GPU and A7 may results a few cycles delay * of writing CNT registers which may cause the min_delta event got
Greg Kroah-Hartman
maintainerPATCH 307/375 clocksource/drivers/timer-of: Remove percpu irq related code
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Lezcano <[email protected]>
commit 471ef0b5a8aaca4296108e756b970acfc499ede4 upstream.
GCC's named address space checks errors out with:
drivers/clocksource/timer-of.c: In function ‘timer_of_irq_exit’:drivers/clocksource/timer-of.c:29:46: error: passing argument 2 of ‘free_percpu_irq’ from pointer to non-enclosed address space
29 | free_percpu_irq(of_irq->irq, clkevt);
| ^~~~~~
In file included from drivers/clocksource/timer-of.c:8:./include/linux/interrupt.h:201:43: note: expected ‘__seg_gs void *’ but argument is of type ‘struct clock_event_device *’
201 | extern void free_percpu_irq(unsigned int, void __percpu *);
| ^~~~~~~~~~~~~~~drivers/clocksource/timer-of.c: In function ‘timer_of_irq_init’:drivers/clocksource/timer-of.c:74:51: error: passing argument 4 of ‘request_percpu_irq’ from pointer to non-enclosed address space
74 | np->full_name, clkevt) :
| ^~~~~~./include/linux/interrupt.h:190:56: note: expected ‘__seg_gs void *’ but argument is of type ‘struct clock_event_device *’
190 | const char *devname, void __percpu *percpu_dev_id)
Sparse warns about:
timer-of.c:29:46: warning: incorrect type in argument 2 (different address spaces)
timer-of.c:29:46: expected void [noderef] __percpu *
timer-of.c:29:46: got struct clock_event_device *clkevt
timer-of.c:74:51: warning: incorrect type in argument 4 (different address spaces)
timer-of.c:74:51: expected void [noderef] __percpu *percpu_dev_id
timer-of.c:74:51: got struct clock_event_device *clkevt
It appears the code is incorrect as reported by Uros Bizjak:
"The referred code is questionable as it tries to reuse the clkevent pointer once as percpu pointer and once as generic pointer, which should be avoided."
This change removes the percpu related code as no drivers is using it.
[Daniel: Fixed the description]
--- drivers/clocksource/timer-of.c | 17 ++++------------- drivers/clocksource/timer-of.h | 1 - 2 files changed, 4 insertions(+), 14 deletions(-)
drivers/clocksource/timer-of.c +4 -13
@@ -25,10 +25,7 @@ static __init void timer_of_irq_exit(strstruct clock_event_device *clkevt = &to->clkevt; -if (of_irq->percpu) -free_percpu_irq (of_irq->irq, clkevt); -else -free_irq (of_irq->irq, clkevt); +free_irq (of_irq->irq, clkevt); }/**
@@ -42,9 +39,6 @@ static __init void timer_of_irq_exit(str* - Get interrupt number by name * - Get interrupt number by index * -* When the interrupt is per CPU, 'request_percpu_irq()' is called, -* otherwise 'request_irq()' is used. -* * Returns 0 on success, < 0 otherwise */ static __init int timer_of_irq_init(struct device_node *np,
@@ -69,12 +63,9 @@ static __init int timer_of_irq_init(strureturn -EINVAL ; } - ret = of_irq->percpu ? -request_percpu_irq (of_irq->irq, of_irq->handler, - np->full_name, clkevt) : -request_irq (of_irq->irq, of_irq->handler, - of_irq->flags ? of_irq->flags :IRQF_TIMER , - np->full_name, clkevt); + ret =request_irq (of_irq->irq, of_irq->handler, + of_irq->flags ? of_irq->flags :IRQF_TIMER , + np->full_name, clkevt);if (ret) {pr_err ("Failed to request irq %d for %pOF\n" , of_irq->irq, np);return ret;
drivers/clocksource/timer-of.h +0 -1
@@ -11,7 +11,6 @@struct of_timer_irq {int irq;int index; -int percpu;const char *name;unsigned long flags;irq_handler_t handler;
Greg Kroah-Hartman
maintainerPATCH 308/375 uprobes: Use kzalloc to allocate xol area
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Schnelle <[email protected]>
commit e240b0fde52f33670d1336697c22d90a4fe33c84 upstream.
To prevent unitialized members, use kzalloc to allocate the xol area.
--- kernel/events/uprobes.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
kernel/events/uprobes.c +1 -2
@@ -1480,7 +1480,7 @@ static struct xol_area *__create_xol_areuprobe_opcode_t insn =UPROBE_SWBP_INSN ;struct xol_area *area; - area =kmalloc (sizeof (*area),GFP_KERNEL ); + area =kzalloc (sizeof (*area),GFP_KERNEL );if (unlikely (!area)) goto out;
@@ -1490,7 +1490,6 @@ static struct xol_area *__create_xol_are goto free_area; area->xol_mapping.name ="[uprobes]" ; - area->xol_mapping.fault =NULL ; area->xol_mapping.pages = area->pages; area->pages[0 ] =alloc_page (GFP_HIGHUSER );if (!area->pages[0 ])
Greg Kroah-Hartman
maintainerPATCH 309/375 perf/aux: Fix AUX buffer serialization
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
commit 2ab9d830262c132ab5db2f571003d80850d56b2a upstream.
Ole reported that event->mmap_mutex is strictly insufficient to serialize the AUX buffer, add a per RB mutex to fully serialize it.
Note that in the lock order comment the perf_event::mmap_mutex order was already wrong, that is, it nesting under mmap_lock is not new with this patch.
--- kernel/events/core.c | 18 ++++++++++++------ kernel/events/internal.h | 1 + kernel/events/ring_buffer.c | 2 ++ 3 files changed, 15 insertions(+), 6 deletions(-)
kernel/events/core.c +12 -6
@@ -1255,8 +1255,9 @@ static void put_ctx(struct perf_event_co* perf_event_context::mutex * perf_event::child_mutex; * perf_event_context::lock -* perf_event::mmap_mutex * mmap_lock +* perf_event::mmap_mutex +* perf_buffer::aux_mutex * perf_addr_filters_head::lock * * cpu_hotplug_lock
@@ -6383,12 +6384,11 @@ static void perf_mmap_close(struct vm_ar event->pmu->event_unmapped (event, vma->vm_mm);/* -* rb->aux_mmap_count will always drop before rb->mmap_count and -* event->mmap_count, so it is ok to use event->mmap_mutex to -* serialize with perf_mmap here. +* The AUX buffer is strictly a sub-buffer, serialize using aux_mutex +* to avoid complications. */ if (rb_has_aux (rb) && vma->vm_pgoff == rb->aux_pgoff && -atomic_dec_and_mutex_lock (&rb->aux_mmap_count, &event->mmap_mutex)) { +atomic_dec_and_mutex_lock (&rb->aux_mmap_count, &rb->aux_mutex)) {/* * Stop all AUX events that are writing to this buffer, * so that we can free its AUX pages and corresponding PMU
@@ -6405,7 +6405,7 @@ static void perf_mmap_close(struct vm_arrb_free_aux (rb);WARN_ON_ONCE (refcount_read (&rb->aux_refcount)); -mutex_unlock (&event->mmap_mutex); +mutex_unlock (&rb->aux_mutex); }if (atomic_dec_and_test (&rb->mmap_count))
@@ -6493,6 +6493,7 @@ static int perf_mmap(struct file *file,struct perf_event *event = file->private_data;unsigned long user_locked, user_lock_limit;struct user_struct *user =current_user (); +struct mutex *aux_mutex =NULL ;struct perf_buffer *rb =NULL ;unsigned long locked, lock_limit;unsigned long vma_size;
@@ -6541,6 +6542,9 @@ static int perf_mmap(struct file *file,if (!rb) goto aux_unlock; + aux_mutex = &rb->aux_mutex; +mutex_lock (aux_mutex); + aux_offset =READ_ONCE (rb->user_page->aux_offset); aux_size =READ_ONCE (rb->user_page->aux_size);
@@ -6691,6 +6695,8 @@ unlock:atomic_dec (&rb->mmap_count); } aux_unlock: +if (aux_mutex) +mutex_unlock (aux_mutex);mutex_unlock (&event->mmap_mutex);/*
kernel/events/internal.h +1 -0
@@ -40,6 +40,7 @@ struct perf_buffer {struct user_struct *mmap_user;/* AUX area */ +struct mutex aux_mutex;long aux_head;unsigned int aux_nest;long aux_wakeup;/* last aux_watermark boundary crossed by aux_head */
kernel/events/ring_buffer.c +2 -0
@@ -337,6 +337,8 @@ ring_buffer_init(struct perf_buffer *rb,*/ if (!rb->nr_pages) rb->paused =1 ; + +mutex_init (&rb->aux_mutex); }void perf_aux_output_flag (struct perf_output_handle *handle,u64 flags)
Greg Kroah-Hartman
maintainerPATCH 310/375 mm: zswap: rename is_zswap_enabled() to zswap_is_enabled()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yosry Ahmed <[email protected]>
[ Upstream commit 2b33a97c94bc44468fc1d54b745269c0cf0b7bb2 ]
In preparation for introducing a similar function, rename is_zswap_enabled() to use zswap_* prefix like other zswap functions.
Stable-dep-of: e39925734909 ("mm/memcontrol: respect zswap.writeback setting from parent cg too")
--- include/linux/zswap.h | 4 ++-- mm/memcontrol.c | 2 +- mm/zswap.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-)
include/linux/zswap.h +2 -2
@@ -35,7 +35,7 @@ void zswap_swapoff(int type);void zswap_memcg_offline_cleanup (struct mem_cgroup *memcg);void zswap_lruvec_state_init (struct lruvec *lruvec);void zswap_folio_swapin (struct folio *folio); -bool is_zswap_enabled (void ); +bool zswap_is_enabled (void );#else struct zswap_lruvec_state {};
@@ -60,7 +60,7 @@ static inline void zswap_memcg_offline_cleanup(struct mem_cgroup *memcg) {}static inline void zswap_lruvec_state_init (struct lruvec *lruvec) {}static inline void zswap_folio_swapin (struct folio *folio) {} -static inline bool is_zswap_enabled (void ) +static inline bool zswap_is_enabled (void ) {return false; }
mm/memcontrol.c +1 -1
@@ -8444,7 +8444,7 @@ void obj_cgroup_uncharge_zswap(struct obj_cgroup *objcg, size_t size)bool mem_cgroup_zswap_writeback_enabled (struct mem_cgroup *memcg) {/* if zswap is disabled, do not block pages going to the swapping device */ -return !is_zswap_enabled () || !memcg ||READ_ONCE (memcg->zswap_writeback); +return !zswap_is_enabled () || !memcg ||READ_ONCE (memcg->zswap_writeback); } static u64 zswap_current_read(struct cgroup_subsys_state *css,
mm/zswap.c +1 -1
@@ -131,7 +131,7 @@ static bool zswap_shrinker_enabled = IS_ENABLED( CONFIG_ZSWAP_SHRINKER_DEFAULT_ON);module_param_named (shrinker_enabled, zswap_shrinker_enabled, bool,0644 ); -bool is_zswap_enabled (void ) +bool zswap_is_enabled (void ) {return zswap_enabled; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 311/375 mm/memcontrol: respect zswap.writeback setting from parent cg too
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Yuan <[email protected]>
[ Upstream commit e399257349098bf7c84343f99efb2bc9c22eb9fd ]
Currently, the behavior of zswap.writeback wrt. the cgroup hierarchy seems a bit odd. Unlike zswap.max, it doesn't honor the value from parent cgroups. This surfaced when people tried to globally disable zswap writeback, i.e. reserve physical swap space only for hibernation [1] - disabling zswap.writeback only for the root cgroup results in subcgroups with zswap.writeback=1 still performing writeback.
The inconsistency became more noticeable after I introduced the MemoryZSwapWriteback= systemd unit setting [2] for controlling the knob. The patch assumed that the kernel would enforce the value of parent cgroups. It could probably be workarounded from systemd's side, by going up the slice unit tree and inheriting the value. Yet I think it's more sensible to make it behave consistently with zswap.max and friends.
[1] https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate#Disable_zswap_writeback_to_use_the_swap_space_only_for_hibernation
[2] https://github.com/systemd/systemd/pull/31734
--- Documentation/admin-guide/cgroup-v2.rst | 7 ++++--- mm/memcontrol.c | 12 +++++++++--- 2 files changed, 13 insertions(+), 6 deletions(-)
Documentation/admin-guide/cgroup-v2.rst +4 -3
@@ -1706,9 +1706,10 @@ PAGE_SIZE multiple when read back. entries fault back in or are written out to disk. memory.zswap.writeback - A read-write single value file. The default value is "1". The - initial value of the root cgroup is 1, and when a new cgroup is - created, it inherits the current value of its parent. + A read-write single value file. The default value is "1". + Note that this setting is hierarchical, i.e. the writeback would be + implicitly disabled for child cgroups if the upper hierarchy + does so. When this is set to 0, all swapping attempts to swapping devices are disabled. This included both zswap writebacks, and swapping due
mm/memcontrol.c +9 -3
@@ -5804,8 +5804,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)WRITE_ONCE (memcg->soft_limit,PAGE_COUNTER_MAX );#if defined(CONFIG_MEMCG_KMEM ) && defined(CONFIG_ZSWAP ) memcg->zswap_max =PAGE_COUNTER_MAX ; -WRITE_ONCE (memcg->zswap_writeback, - !parent ||READ_ONCE (parent->zswap_writeback)); +WRITE_ONCE (memcg->zswap_writeback, true);#endif page_counter_set_high (&memcg->swap,PAGE_COUNTER_MAX );if (parent) {
@@ -8444,7 +8443,14 @@ void obj_cgroup_uncharge_zswap(struct obj_cgroup *objcg, size_t size)bool mem_cgroup_zswap_writeback_enabled (struct mem_cgroup *memcg) {/* if zswap is disabled, do not block pages going to the swapping device */ -return !zswap_is_enabled () || !memcg ||READ_ONCE (memcg->zswap_writeback); +if (!zswap_is_enabled ()) +return true; + +for (; memcg; memcg =parent_mem_cgroup (memcg)) +if (!READ_ONCE (memcg->zswap_writeback)) +return false; + +return true; } static u64 zswap_current_read(struct cgroup_subsys_state *css,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 312/375 workqueue: wq_watchdog_touch is always called with valid CPU
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Piggin <[email protected]>
[ Upstream commit 18e24deb1cc92f2068ce7434a94233741fbd7771 ]
Warn in the case it is called with cpu == -1. This does not appear to happen anywhere.
Stable-dep-of: 98f887f820c9 ("workqueue: Improve scalability of workqueue watchdog touch")
--- kernel/workqueue.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/workqueue.c +2 -0
@@ -7588,6 +7588,8 @@ notrace void wq_watchdog_touch(int cpu) {if (cpu >=0 )per_cpu (wq_watchdog_touched_cpu, cpu) = jiffies; +else +WARN_ONCE (1 ,"%s should be called with valid CPU" , __func__); wq_watchdog_touched = jiffies; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 313/375 workqueue: Improve scalability of workqueue watchdog touch
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Piggin <[email protected]>
[ Upstream commit 98f887f820c993e05a12e8aa816c80b8661d4c87 ]
On a ~2000 CPU powerpc system, hard lockups have been observed in the workqueue code when stop_machine runs (in this case due to CPU hotplug). This is due to lots of CPUs spinning in multi_cpu_stop, calling touch_nmi_watchdog() which ends up calling wq_watchdog_touch(). wq_watchdog_touch() writes to the global variable wq_watchdog_touched, and that can find itself in the same cacheline as other important workqueue data, which slows down operations to the point of lockups.
In the case of the following abridged trace, worker_pool_idr was in the hot line, causing the lockups to always appear at idr_find.
watchdog: CPU 1125 self-detected hard LOCKUP @ idr_find
Call Trace: get_work_pool __queue_work call_timer_fn run_timer_softirq __do_softirq do_softirq_own_stack irq_exit timer_interrupt decrementer_common_virt * interrupt: 900 (timer) at multi_cpu_stop multi_cpu_stop cpu_stopper_thread smpboot_thread_fn kthread
Fix this by having wq_watchdog_touch() only write to the line if the last time a touch was recorded exceeds 1/4 of the watchdog threshold.
--- kernel/workqueue.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
kernel/workqueue.c +8 -2
@@ -7586,12 +7586,18 @@ static void wq_watchdog_timer_fn(struct timer_list *unused) notrace void wq_watchdog_touch(int cpu) { +unsigned long thresh =READ_ONCE (wq_watchdog_thresh) *HZ ; +unsigned long touch_ts =READ_ONCE (wq_watchdog_touched); +unsigned long now = jiffies; +if (cpu >=0 ) -per_cpu (wq_watchdog_touched_cpu, cpu) = jiffies; +per_cpu (wq_watchdog_touched_cpu, cpu) = now;else WARN_ONCE (1 ,"%s should be called with valid CPU" , __func__); - wq_watchdog_touched = jiffies; +/* Don't unnecessarily store to global cacheline */ +if (time_after (now, touch_ts + thresh /4 )) +WRITE_ONCE (wq_watchdog_touched, jiffies); }static void wq_watchdog_set_thresh (unsigned long thresh)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 314/375 path: add cleanup helper
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Brauner <[email protected]>
[ Upstream commit ff2c570ef7eaa9ded58e7a02dd7a68874a897508 ]
Add a simple cleanup helper so we can cleanup struct path easily. No need for any extra machinery. Avoid DEFINE_FREE() as it causes a local copy of struct path to be used. Just rely on path_put() directly called from a cleanup helper.
Stable-dep-of: dd7cb142f467 ("fs: relax permissions for listmount()")
--- include/linux/path.h | 9 +++++++++ 1 file changed, 9 insertions(+)
include/linux/path.h +9 -0
@@ -24,4 +24,13 @@ static inline void path_put_init(struct path *path) *path = (struct path) { }; } +/* +* Cleanup macro for use with __free(path_put). Avoids dereference and +* copying @path unlike DEFINE_FREE(). path_put() will handle the empty +* path correctly just ensure @path is initialized: +* +* struct path path __free(path_put) = {}; +*/ +#define __free_path_put path_put +#endif /* _LINUX_PATH_H */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 315/375 fs: simplify error handling
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Brauner <[email protected]>
[ Upstream commit 17e70161281bb66316e94e63a15d1a8498bf6f01 ]
Rely on cleanup helper and simplify error handling
Stable-dep-of: dd7cb142f467 ("fs: relax permissions for listmount()")
--- fs/namespace.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-)
fs/namespace.c +6 -12
@@ -5051,7 +5051,7 @@ static struct mount *listmnt_next(struct mount *curr)static ssize_t do_listmount (u64 mnt_parent_id,u64 last_mnt_id,u64 *mnt_ids,size_t nr_mnt_ids) { -struct path root; + struct path root __free(path_put) = {};struct mnt_namespace *ns = current->nsproxy->mnt_ns;struct path orig;struct mount *r, *first;
@@ -5064,10 +5064,8 @@ static ssize_t do_listmount(u64 mnt_parent_id, u64 last_mnt_id, u64 *mnt_ids, orig = root; }else { orig.mnt =lookup_mnt_in_ns (mnt_parent_id, ns); -if (!orig.mnt) { - ret = -ENOENT ; - goto err; - } +if (!orig.mnt) +return -ENOENT ; orig.dentry = orig.mnt->mnt_root; }
@@ -5076,14 +5074,12 @@ static ssize_t do_listmount(u64 mnt_parent_id, u64 last_mnt_id, u64 *mnt_ids,* mounts to show users. */ if (!is_path_reachable (real_mount (orig.mnt), orig.dentry, &root) && - !ns_capable_noaudit (&init_user_ns,CAP_SYS_ADMIN )) { - ret = -EPERM ; - goto err; - } + !ns_capable_noaudit (&init_user_ns,CAP_SYS_ADMIN )) +return -EPERM ; ret =security_sb_statfs (orig.dentry);if (ret) - goto err; +return ret;if (!last_mnt_id) first =node_to_mount (rb_first (&ns->mounts));
@@ -5100,8 +5096,6 @@ static ssize_t do_listmount(u64 mnt_parent_id, u64 last_mnt_id, u64 *mnt_ids, nr_mnt_ids--; ret++; } -err: -path_put (&root);return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 316/375 fs: relax permissions for listmount()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Brauner <[email protected]>
[ Upstream commit dd7cb142f467c4660698bcaa4a48c688b443ab81 ]
It is sufficient to have capabilities in the owning user namespace of the mount namespace to list all mounts regardless of whether they are reachable or not.
--- fs/namespace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/namespace.c +1 -1
@@ -5074,7 +5074,7 @@ static ssize_t do_listmount(u64 mnt_parent_id, u64 last_mnt_id, u64 *mnt_ids,* mounts to show users. */ if (!is_path_reachable (real_mount (orig.mnt), orig.dentry, &root) && - !ns_capable_noaudit (&init_user_ns,CAP_SYS_ADMIN )) + !ns_capable_noaudit (ns->user_ns,CAP_SYS_ADMIN ))return -EPERM ; ret =security_sb_statfs (orig.dentry);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 317/375 ACPI: processor: Return an error if acpi_processor_get_info() fails in processor_add()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Cameron <[email protected]>
[ Upstream commit fadf231f0a06a6748a7fc4a2c29ac9ef7bca6bfd ]
Rafael observed [1] that returning 0 from processor_add() will result in acpi_default_enumeration() being called which will attempt to create a platform device, but that makes little sense when the processor is known to be not available. So just return the error code from acpi_processor_get_info() instead.
Stable-dep-of: 47ec9b417ed9 ("ACPI: processor: Fix memory leaks in error paths of processor_add()")
--- drivers/acpi/acpi_processor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/acpi/acpi_processor.c +1 -1
@@ -400,7 +400,7 @@ static int acpi_processor_add(struct acpi_device *device, result =acpi_processor_get_info (device);if (result)/* Processor is not physically present or unavailable */ -return 0 ; +return result;BUG_ON (pr->id >= nr_cpu_ids);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 318/375 ACPI: processor: Fix memory leaks in error paths of processor_add()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Cameron <[email protected]>
[ Upstream commit 47ec9b417ed9b6b8ec2a941cd84d9de62adc358a ]
If acpi_processor_get_info() returned an error, pr and the associated pr->throttling.shared_cpu_map were leaked.
The unwind code was in the wrong order wrt to setup, relying on some unwind actions having no affect (clearing variables that were never set etc). That makes it harder to reason about so reorder and add appropriate labels to only undo what was actually set up in the first place.
--- drivers/acpi/acpi_processor.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/acpi/acpi_processor.c +8 -7
@@ -400,7 +400,7 @@ static int acpi_processor_add(struct acpi_device *device, result =acpi_processor_get_info (device);if (result)/* Processor is not physically present or unavailable */ -return result; + goto err_clear_driver_data;BUG_ON (pr->id >= nr_cpu_ids);
@@ -415,7 +415,7 @@ static int acpi_processor_add(struct acpi_device *device,"BIOS reported wrong ACPI id %d for the processor\n" , pr->id);/* Give up, but do not abort the namespace scan. */ - goto err; + goto err_clear_driver_data; }/* * processor_device_array is not cleared on errors to allow buggy BIOS
@@ -427,12 +427,12 @@ static int acpi_processor_add(struct acpi_device *device, dev =get_cpu_device (pr->id);if (!dev) { result = -ENODEV ; - goto err; + goto err_clear_per_cpu; } result =acpi_bind_one (dev, device);if (result) - goto err; + goto err_clear_per_cpu; pr->dev = dev;
@@ -443,10 +443,11 @@ static int acpi_processor_add(struct acpi_device *device,dev_err (dev,"Processor driver could not be attached\n" );acpi_unbind_one (dev); - err: -free_cpumask_var (pr->throttling.shared_cpu_map); - device->driver_data =NULL ; + err_clear_per_cpu:per_cpu (processors, pr->id) =NULL ; + err_clear_driver_data: + device->driver_data =NULL ; +free_cpumask_var (pr->throttling.shared_cpu_map); err_free_pr:kfree (pr);return result;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 319/375 arm64: acpi: Move get_cpu_for_acpi_id() to a header
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Morse <[email protected]>
[ Upstream commit 8d34b6f17b9ac93faa2791eb037dcb08bdf755de ]
ACPI identifies CPUs by UID. get_cpu_for_acpi_id() maps the ACPI UID to the Linux CPU number.
The helper to retrieve this mapping is only available in arm64's NUMA code.
Move it to live next to get_acpi_id_for_cpu().
Stable-dep-of: 2488444274c7 ("arm64: acpi: Harden get_cpu_for_acpi_id() against missing CPU entry")
--- arch/arm64/include/asm/acpi.h | 11 +++++++++++ arch/arm64/kernel/acpi_numa.c | 11 ----------- 2 files changed, 11 insertions(+), 11 deletions(-)
arch/arm64/include/asm/acpi.h +11 -0
@@ -119,6 +119,17 @@ static inline u32 get_acpi_id_for_cpu(unsigned int cpu)return acpi_cpu_get_madt_gicc (cpu)->uid; } +static inline int get_cpu_for_acpi_id (u32 uid) +{ +int cpu; + +for (cpu =0 ; cpu < nr_cpu_ids; cpu++) +if (uid ==get_acpi_id_for_cpu (cpu)) +return cpu; + +return -EINVAL ; +} +static inline void arch_fix_phys_package_id (int num,u32 slot) { }void __init acpi_init_cpus (void );int apei_claim_sea (struct pt_regs *regs);
arch/arm64/kernel/acpi_numa.c +0 -11
@@ -34,17 +34,6 @@ int __init acpi_numa_get_nid(unsigned int cpu)return acpi_early_node_map[cpu]; } -static inline int get_cpu_for_acpi_id (u32 uid) -{ -int cpu; - -for (cpu =0 ; cpu < nr_cpu_ids; cpu++) -if (uid ==get_acpi_id_for_cpu (cpu)) -return cpu; - -return -EINVAL ; -} -static int __init acpi_parse_gicc_pxm (union acpi_subtable_headers *header,const unsigned long end) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 320/375 arm64: acpi: Harden get_cpu_for_acpi_id() against missing CPU entry
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Cameron <[email protected]>
[ Upstream commit 2488444274c70038eb6b686cba5f1ce48ebb9cdd ]
In a review discussion of the changes to support vCPU hotplug where a check was added on the GICC being enabled if was online, it was noted that there is need to map back to the cpu and use that to index into a cpumask. As such, a valid ID is needed.
If an MPIDR check fails in acpi_map_gic_cpu_interface() it is possible for the entry in cpu_madt_gicc[cpu] == NULL. This function would
then cause a NULL pointer dereference. Whilst a path to trigger
this has not been established, harden this caller against the possibility.
--- arch/arm64/include/asm/acpi.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm64/include/asm/acpi.h +2 -1
@@ -124,7 +124,8 @@ static inline int get_cpu_for_acpi_id(u32 uid)int cpu;for (cpu =0 ; cpu < nr_cpu_ids; cpu++) -if (uid ==get_acpi_id_for_cpu (cpu)) +if (acpi_cpu_get_madt_gicc (cpu) && + uid ==get_acpi_id_for_cpu (cpu))return cpu;return -EINVAL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 321/375 can: mcp251xfd: mcp251xfd_handle_rxif_ring_uinc(): factor out in separate function
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit d49184b7b585f9da7ee546b744525f62117019f6 ]
This is a preparation patch.
Sending the UINC messages followed by incrementing the tail pointer will be called in more than one place in upcoming patches, so factor this out into a separate function.
Also make mcp251xfd_handle_rxif_ring_uinc() safe to be called with a "len" of 0.
Stable-dep-of: 85505e585637 ("can: mcp251xfd: rx: prepare to workaround broken RX FIFO head index erratum")
--- drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c | 48 +++++++++++++------- 1 file changed, 32 insertions(+), 16 deletions(-)
drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c +32 -16
@@ -197,6 +197,37 @@ mcp251xfd_rx_obj_read(const struct mcp251xfd_priv *priv,return err; } +static int +mcp251xfd_handle_rxif_ring_uinc (const struct mcp251xfd_priv *priv, +struct mcp251xfd_rx_ring *ring, +u8 len) +{ +int offset; +int err; + +if (!len) +return 0 ; + +/* Increment the RX FIFO tail pointer 'len' times in a +* single SPI message. +* +* Note: +* Calculate offset, so that the SPI transfer ends on +* the last message of the uinc_xfer array, which has +* "cs_change == 0", to properly deactivate the chip +* select. +*/ + offset =ARRAY_SIZE (ring->uinc_xfer) - len; + err =spi_sync_transfer (priv->spi, + ring->uinc_xfer + offset, len); +if (err) +return err; + + ring->tail += len; + +return 0 ; +} +static int mcp251xfd_handle_rxif_ring (struct mcp251xfd_priv *priv,struct mcp251xfd_rx_ring *ring)
@@ -210,8 +241,6 @@ mcp251xfd_handle_rxif_ring(struct mcp251xfd_priv *priv,return err;while ((len =mcp251xfd_get_rx_linear_len (ring))) { -int offset; - rx_tail =mcp251xfd_get_rx_tail (ring); err = mcp251xfd_rx_obj_read(priv, ring, hw_rx_obj,
@@ -227,22 +256,9 @@ mcp251xfd_handle_rxif_ring(struct mcp251xfd_priv *priv,return err; } -/* Increment the RX FIFO tail pointer 'len' times in a -* single SPI message. -* -* Note: -* Calculate offset, so that the SPI transfer ends on -* the last message of the uinc_xfer array, which has -* "cs_change == 0", to properly deactivate the chip -* select. -*/ - offset =ARRAY_SIZE (ring->uinc_xfer) - len; - err =spi_sync_transfer (priv->spi, - ring->uinc_xfer + offset, len); + err =mcp251xfd_handle_rxif_ring_uinc (priv, ring, len);if (err)return err; - - ring->tail += len; }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 322/375 can: mcp251xfd: rx: prepare to workaround broken RX FIFO head index erratum
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit 85505e585637a737e4713c1386c30e37c325b82e ]
This is a preparatory patch to work around erratum DS80000789E 6 of the mcp2518fd, the other variants of the chip family (mcp2517fd and mcp251863) are probably also affected.
When handling the RX interrupt, the driver iterates over all pending FIFOs (which are implemented as ring buffers in hardware) and reads the FIFO header index from the RX FIFO STA register of the chip.
In the bad case, the driver reads a too large head index. In the original code, the driver always trusted the read value, which caused old CAN frames that were already processed, or new, incompletely written CAN frames to be (re-)processed.
Instead of reading and trusting the head index, read the head index and calculate the number of CAN frames that were supposedly received - replace mcp251xfd_rx_ring_update() with mcp251xfd_get_rx_len().
The mcp251xfd_handle_rxif_ring() function reads the received CAN frames from the chip, iterates over them and pushes them into the network stack. Prepare that the iteration can be stopped if an old CAN frame is detected. The actual code to detect old or incomplete frames and abort will be added in the next patch.
--- .../net/can/spi/mcp251xfd/mcp251xfd-ring.c | 2 + drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c | 89 +++++++++++-------- drivers/net/can/spi/mcp251xfd/mcp251xfd.h | 12 +-- 3 files changed, 56 insertions(+), 47 deletions(-)
drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c +2 -0
@@ -523,6 +523,8 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv) } rx_ring->obj_num = rx_obj_num; + rx_ring->obj_num_shift_to_u8 =BITS_PER_TYPE (rx_ring->obj_num_shift_to_u8) - +ilog2 (rx_obj_num); rx_ring->obj_size = rx_obj_size; priv->rx[i] = rx_ring; }
drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c +52 -37
148 lines not on this page · raw message
drivers/net/can/spi/mcp251xfd/mcp251xfd.h +2 -10
@@ -558,6 +558,7 @@ struct mcp251xfd_rx_ring {u8 nr;u8 fifo_nr;u8 obj_num; +u8 obj_num_shift_to_u8;u8 obj_size;union mcp251xfd_write_reg_buf irq_enable_buf;
@@ -907,18 +908,9 @@ static inline u8 mcp251xfd_get_rx_tail(const struct mcp251xfd_rx_ring *ring)return ring->tail & (ring->obj_num -1 ); } -static inline u8 mcp251xfd_get_rx_len (const struct mcp251xfd_rx_ring *ring) -{ -return ring->head - ring->tail; -} -static inline u8 -mcp251xfd_get_rx_linear_len (const struct mcp251xfd_rx_ring *ring) +mcp251xfd_get_rx_linear_len (const struct mcp251xfd_rx_ring *ring,u8 len) { -u8 len; - - len =mcp251xfd_get_rx_len (ring); -return min_t (u8, len, ring->obj_num -mcp251xfd_get_rx_tail (ring)); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 323/375 can: mcp251xfd: clarify the meaning of timestamp
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit e793c724b48ca8cae9693bc3be528e85284c126a ]
The mcp251xfd chip is configured to provide a timestamp with each received and transmitted CAN frame. The timestamp is derived from the internal free-running timer, which can also be read from the TBC register via SPI. The timer is 32 bits wide and is clocked by the external oscillator (typically 20 or 40 MHz).
To avoid confusion, we call this timestamp "timestamp_raw" or "ts_raw" for short.
Using the timecounter framework, the "ts_raw" is converted to 64 bit nanoseconds since the epoch. This is what we call "timestamp".
This is a preparation for the next patches which use the "timestamp" to work around a bug where so far only the "ts_raw" is used.
Stable-dep-of: 24436be590c6 ("can: mcp251xfd: rx: add workaround for erratum DS80000789E 6 of mcp2518fd")
--- .../net/can/spi/mcp251xfd/mcp251xfd-core.c | 28 +++++++++---------- drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c | 2 +- drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c | 2 +- .../can/spi/mcp251xfd/mcp251xfd-timestamp.c | 22 ++++----------- drivers/net/can/spi/mcp251xfd/mcp251xfd.h | 27 ++++++++++++++---- 5 files changed, 43 insertions(+), 38 deletions(-)
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c +14 -14
@@ -2,7 +2,7 @@// // mcp251xfd - Microchip MCP251xFD Family CAN controller driver // -// Copyright (c) 2019, 2020, 2021 Pengutronix, +// Copyright (c) 2019, 2020, 2021, 2023 Pengutronix, // Marc Kleine-Budde <[email protected]> // // Based on:
@@ -867,18 +867,18 @@ static int mcp251xfd_get_berr_counter(const struct net_device *ndev,static struct sk_buff *mcp251xfd_alloc_can_err_skb (struct mcp251xfd_priv *priv, -struct can_frame **cf,u32 *timestamp) +struct can_frame **cf,u32 *ts_raw) {struct sk_buff *skb;int err; - err =mcp251xfd_get_timestamp (priv, timestamp); + err =mcp251xfd_get_timestamp_raw (priv, ts_raw);if (err)return NULL ; skb =alloc_can_err_skb (priv->ndev, cf);if (skb) -mcp251xfd_skb_set_timestamp (priv, skb, *timestamp); +mcp251xfd_skb_set_timestamp_raw (priv, skb, *ts_raw);return skb; }
@@ -889,7 +889,7 @@ static int mcp251xfd_handle_rxovif(struct mcp251xfd_priv *priv)struct mcp251xfd_rx_ring *ring;struct sk_buff *skb;struct can_frame *cf; -u32 timestamp, rxovif; +u32 ts_raw, rxovif;int err, i; stats->rx_over_errors++;
@@ -924,14 +924,14 @@ static int mcp251xfd_handle_rxovif(struct mcp251xfd_priv *priv)return err; } - skb =mcp251xfd_alloc_can_err_skb (priv, &cf, ×tamp); + skb =mcp251xfd_alloc_can_err_skb (priv, &cf, &ts_raw);if (!skb)return 0 ; cf->can_id |=CAN_ERR_CRTL ; cf->data[1 ] =CAN_ERR_CRTL_RX_OVERFLOW ; - err =can_rx_offload_queue_timestamp (&priv->offload, skb, timestamp); + err =can_rx_offload_queue_timestamp (&priv->offload, skb, ts_raw);if (err) stats->rx_fifo_errors++;
@@ -948,12 +948,12 @@ static int mcp251xfd_handle_txatif(struct mcp251xfd_priv *priv)static int mcp251xfd_handle_ivmif (struct mcp251xfd_priv *priv) {struct net_device_stats *stats = &priv->ndev->stats; -u32 bdiag1, timestamp; +u32 bdiag1, ts_raw;struct sk_buff *skb;struct can_frame *cf =NULL ;int err; - err =mcp251xfd_get_timestamp (priv, ×tamp); + err =mcp251xfd_get_timestamp_raw (priv, &ts_raw);if (err)return err;
@@ -1035,8 +1035,8 @@ static int mcp251xfd_handle_ivmif(struct mcp251xfd_priv *priv)if (!cf)return 0 ; -mcp251xfd_skb_set_timestamp (priv, skb, timestamp); - err =can_rx_offload_queue_timestamp (&priv->offload, skb, timestamp); +mcp251xfd_skb_set_timestamp_raw (priv, skb, ts_raw); + err =can_rx_offload_queue_timestamp (&priv->offload, skb, ts_raw);if (err) stats->rx_fifo_errors++;
@@ -1049,7 +1049,7 @@ static int mcp251xfd_handle_cerrif(struct mcp251xfd_priv *priv)struct sk_buff *skb;struct can_frame *cf =NULL ;enum can_state new_state, rx_state, tx_state; -u32 trec, timestamp; +u32 trec, ts_raw;int err; err =regmap_read (priv->map_reg,MCP251XFD_REG_TREC , &trec);
@@ -1079,7 +1079,7 @@ static int mcp251xfd_handle_cerrif(struct mcp251xfd_priv *priv)/* The skb allocation might fail, but can_change_state() * handles cf == NULL. */ - skb =mcp251xfd_alloc_can_err_skb (priv, &cf, ×tamp); + skb =mcp251xfd_alloc_can_err_skb (priv, &cf, &ts_raw);can_change_state (priv->ndev, cf, tx_state, rx_state);if (new_state ==CAN_STATE_BUS_OFF ) {
@@ -1110,7 +1110,7 @@ static int mcp251xfd_handle_cerrif(struct mcp251xfd_priv *priv) cf->data[7 ] = bec.rxerr; } - err =can_rx_offload_queue_timestamp (&priv->offload, skb, timestamp); + err =can_rx_offload_queue_timestamp (&priv->offload, skb, ts_raw);if (err) stats->rx_fifo_errors++;
drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c +1 -1
@@ -160,7 +160,7 @@ mcp251xfd_hw_rx_obj_to_skb(const struct mcp251xfd_priv *priv,if (!(hw_rx_obj->flags &MCP251XFD_OBJ_FLAGS_RTR ))memcpy (cfd->data, hw_rx_obj->data, cfd->len); -mcp251xfd_skb_set_timestamp (priv, skb, hw_rx_obj->ts); +mcp251xfd_skb_set_timestamp_raw (priv, skb, hw_rx_obj->ts); } static int
drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c +1 -1
@@ -97,7 +97,7 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv, tef_tail =mcp251xfd_get_tef_tail (priv); skb = priv->can.echo_skb[tef_tail];if (skb) -mcp251xfd_skb_set_timestamp (priv, skb, hw_tef_obj->ts); +mcp251xfd_skb_set_timestamp_raw (priv, skb, hw_tef_obj->ts); stats->tx_bytes += can_rx_offload_get_echo_skb_queue_timestamp(&priv->offload, tef_tail, hw_tef_obj->ts,
drivers/net/can/spi/mcp251xfd/mcp251xfd-timestamp.c +6 -16
@@ -2,7 +2,7 @@// // mcp251xfd - Microchip MCP251xFD Family CAN controller driver // -// Copyright (c) 2021 Pengutronix, +// Copyright (c) 2021, 2023 Pengutronix, // Marc Kleine-Budde <[email protected]> //
@@ -11,20 +11,20 @@#include "mcp251xfd.h" -static u64 mcp251xfd_timestamp_read (const struct cyclecounter *cc) +static u64 mcp251xfd_timestamp_raw_read (const struct cyclecounter *cc) {const struct mcp251xfd_priv *priv; -u32 timestamp =0 ; +u32 ts_raw =0 ;int err; priv = container_of(cc, struct mcp251xfd_priv, cc); - err =mcp251xfd_get_timestamp (priv, ×tamp); + err =mcp251xfd_get_timestamp_raw (priv, &ts_raw);if (err)netdev_err (priv->ndev,"Error %d while reading timestamp. HW timestamps may be inaccurate." , err); -return timestamp; +return ts_raw; }static void mcp251xfd_timestamp_work (struct work_struct *work)
@@ -39,21 +39,11 @@ static void mcp251xfd_timestamp_work(struct work_struct *work) MCP251XFD_TIMESTAMP_WORK_DELAY_SEC * HZ); } -void mcp251xfd_skb_set_timestamp (const struct mcp251xfd_priv *priv, -struct sk_buff *skb,u32 timestamp) -{ -struct skb_shared_hwtstamps *hwtstamps =skb_hwtstamps (skb); -u64 ns; - - ns =timecounter_cyc2time (&priv->tc, timestamp); - hwtstamps->hwtstamp =ns_to_ktime (ns); -} -void mcp251xfd_timestamp_init (struct mcp251xfd_priv *priv) {struct cyclecounter *cc = &priv->cc; - cc->read = mcp251xfd_timestamp_read; + cc->read = mcp251xfd_timestamp_raw_read; cc->mask =CYCLECOUNTER_MASK (32 ); cc->shift =1 ; cc->mult =clocksource_hz2mult (priv->can.clock.freq, cc->shift);
drivers/net/can/spi/mcp251xfd/mcp251xfd.h +21 -6
@@ -2,7 +2,7 @@* * mcp251xfd - Microchip MCP251xFD Family CAN controller driver * -* Copyright (c) 2019, 2020, 2021 Pengutronix, +* Copyright (c) 2019, 2020, 2021, 2023 Pengutronix, * Marc Kleine-Budde <[email protected]> * Copyright (c) 2019 Martin Sperl <[email protected]> */
@@ -812,10 +812,27 @@ mcp251xfd_spi_cmd_write(const struct mcp251xfd_priv *priv,return data; } -static inline int mcp251xfd_get_timestamp (const struct mcp251xfd_priv *priv, -u32 *timestamp) +static inline int mcp251xfd_get_timestamp_raw (const struct mcp251xfd_priv *priv, +u32 *ts_raw) { -return regmap_read (priv->map_reg,MCP251XFD_REG_TBC , timestamp); +return regmap_read (priv->map_reg,MCP251XFD_REG_TBC , ts_raw); +} + +static inline void mcp251xfd_skb_set_timestamp (struct sk_buff *skb,u64 ns) +{ +struct skb_shared_hwtstamps *hwtstamps =skb_hwtstamps (skb); + + hwtstamps->hwtstamp =ns_to_ktime (ns); +} + +static inline +void mcp251xfd_skb_set_timestamp_raw (const struct mcp251xfd_priv *priv, +struct sk_buff *skb,u32 ts_raw) +{ +u64 ns; + + ns =timecounter_cyc2time (&priv->tc, ts_raw); +mcp251xfd_skb_set_timestamp (skb, ns); }static inline u16 mcp251xfd_get_tef_obj_addr (u8 n)
@@ -936,8 +953,6 @@ void mcp251xfd_ring_free(struct mcp251xfd_priv *priv);int mcp251xfd_ring_alloc (struct mcp251xfd_priv *priv);int mcp251xfd_handle_rxif (struct mcp251xfd_priv *priv);int mcp251xfd_handle_tefif (struct mcp251xfd_priv *priv); -void mcp251xfd_skb_set_timestamp (const struct mcp251xfd_priv *priv, -struct sk_buff *skb,u32 timestamp);void mcp251xfd_timestamp_init (struct mcp251xfd_priv *priv);void mcp251xfd_timestamp_stop (struct mcp251xfd_priv *priv);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 324/375 can: mcp251xfd: rx: add workaround for erratum DS80000789E 6 of mcp2518fd
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit 24436be590c6fbb05f6161b0dfba7d9da60214aa ]
This patch tries to works around erratum DS80000789E 6 of the mcp2518fd, the other variants of the chip family (mcp2517fd and mcp251863) are probably also affected.
In the bad case, the driver reads a too large head index. In the original code, the driver always trusted the read value, which caused old, already processed CAN frames or new, incompletely written CAN frames to be (re-)processed.
To work around this issue, keep a per FIFO timestamp [1] of the last valid received CAN frame and compare against the timestamp of every received CAN frame. If an old CAN frame is detected, abort the iteration and mark the number of valid CAN frames as processed in the chip by incrementing the FIFO's tail index.
Further tests showed that this workaround can recognize old CAN frames, but a small time window remains in which partially written CAN frames [2] are not recognized but then processed. These CAN frames have the correct data and time stamps, but the DLC has not yet been updated.
[1] As the raw timestamp overflows every 107 seconds (at the usual clock rate of 40 MHz) convert it to nanoseconds with the timecounter framework and use this to detect stale CAN frames.
--- .../net/can/spi/mcp251xfd/mcp251xfd-ring.c | 1 + drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c | 32 +++++++++++++++++-- drivers/net/can/spi/mcp251xfd/mcp251xfd.h | 3 ++ 3 files changed, 33 insertions(+), 3 deletions(-)
drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c +1 -0
@@ -206,6 +206,7 @@ mcp251xfd_ring_init_rx(struct mcp251xfd_priv *priv, u16 *base, u8 *fifo_nr)int i, j;mcp251xfd_for_each_rx_ring (priv, rx_ring, i) { + rx_ring->last_valid =timecounter_read (&priv->tc); rx_ring->head =0 ; rx_ring->tail =0 ; rx_ring->base = *base;
drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c +29 -3
@@ -159,8 +159,6 @@ mcp251xfd_hw_rx_obj_to_skb(const struct mcp251xfd_priv *priv,if (!(hw_rx_obj->flags &MCP251XFD_OBJ_FLAGS_RTR ))memcpy (cfd->data, hw_rx_obj->data, cfd->len); - -mcp251xfd_skb_set_timestamp_raw (priv, skb, hw_rx_obj->ts); } static int
@@ -171,8 +169,26 @@ mcp251xfd_handle_rxif_one(struct mcp251xfd_priv *priv,struct net_device_stats *stats = &priv->ndev->stats;struct sk_buff *skb;struct canfd_frame *cfd; +u64 timestamp;int err; +/* According to mcp2518fd erratum DS80000789E 6. the FIFOCI +* bits of a FIFOSTA register, here the RX FIFO head index +* might be corrupted and we might process past the RX FIFO's +* head into old CAN frames. +* +* Compare the timestamp of currently processed CAN frame with +* last valid frame received. Abort with -EBADMSG if an old +* CAN frame is detected. +*/ + timestamp =timecounter_cyc2time (&priv->tc, hw_rx_obj->ts); +if (timestamp <= ring->last_valid) { + stats->rx_fifo_errors++; + +return -EBADMSG ; + } + ring->last_valid = timestamp; +if (hw_rx_obj->flags &MCP251XFD_OBJ_FLAGS_FDF ) skb =alloc_canfd_skb (priv->ndev, &cfd);else
@@ -183,6 +199,7 @@ mcp251xfd_handle_rxif_one(struct mcp251xfd_priv *priv,return 0 ; } +mcp251xfd_skb_set_timestamp (skb, timestamp);mcp251xfd_hw_rx_obj_to_skb (priv, hw_rx_obj, skb); err =can_rx_offload_queue_timestamp (&priv->offload, skb, hw_rx_obj->ts);if (err)
@@ -265,7 +282,16 @@ mcp251xfd_handle_rxif_ring(struct mcp251xfd_priv *priv, err =mcp251xfd_handle_rxif_one (priv, ring, (void *)hw_rx_obj + i * ring->obj_size); -if (err) + +/* -EBADMSG means we're affected by mcp2518fd +* erratum DS80000789E 6., i.e. the timestamp +* in the RX object is older that the last +* valid received CAN frame. Don't process any +* further and mark processed frames as good. +*/ +if (err == -EBADMSG ) +return mcp251xfd_handle_rxif_ring_uinc (priv, ring, i); +else if (err)return err; }
drivers/net/can/spi/mcp251xfd/mcp251xfd.h +3 -0
@@ -554,6 +554,9 @@ struct mcp251xfd_rx_ring {unsigned int head;unsigned int tail; +/* timestamp of the last valid received CAN frame */ +u64 last_valid; +u16 base;u8 nr;u8 fifo_nr;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 325/375 drm/amd: Add gfx12 swizzle mode defs
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aurabindo Pillai <[email protected]>
[ Upstream commit 7ceb94e87bffff7c12b61eb29749e1d8ac976896 ]
Add GFX12 swizzle mode definitions for use with DCN401
Stable-dep-of: 8dd1426e2c80 ("drm/amdgpu: handle gfx12 in amdgpu_display_verify_sizes")
--- include/uapi/drm/drm_fourcc.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
include/uapi/drm/drm_fourcc.h +16 -0
@@ -1476,6 +1476,7 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)#define AMD_FMT_MOD_TILE_VER_GFX10 2#define AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS 3#define AMD_FMT_MOD_TILE_VER_GFX11 4 +#define AMD_FMT_MOD_TILE_VER_GFX12 5/* * 64K_S is the same for GFX9/GFX10/GFX10_RBPLUS and hence has GFX9 as canonical
@@ -1486,6 +1487,8 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)/* * 64K_D for non-32 bpp is the same for GFX9/GFX10/GFX10_RBPLUS and hence has * GFX9 as canonical version. +* +* 64K_D_2D on GFX12 is identical to 64K_D on GFX11. */ #define AMD_FMT_MOD_TILE_GFX9_64K_D 10#define AMD_FMT_MOD_TILE_GFX9_64K_S_X 25
@@ -1493,6 +1496,19 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)#define AMD_FMT_MOD_TILE_GFX9_64K_R_X 27#define AMD_FMT_MOD_TILE_GFX11_256K_R_X 31 +/* Gfx12 swizzle modes: +* 0 - LINEAR +* 1 - 256B_2D - 2D block dimensions +* 2 - 4KB_2D +* 3 - 64KB_2D +* 4 - 256KB_2D +* 5 - 4KB_3D - 3D block dimensions +* 6 - 64KB_3D +* 7 - 256KB_3D +*/ +#define AMD_FMT_MOD_TILE_GFX12_64K_2D 3 +#define AMD_FMT_MOD_TILE_GFX12_256K_2D 4 +#define AMD_FMT_MOD_DCC_BLOCK_64B 0#define AMD_FMT_MOD_DCC_BLOCK_128B 1#define AMD_FMT_MOD_DCC_BLOCK_256B 2
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 326/375 drm/amdgpu: handle gfx12 in amdgpu_display_verify_sizes
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Olšák <[email protected]>
[ Upstream commit 8dd1426e2c80e32ac1995007330c8f95ffa28ebb ]
It verified GFX9-11 swizzle modes on GFX12, which has undefined behavior.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 27 ++++++++++++++++++++- include/uapi/drm/drm_fourcc.h | 2 ++ 2 files changed, 28 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +26 -1
@@ -1041,6 +1041,30 @@ static int amdgpu_display_verify_sizes(struct amdgpu_framebuffer *rfb) block_width =256 / format_info->cpp[i]; block_height =1 ; block_size_log2 =8 ; + }else if (AMD_FMT_MOD_GET (TILE_VERSION , modifier) >=AMD_FMT_MOD_TILE_VER_GFX12 ) { +int swizzle =AMD_FMT_MOD_GET (TILE , modifier); + +switch (swizzle) { +case AMD_FMT_MOD_TILE_GFX12_256B_2D : + block_size_log2 =8 ; +break ; +case AMD_FMT_MOD_TILE_GFX12_4K_2D : + block_size_log2 =12 ; +break ; +case AMD_FMT_MOD_TILE_GFX12_64K_2D : + block_size_log2 =16 ; +break ; +case AMD_FMT_MOD_TILE_GFX12_256K_2D : + block_size_log2 =18 ; +break ; +default : +drm_dbg_kms (rfb->base.dev, +"Gfx12 swizzle mode with unknown block size: %d\n" , swizzle); +return -EINVAL ; + } + +get_block_dimensions (block_size_log2, format_info->cpp[i], + &block_width, &block_height); }else {int swizzle =AMD_FMT_MOD_GET (TILE , modifier);
@@ -1076,7 +1100,8 @@ static int amdgpu_display_verify_sizes(struct amdgpu_framebuffer *rfb)return ret; } -if (AMD_FMT_MOD_GET (DCC , modifier)) { +if (AMD_FMT_MOD_GET (TILE_VERSION , modifier) <=AMD_FMT_MOD_TILE_VER_GFX11 && +AMD_FMT_MOD_GET (DCC , modifier)) {if (AMD_FMT_MOD_GET (DCC_RETILE , modifier)) { block_size_log2 =get_dcc_block_size (modifier, false, false); get_block_dimensions(block_size_log2 + 8, format_info->cpp[0],
include/uapi/drm/drm_fourcc.h +2 -0
@@ -1506,6 +1506,8 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)* 6 - 64KB_3D * 7 - 256KB_3D */ +#define AMD_FMT_MOD_TILE_GFX12_256B_2D 1 +#define AMD_FMT_MOD_TILE_GFX12_4K_2D 2#define AMD_FMT_MOD_TILE_GFX12_64K_2D 3#define AMD_FMT_MOD_TILE_GFX12_256K_2D 4
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 327/375 ata: libata-scsi: Remove redundant sense_buffer memsets
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Igor Pylypiv <[email protected]>
[ Upstream commit 3f6d903b54a137e9e438d9c3b774b5d0432917bc ]
SCSI layer clears sense_buffer in scsi_queue_rq() so there is no need for libata to clear it again.
Stable-dep-of: 816be86c7993 ("ata: libata-scsi: Check ATA_QCFLAG_RTF_FILLED before using result_tf")
--- drivers/ata/libata-scsi.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/ata/libata-scsi.c +0 -5
@@ -926,11 +926,8 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc) {struct scsi_cmnd *cmd = qc->scsicmd;struct ata_taskfile *tf = &qc->result_tf; -unsigned char *sb = cmd->sense_buffer;u8 sense_key, asc, ascq; -memset (sb,0 ,SCSI_SENSE_BUFFERSIZE ); -/* * Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq.
@@ -976,8 +973,6 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)u64 block;u8 sense_key, asc, ascq; -memset (sb,0 ,SCSI_SENSE_BUFFERSIZE ); -if (ata_dev_disabled (dev)) {/* Device disabled after error recovery */ /* LOGICAL UNIT NOT READY, HARD RESET REQUIRED */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 328/375 ata: libata-scsi: Check ATA_QCFLAG_RTF_FILLED before using result_tf
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Igor Pylypiv <[email protected]>
[ Upstream commit 816be86c7993d3c5832c3017c0056297e86f978c ]
qc->result_tf contents are only valid when the ATA_QCFLAG_RTF_FILLED flag is set. The ATA_QCFLAG_RTF_FILLED flag should be always set for commands that failed or for commands that have the ATA_QCFLAG_RESULT_TF flag set.
--- drivers/ata/libata-scsi.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/ata/libata-scsi.c +21 -0
@@ -242,10 +242,17 @@ void ata_scsi_set_sense_information(struct ata_device *dev,*/ static void ata_scsi_set_passthru_sense_fields (struct ata_queued_cmd *qc) { +struct ata_device *dev = qc->dev;struct scsi_cmnd *cmd = qc->scsicmd;struct ata_taskfile *tf = &qc->result_tf;unsigned char *sb = cmd->sense_buffer; +if (!(qc->flags &ATA_QCFLAG_RTF_FILLED )) { +ata_dev_dbg (dev, +"missing result TF: can't set ATA PT sense fields\n" ); +return ; + } +if ((sb[0 ] &0x7f ) >=0x72 ) {unsigned char *desc;u8 len;
@@ -924,10 +931,17 @@ static void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk,*/ static void ata_gen_passthru_sense (struct ata_queued_cmd *qc) { +struct ata_device *dev = qc->dev;struct scsi_cmnd *cmd = qc->scsicmd;struct ata_taskfile *tf = &qc->result_tf;u8 sense_key, asc, ascq; +if (!(qc->flags &ATA_QCFLAG_RTF_FILLED )) { +ata_dev_dbg (dev, +"missing result TF: can't generate ATA PT sense data\n" ); +return ; + } +/* * Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq.
@@ -979,6 +993,13 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)ata_scsi_set_sense (dev, cmd,NOT_READY ,0x04 ,0x21 );return ; } + +if (!(qc->flags &ATA_QCFLAG_RTF_FILLED )) { +ata_dev_dbg (dev, +"missing result TF: can't generate sense data\n" ); +return ; + } +/* Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 329/375 crypto: starfive - Align rsa input data to 32-bit
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jia Jie Ho <[email protected]>
[ Upstream commit 6aad7019f697ab0bed98eba737d19bd7f67713de ]
Hardware expects RSA input plain/ciphertext to be 32-bit aligned. Set fixed length for preallocated buffer to the maximum supported keysize of the hardware and shift input text accordingly.
Stable-dep-of: 8323c036789b ("crypto: starfive - Fix nent assignment in rsa dec")
--- drivers/crypto/starfive/jh7110-cryp.h | 3 ++- drivers/crypto/starfive/jh7110-rsa.c | 12 ++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-)
drivers/crypto/starfive/jh7110-cryp.h +2 -1
@@ -30,6 +30,7 @@#define MAX_KEY_SIZE SHA512_BLOCK_SIZE#define STARFIVE_AES_IV_LEN AES_BLOCK_SIZE#define STARFIVE_AES_CTR_LEN AES_BLOCK_SIZE +#define STARFIVE_RSA_MAX_KEYSZ 256union starfive_aes_csr {u32 v;
@@ -222,7 +223,7 @@ struct starfive_cryp_request_ctx {unsigned int digsize;unsigned long in_sg_len;unsigned char *adata; -u8 rsa_data[]__aligned(sizeof(u32)) ; +u8 rsa_data[STARFIVE_RSA_MAX_KEYSZ ]__aligned(sizeof(u32)) ; };struct starfive_cryp_dev *starfive_cryp_find_dev (struct starfive_cryp_ctx *ctx);
drivers/crypto/starfive/jh7110-rsa.c +8 -4
@@ -31,7 +31,6 @@/* A * A * R mod N ==> A */ #define CRYPTO_CMD_AARN 0x7 -#define STARFIVE_RSA_MAX_KEYSZ 256#define STARFIVE_RSA_RESET 0x2static inline int starfive_pka_wait_done (struct starfive_cryp_ctx *ctx)
@@ -74,7 +73,7 @@ static int starfive_rsa_montgomery_form(struct starfive_cryp_ctx *ctx, {struct starfive_cryp_dev *cryp = ctx->cryp;struct starfive_cryp_request_ctx *rctx = ctx->rctx; -int count = rctx->total /sizeof (u32) -1 ; +int count = (ALIGN (rctx->total,4 ) /4 ) -1 ;int loop;u32 temp;u8 opsize;
@@ -251,12 +250,17 @@ static int starfive_rsa_enc_core(struct starfive_cryp_ctx *ctx, int enc)struct starfive_cryp_dev *cryp = ctx->cryp;struct starfive_cryp_request_ctx *rctx = ctx->rctx;struct starfive_rsa_key *key = &ctx->rsa_key; -int ret =0 ; +int ret =0 , shift =0 ;writel (STARFIVE_RSA_RESET , cryp->base +STARFIVE_PKA_CACR_OFFSET ); +if (!IS_ALIGNED (rctx->total,sizeof (u32))) { + shift =sizeof (u32) - (rctx->total &0x3 ); +memset (rctx->rsa_data,0 , shift); + } + rctx->total =sg_copy_to_buffer (rctx->in_sg, rctx->nents, - rctx->rsa_data, rctx->total); + rctx->rsa_data + shift, rctx->total);if (enc) { key->bitlen = key->e_bitlen;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 330/375 crypto: starfive - Fix nent assignment in rsa dec
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jia Jie Ho <[email protected]>
[ Upstream commit 8323c036789b8b4a61925fce439a89dba17b7f2f ]
Missing src scatterlist nent assignment in rsa decrypt function. Removing all unneeded assignment and use nents value from req->src instead.
--- drivers/crypto/starfive/jh7110-cryp.h | 1 - drivers/crypto/starfive/jh7110-rsa.c | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-)
drivers/crypto/starfive/jh7110-cryp.h +0 -1
@@ -218,7 +218,6 @@ struct starfive_cryp_request_ctx {struct scatterlist *out_sg;struct ahash_request ahash_fbk_req;size_t total; -size_t nents;unsigned int blksize;unsigned int digsize;unsigned long in_sg_len;
drivers/crypto/starfive/jh7110-rsa.c +1 -2
@@ -259,7 +259,7 @@ static int starfive_rsa_enc_core(struct starfive_cryp_ctx *ctx, int enc)memset (rctx->rsa_data,0 , shift); } - rctx->total =sg_copy_to_buffer (rctx->in_sg, rctx->nents, + rctx->total =sg_copy_to_buffer (rctx->in_sg,sg_nents (rctx->in_sg), rctx->rsa_data + shift, rctx->total);if (enc) {
@@ -309,7 +309,6 @@ static int starfive_rsa_enc(struct akcipher_request *req) rctx->in_sg = req->src; rctx->out_sg = req->dst; rctx->total = req->src_len; - rctx->nents =sg_nents (rctx->in_sg); ctx->rctx = rctx;return starfive_rsa_enc_core (ctx,1 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 331/375 hid: bpf: add BPF_JIT dependency
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit bacc15e010fc5a235fb2020b06a29a9961b5db82 ]
The module does not do anything when the JIT is disabled, but instead causes a warning:
In file included from include/linux/bpf_verifier.h:7,
from drivers/hid/bpf/hid_bpf_struct_ops.c:10:drivers/hid/bpf/hid_bpf_struct_ops.c: In function 'hid_bpf_struct_ops_init':include/linux/bpf.h:1853:50: error: statement with no effect [-Werror=unused-value]
1853 | #define register_bpf_struct_ops(st_ops, type) ({ (void *)(st_ops); 0; })
| ^~~~~~~~~~~~~~~~
drivers/hid/bpf/hid_bpf_struct_ops.c:305:16: note: in expansion of macro 'register_bpf_struct_ops'
305 | return register_bpf_struct_ops(&bpf_hid_bpf_ops, hid_bpf_ops);
| ^~~~~~~~~~~~~~~~~~~~~~~Add a Kconfig dependency to only allow building the HID-BPF support when a JIT is enabled.
--- drivers/hid/bpf/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hid/bpf/Kconfig +1 -1
@@ -3,7 +3,7 @@ menu "HID-BPF support" config HID_BPF bool "HID-BPF support" - depends on BPF + depends on BPF_JIT depends on BPF_SYSCALL depends on DYNAMIC_FTRACE_WITH_DIRECT_CALLS help
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 332/375 net/mlx5e: SHAMPO, Use KSMs instead of KLMs
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yoray Zack <[email protected]>
[ Upstream commit 758191c9ea7bcc45dd99398a538ae4ab27c4029e ]
KSM Mkey is KLM Mkey with a fixed buffer size. Due to this fact, it is a faster mechanism than KLM.
SHAMPO feature used KLMs Mkeys for memory mappings of its headers buffer. As it used KLMs with the same buffer size for each entry,
we can use KSMs instead.
This commit changes the Mkeys that map the SHAMPO headers buffer from KLMs to KSMs.
Stable-dep-of: f232de7cdb4b ("net/mlx5e: SHAMPO, Fix page leak")
--- drivers/net/ethernet/mellanox/mlx5/core/en.h | 20 +----- .../ethernet/mellanox/mlx5/core/en/params.c | 12 ++-- .../net/ethernet/mellanox/mlx5/core/en/txrx.h | 19 ++++++ .../net/ethernet/mellanox/mlx5/core/en_main.c | 21 +++--- .../net/ethernet/mellanox/mlx5/core/en_rx.c | 65 +++++++++---------- include/linux/mlx5/device.h | 1 + 6 files changed, 71 insertions(+), 67 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en.h +1 -19
@@ -80,6 +80,7 @@ struct page_pool; SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))#define MLX5E_RX_MAX_HEAD (256) +#define MLX5E_SHAMPO_LOG_HEADER_ENTRY_SIZE (8)#define MLX5E_SHAMPO_LOG_MAX_HEADER_ENTRY_SIZE (9)#define MLX5E_SHAMPO_WQ_HEADER_PER_PAGE (PAGE_SIZE >> MLX5E_SHAMPO_LOG_MAX_HEADER_ENTRY_SIZE)#define MLX5E_SHAMPO_WQ_BASE_HEAD_ENTRY_SIZE (64)
@@ -146,25 +147,6 @@ struct page_pool;#define MLX5E_TX_XSK_POLL_BUDGET 64#define MLX5E_SQ_RECOVER_MIN_INTERVAL 500/* msecs */ -#define MLX5E_KLM_UMR_WQE_SZ (sgl_len)\ - (sizeof(struct mlx5e_umr_wqe) +\ - (sizeof(struct mlx5_klm) * (sgl_len))) - -#define MLX5E_KLM_UMR_WQEBBS (klm_entries) \ - (DIV_ROUND_UP(MLX5E_KLM_UMR_WQE_SZ(klm_entries), MLX5_SEND_WQE_BB)) - -#define MLX5E_KLM_UMR_DS_CNT (klm_entries)\ - (DIV_ROUND_UP(MLX5E_KLM_UMR_WQE_SZ(klm_entries), MLX5_SEND_WQE_DS)) - -#define MLX5E_KLM_MAX_ENTRIES_PER_WQE (wqe_size)\ - (((wqe_size) - sizeof(struct mlx5e_umr_wqe)) / sizeof(struct mlx5_klm)) - -#define MLX5E_KLM_ENTRIES_PER_WQE (wqe_size)\ - ALIGN_DOWN(MLX5E_KLM_MAX_ENTRIES_PER_WQE(wqe_size), MLX5_UMR_KLM_NUM_ENTRIES_ALIGNMENT) - -#define MLX5E_MAX_KLM_PER_WQE (mdev) \ - MLX5E_KLM_ENTRIES_PER_WQE(MLX5_SEND_WQE_BB * mlx5e_get_max_sq_aligned_wqebbs(mdev)) -#define mlx5e_state_dereference (priv, p) \ rcu_dereference_protected((p), lockdep_is_held(&(priv)->state_lock))
drivers/net/ethernet/mellanox/mlx5/core/en/params.c +6 -6
@@ -1071,18 +1071,18 @@ static u32 mlx5e_shampo_icosq_sz(struct mlx5_core_dev *mdev,struct mlx5e_params *params, struct mlx5e_rq_param *rq_param) { - int max_num_of_umr_per_wqe, max_hd_per_wqe, max_klm_per_umr, rest; + int max_num_of_umr_per_wqe, max_hd_per_wqe, max_ksm_per_umr, rest;void *wqc =MLX5_ADDR_OF (rqc, rq_param->rqc, wq);int wq_size =BIT (MLX5_GET (wq, wqc, log_wq_sz));u32 wqebbs; - max_klm_per_umr =MLX5E_MAX_KLM_PER_WQE (mdev); + max_ksm_per_umr =MLX5E_MAX_KSM_PER_WQE (mdev); max_hd_per_wqe =mlx5e_shampo_hd_per_wqe (mdev, params, rq_param); - max_num_of_umr_per_wqe = max_hd_per_wqe / max_klm_per_umr; - rest = max_hd_per_wqe % max_klm_per_umr; - wqebbs =MLX5E_KLM_UMR_WQEBBS (max_klm_per_umr) * max_num_of_umr_per_wqe; + max_num_of_umr_per_wqe = max_hd_per_wqe / max_ksm_per_umr; + rest = max_hd_per_wqe % max_ksm_per_umr; + wqebbs =MLX5E_KSM_UMR_WQEBBS (max_ksm_per_umr) * max_num_of_umr_per_wqe;if (rest) - wqebbs +=MLX5E_KLM_UMR_WQEBBS (rest); + wqebbs +=MLX5E_KSM_UMR_WQEBBS (rest); wqebbs *= wq_size;return wqebbs; }
drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h +19 -0
@@ -34,6 +34,25 @@#define MLX5E_RX_ERR_CQE (cqe) (get_cqe_opcode(cqe) != MLX5_CQE_RESP_SEND) +#define MLX5E_KSM_UMR_WQE_SZ (sgl_len)\ + (sizeof(struct mlx5e_umr_wqe) +\ + (sizeof(struct mlx5_ksm) * (sgl_len))) + +#define MLX5E_KSM_UMR_WQEBBS (ksm_entries) \ + (DIV_ROUND_UP(MLX5E_KSM_UMR_WQE_SZ(ksm_entries), MLX5_SEND_WQE_BB)) + +#define MLX5E_KSM_UMR_DS_CNT (ksm_entries)\ + (DIV_ROUND_UP(MLX5E_KSM_UMR_WQE_SZ(ksm_entries), MLX5_SEND_WQE_DS)) + +#define MLX5E_KSM_MAX_ENTRIES_PER_WQE (wqe_size)\ + (((wqe_size) - sizeof(struct mlx5e_umr_wqe)) / sizeof(struct mlx5_ksm)) + +#define MLX5E_KSM_ENTRIES_PER_WQE (wqe_size)\ + ALIGN_DOWN(MLX5E_KSM_MAX_ENTRIES_PER_WQE(wqe_size), MLX5_UMR_KSM_NUM_ENTRIES_ALIGNMENT) + +#define MLX5E_MAX_KSM_PER_WQE (mdev) \ + MLX5E_KSM_ENTRIES_PER_WQE(MLX5_SEND_WQE_BB * mlx5e_get_max_sq_aligned_wqebbs(mdev)) +static inline ktime_t mlx5e_cqe_ts_to_ns (cqe_ts_to_ns func,struct mlx5_clock *clock,u64 cqe_ts) {
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +12 -9
@@ -504,8 +504,8 @@ static int mlx5e_create_umr_mkey(struct mlx5_core_dev *mdev,return err; } -static int mlx5e_create_umr_klm_mkey (struct mlx5_core_dev *mdev, -u64 nentries, +static int mlx5e_create_umr_ksm_mkey (struct mlx5_core_dev *mdev, +u64 nentries,u8 log_entry_size,u32 *umr_mkey) {int inlen;
@@ -525,12 +525,13 @@ static int mlx5e_create_umr_klm_mkey(struct mlx5_core_dev *mdev,MLX5_SET (mkc, mkc, umr_en,1 );MLX5_SET (mkc, mkc, lw,1 );MLX5_SET (mkc, mkc, lr,1 ); -MLX5_SET (mkc, mkc, access_mode_1_0,MLX5_MKC_ACCESS_MODE_KLMS ); +MLX5_SET (mkc, mkc, access_mode_1_0,MLX5_MKC_ACCESS_MODE_KSM );mlx5e_mkey_set_relaxed_ordering (mdev, mkc);MLX5_SET (mkc, mkc, qpn,0xffffff );MLX5_SET (mkc, mkc, pd, mdev->mlx5e_res.hw_objs.pdn);MLX5_SET (mkc, mkc, translations_octword_size, nentries); -MLX5_SET (mkc, mkc, length64,1 ); +MLX5_SET (mkc, mkc, log_page_size, log_entry_size); +MLX5_SET64 (mkc, mkc, len, nentries << log_entry_size); err =mlx5_core_create_mkey (mdev, umr_mkey, in, inlen);kvfree (in);
@@ -565,14 +566,16 @@ static int mlx5e_create_rq_umr_mkey(struct mlx5_core_dev *mdev, struct mlx5e_rqstatic int mlx5e_create_rq_hd_umr_mkey (struct mlx5_core_dev *mdev,struct mlx5e_rq *rq) { -u32 max_klm_size =BIT (MLX5_CAP_GEN (mdev, log_max_klm_list_size)); +u32 max_ksm_size =BIT (MLX5_CAP_GEN (mdev, log_max_klm_list_size)); -if (max_klm_size < rq->mpwqe.shampo->hd_per_wq) { -mlx5_core_err (mdev,"max klm list size 0x%x is smaller than shampo header buffer list size 0x%x\n" , - max_klm_size, rq->mpwqe.shampo->hd_per_wq); +if (max_ksm_size < rq->mpwqe.shampo->hd_per_wq) { +mlx5_core_err (mdev,"max ksm list size 0x%x is smaller than shampo header buffer list size 0x%x\n" , + max_ksm_size, rq->mpwqe.shampo->hd_per_wq);return -EINVAL ; } -return mlx5e_create_umr_klm_mkey (mdev, rq->mpwqe.shampo->hd_per_wq, + +return mlx5e_create_umr_ksm_mkey (mdev, rq->mpwqe.shampo->hd_per_wq, +MLX5E_SHAMPO_LOG_HEADER_ENTRY_SIZE , &rq->mpwqe.shampo->mkey); }
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +32 -33
126 lines not on this page · raw message
include/linux/mlx5/device.h +1 -0
@@ -294,6 +294,7 @@ enum {#define MLX5_UMR_FLEX_ALIGNMENT 0x40#define MLX5_UMR_MTT_NUM_ENTRIES_ALIGNMENT (MLX5_UMR_FLEX_ALIGNMENT / sizeof(struct mlx5_mtt))#define MLX5_UMR_KLM_NUM_ENTRIES_ALIGNMENT (MLX5_UMR_FLEX_ALIGNMENT / sizeof(struct mlx5_klm)) +#define MLX5_UMR_KSM_NUM_ENTRIES_ALIGNMENT (MLX5_UMR_FLEX_ALIGNMENT / sizeof(struct mlx5_ksm))#define MLX5_USER_INDEX_LEN (MLX5_FLD_SZ_BYTES(qpc, user_index) * 8)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 333/375 net/mlx5e: SHAMPO, Fix page leak
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dragos Tatulea <[email protected]>
[ Upstream commit f232de7cdb4b99adb2c7f2bc5e0b7e4e1292873b ]
When SHAMPO is used, a receive queue currently almost always leaks one page on shutdown.
A page has MLX5E_SHAMPO_WQ_HEADER_PER_PAGE (8) headers. These headers are tracked in the SHAMPO bitmap. Each page is released when the last header index in the group is processed. During header allocation, there can be leftovers from a page that will be used in a subsequent allocation. This is normally fine, except for the following scenario (simplified a bit):
1) Allocate N new page fragments, showing only the relevant last 4 fragments:
0: new page
1: new page
2: new page
3: new page
4: page from previous allocation
5: page from previous allocation
6: page from previous allocation
7: page from previous allocation
2) NAPI processes header indices 4-7 because they are the oldest allocated. Bit 7 will be set to 0.
3) Receive queue shutdown occurs. All the remaining bits are being iterated on to release the pages. But the page assigned to header indices 0-3 will not be freed due to what happened in step 2.
This patch fixes the issue by making sure that on allocation, header fragments are always allocated in groups of MLX5E_SHAMPO_WQ_HEADER_PER_PAGE so that there is never a partial page left over between allocations.
A more appropriate fix would be a refactoring of mlx5e_alloc_rx_hd_mpwqe() and mlx5e_build_shampo_hd_umr(). But this refactoring is too big for net. It will be targeted for net-next.
--- drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +1 -0
@@ -727,6 +727,7 @@ static int mlx5e_alloc_rx_hd_mpwqe(struct mlx5e_rq *rq) ksm_entries =bitmap_find_window (shampo->bitmap, shampo->hd_per_wqe, shampo->hd_per_wq, shampo->pi); + ksm_entries =ALIGN_DOWN (ksm_entries,MLX5E_SHAMPO_WQ_HEADER_PER_PAGE );if (!ksm_entries)return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 334/375 drm/xe/xe2: Add workaround 14021402888
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bommu Krishnaiah <[email protected]>
[ Upstream commit 598dc939edf8d7bb1d69e84513c31451812128fc ]
This workaround applies to Graphics 20.01 as RCS engine workaround
Stable-dep-of: b196e6fcc711 ("drm/xe/xe2lpg: Extend workaround 14021402888")
--- drivers/gpu/drm/xe/regs/xe_gt_regs.h | 1 + drivers/gpu/drm/xe/xe_wa.c | 4 ++++ 2 files changed, 5 insertions(+)
drivers/gpu/drm/xe/regs/xe_gt_regs.h +1 -0
@@ -350,6 +350,7 @@#define HALF_SLICE_CHICKEN7 XE_REG_MCR(0xe194, XE_REG_OPTION_MASKED)#define DG2_DISABLE_ROUND_ENABLE_ALLOW_FOR_SSLA REG_BIT(15) +#define CLEAR_OPTIMIZATION_DISABLE REG_BIT(6)#define CACHE_MODE_SS XE_REG_MCR(0xe420, XE_REG_OPTION_MASKED)#define DISABLE_ECC REG_BIT(5)
drivers/gpu/drm/xe/xe_wa.c +4 -0
@@ -533,6 +533,10 @@ static const struct xe_rtp_entry_sr engine_was[] = { FUNC(xe_rtp_match_first_render_or_compute)),XE_RTP_ACTIONS (SET (LSC_CHICKEN_BIT_0 ,WR_REQ_CHAINING_DIS )) }, + { XE_RTP_NAME("14021402888"), +XE_RTP_RULES (GRAPHICS_VERSION (2001 ),ENGINE_CLASS (RENDER )), +XE_RTP_ACTIONS (SET (HALF_SLICE_CHICKEN7 ,CLEAR_OPTIMIZATION_DISABLE )) + },/* Xe2_HPM */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 335/375 drm/xe/xe2lpg: Extend workaround 14021402888
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bommu Krishnaiah <[email protected]>
[ Upstream commit b196e6fcc71186134b4cfe756067d87ae41b1ed9 ]
workaround 14021402888 also applies to Xe2_LPG. Replicate the existing entry to one specific for Xe2_LPG.
--- drivers/gpu/drm/xe/xe_wa.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/xe/xe_wa.c +4 -0
@@ -485,6 +485,10 @@ static const struct xe_rtp_entry_sr engine_was[] = {XE_RTP_RULES (GRAPHICS_VERSION (2004 ),FUNC (xe_rtp_match_first_render_or_compute)),XE_RTP_ACTIONS (SET (TDL_TSL_CHICKEN ,SLM_WMTP_RESTORE )) }, + { XE_RTP_NAME("14021402888"), +XE_RTP_RULES (GRAPHICS_VERSION (2004 ),ENGINE_CLASS (RENDER )), +XE_RTP_ACTIONS (SET (HALF_SLICE_CHICKEN7 ,CLEAR_OPTIMIZATION_DISABLE )) + },/* Xe2_HPG */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 336/375 clk: qcom: gcc-x1e80100: Fix USB 0 and 1 PHY GDSC pwrsts flags
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abel Vesa <[email protected]>
[ Upstream commit f4c16a7cdbd2edecdb854f2ce0ef07c6263c5379 ]
Allowing these GDSCs to collapse makes the QMP combo PHYs lose their configuration on machine suspend. Currently, the QMP combo PHY driver doesn't reinitialise the HW on resume. Under such conditions, the USB SuperSpeed support is broken. To avoid this, mark the pwrsts flags with RET_ON. This is in line with USB 2 PHY GDSC config.
--- drivers/clk/qcom/gcc-x1e80100.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/qcom/gcc-x1e80100.c +2 -2
@@ -6203,7 +6203,7 @@ static struct gdsc gcc_usb_0_phy_gdsc = { .pd = { .name = "gcc_usb_0_phy_gdsc", }, - .pwrsts = PWRSTS_OFF_ON, + .pwrsts = PWRSTS_RET_ON, .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, };
@@ -6215,7 +6215,7 @@ static struct gdsc gcc_usb_1_phy_gdsc = { .pd = { .name = "gcc_usb_1_phy_gdsc", }, - .pwrsts = PWRSTS_OFF_ON, + .pwrsts = PWRSTS_RET_ON, .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 337/375 clk: qcom: ipq9574: Update the alpha PLL type for GPLLs
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: devi priya <[email protected]>
[ Upstream commit 6357efe3abead68048729adf11a9363881657939 ]
Update PLL offsets to DEFAULT_EVO to configure MDIO to 800MHz.
The incorrect clock frequency leads to an incorrect MDIO clock. This, in turn, affects the MDIO hardware configurations as the divider is calculated from the MDIO clock frequency. If the clock frequency is not as expected, the MDIO register fails due to the generation of an incorrect MDIO frequency.
This issue is critical as it results in incorrect MDIO configurations and ultimately leads to the MDIO function not working. This results in a complete feature failure affecting all Ethernet PHYs. Specifically, Ethernet will not work on IPQ9574 due to this issue.
Currently, the clock frequency is set to CLK_ALPHA_PLL_TYPE_DEFAULT. However, this setting does not yield the expected clock frequency. To rectify this, we need to change this to CLK_ALPHA_PLL_TYPE_DEFAULT_EVO.
This modification ensures that the clock frequency aligns with our expectations, thereby resolving the MDIO register failure and ensuring the proper functioning of the Ethernet on IPQ9574.
--- drivers/clk/qcom/gcc-ipq9574.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/clk/qcom/gcc-ipq9574.c +6 -6
@@ -65,7 +65,7 @@ static const struct clk_parent_data gcc_sleep_clk_data[] = {static struct clk_alpha_pll gpll0_main = { .offset =0x20000 , - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT ], + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO ], .clkr = { .enable_reg =0x0b000 , .enable_mask =BIT (0 ),
@@ -93,7 +93,7 @@ static struct clk_fixed_factor gpll0_out_main_div2 = {static struct clk_alpha_pll_postdiv gpll0 = { .offset =0x20000 , - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT ], + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO ], .width =4 , .clkr.hw.init = &(const struct clk_init_data ) { .name ="gpll0" ,
@@ -107,7 +107,7 @@ static struct clk_alpha_pll_postdiv gpll0 = {static struct clk_alpha_pll gpll4_main = { .offset =0x22000 , - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT ], + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO ], .clkr = { .enable_reg =0x0b000 , .enable_mask =BIT (2 ),
@@ -122,7 +122,7 @@ static struct clk_alpha_pll gpll4_main = {static struct clk_alpha_pll_postdiv gpll4 = { .offset =0x22000 , - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT ], + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO ], .width =4 , .clkr.hw.init = &(const struct clk_init_data ) { .name ="gpll4" ,
@@ -136,7 +136,7 @@ static struct clk_alpha_pll_postdiv gpll4 = {static struct clk_alpha_pll gpll2_main = { .offset =0x21000 , - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT ], + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO ], .clkr = { .enable_reg =0x0b000 , .enable_mask =BIT (1 ),
@@ -151,7 +151,7 @@ static struct clk_alpha_pll gpll2_main = {static struct clk_alpha_pll_postdiv gpll2 = { .offset =0x21000 , - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT ], + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO ], .width =4 , .clkr.hw.init = &(const struct clk_init_data ) { .name ="gpll2" ,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 338/375 powerpc/64e: remove unused IBM HTW code
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
[ Upstream commit 88715b6e5d529f4ef3830ad2a893e4624c6af0b8 ]
Patch series "Reimplement huge pages without hugepd on powerpc (8xx, e500, book3s/64)", v7.
Unlike most architectures, powerpc 8xx HW requires a two-level pagetable topology for all page sizes. So a leaf PMD-contig approach is not feasible as such.
Possible sizes on 8xx are 4k, 16k, 512k and 8M.
First level (PGD/PMD) covers 4M per entry. For 8M pages, two PMD entries must point to a single entry level-2 page table. Until now that was done using hugepd. This series changes it to use standard page tables where the entry is replicated 1024 times on each of the two pagetables refered by the two associated PMD entries for that 8M page.
For e500 and book3s/64 there are less constraints because it is not tied to the HW assisted tablewalk like on 8xx, so it is easier to use leaf PMDs (and PUDs).
On e500 the supported page sizes are 4M, 16M, 64M, 256M and 1G. All at PMD level on e500/32 (mpc85xx) and mix of PMD and PUD for e500/64. We encode page size with 4 available bits in PTE entries. On e300/32 PGD entries size is increases to 64 bits in order to allow leaf-PMD entries because PTE are 64 bits on e500.
On book3s/64 only the hash-4k mode is concerned. It supports 16M pages as cont-PMD and 16G pages as cont-PUD. In other modes (radix-4k, radix-6k and hash-64k) the sizes match with PMD and PUD sizes so that's just leaf entries. The hash processing make things a bit more complex. To ease things, __hash_page_huge() is modified to bail out when DIRTY or ACCESSED bits are missing, leaving it to mm core to fix it.
This patch (of 23):
The nohash HTW_IBM (Hardware Table Walk) code is unused since support for A2 was removed in commit fb5a515704d7 ("powerpc: Remove platforms/ wsp and associated pieces") (2014).
The remaining supported CPUs use either no HTW (data_tlb_miss_bolted), or the e6500 HTW (data_tlb_miss_e6500).
Stable-dep-of: d92b5cc29c79 ("powerpc/64e: Define mmu_pte_psize static")
--- arch/powerpc/include/asm/nohash/mmu-e500.h | 3 +- arch/powerpc/mm/nohash/tlb.c | 57 +----- arch/powerpc/mm/nohash/tlb_low_64e.S | 195 --------------------- 3 files changed, 2 insertions(+), 253 deletions(-)
arch/powerpc/include/asm/nohash/mmu-e500.h +1 -2
@@ -303,8 +303,7 @@ extern unsigned long linear_map_top;extern int book3e_htw_mode;#define PPC_HTW_NONE 0 -#define PPC_HTW_IBM 1 -#define PPC_HTW_E6500 2 +#define PPC_HTW_E6500 1/* * 64-bit booke platforms don't load the tlb in the tlb miss handler code.
arch/powerpc/mm/nohash/tlb.c +1 -56
82 lines not on this page · raw message
arch/powerpc/mm/nohash/tlb_low_64e.S +0 -195
201 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 339/375 powerpc/64e: split out nohash Book3E 64-bit code
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
[ Upstream commit a898530eea3d0ba08c17a60865995a3bb468d1bc ]
A reasonable chunk of nohash/tlb.c is 64-bit only code, split it out into a separate file.
Stable-dep-of: d92b5cc29c79 ("powerpc/64e: Define mmu_pte_psize static")
--- arch/powerpc/mm/nohash/Makefile | 2 +- arch/powerpc/mm/nohash/tlb.c | 343 +---------------------------- arch/powerpc/mm/nohash/tlb_64e.c | 361 +++++++++++++++++++++++++++++++ 3 files changed, 363 insertions(+), 343 deletions(-) create mode 100644 arch/powerpc/mm/nohash/tlb_64e.c
arch/powerpc/mm/nohash/Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 obj-y += mmu_context.o tlb.o tlb_low.o kup.o -obj-$(CONFIG_PPC_BOOK3E_64) += tlb_low_64e.o book3e_pgtable.o +obj-$(CONFIG_PPC_BOOK3E_64) += tlb_64e.o tlb_low_64e.o book3e_pgtable.o obj-$(CONFIG_40x) += 40x.o obj-$(CONFIG_44x) += 44x.o obj-$(CONFIG_PPC_8xx) += 8xx.o
arch/powerpc/mm/nohash/tlb.c +1 -342
355 lines not on this page · raw message
arch/powerpc/mm/nohash/tlb_64e.c new file +361 -0
361 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 340/375 powerpc/64e: Define mmu_pte_psize static
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Leroy <[email protected]>
[ Upstream commit d92b5cc29c792f1d3f0aaa3b29dddfe816c03e88 ]
mmu_pte_psize is only used in the tlb_64e.c, define it static.
--- arch/powerpc/mm/nohash/tlb_64e.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/mm/nohash/tlb_64e.c +1 -1
@@ -33,7 +33,7 @@* though this will probably be made common with other nohash * implementations at some point */ -int mmu_pte_psize;/* Page size used for PTE pages */ +static int mmu_pte_psize;/* Page size used for PTE pages */ int mmu_vmemmap_psize;/* Page size used for the virtual mem map */ int book3e_htw_mode;/* HW tablewalk? Value is PPC_HTW_* */ unsigned long linear_map_top;/* Top of linear mapping */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 341/375 powerpc/vdso: Dont discard rela sections
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Leroy <[email protected]>
[ Upstream commit 6114139c3bdde992f4a19264e4f9bfc100d8d776 ]
After building the VDSO, there is a verification that it contains no dynamic relocation, see commit aff69273af61 ("vdso: Improve cmd_vdso_check to check all dynamic relocations").
This verification uses readelf -r and doesn't work if rela sections are discarded.
--- arch/powerpc/kernel/vdso/vdso32.lds.S | 4 +++- arch/powerpc/kernel/vdso/vdso64.lds.S | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-)
arch/powerpc/kernel/vdso/vdso32.lds.S +3 -1
@@ -74,6 +74,8 @@ SECTIONS .got : { *(.got) } :text .plt : { *(.plt) } + .rela.dyn : { *(.rela .rela*) } + _end = .; __end = .; PROVIDE(end = .);
@@ -87,7 +89,7 @@ SECTIONS *(.branch_lt) *(.data .data.* .gnu.linkonce.d.* .sdata*) *(.bss .sbss .dynbss .dynsbss) - *(.got1 .glink .iplt .rela*) + *(.got1 .glink .iplt) } }
arch/powerpc/kernel/vdso/vdso64.lds.S +2 -2
@@ -69,7 +69,7 @@ SECTIONS .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr .eh_frame : { KEEP (*(.eh_frame)) } :text .gcc_except_table : { *(.gcc_except_table) } - .rela.dyn ALIGN(8) : { *(.rela.dyn) } + .rela.dyn ALIGN(8) : { *(.rela .rela*) } .got ALIGN(8) : { *(.got .toc) }
@@ -86,7 +86,7 @@ SECTIONS *(.data .data.* .gnu.linkonce.d.* .sdata*) *(.bss .sbss .dynbss .dynsbss) *(.opd) - *(.glink .iplt .plt .rela*) + *(.glink .iplt .plt) } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 342/375 ASoC: tegra: Fix CBB error during probe()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mohan Kumar <[email protected]>
[ Upstream commit 6781b962d97bc52715a8db8cc17278cc3c23ebe8 ]
When Tegra audio drivers are built as part of the kernel image, TIMEOUT_ERR is observed from cbb-fabric. Following is seen on Jetson AGX Orin during boot:
[ 8.012482] ************************************** [ 8.017423] CPU:0, Error:cbb-fabric, Errmon:2 [ 8.021922] Error Code : TIMEOUT_ERR [ 8.025966] Overflow : Multiple TIMEOUT_ERR [ 8.030644] [ 8.032175] Error Code : TIMEOUT_ERR [ 8.036217] MASTER_ID : CCPLEX [ 8.039722] Address : 0x290a0a8 [ 8.043318] Cache : 0x1 -- Bufferable [ 8.047630] Protection : 0x2 -- Unprivileged, Non-Secure, Data Access [ 8.054628] Access_Type : Write
[ 8.106130] WARNING: CPU: 0 PID: 124 at drivers/soc/tegra/cbb/tegra234-cbb.c:604 tegra234_cbb_isr+0x134/0x178
[ 8.240602] Call trace: [ 8.243126] tegra234_cbb_isr+0x134/0x178 [ 8.247261] __handle_irq_event_percpu+0x60/0x238 [ 8.252132] handle_irq_event+0x54/0xb8
These errors happen when MVC device, which is a child of AHUB device, tries to access its device registers. This happens as part of call tegra210_mvc_reset_vol_settings() in MVC device probe().
The root cause of this problem is, the child MVC device gets probed before the AHUB clock gets enabled. The AHUB clock is enabled in runtime PM resume of parent AHUB device and due to the wrong sequence of pm_runtime_enable() in AHUB driver, runtime PM resume doesn't happen for AHUB device when MVC makes register access.
Fix this by calling pm_runtime_enable() for parent AHUB device before of_platform_populate() in AHUB driver. This ensures that clock becomes available when MVC makes register access.
--- sound/soc/tegra/tegra210_ahub.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
sound/soc/tegra/tegra210_ahub.c +6 -4
@@ -2,7 +2,7 @@// // tegra210_ahub.c - Tegra210 AHUB driver // -// Copyright (c) 2020-2022, NVIDIA CORPORATION. All rights reserved. +// Copyright (c) 2020-2024, NVIDIA CORPORATION. All rights reserved. #include <linux/clk.h> #include <linux/device.h>
@@ -1391,11 +1391,13 @@ static int tegra_ahub_probe(struct platform_device *pdev)return err; } +pm_runtime_enable (&pdev->dev); + err =of_platform_populate (pdev->dev.of_node,NULL ,NULL , &pdev->dev); -if (err) +if (err) { +pm_runtime_disable (&pdev->dev);return err; - -pm_runtime_enable (&pdev->dev); + }return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 343/375 nvmet-tcp: fix kernel crash if commands allocation fails
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maurizio Lombardi <[email protected]>
[ Upstream commit 5572a55a6f830ee3f3a994b6b962a5c327d28cb3 ]
If the commands allocation fails in nvmet_tcp_alloc_cmds() the kernel crashes in nvmet_tcp_release_queue_work() because of a NULL pointer dereference.
nvmet: failed to install queue 0 cntlid 1 ret 6
Unable to handle kernel NULL pointer dereference at
virtual address 0000000000000008Fix the bug by setting queue->nr_cmds to zero in case nvmet_tcp_alloc_cmd() fails.
--- drivers/nvme/target/tcp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/nvme/target/tcp.c +3 -1
@@ -2146,8 +2146,10 @@ static u16 nvmet_tcp_install_queue(struct nvmet_sq *sq) } queue->nr_cmds = sq->size *2 ; -if (nvmet_tcp_alloc_cmds (queue)) +if (nvmet_tcp_alloc_cmds (queue)) { + queue->nr_cmds =0 ;return NVME_SC_INTERNAL ; + }return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 344/375 nvme-pci: allocate tagset on reset if necessary
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keith Busch <[email protected]>
[ Upstream commit 6f01bdbfef3b62955cf6503a8425d527b3a5cf94 ]
If a drive is unable to create IO queues on the initial probe, a subsequent reset will need to allocate the tagset if IO queue creation is successful. Without this, blk_mq_update_nr_hw_queues will crash on a bad pointer due to the invalid tagset.
--- drivers/nvme/host/pci.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/nvme/host/pci.c +6 -0
@@ -2473,6 +2473,12 @@ static unsigned int nvme_pci_nr_maps(struct nvme_dev *dev)static void nvme_pci_update_nr_queues (struct nvme_dev *dev) { +if (!dev->ctrl.tagset) { +nvme_alloc_io_tag_set (&dev->ctrl, &dev->tagset, &nvme_mq_ops, +nvme_pci_nr_maps (dev),sizeof (struct nvme_iod )); +return ; + } +blk_mq_update_nr_hw_queues (&dev->tagset, dev->online_queues -1 );/* free previously allocated queues that are no longer usable */ nvme_free_queues (dev, dev->online_queues);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 345/375 clk: qcom: gcc-x1e80100: Dont use parking clk_ops for QUPs
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bryan O'Donoghue <[email protected]>
[ Upstream commit ca082333b4356688be715ed9cc762fc5d3d5f4c5 ]
Per Stephen Boyd's explanation in the link below, QUP RCG clocks do not need to be parked when switching frequency. A side-effect in parking to a lower frequency can be a momentary invalid clock driven on an in-use serial peripheral.
This can cause "junk" to spewed out of a UART as a low-impact example. On the x1e80100-crd this serial port junk can be observed on linux-next.
Apply a similar fix to the x1e80100 Global Clock controller to remediate.
--- drivers/clk/qcom/gcc-x1e80100.c | 48 ++++++++++++++++----------------- 1 file changed, 24 insertions(+), 24 deletions(-)
drivers/clk/qcom/gcc-x1e80100.c +24 -24
@@ -670,7 +670,7 @@ static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = {
@@ -687,7 +687,7 @@ static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
@@ -719,7 +719,7 @@ static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
@@ -736,7 +736,7 @@ static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
@@ -768,7 +768,7 @@ static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
@@ -785,7 +785,7 @@ static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
@@ -802,7 +802,7 @@ static struct clk_init_data gcc_qupv3_wrap0_s6_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap0_s6_clk_src = {
@@ -819,7 +819,7 @@ static struct clk_init_data gcc_qupv3_wrap0_s7_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap0_s7_clk_src = {
@@ -836,7 +836,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
@@ -853,7 +853,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
@@ -870,7 +870,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
@@ -887,7 +887,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
@@ -904,7 +904,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
@@ -921,7 +921,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
@@ -938,7 +938,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s6_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s6_clk_src = {
@@ -955,7 +955,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s7_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s7_clk_src = {
@@ -972,7 +972,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s0_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s0_clk_src = {
@@ -989,7 +989,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s1_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s1_clk_src = {
@@ -1006,7 +1006,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s2_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s2_clk_src = {
@@ -1023,7 +1023,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s3_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s3_clk_src = {
@@ -1040,7 +1040,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s4_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s4_clk_src = {
@@ -1057,7 +1057,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s5_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s5_clk_src = {
@@ -1074,7 +1074,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s6_clk_src_init = { .parent_data = gcc_parent_data_8, .num_parents = ARRAY_SIZE(gcc_parent_data_8), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s6_clk_src = {
@@ -1091,7 +1091,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s7_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s7_clk_src = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 346/375 ASoc: SOF: topology: Clear SOF link platform name upon unload
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
[ Upstream commit e0be875c5bf03a9676a6bfed9e0f1766922a7dbd ]
The SOF topology loading function sets the device name for the platform component link. This should be unset when unloading the topology, otherwise a machine driver unbind/bind or reprobe would complain about an invalid component as having both its component name and of_node set:
mt8186_mt6366 sound: ASoC: Both Component name/of_node are set for AFE_SOF_DL1 mt8186_mt6366 sound: error -EINVAL: Cannot register card mt8186_mt6366 sound: probe with driver mt8186_mt6366 failed with error -22
This happens with machine drivers that set the of_node separately.
Clear the SOF link platform name in the topology unload callback.
--- sound/soc/sof/topology.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/sof/topology.c +2 -0
@@ -2050,6 +2050,8 @@ static int sof_link_unload(struct snd_soc_component *scomp, struct snd_soc_dobjif (!slink)return 0 ; + slink->link->platforms->name =NULL ; +kfree (slink->tuples);list_del (&slink->list);kfree (slink->hw_configs);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 347/375 riscv: selftests: Remove mmap hint address checks
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charlie Jenkins <[email protected]>
[ Upstream commit 83dae72ac0382693540a055ec6210dd3691a8df6 ]
The mmap behavior that restricts the addresses returned by mmap caused unexpected behavior, so get rid of the test cases that check that behavior.
--- .../selftests/riscv/mm/mmap_bottomup.c | 2 - .../testing/selftests/riscv/mm/mmap_default.c | 2 - tools/testing/selftests/riscv/mm/mmap_test.h | 67 ------------------- 3 files changed, 71 deletions(-)
tools/testing/selftests/riscv/mm/mmap_bottomup.c +0 -2
@@ -7,8 +7,6 @@TEST (infinite_rlimit) {EXPECT_EQ (BOTTOM_UP ,memory_layout ()); - -TEST_MMAPS ; }TEST_HARNESS_MAIN
tools/testing/selftests/riscv/mm/mmap_default.c +0 -2
@@ -7,8 +7,6 @@TEST (default_rlimit) {EXPECT_EQ (TOP_DOWN ,memory_layout ()); - -TEST_MMAPS ; }TEST_HARNESS_MAIN
tools/testing/selftests/riscv/mm/mmap_test.h +0 -67
76 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 348/375 riscv: mm: Do not restrict mmap address based on hint
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charlie Jenkins <[email protected]>
[ Upstream commit 2116988d5372aec51f8c4fb85bf8e305ecda47a0 ]
The hint address should not forcefully restrict the addresses returned by mmap as this causes mmap to report ENOMEM when there is memory still available.
--- arch/riscv/include/asm/processor.h | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-)
arch/riscv/include/asm/processor.h +2 -24
@@ -14,36 +14,14 @@#include <asm/ptrace.h> -/* -* addr is a hint to the maximum userspace address that mmap should provide, so -* this macro needs to return the largest address space available so that -* mmap_end < addr, being mmap_end the top of that address space. -* See Documentation/arch/riscv/vm-layout.rst for more details. -*/ #define arch_get_mmap_end (addr, len, flags) \ ({ \ - unsigned long mmap_end; \ - typeof(addr) _addr = (addr); \ - if ((_addr) == 0 || is_compat_task() || \ - ((_addr + len) > BIT(VA_BITS - 1))) \ - mmap_end = STACK_TOP_MAX; \ - else \ - mmap_end = (_addr + len); \ - mmap_end; \ + STACK_TOP_MAX; \ })#define arch_get_mmap_base (addr, base) \ ({ \ - unsigned long mmap_base; \ - typeof(addr) _addr = (addr); \ - typeof(base) _base = (base); \ - unsigned long rnd_gap = DEFAULT_MAP_WINDOW - (_base); \ - if ((_addr) == 0 || is_compat_task() || \ - ((_addr + len) > BIT(VA_BITS - 1))) \ - mmap_base = (_base); \ - else \ - mmap_base = (_addr + len) - rnd_gap; \ - mmap_base; \ + base; \ })#ifdef CONFIG_64BIT
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 349/375 ASoC: sunxi: sun4i-i2s: fix LRCLK polarity in i2s mode
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matteo Martelli <[email protected]>
[ Upstream commit 3e83957e8dd7433a69116780d9bad217b00913ea ]
This fixes the LRCLK polarity for sun8i-h3 and sun50i-h6 in i2s mode which was wrongly inverted.
The LRCLK was being set in reversed logic compared to the DAI format:
inverted LRCLK for SND_SOC_DAIFMT_IB_NF and SND_SOC_DAIFMT_NB_NF; normal LRCLK for SND_SOC_DAIFMT_IB_IF and SND_SOC_DAIFMT_NB_IF. Such reversed logic applies properly for DSP_A, DSP_B, LEFT_J and RIGHT_J modes but not for I2S mode, for which the LRCLK signal results reversed to what expected on the bus. The issue is due to a misinterpretation of the LRCLK polarity bit of the H3 and H6 i2s controllers. Such bit in this case does not mean "0 => normal" or "1 => inverted" according to the expected bus operation, but it means "0 => frame starts on low edge" and "1 => frame starts on high edge" (from the User Manuals).
This commit fixes the LRCLK polarity by setting the LRCLK polarity bit according to the selected bus mode and renames the LRCLK polarity bit definition to avoid further confusion.
--- sound/soc/sunxi/sun4i-i2s.c | 143 ++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 70 deletions(-)
sound/soc/sunxi/sun4i-i2s.c +73 -70
@@ -100,8 +100,8 @@#define SUN8I_I2S_CTRL_MODE_PCM (0 << 4)#define SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK BIT(19) -#define SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED (1 << 19) -#define SUN8I_I2S_FMT0_LRCLK_POLARITY_NORMAL (0 << 19) +#define SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH (1 << 19) +#define SUN8I_I2S_FMT0_LRCLK_POLARITY_START_LOW (0 << 19)#define SUN8I_I2S_FMT0_LRCK_PERIOD_MASK GENMASK(17, 8)#define SUN8I_I2S_FMT0_LRCK_PERIOD (period) ((period - 1) << 8)#define SUN8I_I2S_FMT0_BCLK_POLARITY_MASK BIT(7)
@@ -729,65 +729,37 @@ static int sun4i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,static int sun8i_i2s_set_soc_fmt (const struct sun4i_i2s *i2s,unsigned int fmt) { -u32 mode, val; +u32 mode, lrclk_pol, bclk_pol, val;u8 offset; -/* -* DAI clock polarity -* -* The setup for LRCK contradicts the datasheet, but under a -* scope it's clear that the LRCK polarity is reversed -* compared to the expected polarity on the bus. -*/ -switch (fmt &SND_SOC_DAIFMT_INV_MASK ) { -case SND_SOC_DAIFMT_IB_IF : -/* Invert both clocks */ - val =SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ; -break ; -case SND_SOC_DAIFMT_IB_NF : -/* Invert bit clock */ - val =SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED | -SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED ; -break ; -case SND_SOC_DAIFMT_NB_IF : -/* Invert frame clock */ - val =0 ; -break ; -case SND_SOC_DAIFMT_NB_NF : - val =SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED ; -break ; -default : -return -EINVAL ; - } - -regmap_update_bits (i2s->regmap,SUN4I_I2S_FMT0_REG , -SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK | -SUN8I_I2S_FMT0_BCLK_POLARITY_MASK , - val); -/* DAI Mode */ switch (fmt &SND_SOC_DAIFMT_FORMAT_MASK ) {case SND_SOC_DAIFMT_DSP_A : + lrclk_pol =SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ; mode =SUN8I_I2S_CTRL_MODE_PCM ; offset =1 ;break ;case SND_SOC_DAIFMT_DSP_B : + lrclk_pol =SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ; mode =SUN8I_I2S_CTRL_MODE_PCM ; offset =0 ;break ;case SND_SOC_DAIFMT_I2S : + lrclk_pol =SUN8I_I2S_FMT0_LRCLK_POLARITY_START_LOW ; mode =SUN8I_I2S_CTRL_MODE_LEFT ; offset =1 ;break ;case SND_SOC_DAIFMT_LEFT_J : + lrclk_pol =SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ; mode =SUN8I_I2S_CTRL_MODE_LEFT ; offset =0 ;break ;case SND_SOC_DAIFMT_RIGHT_J : + lrclk_pol =SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ; mode =SUN8I_I2S_CTRL_MODE_RIGHT ; offset =0 ;break ;
@@ -805,6 +777,35 @@ static int sun8i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,SUN8I_I2S_TX_CHAN_OFFSET_MASK , SUN8I_I2S_TX_CHAN_OFFSET(offset)); +/* DAI clock polarity */ + bclk_pol =SUN8I_I2S_FMT0_BCLK_POLARITY_NORMAL ; + +switch (fmt &SND_SOC_DAIFMT_INV_MASK ) { +case SND_SOC_DAIFMT_IB_IF : +/* Invert both clocks */ + lrclk_pol ^=SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK ; + bclk_pol =SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ; +break ; +case SND_SOC_DAIFMT_IB_NF : +/* Invert bit clock */ + bclk_pol =SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ; +break ; +case SND_SOC_DAIFMT_NB_IF : +/* Invert frame clock */ + lrclk_pol ^=SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK ; +break ; +case SND_SOC_DAIFMT_NB_NF : +/* No inversion */ +break ; +default : +return -EINVAL ; + } + +regmap_update_bits (i2s->regmap,SUN4I_I2S_FMT0_REG , +SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK | +SUN8I_I2S_FMT0_BCLK_POLARITY_MASK , + lrclk_pol | bclk_pol); +/* DAI clock master masks */ switch (fmt &SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK ) {case SND_SOC_DAIFMT_BP_FP :
@@ -836,65 +837,37 @@ static int sun8i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,static int sun50i_h6_i2s_set_soc_fmt (const struct sun4i_i2s *i2s,unsigned int fmt) { -u32 mode, val; +u32 mode, lrclk_pol, bclk_pol, val;u8 offset; -/* -* DAI clock polarity -* -* The setup for LRCK contradicts the datasheet, but under a -* scope it's clear that the LRCK polarity is reversed -* compared to the expected polarity on the bus. -*/ -switch (fmt &SND_SOC_DAIFMT_INV_MASK ) { -case SND_SOC_DAIFMT_IB_IF : -/* Invert both clocks */ - val =SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ; -break ; -case SND_SOC_DAIFMT_IB_NF : -/* Invert bit clock */ - val =SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED | -SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED ; -break ; -case SND_SOC_DAIFMT_NB_IF : -/* Invert frame clock */ - val =0 ; -break ; -case SND_SOC_DAIFMT_NB_NF : - val =SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED ; -break ; -default : -return -EINVAL ; - } - -regmap_update_bits (i2s->regmap,SUN4I_I2S_FMT0_REG , -SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK | -SUN8I_I2S_FMT0_BCLK_POLARITY_MASK , - val); -/* DAI Mode */ switch (fmt &SND_SOC_DAIFMT_FORMAT_MASK ) {case SND_SOC_DAIFMT_DSP_A : + lrclk_pol =SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ; mode =SUN8I_I2S_CTRL_MODE_PCM ; offset =1 ;break ;case SND_SOC_DAIFMT_DSP_B : + lrclk_pol =SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ; mode =SUN8I_I2S_CTRL_MODE_PCM ; offset =0 ;break ;case SND_SOC_DAIFMT_I2S : + lrclk_pol =SUN8I_I2S_FMT0_LRCLK_POLARITY_START_LOW ; mode =SUN8I_I2S_CTRL_MODE_LEFT ; offset =1 ;break ;case SND_SOC_DAIFMT_LEFT_J : + lrclk_pol =SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ; mode =SUN8I_I2S_CTRL_MODE_LEFT ; offset =0 ;break ;case SND_SOC_DAIFMT_RIGHT_J : + lrclk_pol =SUN8I_I2S_FMT0_LRCLK_POLARITY_START_HIGH ; mode =SUN8I_I2S_CTRL_MODE_RIGHT ; offset =0 ;break ;
@@ -912,6 +885,36 @@ static int sun50i_h6_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK , SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset)); +/* DAI clock polarity */ + bclk_pol =SUN8I_I2S_FMT0_BCLK_POLARITY_NORMAL ; + +switch (fmt &SND_SOC_DAIFMT_INV_MASK ) { +case SND_SOC_DAIFMT_IB_IF : +/* Invert both clocks */ + lrclk_pol ^=SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK ; + bclk_pol =SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ; +break ; +case SND_SOC_DAIFMT_IB_NF : +/* Invert bit clock */ + bclk_pol =SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED ; +break ; +case SND_SOC_DAIFMT_NB_IF : +/* Invert frame clock */ + lrclk_pol ^=SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK ; +break ; +case SND_SOC_DAIFMT_NB_NF : +/* No inversion */ +break ; +default : +return -EINVAL ; + } + +regmap_update_bits (i2s->regmap,SUN4I_I2S_FMT0_REG , +SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK | +SUN8I_I2S_FMT0_BCLK_POLARITY_MASK , + lrclk_pol | bclk_pol); + +/* DAI clock master masks */ switch (fmt &SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK ) {case SND_SOC_DAIFMT_BP_FP :
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 350/375 clk: qcom: gcc-sm8550: Dont use parking clk_ops for QUPs
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Boyd <[email protected]>
[ Upstream commit d10eeb75168b84ed9559c58efe2756c2e0bc052a ]
The QUPs aren't shared in a way that requires parking the RCG at an always on parent in case some other entity turns on the clk. The hardware is capable of setting a new frequency itself with the DFS mode, so parking is unnecessary. Furthermore, there aren't any GDSCs for these devices, so there isn't a possibility of the GDSC turning on the clks for housekeeping purposes.
This wasn't a problem to mark these clks shared until we started parking shared RCGs at clk registration time in commit 01a0a6cc8cfd ("clk: qcom:
Park shared RCGs upon registration"). Parking at init is actually harmful to the UART when earlycon is used. If the device is pumping out data while the frequency changes you'll see garbage on the serial console until the driver can probe and actually set a proper frequency.
Revert the QUP part of commit 929c75d57566 ("clk: qcom: gcc-sm8550: Mark RCGs shared where applicable") so that the QUPs don't get parked during clk registration and break UART operations.
--- drivers/clk/qcom/gcc-sm8550.c | 52 +++++++++++++++++------------------ 1 file changed, 26 insertions(+), 26 deletions(-)
drivers/clk/qcom/gcc-sm8550.c +26 -26
@@ -536,7 +536,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s0_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, };
@@ -551,7 +551,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s1_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, };
@@ -566,7 +566,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s2_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, };
@@ -581,7 +581,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s3_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, };
@@ -596,7 +596,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s4_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, };
@@ -611,7 +611,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s5_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, };
@@ -626,7 +626,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s6_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, };
@@ -641,7 +641,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s7_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, };
@@ -656,7 +656,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s8_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, };
@@ -671,7 +671,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s9_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, };
@@ -700,7 +700,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
@@ -717,7 +717,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
@@ -750,7 +750,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
@@ -767,7 +767,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
@@ -784,7 +784,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
@@ -801,7 +801,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
@@ -818,7 +818,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s6_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s6_clk_src = {
@@ -835,7 +835,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s7_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap1_s7_clk_src = {
@@ -852,7 +852,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s0_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s0_clk_src = {
@@ -869,7 +869,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s1_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s1_clk_src = {
@@ -886,7 +886,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s2_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s2_clk_src = {
@@ -903,7 +903,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s3_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s3_clk_src = {
@@ -920,7 +920,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s4_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s4_clk_src = {
@@ -937,7 +937,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s5_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s5_clk_src = {
@@ -975,7 +975,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s6_clk_src_init = { .parent_data = gcc_parent_data_8, .num_parents = ARRAY_SIZE(gcc_parent_data_8), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s6_clk_src = {
@@ -992,7 +992,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s7_clk_src_init = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, };static struct clk_rcg2 gcc_qupv3_wrap2_s7_clk_src = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 351/375 clk: qcom: gcc-sm8550: Dont park the USB RCG at registration time
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Boyd <[email protected]>
[ Upstream commit 7b6dfa1bbe7f727315d2e05a2fc8e4cfeb779156 ]
Amit Pundir reports that audio and USB-C host mode stops working if the gcc_usb30_prim_master_clk_src clk is registered and clk_rcg2_shared_init() parks it on XO. Skip parking this clk at registration time to fix those issues.
Partially revert commit 01a0a6cc8cfd ("clk: qcom: Park shared RCGs upon registration") by skipping the parking bit for this clk, but keep the part where we cache the config register. That's still necessary to figure out the true parent of the clk at registration time.
--- drivers/clk/qcom/clk-rcg.h | 1 + drivers/clk/qcom/clk-rcg2.c | 30 ++++++++++++++++++++++++++++++ drivers/clk/qcom/gcc-sm8550.c | 2 +- 3 files changed, 32 insertions(+), 1 deletion(-)
drivers/clk/qcom/clk-rcg.h +1 -0
@@ -198,6 +198,7 @@ extern const struct clk_ops clk_byte2_ops;extern const struct clk_ops clk_pixel_ops;extern const struct clk_ops clk_gfx3d_ops;extern const struct clk_ops clk_rcg2_shared_ops; +extern const struct clk_ops clk_rcg2_shared_no_init_park_ops;extern const struct clk_ops clk_dp_ops;struct clk_rcg_dfs_data {
drivers/clk/qcom/clk-rcg2.c +30 -0
@@ -1348,6 +1348,36 @@ const struct clk_ops clk_rcg2_shared_ops = { };EXPORT_SYMBOL_GPL (clk_rcg2_shared_ops); +static int clk_rcg2_shared_no_init_park (struct clk_hw *hw) +{ +struct clk_rcg2 *rcg =to_clk_rcg2 (hw); + +/* +* Read the config register so that the parent is properly mapped at +* registration time. +*/ +regmap_read (rcg->clkr.regmap, rcg->cmd_rcgr +CFG_REG , &rcg->parked_cfg); + +return 0 ; +} + +/* +* Like clk_rcg2_shared_ops but skip the init so that the clk frequency is left +* unchanged at registration time. +*/ +const struct clk_ops clk_rcg2_shared_no_init_park_ops = { + .init = clk_rcg2_shared_no_init_park, + .enable = clk_rcg2_shared_enable, + .disable = clk_rcg2_shared_disable, + .get_parent = clk_rcg2_shared_get_parent, + .set_parent = clk_rcg2_shared_set_parent, + .recalc_rate = clk_rcg2_shared_recalc_rate, + .determine_rate = clk_rcg2_determine_rate, + .set_rate = clk_rcg2_shared_set_rate, + .set_rate_and_parent = clk_rcg2_shared_set_rate_and_parent, +}; +EXPORT_SYMBOL_GPL (clk_rcg2_shared_no_init_park_ops); +/* Common APIs to be used for DFS based RCGR */ static void clk_rcg2_dfs_populate_freq (struct clk_hw *hw,unsigned int l,struct freq_tbl *f)
drivers/clk/qcom/gcc-sm8550.c +1 -1
@@ -1159,7 +1159,7 @@ static struct clk_rcg2 gcc_usb30_prim_master_clk_src = { .parent_data = gcc_parent_data_0, .num_parents = ARRAY_SIZE(gcc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_shared_no_init_park_ops, }, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 352/375 nouveau: fix the fwsec sb verification register.
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Airlie <[email protected]>
[ Upstream commit f33b9ab0495b7e3bb01bf6d76045f078e20ada65 ]
This aligns with what open gpu does, the 0x15 hex is just to trick you.
--- drivers/gpu/drm/nouveau/nvkm/subdev/gsp/fwsec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/fwsec.c +1 -1
@@ -324,7 +324,7 @@ nvkm_gsp_fwsec_sb(struct nvkm_gsp *gsp)return ret;/* Verify. */ - err =nvkm_rd32 (device,0x001400 + (0xf *4 )) &0x0000ffff ; + err =nvkm_rd32 (device,0x001400 + (0x15 *4 )) &0x0000ffff ;if (err) {nvkm_error (subdev,"fwsec-sb: 0x%04x\n" , err);return -EIO ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 353/375 drm/i915/fence: Mark debug_fence_init_onstack() with __maybe_unused
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit fcd9e8afd546f6ced378d078345a89bf346d065e ]
When debug_fence_init_onstack() is unused (CONFIG_DRM_I915_SELFTEST=n), it prevents kernel builds with clang, make W=1 and CONFIG_WERROR=y:
.../i915_sw_fence.c:97:20: error: unused function 'debug_fence_init_onstack' [-Werror,-Wunused-function]
97 | static inline void debug_fence_init_onstack(struct i915_sw_fence *fence)
| ^~~~~~~~~~~~~~~~~~~~~~~~
Fix this by marking debug_fence_init_onstack() with __maybe_unused.
See also commit 6863f5643dd7 ("kbuild: allow Clang to find unused static inline functions for W=1 build").
--- drivers/gpu/drm/i915/i915_sw_fence.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/i915_sw_fence.c +2 -2
@@ -51,7 +51,7 @@ static inline void debug_fence_init(struct i915_sw_fence *fence)debug_object_init (fence, &i915_sw_fence_debug_descr); } -static inline void debug_fence_init_onstack (struct i915_sw_fence *fence) +static inline __maybe_unused void debug_fence_init_onstack (struct i915_sw_fence *fence) {debug_object_init_on_stack (fence, &i915_sw_fence_debug_descr); }
@@ -94,7 +94,7 @@ static inline void debug_fence_init(struct i915_sw_fence *fence) { } -static inline void debug_fence_init_onstack (struct i915_sw_fence *fence) +static inline __maybe_unused void debug_fence_init_onstack (struct i915_sw_fence *fence) { }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 354/375 drm/i915/fence: Mark debug_fence_free() with __maybe_unused
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit f99999536128b14b5d765a9982763b5134efdd79 ]
When debug_fence_free() is unused (CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS=n), it prevents kernel builds with clang, make W=1 and CONFIG_WERROR=y:
.../i915_sw_fence.c:118:20: error: unused function 'debug_fence_free' [-Werror,-Wunused-function]
118 | static inline void debug_fence_free(struct i915_sw_fence *fence)
| ^~~~~~~~~~~~~~~~
Fix this by marking debug_fence_free() with __maybe_unused.
See also commit 6863f5643dd7 ("kbuild: allow Clang to find unused static inline functions for W=1 build").
--- drivers/gpu/drm/i915/i915_sw_fence.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/i915_sw_fence.c +2 -2
@@ -77,7 +77,7 @@ static inline void debug_fence_destroy(struct i915_sw_fence *fence)debug_object_destroy (fence, &i915_sw_fence_debug_descr); } -static inline void debug_fence_free (struct i915_sw_fence *fence) +static inline __maybe_unused void debug_fence_free (struct i915_sw_fence *fence) {debug_object_free (fence, &i915_sw_fence_debug_descr);smp_wmb ();/* flush the change in state before reallocation */
@@ -115,7 +115,7 @@ static inline void debug_fence_destroy(struct i915_sw_fence *fence) { } -static inline void debug_fence_free (struct i915_sw_fence *fence) +static inline __maybe_unused void debug_fence_free (struct i915_sw_fence *fence) { }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 355/375 gpio: rockchip: fix OF node leak in probe()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit adad2e460e505a556f5ea6f0dc16fe95e62d5d76 ]
Driver code is leaking OF node reference from of_get_parent() in probe().
--- drivers/gpio/gpio-rockchip.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpio/gpio-rockchip.c +1 -0
@@ -713,6 +713,7 @@ static int rockchip_gpio_probe(struct platform_device *pdev)return -ENODEV ; pctldev =of_pinctrl_get (pctlnp); +of_node_put (pctlnp);if (!pctldev)return -EPROBE_DEFER ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 356/375 gpio: modepin: Enable module autoloading
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liao Chen <[email protected]>
[ Upstream commit a5135526426df5319d5f4bcd15ae57c45a97714b ]
Add MODULE_DEVICE_TABLE(), so modules could be properly autoloaded based on the alias from of_device_id table.
--- drivers/gpio/gpio-zynqmp-modepin.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpio/gpio-zynqmp-modepin.c +1 -0
@@ -146,6 +146,7 @@ static const struct of_device_id modepin_platform_id[] = { { .compatible = "xlnx,zynqmp-gpio-modepin", }, { } }; +MODULE_DEVICE_TABLE (of, modepin_platform_id);static struct platform_driver modepin_platform_driver = { .driver = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 357/375 smb: client: fix double put of @cfile in smb2_rename_path()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Alcantara <[email protected]>
[ Upstream commit 3523a3df03c6f04f7ea9c2e7050102657e331a4f ]
If smb2_set_path_attr() is called with a valid @cfile and returned -EINVAL, we need to call cifs_get_writable_path() again as the reference of @cfile was already dropped by previous smb2_compound_op() call.
--- fs/smb/client/smb2inode.c | 2 ++ 1 file changed, 2 insertions(+)
fs/smb/client/smb2inode.c +2 -0
@@ -1106,6 +1106,8 @@ int smb2_rename_path(const unsigned int xid, co, DELETE, SMB2_OP_RENAME, cfile, source_dentry);if (rc == -EINVAL ) {cifs_dbg (FYI ,"invalid lease key, resending request without lease" ); +cifs_get_writable_path (tcon, from_name, +FIND_WR_WITH_DELETE , &cfile); rc =smb2_set_path_attr (xid, tcon, from_name, to_name, cifs_sb, co,DELETE ,SMB2_OP_RENAME , cfile,NULL ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 358/375 riscv: Fix toolchain vector detection
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anton Blanchard <[email protected]>
[ Upstream commit 5ba7a75a53dffbf727e842b5847859bb482ac4aa ]
A recent change to gcc flags rv64iv as no longer valid:
cc1: sorry, unimplemented: Currently the 'V' implementation requires the 'M' extension
and as a result vector support is disabled. Fix this by adding m to our toolchain vector detection code.
--- arch/riscv/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/riscv/Kconfig +2 -2
@@ -545,8 +545,8 @@ config RISCV_ISA_SVPBMT config TOOLCHAIN_HAS_V bool default y - depends on !64BIT || $(cc-option,-mabi=lp64 -march=rv64iv) - depends on !32BIT || $(cc-option,-mabi=ilp32 -march=rv32iv) + depends on !64BIT || $(cc-option,-mabi=lp64 -march=rv64imv) + depends on !32BIT || $(cc-option,-mabi=ilp32 -march=rv32imv) depends on LLD_VERSION >= 140000 || LD_VERSION >= 23800 depends on AS_HAS_OPTION_ARCH
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 359/375 riscv: Do not restrict memory size because of linear mapping on nommu
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandre Ghiti <[email protected]>
[ Upstream commit 5f771088a2b5edd6f2c5c9f34484ca18dc389f3e ]
It makes no sense to restrict physical memory size because of linear mapping size constraints when there is no linear mapping, so only do that when mmu is enabled.
--- arch/riscv/mm/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/mm/init.c +1 -1
@@ -251,7 +251,7 @@ static void __init setup_bootmem(void)* The size of the linear page mapping may restrict the amount of * usable RAM. */ -if (IS_ENABLED (CONFIG_64BIT )) { +if (IS_ENABLED (CONFIG_64BIT ) &&IS_ENABLED (CONFIG_MMU )) { max_mapped_addr =__pa (PAGE_OFFSET ) +KERN_VIRT_SIZE ;memblock_cap_memory_range (phys_ram_base, max_mapped_addr - phys_ram_base);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 360/375 riscv: Add tracepoints for SBI calls and returns
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Samuel Holland <[email protected]>
[ Upstream commit 56c1c1a09ab93c7b7c957860f01f8600d6c03143 ]
These are useful for measuring the latency of SBI calls. The SBI HSM extension is excluded because those functions are called from contexts such as cpuidle where instrumentation is not allowed.
Stable-dep-of: 1ff95eb2bebd ("riscv: Fix RISCV_ALTERNATIVE_EARLY")
--- arch/riscv/include/asm/trace.h | 54 ++++++++++++++++++++++++++++++++++ arch/riscv/kernel/sbi.c | 7 +++++ 2 files changed, 61 insertions(+) create mode 100644 arch/riscv/include/asm/trace.h
arch/riscv/include/asm/trace.h new file +54 -0
@@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM riscv + +#if !defined(_TRACE_RISCV_H) || defined(TRACE_HEADER_MULTI_READ ) +#define _TRACE_RISCV_H + +#include <linux/tracepoint.h> + +TRACE_EVENT_CONDITION (sbi_call, + TP_PROTO(int ext, int fid), +TP_ARGS (ext, fid), +TP_CONDITION (ext !=SBI_EXT_HSM ), + +TP_STRUCT__entry ( + __field(int, ext) +__field (int, fid) + ), + +TP_fast_assign ( + __entry->ext = ext; + __entry->fid = fid; + ), + +TP_printk ("ext=0x%x fid=%d" , __entry->ext, __entry->fid) +); + +TRACE_EVENT_CONDITION (sbi_return, + TP_PROTO(int ext, long error, long value), +TP_ARGS (ext, error, value), +TP_CONDITION (ext !=SBI_EXT_HSM ), + +TP_STRUCT__entry ( + __field(long, error) +__field (long, value) + ), + +TP_fast_assign ( + __entry->error = error; + __entry->value = value; + ), + +TP_printk ("error=%ld value=0x%lx" , __entry->error, __entry->value) +); + +#endif /* _TRACE_RISCV_H */ + +#undef TRACE_INCLUDE_PATH +#undef TRACE_INCLUDE_FILE + +#define TRACE_INCLUDE_PATH asm +#define TRACE_INCLUDE_FILE trace + +#include <trace/define_trace.h>
arch/riscv/kernel/sbi.c +7 -0
@@ -14,6 +14,9 @@#include <asm/smp.h> #include <asm/tlbflush.h> +#define CREATE_TRACE_POINTS +#include <asm/trace.h> +/* default SBI version is 0.1 */ unsigned long sbi_spec_version__ro_after_init =SBI_SPEC_VERSION_DEFAULT ;EXPORT_SYMBOL (sbi_spec_version);
@@ -31,6 +34,8 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, {struct sbiret ret; +trace_sbi_call (ext, fid); + register uintptr_t a0 asm ("a0") = (uintptr_t)(arg0); register uintptr_t a1 asm ("a1") = (uintptr_t)(arg1); register uintptr_t a2 asm ("a2") = (uintptr_t)(arg2);
@@ -46,6 +51,8 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, ret.error = a0; ret.value = a1; +trace_sbi_return (ext, ret.error, ret.value); +return ret; }EXPORT_SYMBOL (sbi_ecall);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 361/375 riscv: Improve sbi_ecall() code generation by reordering arguments
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandre Ghiti <[email protected]>
[ Upstream commit 16badacd8af48980c546839626d0329bab32b4c3 ]
The sbi_ecall() function arguments are not in the same order as the ecall arguments, so we end up re-ordering the registers before the ecall which is useless and costly.
So simply reorder the arguments in the same way as expected by ecall. Instead of reordering directly the arguments of sbi_ecall(), use a proxy macro since the current ordering is more natural.
Before:
Dump of assembler code for function sbi_ecall:
0xffffffff800085e0 <+0>: add sp,sp,-32
0xffffffff800085e2 <+2>: sd s0,24(sp)
0xffffffff800085e4 <+4>: mv t1,a0
0xffffffff800085e6 <+6>: add s0,sp,32
0xffffffff800085e8 <+8>: mv t3,a1
0xffffffff800085ea <+10>: mv a0,a2
0xffffffff800085ec <+12>: mv a1,a3
0xffffffff800085ee <+14>: mv a2,a4
0xffffffff800085f0 <+16>: mv a3,a5
0xffffffff800085f2 <+18>: mv a4,a6
0xffffffff800085f4 <+20>: mv a5,a7
0xffffffff800085f6 <+22>: mv a6,t3
0xffffffff800085f8 <+24>: mv a7,t1
0xffffffff800085fa <+26>: ecall
0xffffffff800085fe <+30>: ld s0,24(sp)
0xffffffff80008600 <+32>: add sp,sp,32
0xffffffff80008602 <+34>: ret
After:
Dump of assembler code for function __sbi_ecall:
0xffffffff8000b6b2 <+0>: add sp,sp,-32
0xffffffff8000b6b4 <+2>: sd s0,24(sp)
0xffffffff8000b6b6 <+4>: add s0,sp,32
0xffffffff8000b6b8 <+6>: ecall
0xffffffff8000b6bc <+10>: ld s0,24(sp)
0xffffffff8000b6be <+12>: add sp,sp,32
0xffffffff8000b6c0 <+14>: ret
Stable-dep-of: 1ff95eb2bebd ("riscv: Fix RISCV_ALTERNATIVE_EARLY")
--- arch/riscv/include/asm/sbi.h | 10 ++++++---- arch/riscv/kernel/sbi.c | 10 +++++----- 2 files changed, 11 insertions(+), 9 deletions(-)
arch/riscv/include/asm/sbi.h +6 -4
@@ -304,10 +304,12 @@ struct sbiret { };void sbi_init (void ); -struct sbiret sbi_ecall (int ext,int fid,unsigned long arg0, -unsigned long arg1,unsigned long arg2, -unsigned long arg3,unsigned long arg4, -unsigned long arg5); +struct sbiret __sbi_ecall (unsigned long arg0,unsigned long arg1, +unsigned long arg2,unsigned long arg3, +unsigned long arg4,unsigned long arg5, +int fid,int ext); +#define sbi_ecall (e, f, a0, a1, a2, a3, a4, a5) \ + __sbi_ecall(a0, a1, a2, a3, a4, a5, f, e)#ifdef CONFIG_RISCV_SBI_V01 void sbi_console_putchar (int ch);
arch/riscv/kernel/sbi.c +5 -5
@@ -27,10 +27,10 @@ static int (*__sbi_rfence)(int fid, const struct cpumask *cpu_mask, unsigned long start, unsigned long size, unsigned long arg4, unsigned long arg5) __ro_after_init; -struct sbiret sbi_ecall (int ext,int fid,unsigned long arg0, -unsigned long arg1,unsigned long arg2, -unsigned long arg3,unsigned long arg4, -unsigned long arg5) +struct sbiret __sbi_ecall (unsigned long arg0,unsigned long arg1, +unsigned long arg2,unsigned long arg3, +unsigned long arg4,unsigned long arg5, +int fid,int ext) {struct sbiret ret;
@@ -55,7 +55,7 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,return ret; } -EXPORT_SYMBOL (sbi_ecall); +EXPORT_SYMBOL (__sbi_ecall);int sbi_err_map_linux_errno (int err) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 362/375 riscv: Fix RISCV_ALTERNATIVE_EARLY
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandre Ghiti <[email protected]>
[ Upstream commit 1ff95eb2bebda50c4c5406caaf201e0fcb24cc8f ]
RISCV_ALTERNATIVE_EARLY will issue sbi_ecall() very early in the boot process, before the first memory mapping is setup so we can't have any instrumentation happening here.
In addition, when the kernel is relocatable, we must also not issue any relocation this early since they would have been patched virtually only.
So, instead of disabling instrumentation for the whole kernel/sbi.c file and compiling it with -fno-pie, simply move __sbi_ecall() and __sbi_base_ecall() into their own file where this is fixed.
--- arch/riscv/include/asm/sbi.h | 20 ++++++++++- arch/riscv/kernel/Makefile | 6 +++- arch/riscv/kernel/sbi.c | 63 ----------------------------------- arch/riscv/kernel/sbi_ecall.c | 48 ++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 65 deletions(-) create mode 100644 arch/riscv/kernel/sbi_ecall.c
arch/riscv/include/asm/sbi.h +19 -1
@@ -9,6 +9,7 @@#include <linux/types.h> #include <linux/cpumask.h> +#include <linux/jump_label.h> #ifdef CONFIG_RISCV_SBI enum sbi_ext_id {
@@ -304,6 +305,7 @@ struct sbiret { };void sbi_init (void ); +long __sbi_base_ecall (int fid); struct sbiret __sbi_ecall(unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5,
@@ -373,7 +375,23 @@ static inline unsigned long sbi_mk_version(unsigned long major, | (minor & SBI_SPEC_VERSION_MINOR_MASK); } -int sbi_err_map_linux_errno (int err); +static inline int sbi_err_map_linux_errno (int err) +{ +switch (err) { +case SBI_SUCCESS : +return 0 ; +case SBI_ERR_DENIED : +return -EPERM ; +case SBI_ERR_INVALID_PARAM : +return -EINVAL ; +case SBI_ERR_INVALID_ADDRESS : +return -EFAULT ; +case SBI_ERR_NOT_SUPPORTED : +case SBI_ERR_FAILURE : +default : +return -ENOTSUPP ; + }; +}extern bool sbi_debug_console_available;int sbi_debug_console_write (const char *bytes,unsigned int num_bytes);
arch/riscv/kernel/Makefile +5 -1
@@ -20,17 +20,21 @@ endif ifdef CONFIG_RISCV_ALTERNATIVE_EARLY CFLAGS_alternative.o := -mcmodel=medany CFLAGS_cpufeature.o := -mcmodel=medany +CFLAGS_sbi_ecall.o := -mcmodel=medany ifdef CONFIG_FTRACE CFLAGS_REMOVE_alternative.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_cpufeature.o = $(CC_FLAGS_FTRACE) +CFLAGS_REMOVE_sbi_ecall.o = $(CC_FLAGS_FTRACE) endif ifdef CONFIG_RELOCATABLE CFLAGS_alternative.o += -fno-pie CFLAGS_cpufeature.o += -fno-pie +CFLAGS_sbi_ecall.o += -fno-pie endif ifdef CONFIG_KASAN KASAN_SANITIZE_alternative.o := n KASAN_SANITIZE_cpufeature.o := n +KASAN_SANITIZE_sbi_ecall.o := n endif endif
@@ -86,7 +90,7 @@ obj-$(CONFIG_DYNAMIC_FTRACE) += mcount-dyn.o obj-$(CONFIG_PERF_EVENTS) += perf_callchain.o obj-$(CONFIG_HAVE_PERF_REGS) += perf_regs.o -obj-$(CONFIG_RISCV_SBI) += sbi.o +obj-$(CONFIG_RISCV_SBI) += sbi.o sbi_ecall.o ifeq ($(CONFIG_RISCV_SBI), y) obj-$(CONFIG_SMP) += sbi-ipi.o obj-$(CONFIG_SMP) += cpu_ops_sbi.o
arch/riscv/kernel/sbi.c +0 -63
81 lines not on this page · raw message
arch/riscv/kernel/sbi_ecall.c new file +48 -0
48 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 363/375 cifs: Fix zero_point init on inode initialisation
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit 517b58c1f9242a6b4ac9443d95569dee58bf6b8b ]
Fix cifs_fattr_to_inode() such that the ->zero_point tracking variable is initialised when the inode is initialised.
--- fs/smb/client/inode.c | 2 ++ 1 file changed, 2 insertions(+)
fs/smb/client/inode.c +2 -0
@@ -172,6 +172,8 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr,CIFS_I (inode)->time =0 ;/* force reval */ return -ESTALE ; } +if (inode->i_state &I_NEW ) +CIFS_I (inode)->netfs.zero_point = fattr->cf_eof;cifs_revalidate_cache (inode, fattr);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 364/375 cifs: Fix SMB1 readv/writev callback in the same way as SMB2/3
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit a68c74865f517e26728735aba0ae05055eaff76c ]
Port a number of SMB2/3 async readv/writev fixes to the SMB1 transport:
commit a88d60903696c01de577558080ec4fc738a70475
cifs: Don't advance the I/O iterator before terminating subrequest
commit ce5291e56081730ec7d87bc9aa41f3de73ff3256
cifs: Defer read completion
commit 1da29f2c39b67b846b74205c81bf0ccd96d34727 netfs, cifs: Fix handling of short DIO read
--- fs/smb/client/cifssmb.c | 54 +++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 8 deletions(-)
fs/smb/client/cifssmb.c +46 -8
@@ -1261,16 +1261,32 @@ CIFS_open(const unsigned int xid, struct cifs_open_parms *oparms, int *oplock,return rc; } +static void cifs_readv_worker (struct work_struct *work) +{ +struct cifs_io_subrequest *rdata = + container_of(work, struct cifs_io_subrequest, subreq.work); + +netfs_subreq_terminated (&rdata->subreq, + (rdata->result ==0 || rdata->result == -EAGAIN ) ? + rdata->got_bytes : rdata->result, true); +} +static void cifs_readv_callback (struct mid_q_entry *mid) {struct cifs_io_subrequest *rdata = mid->callback_data; +struct netfs_inode *ictx =netfs_inode (rdata->rreq->inode);struct cifs_tcon *tcon =tlink_tcon (rdata->req->cfile->tlink);struct TCP_Server_Info *server = tcon->ses->server;struct smb_rqst rqst = { .rq_iov = rdata->iov, .rq_nvec =2 , .rq_iter = rdata->subreq.io_iter }; -struct cifs_credits credits = { .value =1 , .instance =0 }; +struct cifs_credits credits = { + .value =1 , + .instance =0 , + .rreq_debug_id = rdata->rreq->debug_id, + .rreq_debug_index = rdata->subreq.debug_index, + }; cifs_dbg(FYI, "%s: mid=%llu state=%d result=%d bytes=%zu\n", __func__, mid->mid, mid->mid_state, rdata->result,
@@ -1282,6 +1298,7 @@ cifs_readv_callback(struct mid_q_entry *mid)if (server->sign) {int rc =0 ; +iov_iter_truncate (&rqst.rq_iter, rdata->got_bytes); rc =cifs_verify_signature (&rqst, server, mid->sequence_number);if (rc)
@@ -1306,13 +1323,21 @@ cifs_readv_callback(struct mid_q_entry *mid) rdata->result = -EIO ; } -if (rdata->result ==0 || rdata->result == -EAGAIN ) -iov_iter_advance (&rdata->subreq.io_iter, rdata->got_bytes); +if (rdata->result == -ENODATA ) { +__set_bit (NETFS_SREQ_HIT_EOF , &rdata->subreq.flags); + rdata->result =0 ; + }else { +if (rdata->got_bytes < rdata->actual_len && + rdata->subreq.start + rdata->subreq.transferred + rdata->got_bytes == + ictx->remote_i_size) { +__set_bit (NETFS_SREQ_HIT_EOF , &rdata->subreq.flags); + rdata->result =0 ; + } + } + rdata->credits.value =0 ; -netfs_subreq_terminated (&rdata->subreq, - (rdata->result ==0 || rdata->result == -EAGAIN ) ? - rdata->got_bytes : rdata->result, - false); +INIT_WORK (&rdata->subreq.work, cifs_readv_worker); +queue_work (cifsiod_wq, &rdata->subreq.work);release_mid (mid);add_credits (server, &credits,0 ); }
@@ -1619,9 +1644,15 @@ static void cifs_writev_callback(struct mid_q_entry *mid) {struct cifs_io_subrequest *wdata = mid->callback_data; +struct TCP_Server_Info *server = wdata->server;struct cifs_tcon *tcon =tlink_tcon (wdata->req->cfile->tlink);WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf; -struct cifs_credits credits = { .value =1 , .instance =0 }; +struct cifs_credits credits = { + .value =1 , + .instance =0 , + .rreq_debug_id = wdata->rreq->debug_id, + .rreq_debug_index = wdata->subreq.debug_index, + };ssize_t result;size_t written;
@@ -1657,9 +1688,16 @@ cifs_writev_callback(struct mid_q_entry *mid)break ; } +trace_smb3_rw_credits (credits.rreq_debug_id, credits.rreq_debug_index, + wdata->credits.value, + server->credits, server->in_flight, +0 , cifs_trace_rw_credits_write_response_clear); wdata->credits.value =0 ;cifs_write_subrequest_terminated (wdata, result, true);release_mid (mid); +trace_smb3_rw_credits (credits.rreq_debug_id, credits.rreq_debug_index,0 , + server->credits, server->in_flight, + credits.value, cifs_trace_rw_credits_write_response_add);add_credits (tcon->ses->server, &credits,0 ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 365/375 nvme: rename nvme_sc_to_pr_err to nvme_status_to_pr_err
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weiwen Hu <[email protected]>
[ Upstream commit 22f19a584d7045e0509f103dbc5c0acfd6415163 ]
This should better match its semantic. "sc" is used in the NVMe spec to specifically refer to the last 8 bits in the status field. We should not reuse "sc" here.
Stable-dep-of: 899d2e5a4e3d ("nvmet: Identify-Active Namespace ID List command should reject invalid nsid")
--- drivers/nvme/host/pr.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/nvme/host/pr.c +5 -5
@@ -72,12 +72,12 @@ static int nvme_send_ns_pr_command(struct nvme_ns *ns, struct nvme_command *c,return nvme_submit_sync_cmd (ns->queue, c, data, data_len); } -static int nvme_sc_to_pr_err (int nvme_sc) +static int nvme_status_to_pr_err (int status) { -if (nvme_is_path_error (nvme_sc)) +if (nvme_is_path_error (status))return PR_STS_PATH_FAILED ; -switch (nvme_sc &0x7ff ) { +switch (status &0x7ff ) {case NVME_SC_SUCCESS :return PR_STS_SUCCESS ;case NVME_SC_RESERVATION_CONFLICT :
@@ -121,7 +121,7 @@ static int nvme_pr_command(struct block_device *bdev, u32 cdw10,if (ret <0 )return ret; -return nvme_sc_to_pr_err (ret); +return nvme_status_to_pr_err (ret); } static int nvme_pr_register(struct block_device *bdev, u64 old,
@@ -196,7 +196,7 @@ static int nvme_pr_resv_report(struct block_device *bdev, void *data,if (ret <0 )return ret; -return nvme_sc_to_pr_err (ret); +return nvme_status_to_pr_err (ret); } static int nvme_pr_read_keys(struct block_device *bdev,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 366/375 nvme: fix status magic numbers
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weiwen Hu <[email protected]>
[ Upstream commit d89a5c6705998ddc42b104f8eabd3c4b9e8fde08 ]
Replaced some magic numbers about SC and SCT with enum and macro.
Stable-dep-of: 899d2e5a4e3d ("nvmet: Identify-Active Namespace ID List command should reject invalid nsid")
--- drivers/nvme/host/constants.c | 2 +- drivers/nvme/host/core.c | 18 +++++++++--------- drivers/nvme/host/multipath.c | 2 +- drivers/nvme/host/nvme.h | 4 ++-- drivers/nvme/host/pr.c | 2 +- include/linux/nvme.h | 14 ++++++++++++-- 6 files changed, 26 insertions(+), 16 deletions(-)
drivers/nvme/host/constants.c +1 -1
@@ -173,7 +173,7 @@ static const char * const nvme_statuses[] = {const char *nvme_get_error_status_str (u16 status) { - status &=0x7ff ; + status &=NVME_SCT_SC_MASK ;if (status <ARRAY_SIZE (nvme_statuses) && nvme_statuses[status])return nvme_statuses[status];return "Unknown" ;
drivers/nvme/host/core.c +9 -9
@@ -261,7 +261,7 @@ void nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl)static blk_status_t nvme_error_status (u16 status) { -switch (status &0x7ff ) { +switch (status &NVME_SCT_SC_MASK ) {case NVME_SC_SUCCESS :return BLK_STS_OK ;case NVME_SC_CAP_EXCEEDED :
@@ -329,8 +329,8 @@ static void nvme_log_error(struct request *req)nvme_sect_to_lba (ns->head,blk_rq_pos (req)),blk_rq_bytes (req) >> ns->head->lba_shift,nvme_get_error_status_str (nr->status), - nr->status >>8 &7 ,/* Status Code Type */ - nr->status &0xff ,/* Status Code */ +NVME_SCT (nr->status),/* Status Code Type */ + nr->status &NVME_SC_MASK ,/* Status Code */ nr->status &NVME_SC_MORE ?"MORE " :"" , nr->status & NVME_SC_DNR ? "DNR " : "");return ;
@@ -341,8 +341,8 @@ static void nvme_log_error(struct request *req)nvme_get_admin_opcode_str (nr->cmd->common.opcode), nr->cmd->common.opcode,nvme_get_error_status_str (nr->status), - nr->status >>8 &7 ,/* Status Code Type */ - nr->status &0xff ,/* Status Code */ +NVME_SCT (nr->status),/* Status Code Type */ + nr->status &NVME_SC_MASK ,/* Status Code */ nr->status &NVME_SC_MORE ?"MORE " :"" , nr->status & NVME_SC_DNR ? "DNR " : ""); }
@@ -359,8 +359,8 @@ static void nvme_log_err_passthru(struct request *req)nvme_get_admin_opcode_str (nr->cmd->common.opcode), nr->cmd->common.opcode,nvme_get_error_status_str (nr->status), - nr->status >>8 &7 ,/* Status Code Type */ - nr->status &0xff ,/* Status Code */ +NVME_SCT (nr->status),/* Status Code Type */ + nr->status &NVME_SC_MASK ,/* Status Code */ nr->status &NVME_SC_MORE ?"MORE " :"" , nr->status &NVME_SC_DNR ?"DNR " :"" , nr->cmd->common.cdw10,
@@ -388,7 +388,7 @@ static inline enum nvme_disposition nvme_decide_disposition(struct request *req) nvme_req(req)->retries >= nvme_max_retries)return COMPLETE ; -if ((nvme_req (req)->status &0x7ff ) ==NVME_SC_AUTH_REQUIRED ) +if ((nvme_req (req)->status &NVME_SCT_SC_MASK ) ==NVME_SC_AUTH_REQUIRED )return AUTHENTICATE ;if (req->cmd_flags &REQ_NVME_MPATH ) {
@@ -1224,7 +1224,7 @@ EXPORT_SYMBOL_NS_GPL(nvme_passthru_end, NVME_TARGET_PASSTHRU);/* * Recommended frequency for KATO commands per NVMe 1.4 section 7.12.1: -* +* * The host should send Keep Alive commands at half of the Keep Alive Timeout * accounting for transport roundtrip times [..]. */
drivers/nvme/host/multipath.c +1 -1
@@ -83,7 +83,7 @@ void nvme_mpath_start_freeze(struct nvme_subsystem *subsys)void nvme_failover_req (struct request *req) {struct nvme_ns *ns = req->q->queuedata; -u16 status =nvme_req (req)->status &0x7ff ; +u16 status =nvme_req (req)->status &NVME_SCT_SC_MASK ;unsigned long flags;struct bio *bio;
drivers/nvme/host/nvme.h +2 -2
@@ -689,7 +689,7 @@ static inline u32 nvme_bytes_to_numd(size_t len)static inline bool nvme_is_ana_error (u16 status) { -switch (status &0x7ff ) { +switch (status &NVME_SCT_SC_MASK ) {case NVME_SC_ANA_TRANSITION :case NVME_SC_ANA_INACCESSIBLE :case NVME_SC_ANA_PERSISTENT_LOSS :
@@ -702,7 +702,7 @@ static inline bool nvme_is_ana_error(u16 status)static inline bool nvme_is_path_error (u16 status) {/* check for a status code type of 'path related status' */ -return (status &0x700 ) ==0x300 ; +return (status &NVME_SCT_MASK ) ==NVME_SCT_PATH ; }/*
drivers/nvme/host/pr.c +1 -1
@@ -77,7 +77,7 @@ static int nvme_status_to_pr_err(int status)if (nvme_is_path_error (status))return PR_STS_PATH_FAILED ; -switch (status &0x7ff ) { +switch (status &NVME_SCT_SC_MASK ) {case NVME_SC_SUCCESS :return PR_STS_SUCCESS ;case NVME_SC_RESERVATION_CONFLICT :
include/linux/nvme.h +12 -2
@@ -1848,6 +1848,7 @@ enum {/* * Generic Command Status: */ +NVME_SCT_GENERIC =0x0 ,NVME_SC_SUCCESS =0x0 ,NVME_SC_INVALID_OPCODE =0x1 , NVME_SC_INVALID_FIELD = 0x2,
@@ -1895,6 +1896,7 @@ enum {/* * Command Specific Status: */ +NVME_SCT_COMMAND_SPECIFIC =0x100 ,NVME_SC_CQ_INVALID =0x100 ,NVME_SC_QID_INVALID =0x101 , NVME_SC_QUEUE_SIZE = 0x102,
@@ -1968,6 +1970,7 @@ enum {/* * Media and Data Integrity Errors: */ +NVME_SCT_MEDIA_ERROR =0x200 ,NVME_SC_WRITE_FAULT =0x280 ,NVME_SC_READ_ERROR =0x281 , NVME_SC_GUARD_CHECK = 0x282,
@@ -1980,6 +1983,7 @@ enum {/* * Path-related Errors: */ +NVME_SCT_PATH =0x300 ,NVME_SC_INTERNAL_PATH_ERROR =0x300 ,NVME_SC_ANA_PERSISTENT_LOSS =0x301 , NVME_SC_ANA_INACCESSIBLE = 0x302,
@@ -1988,11 +1992,17 @@ enum {NVME_SC_HOST_PATH_ERROR =0x370 ,NVME_SC_HOST_ABORTED_CMD =0x371 , -NVME_SC_CRD =0x1800 , +NVME_SC_MASK =0x00ff ,/* Status Code */ +NVME_SCT_MASK =0x0700 ,/* Status Code Type */ +NVME_SCT_SC_MASK =NVME_SCT_MASK |NVME_SC_MASK , + +NVME_SC_CRD =0x1800 ,/* Command Retry Delayed */ NVME_SC_MORE =0x2000 , - NVME_SC_DNR = 0x4000, + NVME_SC_DNR = 0x4000, /* Do Not Retry */ }; +#define NVME_SCT (status) ((status) >> 8 & 7) + struct nvme_completion {/* * Used by Admin and Fabrics commands to return data:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 367/375 nvme: rename CDR/MORE/DNR to NVME_STATUS_*
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weiwen Hu <[email protected]>
[ Upstream commit dd0b0a4a2c5d7209457dc172997d1243ad269cfa ]
CDR/MORE/DNR fields are not belonging to SC in the NVMe spec, rename them to NVME_STATUS_* to avoid confusion.
Stable-dep-of: 899d2e5a4e3d ("nvmet: Identify-Active Namespace ID List command should reject invalid nsid")
--- drivers/nvme/host/core.c | 22 ++++++------ drivers/nvme/host/fabrics.c | 10 +++--- drivers/nvme/host/fault_inject.c | 2 +- drivers/nvme/host/fc.c | 6 ++-- drivers/nvme/host/nvme.h | 2 +- drivers/nvme/target/admin-cmd.c | 24 +++++++------- drivers/nvme/target/core.c | 46 +++++++++++++------------- drivers/nvme/target/discovery.c | 14 ++++---- drivers/nvme/target/fabrics-cmd-auth.c | 16 ++++----- drivers/nvme/target/fabrics-cmd.c | 36 ++++++++++---------- drivers/nvme/target/io-cmd-bdev.c | 12 +++---- drivers/nvme/target/passthru.c | 10 +++--- drivers/nvme/target/rdma.c | 10 +++--- drivers/nvme/target/tcp.c | 4 +-- drivers/nvme/target/zns.c | 30 ++++++++--------- include/linux/nvme.h | 6 ++-- 16 files changed, 125 insertions(+), 125 deletions(-)
drivers/nvme/host/core.c +11 -11
@@ -307,7 +307,7 @@ static void nvme_retry_req(struct request *req)u16 crd;/* The mask and shift result must be <= 3 */ - crd = (nvme_req (req)->status &NVME_SC_CRD ) >>11 ; + crd = (nvme_req (req)->status &NVME_STATUS_CRD ) >>11 ;if (crd) delay =nvme_req (req)->ctrl->crdt[crd -1 ] *100 ;
@@ -331,8 +331,8 @@ static void nvme_log_error(struct request *req)nvme_get_error_status_str (nr->status),NVME_SCT (nr->status),/* Status Code Type */ nr->status &NVME_SC_MASK ,/* Status Code */ - nr->status &NVME_SC_MORE ?"MORE " :"" , - nr->status & NVME_SC_DNR ? "DNR " : ""); + nr->status &NVME_STATUS_MORE ?"MORE " :"" , + nr->status & NVME_STATUS_DNR ? "DNR " : "");return ; }
@@ -343,8 +343,8 @@ static void nvme_log_error(struct request *req)nvme_get_error_status_str (nr->status),NVME_SCT (nr->status),/* Status Code Type */ nr->status &NVME_SC_MASK ,/* Status Code */ - nr->status &NVME_SC_MORE ?"MORE " :"" , - nr->status & NVME_SC_DNR ? "DNR " : ""); + nr->status &NVME_STATUS_MORE ?"MORE " :"" , + nr->status & NVME_STATUS_DNR ? "DNR " : ""); }static void nvme_log_err_passthru (struct request *req)
@@ -361,8 +361,8 @@ static void nvme_log_err_passthru(struct request *req)nvme_get_error_status_str (nr->status),NVME_SCT (nr->status),/* Status Code Type */ nr->status &NVME_SC_MASK ,/* Status Code */ - nr->status &NVME_SC_MORE ?"MORE " :"" , - nr->status &NVME_SC_DNR ?"DNR " :"" , + nr->status &NVME_STATUS_MORE ?"MORE " :"" , + nr->status &NVME_STATUS_DNR ?"DNR " :"" , nr->cmd->common.cdw10, nr->cmd->common.cdw11, nr->cmd->common.cdw12,
@@ -384,7 +384,7 @@ static inline enum nvme_disposition nvme_decide_disposition(struct request *req)return COMPLETE ;if (blk_noretry_request (req) || - (nvme_req (req)->status &NVME_SC_DNR ) || + (nvme_req (req)->status &NVME_STATUS_DNR ) ||nvme_req (req)->retries >= nvme_max_retries)return COMPLETE ;
@@ -3887,7 +3887,7 @@ static void nvme_ns_remove_by_nsid(struct nvme_ctrl *ctrl, u32 nsid)static void nvme_validate_ns (struct nvme_ns *ns,struct nvme_ns_info *info) { -int ret =NVME_SC_INVALID_NS |NVME_SC_DNR ; +int ret =NVME_SC_INVALID_NS |NVME_STATUS_DNR ;if (!nvme_ns_ids_equal (&ns->head->ids, &info->ids)) { dev_err(ns->ctrl->device,
@@ -3903,7 +3903,7 @@ static void nvme_validate_ns(struct nvme_ns *ns, struct nvme_ns_info *info)* * TODO: we should probably schedule a delayed retry here. */ -if (ret >0 && (ret &NVME_SC_DNR )) +if (ret >0 && (ret &NVME_STATUS_DNR ))nvme_ns_remove (ns); }
@@ -4095,7 +4095,7 @@ static void nvme_scan_work(struct work_struct *work)* they report) but don't actually support it. */ ret =nvme_scan_ns_list (ctrl); -if (ret >0 && ret &NVME_SC_DNR ) +if (ret >0 && ret &NVME_STATUS_DNR )nvme_scan_ns_sequential (ctrl); }mutex_unlock (&ctrl->scan_lock);
drivers/nvme/host/fabrics.c +5 -5
@@ -187,7 +187,7 @@ int nvmf_reg_read32(struct nvme_ctrl *ctrl, u32 off, u32 *val)if (unlikely (ret !=0 ))dev_err (ctrl->device,"Property Get error: %d, offset %#x\n" , - ret >0 ? ret & ~NVME_SC_DNR : ret, off); + ret >0 ? ret & ~NVME_STATUS_DNR : ret, off);return ret; }
@@ -233,7 +233,7 @@ int nvmf_reg_read64(struct nvme_ctrl *ctrl, u32 off, u64 *val)if (unlikely (ret !=0 ))dev_err (ctrl->device,"Property Get error: %d, offset %#x\n" , - ret >0 ? ret & ~NVME_SC_DNR : ret, off); + ret >0 ? ret & ~NVME_STATUS_DNR : ret, off);return ret; }EXPORT_SYMBOL_GPL (nvmf_reg_read64);
@@ -275,7 +275,7 @@ int nvmf_reg_write32(struct nvme_ctrl *ctrl, u32 off, u32 val)if (unlikely (ret))dev_err (ctrl->device,"Property Set error: %d, offset %#x\n" , - ret >0 ? ret & ~NVME_SC_DNR : ret, off); + ret >0 ? ret & ~NVME_STATUS_DNR : ret, off);return ret; }EXPORT_SYMBOL_GPL (nvmf_reg_write32);
@@ -295,7 +295,7 @@ static void nvmf_log_connect_error(struct nvme_ctrl *ctrl, int errval, int offset, struct nvme_command *cmd, struct nvmf_connect_data *data) { - int err_sctype = errval & ~NVME_SC_DNR; + int err_sctype = errval & ~NVME_STATUS_DNR;if (errval <0 ) { dev_err(ctrl->device,
@@ -573,7 +573,7 @@ EXPORT_SYMBOL_GPL(nvmf_connect_io_queue);*/ bool nvmf_should_reconnect (struct nvme_ctrl *ctrl,int status) { -if (status >0 && (status &NVME_SC_DNR )) +if (status >0 && (status &NVME_STATUS_DNR ))return false;if (status == -EKEYREJECTED )
drivers/nvme/host/fault_inject.c +1 -1
@@ -75,7 +75,7 @@ void nvme_should_fail(struct request *req)/* inject status code and DNR bit */ status = fault_inject->status;if (fault_inject->dont_retry) - status |=NVME_SC_DNR ; + status |=NVME_STATUS_DNR ;nvme_req (req)->status = status; } }
drivers/nvme/host/fc.c +3 -3
@@ -3132,7 +3132,7 @@ nvme_fc_create_association(struct nvme_fc_ctrl *ctrl)if (ctrl->ctrl.icdoff) {dev_err (ctrl->ctrl.device,"icdoff %d is not supported!\n" , ctrl->ctrl.icdoff); - ret =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + ret =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; goto out_stop_keep_alive; }
@@ -3140,7 +3140,7 @@ nvme_fc_create_association(struct nvme_fc_ctrl *ctrl)if (!nvme_ctrl_sgl_supported (&ctrl->ctrl)) {dev_err (ctrl->ctrl.device,"Mandatory sgls are not supported!\n" ); - ret =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + ret =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; goto out_stop_keep_alive; }
@@ -3325,7 +3325,7 @@ nvme_fc_reconnect_or_delete(struct nvme_fc_ctrl *ctrl, int status)queue_delayed_work (nvme_wq, &ctrl->connect_work, recon_delay); }else {if (portptr->port_state ==FC_OBJSTATE_ONLINE ) { -if (status >0 && (status &NVME_SC_DNR )) +if (status >0 && (status &NVME_STATUS_DNR ))dev_warn (ctrl->ctrl.device,"NVME-FC{%d}: reconnect failure\n" , ctrl->cnum);
drivers/nvme/host/nvme.h +1 -1
@@ -877,7 +877,7 @@ enum {NVME_SUBMIT_NOWAIT = (__force nvme_submit_flags_t)(1 <<1 ),/* Set BLK_MQ_REQ_RESERVED when allocating request */ NVME_SUBMIT_RESERVED = (__force nvme_submit_flags_t)(1 <<2 ), -/* Retry command when NVME_SC_DNR is not set in the result */ +/* Retry command when NVME_STATUS_DNR is not set in the result */ NVME_SUBMIT_RETRY = (__force nvme_submit_flags_t)(1 << 3), };
drivers/nvme/target/admin-cmd.c +12 -12
@@ -344,7 +344,7 @@ static void nvmet_execute_get_log_page(struct nvmet_req *req)pr_debug ("unhandled lid %d on qid %d\n" , req->cmd->get_log_page.lid, req->sq->qid); req->error_loc = offsetof(struct nvme_get_log_page_command , lid); -nvmet_req_complete (req,NVME_SC_INVALID_FIELD |NVME_SC_DNR ); +nvmet_req_complete (req,NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ); }static void nvmet_execute_identify_ctrl (struct nvmet_req *req)
@@ -496,7 +496,7 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req)if (le32_to_cpu (req->cmd->identify.nsid) ==NVME_NSID_ALL ) { req->error_loc = offsetof(struct nvme_identify , nsid); - status =NVME_SC_INVALID_NS |NVME_SC_DNR ; + status =NVME_SC_INVALID_NS |NVME_STATUS_DNR ; goto out; }
@@ -662,7 +662,7 @@ static void nvmet_execute_identify_desclist(struct nvmet_req *req)if (sg_zero_buffer (req->sg, req->sg_cnt,NVME_IDENTIFY_DATA_SIZE - off, off) !=NVME_IDENTIFY_DATA_SIZE - off) - status =NVME_SC_INTERNAL |NVME_SC_DNR ; + status =NVME_SC_INTERNAL |NVME_STATUS_DNR ; out:nvmet_req_complete (req, status);
@@ -724,7 +724,7 @@ static void nvmet_execute_identify(struct nvmet_req *req)pr_debug ("unhandled identify cns %d on qid %d\n" , req->cmd->identify.cns, req->sq->qid); req->error_loc = offsetof(struct nvme_identify , cns); -nvmet_req_complete (req,NVME_SC_INVALID_FIELD |NVME_SC_DNR ); +nvmet_req_complete (req,NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ); }/*
@@ -807,7 +807,7 @@ u16 nvmet_set_feat_async_event(struct nvmet_req *req, u32 mask)if (val32 & ~mask) { req->error_loc = offsetof(struct nvme_common_command , cdw11); -return NVME_SC_INVALID_FIELD |NVME_SC_DNR ; +return NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; }WRITE_ONCE (req->sq->ctrl->aen_enabled, val32);
@@ -833,7 +833,7 @@ void nvmet_execute_set_features(struct nvmet_req *req) ncqr = (cdw11 >>16 ) &0xffff ; nsqr = cdw11 &0xffff ;if (ncqr ==0xffff || nsqr ==0xffff ) { - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ;break ; } nvmet_set_result(req,
@@ -846,14 +846,14 @@ void nvmet_execute_set_features(struct nvmet_req *req) status =nvmet_set_feat_async_event (req,NVMET_AEN_CFG_ALL );break ;case NVME_FEAT_HOST_ID : - status =NVME_SC_CMD_SEQ_ERROR |NVME_SC_DNR ; + status =NVME_SC_CMD_SEQ_ERROR |NVME_STATUS_DNR ;break ;case NVME_FEAT_WRITE_PROTECT : status =nvmet_set_feat_write_protect (req);break ;default : req->error_loc = offsetof(struct nvme_common_command , cdw10); - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ;break ; }
@@ -939,7 +939,7 @@ void nvmet_execute_get_features(struct nvmet_req *req)if (!(req->cmd->common.cdw11 &cpu_to_le32 (1 <<0 ))) { req->error_loc = offsetof(struct nvme_common_command , cdw11); - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ;break ; }
@@ -952,7 +952,7 @@ void nvmet_execute_get_features(struct nvmet_req *req)default : req->error_loc = offsetof(struct nvme_common_command , cdw10); - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ;break ; }
@@ -969,7 +969,7 @@ void nvmet_execute_async_event(struct nvmet_req *req)mutex_lock (&ctrl->lock);if (ctrl->nr_async_event_cmds >=NVMET_ASYNC_EVENTS ) {mutex_unlock (&ctrl->lock); -nvmet_req_complete (req,NVME_SC_ASYNC_LIMIT |NVME_SC_DNR ); +nvmet_req_complete (req,NVME_SC_ASYNC_LIMIT |NVME_STATUS_DNR );return ; } ctrl->async_event_cmds[ctrl->nr_async_event_cmds++] = req;
@@ -1006,7 +1006,7 @@ u16 nvmet_parse_admin_cmd(struct nvmet_req *req)if (nvme_is_fabrics (cmd))return nvmet_parse_fabrics_admin_cmd (req);if (unlikely (!nvmet_check_auth_status (req))) -return NVME_SC_AUTH_REQUIRED |NVME_SC_DNR ; +return NVME_SC_AUTH_REQUIRED |NVME_STATUS_DNR ;if (nvmet_is_disc_subsys (nvmet_req_subsys (req)))return nvmet_parse_discovery_cmd (req);
drivers/nvme/target/core.c +23 -23
171 lines not on this page · raw message
drivers/nvme/target/discovery.c +7 -7
@@ -179,7 +179,7 @@ static void nvmet_execute_disc_get_log_page(struct nvmet_req *req)if (req->cmd->get_log_page.lid !=NVME_LOG_DISC ) { req->error_loc = offsetof(struct nvme_get_log_page_command , lid); - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; goto out; }
@@ -187,7 +187,7 @@ static void nvmet_execute_disc_get_log_page(struct nvmet_req *req)if (offset &0x3 ) { req->error_loc = offsetof(struct nvme_get_log_page_command , lpo); - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; goto out; }
@@ -256,7 +256,7 @@ static void nvmet_execute_disc_identify(struct nvmet_req *req)if (req->cmd->identify.cns !=NVME_ID_CNS_CTRL ) { req->error_loc = offsetof(struct nvme_identify , cns); - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; goto out; }
@@ -320,7 +320,7 @@ static void nvmet_execute_disc_set_features(struct nvmet_req *req)default : req->error_loc = offsetof(struct nvme_common_command , cdw10); - stat =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + stat =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ;break ; }
@@ -345,7 +345,7 @@ static void nvmet_execute_disc_get_features(struct nvmet_req *req)default : req->error_loc = offsetof(struct nvme_common_command , cdw10); - stat =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + stat =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ;break ; }
@@ -361,7 +361,7 @@ u16 nvmet_parse_discovery_cmd(struct nvmet_req *req) cmd->common.opcode); req->error_loc = offsetof(struct nvme_common_command , opcode); -return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; +return NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ; }switch (cmd->common.opcode) {
@@ -386,7 +386,7 @@ u16 nvmet_parse_discovery_cmd(struct nvmet_req *req)default :pr_debug ("unhandled cmd %d\n" , cmd->common.opcode); req->error_loc = offsetof(struct nvme_common_command , opcode); -return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; +return NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ; } }
drivers/nvme/target/fabrics-cmd-auth.c +8 -8
@@ -189,26 +189,26 @@ void nvmet_execute_auth_send(struct nvmet_req *req)u8 dhchap_status;if (req->cmd->auth_send.secp !=NVME_AUTH_DHCHAP_PROTOCOL_IDENTIFIER ) { - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvmf_auth_send_command , secp); goto done; }if (req->cmd->auth_send.spsp0 !=0x01 ) { - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvmf_auth_send_command , spsp0); goto done; }if (req->cmd->auth_send.spsp1 !=0x01 ) { - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvmf_auth_send_command , spsp1); goto done; } tl =le32_to_cpu (req->cmd->auth_send.tl);if (!tl) { - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvmf_auth_send_command , tl); goto done;
@@ -437,26 +437,26 @@ void nvmet_execute_auth_receive(struct nvmet_req *req)u16 status =0 ;if (req->cmd->auth_receive.secp !=NVME_AUTH_DHCHAP_PROTOCOL_IDENTIFIER ) { - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvmf_auth_receive_command , secp); goto done; }if (req->cmd->auth_receive.spsp0 !=0x01 ) { - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvmf_auth_receive_command , spsp0); goto done; }if (req->cmd->auth_receive.spsp1 !=0x01 ) { - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvmf_auth_receive_command , spsp1); goto done; } al =le32_to_cpu (req->cmd->auth_receive.al);if (!al) { - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvmf_auth_receive_command , al); goto done;
drivers/nvme/target/fabrics-cmd.c +18 -18
@@ -18,7 +18,7 @@ static void nvmet_execute_prop_set(struct nvmet_req *req)if (req->cmd->prop_set.attrib &1 ) { req->error_loc = offsetof(struct nvmf_property_set_command , attrib); - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; goto out; }
@@ -29,7 +29,7 @@ static void nvmet_execute_prop_set(struct nvmet_req *req)default : req->error_loc = offsetof(struct nvmf_property_set_command , offset); - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; } out:nvmet_req_complete (req, status);
@@ -50,7 +50,7 @@ static void nvmet_execute_prop_get(struct nvmet_req *req) val = ctrl->cap;break ;default : - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ;break ; } }else {
@@ -65,7 +65,7 @@ static void nvmet_execute_prop_get(struct nvmet_req *req) val = ctrl->csts;break ;default : - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ;break ; } }
@@ -105,7 +105,7 @@ u16 nvmet_parse_fabrics_admin_cmd(struct nvmet_req *req)pr_debug ("received unknown capsule type 0x%x\n" , cmd->fabrics.fctype); req->error_loc = offsetof(struct nvmf_common_command , fctype); -return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; +return NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ; }return 0 ;
@@ -128,7 +128,7 @@ u16 nvmet_parse_fabrics_io_cmd(struct nvmet_req *req)pr_debug ("received unknown capsule type 0x%x\n" , cmd->fabrics.fctype); req->error_loc = offsetof(struct nvmf_common_command , fctype); -return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; +return NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ; }return 0 ;
@@ -147,14 +147,14 @@ static u16 nvmet_install_queue(struct nvmet_ctrl *ctrl, struct nvmet_req *req)pr_warn ("queue size zero!\n" ); req->error_loc = offsetof(struct nvmf_connect_command , sqsize); req->cqe->result.u32 =IPO_IATTR_CONNECT_SQE (sqsize); - ret =NVME_SC_CONNECT_INVALID_PARAM |NVME_SC_DNR ; + ret =NVME_SC_CONNECT_INVALID_PARAM |NVME_STATUS_DNR ; goto err; }if (ctrl->sqs[qid] !=NULL ) {pr_warn ("qid %u has already been created\n" , qid); req->error_loc = offsetof(struct nvmf_connect_command , qid); -return NVME_SC_CMD_SEQ_ERROR |NVME_SC_DNR ; +return NVME_SC_CMD_SEQ_ERROR |NVME_STATUS_DNR ; }/* for fabrics, this value applies to only the I/O Submission Queues */
@@ -163,14 +163,14 @@ static u16 nvmet_install_queue(struct nvmet_ctrl *ctrl, struct nvmet_req *req) sqsize, mqes, ctrl->cntlid); req->error_loc = offsetof(struct nvmf_connect_command , sqsize); req->cqe->result.u32 =IPO_IATTR_CONNECT_SQE (sqsize); -return NVME_SC_CONNECT_INVALID_PARAM |NVME_SC_DNR ; +return NVME_SC_CONNECT_INVALID_PARAM |NVME_STATUS_DNR ; } old =cmpxchg (&req->sq->ctrl,NULL , ctrl);if (old) {pr_warn ("queue already connected!\n" ); req->error_loc = offsetof(struct nvmf_connect_command , opcode); -return NVME_SC_CONNECT_CTRL_BUSY |NVME_SC_DNR ; +return NVME_SC_CONNECT_CTRL_BUSY |NVME_STATUS_DNR ; }/* note: convert queue size from 0's-based value to 1's-based value */
@@ -230,14 +230,14 @@ static void nvmet_execute_admin_connect(struct nvmet_req *req)pr_warn ("invalid connect version (%d).\n" ,le16_to_cpu (c->recfmt)); req->error_loc = offsetof(struct nvmf_connect_command , recfmt); - status =NVME_SC_CONNECT_FORMAT |NVME_SC_DNR ; + status =NVME_SC_CONNECT_FORMAT |NVME_STATUS_DNR ; goto out; }if (unlikely (d->cntlid !=cpu_to_le16 (0xffff ))) {pr_warn ("connect attempt for invalid controller ID %#x\n" , d->cntlid); - status =NVME_SC_CONNECT_INVALID_PARAM |NVME_SC_DNR ; + status =NVME_SC_CONNECT_INVALID_PARAM |NVME_STATUS_DNR ; req->cqe->result.u32 =IPO_IATTR_CONNECT_DATA (cntlid); goto out; }
@@ -257,7 +257,7 @@ static void nvmet_execute_admin_connect(struct nvmet_req *req) dhchap_status);nvmet_ctrl_put (ctrl);if (dhchap_status ==NVME_AUTH_DHCHAP_FAILURE_FAILED ) - status = (NVME_SC_CONNECT_INVALID_HOST |NVME_SC_DNR ); + status = (NVME_SC_CONNECT_INVALID_HOST |NVME_STATUS_DNR );else status =NVME_SC_INTERNAL ; goto out;
@@ -305,7 +305,7 @@ static void nvmet_execute_io_connect(struct nvmet_req *req)if (c->recfmt !=0 ) {pr_warn ("invalid connect version (%d).\n" ,le16_to_cpu (c->recfmt)); - status =NVME_SC_CONNECT_FORMAT |NVME_SC_DNR ; + status =NVME_SC_CONNECT_FORMAT |NVME_STATUS_DNR ; goto out; }
@@ -314,13 +314,13 @@ static void nvmet_execute_io_connect(struct nvmet_req *req) ctrl =nvmet_ctrl_find_get (d->subsysnqn, d->hostnqn,le16_to_cpu (d->cntlid), req);if (!ctrl) { - status =NVME_SC_CONNECT_INVALID_PARAM |NVME_SC_DNR ; + status =NVME_SC_CONNECT_INVALID_PARAM |NVME_STATUS_DNR ; goto out; }if (unlikely (qid > ctrl->subsys->max_qid)) {pr_warn ("invalid queue id (%d)\n" , qid); - status =NVME_SC_CONNECT_INVALID_PARAM |NVME_SC_DNR ; + status =NVME_SC_CONNECT_INVALID_PARAM |NVME_STATUS_DNR ; req->cqe->result.u32 =IPO_IATTR_CONNECT_SQE (qid); goto out_ctrl_put; }
@@ -350,13 +350,13 @@ u16 nvmet_parse_connect_cmd(struct nvmet_req *req)pr_debug ("invalid command 0x%x on unconnected queue.\n" , cmd->fabrics.opcode); req->error_loc = offsetof(struct nvme_common_command , opcode); -return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; +return NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ; }if (cmd->fabrics.fctype != nvme_fabrics_type_connect) {pr_debug ("invalid capsule type 0x%x on unconnected queue.\n" , cmd->fabrics.fctype); req->error_loc = offsetof(struct nvmf_common_command , fctype); -return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; +return NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ; }if (cmd->connect.qid ==0 )
drivers/nvme/target/io-cmd-bdev.c +6 -6
@@ -135,11 +135,11 @@ u16 blk_to_nvme_status(struct nvmet_req *req, blk_status_t blk_sts)*/ switch (blk_sts) {case BLK_STS_NOSPC : - status =NVME_SC_CAP_EXCEEDED |NVME_SC_DNR ; + status =NVME_SC_CAP_EXCEEDED |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvme_rw_command , length);break ;case BLK_STS_TARGET : - status =NVME_SC_LBA_RANGE |NVME_SC_DNR ; + status =NVME_SC_LBA_RANGE |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvme_rw_command , slba);break ;case BLK_STS_NOTSUPP :
@@ -147,10 +147,10 @@ u16 blk_to_nvme_status(struct nvmet_req *req, blk_status_t blk_sts)switch (req->cmd->common.opcode) {case nvme_cmd_dsm:case nvme_cmd_write_zeroes: - status =NVME_SC_ONCS_NOT_SUPPORTED |NVME_SC_DNR ; + status =NVME_SC_ONCS_NOT_SUPPORTED |NVME_STATUS_DNR ;break ;default : - status =NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; + status =NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ; }break ;case BLK_STS_MEDIUM :
@@ -159,7 +159,7 @@ u16 blk_to_nvme_status(struct nvmet_req *req, blk_status_t blk_sts)break ;case BLK_STS_IOERR :default : - status =NVME_SC_INTERNAL |NVME_SC_DNR ; + status =NVME_SC_INTERNAL |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvme_common_command , opcode); }
@@ -356,7 +356,7 @@ u16 nvmet_bdev_flush(struct nvmet_req *req)return 0 ;if (blkdev_issue_flush (req->ns->bdev)) -return NVME_SC_INTERNAL |NVME_SC_DNR ; +return NVME_SC_INTERNAL |NVME_STATUS_DNR ;return 0 ; }
drivers/nvme/target/passthru.c +5 -5
@@ -306,7 +306,7 @@ static void nvmet_passthru_execute_cmd(struct nvmet_req *req) ns =nvme_find_get_ns (ctrl, nsid);if (unlikely (!ns)) {pr_err ("failed to get passthru ns nsid:%u\n" , nsid); - status =NVME_SC_INVALID_NS |NVME_SC_DNR ; + status =NVME_SC_INVALID_NS |NVME_STATUS_DNR ; goto out; }
@@ -426,7 +426,7 @@ u16 nvmet_parse_passthru_io_cmd(struct nvmet_req *req)* emulated in the future if regular targets grow support for * this feature. */ -return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; +return NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ; }return nvmet_setup_passthru_command (req);
@@ -478,7 +478,7 @@ static u16 nvmet_passthru_get_set_features(struct nvmet_req *req)case NVME_FEAT_RESV_PERSIST :/* No reservations, see nvmet_parse_passthru_io_cmd() */ default : -return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; +return NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ; } }
@@ -546,7 +546,7 @@ u16 nvmet_parse_passthru_admin_cmd(struct nvmet_req *req) req->p.use_workqueue = true;return NVME_SC_SUCCESS ; } -return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; +return NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ;case NVME_ID_CNS_NS : req->execute = nvmet_passthru_execute_cmd; req->p.use_workqueue = true;
@@ -558,7 +558,7 @@ u16 nvmet_parse_passthru_admin_cmd(struct nvmet_req *req) req->p.use_workqueue = true;return NVME_SC_SUCCESS ; } -return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ; +return NVME_SC_INVALID_OPCODE |NVME_STATUS_DNR ;default :return nvmet_setup_passthru_command (req); }
drivers/nvme/target/rdma.c +5 -5
@@ -852,12 +852,12 @@ static u16 nvmet_rdma_map_sgl_inline(struct nvmet_rdma_rsp *rsp)if (!nvme_is_write (rsp->req.cmd)) { rsp->req.error_loc = offsetof(struct nvme_common_command , opcode); -return NVME_SC_INVALID_FIELD |NVME_SC_DNR ; +return NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; }if (off + len > rsp->queue->dev->inline_data_size) {pr_err ("invalid inline data offset!\n" ); -return NVME_SC_SGL_INVALID_OFFSET |NVME_SC_DNR ; +return NVME_SC_SGL_INVALID_OFFSET |NVME_STATUS_DNR ; }/* no data command? */
@@ -919,7 +919,7 @@ static u16 nvmet_rdma_map_sgl(struct nvmet_rdma_rsp *rsp)pr_err ("invalid SGL subtype: %#x\n" , sgl->type); rsp->req.error_loc = offsetof(struct nvme_common_command , dptr); -return NVME_SC_INVALID_FIELD |NVME_SC_DNR ; +return NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; }case NVME_KEY_SGL_FMT_DATA_DESC :switch (sgl->type &0xf ) {
@@ -931,12 +931,12 @@ static u16 nvmet_rdma_map_sgl(struct nvmet_rdma_rsp *rsp)pr_err ("invalid SGL subtype: %#x\n" , sgl->type); rsp->req.error_loc = offsetof(struct nvme_common_command , dptr); -return NVME_SC_INVALID_FIELD |NVME_SC_DNR ; +return NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; }default :pr_err ("invalid SGL type: %#x\n" , sgl->type); rsp->req.error_loc = offsetof(struct nvme_common_command , dptr); -return NVME_SC_SGL_INVALID_TYPE |NVME_SC_DNR ; +return NVME_SC_SGL_INVALID_TYPE |NVME_STATUS_DNR ; } }
drivers/nvme/target/tcp.c +2 -2
@@ -416,10 +416,10 @@ static int nvmet_tcp_map_data(struct nvmet_tcp_cmd *cmd)if (sgl->type == ((NVME_SGL_FMT_DATA_DESC <<4 ) |NVME_SGL_FMT_OFFSET )) {if (!nvme_is_write (cmd->req.cmd)) -return NVME_SC_INVALID_FIELD |NVME_SC_DNR ; +return NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ;if (len > cmd->req.port->inline_data_size) -return NVME_SC_SGL_INVALID_OFFSET |NVME_SC_DNR ; +return NVME_SC_SGL_INVALID_OFFSET |NVME_STATUS_DNR ; cmd->pdu_len = len; } cmd->req.transfer_len += len;
drivers/nvme/target/zns.c +15 -15
@@ -100,7 +100,7 @@ void nvmet_execute_identify_ns_zns(struct nvmet_req *req)if (le32_to_cpu (req->cmd->identify.nsid) ==NVME_NSID_ALL ) { req->error_loc = offsetof(struct nvme_identify , nsid); - status =NVME_SC_INVALID_NS |NVME_SC_DNR ; + status =NVME_SC_INVALID_NS |NVME_STATUS_DNR ; goto out; }
@@ -121,7 +121,7 @@ void nvmet_execute_identify_ns_zns(struct nvmet_req *req) }if (!bdev_is_zoned (req->ns->bdev)) { - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; req->error_loc = offsetof(struct nvme_identify , nsid); goto out; }
@@ -158,17 +158,17 @@ static u16 nvmet_bdev_validate_zone_mgmt_recv(struct nvmet_req *req)if (sect >=get_capacity (req->ns->bdev->bd_disk)) { req->error_loc = offsetof(struct nvme_zone_mgmt_recv_cmd , slba); -return NVME_SC_LBA_RANGE |NVME_SC_DNR ; +return NVME_SC_LBA_RANGE |NVME_STATUS_DNR ; }if (out_bufsize <sizeof (struct nvme_zone_report )) { req->error_loc = offsetof(struct nvme_zone_mgmt_recv_cmd , numd); -return NVME_SC_INVALID_FIELD |NVME_SC_DNR ; +return NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; }if (req->cmd->zmr.zra !=NVME_ZRA_ZONE_REPORT ) { req->error_loc = offsetof(struct nvme_zone_mgmt_recv_cmd , zra); -return NVME_SC_INVALID_FIELD |NVME_SC_DNR ; +return NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; }switch (req->cmd->zmr.pr) {
@@ -177,7 +177,7 @@ static u16 nvmet_bdev_validate_zone_mgmt_recv(struct nvmet_req *req)break ;default : req->error_loc = offsetof(struct nvme_zone_mgmt_recv_cmd , pr); -return NVME_SC_INVALID_FIELD |NVME_SC_DNR ; +return NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; }switch (req->cmd->zmr.zrasf) {
@@ -193,7 +193,7 @@ static u16 nvmet_bdev_validate_zone_mgmt_recv(struct nvmet_req *req)default : req->error_loc = offsetof(struct nvme_zone_mgmt_recv_cmd , zrasf); -return NVME_SC_INVALID_FIELD |NVME_SC_DNR ; +return NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; }return NVME_SC_SUCCESS ;
@@ -341,7 +341,7 @@ static u16 blkdev_zone_mgmt_errno_to_nvme_status(int ret)return NVME_SC_SUCCESS ;case -EINVAL :case -EIO : -return NVME_SC_ZONE_INVALID_TRANSITION |NVME_SC_DNR ; +return NVME_SC_ZONE_INVALID_TRANSITION |NVME_STATUS_DNR ;default :return NVME_SC_INTERNAL ; }
@@ -463,7 +463,7 @@ static u16 nvmet_bdev_execute_zmgmt_send_all(struct nvmet_req *req)default :/* this is needed to quiet compiler warning */ req->error_loc = offsetof(struct nvme_zone_mgmt_send_cmd , zsa); -return NVME_SC_INVALID_FIELD |NVME_SC_DNR ; +return NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; }return NVME_SC_SUCCESS ;
@@ -481,7 +481,7 @@ static void nvmet_bdev_zmgmt_send_work(struct work_struct *w)if (op ==REQ_OP_LAST ) { req->error_loc = offsetof(struct nvme_zone_mgmt_send_cmd , zsa); - status =NVME_SC_ZONE_INVALID_TRANSITION |NVME_SC_DNR ; + status =NVME_SC_ZONE_INVALID_TRANSITION |NVME_STATUS_DNR ; goto out; }
@@ -493,13 +493,13 @@ static void nvmet_bdev_zmgmt_send_work(struct work_struct *w)if (sect >=get_capacity (bdev->bd_disk)) { req->error_loc = offsetof(struct nvme_zone_mgmt_send_cmd , slba); - status =NVME_SC_LBA_RANGE |NVME_SC_DNR ; + status =NVME_SC_LBA_RANGE |NVME_STATUS_DNR ; goto out; }if (sect & (zone_sectors -1 )) { req->error_loc = offsetof(struct nvme_zone_mgmt_send_cmd , slba); - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; goto out; }
@@ -551,13 +551,13 @@ void nvmet_bdev_execute_zone_append(struct nvmet_req *req)if (sect >=get_capacity (req->ns->bdev->bd_disk)) { req->error_loc = offsetof(struct nvme_rw_command , slba); - status =NVME_SC_LBA_RANGE |NVME_SC_DNR ; + status =NVME_SC_LBA_RANGE |NVME_STATUS_DNR ; goto out; }if (sect & (bdev_zone_sectors (req->ns->bdev) -1 )) { req->error_loc = offsetof(struct nvme_rw_command , slba); - status =NVME_SC_INVALID_FIELD |NVME_SC_DNR ; + status =NVME_SC_INVALID_FIELD |NVME_STATUS_DNR ; goto out; }
@@ -590,7 +590,7 @@ void nvmet_bdev_execute_zone_append(struct nvmet_req *req) }if (total_len !=nvmet_rw_data_len (req)) { - status =NVME_SC_INTERNAL |NVME_SC_DNR ; + status =NVME_SC_INTERNAL |NVME_STATUS_DNR ; goto out_put_bio; }
include/linux/nvme.h +3 -3
@@ -1996,9 +1996,9 @@ enum {NVME_SCT_MASK =0x0700 ,/* Status Code Type */ NVME_SCT_SC_MASK =NVME_SCT_MASK |NVME_SC_MASK , -NVME_SC_CRD =0x1800 ,/* Command Retry Delayed */ -NVME_SC_MORE =0x2000 , - NVME_SC_DNR = 0x4000, /* Do Not Retry */ +NVME_STATUS_CRD =0x1800 ,/* Command Retry Delayed */ +NVME_STATUS_MORE =0x2000 , + NVME_STATUS_DNR = 0x4000, /* Do Not Retry */ };#define NVME_SCT (status) ((status) >> 8 & 7)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 368/375 nvmet: Identify-Active Namespace ID List command should reject invalid nsid
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maurizio Lombardi <[email protected]>
[ Upstream commit 899d2e5a4e3d36689e8938e152f4b69a4bcc6b4d ]
nsid values of 0xFFFFFFFE and 0XFFFFFFFF should be rejected with a status code of "Invalid Namespace or Format".
See NVMe Base Specification, Active Namespace ID list (CNS 02h).
--- drivers/nvme/target/admin-cmd.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/nvme/target/admin-cmd.c +10 -0
@@ -587,6 +587,16 @@ static void nvmet_execute_identify_nslist(struct nvmet_req *req)u16 status =0 ;int i =0 ; +/* +* NSID values 0xFFFFFFFE and NVME_NSID_ALL are invalid +* See NVMe Base Specification, Active Namespace ID list (CNS 02h). +*/ +if (min_nsid ==0xFFFFFFFE || min_nsid ==NVME_NSID_ALL ) { + req->error_loc = offsetof(struct nvme_identify , nsid); + status =NVME_SC_INVALID_NS |NVME_STATUS_DNR ; + goto out; + } + list =kzalloc (buf_size,GFP_KERNEL );if (!list) { status =NVME_SC_INTERNAL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 369/375 ublk_drv: fix NULL pointer dereference in ublk_ctrl_start_recovery()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Nan <[email protected]>
[ Upstream commit e58f5142f88320a5b1449f96a146f2f24615c5c7 ]
When two UBLK_CMD_START_USER_RECOVERY commands are submitted, the first one sets 'ubq->ubq_daemon' to NULL, and the second one triggers WARN in ublk_queue_reinit() and subsequently a NULL pointer dereference issue.
Fix it by adding the check in ublk_ctrl_start_recovery() and return immediately in case of zero 'ub->nr_queues_ready'.
BUG: kernel NULL pointer dereference, address: 0000000000000028 RIP: 0010:ublk_ctrl_start_recovery.constprop.0+0x82/0x180 Call Trace: <TASK> ? __die+0x20/0x70 ? page_fault_oops+0x75/0x170 ? exc_page_fault+0x64/0x140 ? asm_exc_page_fault+0x22/0x30 ? ublk_ctrl_start_recovery.constprop.0+0x82/0x180 ublk_ctrl_uring_cmd+0x4f7/0x6c0 ? pick_next_task_idle+0x26/0x40 io_uring_cmd+0x9a/0x1b0 io_issue_sqe+0x193/0x3f0 io_wq_submit_work+0x9b/0x390 io_worker_handle_work+0x165/0x360 io_wq_worker+0xcb/0x2f0 ? finish_task_switch.isra.0+0x203/0x290 ? finish_task_switch.isra.0+0x203/0x290 ? __pfx_io_wq_worker+0x10/0x10 ret_from_fork+0x2d/0x50 ? __pfx_io_wq_worker+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK>
--- drivers/block/ublk_drv.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/block/ublk_drv.c +2 -0
@@ -2664,6 +2664,8 @@ static int ublk_ctrl_start_recovery(struct ublk_device *ub,mutex_lock (&ub->mutex);if (!ublk_can_use_recovery (ub)) goto out_unlock; +if (!ub->nr_queues_ready) + goto out_unlock;/* * START_RECOVERY is only allowd after: *
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 370/375 x86/mm: Fix PTI for i386 some more
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit c48b5a4cf3125adb679e28ef093f66ff81368d05 upstream.
So it turns out that we have to do two passes of pti_clone_entry_text(), once before initcalls, such that device and late initcalls can use user-mode-helper / modprobe and once after free_initmem() / mark_readonly().
Now obviously mark_readonly() can cause PMD splits, and pti_clone_pgtable() doesn't like that much.
Allow the late clone to split PMDs so that pagetables stay in sync.
--- arch/x86/mm/pti.c | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-)
arch/x86/mm/pti.c +29 -16
@@ -241,7 +241,7 @@ static pmd_t *pti_user_pagetable_walk_pm* * Returns a pointer to a PTE on success, or NULL on failure. */ -static pte_t *pti_user_pagetable_walk_pte (unsigned long address) +static pte_t *pti_user_pagetable_walk_pte (unsigned long address,bool late_text) {gfp_t gfp = (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO);pmd_t *pmd;
@@ -251,10 +251,15 @@ static pte_t *pti_user_pagetable_walk_ptif (!pmd)return NULL ; -/* We can't do anything sensible if we hit a large mapping. */ +/* Large PMD mapping found */ if (pmd_leaf (*pmd)) { -WARN_ON (1 ); -return NULL ; +/* Clear the PMD if we hit a large mapping from the first round */ +if (late_text) { +set_pmd (pmd,__pmd (0 )); + }else { +WARN_ON_ONCE (1 ); +return NULL ; + } }if (pmd_none (*pmd)) {
@@ -283,7 +288,7 @@ static void __init pti_setup_vsyscall(voif (!pte ||WARN_ON (level !=PG_LEVEL_4K ) ||pte_none (*pte))return ; - target_pte =pti_user_pagetable_walk_pte (VSYSCALL_ADDR ); + target_pte =pti_user_pagetable_walk_pte (VSYSCALL_ADDR , false);if (WARN_ON (!target_pte))return ;
@@ -301,7 +306,7 @@ enum pti_clone_level {static void pti_clone_pgtable (unsigned long start,unsigned long end, -enum pti_clone_level level) +enum pti_clone_level level,bool late_text) {unsigned long addr;
@@ -390,7 +395,7 @@ pti_clone_pgtable(unsigned long start, ureturn ;/* Allocate PTE in the user page-table */ - target_pte =pti_user_pagetable_walk_pte (addr); + target_pte =pti_user_pagetable_walk_pte (addr, late_text);if (WARN_ON (!target_pte))return ;
@@ -452,7 +457,7 @@ static void __init pti_clone_user_sharedphys_addr_t pa =per_cpu_ptr_to_phys ((void *)va);pte_t *target_pte; - target_pte =pti_user_pagetable_walk_pte (va); + target_pte =pti_user_pagetable_walk_pte (va, false);if (WARN_ON (!target_pte))return ;
@@ -475,7 +480,7 @@ static void __init pti_clone_user_shared start =CPU_ENTRY_AREA_BASE ; end = start + (PAGE_SIZE *CPU_ENTRY_AREA_PAGES ); - pti_clone_pgtable(start, end, PTI_CLONE_PMD); + pti_clone_pgtable(start, end, PTI_CLONE_PMD, false); }#endif /* CONFIG_X86_64 */
@@ -492,11 +497,11 @@ static void __init pti_setup_espfix64(vo/* * Clone the populated PMDs of the entry text and force it RO. */ -static void pti_clone_entry_text (void ) +static void pti_clone_entry_text (bool late) {pti_clone_pgtable ((unsigned long ) __entry_text_start, (unsigned long ) __entry_text_end, -PTI_LEVEL_KERNEL_IMAGE ); +PTI_LEVEL_KERNEL_IMAGE , late); }/*
@@ -571,7 +576,7 @@ static void pti_clone_kernel_text(void)* pti_set_kernel_image_nonglobal() did to clear the * global bit. */ -pti_clone_pgtable (start, end_clone,PTI_LEVEL_KERNEL_IMAGE ); +pti_clone_pgtable (start, end_clone,PTI_LEVEL_KERNEL_IMAGE , false);/* * pti_clone_pgtable() will set the global bit in any PMDs
@@ -638,8 +643,15 @@ void __init pti_init(void)/* Undo all global bits from the init pagetables in head_64.S: */ pti_set_kernel_image_nonglobal (); +/* Replace some of the global bits just for shared entry text: */ -pti_clone_entry_text (); +/* +* This is very early in boot. Device and Late initcalls can do +* modprobe before free_initmem() and mark_readonly(). This +* pti_clone_entry_text() allows those user-mode-helpers to function, +* but notably the text is still RW. +*/ +pti_clone_entry_text (false);pti_setup_espfix64 ();pti_setup_vsyscall (); }
@@ -656,10 +668,11 @@ void pti_finalize(void)if (!boot_cpu_has (X86_FEATURE_PTI ))return ;/* -* We need to clone everything (again) that maps parts of the -* kernel image. +* This is after free_initmem() (all initcalls are done) and we've done +* mark_readonly(). Text is now NX which might've split some PMDs +* relative to the early clone. */ -pti_clone_entry_text (); +pti_clone_entry_text (true);pti_clone_kernel_text ();debug_checkwx_user ();
Greg Kroah-Hartman
maintainerPATCH 371/375 drm/i915/display: Add mechanism to use sink model when applying quirk
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jouni Högander <[email protected]>
commit 43cf50eb1408ccb99cab01521263e8cb4cfdc023 upstream.
Currently there is no way to apply quirk on device only if certain panel model is installed. This patch implements such mechanism by adding new quirk type intel_dpcd_quirk which contains also sink_oui and sink_device_id fields and using also them to figure out if applying quirk is needed.
New intel_init_dpcd_quirks is added and called after drm_dp_read_desc with proper sink device identity read from dpcdc.
v3:
- !mem_is_zero fixed to mem_is_zero
v2:
- instead of using struct intel_quirk add new struct intel_dpcd_quirk
--- drivers/gpu/drm/i915/display/intel_display_types.h | 4 + drivers/gpu/drm/i915/display/intel_dp.c | 4 + drivers/gpu/drm/i915/display/intel_quirks.c | 51 +++++++++++++++++++++ drivers/gpu/drm/i915/display/intel_quirks.h | 5 ++ 4 files changed, 64 insertions(+)
drivers/gpu/drm/i915/display/intel_display_types.h +4 -0
@@ -1840,6 +1840,10 @@ struct intel_dp {unsigned long last_oui_write;bool colorimetry_support; + +struct { +unsigned long mask; + } quirks; };enum lspcon_vendor {
drivers/gpu/drm/i915/display/intel_dp.c +4 -0
@@ -79,6 +79,7 @@#include "intel_pch_display.h" #include "intel_pps.h" #include "intel_psr.h" +#include "intel_quirks.h" #include "intel_tc.h" #include "intel_vdsc.h" #include "intel_vrr.h"
@@ -3941,6 +3942,7 @@ intel_edp_init_dpcd(struct intel_dp *intdrm_dp_read_desc (&intel_dp->aux, &intel_dp->desc,drm_dp_is_branch (intel_dp->dpcd)); +intel_init_dpcd_quirks (intel_dp, &intel_dp->desc.ident);/* * Read the eDP display control registers.
@@ -4053,6 +4055,8 @@ intel_dp_get_dpcd(struct intel_dp *inteldrm_dp_read_desc (&intel_dp->aux, &intel_dp->desc,drm_dp_is_branch (intel_dp->dpcd)); +intel_init_dpcd_quirks (intel_dp, &intel_dp->desc.ident); +intel_dp_update_sink_caps (intel_dp); }
drivers/gpu/drm/i915/display/intel_quirks.c +51 -0
76 lines not on this page · raw message
drivers/gpu/drm/i915/display/intel_quirks.h +5 -0
@@ -9,6 +9,8 @@#include <linux/types.h> struct intel_display ; +struct intel_dp ; +struct drm_dp_dpcd_ident ;enum intel_quirk_id {QUIRK_BACKLIGHT_PRESENT ,
@@ -20,6 +22,9 @@ enum intel_quirk_id { };void intel_init_quirks (struct intel_display *display); +void intel_init_dpcd_quirks (struct intel_dp *intel_dp, +const struct drm_dp_dpcd_ident *ident);bool intel_has_quirk (struct intel_display *display,enum intel_quirk_id quirk); +bool intel_has_dpcd_quirk (struct intel_dp *intel_dp,enum intel_quirk_id quirk);#endif /* __INTEL_QUIRKS_H__ */
Greg Kroah-Hartman
maintainerPATCH 372/375 drm/i915/display: Increase Fast Wake Sync length as a quirk
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jouni Högander <[email protected]>
commit a13494de53258d8cf82ed3bcd69176bbf7f2640e upstream.
In commit "drm/i915/display: Increase number of fast wake precharge pulses" we were increasing Fast Wake sync pulse length to fix problems observed on Dell Precision 5490 laptop with AUO panel. Later we have observed this is causing problems on other panels.
Fix these problems by increasing Fast Wake sync pulse length as a quirk applied for Dell Precision 5490 with problematic panel.
Requires: 43cf50eb1408 ("drm/i915/display: Add mechanism to use sink model when applying quirk")
--- drivers/gpu/drm/i915/display/intel_dp_aux.c | 16 +++++++++++----- drivers/gpu/drm/i915/display/intel_dp_aux.h | 2 +- drivers/gpu/drm/i915/display/intel_psr.c | 2 +- drivers/gpu/drm/i915/display/intel_quirks.c | 19 ++++++++++++++++++- drivers/gpu/drm/i915/display/intel_quirks.h | 1 + 5 files changed, 32 insertions(+), 8 deletions(-)
drivers/gpu/drm/i915/display/intel_dp_aux.c +11 -5
@@ -13,6 +13,7 @@#include "intel_dp_aux.h" #include "intel_dp_aux_regs.h" #include "intel_pps.h" +#include "intel_quirks.h" #include "intel_tc.h" #define AUX_CH_NAME_BUFSIZE 6
@@ -142,16 +143,21 @@ static int intel_dp_aux_sync_len(void)return precharge + preamble; } -int intel_dp_aux_fw_sync_len (void ) +int intel_dp_aux_fw_sync_len (struct intel_dp *intel_dp) { +int precharge =10 ;/* 10-16 */ +int preamble =8 ; +/* * We faced some glitches on Dell Precision 5490 MTL laptop with panel: * "Manufacturer: AUO, Model: 63898" when using HW default 18. Using 20 * is fixing these problems with the panel. It is still within range -* mentioned in eDP specification. +* mentioned in eDP specification. Increasing Fast Wake sync length is +* causing problems with other panels: increase length as a quirk for +* this specific laptop. */ -int precharge =12 ;/* 10-16 */ -int preamble =8 ; +if (intel_has_dpcd_quirk (intel_dp,QUIRK_FW_SYNC_LEN )) + precharge +=2 ;return precharge + preamble; }
@@ -211,7 +217,7 @@ static u32 skl_get_aux_send_ctl(struct iDP_AUX_CH_CTL_TIME_OUT_MAX |DP_AUX_CH_CTL_RECEIVE_ERROR |DP_AUX_CH_CTL_MESSAGE_SIZE (send_bytes) | -DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL (intel_dp_aux_fw_sync_len ()) | +DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL (intel_dp_aux_fw_sync_len (intel_dp)) |DP_AUX_CH_CTL_SYNC_PULSE_SKL (intel_dp_aux_sync_len ());if (intel_tc_port_in_tbt_alt_mode (dig_port))
drivers/gpu/drm/i915/display/intel_dp_aux.h +1 -1
@@ -20,6 +20,6 @@ enum aux_ch intel_dp_aux_ch(struct intelvoid intel_dp_aux_irq_handler (struct drm_i915_private *i915);u32 intel_dp_aux_pack (const u8 *src,int src_bytes); -int intel_dp_aux_fw_sync_len (void ); +int intel_dp_aux_fw_sync_len (struct intel_dp *intel_dp);#endif /* __INTEL_DP_AUX_H__ */
drivers/gpu/drm/i915/display/intel_psr.c +1 -1
@@ -1356,7 +1356,7 @@ static bool _compute_alpm_params(structint tfw_exit_latency =20 ;/* eDP spec */ int phy_wake =4 ;/* eDP spec */ int preamble =8 ;/* eDP spec */ -int precharge =intel_dp_aux_fw_sync_len () - preamble; +int precharge =intel_dp_aux_fw_sync_len (intel_dp) - preamble;u8 max_wake_lines; io_wake_time = max(precharge, io_buffer_wake_time(crtc_state)) +
drivers/gpu/drm/i915/display/intel_quirks.c +18 -1
@@ -70,6 +70,14 @@ static void quirk_no_pps_backlight_powerdrm_info (display->drm,"Applying no pps backlight power quirk\n" ); } +static void quirk_fw_sync_len (struct intel_dp *intel_dp) +{ +struct intel_display *display =to_intel_display (intel_dp); + +intel_set_dpcd_quirk (intel_dp,QUIRK_FW_SYNC_LEN ); +drm_info (display->drm,"Applying Fast Wake sync pulse count quirk\n" ); +} +struct intel_quirk {int device;int subsystem_vendor;
@@ -224,6 +232,15 @@ static struct intel_quirk intel_quirks[] };static struct intel_dpcd_quirk intel_dpcd_quirks[] = { +/* Dell Precision 5490 */ + { + .device =0x7d55 , + .subsystem_vendor =0x1028 , + .subsystem_device =0x0cc7 , + .sink_oui =SINK_OUI (0x38 ,0xec ,0x11 ), + .hook = quirk_fw_sync_len, + }, + };void intel_init_quirks (struct intel_display *display)
@@ -265,7 +282,7 @@ void intel_init_dpcd_quirks(struct intel !memcmp (q->sink_oui, ident->oui,sizeof (ident->oui)) && (!memcmp (q->sink_device_id, ident->device_id,sizeof (ident->device_id)) || - mem_is_zero(q->sink_device_id, sizeof(q->sink_device_id)))) + !memchr_inv(q->sink_device_id, 0, sizeof(q->sink_device_id)))) q->hook(intel_dp); } }
drivers/gpu/drm/i915/display/intel_quirks.h +1 -0
@@ -19,6 +19,7 @@ enum intel_quirk_id {QUIRK_INVERT_BRIGHTNESS ,QUIRK_LVDS_SSC_DISABLE ,QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK , + QUIRK_FW_SYNC_LEN, };void intel_init_quirks (struct intel_display *display);
Greg Kroah-Hartman
maintainerPATCH 373/375 btrfs: fix race between direct IO write and fsync when using same fd
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit cd9253c23aedd61eb5ff11f37a36247cd46faf86 upstream.
If we have 2 threads that are using the same file descriptor and one of them is doing direct IO writes while the other is doing fsync, we have a race where we can end up either:
1) Attempt a fsync without holding the inode's lock, triggering an assertion failures when assertions are enabled;
2) Do an invalid memory access from the fsync task because the file private points to memory allocated on stack by the direct IO task and it may be used by the fsync task after the stack was destroyed.
The race happens like this:
1) A user space program opens a file descriptor with O_DIRECT;
2) The program spawns 2 threads using libpthread for example;
3) One of the threads uses the file descriptor to do direct IO writes, while the other calls fsync using the same file descriptor.
4) Call task A the thread doing direct IO writes and task B the thread doing fsyncs;
5) Task A does a direct IO write, and at btrfs_direct_write() sets the file's private to an on stack allocated private with the member 'fsync_skip_inode_lock' set to true;
6) Task B enters btrfs_sync_file() and sees that there's a private structure associated to the file which has 'fsync_skip_inode_lock' set to true, so it skips locking the inode's VFS lock;
7) Task A completes the direct IO write, and resets the file's private to NULL since it had no prior private and our private was stack allocated. Then it unlocks the inode's VFS lock;
8) Task B enters btrfs_get_ordered_extents_for_logging(), then the assertion that checks the inode's VFS lock is held fails, since task B never locked it and task A has already unlocked it.
The stack trace produced is the following:
assertion failed: inode_is_locked(&inode->vfs_inode), in fs/btrfs/ordered-data.c:983
------------[ cut here ]------------
kernel BUG at fs/btrfs/ordered-data.c:983!
Oops: invalid opcode: 0000 [#1] PREEMPT SMP PTI
CPU: 9 PID: 5072 Comm: worker Tainted: G U OE 6.10.5-1-default #1 openSUSE Tumbleweed 69f48d427608e1c09e60ea24c6c55e2ca1b049e8
Hardware name: Acer Predator PH315-52/Covini_CFS, BIOS V1.12 07/28/2020
RIP: 0010:btrfs_get_ordered_extents_for_logging.cold+0x1f/0x42 [btrfs]
Code: 50 d6 86 c0 e8 (...)
RSP: 0018:ffff9e4a03dcfc78 EFLAGS: 00010246
RAX: 0000000000000054 RBX: ffff9078a9868e98 RCX: 0000000000000000
RDX: 0000000000000000 RSI: ffff907dce4a7800 RDI: ffff907dce4a7800
RBP: ffff907805518800 R08: 0000000000000000 R09: ffff9e4a03dcfb38
R10: ffff9e4a03dcfb30 R11: 0000000000000003 R12: ffff907684ae7800
R13: 0000000000000001 R14: ffff90774646b600 R15: 0000000000000000
FS: 00007f04b96006c0(0000) GS:ffff907dce480000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f32acbfc000 CR3: 00000001fd4fa005 CR4: 00000000003726f0
Call Trace:
<TASK>
? __die_body.cold+0x14/0x24
? die+0x2e/0x50
? do_trap+0xca/0x110
? do_error_trap+0x6a/0x90
? btrfs_get_ordered_extents_for_logging.cold+0x1f/0x42 [btrfs bb26272d49b4cdc847cf3f7faadd459b62caee9a]
? exc_invalid_op+0x50/0x70
? btrfs_get_ordered_extents_for_logging.cold+0x1f/0x42 [btrfs bb26272d49b4cdc847cf3f7faadd459b62caee9a]
? asm_exc_invalid_op+0x1a/0x20
? btrfs_get_ordered_extents_for_logging.cold+0x1f/0x42 [btrfs bb26272d49b4cdc847cf3f7faadd459b62caee9a]
? btrfs_get_ordered_extents_for_logging.cold+0x1f/0x42 [btrfs bb26272d49b4cdc847cf3f7faadd459b62caee9a]
btrfs_sync_file+0x21a/0x4d0 [btrfs bb26272d49b4cdc847cf3f7faadd459b62caee9a]
? __seccomp_filter+0x31d/0x4f0
__x64_sys_fdatasync+0x4f/0x90
do_syscall_64+0x82/0x160
? do_futex+0xcb/0x190
? __x64_sys_futex+0x10e/0x1d0
? switch_fpu_return+0x4f/0xd0
? syscall_exit_to_user_mode+0x72/0x220
? do_syscall_64+0x8e/0x160
? syscall_exit_to_user_mode+0x72/0x220
? do_syscall_64+0x8e/0x160
? syscall_exit_to_user_mode+0x72/0x220
? do_syscall_64+0x8e/0x160
? syscall_exit_to_user_mode+0x72/0x220
? do_syscall_64+0x8e/0x160
entry_SYSCALL_64_after_hwframe+0x76/0x7eAnother problem here is if task B grabs the private pointer and then uses it after task A has finished, since the private was allocated in the stack of task A, it results in some invalid memory access with a hard to predict result.
This issue, triggering the assertion, was observed with QEMU workloads by two users in the Link tags below.
Fix this by not relying on a file's private to pass information to fsync that it should skip locking the inode and instead pass this information through a special value stored in current->journal_info. This is safe because in the relevant section of the direct IO write path we are not holding a transaction handle, so current->journal_info is NULL.
The following C program triggers the issue:
$ cat repro.c /* Get the O_DIRECT definition. */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <stdint.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <pthread.h>
static int fd;
static ssize_t do_write(int fd, const void *buf, size_t count, off_t offset)
{
while (count > 0) {
ssize_t ret; ret = pwrite(fd, buf, count, offset);
if (ret < 0) {
if (errno == EINTR)
continue;
return ret;
}
count -= ret;
buf += ret;
}
return 0;}
static void *fsync_loop(void *arg)
{
while (1) {
int ret; ret = fsync(fd);
if (ret != 0) {
perror("Fsync failed");
exit(6);
}
}}
int main(int argc, char *argv[])
{
long pagesize;
void *write_buf;
pthread_t fsyncer;
int ret; if (argc != 2) {
fprintf(stderr, "Use: %s <file path>\n", argv[0]);
return 1;
}
fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC | O_DIRECT, 0666);
if (fd == -1) {
perror("Failed to open/create file");
return 1;
}
pagesize = sysconf(_SC_PAGE_SIZE);
if (pagesize == -1) {
perror("Failed to get page size");
return 2;
}
ret = posix_memalign(&write_buf, pagesize, pagesize);
if (ret) {
perror("Failed to allocate buffer");
return 3;
}
ret = pthread_create(&fsyncer, NULL, fsync_loop, NULL);
if (ret != 0) {
fprintf(stderr, "Failed to create writer thread: %d\n", ret);
return 4;
}
while (1) {
ret = do_write(fd, write_buf, pagesize, 0);
if (ret != 0) {
perror("Write failed");
exit(5);
}
}
return 0;}
$ mkfs.btrfs -f /dev/sdi $ mount /dev/sdi /mnt/sdi $ timeout 10 ./repro /mnt/sdi/foo
Usually the race is triggered within less than 1 second. A test case for fstests will follow soon.
--- fs/btrfs/ctree.h | 1 - fs/btrfs/file.c | 25 ++++++++++--------------- fs/btrfs/transaction.h | 6 ++++++ 3 files changed, 16 insertions(+), 16 deletions(-)
fs/btrfs/ctree.h +0 -1
@@ -457,7 +457,6 @@ struct btrfs_file_private {void *filldir_buf;u64 last_index;struct extent_state *llseek_cached_state; -bool fsync_skip_inode_lock; };static inline u32 BTRFS_LEAF_DATA_SIZE (const struct btrfs_fs_info *info)
fs/btrfs/file.c +10 -15
@@ -1558,13 +1558,6 @@ again:if (IS_ERR_OR_NULL (dio)) { ret =PTR_ERR_OR_ZERO (dio); }else { -struct btrfs_file_private stack_private = {0 }; -struct btrfs_file_private *private; -const bool have_private = (file->private_data !=NULL ); - -if (!have_private) - file->private_data = &stack_private; -/* * If we have a synchoronous write, we must make sure the fsync * triggered by the iomap_dio_complete() call below doesn't
@@ -1573,13 +1566,10 @@ again:* partial writes due to the input buffer (or parts of it) not * being already faulted in. */ - private = file->private_data; - private->fsync_skip_inode_lock = true; +ASSERT (current->journal_info ==NULL ); + current->journal_info =BTRFS_TRANS_DIO_WRITE_STUB ; ret =iomap_dio_complete (dio); - private->fsync_skip_inode_lock = false; - -if (!have_private) - file->private_data =NULL ; + current->journal_info =NULL ; }/* No increment (+=) because iomap returns a cumulative value. */
@@ -1811,7 +1801,6 @@ static inline bool skip_inode_logging(co*/ int btrfs_sync_file (struct file *file,loff_t start,loff_t end,int datasync) { -struct btrfs_file_private *private = file->private_data;struct dentry *dentry =file_dentry (file);struct inode *inode =d_inode (dentry);struct btrfs_fs_info *fs_info =inode_to_fs_info (inode);
@@ -1821,7 +1810,13 @@ int btrfs_sync_file(struct file *file, lint ret =0 , err;u64 len;bool full_sync; -const bool skip_ilock = (private ? private->fsync_skip_inode_lock : false); +bool skip_ilock = false; + +if (current->journal_info ==BTRFS_TRANS_DIO_WRITE_STUB ) { + skip_ilock = true; + current->journal_info =NULL ; +lockdep_assert_held (&inode->i_rwsem); + }trace_btrfs_sync_file (file, datasync);
fs/btrfs/transaction.h +6 -0
@@ -27,6 +27,12 @@ struct btrfs_root_item;struct btrfs_root ;struct btrfs_path ; +/* +* Signal that a direct IO write is in progress, to avoid deadlock for sync +* direct IO writes when fsync is called during the direct IO write path. +*/ +#define BTRFS_TRANS_DIO_WRITE_STUB ((void *) 1) +/* Radix-tree tag for roots that are part of the trasaction. */ #define BTRFS_ROOT_TRANS_TAG 0
Greg Kroah-Hartman
maintainerPATCH 374/375 spi: spi-fsl-lpspi: Fix off-by-one in prescale max
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wahren <[email protected]>
commit ff949d981c775332be94be70397ee1df20bc68e5 upstream.
The commit 783bf5d09f86 ("spi: spi-fsl-lpspi: limit PRESCALE bit in TCR register") doesn't implement the prescaler maximum as intended. The maximum allowed value for i.MX93 should be 1 and for i.MX7ULP it should be 7. So this needs also a adjustment of the comparison in the scldiv calculation.
--- drivers/spi/spi-fsl-lpspi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/spi/spi-fsl-lpspi.c +2 -2
@@ -136,7 +136,7 @@ static struct fsl_lpspi_devtype_data imx };static struct fsl_lpspi_devtype_data imx7ulp_lpspi_devtype_data = { - .prescale_max =8 , + .prescale_max =7 , };static const struct of_device_id fsl_lpspi_dt_ids[] = {
@@ -336,7 +336,7 @@ static int fsl_lpspi_set_bitrate(struct div =DIV_ROUND_UP (perclk_rate, config.speed_hz); -for (prescale =0 ; prescale < prescale_max; prescale++) { +for (prescale =0 ; prescale <= prescale_max; prescale++) { scldiv = div / (1 << prescale) -2 ;if (scldiv <256 ) { fsl_lpspi->config.prescale = prescale;
Greg Kroah-Hartman
maintainerPATCH 375/375 LoongArch: Use accessors to page table entries instead of direct dereference
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
commit 4574815abf43e2bf05643e1b3f7a2e5d6df894f0 upstream.
As very well explained in commit 20a004e7b017cce282 ("arm64: mm: Use READ_ONCE/WRITE_ONCE when accessing page tables"), an architecture whose page table walker can modify the PTE in parallel must use READ_ONCE()/ WRITE_ONCE() macro to avoid any compiler transformation.
So apply that to LoongArch which is such an architecture, in order to avoid potential problems.
Similar to commit edf955647269422e ("riscv: Use accessors to page table entries instead of direct dereference").
--- arch/loongarch/include/asm/hugetlb.h | 4 +- arch/loongarch/include/asm/kfence.h | 6 ++-- arch/loongarch/include/asm/pgtable.h | 48 +++++++++++++++++++++-------------- arch/loongarch/kvm/mmu.c | 8 ++--- arch/loongarch/mm/hugetlbpage.c | 6 ++-- arch/loongarch/mm/init.c | 10 +++---- arch/loongarch/mm/kasan_init.c | 10 +++---- arch/loongarch/mm/pgtable.c | 2 - 8 files changed, 52 insertions(+), 42 deletions(-)
arch/loongarch/include/asm/hugetlb.h +2 -2
@@ -34,7 +34,7 @@ static inline pte_t huge_ptep_get_and_cl unsigned long addr, pte_t *ptep) { pte_t clear; -pte_t pte = *ptep; +pte_t pte =ptep_get (ptep);pte_val (clear) = (unsigned long )invalid_pte_table;set_pte_at (mm, addr, ptep, clear);
@@ -65,7 +65,7 @@ static inline int huge_ptep_set_access_f pte_t *ptep, pte_t pte, int dirty) { - int changed = !pte_same(*ptep, pte); + int changed = !pte_same(ptep_get(ptep), pte);if (changed) {set_pte_at (vma->vm_mm, addr, ptep, pte);
arch/loongarch/include/asm/kfence.h +3 -3
@@ -53,13 +53,13 @@ static inline bool kfence_protect_page(u {pte_t *pte =virt_to_kpte (addr); -if (WARN_ON (!pte) ||pte_none (*pte)) +if (WARN_ON (!pte) ||pte_none (ptep_get (pte)))return false;if (protect) -set_pte (pte,__pte (pte_val (*pte) & ~(_PAGE_VALID | _PAGE_PRESENT))); +set_pte (pte,__pte (pte_val (ptep_get (pte)) & ~(_PAGE_VALID | _PAGE_PRESENT)));else -set_pte (pte,__pte (pte_val (*pte) | (_PAGE_VALID | _PAGE_PRESENT))); +set_pte (pte,__pte (pte_val (ptep_get (pte)) | (_PAGE_VALID | _PAGE_PRESENT)));preempt_disable ();local_flush_tlb_one (addr);
arch/loongarch/include/asm/pgtable.h +29 -19
111 lines not on this page · raw message
arch/loongarch/kvm/mmu.c +4 -4
@@ -695,19 +695,19 @@ static int host_pfn_mapping_level(struct* value) and then p*d_offset() walks into the target huge page instead * of the old page table (sees the new value). */ - pgd =READ_ONCE (*pgd_offset (kvm->mm, hva)); + pgd =pgdp_get (pgd_offset (kvm->mm, hva));if (pgd_none (pgd)) goto out; - p4d =READ_ONCE (*p4d_offset (&pgd, hva)); + p4d =p4dp_get (p4d_offset (&pgd, hva));if (p4d_none (p4d) || !p4d_present (p4d)) goto out; - pud =READ_ONCE (*pud_offset (&p4d, hva)); + pud =pudp_get (pud_offset (&p4d, hva));if (pud_none (pud) || !pud_present (pud)) goto out; - pmd =READ_ONCE (*pmd_offset (&pud, hva)); + pmd =pmdp_get (pmd_offset (&pud, hva));if (pmd_none (pmd) || !pmd_present (pmd)) goto out;
arch/loongarch/mm/hugetlbpage.c +3 -3
@@ -39,11 +39,11 @@ pte_t *huge_pte_offset(struct mm_structpmd_t *pmd =NULL ; pgd =pgd_offset (mm, addr); -if (pgd_present (*pgd)) { +if (pgd_present (pgdp_get (pgd))) { p4d =p4d_offset (pgd, addr); -if (p4d_present (*p4d)) { +if (p4d_present (p4dp_get (p4d))) { pud =pud_offset (p4d, addr); -if (pud_present (*pud)) +if (pud_present (pudp_get (pud))) pmd =pmd_offset (pud, addr); } }
arch/loongarch/mm/init.c +5 -5
@@ -141,7 +141,7 @@ void __meminit vmemmap_set_pmd(pmd_t *pmint __meminit vmemmap_check_pmd (pmd_t *pmd,int node,unsigned long addr,unsigned long next) { -int huge =pmd_val (*pmd) & _PAGE_HUGE; +int huge =pmd_val (pmdp_get (pmd)) & _PAGE_HUGE;if (huge)vmemmap_verify ((pte_t *)pmd, node, addr, next);
@@ -173,7 +173,7 @@ pte_t * __init populate_kernel_pte(unsigpud_t *pud;pmd_t *pmd; -if (p4d_none (*p4d)) { +if (p4d_none (p4dp_get (p4d))) { pud =memblock_alloc (PAGE_SIZE ,PAGE_SIZE );if (!pud)panic ("%s: Failed to allocate memory\n" , __func__);
@@ -184,7 +184,7 @@ pte_t * __init populate_kernel_pte(unsig } pud =pud_offset (p4d, addr); -if (pud_none (*pud)) { +if (pud_none (pudp_get (pud))) { pmd =memblock_alloc (PAGE_SIZE ,PAGE_SIZE );if (!pmd)panic ("%s: Failed to allocate memory\n" , __func__);
@@ -195,7 +195,7 @@ pte_t * __init populate_kernel_pte(unsig } pmd =pmd_offset (pud, addr); -if (!pmd_present (*pmd)) { +if (!pmd_present (pmdp_get (pmd))) {pte_t *pte; pte =memblock_alloc (PAGE_SIZE ,PAGE_SIZE );
@@ -216,7 +216,7 @@ void __init __set_fixmap(enum fixed_addrBUG_ON (idx <=FIX_HOLE || idx >= __end_of_fixed_addresses); ptep =populate_kernel_pte (addr); -if (!pte_none (*ptep)) { +if (!pte_none (ptep_get (ptep))) {pte_ERROR (*ptep);return ; }
arch/loongarch/mm/kasan_init.c +5 -5
@@ -105,7 +105,7 @@ static phys_addr_t __init kasan_alloc_zestatic pte_t *__init kasan_pte_offset (pmd_t *pmdp,unsigned long addr,int node,bool early) { -if (__pmd_none (early,READ_ONCE (*pmdp))) { +if (__pmd_none (early,pmdp_get (pmdp))) {phys_addr_t pte_phys = early ?__pa_symbol (kasan_early_shadow_pte) :kasan_alloc_zeroed_page (node);if (!early)
@@ -118,7 +118,7 @@ static pte_t *__init kasan_pte_offset(pmstatic pmd_t *__init kasan_pmd_offset (pud_t *pudp,unsigned long addr,int node,bool early) { -if (__pud_none (early,READ_ONCE (*pudp))) { +if (__pud_none (early,pudp_get (pudp))) {phys_addr_t pmd_phys = early ?__pa_symbol (kasan_early_shadow_pmd) :kasan_alloc_zeroed_page (node);if (!early)
@@ -131,7 +131,7 @@ static pmd_t *__init kasan_pmd_offset(pustatic pud_t *__init kasan_pud_offset (p4d_t *p4dp,unsigned long addr,int node,bool early) { -if (__p4d_none (early,READ_ONCE (*p4dp))) { +if (__p4d_none (early,p4dp_get (p4dp))) {phys_addr_t pud_phys = early ?__pa_symbol (kasan_early_shadow_pud) :kasan_alloc_zeroed_page (node);if (!early)
@@ -154,7 +154,7 @@ static void __init kasan_pte_populate(pm : kasan_alloc_zeroed_page(node); next = addr +PAGE_SIZE ;set_pte (ptep,pfn_pte (__phys_to_pfn (page_phys),PAGE_KERNEL )); - }while (ptep++, addr = next, addr != end &&__pte_none (early,READ_ONCE (*ptep))); + }while (ptep++, addr = next, addr != end &&__pte_none (early,ptep_get (ptep))); } static void __init kasan_pmd_populate(pud_t *pudp, unsigned long addr,
@@ -166,7 +166,7 @@ static void __init kasan_pmd_populate(pudo { next =pmd_addr_end (addr, end);kasan_pte_populate (pmdp, addr, next, node, early); - }while (pmdp++, addr = next, addr != end &&__pmd_none (early,READ_ONCE (*pmdp))); + }while (pmdp++, addr = next, addr != end &&__pmd_none (early,pmdp_get (pmdp))); } static void __init kasan_pud_populate(p4d_t *p4dp, unsigned long addr,
arch/loongarch/mm/pgtable.c +1 -1
@@ -128,7 +128,7 @@ pmd_t mk_pmd(struct page *page, pgprot_tvoid set_pmd_at (struct mm_struct *mm,unsigned long addr,pmd_t *pmdp,pmd_t pmd) { - *pmdp = pmd; +WRITE_ONCE (*pmdp, pmd);flush_tlb_all (); }
Greg Kroah-Hartman wrote...
Quoted 4 lines
This is the start of the stable review cycle for the 6.10.10 release. There are 375 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.
Can confirm again this ends the issues on parisc, thanks to:
Quoted 2 lines
Helge Deller <[email protected]>
parisc: Delay write-protection untilmark_rodata_ro()call
Kind regards,
Christoph (who would like to do more -rc testing, but the time ...)
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.10 release. There are 375 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 Thu, 12 Sep 2024 09:25:22 +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/v6.x/stable-review/patch-6.10.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.10 release. There are 375 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.
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.10 release. There are 375 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 Thu, 12 Sep 2024 09:25:22 +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/v6.x/stable-review/patch-6.10.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.10 release. There are 375 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 Thu, 12 Sep 2024 09:25:22 +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/v6.x/stable-review/patch-6.10.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
NOTE:
------
The Following crash noticed on arm64 Qualcomm Dragonboard-845c board while booting. I am trying to reproduce this issue and have not been successful yet.
Crash log few lines,
---
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000040 pc : genpd_runtime_suspend+0x30/0x2b0 lr : __rpm_callback+0x50/0x1f0
Links,
- https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.10.y/build/v6.10.9-376-g8f68b409002f/testrun/25108009/suite/log-parser-test/test/check-kernel-oops-oops-preempt-smp/log
- https://lkft.validation.linaro.org/scheduler/job/7854632#L5549
- https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.10.y/build/v6.10.9-376-g8f68b409002f/testrun/25108009/suite/log-parser-test/tests/
## Build
* kernel: 6.10.10-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git commit: 8f68b409002f98fb08f212066a88c4b6872799de
* git describe: v6.10.9-376-g8f68b409002f
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.10.y/build/v6.10.9-376-g8f68b409002f
## Test Regressions (compared to v6.10.8-184-g1f09204bb539)
## Metric Regressions (compared to v6.10.8-184-g1f09204bb539)
## Test Fixes (compared to v6.10.8-184-g1f09204bb539)
## Metric Fixes (compared to v6.10.8-184-g1f09204bb539)
## Test result summary
total: 241491, pass: 212928, fail: 1906, skip: 26158, xfail: 499
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 131 total, 129 passed, 2 failed
* arm64: 43 total, 43 passed, 0 failed
* i386: 28 total, 26 passed, 2 failed
* mips: 26 total, 25 passed, 1 failed
* parisc: 4 total, 3 passed, 1 failed
* powerpc: 36 total, 35 passed, 1 failed
* riscv: 12 total, 11 passed, 1 failed
* s390: 14 total, 13 passed, 1 failed
* sh: 10 total, 10 passed, 0 failed
* sparc: 7 total, 6 passed, 1 failed
* x86_64: 35 total, 35 passed, 0 failed
## Test suites summary
* boot
* commands
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-efivarfs
* kselftest-exec
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-filesystems-epoll
* kselftest-firmware
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-kcmp
* kselftest-kvm
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-mincore
* kselftest-mqueue
* kselftest-net
* kselftest-net-mptcp
* kselftest-openat2
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-rust
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-tc-testing
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user_events
* kselftest-vDSO
* kselftest-x86
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-hugetlb
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* perf
* rcutorture
--
Linaro LKFT
https://lkft.linaro.org
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.10 release. There are 375 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 Thu, 12 Sep 2024 09:25:22 +0000. Anything received after that time might be too late.
Tested on a ThinkPad E14 Gen 3 with a AMD Ryzen 5 5500U CPU and on the Steam Deck (LCD varian).
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.10 release. There are 375 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 Thu, 12 Sep 2024 09:25:22 +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/v6.x/stable-review/patch-6.10.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
Tested rc1 against the Fedora build system (aarch64, ppc64le, s390x, x86_64), and boot tested x86_64. No regressions noted.
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 6.10.10 release. There are 375 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-6.10.y
6.6, 5.15, 5.4 pass our testing, too:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-6.6.y
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-5.15.y
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-5.4.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Erika Unter HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.10 release. There are 375 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 Thu, 12 Sep 2024 09:25:22 +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/v6.x/stable-review/patch-6.10.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Jon Hunter
maintainerQuoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.10 release. There are 375 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 Thu, 12 Sep 2024 09:25:22 +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/v6.x/stable-review/patch-6.10.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
Failures detected for Tegra ...
Test results for stable-v6.10:
10 builds: 7 pass, 3 fail
20 boots: 20 pass, 0 fail
98 tests: 98 pass, 0 failLinux version: 6.10.10-rc1-g8f68b409002f
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-a04Builds failed: arm+multi_v7
Jon
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.10 release. There are 375 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 Thu, 12 Sep 2024 09:25:22 +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/v6.x/stable-review/patch-6.10.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
https://github.com/AOSC-Dev/aosc-os-abbs/pull/7962
Signature · 2 lines
Best Regards, Kexy Biscuit