6.1.7-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainerPATCH 142/183 drm/vmwgfx: Refactor resource managers hashtable to use linux/hashtable implementation.
In reply to Greg Kroah-HartmanFrom: Maaz Mombasawala <[email protected]>
[ Upstream commit 43531dc661b7fb6be249c023bf25847b38215545 ]
Vmwgfx's hashtab implementation needs to be replaced with linux/hashtable to reduce maintenance burden.
Refactor cmdbuf resource manager to use linux/hashtable.h implementation as part of this effort.
Stable-dep-of: a309c7194e8a ("drm/vmwgfx: Remove rcu locks from user resources")
--- drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c | 62 +++++++++------------- 1 file changed, 26 insertions(+), 36 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c +26 -36
@@ -1,7 +1,7 @@// SPDX-License-Identifier: GPL-2.0 OR MIT /************************************************************************** * -* Copyright 2014-2015 VMware, Inc., Palo Alto, CA., USA +* Copyright 2014-2022 VMware, Inc., Palo Alto, CA., USA * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the
@@ -28,6 +28,8 @@#include "vmwgfx_drv.h" #include "vmwgfx_resource_priv.h" +#include <linux/hashtable.h> +#define VMW_CMDBUF_RES_MAN_HT_ORDER 12/**
@@ -59,7 +61,7 @@ struct vmw_cmdbuf_res {* @resources and @list are protected by the cmdbuf mutex for now. */ struct vmw_cmdbuf_res_manager { -struct vmwgfx_open_hash resources; + DECLARE_HASHTABLE(resources, VMW_CMDBUF_RES_MAN_HT_ORDER);struct list_head list;struct vmw_private *dev_priv; };
@@ -82,14 +84,13 @@ vmw_cmdbuf_res_lookup(struct vmw_cmdbuf_res_manager *man, u32 user_key) {struct vmwgfx_hash_item *hash; -int ret;unsigned long key = user_key | (res_type <<24 ); - ret =vmwgfx_ht_find_item (&man->resources, key, &hash); -if (unlikely (ret !=0 )) -return ERR_PTR (ret); - - return drm_hash_entry(hash, struct vmw_cmdbuf_res, hash)->res; +hash_for_each_possible_rcu (man->resources, hash, head, key) { +if (hash->key == key) + return drm_hash_entry(hash, struct vmw_cmdbuf_res, hash)->res; + } +return ERR_PTR (-EINVAL ); }/**
@@ -105,7 +106,7 @@ static void vmw_cmdbuf_res_free(struct vmw_cmdbuf_res_manager *man, struct vmw_cmdbuf_res *entry) {list_del (&entry->head); -WARN_ON (vmwgfx_ht_remove_item (&man->resources, &entry->hash)); +hash_del_rcu (&entry->hash.head);vmw_resource_unreference (&entry->res);kfree (entry); }
@@ -159,7 +160,6 @@ void vmw_cmdbuf_res_commit(struct list_head *list)void vmw_cmdbuf_res_revert (struct list_head *list) {struct vmw_cmdbuf_res *entry, *next; -int ret;list_for_each_entry_safe (entry, next, list, head) {switch (entry->state) {
@@ -167,8 +167,8 @@ void vmw_cmdbuf_res_revert(struct list_head *list)vmw_cmdbuf_res_free (entry->man, entry);break ;case VMW_CMDBUF_RES_DEL : - ret =vmwgfx_ht_insert_item (&entry->man->resources, &entry->hash); -BUG_ON (ret); +hash_add_rcu (entry->man->resources, &entry->hash.head, + entry->hash.key);list_move_tail (&entry->head, &entry->man->list); entry->state =VMW_CMDBUF_RES_COMMITTED ;break ;
@@ -199,26 +199,20 @@ int vmw_cmdbuf_res_add(struct vmw_cmdbuf_res_manager *man, struct list_head *list) {struct vmw_cmdbuf_res *cres; -int ret; cres =kzalloc (sizeof (*cres),GFP_KERNEL );if (unlikely (!cres))return -ENOMEM ; cres->hash.key = user_key | (res_type <<24 ); - ret =vmwgfx_ht_insert_item (&man->resources, &cres->hash); -if (unlikely (ret !=0 )) { -kfree (cres); - goto out_invalid_key; - } +hash_add_rcu (man->resources, &cres->hash.head, cres->hash.key); cres->state =VMW_CMDBUF_RES_ADD ; cres->res =vmw_resource_reference (res); cres->man = man;list_add_tail (&cres->head, list); -out_invalid_key: -return ret; +return 0 ; }/**
@@ -243,24 +237,26 @@ int vmw_cmdbuf_res_remove(struct vmw_cmdbuf_res_manager *man,struct list_head *list, struct vmw_resource **res_p) { - struct vmw_cmdbuf_res *entry; + struct vmw_cmdbuf_res *entry = NULL;struct vmwgfx_hash_item *hash; -int ret; +unsigned long key = user_key | (res_type <<24 ); - ret =vmwgfx_ht_find_item (&man->resources, user_key | (res_type <<24 ), - &hash); -if (likely (ret !=0 )) +hash_for_each_possible_rcu (man->resources, hash, head, key) { +if (hash->key == key) { + entry = drm_hash_entry(hash, struct vmw_cmdbuf_res, hash); +break ; + } + } +if (unlikely (!entry))return -EINVAL ; - entry = drm_hash_entry(hash, struct vmw_cmdbuf_res, hash); -switch (entry->state) {case VMW_CMDBUF_RES_ADD :vmw_cmdbuf_res_free (man, entry); *res_p =NULL ;break ;case VMW_CMDBUF_RES_COMMITTED : - (void )vmwgfx_ht_remove_item (&man->resources, &entry->hash); +hash_del_rcu (&entry->hash.head);list_del (&entry->head); entry->state =VMW_CMDBUF_RES_DEL ;list_add_tail (&entry->head, list);
@@ -287,7 +283,6 @@ struct vmw_cmdbuf_res_manager * vmw_cmdbuf_res_man_create(struct vmw_private *dev_priv) {struct vmw_cmdbuf_res_manager *man; -int ret; man =kzalloc (sizeof (*man),GFP_KERNEL );if (!man)
@@ -295,12 +290,8 @@ vmw_cmdbuf_res_man_create(struct vmw_private *dev_priv) man->dev_priv = dev_priv;INIT_LIST_HEAD (&man->list); - ret =vmwgfx_ht_create (&man->resources,VMW_CMDBUF_RES_MAN_HT_ORDER ); -if (ret ==0 ) -return man; - -kfree (man); -return ERR_PTR (ret); +hash_init (man->resources); +return man; }/**
@@ -320,7 +311,6 @@ void vmw_cmdbuf_res_man_destroy(struct vmw_cmdbuf_res_manager *man)list_for_each_entry_safe (entry, next, &man->list, head)vmw_cmdbuf_res_free (man, entry); -vmwgfx_ht_remove (&man->resources);kfree (man); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 143/183 drm/vmwgfx: Remove ttm object hashtable
In reply to Greg Kroah-HartmanFrom: Maaz Mombasawala <[email protected]>
[ Upstream commit 931e09d8d5b4aa19bdae0234f2727049f1cd13d9 ]
The object_hash hashtable for ttm objects is not being used. Remove it and perform refactoring in ttm_object init function.
Stable-dep-of: a309c7194e8a ("drm/vmwgfx: Remove rcu locks from user resources")
--- drivers/gpu/drm/vmwgfx/ttm_object.c | 24 ++++++------------------ drivers/gpu/drm/vmwgfx/ttm_object.h | 6 ++---- drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 2 +- 3 files changed, 9 insertions(+), 23 deletions(-)
drivers/gpu/drm/vmwgfx/ttm_object.c +6 -18
@@ -1,7 +1,7 @@/* SPDX-License-Identifier: GPL-2.0 OR MIT */ /************************************************************************** * -* Copyright (c) 2009-2013 VMware, Inc., Palo Alto, CA., USA +* Copyright (c) 2009-2022 VMware, Inc., Palo Alto, CA., USA * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a
@@ -44,13 +44,14 @@#define pr_fmt (fmt) "[TTM] " fmt +#include "ttm_object.h" +#include "vmwgfx_drv.h" +#include <linux/list.h> #include <linux/spinlock.h> #include <linux/slab.h> #include <linux/atomic.h> #include <linux/module.h> -#include "ttm_object.h" -#include "vmwgfx_drv.h" MODULE_IMPORT_NS (DMA_BUF );
@@ -81,9 +82,7 @@ struct ttm_object_file {/* * struct ttm_object_device * -* @object_lock: lock that protects the object_hash hash table. -* -* @object_hash: hash table for fast lookup of object global names. +* @object_lock: lock that protects idr. * * @object_count: Per device object count. *
@@ -92,7 +91,6 @@ struct ttm_object_file {struct ttm_object_device {spinlock_t object_lock; -struct vmwgfx_open_hash object_hash;atomic_t object_count;struct dma_buf_ops ops;void (*dmabuf_release)(struct dma_buf *dma_buf);
@@ -449,20 +447,15 @@ struct ttm_object_file *ttm_object_file_init(struct ttm_object_device *tdev, }struct ttm_object_device * -ttm_object_device_init (unsigned int hash_order, -const struct dma_buf_ops *ops) +ttm_object_device_init (const struct dma_buf_ops *ops) {struct ttm_object_device *tdev =kmalloc (sizeof (*tdev),GFP_KERNEL ); -int ret;if (unlikely (tdev ==NULL ))return NULL ;spin_lock_init (&tdev->object_lock);atomic_set (&tdev->object_count,0 ); - ret =vmwgfx_ht_create (&tdev->object_hash, hash_order); -if (ret !=0 ) - goto out_no_object_hash;/* * Our base is at VMWGFX_NUM_MOB + 1 because we want to create
@@ -477,10 +470,6 @@ ttm_object_device_init(unsigned int hash_order, tdev->dmabuf_release = tdev->ops.release; tdev->ops.release = ttm_prime_dmabuf_release;return tdev; - -out_no_object_hash: -kfree (tdev); -return NULL ; }void ttm_object_device_release (struct ttm_object_device **p_tdev)
@@ -491,7 +480,6 @@ void ttm_object_device_release(struct ttm_object_device **p_tdev)WARN_ON_ONCE (!idr_is_empty (&tdev->idr));idr_destroy (&tdev->idr); -vmwgfx_ht_remove (&tdev->object_hash);kfree (tdev); }
drivers/gpu/drm/vmwgfx/ttm_object.h +2 -4
@@ -1,6 +1,6 @@/************************************************************************** * -* Copyright (c) 2006-2009 VMware, Inc., Palo Alto, CA., USA +* Copyright (c) 2006-2022 VMware, Inc., Palo Alto, CA., USA * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a
@@ -262,7 +262,6 @@ extern void ttm_object_file_release(struct ttm_object_file **p_tfile);/** * ttm_object device init - initialize a struct ttm_object_device * -* @hash_order: Order of hash table used to hash the base objects. * @ops: DMA buf ops for prime objects of this device. * * This function is typically called on device initialization to prepare
@@ -270,8 +269,7 @@ extern void ttm_object_file_release(struct ttm_object_file **p_tfile);*/ extern struct ttm_object_device * -ttm_object_device_init (unsigned int hash_order, -const struct dma_buf_ops *ops); +ttm_object_device_init (const struct dma_buf_ops *ops);/** * ttm_object_device_release - release data held by a ttm_object_device
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +1 -1
@@ -994,7 +994,7 @@ static int vmw_driver_load(struct vmw_private *dev_priv, u32 pci_id) goto out_err0; } - dev_priv->tdev =ttm_object_device_init (12 , &vmw_prime_dmabuf_ops); + dev_priv->tdev =ttm_object_device_init (&vmw_prime_dmabuf_ops);if (unlikely (dev_priv->tdev ==NULL )) { drm_err(&dev_priv->drm,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 144/183 drm/vmwgfx: Refactor resource validation hashtable to use linux/hashtable implementation.
In reply to Greg Kroah-HartmanFrom: Maaz Mombasawala <[email protected]>
[ Upstream commit 9e931f2e09701e25744f3d186a4ba13b5342b136 ]
Vmwgfx's hashtab implementation needs to be replaced with linux/hashtable to reduce maintenence burden.
As part of this effort, refactor the res_ht hashtable used for resource validation during execbuf execution to use linux/hashtable implementation. This also refactors vmw_validation_context to use vmw_sw_context as the container for the hashtable, whereas before it used a vmwgfx_open_hash directly. This makes vmw_validation_context less generic, but there is no functional change since res_ht is the only instance where validation context used a hashtable in vmwgfx driver.
Stable-dep-of: a309c7194e8a ("drm/vmwgfx: Remove rcu locks from user resources")
--- drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 24 ++++++++-- drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 5 +- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 14 ++---- drivers/gpu/drm/vmwgfx/vmwgfx_validation.c | 55 +++++++++++----------- drivers/gpu/drm/vmwgfx/vmwgfx_validation.h | 26 +++------- 5 files changed, 58 insertions(+), 66 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +19 -5
@@ -830,6 +830,22 @@ static void vmw_write_driver_id(struct vmw_private *dev) } } +static void vmw_sw_context_init (struct vmw_private *dev_priv) +{ +struct vmw_sw_context *sw_context = &dev_priv->ctx; + +hash_init (sw_context->res_ht); +} + +static void vmw_sw_context_fini (struct vmw_private *dev_priv) +{ +struct vmw_sw_context *sw_context = &dev_priv->ctx; + +vfree (sw_context->cmd_bounce); +if (sw_context->staged_bindings) +vmw_binding_state_free (sw_context->staged_bindings); +} +static int vmw_driver_load (struct vmw_private *dev_priv,u32 pci_id) {int ret;
@@ -839,6 +855,8 @@ static int vmw_driver_load(struct vmw_private *dev_priv, u32 pci_id) dev_priv->drm.dev_private = dev_priv; +vmw_sw_context_init (dev_priv); +mutex_init (&dev_priv->cmdbuf_mutex);mutex_init (&dev_priv->binding_mutex);spin_lock_init (&dev_priv->resource_lock);
@@ -1168,9 +1186,7 @@ static void vmw_driver_unload(struct drm_device *dev)unregister_pm_notifier (&dev_priv->pm_nb); -if (dev_priv->ctx.res_ht_initialized) -vmwgfx_ht_remove (&dev_priv->ctx.res_ht); -vfree (dev_priv->ctx.cmd_bounce); +vmw_sw_context_fini (dev_priv);if (dev_priv->enable_fb) {vmw_fb_off (dev_priv);vmw_fb_close (dev_priv);
@@ -1198,8 +1214,6 @@ static void vmw_driver_unload(struct drm_device *dev)vmw_irq_uninstall (&dev_priv->drm);ttm_object_device_release (&dev_priv->tdev); -if (dev_priv->ctx.staged_bindings) -vmw_binding_state_free (dev_priv->ctx.staged_bindings);for (i = vmw_res_context; i < vmw_res_max; ++i)idr_destroy (&dev_priv->res_idr[i]);
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +3 -2
@@ -30,6 +30,7 @@#include <linux/suspend.h> #include <linux/sync_file.h> +#include <linux/hashtable.h> #include <drm/drm_auth.h> #include <drm/drm_device.h>
@@ -93,6 +94,7 @@#define VMW_RES_STREAM ttm_driver_type2#define VMW_RES_FENCE ttm_driver_type3#define VMW_RES_SHADER ttm_driver_type4 +#define VMW_RES_HT_ORDER 12#define MKSSTAT_CAPACITY_LOG2 5U#define MKSSTAT_CAPACITY (1U << MKSSTAT_CAPACITY_LOG2)
@@ -425,8 +427,7 @@ struct vmw_ctx_validation_info;* @ctx: The validation context */ struct vmw_sw_context { -struct vmwgfx_open_hash res_ht; -bool res_ht_initialized; + DECLARE_HASHTABLE(res_ht, VMW_RES_HT_ORDER);bool kernel;struct vmw_fpriv *fp;struct drm_file *filp;
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +3 -11
@@ -1,7 +1,7 @@// SPDX-License-Identifier: GPL-2.0 OR MIT /************************************************************************** * -* Copyright 2009 - 2015 VMware, Inc., Palo Alto, CA., USA +* Copyright 2009 - 2022 VMware, Inc., Palo Alto, CA., USA * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the
@@ -25,6 +25,7 @@* **************************************************************************/ #include <linux/sync_file.h> +#include <linux/hashtable.h> #include "vmwgfx_drv.h" #include "vmwgfx_reg.h"
@@ -34,7 +35,6 @@#include "vmwgfx_binding.h" #include "vmwgfx_mksstat.h" -#define VMW_RES_HT_ORDER 12/* * Helper macro to get dx_ctx_node if available otherwise print an error
@@ -4101,7 +4101,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,int ret;int32_t out_fence_fd =-1 ;struct sync_file *sync_file =NULL ; -DECLARE_VAL_CONTEXT (val_ctx, &sw_context->res_ht,1 ); +DECLARE_VAL_CONTEXT (val_ctx, sw_context,1 );if (flags &DRM_VMW_EXECBUF_FLAG_EXPORT_FENCE_FD ) { out_fence_fd =get_unused_fd_flags (O_CLOEXEC );
@@ -4164,14 +4164,6 @@ int vmw_execbuf_process(struct drm_file *file_priv,if (sw_context->staged_bindings)vmw_binding_state_reset (sw_context->staged_bindings); -if (!sw_context->res_ht_initialized) { - ret =vmwgfx_ht_create (&sw_context->res_ht,VMW_RES_HT_ORDER ); -if (unlikely (ret !=0 )) - goto out_unlock; - - sw_context->res_ht_initialized = true; - } -INIT_LIST_HEAD (&sw_context->staged_cmd_res); sw_context->ctx = &val_ctx; ret =vmw_execbuf_tie_context (dev_priv, sw_context, dx_context_handle);
drivers/gpu/drm/vmwgfx/vmwgfx_validation.c +27 -28
116 lines not on this page · raw message
drivers/gpu/drm/vmwgfx/vmwgfx_validation.h +6 -20
@@ -1,7 +1,7 @@/* SPDX-License-Identifier: GPL-2.0 OR MIT */ /************************************************************************** * -* Copyright © 2018 VMware, Inc., Palo Alto, CA., USA +* Copyright © 2018 - 2022 VMware, Inc., Palo Alto, CA., USA * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a
@@ -29,12 +29,11 @@#define _VMWGFX_VALIDATION_H_#include <linux/list.h> +#include <linux/hashtable.h> #include <linux/ww_mutex.h> #include <drm/ttm/ttm_execbuf_util.h> -#include "vmwgfx_hashtab.h" -#define VMW_RES_DIRTY_NONE 0#define VMW_RES_DIRTY_SET BIT(0)#define VMW_RES_DIRTY_CLEAR BIT(1)
@@ -59,7 +58,7 @@* @total_mem: Amount of reserved memory. */ struct vmw_validation_context { -struct vmwgfx_open_hash *ht; +struct vmw_sw_context *sw_context;struct list_head resource_list;struct list_head resource_ctx_list;struct list_head bo_list;
@@ -82,16 +81,16 @@ struct vmw_fence_obj;/** * DECLARE_VAL_CONTEXT - Declare a validation context with initialization * @_name: The name of the variable -* @_ht: The hash table used to find dups or NULL if none +* @_sw_context: Contains the hash table used to find dups or NULL if none * @_merge_dups: Whether to merge duplicate buffer object- or resource * entries. If set to true, ideally a hash table pointer should be supplied * as well unless the number of resources and buffer objects per validation * is known to be very small */ #endif -#define DECLARE_VAL_CONTEXT (_name, _ht, _merge_dups) \ +#define DECLARE_VAL_CONTEXT (_name, _sw_context, _merge_dups) \ struct vmw_validation_context _name = \ - { .ht = _ht, \ + { .sw_context = _sw_context, \ .resource_list = LIST_HEAD_INIT((_name).resource_list), \ .resource_ctx_list = LIST_HEAD_INIT((_name).resource_ctx_list), \ .bo_list = LIST_HEAD_INIT((_name).bo_list), \
@@ -114,19 +113,6 @@ vmw_validation_has_bos(struct vmw_validation_context *ctx)return !list_empty (&ctx->bo_list); } -/** -* vmw_validation_set_ht - Register a hash table for duplicate finding -* @ctx: The validation context -* @ht: Pointer to a hash table to use for duplicate finding -* This function is intended to be used if the hash table wasn't -* available at validation context declaration time -*/ -static inline void vmw_validation_set_ht (struct vmw_validation_context *ctx, -struct vmwgfx_open_hash *ht) -{ - ctx->ht = ht; -} -/** * vmw_validation_bo_reserve - Reserve buffer objects registered with a * validation context
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 145/183 drm/vmwgfx: Refactor ttm reference object hashtable to use linux/hashtable.
In reply to Greg Kroah-HartmanFrom: Maaz Mombasawala <[email protected]>
[ Upstream commit 76a9e07f270cf5fb556ac237dbf11f5dacd61fef ]
This is part of an effort to move from the vmwgfx_open_hash hashtable to linux/hashtable implementation.
Refactor the ref_hash hashtable, used for fast lookup of reference objects associated with a ttm file.
This also exposed a problem related to inconsistently using 32-bit and 64-bit keys with this hashtable. The hash function used changes depending on the size of the type, and results are not consistent across numbers, for example, hash_32(329) = 329, but hash_long(329) = 328. This would cause the lookup to fail for objects already in the hashtable, since keys of different sizes were being passed during adding and lookup. This was not an issue before because vmwgfx_open_hash always used hash_long. Fix this by always using 64-bit keys for this hashtable, which means that hash_long is always used.
Stable-dep-of: a309c7194e8a ("drm/vmwgfx: Remove rcu locks from user resources")
--- drivers/gpu/drm/vmwgfx/ttm_object.c | 91 ++++++++++++++++------------- drivers/gpu/drm/vmwgfx/ttm_object.h | 12 ++-- drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 2 +- 3 files changed, 56 insertions(+), 49 deletions(-)
drivers/gpu/drm/vmwgfx/ttm_object.c +50 -41
@@ -52,9 +52,12 @@#include <linux/slab.h> #include <linux/atomic.h> #include <linux/module.h> +#include <linux/hashtable.h> MODULE_IMPORT_NS (DMA_BUF ); +#define VMW_TTM_OBJECT_REF_HT_ORDER 10 +/** * struct ttm_object_file *
@@ -75,7 +78,7 @@ struct ttm_object_file {struct ttm_object_device *tdev;spinlock_t lock;struct list_head ref_list; -struct vmwgfx_open_hash ref_hash; +DECLARE_HASHTABLE (ref_hash,VMW_TTM_OBJECT_REF_HT_ORDER );struct kref refcount; };
@@ -136,6 +139,36 @@ ttm_object_file_ref(struct ttm_object_file *tfile)return tfile; } +static int ttm_tfile_find_ref_rcu (struct ttm_object_file *tfile, +uint64_t key, +struct vmwgfx_hash_item **p_hash) +{ +struct vmwgfx_hash_item *hash; + +hash_for_each_possible_rcu (tfile->ref_hash, hash, head, key) { +if (hash->key == key) { + *p_hash = hash; +return 0 ; + } + } +return -EINVAL ; +} + +static int ttm_tfile_find_ref (struct ttm_object_file *tfile, +uint64_t key, +struct vmwgfx_hash_item **p_hash) +{ +struct vmwgfx_hash_item *hash; + +hash_for_each_possible (tfile->ref_hash, hash, head, key) { +if (hash->key == key) { + *p_hash = hash; +return 0 ; + } + } +return -EINVAL ; +} +static void ttm_object_file_destroy (struct kref *kref) { struct ttm_object_file *tfile =
@@ -238,14 +271,13 @@ void ttm_base_object_unref(struct ttm_base_object **p_base)* Return: A pointer to the object if successful or NULL otherwise. */ struct ttm_base_object * -ttm_base_object_noref_lookup (struct ttm_object_file *tfile,uint32_t key) +ttm_base_object_noref_lookup (struct ttm_object_file *tfile,uint64_t key) {struct vmwgfx_hash_item *hash; -struct vmwgfx_open_hash *ht = &tfile->ref_hash;int ret;rcu_read_lock (); - ret =vmwgfx_ht_find_item_rcu (ht, key, &hash); + ret =ttm_tfile_find_ref_rcu (tfile, key, &hash);if (ret) {rcu_read_unlock ();return NULL ;
@@ -257,15 +289,14 @@ ttm_base_object_noref_lookup(struct ttm_object_file *tfile, uint32_t key)EXPORT_SYMBOL (ttm_base_object_noref_lookup);struct ttm_base_object *ttm_base_object_lookup (struct ttm_object_file *tfile, -uint32_t key) +uint64_t key) {struct ttm_base_object *base =NULL ;struct vmwgfx_hash_item *hash; -struct vmwgfx_open_hash *ht = &tfile->ref_hash;int ret;rcu_read_lock (); - ret =vmwgfx_ht_find_item_rcu (ht, key, &hash); + ret =ttm_tfile_find_ref_rcu (tfile, key, &hash);if (likely (ret ==0 )) { base = drm_hash_entry(hash, struct ttm_ref_object, hash)->obj;
@@ -278,7 +309,7 @@ struct ttm_base_object *ttm_base_object_lookup(struct ttm_object_file *tfile, }struct ttm_base_object * -ttm_base_object_lookup_for_ref (struct ttm_object_device *tdev,uint32_t key) +ttm_base_object_lookup_for_ref (struct ttm_object_device *tdev,uint64_t key) {struct ttm_base_object *base;
@@ -297,7 +328,6 @@ int ttm_ref_object_add(struct ttm_object_file *tfile, bool *existed, bool require_existed) { -struct vmwgfx_open_hash *ht = &tfile->ref_hash;struct ttm_ref_object *ref;struct vmwgfx_hash_item *hash;int ret = -EINVAL ;
@@ -310,7 +340,7 @@ int ttm_ref_object_add(struct ttm_object_file *tfile,while (ret == -EINVAL ) {rcu_read_lock (); - ret =vmwgfx_ht_find_item_rcu (ht, base->handle, &hash); + ret =ttm_tfile_find_ref_rcu (tfile, base->handle, &hash);if (ret ==0 ) { ref = drm_hash_entry(hash, struct ttm_ref_object, hash);
@@ -335,21 +365,14 @@ int ttm_ref_object_add(struct ttm_object_file *tfile,kref_init (&ref->kref);spin_lock (&tfile->lock); - ret =vmwgfx_ht_insert_item_rcu (ht, &ref->hash); - -if (likely (ret ==0 )) { -list_add_tail (&ref->head, &tfile->ref_list); -kref_get (&base->refcount); -spin_unlock (&tfile->lock); -if (existed !=NULL ) - *existed = false; -break ; - } +hash_add_rcu (tfile->ref_hash, &ref->hash.head, ref->hash.key); + ret =0 ; +list_add_tail (&ref->head, &tfile->ref_list); +kref_get (&base->refcount);spin_unlock (&tfile->lock); -BUG_ON (ret != -EINVAL ); - -kfree (ref); +if (existed !=NULL ) + *existed = false; }return ret;
@@ -361,10 +384,8 @@ ttm_ref_object_release(struct kref *kref)struct ttm_ref_object *ref = container_of(kref, struct ttm_ref_object, kref);struct ttm_object_file *tfile = ref->tfile; -struct vmwgfx_open_hash *ht; - ht = &tfile->ref_hash; - (void )vmwgfx_ht_remove_item_rcu (ht, &ref->hash); +hash_del_rcu (&ref->hash.head);list_del (&ref->head);spin_unlock (&tfile->lock);
@@ -376,13 +397,12 @@ ttm_ref_object_release(struct kref *kref)int ttm_ref_object_base_unref (struct ttm_object_file *tfile,unsigned long key) { -struct vmwgfx_open_hash *ht = &tfile->ref_hash;struct ttm_ref_object *ref;struct vmwgfx_hash_item *hash;int ret;spin_lock (&tfile->lock); - ret =vmwgfx_ht_find_item (ht, key, &hash); + ret =ttm_tfile_find_ref (tfile, key, &hash);if (unlikely (ret !=0 )) {spin_unlock (&tfile->lock);return -EINVAL ;
@@ -414,16 +434,13 @@ void ttm_object_file_release(struct ttm_object_file **p_tfile) }spin_unlock (&tfile->lock); -vmwgfx_ht_remove (&tfile->ref_hash);ttm_object_file_unref (&tfile); } -struct ttm_object_file *ttm_object_file_init (struct ttm_object_device *tdev, -unsigned int hash_order) +struct ttm_object_file *ttm_object_file_init (struct ttm_object_device *tdev) {struct ttm_object_file *tfile =kmalloc (sizeof (*tfile),GFP_KERNEL ); -int ret;if (unlikely (tfile ==NULL ))return NULL ;
@@ -433,17 +450,9 @@ struct ttm_object_file *ttm_object_file_init(struct ttm_object_device *tdev,kref_init (&tfile->refcount);INIT_LIST_HEAD (&tfile->ref_list); - ret =vmwgfx_ht_create (&tfile->ref_hash, hash_order); -if (ret) - goto out_err; +hash_init (tfile->ref_hash);return tfile; -out_err: -vmwgfx_ht_remove (&tfile->ref_hash); - -kfree (tfile); - -return NULL ; } struct ttm_object_device *
drivers/gpu/drm/vmwgfx/ttm_object.h +5 -7
@@ -104,7 +104,7 @@ struct ttm_base_object {struct ttm_object_file *tfile;struct kref refcount;void (*refcount_release) (struct ttm_base_object **base); -u32 handle; +u64 handle;enum ttm_object_type object_type;u32 shareable; };
@@ -164,7 +164,7 @@ extern int ttm_base_object_init(struct ttm_object_file *tfile,*/ extern struct ttm_base_object *ttm_base_object_lookup (struct ttm_object_file - *tfile,uint32_t key); + *tfile,uint64_t key);/** * ttm_base_object_lookup_for_ref
@@ -178,7 +178,7 @@ extern struct ttm_base_object *ttm_base_object_lookup(struct ttm_object_file*/ extern struct ttm_base_object * -ttm_base_object_lookup_for_ref (struct ttm_object_device *tdev,uint32_t key); +ttm_base_object_lookup_for_ref (struct ttm_object_device *tdev,uint64_t key);/** * ttm_base_object_unref
@@ -237,14 +237,12 @@ extern int ttm_ref_object_base_unref(struct ttm_object_file *tfile,* ttm_object_file_init - initialize a struct ttm_object file * * @tdev: A struct ttm_object device this file is initialized on. -* @hash_order: Order of the hash table used to hold the reference objects. * * This is typically called by the file_ops::open function. */ extern struct ttm_object_file *ttm_object_file_init (struct ttm_object_device - *tdev, -unsigned int hash_order); + *tdev);/** * ttm_object_file_release - release data held by a ttm_object_file
@@ -312,7 +310,7 @@ extern int ttm_prime_handle_to_fd(struct ttm_object_file *tfile, kfree_rcu(__obj, __prime.base.rhead)struct ttm_base_object * -ttm_base_object_noref_lookup (struct ttm_object_file *tfile,uint32_t key); +ttm_base_object_noref_lookup (struct ttm_object_file *tfile,uint64_t key);/** * ttm_base_object_noref_release - release a base object pointer looked up
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +1 -1
@@ -1242,7 +1242,7 @@ static int vmw_driver_open(struct drm_device *dev, struct drm_file *file_priv)if (unlikely (!vmw_fp))return ret; - vmw_fp->tfile =ttm_object_file_init (dev_priv->tdev,10 ); + vmw_fp->tfile =ttm_object_file_init (dev_priv->tdev);if (unlikely (vmw_fp->tfile ==NULL )) goto out_no_tfile;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 146/183 drm/vmwgfx: Remove vmwgfx_hashtab
In reply to Greg Kroah-HartmanFrom: Maaz Mombasawala <[email protected]>
[ Upstream commit 9da30cdd6a318595199319708c143ae318f804ef ]
The vmwgfx driver has migrated from using the hashtable in vmwgfx_hashtab to the linux/hashtable implementation. Remove the vmwgfx_hashtab from the driver.
Stable-dep-of: a309c7194e8a ("drm/vmwgfx: Remove rcu locks from user resources")
--- Documentation/gpu/todo.rst | 11 -- drivers/gpu/drm/vmwgfx/Makefile | 2 +- drivers/gpu/drm/vmwgfx/ttm_object.c | 8 +- drivers/gpu/drm/vmwgfx/ttm_object.h | 2 - drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c | 4 +- drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 6 +- drivers/gpu/drm/vmwgfx/vmwgfx_hashtab.c | 199 --------------------- drivers/gpu/drm/vmwgfx/vmwgfx_hashtab.h | 83 --------- 8 files changed, 12 insertions(+), 303 deletions(-) delete mode 100644 drivers/gpu/drm/vmwgfx/vmwgfx_hashtab.c delete mode 100644 drivers/gpu/drm/vmwgfx/vmwgfx_hashtab.h
Documentation/gpu/todo.rst +0 -11
@@ -651,17 +651,6 @@ See drivers/gpu/drm/amd/display/TODO for tasks. Contact: Harry Wentland, Alex Deucher -vmwgfx: Replace hashtable with Linux' implementation ----------------------------------------------------- - -The vmwgfx driver uses its own hashtable implementation. Replace the -code with Linux' implementation and update the callers. It's mostly a -refactoring task, but the interfaces are different. - -Contact: Zack Rusin, Thomas Zimmermann <[email protected]> - -Level: Intermediate - Bootsplash ==========
drivers/gpu/drm/vmwgfx/Makefile +1 -1
@@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 -vmwgfx-y := vmwgfx_execbuf.o vmwgfx_gmr.o vmwgfx_hashtab.o vmwgfx_kms.o vmwgfx_drv.o \ +vmwgfx-y := vmwgfx_execbuf.o vmwgfx_gmr.o vmwgfx_kms.o vmwgfx_drv.o \ vmwgfx_ioctl.o vmwgfx_resource.o vmwgfx_ttm_buffer.o \ vmwgfx_cmd.o vmwgfx_irq.o vmwgfx_ldu.o vmwgfx_ttm_glue.o \ vmwgfx_overlay.o vmwgfx_gmrid_manager.o vmwgfx_fence.o \
drivers/gpu/drm/vmwgfx/ttm_object.c +4 -4
@@ -284,7 +284,7 @@ ttm_base_object_noref_lookup(struct ttm_object_file *tfile, uint64_t key) }__release (RCU ); - return drm_hash_entry(hash, struct ttm_ref_object, hash)->obj; + return hlist_entry(hash, struct ttm_ref_object, hash)->obj; }EXPORT_SYMBOL (ttm_base_object_noref_lookup);
@@ -299,7 +299,7 @@ struct ttm_base_object *ttm_base_object_lookup(struct ttm_object_file *tfile, ret =ttm_tfile_find_ref_rcu (tfile, key, &hash);if (likely (ret ==0 )) { - base = drm_hash_entry(hash, struct ttm_ref_object, hash)->obj; + base = hlist_entry(hash, struct ttm_ref_object, hash)->obj;if (!kref_get_unless_zero (&base->refcount)) base =NULL ; }
@@ -343,7 +343,7 @@ int ttm_ref_object_add(struct ttm_object_file *tfile, ret =ttm_tfile_find_ref_rcu (tfile, base->handle, &hash);if (ret ==0 ) { - ref = drm_hash_entry(hash, struct ttm_ref_object, hash); + ref = hlist_entry(hash, struct ttm_ref_object, hash);if (kref_get_unless_zero (&ref->kref)) {rcu_read_unlock ();break ;
@@ -407,7 +407,7 @@ int ttm_ref_object_base_unref(struct ttm_object_file *tfile,spin_unlock (&tfile->lock);return -EINVAL ; } - ref = drm_hash_entry(hash, struct ttm_ref_object, hash); + ref = hlist_entry(hash, struct ttm_ref_object, hash);kref_put (&ref->kref, ttm_ref_object_release);spin_unlock (&tfile->lock);return 0 ;
drivers/gpu/drm/vmwgfx/ttm_object.h +0 -2
@@ -42,8 +42,6 @@#include <linux/list.h> #include <linux/rcupdate.h> -#include "vmwgfx_hashtab.h" -/** * enum ttm_object_type *
drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c +2 -2
@@ -88,7 +88,7 @@ vmw_cmdbuf_res_lookup(struct vmw_cmdbuf_res_manager *man,hash_for_each_possible_rcu (man->resources, hash, head, key) {if (hash->key == key) - return drm_hash_entry(hash, struct vmw_cmdbuf_res, hash)->res; + return hlist_entry(hash, struct vmw_cmdbuf_res, hash)->res; }return ERR_PTR (-EINVAL ); }
@@ -243,7 +243,7 @@ int vmw_cmdbuf_res_remove(struct vmw_cmdbuf_res_manager *man,hash_for_each_possible_rcu (man->resources, hash, head, key) {if (hash->key == key) { - entry = drm_hash_entry(hash, struct vmw_cmdbuf_res, hash); + entry = hlist_entry(hash, struct vmw_cmdbuf_res, hash);break ; } }
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +5 -1
@@ -43,7 +43,6 @@#include "ttm_object.h" #include "vmwgfx_fence.h" -#include "vmwgfx_hashtab.h" #include "vmwgfx_reg.h" #include "vmwgfx_validation.h"
@@ -104,6 +103,11 @@ struct vmw_fpriv {bool gb_aware;/* user-space is guest-backed aware */ }; +struct vmwgfx_hash_item { +struct hlist_node head; +unsigned long key; +}; +/** * struct vmw_buffer_object - TTM buffer object with vmwgfx additions * @base: The TTM buffer object
drivers/gpu/drm/vmwgfx/vmwgfx_hashtab.c deleted +0 -199
199 lines not on this page · raw message
drivers/gpu/drm/vmwgfx/vmwgfx_hashtab.h deleted +0 -83
83 lines not on this page · raw message
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 147/183 drm/vmwgfx: Remove rcu locks from user resources
In reply to Greg Kroah-HartmanFrom: Zack Rusin <[email protected]>
[ Upstream commit a309c7194e8a2f8bd4539b9449917913f6c2cd50 ]
User resource lookups used rcu to avoid two extra atomics. Unfortunately the rcu paths were buggy and it was easy to make the driver crash by submitting command buffers from two different threads. Because the lookups never show up in performance profiles replace them with a regular spin lock which fixes the races in accesses to those shared resources.
Fixes kernel oops'es in IGT's vmwgfx execution_buffer stress test and seen crashes with apps using shared resources.
--- drivers/gpu/drm/vmwgfx/ttm_object.c | 41 +----- drivers/gpu/drm/vmwgfx/ttm_object.h | 14 -- drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 38 ----- drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 18 +-- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 176 +++++++++++------------ drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 33 ----- 6 files changed, 87 insertions(+), 233 deletions(-)
drivers/gpu/drm/vmwgfx/ttm_object.c +4 -37
@@ -254,40 +254,6 @@ void ttm_base_object_unref(struct ttm_base_object **p_base)kref_put (&base->refcount, ttm_release_base); } -/** -* ttm_base_object_noref_lookup - look up a base object without reference -* @tfile: The struct ttm_object_file the object is registered with. -* @key: The object handle. -* -* This function looks up a ttm base object and returns a pointer to it -* without refcounting the pointer. The returned pointer is only valid -* until ttm_base_object_noref_release() is called, and the object -* pointed to by the returned pointer may be doomed. Any persistent usage -* of the object requires a refcount to be taken using kref_get_unless_zero(). -* Iff this function returns successfully it needs to be paired with -* ttm_base_object_noref_release() and no sleeping- or scheduling functions -* may be called inbetween these function callse. -* -* Return: A pointer to the object if successful or NULL otherwise. -*/ -struct ttm_base_object * -ttm_base_object_noref_lookup (struct ttm_object_file *tfile,uint64_t key) -{ -struct vmwgfx_hash_item *hash; -int ret; - -rcu_read_lock (); - ret =ttm_tfile_find_ref_rcu (tfile, key, &hash); -if (ret) { -rcu_read_unlock (); -return NULL ; - } - -__release (RCU ); - return hlist_entry(hash, struct ttm_ref_object, hash)->obj; -} -EXPORT_SYMBOL (ttm_base_object_noref_lookup); -struct ttm_base_object *ttm_base_object_lookup (struct ttm_object_file *tfile,uint64_t key) {
@@ -295,15 +261,16 @@ struct ttm_base_object *ttm_base_object_lookup(struct ttm_object_file *tfile,struct vmwgfx_hash_item *hash;int ret; -rcu_read_lock (); - ret =ttm_tfile_find_ref_rcu (tfile, key, &hash); +spin_lock (&tfile->lock); + ret =ttm_tfile_find_ref (tfile, key, &hash);if (likely (ret ==0 )) { base = hlist_entry(hash, struct ttm_ref_object, hash)->obj;if (!kref_get_unless_zero (&base->refcount)) base =NULL ; } -rcu_read_unlock (); +spin_unlock (&tfile->lock); +return base; }
drivers/gpu/drm/vmwgfx/ttm_object.h +0 -14
@@ -307,18 +307,4 @@ extern int ttm_prime_handle_to_fd(struct ttm_object_file *tfile,#define ttm_prime_object_kfree (__obj, __prime) \ kfree_rcu(__obj, __prime.base.rhead) -struct ttm_base_object * -ttm_base_object_noref_lookup (struct ttm_object_file *tfile,uint64_t key); - -/** -* ttm_base_object_noref_release - release a base object pointer looked up -* without reference -* -* Releases a base object pointer looked up with ttm_base_object_noref_lookup(). -*/ -static inline void ttm_base_object_noref_release (void ) -{ -__acquire (RCU ); -rcu_read_unlock (); -}#endif
drivers/gpu/drm/vmwgfx/vmwgfx_bo.c +0 -38
@@ -715,44 +715,6 @@ int vmw_user_bo_lookup(struct drm_file *filp,return 0 ; } -/** -* vmw_user_bo_noref_lookup - Look up a vmw user buffer object without reference -* @filp: The TTM object file the handle is registered with. -* @handle: The user buffer object handle. -* -* This function looks up a struct vmw_bo and returns a pointer to the -* struct vmw_buffer_object it derives from without refcounting the pointer. -* The returned pointer is only valid until vmw_user_bo_noref_release() is -* called, and the object pointed to by the returned pointer may be doomed. -* Any persistent usage of the object requires a refcount to be taken using -* ttm_bo_reference_unless_doomed(). Iff this function returns successfully it -* needs to be paired with vmw_user_bo_noref_release() and no sleeping- -* or scheduling functions may be called in between these function calls. -* -* Return: A struct vmw_buffer_object pointer if successful or negative -* error pointer on failure. -*/ -struct vmw_buffer_object * -vmw_user_bo_noref_lookup (struct drm_file *filp,u32 handle) -{ -struct vmw_buffer_object *vmw_bo; -struct ttm_buffer_object *bo; -struct drm_gem_object *gobj =drm_gem_object_lookup (filp, handle); - -if (!gobj) { -DRM_ERROR ("Invalid buffer object handle 0x%08lx.\n" , - (unsigned long )handle); -return ERR_PTR (-ESRCH ); - } - vmw_bo =gem_to_vmw_bo (gobj); - bo =ttm_bo_get_unless_zero (&vmw_bo->base); - vmw_bo =vmw_buffer_object (bo); -drm_gem_object_put (gobj); - -return vmw_bo; -} - -/** * vmw_bo_fence_single - Utility function to fence a single TTM buffer * object without unreserving it.
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +1 -17
@@ -826,12 +826,7 @@ extern int vmw_user_resource_lookup_handle(uint32_t handle, const struct vmw_user_resource_conv *converter, struct vmw_resource **p_res); -extern struct vmw_resource * -vmw_user_resource_noref_lookup_handle (struct vmw_private *dev_priv, -struct ttm_object_file *tfile, -uint32_t handle, -const struct vmw_user_resource_conv * - converter); +extern int vmw_stream_claim_ioctl (struct drm_device *dev,void *data,struct drm_file *file_priv); extern int vmw_stream_unref_ioctl(struct drm_device *dev, void *data,
@@ -870,15 +865,6 @@ static inline bool vmw_resource_mob_attached(const struct vmw_resource *res)return !RB_EMPTY_NODE (&res->mob_node); } -/** -* vmw_user_resource_noref_release - release a user resource pointer looked up -* without reference -*/ -static inline void vmw_user_resource_noref_release (void ) -{ -ttm_base_object_noref_release (); -} -/** * Buffer object helper functions - vmwgfx_bo.c */
@@ -930,8 +916,6 @@ extern void vmw_bo_unmap(struct vmw_buffer_object *vbo);extern void vmw_bo_move_notify (struct ttm_buffer_object *bo,struct ttm_resource *mem);extern void vmw_bo_swap_notify (struct ttm_buffer_object *bo); -extern struct vmw_buffer_object * -vmw_user_bo_noref_lookup (struct drm_file *filp,u32 handle);/** * vmw_bo_adjust_prio - Adjust the buffer object eviction priority
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +82 -94
310 lines not on this page · raw message
drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +0 -33
@@ -281,39 +281,6 @@ int vmw_user_resource_lookup_handle(struct vmw_private *dev_priv,return ret; } -/** -* vmw_user_resource_noref_lookup_handle - lookup a struct resource from a -* TTM user-space handle and perform basic type checks -* -* @dev_priv: Pointer to a device private struct -* @tfile: Pointer to a struct ttm_object_file identifying the caller -* @handle: The TTM user-space handle -* @converter: Pointer to an object describing the resource type -* -* If the handle can't be found or is associated with an incorrect resource -* type, -EINVAL will be returned. -*/ -struct vmw_resource * -vmw_user_resource_noref_lookup_handle (struct vmw_private *dev_priv, -struct ttm_object_file *tfile, -uint32_t handle, -const struct vmw_user_resource_conv - *converter) -{ -struct ttm_base_object *base; - - base =ttm_base_object_noref_lookup (tfile, handle); -if (!base) -return ERR_PTR (-ESRCH ); - -if (unlikely (ttm_base_object_type (base) != converter->object_type)) { -ttm_base_object_noref_release (); -return ERR_PTR (-EINVAL ); - } - -return converter->base_obj_to_res (base); -} -/* * Helper function that looks either a surface or bo. *
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 148/183 net/sched: act_mpls: Fix warning during failed attribute validation
In reply to Greg Kroah-HartmanFrom: Ido Schimmel <[email protected]>
[ Upstream commit 9e17f99220d111ea031b44153fdfe364b0024ff2 ]
The 'TCA_MPLS_LABEL' attribute is of 'NLA_U32' type, but has a validation type of 'NLA_VALIDATE_FUNCTION'. This is an invalid combination according to the comment above 'struct nla_policy':
"
Meaning of `validate' field, use via NLA_POLICY_VALIDATE_FN:
NLA_BINARY Validation function called for the attribute.
All other Unused - but note that it's a union
"
This can trigger the warning [1] in nla_get_range_unsigned() when validation of the attribute fails. Despite being of 'NLA_U32' type, the associated 'min'/'max' fields in the policy are negative as they are aliased by the 'validate' field.
Fix by changing the attribute type to 'NLA_BINARY' which is consistent with the above comment and all other users of NLA_POLICY_VALIDATE_FN(). As a result, move the length validation to the validation function.
No regressions in MPLS tests:
# ./tdc.py -f tc-tests/actions/mpls.json [...] # echo $? 0
[1]
WARNING: CPU: 0 PID: 17743 at lib/nlattr.c:118 nla_get_range_unsigned+0x1d8/0x1e0 lib/nlattr.c:117 Modules linked in: CPU: 0 PID: 17743 Comm: syz-executor.0 Not tainted 6.1.0-rc8 #3 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-48-gd9c812dda519-prebuilt.qemu.org 04/01/2014 RIP: 0010:nla_get_range_unsigned+0x1d8/0x1e0 lib/nlattr.c:117 [...] Call Trace: <TASK> __netlink_policy_dump_write_attr+0x23d/0x990 net/netlink/policy.c:310 netlink_policy_dump_write_attr+0x22/0x30 net/netlink/policy.c:411 netlink_ack_tlv_fill net/netlink/af_netlink.c:2454 [inline] netlink_ack+0x546/0x760 net/netlink/af_netlink.c:2506 netlink_rcv_skb+0x1b7/0x240 net/netlink/af_netlink.c:2546 rtnetlink_rcv+0x18/0x20 net/core/rtnetlink.c:6109 netlink_unicast_kernel net/netlink/af_netlink.c:1319 [inline] netlink_unicast+0x5e9/0x6b0 net/netlink/af_netlink.c:1345 netlink_sendmsg+0x739/0x860 net/netlink/af_netlink.c:1921 sock_sendmsg_nosec net/socket.c:714 [inline] sock_sendmsg net/socket.c:734 [inline] ____sys_sendmsg+0x38f/0x500 net/socket.c:2482 ___sys_sendmsg net/socket.c:2536 [inline] __sys_sendmsg+0x197/0x230 net/socket.c:2565 __do_sys_sendmsg net/socket.c:2574 [inline] __se_sys_sendmsg net/socket.c:2572 [inline] __x64_sys_sendmsg+0x42/0x50 net/socket.c:2572 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x2b/0x70 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
--- net/sched/act_mpls.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
net/sched/act_mpls.c +7 -1
@@ -132,6 +132,11 @@ static int valid_label(const struct nlattr *attr, {const u32 *label =nla_data (attr); +if (nla_len (attr) !=sizeof (*label)) { +NL_SET_ERR_MSG_MOD (extack,"Invalid MPLS label length" ); +return -EINVAL ; + } +if (*label & ~MPLS_LABEL_MASK || *label ==MPLS_LABEL_IMPLNULL ) {NL_SET_ERR_MSG_MOD (extack,"MPLS label out of range" );return -EINVAL ;
@@ -143,7 +148,8 @@ static int valid_label(const struct nlattr *attr,static const struct nla_policy mpls_policy[TCA_MPLS_MAX +1 ] = { [TCA_MPLS_PARMS ] =NLA_POLICY_EXACT_LEN (sizeof (struct tc_mpls )), [TCA_MPLS_PROTO ] = { .type =NLA_U16 }, - [TCA_MPLS_LABEL ] =NLA_POLICY_VALIDATE_FN (NLA_U32 , valid_label), + [TCA_MPLS_LABEL ] =NLA_POLICY_VALIDATE_FN (NLA_BINARY , + valid_label), [TCA_MPLS_TC ] =NLA_POLICY_RANGE (NLA_U8 ,0 ,7 ), [TCA_MPLS_TTL ] =NLA_POLICY_MIN (NLA_U8 ,1 ), [TCA_MPLS_BOS ] =NLA_POLICY_RANGE (NLA_U8 ,0 ,1 ),
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 149/183 Revert "r8169: disable detection of chip version 36"
In reply to Greg Kroah-HartmanFrom: Heiner Kallweit <[email protected]>
[ Upstream commit 2ea26b4de6f42b74a5f1701de41efa6bc9f12666 ]
This reverts commit 42666b2c452ce87894786aae05e3fad3cfc6cb59.
This chip version seems to be very rare, but it exits in consumer devices, see linked report.
--- drivers/net/ethernet/realtek/r8169_main.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/net/ethernet/realtek/r8169_main.c +1 -4
@@ -1996,10 +1996,7 @@ static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)/* 8168F family. */ { 0x7c8, 0x488, RTL_GIGA_MAC_VER_38 }, -/* It seems this chip version never made it to -* the wild. Let's disable detection. -* { 0x7cf, 0x481, RTL_GIGA_MAC_VER_36 }, -*/ + { 0x7cf, 0x481, RTL_GIGA_MAC_VER_36 }, { 0x7cf, 0x480, RTL_GIGA_MAC_VER_35 }, /* 8168E family. */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 150/183 net/mlx5: check attr pointer validity before dereferencing it
In reply to Greg Kroah-HartmanFrom: Ariel Levkovich <[email protected]>
[ Upstream commit e0bf81bf0d3d4747c146e0bf44774d3d881d7137 ]
Fix attr pointer validity checks after it was already dereferenced.
--- drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +1 -1
@@ -142,7 +142,7 @@ mlx5_eswitch_set_rule_source_port(struct mlx5_eswitch *esw,if (mlx5_esw_indir_table_decap_vport (attr)) vport =mlx5_esw_indir_table_decap_vport (attr); -if (attr && !attr->chain && esw_attr->int_port) +if (!attr->chain && esw_attr && esw_attr->int_port) metadata =mlx5e_tc_int_port_get_metadata_for_match (esw_attr->int_port);else
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 151/183 net/mlx5e: TC, Keep mod hdr actions after mod hdr alloc
In reply to Greg Kroah-HartmanFrom: Ariel Levkovich <[email protected]>
[ Upstream commit 5e72f3f1c558019082cfeedeed73748f35d780c6 ]
When offloading TC NIC rule which has mod_hdr action, the mod_hdr actions list is freed upon mod_hdr allocation.
In the new format of handling multi table actions and CT in particular, the mod_hdr actions list is still relevant when setting the pre and post rules and therefore, freeing the list may cause adding rules which don't set the FTE_ID.
Therefore, the mod_hdr actions list needs to be kept for the pre/post flows as well and should be left for these handler to be freed.
--- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +3 -2
@@ -1283,7 +1283,6 @@ mlx5e_tc_add_nic_flow(struct mlx5e_priv *priv,if (attr->action &MLX5_FLOW_CONTEXT_ACTION_MOD_HDR ) { err =mlx5e_attach_mod_hdr (priv, flow, parse_attr); -mlx5e_mod_hdr_dealloc (&parse_attr->mod_hdr_acts);if (err)return err; }
@@ -1341,8 +1340,10 @@ static void mlx5e_tc_del_nic_flow(struct mlx5e_priv *priv, }mutex_unlock (&tc->t_lock); -if (attr->action &MLX5_FLOW_CONTEXT_ACTION_MOD_HDR ) +if (attr->action &MLX5_FLOW_CONTEXT_ACTION_MOD_HDR ) { +mlx5e_mod_hdr_dealloc (&attr->parse_attr->mod_hdr_acts);mlx5e_detach_mod_hdr (priv, flow); + }if (attr->action &MLX5_FLOW_CONTEXT_ACTION_COUNT )mlx5_fc_destroy (priv->mdev, attr->counter);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 152/183 net/mlx5: Fix command stats access after free
In reply to Greg Kroah-HartmanFrom: Moshe Shemesh <[email protected]>
[ Upstream commit da2e552b469a0cd130ff70a88ccc4139da428a65 ]
Command may fail while driver is reloading and can't accept FW commands till command interface is reinitialized. Such command failure is being logged to command stats. This results in NULL pointer access as command stats structure is being freed and reallocated during mlx5 devlink reload (see kernel log below).
Fix it by making command stats statically allocated on driver probe.
Kernel log:
[ 2394.808802] BUG: unable to handle kernel paging request at 000000000002a9c0 [ 2394.810610] PGD 0 P4D 0 [ 2394.811811] Oops: 0002 [#1] SMP NOPTI ... [ 2394.815482] RIP: 0010:native_queued_spin_lock_slowpath+0x183/0x1d0 ... [ 2394.829505] Call Trace: [ 2394.830667] _raw_spin_lock_irq+0x23/0x26 [ 2394.831858] cmd_status_err+0x55/0x110 [mlx5_core] [ 2394.833020] mlx5_access_reg+0xe7/0x150 [mlx5_core] [ 2394.834175] mlx5_query_port_ptys+0x78/0xa0 [mlx5_core] [ 2394.835337] mlx5e_ethtool_get_link_ksettings+0x74/0x590 [mlx5_core] [ 2394.836454] ? kmem_cache_alloc_trace+0x140/0x1c0 [ 2394.837562] __rh_call_get_link_ksettings+0x33/0x100 [ 2394.838663] ? __rtnl_unlock+0x25/0x50 [ 2394.839755] __ethtool_get_link_ksettings+0x72/0x150 [ 2394.840862] duplex_show+0x6e/0xc0 [ 2394.841963] dev_attr_show+0x1c/0x40 [ 2394.843048] sysfs_kf_seq_show+0x9b/0x100 [ 2394.844123] seq_read+0x153/0x410 [ 2394.845187] vfs_read+0x91/0x140 [ 2394.846226] ksys_read+0x4f/0xb0 [ 2394.847234] do_syscall_64+0x5b/0x1a0 [ 2394.848228] entry_SYSCALL_64_after_hwframe+0x65/0xca
--- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 13 ++----------- include/linux/mlx5/driver.h | 2 +- 2 files changed, 3 insertions(+), 12 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/cmd.c +2 -11
@@ -2177,15 +2177,9 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)return -EINVAL ; } - cmd->stats =kvcalloc (MLX5_CMD_OP_MAX ,sizeof (*cmd->stats),GFP_KERNEL ); -if (!cmd->stats) -return -ENOMEM ; - cmd->pool =dma_pool_create ("mlx5_cmd" ,mlx5_core_dma_dev (dev), size, align,0 ); -if (!cmd->pool) { - err = -ENOMEM ; - goto dma_pool_err; - } +if (!cmd->pool) +return -ENOMEM ; err =alloc_cmd_page (dev, cmd);if (err)
@@ -2269,8 +2263,6 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev) err_free_pool:dma_pool_destroy (cmd->pool); -dma_pool_err: -kvfree (cmd->stats);return err; }
@@ -2283,7 +2275,6 @@ void mlx5_cmd_cleanup(struct mlx5_core_dev *dev)destroy_msg_cache (dev);free_cmd_page (dev, cmd);dma_pool_destroy (cmd->pool); -kvfree (cmd->stats); } void mlx5_cmd_set_state(struct mlx5_core_dev *dev,
include/linux/mlx5/driver.h +1 -1
@@ -315,7 +315,7 @@ struct mlx5_cmd {struct mlx5_cmd_debug dbg;struct cmd_msg_cache cache[MLX5_NUM_COMMAND_CACHES ];int checksum_disabled; -struct mlx5_cmd_stats *stats; +struct mlx5_cmd_stats stats[MLX5_CMD_OP_MAX ]; };struct mlx5_cmd_mailbox {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 153/183 net/mlx5e: Verify dev is present for fix features ndo
In reply to Greg Kroah-HartmanFrom: Roy Novich <[email protected]>
[ Upstream commit ab4b01bfdaa69492fb36484026b0a0f0af02d75a ]
The native NIC port net device instance is being used as Uplink representor. While changing profiles private resources are not available, fix features ndo does not check if the netdev is present. Add driver protection to verify private resources are ready.
--- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +3 -0
@@ -4071,6 +4071,9 @@ static netdev_features_t mlx5e_fix_features(struct net_device *netdev,struct mlx5e_vlan_table *vlan;struct mlx5e_params *params; +if (!netif_device_present (netdev)) +return features; + vlan =mlx5e_fs_get_vlan (priv->fs);mutex_lock (&priv->state_lock); params = &priv->channels.params;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 154/183 net/mlx5e: IPoIB, Block queue count configuration when sub interfaces are present
In reply to Greg Kroah-HartmanFrom: Dragos Tatulea <[email protected]>
[ Upstream commit 806a8df7126a8c05d60411eeb81057c2a8bbe7a7 ]
PKEY sub interfaces share the receive queues with the parent interface. While setting the sub interface queue count is not supported, it is currently possible to change the number of queues of the parent interface. Thus we can end up with inconsistent queue sizes between the parent and its sub interfaces.
This change disallows setting the queue count on the parent interface when sub interfaces are present.
This is achieved by introducing an explicit reference to the parent netdev in the mlx5i_priv of the child interface. An additional counter is also required on the parent side to detect when sub interfaces are attached and for proper cleanup.
The rtnl lock is taken during the ethtool op and the sub interface ndo_init/uninit ops. There is no race here around counting the sub interfaces, reading the sub interfaces and setting the number of channels. The ASSERT_RTNL was added to document that.
--- .../mellanox/mlx5/core/ipoib/ethtool.c | 16 +++++++- .../ethernet/mellanox/mlx5/core/ipoib/ipoib.c | 38 +++++++++++++++++++ .../ethernet/mellanox/mlx5/core/ipoib/ipoib.h | 6 +++ .../mellanox/mlx5/core/ipoib/ipoib_vlan.c | 9 ++--- 4 files changed, 62 insertions(+), 7 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ethtool.c +14 -2
@@ -90,9 +90,21 @@ static void mlx5i_get_ringparam(struct net_device *dev,static int mlx5i_set_channels (struct net_device *dev,struct ethtool_channels *ch) { -struct mlx5e_priv *priv =mlx5i_epriv (dev); +struct mlx5i_priv *ipriv =netdev_priv (dev); +struct mlx5e_priv *epriv =mlx5i_epriv (dev); + +/* rtnl lock protects from race between this ethtool op and sub +* interface ndo_init/uninit. +*/ +ASSERT_RTNL (); +if (ipriv->num_sub_interfaces >0 ) { +mlx5_core_warn (epriv->mdev, +"can't change number of channels for interfaces with sub interfaces (%u)\n" , + ipriv->num_sub_interfaces); +return -EINVAL ; + } -return mlx5e_ethtool_set_channels (priv, ch); +return mlx5e_ethtool_set_channels (epriv, ch); } static void mlx5i_get_channels(struct net_device *dev,
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c +38 -0
@@ -160,6 +160,44 @@ void mlx5i_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats) stats->tx_dropped = sstats->tx_queue_dropped; } +struct net_device *mlx5i_parent_get (struct net_device *netdev) +{ +struct mlx5e_priv *priv =mlx5i_epriv (netdev); +struct mlx5i_priv *ipriv, *parent_ipriv; +struct net_device *parent_dev; +int parent_ifindex; + + ipriv = priv->ppriv; + + parent_ifindex = netdev->netdev_ops->ndo_get_iflink (netdev); + parent_dev =dev_get_by_index (dev_net (netdev), parent_ifindex); +if (!parent_dev) +return NULL ; + + parent_ipriv =netdev_priv (parent_dev); + +ASSERT_RTNL (); + parent_ipriv->num_sub_interfaces++; + + ipriv->parent_dev = parent_dev; + +return parent_dev; +} + +void mlx5i_parent_put (struct net_device *netdev) +{ +struct mlx5e_priv *priv =mlx5i_epriv (netdev); +struct mlx5i_priv *ipriv, *parent_ipriv; + + ipriv = priv->ppriv; + parent_ipriv =netdev_priv (ipriv->parent_dev); + +ASSERT_RTNL (); + parent_ipriv->num_sub_interfaces--; + +dev_put (ipriv->parent_dev); +} +int mlx5i_init_underlay_qp (struct mlx5e_priv *priv) {struct mlx5_core_dev *mdev = priv->mdev;
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h +6 -0
@@ -54,9 +54,11 @@ struct mlx5i_priv {struct rdma_netdev rn;/* keep this first */ u32 qpn;bool sub_interface; +u32 num_sub_interfaces;u32 qkey;u16 pkey_index;struct mlx5i_pkey_qpn_ht *qpn_htbl; +struct net_device *parent_dev;char *mlx5e_priv[]; };
@@ -117,5 +119,9 @@ void mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb, struct mlx5_av *av, u32 dqpn, u32 dqkey, bool xmit_more);void mlx5i_get_stats (struct net_device *dev,struct rtnl_link_stats64 *stats); +/* Reference management for child to parent interfaces. */ +struct net_device *mlx5i_parent_get (struct net_device *netdev); +void mlx5i_parent_put (struct net_device *netdev); +#endif /* CONFIG_MLX5_CORE_IPOIB */ #endif /* __MLX5E_IPOB_H__ */
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c +4 -5
@@ -158,21 +158,19 @@ static int mlx5i_pkey_dev_init(struct net_device *dev)struct mlx5e_priv *priv =mlx5i_epriv (dev);struct mlx5i_priv *ipriv, *parent_ipriv;struct net_device *parent_dev; -int parent_ifindex; ipriv = priv->ppriv; -/* Get QPN to netdevice hash table from parent */ - parent_ifindex = dev->netdev_ops->ndo_get_iflink (dev); - parent_dev =dev_get_by_index (dev_net (dev), parent_ifindex); +/* Link to parent */ + parent_dev =mlx5i_parent_get (dev);if (!parent_dev) {mlx5_core_warn (priv->mdev,"failed to get parent device\n" );return -EINVAL ; } +/* Get QPN to netdevice hash table from parent */ parent_ipriv =netdev_priv (parent_dev); ipriv->qpn_htbl = parent_ipriv->qpn_htbl; -dev_put (parent_dev);return mlx5i_dev_init (dev); }
@@ -184,6 +182,7 @@ static int mlx5i_pkey_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)static void mlx5i_pkey_dev_cleanup (struct net_device *netdev) { +mlx5i_parent_put (netdev);return mlx5i_dev_cleanup (netdev); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 155/183 net/mlx5e: IPoIB, Block PKEY interfaces with less rx queues than parent
In reply to Greg Kroah-HartmanFrom: Dragos Tatulea <[email protected]>
[ Upstream commit 31c70bfe58ef09fe36327ddcced9143a16e9e83d ]
A user is able to configure an arbitrary number of rx queues when creating an interface via netlink. This doesn't work for child PKEY interfaces because the child interface uses the parent receive channels.
Although the child shares the parent's receive channels, the number of rx queues is important for the channel_stats array: the parent's rx channel index is used to access the child's channel_stats. So the array has to be at least as large as the parent's rx queue size for the counting to work correctly and to prevent out of bound accesses.
This patch checks for the mentioned scenario and returns an error when trying to create the interface. The error is propagated to the user.
--- .../net/ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c +9 -0
@@ -168,6 +168,15 @@ static int mlx5i_pkey_dev_init(struct net_device *dev)return -EINVAL ; } +if (dev->num_rx_queues < parent_dev->real_num_rx_queues) { +mlx5_core_warn (priv->mdev, +"failed to create child device with rx queues [%d] less than parent's [%d]\n" , + dev->num_rx_queues, + parent_dev->real_num_rx_queues); +mlx5i_parent_put (dev); +return -EINVAL ; + } +/* Get QPN to netdevice hash table from parent */ parent_ipriv =netdev_priv (parent_dev); ipriv->qpn_htbl = parent_ipriv->qpn_htbl;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 156/183 net/mlx5e: IPoIB, Fix child PKEY interface stats on rx path
In reply to Greg Kroah-HartmanFrom: Dragos Tatulea <[email protected]>
[ Upstream commit b5e23931c45a2f99f60a2f2b98a9e4d5a62a5b13 ]
The current code always does the accounting using the stats from the parent interface (linked in the rq). This doesn't work when there are child interfaces configured.
Fix this behavior by always using the stats from the child interface priv. This will also work for parent only
interfaces: the child (netdev) and parent netdev (rq->netdev) will point to the same thing.
--- drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +1 -1
@@ -2300,7 +2300,7 @@ static inline void mlx5i_complete_rx_cqe(struct mlx5e_rq *rq, priv =mlx5i_epriv (netdev); tstamp = &priv->tstamp; - stats = rq->stats; + stats = &priv->channel_stats[rq->ix]->rq; flags_rqpn =be32_to_cpu (cqe->flags_rqpn); g = (flags_rqpn >>28 ) &3 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 157/183 net/mlx5: Fix ptp max frequency adjustment range
In reply to Greg Kroah-HartmanFrom: Rahul Rameshbabu <[email protected]>
[ Upstream commit fe91d57277eef8bb4aca05acfa337b4a51d0bba4 ]
.max_adj of ptp_clock_info acts as an absolute value for the amount in ppb that can be set for a single call of .adjfine. This means that a single call to .getfine cannot be greater than .max_adj or less than -(.max_adj). Provides correct value for max frequency adjustment value supported by devices.
--- drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c +1 -1
@@ -691,7 +691,7 @@ static int mlx5_ptp_verify(struct ptp_clock_info *ptp, unsigned int pin,static const struct ptp_clock_info mlx5_ptp_clock_info = { .owner =THIS_MODULE , .name ="mlx5_ptp" , - .max_adj =100000000 , + .max_adj =50000000 , .n_alarm =0 , .n_ext_ts =0 , .n_per_out =0 ,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 158/183 net/mlx5e: Dont support encap rules with gbp option
In reply to Greg Kroah-HartmanFrom: Gavin Li <[email protected]>
[ Upstream commit d515d63cae2cd186acf40deaa8ef33067bb7f637 ]
Previously, encap rules with gbp option would be offloaded by mistake but driver does not support gbp option offload.
To fix this issue, check if the encap rule has gbp option and don't offload the rule
--- drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_vxlan.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_vxlan.c +2 -0
@@ -88,6 +88,8 @@ static int mlx5e_gen_ip_tunnel_header_vxlan(char buf[],struct udphdr *udp = (struct udphdr *)(buf);struct vxlanhdr *vxh; +if (tun_key->tun_flags &TUNNEL_VXLAN_OPT ) +return -EOPNOTSUPP ; vxh = (struct vxlanhdr *)((char *)udp +sizeof (struct udphdr )); *ip_proto =IPPROTO_UDP ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 159/183 net/mlx5e: Fix macsec ssci attribute handling in offload path
In reply to Greg Kroah-HartmanFrom: Emeel Hakim <[email protected]>
[ Upstream commit f5e1ed04aa2ea665a796f0109091ca3f2b01024a ]
Currently when macsec offload is set with extended packet number (epn) enabled, the driver wrongly deduce the short secure channel identifier (ssci) from the salt instead of the stand alone ssci attribute as it should, consequently creating a mismatch between the kernel and driver's ssci values.
Fix by using the ssci value from the relevant attribute.
--- .../net/ethernet/mellanox/mlx5/core/en_accel/macsec.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c +7 -3
@@ -62,6 +62,7 @@ struct mlx5e_macsec_sa {u32 enc_key_id;u32 next_pn;sci_t sci; +ssci_t ssci;salt_t salt;struct rhash_head hash;
@@ -499,10 +500,11 @@ mlx5e_macsec_get_macsec_device_context(const struct mlx5e_macsec *macsec, }static void update_macsec_epn (struct mlx5e_macsec_sa *sa,const struct macsec_key *key, -const pn_t *next_pn_halves) +const pn_t *next_pn_halves,ssci_t ssci) {struct mlx5e_macsec_epn_state *epn_state = &sa->epn_state; + sa->ssci = ssci; sa->salt = key->salt; epn_state->epn_enabled =1 ; epn_state->epn_msb = next_pn_halves->upper;
@@ -550,7 +552,8 @@ static int mlx5e_macsec_add_txsa(struct macsec_context *ctx) tx_sa->assoc_num = assoc_num;if (secy->xpn) -update_macsec_epn (tx_sa, &ctx_tx_sa->key, &ctx_tx_sa->next_pn_halves); +update_macsec_epn (tx_sa, &ctx_tx_sa->key, &ctx_tx_sa->next_pn_halves, + ctx_tx_sa->ssci); err = mlx5_create_encryption_key(mdev, ctx->sa.key, secy->key_len, MLX5_ACCEL_OBJ_MACSEC_KEY,
@@ -945,7 +948,8 @@ static int mlx5e_macsec_add_rxsa(struct macsec_context *ctx) rx_sa->fs_id = rx_sc->sc_xarray_element->fs_id;if (ctx->secy->xpn) -update_macsec_epn (rx_sa, &ctx_rx_sa->key, &ctx_rx_sa->next_pn_halves); +update_macsec_epn (rx_sa, &ctx_rx_sa->key, &ctx_rx_sa->next_pn_halves, + ctx_rx_sa->ssci); err = mlx5_create_encryption_key(mdev, ctx->sa.key, ctx->secy->key_len, MLX5_ACCEL_OBJ_MACSEC_KEY,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 160/183 net/mlx5e: Fix macsec possible null dereference when updating MAC security entity (SecY)
In reply to Greg Kroah-HartmanFrom: Emeel Hakim <[email protected]>
[ Upstream commit 9828994ac492e8e7de47fe66097b7e665328f348 ]
Upon updating MAC security entity (SecY) in hw offload path, the macsec security association (SA) initialization routine is called. In case of extended packet number (epn) is enabled the salt and ssci attributes are retrieved using the MACsec driver rx_sa context which is unavailable when updating a SecY property such as encoding-sa hence the null dereference. Fix by using the provided SA to set those attributes.
--- .../net/ethernet/mellanox/mlx5/core/en_accel/macsec.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c +2 -7
@@ -359,7 +359,6 @@ static int mlx5e_macsec_init_sa(struct macsec_context *ctx,struct mlx5_core_dev *mdev = priv->mdev;struct mlx5_macsec_obj_attrs obj_attrs;union mlx5e_macsec_rule *macsec_rule; -struct macsec_key *key;int err; obj_attrs.next_pn = sa->next_pn;
@@ -369,13 +368,9 @@ static int mlx5e_macsec_init_sa(struct macsec_context *ctx, obj_attrs.aso_pdn = macsec->aso.pdn; obj_attrs.epn_state = sa->epn_state; - key = (is_tx) ? &ctx->sa.tx_sa->key : &ctx->sa.rx_sa->key; -if (sa->epn_state.epn_enabled) { - obj_attrs.ssci = (is_tx) ?cpu_to_be32 ((__force u32 )ctx->sa.tx_sa->ssci) : -cpu_to_be32 ((__force u32 )ctx->sa.rx_sa->ssci); - -memcpy (&obj_attrs.salt, &key->salt,sizeof (key->salt)); + obj_attrs.ssci =cpu_to_be32 ((__force u32 )sa->ssci); +memcpy (&obj_attrs.salt, &sa->salt,sizeof (sa->salt)); } obj_attrs.replay_window = ctx->secy->replay_window;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 161/183 selftests/net: l2_tos_ttl_inherit.sh: Set IPv6 addresses with "nodad".
In reply to Greg Kroah-HartmanFrom: Guillaume Nault <[email protected]>
[ Upstream commit e59370b2e96eb8e7e057a2a16e999ff385a3f2fb ]
The ping command can run before DAD completes. In that case, ping may fail and break the selftest.
We don't need DAD here since we're working on isolated device pairs.
--- tools/testing/selftests/net/l2_tos_ttl_inherit.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/testing/selftests/net/l2_tos_ttl_inherit.sh +4 -4
@@ -137,8 +137,8 @@ setup() { if [ "$type" = "gre" ]; then type="ip6gretap" fi - ip addr add fdd1:ced0:5d88:3fce::1/64 dev veth0 - $ns ip addr add fdd1:ced0:5d88:3fce::2/64 dev veth1 + ip addr add fdd1:ced0:5d88:3fce::1/64 dev veth0 nodad + $ns ip addr add fdd1:ced0:5d88:3fce::2/64 dev veth1 nodad ip link add name tep0 type $type $local_addr1 \ remote fdd1:ced0:5d88:3fce::2 tos $test_tos ttl $test_ttl \ $vxlan $geneve
@@ -170,8 +170,8 @@ setup() { ip addr add 198.19.0.1/24 brd + dev ${parent}0 $ns ip addr add 198.19.0.2/24 brd + dev ${parent}1 elif [ "$inner" = "6" ]; then - ip addr add fdd4:96cf:4eae:443b::1/64 dev ${parent}0 - $ns ip addr add fdd4:96cf:4eae:443b::2/64 dev ${parent}1 + ip addr add fdd4:96cf:4eae:443b::1/64 dev ${parent}0 nodad + $ns ip addr add fdd4:96cf:4eae:443b::2/64 dev ${parent}1 nodad fi }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 162/183 selftests/net: l2_tos_ttl_inherit.sh: Run tests in their own netns.
In reply to Greg Kroah-HartmanFrom: Guillaume Nault <[email protected]>
[ Upstream commit c53cb00f7983a5474f2d36967f84908b85af9159 ]
This selftest currently runs half in the current namespace and half in a netns of its own. Therefore, the test can fail if the current namespace is already configured with incompatible parameters (for example if it already has a veth0 interface).
Adapt the script to put both ends of the veth pair in their own netns. Now veth0 is created in NS0 instead of the current namespace, while veth1 is set up in NS1 (instead of the 'testing' netns).
The user visible netns names are randomised to minimise the risk of conflicts with already existing namespaces. The cleanup() function doesn't need to remove the virtual interface anymore: deleting NS0 and NS1 automatically removes the virtual interfaces they contained.
We can remove $ns, which was only used to run ip commands in the 'testing' netns (let's use the builtin "-netns" option instead). However, we still need a similar functionality as ping and tcpdump now need to run in NS0. So we now have $RUN_NS0 for that.
--- .../selftests/net/l2_tos_ttl_inherit.sh | 162 ++++++++++-------- 1 file changed, 93 insertions(+), 69 deletions(-)
tools/testing/selftests/net/l2_tos_ttl_inherit.sh +93 -69
@@ -25,6 +25,11 @@ expected_tos="0x00" expected_ttl="0" failed=false +readonly NS0=$(mktemp -u ns0-XXXXXXXX) +readonly NS1=$(mktemp -u ns1-XXXXXXXX) + +RUN_NS0="ip netns exec ${NS0}" + get_random_tos() { # Get a random hex tos value between 0x00 and 0xfc, a multiple of 4 echo "0x$(tr -dc '0-9a-f' < /dev/urandom | head -c 1)\
@@ -61,7 +66,6 @@ setup() { local vlan="$5" local test_tos="0x00" local test_ttl="0" - local ns="ip netns exec testing" # We don't want a test-tos of 0x00, # because this is the value that we get when no tos is set.
@@ -94,14 +98,15 @@ setup() { printf "│%7s │%6s │%6s │%13s │%13s │%6s │" \ "$type" "$outer" "$inner" "$tos" "$ttl" "$vlan" - # Create 'testing' netns, veth pair and connect main ns with testing ns - ip netns add testing - ip link add type veth - ip link set veth1 netns testing - ip link set veth0 up - $ns ip link set veth1 up - ip addr flush dev veth0 - $ns ip addr flush dev veth1 + # Create netns NS0 and NS1 and connect them with a veth pair + ip netns add "${NS0}" + ip netns add "${NS1}" + ip link add name veth0 netns "${NS0}" type veth \ + peer name veth1 netns "${NS1}" + ip -netns "${NS0}" link set dev veth0 up + ip -netns "${NS1}" link set dev veth1 up + ip -netns "${NS0}" address flush dev veth0 + ip -netns "${NS1}" address flush dev veth1 local local_addr1="" local local_addr2=""
@@ -127,51 +132,59 @@ setup() { if [ "$type" = "gre" ]; then type="gretap" fi - ip addr add 198.18.0.1/24 dev veth0 - $ns ip addr add 198.18.0.2/24 dev veth1 - ip link add name tep0 type $type $local_addr1 remote \ - 198.18.0.2 tos $test_tos ttl $test_ttl $vxlan $geneve - $ns ip link add name tep1 type $type $local_addr2 remote \ - 198.18.0.1 tos $test_tos ttl $test_ttl $vxlan $geneve + ip -netns "${NS0}" address add 198.18.0.1/24 dev veth0 + ip -netns "${NS1}" address add 198.18.0.2/24 dev veth1 + ip -netns "${NS0}" link add name tep0 type $type $local_addr1 \ + remote 198.18.0.2 tos $test_tos ttl $test_ttl \ + $vxlan $geneve + ip -netns "${NS1}" link add name tep1 type $type $local_addr2 \ + remote 198.18.0.1 tos $test_tos ttl $test_ttl \ + $vxlan $geneve elif [ "$outer" = "6" ]; then if [ "$type" = "gre" ]; then type="ip6gretap" fi - ip addr add fdd1:ced0:5d88:3fce::1/64 dev veth0 nodad - $ns ip addr add fdd1:ced0:5d88:3fce::2/64 dev veth1 nodad - ip link add name tep0 type $type $local_addr1 \ - remote fdd1:ced0:5d88:3fce::2 tos $test_tos ttl $test_ttl \ - $vxlan $geneve - $ns ip link add name tep1 type $type $local_addr2 \ - remote fdd1:ced0:5d88:3fce::1 tos $test_tos ttl $test_ttl \ - $vxlan $geneve + ip -netns "${NS0}" address add fdd1:ced0:5d88:3fce::1/64 \ + dev veth0 nodad + ip -netns "${NS1}" address add fdd1:ced0:5d88:3fce::2/64 \ + dev veth1 nodad + ip -netns "${NS0}" link add name tep0 type $type $local_addr1 \ + remote fdd1:ced0:5d88:3fce::2 tos $test_tos \ + ttl $test_ttl $vxlan $geneve + ip -netns "${NS1}" link add name tep1 type $type $local_addr2 \ + remote fdd1:ced0:5d88:3fce::1 tos $test_tos \ + ttl $test_ttl $vxlan $geneve fi # Bring L2-tunnel link up and create VLAN on top - ip link set tep0 up - $ns ip link set tep1 up - ip addr flush dev tep0 - $ns ip addr flush dev tep1 + ip -netns "${NS0}" link set tep0 up + ip -netns "${NS1}" link set tep1 up + ip -netns "${NS0}" address flush dev tep0 + ip -netns "${NS1}" address flush dev tep1 local parent if $vlan; then parent="vlan99-" - ip link add link tep0 name ${parent}0 type vlan id 99 - $ns ip link add link tep1 name ${parent}1 type vlan id 99 - ip link set ${parent}0 up - $ns ip link set ${parent}1 up - ip addr flush dev ${parent}0 - $ns ip addr flush dev ${parent}1 + ip -netns "${NS0}" link add link tep0 name ${parent}0 \ + type vlan id 99 + ip -netns "${NS1}" link add link tep1 name ${parent}1 \ + type vlan id 99 + ip -netns "${NS0}" link set dev ${parent}0 up + ip -netns "${NS1}" link set dev ${parent}1 up + ip -netns "${NS0}" address flush dev ${parent}0 + ip -netns "${NS1}" address flush dev ${parent}1 else parent="tep" fi # Assign inner IPv4/IPv6 addresses if [ "$inner" = "4" ] || [ "$inner" = "other" ]; then - ip addr add 198.19.0.1/24 brd + dev ${parent}0 - $ns ip addr add 198.19.0.2/24 brd + dev ${parent}1 + ip -netns "${NS0}" address add 198.19.0.1/24 brd + dev ${parent}0 + ip -netns "${NS1}" address add 198.19.0.2/24 brd + dev ${parent}1 elif [ "$inner" = "6" ]; then - ip addr add fdd4:96cf:4eae:443b::1/64 dev ${parent}0 nodad - $ns ip addr add fdd4:96cf:4eae:443b::2/64 dev ${parent}1 nodad + ip -netns "${NS0}" address add fdd4:96cf:4eae:443b::1/64 \ + dev ${parent}0 nodad + ip -netns "${NS1}" address add fdd4:96cf:4eae:443b::2/64 \ + dev ${parent}1 nodad fi }
@@ -192,10 +205,10 @@ verify() { ping_dst="198.19.0.3" # Generates ARPs which are not IPv4/IPv6 fi if [ "$tos_ttl" = "inherit" ]; then - ping -i 0.1 $ping_dst -Q "$expected_tos" -t "$expected_ttl" \ - 2>/dev/null 1>&2 & ping_pid="$!" + ${RUN_NS0} ping -i 0.1 $ping_dst -Q "$expected_tos" \ + -t "$expected_ttl" 2>/dev/null 1>&2 & ping_pid="$!" else - ping -i 0.1 $ping_dst 2>/dev/null 1>&2 & ping_pid="$!" + ${RUN_NS0} ping -i 0.1 $ping_dst 2>/dev/null 1>&2 & ping_pid="$!" fi local tunnel_type_offset tunnel_type_proto req_proto_offset req_offset if [ "$type" = "gre" ]; then
@@ -216,10 +229,12 @@ verify() { req_proto_offset="$((req_proto_offset + 4))" req_offset="$((req_offset + 4))" fi - out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ - ip[$tunnel_type_offset] = $tunnel_type_proto and \ - ip[$req_proto_offset] = 0x01 and \ - ip[$req_offset] = 0x08 2>/dev/null | head -n 1)" + out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \ + -i veth0 -n \ + ip[$tunnel_type_offset] = $tunnel_type_proto and \ + ip[$req_proto_offset] = 0x01 and \ + ip[$req_offset] = 0x08 2>/dev/null \ + | head -n 1)" elif [ "$inner" = "6" ]; then req_proto_offset="44" req_offset="78"
@@ -231,10 +246,12 @@ verify() { req_proto_offset="$((req_proto_offset + 4))" req_offset="$((req_offset + 4))" fi - out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ - ip[$tunnel_type_offset] = $tunnel_type_proto and \ - ip[$req_proto_offset] = 0x3a and \ - ip[$req_offset] = 0x80 2>/dev/null | head -n 1)" + out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \ + -i veth0 -n \ + ip[$tunnel_type_offset] = $tunnel_type_proto and \ + ip[$req_proto_offset] = 0x3a and \ + ip[$req_offset] = 0x80 2>/dev/null \ + | head -n 1)" elif [ "$inner" = "other" ]; then req_proto_offset="36" req_offset="45"
@@ -250,11 +267,13 @@ verify() { expected_tos="0x00" expected_ttl="64" fi - out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ - ip[$tunnel_type_offset] = $tunnel_type_proto and \ - ip[$req_proto_offset] = 0x08 and \ - ip[$((req_proto_offset + 1))] = 0x06 and \ - ip[$req_offset] = 0x01 2>/dev/null | head -n 1)" + out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \ + -i veth0 -n \ + ip[$tunnel_type_offset] = $tunnel_type_proto and \ + ip[$req_proto_offset] = 0x08 and \ + ip[$((req_proto_offset + 1))] = 0x06 and \ + ip[$req_offset] = 0x01 2>/dev/null \ + | head -n 1)" fi elif [ "$outer" = "6" ]; then if [ "$type" = "gre" ]; then
@@ -273,10 +292,12 @@ verify() { req_proto_offset="$((req_proto_offset + 4))" req_offset="$((req_offset + 4))" fi - out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ - ip6[$tunnel_type_offset] = $tunnel_type_proto and \ - ip6[$req_proto_offset] = 0x01 and \ - ip6[$req_offset] = 0x08 2>/dev/null | head -n 1)" + out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \ + -i veth0 -n \ + ip6[$tunnel_type_offset] = $tunnel_type_proto and \ + ip6[$req_proto_offset] = 0x01 and \ + ip6[$req_offset] = 0x08 2>/dev/null \ + | head -n 1)" elif [ "$inner" = "6" ]; then local req_proto_offset="72" local req_offset="106"
@@ -288,10 +309,12 @@ verify() { req_proto_offset="$((req_proto_offset + 4))" req_offset="$((req_offset + 4))" fi - out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ - ip6[$tunnel_type_offset] = $tunnel_type_proto and \ - ip6[$req_proto_offset] = 0x3a and \ - ip6[$req_offset] = 0x80 2>/dev/null | head -n 1)" + out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \ + -i veth0 -n \ + ip6[$tunnel_type_offset] = $tunnel_type_proto and \ + ip6[$req_proto_offset] = 0x3a and \ + ip6[$req_offset] = 0x80 2>/dev/null \ + | head -n 1)" elif [ "$inner" = "other" ]; then local req_proto_offset="64" local req_offset="73"
@@ -307,11 +330,13 @@ verify() { expected_tos="0x00" expected_ttl="64" fi - out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ - ip6[$tunnel_type_offset] = $tunnel_type_proto and \ - ip6[$req_proto_offset] = 0x08 and \ - ip6[$((req_proto_offset + 1))] = 0x06 and \ - ip6[$req_offset] = 0x01 2>/dev/null | head -n 1)" + out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \ + -i veth0 -n \ + ip6[$tunnel_type_offset] = $tunnel_type_proto and \ + ip6[$req_proto_offset] = 0x08 and \ + ip6[$((req_proto_offset + 1))] = 0x06 and \ + ip6[$req_offset] = 0x01 2>/dev/null \ + | head -n 1)" fi fi kill -9 $ping_pid
@@ -351,9 +376,8 @@ verify() { } cleanup() { - ip link del veth0 2>/dev/null - ip netns del testing 2>/dev/null - ip link del tep0 2>/dev/null + ip netns del "${NS0}" 2>/dev/null + ip netns del "${NS1}" 2>/dev/null } printf "┌────────┬───────┬───────┬──────────────┬"
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 163/183 selftests/net: l2_tos_ttl_inherit.sh: Ensure environment cleanup on failure.
In reply to Greg Kroah-HartmanFrom: Guillaume Nault <[email protected]>
[ Upstream commit d68ff8ad3351b8fc8d6f14b9a4f5cc8ba3e8bd13 ]
Use 'set -e' and an exit handler to stop the script if a command fails and ensure the test environment is cleaned up in any case. Also, handle the case where the script is interrupted by SIGINT.
The only command that's expected to fail is 'wait $ping_pid', since it's killed by the script. Handle this case with '|| true' to make it play well with 'set -e'.
Finally, return the Kselftest SKIP code (4) when the script breaks because of an environment problem or a command line failure. The 0 and 1 return codes should now reliably indicate that all tests have been run (0: all tests run and passed, 1: all tests run but at least one failed, 4: test script didn't run completely).
--- .../selftests/net/l2_tos_ttl_inherit.sh | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-)
tools/testing/selftests/net/l2_tos_ttl_inherit.sh +36 -4
@@ -12,13 +12,16 @@ # In addition this script also checks if forcing a specific field in the # outer header is working. +# Return 4 by default (Kselftest SKIP code) +ERR=4 + if [ "$(id -u)" != "0" ]; then echo "Please run as root." - exit 0 + exit $ERR fi if ! which tcpdump > /dev/null 2>&1; then echo "No tcpdump found. Required for this test." - exit 0 + exit $ERR fi expected_tos="0x00"
@@ -340,7 +343,7 @@ verify() { fi fi kill -9 $ping_pid - wait $ping_pid 2>/dev/null + wait $ping_pid 2>/dev/null || true result="FAIL" if [ "$outer" = "4" ]; then captured_ttl="$(get_field "ttl" "$out")"
@@ -380,6 +383,31 @@ cleanup() { ip netns del "${NS1}" 2>/dev/null } +exit_handler() { + # Don't exit immediately if one of the intermediate commands fails. + # We might be called at the end of the script, when the network + # namespaces have already been deleted. So cleanup() may fail, but we + # still need to run until 'exit $ERR' or the script won't return the + # correct error code. + set +e + + cleanup + + exit $ERR +} + +# Restore the default SIGINT handler (just in case) and exit. +# The exit handler will take care of cleaning everything up. +interrupted() { + trap - INT + + exit $ERR +} + +set -e +trap exit_handler EXIT +trap interrupted INT + printf "┌────────┬───────┬───────┬──────────────┬" printf "──────────────┬───────┬────────┐\n" for type in gre vxlan geneve; do
@@ -409,6 +437,10 @@ done printf "└────────┴───────┴───────┴──────────────┴" printf "──────────────┴───────┴────────┘\n" +# All tests done. +# Set ERR appropriately: it will be returned by the exit handler. if $failed; then - exit 1 + ERR=1 +else + ERR=0 fi
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 164/183 octeontx2-pf: Fix resource leakage in VF driver unbind
In reply to Greg Kroah-HartmanFrom: Hariprasad Kelam <[email protected]>
[ Upstream commit 53da7aec32982f5ee775b69dce06d63992ce4af3 ]
resources allocated like mcam entries to support the Ntuple feature and hash tables for the tc feature are not getting freed in driver unbind. This patch fixes the issue.
--- drivers/net/ethernet/marvell/octeontx2/nic/otx2_vf.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_vf.c +2 -0
@@ -758,6 +758,8 @@ static void otx2vf_remove(struct pci_dev *pdev)if (vf->otx2_wq)destroy_workqueue (vf->otx2_wq);otx2_ptp_destroy (vf); +otx2_mcam_flow_del (vf); +otx2_shutdown_tc (vf);otx2vf_disable_mbox_intr (vf);otx2_detach_resources (&vf->mbox);if (test_bit (CN10K_LMTST , &vf->hw.cap_flag))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 165/183 perf build: Properly guard libbpf includes
In reply to Greg Kroah-HartmanFrom: Ian Rogers <[email protected]>
[ Upstream commit d891f2b724b39a2a41e3ad7b57110193993242ff ]
Including libbpf header files should be guarded by HAVE_LIBBPF_SUPPORT. In bpf_counter.h, move the skeleton utilities under HAVE_BPF_SKEL.
--- tools/perf/builtin-trace.c | 2 ++ tools/perf/util/bpf_counter.h | 6 ++++++ 2 files changed, 8 insertions(+)
tools/perf/builtin-trace.c +2 -0
@@ -17,7 +17,9 @@#include "util/record.h" #include <traceevent/event-parse.h> #include <api/fs/tracing_path.h> +#ifdef HAVE_LIBBPF_SUPPORT #include <bpf/bpf.h> +#endif #include "util/bpf_map.h" #include "util/rlimit.h" #include "builtin.h"
tools/perf/util/bpf_counter.h +6 -0
@@ -4,9 +4,12 @@#include <linux/list.h> #include <sys/resource.h> + +#ifdef HAVE_LIBBPF_SUPPORT #include <bpf/bpf.h> #include <bpf/btf.h> #include <bpf/libbpf.h> +#endif struct evsel ;struct target ;
@@ -87,6 +90,8 @@ static inline void set_max_rlimit(void)setrlimit (RLIMIT_MEMLOCK , &rinf); } +#ifdef HAVE_BPF_SKEL +static inline __u32 bpf_link_get_id (int fd) {struct bpf_link_info link_info = { .id =0 , };
@@ -127,5 +132,6 @@ static inline int bperf_trigger_reading(int prog_fd, int cpu)return bpf_prog_test_run_opts (prog_fd, &opts); } +#endif /* HAVE_BPF_SKEL */ #endif /* __PERF_BPF_COUNTER_H */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 166/183 perf kmem: Support legacy tracepoints
In reply to Greg Kroah-HartmanFrom: Leo Yan <[email protected]>
[ Upstream commit b3719108ae60169eda5c941ca5e1be1faa371c57 ]
Commit 11e9734bcb6a7361 ("mm/slab_common: unify NUMA and UMA version of tracepoints") removed tracepoints 'kmalloc_node' and 'kmem_cache_alloc_node', we need to consider the tool should be backward compatible.
If it detect the tracepoint "kmem:kmalloc_node", this patch enables the legacy tracepoints, otherwise, it will ignore them.
--- tools/perf/builtin-kmem.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-)
tools/perf/builtin-kmem.c +26 -3
@@ -1823,6 +1823,19 @@ static int parse_line_opt(const struct option *opt __maybe_unused,return 0 ; } +static bool slab_legacy_tp_is_exposed (void ) +{ +/* +* The tracepoints "kmem:kmalloc_node" and +* "kmem:kmem_cache_alloc_node" have been removed on the latest +* kernel, if the tracepoint "kmem:kmalloc_node" is existed it +* means the tool is running on an old kernel, we need to +* rollback to support these legacy tracepoints. +*/ +return IS_ERR (trace_event__tp_format ("kmem" ,"kmalloc_node" )) ? + false : true; +} +static int __cmd_record (int argc,const char **argv) {const char *const record_args[] = {
@@ -1830,22 +1843,28 @@ static int __cmd_record(int argc, const char **argv) };const char *const slab_events[] = {"-e" ,"kmem:kmalloc" , -"-e" ,"kmem:kmalloc_node" ,"-e" ,"kmem:kfree" ,"-e" ,"kmem:kmem_cache_alloc" , -"-e" ,"kmem:kmem_cache_alloc_node" ,"-e" ,"kmem:kmem_cache_free" , }; +const char *const slab_legacy_events[] = { +"-e" ,"kmem:kmalloc_node" , +"-e" ,"kmem:kmem_cache_alloc_node" , + };const char *const page_events[] = {"-e" ,"kmem:mm_page_alloc" ,"-e" ,"kmem:mm_page_free" , };unsigned int rec_argc, i, j;const char **rec_argv; +unsigned int slab_legacy_tp_exposed =slab_legacy_tp_is_exposed (); rec_argc =ARRAY_SIZE (record_args) + argc -1 ; -if (kmem_slab) +if (kmem_slab) { rec_argc +=ARRAY_SIZE (slab_events); +if (slab_legacy_tp_exposed) + rec_argc +=ARRAY_SIZE (slab_legacy_events); + }if (kmem_page) rec_argc +=ARRAY_SIZE (page_events) +1 ;/* for -g */
@@ -1860,6 +1879,10 @@ static int __cmd_record(int argc, const char **argv)if (kmem_slab) {for (j =0 ; j <ARRAY_SIZE (slab_events); j++, i++) rec_argv[i] =strdup (slab_events[j]); +if (slab_legacy_tp_exposed) { +for (j =0 ; j <ARRAY_SIZE (slab_legacy_events); j++, i++) + rec_argv[i] =strdup (slab_legacy_events[j]); + } }if (kmem_page) { rec_argv[i++] =strdup ("-g" );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 167/183 perf kmem: Support field "node" in evsel__process_alloc_event() coping with recent tracepoint restructuring
In reply to Greg Kroah-HartmanFrom: Leo Yan <[email protected]>
[ Upstream commit dce088ab0d51ae3b14fb2bd608e9c649aadfe5dc ]
Commit 11e9734bcb6a7361 ("mm/slab_common: unify NUMA and UMA version of tracepoints") adds the field "node" into the tracepoints 'kmalloc' and 'kmem_cache_alloc', so this patch modifies the event process function to support the field "node".
If field "node" is detected by checking function evsel__field(), it stats the cross allocation.
When the "node" value is NUMA_NO_NODE (-1), it means the memory can be allocated from any memory node, in this case, we don't account it as a cross allocation.
--- tools/perf/builtin-kmem.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-)
tools/perf/builtin-kmem.c +24 -12
@@ -26,6 +26,7 @@#include "util/string2.h" #include <linux/kernel.h> +#include <linux/numa.h> #include <linux/rbtree.h> #include <linux/string.h> #include <linux/zalloc.h>
@@ -184,22 +185,33 @@ static int evsel__process_alloc_event(struct evsel *evsel, struct perf_sample *s total_allocated += bytes_alloc; nr_allocs++; -return 0 ; -} -static int evsel__process_alloc_node_event (struct evsel *evsel,struct perf_sample *sample) -{ -int ret =evsel__process_alloc_event (evsel, sample); +/* +* Commit 11e9734bcb6a ("mm/slab_common: unify NUMA and UMA +* version of tracepoints") adds the field "node" into the +* tracepoints 'kmalloc' and 'kmem_cache_alloc'. +* +* The legacy tracepoints 'kmalloc_node' and 'kmem_cache_alloc_node' +* also contain the field "node". +* +* If the tracepoint contains the field "node" the tool stats the +* cross allocation. +*/ +if (evsel__field (evsel,"node" )) { +int node1, node2; -if (!ret) { -int node1 =cpu__get_node ((struct perf_cpu ){.cpu = sample->cpu}), - node2 =evsel__intval (evsel, sample,"node" ); + node1 =cpu__get_node ((struct perf_cpu ){.cpu = sample->cpu}); + node2 =evsel__intval (evsel, sample,"node" ); -if (node1 != node2) +/* +* If the field "node" is NUMA_NO_NODE (-1), we don't take it +* as a cross allocation. +*/ +if ((node2 !=NUMA_NO_NODE ) && (node1 != node2)) nr_cross_allocs++; } -return ret; +return 0 ; }static int ptr_cmp (void *,void *);
@@ -1368,8 +1380,8 @@ static int __cmd_kmem(struct perf_session *session)/* slab allocator */ { "kmem:kmalloc", evsel__process_alloc_event, }, { "kmem:kmem_cache_alloc", evsel__process_alloc_event, }, - { "kmem:kmalloc_node", evsel__process_alloc_node_event, }, - { "kmem:kmem_cache_alloc_node", evsel__process_alloc_node_event, }, + { "kmem:kmalloc_node", evsel__process_alloc_event, }, + { "kmem:kmem_cache_alloc_node", evsel__process_alloc_event, }, { "kmem:kfree", evsel__process_free_event, }, { "kmem:kmem_cache_free", evsel__process_free_event, },/* page allocator */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 168/183 igc: Fix PPS delta between two synchronized end-points
In reply to Greg Kroah-HartmanFrom: Christopher S Hall <[email protected]>
[ Upstream commit 5e91c72e560cc85f7163bbe3d14197268de31383 ]
This patch fix the pulse per second output delta between two synchronized end-points.
Based on Intel Discrete I225 Software User Manual Section 4.2.15 TimeSync Auxiliary Control Register, ST0[Bit 4] and ST1[Bit 7] must be set to ensure that clock output will be toggles based on frequency value defined. This is to ensure that output of the PPS is aligned with the clock.
How to test:
1) Running time synchronization on both end points.
Ex: ptp4l --step_threshold=1 -m -f gPTP.cfg -i <interface name>
2) Configure PPS output using below command for both end-points
Ex: SDP0 on I225 REV4 SKU variant
./testptp -d /dev/ptp0 -L 0,2
./testptp -d /dev/ptp0 -p 1000000000
3) Measure the output using analyzer for both end-points
--- drivers/net/ethernet/intel/igc/igc_defines.h | 2 ++ drivers/net/ethernet/intel/igc/igc_ptp.c | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/igc/igc_defines.h +2 -0
@@ -466,7 +466,9 @@#define IGC_TSAUXC_EN_TT0 BIT(0)/* Enable target time 0. */ #define IGC_TSAUXC_EN_TT1 BIT(1)/* Enable target time 1. */ #define IGC_TSAUXC_EN_CLK0 BIT(2)/* Enable Configurable Frequency Clock 0. */ +#define IGC_TSAUXC_ST0 BIT(4)/* Start Clock 0 Toggle on Target Time 0. */ #define IGC_TSAUXC_EN_CLK1 BIT(5)/* Enable Configurable Frequency Clock 1. */ +#define IGC_TSAUXC_ST1 BIT(7)/* Start Clock 1 Toggle on Target Time 1. */ #define IGC_TSAUXC_EN_TS0 BIT(8)/* Enable hardware timestamp 0. */ #define IGC_TSAUXC_AUTT0 BIT(9)/* Auxiliary Timestamp Taken. */ #define IGC_TSAUXC_EN_TS1 BIT(10)/* Enable hardware timestamp 0. */
drivers/net/ethernet/intel/igc/igc_ptp.c +6 -4
@@ -322,7 +322,7 @@ static int igc_ptp_feature_enable_i225(struct ptp_clock_info *ptp, ts =ns_to_timespec64 (ns);if (rq->perout.index ==1 ) {if (use_freq) { - tsauxc_mask =IGC_TSAUXC_EN_CLK1 ; + tsauxc_mask =IGC_TSAUXC_EN_CLK1 |IGC_TSAUXC_ST1 ; tsim_mask =0 ; }else { tsauxc_mask =IGC_TSAUXC_EN_TT1 ;
@@ -333,7 +333,7 @@ static int igc_ptp_feature_enable_i225(struct ptp_clock_info *ptp, freqout =IGC_FREQOUT1 ; }else {if (use_freq) { - tsauxc_mask =IGC_TSAUXC_EN_CLK0 ; + tsauxc_mask =IGC_TSAUXC_EN_CLK0 |IGC_TSAUXC_ST0 ; tsim_mask =0 ; }else { tsauxc_mask =IGC_TSAUXC_EN_TT0 ;
@@ -347,10 +347,12 @@ static int igc_ptp_feature_enable_i225(struct ptp_clock_info *ptp, tsauxc =rd32 (IGC_TSAUXC ); tsim =rd32 (IGC_TSIM );if (rq->perout.index ==1 ) { - tsauxc &= ~(IGC_TSAUXC_EN_TT1 |IGC_TSAUXC_EN_CLK1 ); + tsauxc &= ~(IGC_TSAUXC_EN_TT1 |IGC_TSAUXC_EN_CLK1 | +IGC_TSAUXC_ST1 ); tsim &= ~IGC_TSICR_TT1 ; }else { - tsauxc &= ~(IGC_TSAUXC_EN_TT0 |IGC_TSAUXC_EN_CLK0 ); + tsauxc &= ~(IGC_TSAUXC_EN_TT0 |IGC_TSAUXC_EN_CLK0 | +IGC_TSAUXC_ST0 ); tsim &= ~IGC_TSICR_TT0 ; }if (on) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 169/183 net: lan966x: check for ptp to be enabled in lan966x_ptp_deinit()
In reply to Greg Kroah-HartmanFrom: Clément Léger <[email protected]>
[ Upstream commit b0e380b5d4275299adf43e249f18309331b6f54f ]
If ptp was not enabled due to missing IRQ for instance, lan966x_ptp_deinit() will dereference NULL pointers.
--- drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c +3 -0
@@ -853,6 +853,9 @@ void lan966x_ptp_deinit(struct lan966x *lan966x)struct lan966x_port *port;int i; +if (!lan966x->ptp) +return ; +for (i =0 ; i < lan966x->num_phys_ports; i++) { port = lan966x->ports[i];if (!port)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 170/183 net: hns3: fix wrong use of rss size during VF rss config
In reply to Greg Kroah-HartmanFrom: Jie Wang <[email protected]>
[ Upstream commit ae9f29fdfd827ad06c1ae8155c042245a9d00757 ]
Currently, it used old rss size to get current tc mode. As a result, the rss size is updated, but the tc mode is still configured based on the old rss size.
So this patch fixes it by using the new rss size in both process.
--- drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +1 -1
@@ -3130,7 +3130,7 @@ static int hclgevf_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,hclgevf_update_rss_size (handle, new_tqps_num); -hclge_comm_get_rss_tc_info (cur_rss_size, hdev->hw_tc_map, +hclge_comm_get_rss_tc_info (kinfo->rss_size, hdev->hw_tc_map, tc_offset, tc_valid, tc_size); ret =hclge_comm_set_rss_tc_mode (&hdev->hw.hw, tc_offset, tc_valid, tc_size);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 171/183 bnxt: make sure we return pages to the pool
In reply to Greg Kroah-HartmanFrom: Jakub Kicinski <[email protected]>
[ Upstream commit 97f5e03a4a27d27ee4fed0cdb1658c81cf2784db ]
Before the commit under Fixes the page would have been released from the pool before the napi_alloc_skb() call, so normal page freeing was fine (released page == no longer in the pool).
After the change we just mark the page for recycling so it's still in the pool if the skb alloc fails, we need to recycle.
Same commit added the same bug in the new bnxt_rx_multi_page_skb().
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +2 -2
@@ -990,7 +990,7 @@ static struct sk_buff *bnxt_rx_multi_page_skb(struct bnxt *bp, DMA_ATTR_WEAK_ORDERING); skb =build_skb (page_address (page),PAGE_SIZE );if (!skb) { -__free_page (page); +page_pool_recycle_direct (rxr->page_pool, page);return NULL ; }skb_mark_for_recycle (skb);
@@ -1028,7 +1028,7 @@ static struct sk_buff *bnxt_rx_page_skb(struct bnxt *bp, skb =napi_alloc_skb (&rxr->bnapi->napi, payload);if (!skb) { -__free_page (page); +page_pool_recycle_direct (rxr->page_pool, page);return NULL ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 172/183 platform/surface: aggregator: Add missing call to ssam_request_sync_free()
In reply to Greg Kroah-HartmanFrom: Maximilian Luz <[email protected]>
[ Upstream commit c965daac370f08a9b71d573a71d13cda76f2a884 ]
Although rare, ssam_request_sync_init() can fail. In that case, the request should be freed via ssam_request_sync_free(). Currently it is leaked instead. Fix this.
--- drivers/platform/surface/aggregator/controller.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/platform/surface/aggregator/controller.c +3 -1
@@ -1700,8 +1700,10 @@ int ssam_request_sync(struct ssam_controller *ctrl,return status; status =ssam_request_sync_init (rqst, spec->flags); -if (status) +if (status) { +ssam_request_sync_free (rqst);return status; + }ssam_request_sync_set_resp (rqst, rsp);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 173/183 platform/x86/amd: Fix refcount leak in amd_pmc_probe
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit ccb32e2be14271a60e9ba89c6d5660cc9998773c ]
pci_get_domain_bus_and_slot() takes reference, the caller should release the reference by calling pci_dev_put() after use. Call pci_dev_put() in the error path to fix this.
--- drivers/platform/x86/amd/pmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/amd/pmc.c +1 -1
@@ -932,7 +932,7 @@ static int amd_pmc_probe(struct platform_device *pdev)if (enable_stb && (dev->cpu_id ==AMD_CPU_ID_YC || dev->cpu_id ==AMD_CPU_ID_CB )) { err =amd_pmc_s2d_init (dev);if (err) -return err; + goto err_pci_dev_put; }platform_set_drvdata (pdev, dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 174/183 ALSA: usb-audio: Fix possible NULL pointer dereference in snd_usb_pcm_has_fixed_rate()
In reply to Greg Kroah-HartmanFrom: Jaroslav Kysela <[email protected]>
[ Upstream commit 92a9c0ad86d47ff4cce899012e355c400f02cfb8 ]
The subs function argument may be NULL, so do not use it before the NULL check.
--- sound/usb/pcm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/usb/pcm.c +2 -1
@@ -160,11 +160,12 @@ find_substream_format(struct snd_usb_substream *subs,bool snd_usb_pcm_has_fixed_rate (struct snd_usb_substream *subs) {const struct audioformat *fp; -struct snd_usb_audio *chip = subs->stream->chip; +struct snd_usb_audio *chip;int rate =-1 ;if (!subs)return false; + chip = subs->stream->chip;if (!(chip->quirk_flags &QUIRK_FLAG_FIXED_RATE ))return false;list_for_each_entry (fp, &subs->fmt_list, list) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 175/183 efi: fix NULL-deref in init error path
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit 703c13fe3c9af557d312f5895ed6a5fda2711104 ]
In cases where runtime services are not supported or have been disabled, the runtime services workqueue will never have been allocated.
Do not try to destroy the workqueue unconditionally in the unlikely event that EFI initialisation fails to avoid dereferencing a NULL pointer.
--- drivers/firmware/efi/efi.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/firmware/efi/efi.c +6 -3
@@ -374,8 +374,8 @@ static int __init efisubsys_init(void) efi_kobj =kobject_create_and_add ("efi" , firmware_kobj);if (!efi_kobj) {pr_err ("efi: Firmware registration failed.\n" ); -destroy_workqueue (efi_rts_wq); -return -ENOMEM ; + error = -ENOMEM ; + goto err_destroy_wq; } if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE |
@@ -423,7 +423,10 @@ static int __init efisubsys_init(void)generic_ops_unregister (); err_put:kobject_put (efi_kobj); -destroy_workqueue (efi_rts_wq); +err_destroy_wq: +if (efi_rts_wq) +destroy_workqueue (efi_rts_wq); +return error; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 176/183 io_uring: lock overflowing for IOPOLL
In reply to Greg Kroah-HartmanFrom: Pavel Begunkov <[email protected]>
commit 544d163d659d45a206d8929370d5a2984e546cb7 upstream.
syzbot reports an issue with overflow filling for IOPOLL:
WARNING: CPU: 0 PID: 28 at io_uring/io_uring.c:734 io_cqring_event_overflow+0x1c0/0x230 io_uring/io_uring.c:734 CPU: 0 PID: 28 Comm: kworker/u4:1 Not tainted 6.2.0-rc3-syzkaller-16369-g358a161a6a9e #0 Workqueue: events_unbound io_ring_exit_work Call trace: io_cqring_event_overflow+0x1c0/0x230 io_uring/io_uring.c:734 io_req_cqe_overflow+0x5c/0x70 io_uring/io_uring.c:773 io_fill_cqe_req io_uring/io_uring.h:168 [inline] io_do_iopoll+0x474/0x62c io_uring/rw.c:1065 io_iopoll_try_reap_events+0x6c/0x108 io_uring/io_uring.c:1513 io_uring_try_cancel_requests+0x13c/0x258 io_uring/io_uring.c:3056 io_ring_exit_work+0xec/0x390 io_uring/io_uring.c:2869 process_one_work+0x2d8/0x504 kernel/workqueue.c:2289 worker_thread+0x340/0x610 kernel/workqueue.c:2436 kthread+0x12c/0x158 kernel/kthread.c:376 ret_from_fork+0x10/0x20 arch/arm64/kernel/entry.S:863
There is no real problem for normal IOPOLL as flush is also called with uring_lock taken, but it's getting more complicated for IOPOLL|SQPOLL, for which __io_cqring_overflow_flush() happens from the CQ waiting path.
--- io_uring/rw.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
io_uring/rw.c +5 -1
@@ -1055,7 +1055,11 @@ int io_do_iopoll(struct io_ring_ctx *ctx, bool force_nonspin)continue ; req->cqe.flags =io_put_kbuf (req,0 ); -__io_fill_cqe_req (req->ctx, req); +if (unlikely (!__io_fill_cqe_req (ctx, req))) { +spin_lock (&ctx->completion_lock); +io_req_cqe_overflow (req); +spin_unlock (&ctx->completion_lock); + } }if (unlikely (!nr_events))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 177/183 io_uring/poll: attempt request issue after racy poll wakeup
In reply to Greg Kroah-HartmanFrom: Jens Axboe <[email protected]>
commit 6e5aedb9324aab1c14a23fae3d8eeb64a679c20e upstream.
If we have multiple requests waiting on the same target poll waitqueue, then it's quite possible to get a request triggered and get disappointed in not being able to make any progress with it. If we race in doing so, we'll potentially leave the poll request on the internal tables, but removed from the waitqueue. That means that any subsequent trigger of the poll waitqueue will not kick that request into action, causing an application to potentially wait for completion of a request that will never happen.
Fix this by adding a new poll return state, IOU_POLL_REISSUE. Rather than have complicated logic for how to re-arm a given type of request, just punt it for a reissue.
While in there, move the 'ret' variable to the only section where it gets used. This avoids confusion the scope of it.
--- io_uring/poll.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-)
io_uring/poll.c +22 -11
@@ -223,22 +223,23 @@ enum {IOU_POLL_DONE =0 ,IOU_POLL_NO_ACTION =1 ,IOU_POLL_REMOVE_POLL_USE_RES =2 , + IOU_POLL_REISSUE = 3, };/* * All poll tw should go through this. Checks for poll events, manages * references, does rewait, etc. * -* Returns a negative error on failure. IOU_POLL_NO_ACTION when no action require, -* which is either spurious wakeup or multishot CQE is served. -* IOU_POLL_DONE when it's done with the request, then the mask is stored in req->cqe.res. -* IOU_POLL_REMOVE_POLL_USE_RES indicates to remove multishot poll and that the result -* is stored in req->cqe. +* Returns a negative error on failure. IOU_POLL_NO_ACTION when no action +* require, which is either spurious wakeup or multishot CQE is served. +* IOU_POLL_DONE when it's done with the request, then the mask is stored in +* req->cqe.res. IOU_POLL_REMOVE_POLL_USE_RES indicates to remove multishot +* poll and that the result is stored in req->cqe. */ static int io_poll_check_events (struct io_kiocb *req,bool *locked) {struct io_ring_ctx *ctx = req->ctx; -int v, ret; +int v;/* req->task == current here, checking PF_EXITING is safe */ if (unlikely (req->task->flags &PF_EXITING ))
@@ -274,10 +275,15 @@ static int io_poll_check_events(struct iif (!req->cqe.res) {struct poll_table_struct pt = { ._key = req->apoll_events }; req->cqe.res =vfs_poll (req->file, &pt) & req->apoll_events; +/* +* We got woken with a mask, but someone else got to +* it first. The above vfs_poll() doesn't add us back +* to the waitqueue, so if we get nothing back, we +* should be safe and attempt a reissue. +*/ +if (unlikely (!req->cqe.res)) +return IOU_POLL_REISSUE ; } - -if ((unlikely (!req->cqe.res))) -continue ;if (req->apoll_events &EPOLLONESHOT )return IOU_POLL_DONE ;if (io_is_uring_fops (req->file))
@@ -294,7 +300,7 @@ static int io_poll_check_events(struct ireturn IOU_POLL_REMOVE_POLL_USE_RES ; } }else { - ret =io_poll_issue (req, locked); +int ret =io_poll_issue (req, locked);if (ret ==IOU_STOP_MULTISHOT )return IOU_POLL_REMOVE_POLL_USE_RES ;if (ret <0 )
@@ -325,6 +331,11 @@ static void io_poll_task_func(struct io_if (ret ==IOU_POLL_DONE ) { struct io_poll *poll = io_kiocb_to_cmd(req, struct io_poll); req->cqe.res =mangle_poll (req->cqe.res & poll->events); + }else if (ret ==IOU_POLL_REISSUE ) { +io_poll_remove_entries (req); +io_poll_tw_hash_eject (req, locked); +io_req_task_submit (req, locked); +return ; }else if (ret !=IOU_POLL_REMOVE_POLL_USE_RES ) { req->cqe.res = ret;req_set_fail (req);
@@ -350,7 +361,7 @@ static void io_apoll_task_func(struct ioif (ret ==IOU_POLL_REMOVE_POLL_USE_RES )io_req_complete_post (req); -else if (ret ==IOU_POLL_DONE ) +else if (ret ==IOU_POLL_DONE || ret ==IOU_POLL_REISSUE )io_req_task_submit (req, locked);else io_req_complete_failed (req, ret);
Greg Kroah-Hartman
maintainerPATCH 178/183 drm/i915: Fix CFI violations in gt_sysfs
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
commit a8a4f0467d706fc22d286dfa973946e5944b793c upstream.
When booting with CONFIG_CFI_CLANG, there are numerous violations when accessing the files under /sys/devices/pci0000:00/0000:00:02.0/drm/card0/gt/gt0:
$ cd /sys/devices/pci0000:00/0000:00:02.0/drm/card0/gt/gt0
$ grep . * id:0 punit_req_freq_mhz:350 rc6_enable:1 rc6_residency_ms:214934 rps_act_freq_mhz:1300 rps_boost_freq_mhz:1300 rps_cur_freq_mhz:350 rps_max_freq_mhz:1300 rps_min_freq_mhz:350 rps_RP0_freq_mhz:1300 rps_RP1_freq_mhz:350 rps_RPn_freq_mhz:350 throttle_reason_pl1:0 throttle_reason_pl2:0 throttle_reason_pl4:0 throttle_reason_prochot:0 throttle_reason_ratl:0 throttle_reason_status:0 throttle_reason_thermal:0 throttle_reason_vr_tdc:0 throttle_reason_vr_thermalert:0
$ sudo dmesg &| grep "CFI failure at" [ 214.595903] CFI failure at kobj_attr_show+0x19/0x30 (target: id_show+0x0/0x70 [i915]; expected type: 0xc527b809) [ 214.596064] CFI failure at kobj_attr_show+0x19/0x30 (target: punit_req_freq_mhz_show+0x0/0x40 [i915]; expected type: 0xc527b809) [ 214.596407] CFI failure at kobj_attr_show+0x19/0x30 (target: rc6_enable_show+0x0/0x40 [i915]; expected type: 0xc527b809) [ 214.596528] CFI failure at kobj_attr_show+0x19/0x30 (target: rc6_residency_ms_show+0x0/0x270 [i915]; expected type: 0xc527b809) [ 214.596682] CFI failure at kobj_attr_show+0x19/0x30 (target: act_freq_mhz_show+0x0/0xe0 [i915]; expected type: 0xc527b809) [ 214.596792] CFI failure at kobj_attr_show+0x19/0x30 (target: boost_freq_mhz_show+0x0/0xe0 [i915]; expected type: 0xc527b809) [ 214.596893] CFI failure at kobj_attr_show+0x19/0x30 (target: cur_freq_mhz_show+0x0/0xe0 [i915]; expected type: 0xc527b809) [ 214.596996] CFI failure at kobj_attr_show+0x19/0x30 (target: max_freq_mhz_show+0x0/0xe0 [i915]; expected type: 0xc527b809) [ 214.597099] CFI failure at kobj_attr_show+0x19/0x30 (target: min_freq_mhz_show+0x0/0xe0 [i915]; expected type: 0xc527b809) [ 214.597198] CFI failure at kobj_attr_show+0x19/0x30 (target: RP0_freq_mhz_show+0x0/0xe0 [i915]; expected type: 0xc527b809) [ 214.597301] CFI failure at kobj_attr_show+0x19/0x30 (target: RP1_freq_mhz_show+0x0/0xe0 [i915]; expected type: 0xc527b809) [ 214.597405] CFI failure at kobj_attr_show+0x19/0x30 (target: RPn_freq_mhz_show+0x0/0xe0 [i915]; expected type: 0xc527b809) [ 214.597538] CFI failure at kobj_attr_show+0x19/0x30 (target: throttle_reason_bool_show+0x0/0x50 [i915]; expected type: 0xc527b809) [ 214.597701] CFI failure at kobj_attr_show+0x19/0x30 (target: throttle_reason_bool_show+0x0/0x50 [i915]; expected type: 0xc527b809) [ 214.597836] CFI failure at kobj_attr_show+0x19/0x30 (target: throttle_reason_bool_show+0x0/0x50 [i915]; expected type: 0xc527b809) [ 214.597952] CFI failure at kobj_attr_show+0x19/0x30 (target: throttle_reason_bool_show+0x0/0x50 [i915]; expected type: 0xc527b809) [ 214.598071] CFI failure at kobj_attr_show+0x19/0x30 (target: throttle_reason_bool_show+0x0/0x50 [i915]; expected type: 0xc527b809) [ 214.598177] CFI failure at kobj_attr_show+0x19/0x30 (target: throttle_reason_bool_show+0x0/0x50 [i915]; expected type: 0xc527b809) [ 214.598307] CFI failure at kobj_attr_show+0x19/0x30 (target: throttle_reason_bool_show+0x0/0x50 [i915]; expected type: 0xc527b809) [ 214.598439] CFI failure at kobj_attr_show+0x19/0x30 (target: throttle_reason_bool_show+0x0/0x50 [i915]; expected type: 0xc527b809) [ 214.598542] CFI failure at kobj_attr_show+0x19/0x30 (target: throttle_reason_bool_show+0x0/0x50 [i915]; expected type: 0xc527b809)
With kCFI, indirect calls are validated against their expected type versus actual type and failures occur when the two types do not match. The ultimate issue is that these sysfs functions are expecting to be called via dev_attr_show() but they may also be called via kobj_attr_show(), as certain files are created under two different kobjects that have two different sysfs_ops in intel_gt_sysfs_register(), hence the warnings above. When accessing the gt_ files under /sys/devices/pci0000:00/0000:00:02.0/drm/card0, which are using the same sysfs functions, there are no violations, meaning the functions are being called with the proper type.
To make everything work properly, adjust certain functions to match the type of the ->show() and ->store() members in 'struct kobj_attribute'. Add a macro to generate functions for that can be called via both dev_attr_{show,store}() or kobj_attr_{show,store}() so that they can be called through both kobject locations without violating kCFI and adjust the attribute groups to account for this.
--- drivers/gpu/drm/i915/gt/intel_gt_sysfs.c | 15 drivers/gpu/drm/i915/gt/intel_gt_sysfs.h | 2 drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.c | 459 ++++++++++++---------------- 3 files changed, 219 insertions(+), 257 deletions(-)
drivers/gpu/drm/i915/gt/intel_gt_sysfs.c +7 -8
@@ -22,11 +22,9 @@ bool is_object_gt(struct kobject *kobj)return !strncmp (kobj->name,"gt" ,2 ); } -struct intel_gt *intel_gt_sysfs_get_drvdata (struct device *dev, +struct intel_gt *intel_gt_sysfs_get_drvdata (struct kobject *kobj,const char *name) { -struct kobject *kobj = &dev->kobj; -/* * We are interested at knowing from where the interface * has been called, whether it's called from gt/ or from
@@ -38,6 +36,7 @@ struct intel_gt *intel_gt_sysfs_get_drvd* "struct drm_i915_private *" type. */ if (!is_object_gt (kobj)) { +struct device *dev =kobj_to_dev (kobj);struct drm_i915_private *i915 =kdev_minor_to_i915 (dev);return to_gt (i915);
@@ -51,18 +50,18 @@ static struct kobject *gt_get_parent_objreturn >->i915->drm.primary->kdev->kobj; } -static ssize_t id_show (struct device *dev, -struct device_attribute *attr, +static ssize_t id_show (struct kobject *kobj, +struct kobj_attribute *attr,char *buf) { -struct intel_gt *gt =intel_gt_sysfs_get_drvdata (dev, attr->attr.name); +struct intel_gt *gt =intel_gt_sysfs_get_drvdata (kobj, attr->attr.name);return sysfs_emit (buf,"%u\n" , gt->info.id); } -static DEVICE_ATTR_RO (id); +static struct kobj_attribute attr_id =__ATTR_RO (id);static struct attribute *id_attrs[] = { - &dev_attr_id.attr, + &attr_id.attr,NULL , };ATTRIBUTE_GROUPS (id);
drivers/gpu/drm/i915/gt/intel_gt_sysfs.h +1 -1
@@ -30,7 +30,7 @@ static inline struct intel_gt *kobj_to_gvoid intel_gt_sysfs_register (struct intel_gt *gt);void intel_gt_sysfs_unregister (struct intel_gt *gt); -struct intel_gt *intel_gt_sysfs_get_drvdata (struct device *dev, +struct intel_gt *intel_gt_sysfs_get_drvdata (struct kobject *kobj,const char *name);#endif /* SYSFS_GT_H */
drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.c +211 -248
734 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 179/183 io_uring/io-wq: free worker if task_work creation is canceled
In reply to Greg Kroah-HartmanFrom: Jens Axboe <[email protected]>
commit af82425c6a2d2f347c79b63ce74fca6dc6be157f upstream.
If we cancel the task_work, the worker will never come into existance. As this is the last reference to it, ensure that we get it freed appropriately.
--- io_uring/io-wq.c | 1 + 1 file changed, 1 insertion(+)
io_uring/io-wq.c +1 -0
@@ -1230,6 +1230,7 @@ static void io_wq_cancel_tw_create(struc worker = container_of(cb, struct io_worker, create_work);io_worker_cancel_cb (worker); +kfree (worker); } }
Greg Kroah-Hartman
maintainerPATCH 180/183 io_uring/io-wq: only free worker if it was allocated for creation
In reply to Greg Kroah-HartmanFrom: Jens Axboe <[email protected]>
commit e6db6f9398dadcbc06318a133d4c44a2d3844e61 upstream.
We have two types of task_work based creation, one is using an existing worker to setup a new one (eg when going to sleep and we have no free workers), and the other is allocating a new worker. Only the latter should be freed when we cancel task_work creation for a new worker.
--- io_uring/io-wq.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
io_uring/io-wq.c +6 -1
@@ -1230,7 +1230,12 @@ static void io_wq_cancel_tw_create(struc worker = container_of(cb, struct io_worker, create_work);io_worker_cancel_cb (worker); -kfree (worker); +/* +* Only the worker continuation helper has worker allocated and +* hence needs freeing. +*/ +if (cb->func == create_worker_cont) +kfree (worker); } }
Greg Kroah-Hartman
maintainerPATCH 181/183 block: handle bio_split_to_limits() NULL return
In reply to Greg Kroah-HartmanFrom: Jens Axboe <[email protected]>
commit 613b14884b8595e20b9fac4126bf627313827fbe upstream.
This can't happen right now, but in preparation for allowing bio_split_to_limits() returning NULL if it ended the bio, check for it in all the callers.
--- block/blk-merge.c | 4 +++- block/blk-mq.c | 5 ++++- drivers/block/drbd/drbd_req.c | 2 ++ drivers/block/ps3vram.c | 2 ++ drivers/md/dm.c | 2 ++ drivers/md/md.c | 2 ++ drivers/nvme/host/multipath.c | 2 ++ drivers/s390/block/dcssblk.c | 2 ++ 8 files changed, 19 insertions(+), 2 deletions(-)
block/blk-merge.c +3 -1
@@ -358,11 +358,13 @@ struct bio *__bio_split_to_limits(structdefault : split =bio_split_rw (bio, lim, nr_segs, bs,get_max_io_size (bio, lim) <<SECTOR_SHIFT ); +if (IS_ERR (split)) +return NULL ;break ; }if (split) { -/* there isn't chance to merge the splitted bio */ +/* there isn't chance to merge the split bio */ split->bi_opf |=REQ_NOMERGE ;blkcg_bio_issue_init (split);
block/blk-mq.c +4 -1
@@ -2919,8 +2919,11 @@ void blk_mq_submit_bio(struct bio *bio)blk_status_t ret; bio =blk_queue_bounce (bio, q); -if (bio_may_exceed_limits (bio, &q->limits)) +if (bio_may_exceed_limits (bio, &q->limits)) { bio =__bio_split_to_limits (bio, &q->limits, &nr_segs); +if (!bio) +return ; + }if (!bio_integrity_prep (bio))return ;
drivers/block/drbd/drbd_req.c +2 -0
@@ -1607,6 +1607,8 @@ void drbd_submit_bio(struct bio *bio)struct drbd_device *device = bio->bi_bdev->bd_disk->private_data; bio =bio_split_to_limits (bio); +if (!bio) +return ;/* * what we "blindly" assume:
drivers/block/ps3vram.c +2 -0
@@ -587,6 +587,8 @@ static void ps3vram_submit_bio(struct bidev_dbg (&dev->core,"%s\n" , __func__); bio =bio_split_to_limits (bio); +if (!bio) +return ;spin_lock_irq (&priv->lock); busy = !bio_list_empty (&priv->list);
drivers/md/dm.c +2 -0
@@ -1755,6 +1755,8 @@ static void dm_split_and_process_bio(str* otherwise associated queue_limits won't be imposed. */ bio =bio_split_to_limits (bio); +if (!bio) +return ; }init_clone_info (&ci, md, map, bio, is_abnormal);
drivers/md/md.c +2 -0
@@ -443,6 +443,8 @@ static void md_submit_bio(struct bio *bi } bio =bio_split_to_limits (bio); +if (!bio) +return ;if (mddev->ro ==1 &&unlikely (rw ==WRITE )) {if (bio_sectors (bio) !=0 )
drivers/nvme/host/multipath.c +2 -0
@@ -351,6 +351,8 @@ static void nvme_ns_head_submit_bio(stru* pool from the original queue to allocate the bvecs from. */ bio =bio_split_to_limits (bio); +if (!bio) +return ; srcu_idx =srcu_read_lock (&head->srcu); ns =nvme_find_path (head);
drivers/s390/block/dcssblk.c +2 -0
@@ -865,6 +865,8 @@ dcssblk_submit_bio(struct bio *bio)unsigned long bytes_done; bio =bio_split_to_limits (bio); +if (!bio) +return ; bytes_done =0 ; dev_info = bio->bi_bdev->bd_disk->private_data;
Greg Kroah-Hartman
maintainerPATCH 182/183 Revert "usb: ulpi: defer ulpi_register on ulpi_read_id timeout"
In reply to Greg Kroah-HartmanFrom: Ferry Toth <[email protected]>
commit b659b613cea2ae39746ca8bd2b69d1985dd9d770 upstream.
This reverts commit 8a7b31d545d3a15f0e6f5984ae16f0ca4fd76aac.
This patch results in some qemu test failures, specifically xilinx-zynq-a9 machine and zynq-zc702 as well as zynq-zed devicetree files, when trying to boot from USB drive.
--- drivers/usb/common/ulpi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/common/ulpi.c +1 -1
@@ -207,7 +207,7 @@ static int ulpi_read_id(struct ulpi *ulp/* Test the interface */ ret =ulpi_write (ulpi,ULPI_SCRATCH ,0xaa );if (ret <0 ) -return ret; + goto err; ret =ulpi_read (ulpi,ULPI_SCRATCH );if (ret <0 )
Greg Kroah-Hartman
maintainerPATCH 183/183 pinctrl: amd: Add dynamic debugging for active GPIOs
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
commit 1d66e379731f79ae5039a869c0fde22a4f6a6a91 upstream.
Some laptops have been reported to wake up from s2idle when plugging in the AC adapter or by closing the lid. This is a surprising behavior that is further clarified by commit cb3e7d624c3ff ("PM:
wakeup: Add extra debugging statement for multiple active IRQs").
With that commit in place the following interaction can be seen when the lid is closed:
[ 28.946038] PM: suspend-to-idle [ 28.946083] ACPI: EC: ACPI EC GPE status set [ 28.946101] ACPI: PM: Rearming ACPI SCI for wakeup [ 28.950152] Timekeeping suspended for 3.320 seconds [ 28.950152] PM: Triggering wakeup from IRQ 9 [ 28.950152] ACPI: EC: ACPI EC GPE status set [ 28.950152] ACPI: EC: ACPI EC GPE dispatched [ 28.995057] ACPI: EC: ACPI EC work flushed [ 28.995075] ACPI: PM: Rearming ACPI SCI for wakeup [ 28.995131] PM: Triggering wakeup from IRQ 9 [ 28.995271] ACPI: EC: ACPI EC GPE status set [ 28.995291] ACPI: EC: ACPI EC GPE dispatched [ 29.098556] ACPI: EC: ACPI EC work flushed [ 29.207020] ACPI: EC: ACPI EC work flushed [ 29.207037] ACPI: PM: Rearming ACPI SCI for wakeup [ 29.211095] Timekeeping suspended for 0.739 seconds [ 29.211095] PM: Triggering wakeup from IRQ 9 [ 29.211079] PM: Triggering wakeup from IRQ 7 [ 29.211095] ACPI: PM: ACPI non-EC GPE wakeup [ 29.211095] PM: resume from suspend-to-idle
* IRQ9 on this laptop is used for the ACPI SCI.
* IRQ7 on this laptop is used for the GPIO controller.
What has occurred is when the lid was closed the EC woke up the SoC from it's deepest sleep state and the kernel's s2idle loop processed all EC events. When it was finished processing EC events, it checked for any other reasons to wake (break the s2idle loop).
The IRQ for the GPIO controller was active so the loop broke, and then this IRQ was processed. This is not a kernel bug but it is certainly a surprising behavior, and to better debug it we should have a dynamic debugging message that we can enact to catch it.
--- drivers/pinctrl/pinctrl-amd.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/pinctrl/pinctrl-amd.c +6 -4
@@ -628,13 +628,15 @@ static bool do_amd_gpio_irq_handler(int/* Each status bit covers four pins */ for (i =0 ; i <4 ; i++) { regval =readl (regs + i); -/* caused wake on resume context for shared IRQ */ -if (irq <0 && (regval &BIT (WAKE_STS_OFF ))) { + +if (regval &PIN_IRQ_PENDING )dev_dbg (&gpio_dev->pdev->dev, -"Waking due to GPIO %d: 0x%x" , +"GPIO %d is active: 0x%x" , irqnr + i, regval); + +/* caused wake on resume context for shared IRQ */ +if (irq <0 && (regval &BIT (WAKE_STS_OFF )))return true; - }if (!(regval &PIN_IRQ_PENDING ) || !(regval &BIT (INTERRUPT_MASK_OFF )))
Hey Greg,
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.7 release. There are 183 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 8 lines
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.
As far as my HW is concerned, looks grand on the RISC-V front..
Thanks,
Conor.
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.7 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.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 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.7 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
Tested rc1 against the Fedora build system (aarch64, armv7, ppc64le, s390x, x86_64), and boot tested x86_64. No regressions noted.
Hi Greg
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.7 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
6.1.7-rc1 tested.
x86_64
build successfully completed
boot successfully completed
Lenovo ThinkPad X1 Nano Gen1(Intel i5-1130G7, arch linux)
Thanks
Hi,
fstests(generic/034, xfs) panic when 6.1.7-rc1, but not panic when 6.1.6.
It seems patch *1 related.
*1 Subject: blk-mq: move the srcu_struct used for quiescing to the tagset
From: Christoph Hellwig <[email protected]>
This patch has been drop from 6.1.2-rc1. and it now added in 6.1.7-rc1 again.
the panic in 6.1.7-rc1 is almost same as that in 6.1.2-rc1.
Best Regards
Wang Yugui ([email protected])
2023/01/17
Quoted 796 lines
This is the start of the stable review cycle for the 6.1.7 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:Greg Kroah-Hartman <[email protected]>
Linux 6.1.7-rc1Mario Limonciello <[email protected]>
pinctrl: amd: Add dynamic debugging for active GPIOsFerry Toth <[email protected]>
Revert "usb: ulpi: deferulpi_registeronulpi_read_idtimeout"Jens Axboe <[email protected]>
block: handlebio_split_to_limits()NULL returnJens Axboe <[email protected]>
io_uring/io-wq: only free worker if it was allocated for creationJens Axboe <[email protected]>
io_uring/io-wq: free worker iftask_workcreation is canceledNathan Chancellor <[email protected]>
drm/i915: Fix CFI violations ingt_sysfsJens Axboe <[email protected]>
io_uring/poll: attempt request issue after racy poll wakeupPavel Begunkov <[email protected]>
io_uring: lock overflowing for IOPOLLJohan Hovold <[email protected]>
efi: fix NULL-deref in init error pathJaroslav Kysela <[email protected]>
ALSA: usb-audio: Fix possible NULL pointer dereference insnd_usb_pcm_has_fixed_rate()Miaoqian Lin <[email protected]>
platform/x86/amd: Fix refcount leak inamd_pmc_probeMaximilian Luz <[email protected]>
platform/surface: aggregator: Add missing call tossam_request_sync_free()Jakub Kicinski <[email protected]>
bnxt: make sure we return pages to the poolJie Wang <[email protected]>
net: hns3: fix wrong use of rss size during VF rss configClément Léger <[email protected]>
net: lan966x: check for ptp to be enabled inlan966x_ptp_deinit()Christopher S Hall <[email protected]>
igc: Fix PPS delta between two synchronized end-pointsLeo Yan <[email protected]>
perf kmem: Support field "node" inevsel__process_alloc_event()coping with recent tracepoint restructuringLeo Yan <[email protected]>
perf kmem: Support legacy tracepointsIan Rogers <[email protected]>
perf build: Properly guard libbpf includesHariprasad Kelam <[email protected]>
octeontx2-pf: Fix resource leakage in VF driver unbindGuillaume Nault <[email protected]>
selftests/net:l2_tos_ttl_inherit.sh: Ensure environment cleanup on failure.Guillaume Nault <[email protected]>
selftests/net:l2_tos_ttl_inherit.sh: Run tests in their own netns.Guillaume Nault <[email protected]>
selftests/net:l2_tos_ttl_inherit.sh: Set IPv6 addresses with "nodad".Emeel Hakim <[email protected]>
net/mlx5e: Fix macsec possible null dereference when updating MAC security entity (SecY)Emeel Hakim <[email protected]>
net/mlx5e: Fix macsec ssci attribute handling in offload pathGavin Li <[email protected]>
net/mlx5e: Don't support encap rules with gbp optionRahul Rameshbabu <[email protected]>
net/mlx5: Fix ptp max frequency adjustment rangeDragos Tatulea <[email protected]>
net/mlx5e: IPoIB, Fix child PKEY interface stats on rx pathDragos Tatulea <[email protected]>
net/mlx5e: IPoIB, Block PKEY interfaces with less rx queues than parentDragos Tatulea <[email protected]>
net/mlx5e: IPoIB, Block queue count configuration when sub interfaces are presentRoy Novich <[email protected]>
net/mlx5e: Verify dev is present for fix features ndoMoshe Shemesh <[email protected]>
net/mlx5: Fix command stats access after freeAriel Levkovich <[email protected]>
net/mlx5e: TC, Keep mod hdr actions after mod hdr allocAriel Levkovich <[email protected]>
net/mlx5: check attr pointer validity before dereferencing itHeiner Kallweit <[email protected]>
Revert "r8169: disable detection of chip version 36"Ido Schimmel <[email protected]>
net/sched:act_mpls: Fix warning during failed attribute validationZack Rusin <[email protected]>
drm/vmwgfx: Remove rcu locks from user resourcesMaaz Mombasawala <[email protected]>
drm/vmwgfx: Removevmwgfx_hashtabMaaz Mombasawala <[email protected]>
drm/vmwgfx: Refactor ttm reference object hashtable to use linux/hashtable.Maaz Mombasawala <[email protected]>
drm/vmwgfx: Refactor resource validation hashtable to use linux/hashtable implementation.Maaz Mombasawala <[email protected]>
drm/vmwgfx: Remove ttm object hashtableMaaz Mombasawala <[email protected]>
drm/vmwgfx: Refactor resource manager's hashtable to use linux/hashtable implementation.Zack Rusin <[email protected]>
drm/vmwgfx: Write the driver id registersJiasheng Jiang <[email protected]>
ice: Add check for kzallocYuan Can <[email protected]>
ice: Fix potential memory leak inice_gnss_tty_write()Luben Tuikov <[email protected]>
drm/amdgpu: Fix potential NULL dereferenceWilly Tarreau <[email protected]>
tools/nolibc: fix the O_* fcntl/open macro definitions for riscvWilly Tarreau <[email protected]>
tools/nolibc: restore mips branch ordering in the_startblockStephan Gerhold <[email protected]>
ASoC: qcom: Fix building APQ8016 machine driver without SOUNDWIREMirsad Goran Todorovac <[email protected]>
af_unix: selftest: Fix the size of the parameter toconnect()Eric Dumazet <[email protected]>
gro: take care of DODGY packetsRichard Gobert <[email protected]>
gro: avoid checking for a failed searchMinsuk Kang <[email protected]>
nfc: pn533: Wait for out_urb's completion inpn533_usb_send_frame()Roger Pau Monne <[email protected]>
hvc/xen: lock console list traversalTejun Heo <[email protected]>
block: Drop spuriousmight_sleep()fromblk_put_queue()Christoph Hellwig <[email protected]>
block: markblk_put_queueas potentially blockingChristoph Hellwig <[email protected]>
block: untanglerequest_queuerefcounting from sysfsChristoph Hellwig <[email protected]>
block: fix error unwinding inblk_register_queueChristoph Hellwig <[email protected]>
block: factor out ablk_debugfs_removehelperChristoph Hellwig <[email protected]>
blk-crypto: pass a gendisk to blk_crypto_sysfs_{,un}registerChristoph Hellwig <[email protected]>
blk-mq: move thesrcu_structused for quiescing to the tagsetYair Podemsky <[email protected]>
sched/core: Fixarch_scale_freq_tick()on tickless systemsAngela Czubak <[email protected]>
octeontx2-af: Fix LMAC config incgx_lmac_rx_tx_enableJeff Layton <[email protected]>
nfsd: fix handling of cached open files innfsd4_opencodepathJeff Layton <[email protected]>
nfsd: rework refcounting in filecacheChuck Lever <[email protected]>
NFSD: Add annfsd_file_fsynctracepointJeff Layton <[email protected]>
nfsd: reorganizefilecache.cJeff Layton <[email protected]>
nfsd: remove thepages_flushedstatistic from filecacheChuck Lever <[email protected]>
NFSD: Add anNFSD_FILE_GCflag to enablenfsd_filegarbage collectionChuck Lever <[email protected]>
NFSD: Revert "NFSD: NFSv4 CLOSE should release annfsd_fileimmediately"Chuck Lever <[email protected]>
NFSD: Pass the targetnfsd_filetonfsd_commit()Tung Nguyen <[email protected]>
tipc: fix unexpected link reset due to discovery messagesBiao Huang <[email protected]>
stmmac: dwmac-mediatek: remove thedwmac_fix_mac_speedTakashi Iwai <[email protected]>
ALSA: usb-audio: Relax hw constraints for implicit fb syncTakashi Iwai <[email protected]>
ALSA: usb-audio: Make sure to stop endpoints before closing EPsArnd Bergmann <[email protected]>
mtd: cfi: allow building spi-intel standaloneMikhail Zhilkin <[email protected]>
mtd: parsers: scpart: fix__udivdi3undefined on mipsEmanuele Ghidoli <[email protected]>
ASoC: wm8904: fix wrong outputs volume after power reactivationMiaoqian Lin <[email protected]>
drm/msm/dpu: Fix memory leak inmsm_mdss_parse_data_bus_icc_pathYang Li <[email protected]>
drm/msm/dpu: Fix some kernel-doc commentsArnd Bergmann <[email protected]>
ASoC: Intel: sof-nau8825: fix module alias overflowBrent Lu <[email protected]>
ASoC: Intel:sof_nau8825: support rt1015p speaker amplifierArnd Bergmann <[email protected]>
ASoC: Intel: fix sof-nau8825 link failurePeter Wang <[email protected]>
scsi: ufs: core: WLUN suspend SSU/enter hibern8 fail recoveryShin'ichiro Kawasaki <[email protected]>
scsi: mpi3mr: ReferCONFIG_SCSI_MPI3MRinMakefileMichael Kelley <[email protected]>
scsi: storvsc: Fix swiotlb bounce buffer leak in confidential VMRicardo Ribalda <[email protected]>
regulator: da9211: Use irq handler when readyPeter Newman <[email protected]>
x86/resctrl: Fix event counts regression in reused RMIDsPeter Newman <[email protected]>
x86/resctrl: Fix task CLOSID/RMID update raceJuergen Gross <[email protected]>
x86/pat: Fixpat_x_mtrr_type()for MTRR disabled caseEliav Farber <[email protected]>
EDAC/device: Fix period calculation inedac_device_reset_delay_period()Peter Zijlstra <[email protected]>
x86/boot: Avoid using Intel mnemonics in AT&T syntax asmKajol Jain <[email protected]>
powerpc/imc-pmu: Fix use of mutex in IRQs disabled sectionFlorian Westphal <[email protected]>
selftests: netfilter: fix transaction test script timeout handlingGavrilov Ilia <[email protected]>
netfilter: ipset: Fix overflow before widen in thebitmap_ip_create()function.Waiman Long <[email protected]>
sched/core: Fix use-after-free bug indup_user_cpus_ptr()Robin Murphy <[email protected]>
iommu/arm-smmu: ReportIOMMU_CAP_CACHE_COHERENCYeven bettererVladimir Oltean <[email protected]>
iommu/arm-smmu: Don't unregister on shutdownChristophe JAILLET <[email protected]>
iommu/mediatek-v1: Fix an error handling path inmtk_iommu_v1_probe()Vladimir Oltean <[email protected]>
iommu/arm-smmu-v3: Don't unregister on shutdownYunfei Wang <[email protected]>
iommu/iova: Fix alloc iova overflows issueAaron Thompson <[email protected]>
mm: Always release pages to the buddy allocator inmemblock_free_late().Saleemkhan Jamadar <[email protected]>
drm/amdgpu: enable VCN DPG for GC IP v11.0.4Saleemkhan Jamadar <[email protected]>
drm/amdgpu: Enable pg/cg flags onGC11_0_4for VCNYifan Zhang <[email protected]>
drm/amdgpu: add soc21 common ip block support for GC 11.0.4Evan Quan <[email protected]>
drm/amd/pm: enable GPO dynamic control support for SMU13.0.7Evan Quan <[email protected]>
drm/amd/pm: enable GPO dynamic control support for SMU13.0.0Candice Li <[email protected]>
drm/amd/pm: Enable bad memory page/channel recording support for smuv13_0_0Kenneth Feng <[email protected]>
drm/amd/pm: enable mode1 reset on smu_v13_0_10Ferry Toth <[email protected]>
usb: ulpi: deferulpi_registeronulpi_read_idtimeoutChris Wilson <[email protected]>
drm/i915/gt: Cleanup partial engine discovery failuresDaniil Tatianin <[email protected]>
iavf/iavf_main: actually log ->src mask when talking about itHerbert Xu <[email protected]>
ipv6: raw: Deduct extension header length inrawv6_push_pending_framesYang Yingliang <[email protected]>
ixgbe: fix pci device refcount leakHans de Goede <[email protected]>
platform/x86: sony-laptop: Don't turn off 0x153 keyboard backlight during probeKonrad Dybcio <[email protected]>
dt-bindings: msm/dsi: Don't require vcca-supply on 14nm PHYKonrad Dybcio <[email protected]>
dt-bindings: msm/dsi: Don't require vdds-supply on 10nm PHYKuogee Hsieh <[email protected]>
drm/msm/dp: do not completedp_aux_cmd_fifo_tx()if irq is not for aux transferHans de Goede <[email protected]>
platform/x86: ideapad-laptop: Add Legion 5 15ARH05 DMI id to set_fn_lock_led_list[]Liu Shixin <[email protected]>
arm64/mm: fix incorrectfile_map_countfor invalid pmdZenghui Yu <[email protected]>
arm64: ptrace: UseARM64_SMEto guard the SME register enumerationsBryan O'Donoghue <[email protected]>
dt-bindings: msm: dsi-phy-28nm: Add missing qcom, dsi-phy-regulator-ldo-modeLiu Shixin <[email protected]>
arm64/mm: addpud_user_exec()check inpud_user_accessible_page()Mark Brown <[email protected]>
arm64/signal: Always accept SVE signal frames on SME only systemsBryan O'Donoghue <[email protected]>
dt-bindings: msm: dsi-controller-main: Fix description of core clockBryan O'Donoghue <[email protected]>
dt-bindings: msm: dsi-controller-main: Fix power-domain constraintMark Brown <[email protected]>
arm64/signal: Always allocate SVE signal frames on SME only systemsKonrad Dybcio <[email protected]>
drm/msm/adreno: Make adreno quirks not overwrite each otherMarc Zyngier <[email protected]>
firmware/psci: Don't register with debugfs if PSCI isn't availableWill Deacon <[email protected]>
firmware/psci: FixMEM_PROTECT_RANGEfunction numbersDmitry Baryshkov <[email protected]>
drm/msm: another fix for the headless Adreno GPUBryan O'Donoghue <[email protected]>
dt-bindings: msm: dsi-controller-main: Fix operating-points-v2 constraintHans de Goede <[email protected]>
platform/x86: dell-privacy: FixSW_CAMERA_LENS_COVERreportingThomas Wei?schuh <[email protected]>
platform/x86: asus-wmi: Don't load fan curves without fanMark Pearson <[email protected]>
platform/x86:thinkpad_acpi: Fix profile mode display in AMT modeHans de Goede <[email protected]>
platform/x86: int3472/discrete: Ensure the clk/power enable pins are in output modeMaximilian Luz <[email protected]>
platform/surface: aggregator: Ignore command messages not intended for usHans de Goede <[email protected]>
platform/x86: dell-privacy: Only registerSW_CAMERA_LENS_COVERif presentHans de Goede <[email protected]>
ACPI: video: Allow selecting NVidia-WMI-EC or Apple GMUX backlight from the cmdlineChiYuan Huang <[email protected]>
ASoC: rt9120: Make dev PM runtime bind AsoC component PMJens Axboe <[email protected]>
io_uring/fdinfo: include locked hash table in fdinfo outputPaulo Alcantara <[email protected]>
cifs: fix double free on failed kerberos authPaulo Alcantara <[email protected]>
cifs: do not query ifaces on smb1 mountsPaulo Alcantara <[email protected]>
cifs: fix file info setting incifs_open_file()Paulo Alcantara <[email protected]>
cifs: fix file info setting incifs_query_path_info()Volker Lendecke <[email protected]>
cifs: Fix uninitialized memory read for smb311 posix symlink createAlex Deucher <[email protected]>
Revert "drm/amdgpu: Revert "drm/amdgpu: getting fan speed pwm for vega10 properly""Ao Zhong <[email protected]>
drm/amd/display: move remaining FPU code to dml folderEvan Quan <[email protected]>
drm/amd/pm: add the missing mapping for PPT feature on SMU13.0.0 and 13.0.7Evan Quan <[email protected]>
drm/amd/pm: correct the reference clock for fan speed(rpm) calculationYiPeng Chai <[email protected]>
drm/amdgpu: Fixed bug on error when unloading amdgpuMario Limonciello <[email protected]>
drm/amd: Delay removal of the firmware framebufferRob Clark <[email protected]>
drm/i915: Fix potential context UAFsNirmoy Das <[email protected]>
drm/i915: Reserve enough fence slot fori915_vma_unbind_asyncChris Wilson <[email protected]>
drm/i915/gt: Reset twiceArunpravin Paneer Selvam <[email protected]>
drm: Optimize drm buddy top-down allocation methodGuchun Chen <[email protected]>
drm/amd/pm/smu13: BACO is supported when it's in BACO stateRob Clark <[email protected]>
drm/virtio: Fix GEM handle creation UAFHeiko Carstens <[email protected]>
s390/percpu: addREAD_ONCE()toarch_this_cpu_to_op_simple()Heiko Carstens <[email protected]>
s390/cpum_sf: addREAD_ONCE()semantics to compare and swap loopsPerry Yuan <[email protected]>
cpufreq: amd-pstate: fix kernel hang issue while amd-pstate unregisteringCatalin Marinas <[email protected]>
elfcore: Add a cprm parameter to elf_core_extra_{phdrs,data_size}Brian Norris <[email protected]>
ASoC: qcom: lpass-cpu: Fix fallback SD line index handlingIvan T. Ivanov <[email protected]>
brcmfmac: Prefer DT board type over DMI board typeAlexander Egorenkov <[email protected]>
s390/kexec: fix ipl report address for kdumpAdrian Hunter <[email protected]>
perf auxtrace: Fix address filter duplicate symbol selectionNoor Azura Ahmad Tarmizi <[email protected]>
net: stmmac: add aux timestamps fifo clearance waitHans de Goede <[email protected]>
ACPI: Fix selecting wrong ACPI fwnode for the iGPU on some Dell laptopsMark Rutland <[email protected]>
arm64: cmpxchg_double*: hazard against entire exchange variableCatalin Marinas <[email protected]>
arm64: mte: Avoid the racy walk of the vma list during core dumpCatalin Marinas <[email protected]>
arm64: mte: Fix double-freeing of the temporary tag storage during coredumpJens Axboe <[email protected]>
io_uring/poll: add hash if ready poll request can't complete inlineJonathan Corbet <[email protected]>
docs: Fix the docs build with Sphinx 6.0Ard Biesheuvel <[email protected]>
efi: tpm: AvoidREAD_ONCE()for accessing the event logDing Hui <[email protected]>
efi: fix userspace infinite retry read efivars after EFI runtime services page faultMarc Zyngier <[email protected]>
KVM: arm64: Fix S1PTW handling on RO memslotsPaolo Bonzini <[email protected]>
KVM: x86: Do not return host topology information fromKVM_GET_SUPPORTED_CPUIDLuka Guzenko <[email protected]>
ALSA: hda/realtek: Enable mute/micmute LEDs on HP Spectre x360 13-aw0xxxYuchi Yang <[email protected]>
ALSA: hda/realtek - Turn on power earlyJaroslav Kysela <[email protected]>
ALSA: usb-audio: Always initializefixed_rateinsnd_usb_find_implicit_fb_sync_format()Jaroslav Kysela <[email protected]>
ALSA: control-led: use strscpy inset_led_id()Takashi Iwai <[email protected]>
Revert "ALSA: usb-audio: Drop superfluous interface setup at parsing"Pablo Neira Ayuso <[email protected]>
netfilter:nft_payload: incorrect arithmetics when fetching VLAN header bits-------------
Diffstat:
.../bindings/display/msm/dsi-controller-main.yaml | 4 +- .../bindings/display/msm/dsi-phy-10nm.yaml | 1 - .../bindings/display/msm/dsi-phy-14nm.yaml | 1 - .../bindings/display/msm/dsi-phy-28nm.yaml | 4 + Documentation/gpu/todo.rst | 11 - Documentation/sphinx/load_config.py | 6 +- Documentation/virt/kvm/api.rst | 14 + Makefile | 4 +- arch/arm64/include/asm/atomic_ll_sc.h | 2 +- arch/arm64/include/asm/atomic_lse.h | 2 +- arch/arm64/include/asm/kvm_emulate.h | 22 +- arch/arm64/include/asm/pgtable.h | 6 +- arch/arm64/kernel/elfcore.c | 61 ++- arch/arm64/kernel/ptrace.c | 2 +- arch/arm64/kernel/signal.c | 9 +- arch/ia64/kernel/elfcore.c | 4 +- arch/powerpc/include/asm/imc-pmu.h | 2 +- arch/powerpc/perf/imc-pmu.c | 136 +++--- arch/s390/include/asm/cpu_mf.h | 31 +- arch/s390/include/asm/percpu.h | 2 +- arch/s390/kernel/machine_kexec_file.c | 5 +- arch/s390/kernel/perf_cpum_sf.c | 101 +++-- arch/x86/boot/bioscall.S | 4 +- arch/x86/kernel/cpu/resctrl/monitor.c | 49 ++- arch/x86/kernel/cpu/resctrl/rdtgroup.c | 12 +- arch/x86/kvm/cpuid.c | 32 +- arch/x86/mm/pat/memtype.c | 3 +- arch/x86/um/elfcore.c | 4 +- block/blk-core.c | 70 +-- block/blk-crypto-internal.h | 10 +- block/blk-crypto-sysfs.c | 11 +- block/blk-ia-ranges.c | 3 +- block/blk-merge.c | 4 +- block/blk-mq.c | 38 +- block/blk-mq.h | 14 +- block/blk-sysfs.c | 134 +++--- block/blk.h | 13 +- block/bsg.c | 11 +- block/elevator.c | 2 +- block/genhd.c | 2 +- drivers/acpi/glue.c | 14 +- drivers/acpi/scan.c | 7 +- drivers/acpi/video_detect.c | 4 + drivers/block/drbd/drbd_req.c | 2 + drivers/block/ps3vram.c | 2 + drivers/cpufreq/amd-pstate.c | 1 + drivers/edac/edac_device.c | 17 +- drivers/edac/edac_module.h | 2 +- drivers/firmware/efi/efi.c | 9 +- drivers/firmware/efi/runtime-wrappers.c | 1 + drivers/firmware/psci/psci.c | 3 + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 8 + drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 6 - drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 5 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 2 +- drivers/gpu/drm/amd/amdgpu/soc21.c | 11 + .../gpu/drm/amd/display/dc/dcn32/dcn32_resource.c | 5 +- .../gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c | 8 + .../gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h | 3 + .../drm/amd/pm/powerplay/hwmgr/vega10_thermal.c | 25 +- drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h | 4 + .../amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h | 8 +- drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h | 5 +- drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h | 3 + drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 23 +- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 95 +++- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 3 + drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c | 18 + drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h | 3 + drivers/gpu/drm/drm_buddy.c | 81 ++-- drivers/gpu/drm/i915/gem/i915_gem_context.c | 24 +- drivers/gpu/drm/i915/gt/intel_engine_cs.c | 7 +- drivers/gpu/drm/i915/gt/intel_gt_sysfs.c | 15 +- drivers/gpu/drm/i915/gt/intel_gt_sysfs.h | 2 +- drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.c | 461 +++++++++----------- drivers/gpu/drm/i915/gt/intel_reset.c | 34 +- drivers/gpu/drm/i915/i915_vma.c | 2 +- drivers/gpu/drm/msm/adreno/adreno_gpu.h | 10 +- .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 3 +- drivers/gpu/drm/msm/dp/dp_aux.c | 4 + drivers/gpu/drm/msm/msm_drv.c | 2 +- drivers/gpu/drm/msm/msm_mdss.c | 6 +- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 19 +- drivers/gpu/drm/vmwgfx/Makefile | 2 +- drivers/gpu/drm/vmwgfx/ttm_object.c | 156 +++---- drivers/gpu/drm/vmwgfx/ttm_object.h | 32 +- drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 38 -- drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c | 62 ++- drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 71 ++- drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 29 +- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 190 ++++---- drivers/gpu/drm/vmwgfx/vmwgfx_hashtab.c | 199 --------- drivers/gpu/drm/vmwgfx/vmwgfx_hashtab.h | 83 ---- drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 33 -- drivers/gpu/drm/vmwgfx/vmwgfx_validation.c | 55 ++- drivers/gpu/drm/vmwgfx/vmwgfx_validation.h | 26 +- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 4 +- drivers/iommu/arm/arm-smmu/arm-smmu.c | 32 +- drivers/iommu/iova.c | 4 +- drivers/iommu/mtk_iommu_v1.c | 4 +- drivers/md/dm.c | 2 + drivers/md/md.c | 2 + drivers/mtd/parsers/scpart.c | 2 +- drivers/mtd/spi-nor/core.c | 1 + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 +- .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 2 +- drivers/net/ethernet/intel/iavf/iavf_main.c | 2 +- drivers/net/ethernet/intel/ice/ice_gnss.c | 24 +- drivers/net/ethernet/intel/igc/igc_defines.h | 2 + drivers/net/ethernet/intel/igc/igc_ptp.c | 10 +- drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 14 +- drivers/net/ethernet/marvell/octeontx2/af/cgx.c | 4 +- drivers/net/ethernet/marvell/octeontx2/af/cgx.h | 1 - .../net/ethernet/marvell/octeontx2/nic/otx2_vf.c | 2 + drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 13 +- .../ethernet/mellanox/mlx5/core/en/tc_tun_vxlan.c | 2 + .../ethernet/mellanox/mlx5/core/en_accel/macsec.c | 19 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 3 + drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 5 +- .../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 2 +- .../ethernet/mellanox/mlx5/core/ipoib/ethtool.c | 16 +- .../net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c | 38 ++ .../net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h | 6 + .../ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c | 18 +- .../net/ethernet/mellanox/mlx5/core/lib/clock.c | 2 +- .../net/ethernet/microchip/lan966x/lan966x_ptp.c | 3 + drivers/net/ethernet/realtek/r8169_main.c | 5 +- .../net/ethernet/stmicro/stmmac/dwmac-mediatek.c | 26 -- drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | 5 +- .../net/wireless/broadcom/brcm80211/brcmfmac/of.c | 5 +- drivers/nfc/pn533/usb.c | 44 +- drivers/nvme/host/multipath.c | 2 + drivers/pinctrl/pinctrl-amd.c | 10 +- drivers/platform/surface/aggregator/controller.c | 4 +- .../surface/aggregator/ssh_request_layer.c | 14 + drivers/platform/x86/amd/pmc.c | 2 +- drivers/platform/x86/asus-wmi.c | 3 + drivers/platform/x86/dell/dell-wmi-privacy.c | 41 +- drivers/platform/x86/ideapad-laptop.c | 6 + .../platform/x86/intel/int3472/clk_and_regulator.c | 3 + drivers/platform/x86/intel/int3472/discrete.c | 4 + drivers/platform/x86/sony-laptop.c | 21 +- drivers/platform/x86/thinkpad_acpi.c | 23 +- drivers/regulator/da9211-regulator.c | 11 +- drivers/s390/block/dcssblk.c | 2 + drivers/scsi/mpi3mr/Makefile | 2 +- drivers/scsi/storvsc_drv.c | 3 + drivers/tty/hvc/hvc_xen.c | 46 +- drivers/ufs/core/ufshcd.c | 26 ++ fs/binfmt_elf.c | 4 +- fs/binfmt_elf_fdpic.c | 4 +- fs/cifs/connect.c | 9 +- fs/cifs/link.c | 1 + fs/cifs/smb1ops.c | 63 +-- fs/cifs/smb2pdu.c | 5 +- fs/nfsd/filecache.c | 484 ++++++++++++--------- fs/nfsd/filecache.h | 9 +- fs/nfsd/nfs3proc.c | 10 +- fs/nfsd/nfs4proc.c | 11 +- fs/nfsd/nfs4state.c | 20 +- fs/nfsd/trace.h | 129 +++--- fs/nfsd/vfs.c | 19 +- fs/nfsd/vfs.h | 3 +- include/acpi/acpi_bus.h | 3 +- include/linux/blk-mq.h | 4 + include/linux/blkdev.h | 15 +- include/linux/elfcore.h | 8 +- include/linux/mlx5/driver.h | 2 +- include/linux/mtd/spi-nor.h | 1 - include/linux/tpm_eventlog.h | 4 +- include/uapi/linux/psci.h | 4 +- io_uring/fdinfo.c | 12 +- io_uring/io-wq.c | 6 + io_uring/poll.c | 50 ++- io_uring/rw.c | 6 +- kernel/sched/core.c | 41 +- mm/memblock.c | 8 +- net/core/gro.c | 71 +-- net/ipv6/raw.c | 4 + net/netfilter/ipset/ip_set_bitmap_ip.c | 4 +- net/netfilter/nft_payload.c | 2 +- net/sched/act_mpls.c | 8 +- net/tipc/node.c | 12 +- sound/core/control_led.c | 5 +- sound/pci/hda/patch_realtek.c | 53 ++- sound/soc/codecs/rt9120.c | 12 + sound/soc/codecs/wm8904.c | 7 + sound/soc/intel/boards/Kconfig | 1 + sound/soc/intel/boards/sof_nau8825.c | 22 +- sound/soc/intel/common/soc-acpi-intel-adl-match.c | 18 +- sound/soc/qcom/Kconfig | 21 +- sound/soc/qcom/Makefile | 2 + sound/soc/qcom/common.c | 114 ----- sound/soc/qcom/common.h | 10 - sound/soc/qcom/lpass-cpu.c | 5 +- sound/soc/qcom/sc8280xp.c | 1 + sound/soc/qcom/sdw.c | 123 ++++++ sound/soc/qcom/sdw.h | 18 + sound/soc/qcom/sm8250.c | 1 + sound/usb/implicit.c | 3 +- sound/usb/pcm.c | 16 +- sound/usb/stream.c | 6 + tools/include/nolibc/arch-mips.h | 2 + tools/include/nolibc/arch-riscv.h | 14 +- tools/perf/builtin-kmem.c | 65 ++- tools/perf/builtin-trace.c | 2 + tools/perf/util/auxtrace.c | 2 +- tools/perf/util/bpf_counter.h | 6 + tools/testing/memblock/internal.h | 4 + .../testing/selftests/net/af_unix/test_unix_oob.c | 2 +- tools/testing/selftests/net/l2_tos_ttl_inherit.sh | 202 +++++---- .../selftests/netfilter/nft_trans_stress.sh | 16 +- tools/testing/selftests/netfilter/settings | 1 + 214 files changed, 2806 insertions(+), 2326 deletions(-)
Greg Kroah-Hartman
maintainerQuoted 11 lines · Wang Yugui
Hi,
fstests(generic/034, xfs)panic when 6.1.7-rc1, but not panic when 6.1.6.It seems patch *1 related.
*1 Subject: blk-mq: move thesrcu_structused for quiescing to the tagset
From: Christoph Hellwig <[email protected]>This patch has been drop from 6.1.2-rc1. and it now added in 6.1.7-rc1 again.
the panic in 6.1.7-rc1 is almost same as that in 6.1.2-rc1.
Argh, yes, let me go drop these again.
Sasha, can you blacklist these from your tools so they don't get picked up again?
thanks,
greg k-h
Hi,
Quoted 9 lines · Wang Yugui
Quoted 8 lines
Hi,
fstests(generic/034, xfs)panic when 6.1.7-rc1, but not panic when 6.1.6.It seems patch *1 related.
*1 Subject: blk-mq: move thesrcu_structused for quiescing to the tagset
From: Christoph Hellwig <[email protected]>
Quoted 8 lines
Quoted 3 lines
This patch has been drop from 6.1.2-rc1. and it now added in 6.1.7-rc1 again.
the panic in 6.1.7-rc1 is almost same as that in 6.1.2-rc1.
Argh, yes, let me go drop these again.
Sasha, can you blacklist these from your tools so they don't get picked up again?
this panic does not happen on upstream 6.2.0-rc4. or maybe we need a bigger patch set?
Best Regards
Wang Yugui ([email protected])
2023/01/18
Greg Kroah-Hartman
maintainerQuoted 15 lines · Wang Yugui
Hi,
Quoted 13 lines · Wang Yugui
Quoted 11 lines
Hi,
fstests(generic/034, xfs)panic when 6.1.7-rc1, but not panic when 6.1.6.It seems patch *1 related.
*1 Subject: blk-mq: move thesrcu_structused for quiescing to the tagset
From: Christoph Hellwig <[email protected]>This patch has been drop from 6.1.2-rc1. and it now added in 6.1.7-rc1 again.
the panic in 6.1.7-rc1 is almost same as that in 6.1.2-rc1.
Quoted 7 lines
Quoted 4 lines
Argh, yes, let me go drop these again.
Sasha, can you blacklist these from your tools so they don't get picked up again?
this panic does not happen on upstream 6.2.0-rc4. or maybe we need a bigger patch set?
We just need to stop attempting to backport these to 6.1 :)
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.7 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
Hi Greg,
6.1.7-rc1 tested.
Run tested on:
- Allwinner H6 (Tanix TX6)
- Intel Alder Lake x86_64 (nuc12 i7-1260P)
In addition - build tested for:
- Allwinner A64
- Allwinner H3
- Allwinner H5
- NXP iMX6
- NXP iMX8
- Qualcomm Dragonboard
- Rockchip RK3288
- Rockchip RK3328
- Rockchip RK3399pro
- Samsung Exynos
--
Rudi
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.7 release. There are 183 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.
Successfully cross-compiled for arm64 (bcm2711_defconfig, GCC 10.2.0) and powerpc (ps3_defconfig, GCC 12.2.0).
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.7 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.7 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.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:
Following clang nightly build errors noticed:arch/x86/kernel/fpu/init.c:175:2: error: 'struct (unnamed at arch/x86/kernel/fpu/init.c:175:2)' cannot be defined in '__builtin_offsetof'
CHECK_MEMBER_AT_END_OF(struct fpu, __fpstate);
^## Build
* kernel: 6.1.7-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-6.1.y
* git commit: ffb1fddbd4d044faca0f92a51a9942cc50be62be
* git describe: v6.1.5-201-gffb1fddbd4d0
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.1.y/build/v6.1.5-201-gffb1fddbd4d0
## Test Regressions (compared to v6.1.5-11-g5eedeabf82ee)
## Metric Regressions (compared to v6.1.5-11-g5eedeabf82ee)
## Test Fixes (compared to v6.1.5-11-g5eedeabf82ee)
## Metric Fixes (compared to v6.1.5-11-g5eedeabf82ee)
## Test result summary
total: 153284, pass: 136295, fail: 4201, skip: 12767, xfail: 21
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 151 total, 148 passed, 3 failed
* arm64: 51 total, 50 passed, 1 failed
* i386: 39 total, 31 passed, 8 failed
* mips: 30 total, 28 passed, 2 failed
* parisc: 8 total, 8 passed, 0 failed
* powerpc: 38 total, 32 passed, 6 failed
* riscv: 16 total, 15 passed, 1 failed
* s390: 16 total, 13 passed, 3 failed
* sh: 14 total, 12 passed, 2 failed
* sparc: 8 total, 8 passed, 0 failed
* x86_64: 44 total, 38 passed, 6 failed
## Test suites summary
* boot
* fwts
* igt-gpu-tools
* kselftest-android
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers-dma-buf
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-firmware
* kselftest-fpu
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net-forwarding
* kselftest-net-mptcp
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-cap_bounds
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-filecaps
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-fsx
* ltp-hugetlb
* ltp-io
* ltp-ipc
* ltp-math
* ltp-math++
* ltp-mm
* ltp-nptl
* ltp-open-posix-tests
* ltp-pty
* ltp-sched
* ltp-securebits
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* network-basic-tests
* packetdrill
* perf
* rcutorture
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.7 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.1:
11 builds: 11 pass, 0 fail
28 boots: 28 pass, 0 fail
130 tests: 130 pass, 0 failLinux version: 6.1.7-rc1-gffb1fddbd4d0
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.7 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
Build test (gcc version 12.2.1 20221127):
mips: 52 configs -> no failure
arm: 100 configs -> no failure
arm64: 3 configs -> no failurex86_64: 4 configs -> no failure alpha allmodconfig -> no failure csky allmodconfig -> no failure powerpc allmodconfig -> no failure riscv allmodconfig -> no failure s390 allmodconfig -> no failure xtensa allmodconfig -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
arm64: Booted on rpi4b (4GB model). No regression. [2]
[1]. https://openqa.qa.codethink.co.uk/tests/2663
[2]. https://openqa.qa.codethink.co.uk/tests/2665
Signature · 2 lines
Regards Sudip
Quoted 9 lines
This is the start of the stable review cycle for the 6.1.7 release. There are 183 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 18 Jan 2023 15:47:28 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my x86_64 and ARM64 test systems. No errors or regressions.
Thanks.