Archive-only list for patches
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	patches@lists.linux.dev, Ma Jun <Jun.Ma2@amd.com>,
	Felix Kuehling <Felix.Kuehling@amd.com>,
	Alex Deucher <alexander.deucher@amd.com>,
	"Limonciello, Mario" <Mario.Limonciello@amd.com>
Subject: [PATCH 6.1 222/224] drm/amdkfd: Fix the warning of array-index-out-of-bounds
Date: Tue, 28 Mar 2023 16:43:38 +0200	[thread overview]
Message-ID: <20230328142626.545766087@linuxfoundation.org> (raw)
In-Reply-To: <20230328142617.205414124@linuxfoundation.org>

From: Ma Jun <Jun.Ma2@amd.com>

commit c0cc999f3c32e65a7c88fb323893ddf897b24488 upstream.

For some GPUs with more CUs, the original sibling_map[32]
in struct crat_subtype_cache is not enough
to save the cache information when create the VCRAT table,
so skip filling the struct crat_subtype_cache info instead
fill struct kfd_cache_properties directly to fix this problem.

Signed-off-by: Ma Jun <Jun.Ma2@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: "Limonciello, Mario" <Mario.Limonciello@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 drivers/gpu/drm/amd/amdkfd/kfd_crat.c     |  312 +++---------------------------
 drivers/gpu/drm/amd/amdkfd/kfd_crat.h     |   12 +
 drivers/gpu/drm/amd/amdkfd/kfd_topology.c |  245 ++++++++++++++++++++++-
 drivers/gpu/drm/amd/amdkfd/kfd_topology.h |    5 
 4 files changed, 282 insertions(+), 292 deletions(-)

--- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
@@ -50,16 +50,6 @@ static inline unsigned int get_and_inc_g
 	return current_id;
 }
 
-/* Static table to describe GPU Cache information */
-struct kfd_gpu_cache_info {
-	uint32_t	cache_size;
-	uint32_t	cache_level;
-	uint32_t	flags;
-	/* Indicates how many Compute Units share this cache
-	 * within a SA. Value = 1 indicates the cache is not shared
-	 */
-	uint32_t	num_cu_shared;
-};
 
 static struct kfd_gpu_cache_info kaveri_cache_info[] = {
 	{
@@ -1119,9 +1109,13 @@ static int kfd_parse_subtype_cache(struc
 			props->cachelines_per_tag = cache->lines_per_tag;
 			props->cache_assoc = cache->associativity;
 			props->cache_latency = cache->cache_latency;
+
 			memcpy(props->sibling_map, cache->sibling_map,
 					sizeof(props->sibling_map));
 
+			/* set the sibling_map_size as 32 for CRAT from ACPI */
+			props->sibling_map_size = CRAT_SIBLINGMAP_SIZE;
+
 			if (cache->flags & CRAT_CACHE_FLAGS_DATA_CACHE)
 				props->cache_type |= HSA_CACHE_TYPE_DATA;
 			if (cache->flags & CRAT_CACHE_FLAGS_INST_CACHE)
@@ -1339,125 +1333,6 @@ err:
 	return ret;
 }
 
-/* Helper function. See kfd_fill_gpu_cache_info for parameter description */
-static int fill_in_l1_pcache(struct crat_subtype_cache *pcache,
-				struct kfd_gpu_cache_info *pcache_info,
-				struct kfd_cu_info *cu_info,
-				int mem_available,
-				int cu_bitmask,
-				int cache_type, unsigned int cu_processor_id,
-				int cu_block)
-{
-	unsigned int cu_sibling_map_mask;
-	int first_active_cu;
-
-	/* First check if enough memory is available */
-	if (sizeof(struct crat_subtype_cache) > mem_available)
-		return -ENOMEM;
-
-	cu_sibling_map_mask = cu_bitmask;
-	cu_sibling_map_mask >>= cu_block;
-	cu_sibling_map_mask &=
-		((1 << pcache_info[cache_type].num_cu_shared) - 1);
-	first_active_cu = ffs(cu_sibling_map_mask);
-
-	/* CU could be inactive. In case of shared cache find the first active
-	 * CU. and incase of non-shared cache check if the CU is inactive. If
-	 * inactive active skip it
-	 */
-	if (first_active_cu) {
-		memset(pcache, 0, sizeof(struct crat_subtype_cache));
-		pcache->type = CRAT_SUBTYPE_CACHE_AFFINITY;
-		pcache->length = sizeof(struct crat_subtype_cache);
-		pcache->flags = pcache_info[cache_type].flags;
-		pcache->processor_id_low = cu_processor_id
-					 + (first_active_cu - 1);
-		pcache->cache_level = pcache_info[cache_type].cache_level;
-		pcache->cache_size = pcache_info[cache_type].cache_size;
-
-		/* Sibling map is w.r.t processor_id_low, so shift out
-		 * inactive CU
-		 */
-		cu_sibling_map_mask =
-			cu_sibling_map_mask >> (first_active_cu - 1);
-
-		pcache->sibling_map[0] = (uint8_t)(cu_sibling_map_mask & 0xFF);
-		pcache->sibling_map[1] =
-				(uint8_t)((cu_sibling_map_mask >> 8) & 0xFF);
-		pcache->sibling_map[2] =
-				(uint8_t)((cu_sibling_map_mask >> 16) & 0xFF);
-		pcache->sibling_map[3] =
-				(uint8_t)((cu_sibling_map_mask >> 24) & 0xFF);
-		return 0;
-	}
-	return 1;
-}
-
-/* Helper function. See kfd_fill_gpu_cache_info for parameter description */
-static int fill_in_l2_l3_pcache(struct crat_subtype_cache *pcache,
-				struct kfd_gpu_cache_info *pcache_info,
-				struct kfd_cu_info *cu_info,
-				int mem_available,
-				int cache_type, unsigned int cu_processor_id)
-{
-	unsigned int cu_sibling_map_mask;
-	int first_active_cu;
-	int i, j, k;
-
-	/* First check if enough memory is available */
-	if (sizeof(struct crat_subtype_cache) > mem_available)
-		return -ENOMEM;
-
-	cu_sibling_map_mask = cu_info->cu_bitmap[0][0];
-	cu_sibling_map_mask &=
-		((1 << pcache_info[cache_type].num_cu_shared) - 1);
-	first_active_cu = ffs(cu_sibling_map_mask);
-
-	/* CU could be inactive. In case of shared cache find the first active
-	 * CU. and incase of non-shared cache check if the CU is inactive. If
-	 * inactive active skip it
-	 */
-	if (first_active_cu) {
-		memset(pcache, 0, sizeof(struct crat_subtype_cache));
-		pcache->type = CRAT_SUBTYPE_CACHE_AFFINITY;
-		pcache->length = sizeof(struct crat_subtype_cache);
-		pcache->flags = pcache_info[cache_type].flags;
-		pcache->processor_id_low = cu_processor_id
-					 + (first_active_cu - 1);
-		pcache->cache_level = pcache_info[cache_type].cache_level;
-		pcache->cache_size = pcache_info[cache_type].cache_size;
-
-		/* Sibling map is w.r.t processor_id_low, so shift out
-		 * inactive CU
-		 */
-		cu_sibling_map_mask =
-			cu_sibling_map_mask >> (first_active_cu - 1);
-		k = 0;
-		for (i = 0; i < cu_info->num_shader_engines; i++) {
-			for (j = 0; j < cu_info->num_shader_arrays_per_engine;
-				j++) {
-				pcache->sibling_map[k] =
-				 (uint8_t)(cu_sibling_map_mask & 0xFF);
-				pcache->sibling_map[k+1] =
-				 (uint8_t)((cu_sibling_map_mask >> 8) & 0xFF);
-				pcache->sibling_map[k+2] =
-				 (uint8_t)((cu_sibling_map_mask >> 16) & 0xFF);
-				pcache->sibling_map[k+3] =
-				 (uint8_t)((cu_sibling_map_mask >> 24) & 0xFF);
-				k += 4;
-				cu_sibling_map_mask =
-					cu_info->cu_bitmap[i % 4][j + i / 4];
-				cu_sibling_map_mask &= (
-				 (1 << pcache_info[cache_type].num_cu_shared)
-				 - 1);
-			}
-		}
-		return 0;
-	}
-	return 1;
-}
-
-#define KFD_MAX_CACHE_TYPES 6
 
 static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev,
 						   struct kfd_gpu_cache_info *pcache_info)
@@ -1531,231 +1406,133 @@ static int kfd_fill_gpu_cache_info_from_
 	return i;
 }
 
-/* kfd_fill_gpu_cache_info - Fill GPU cache info using kfd_gpu_cache_info
- * tables
- *
- *	@kdev - [IN] GPU device
- *	@gpu_processor_id - [IN] GPU processor ID to which these caches
- *			    associate
- *	@available_size - [IN] Amount of memory available in pcache
- *	@cu_info - [IN] Compute Unit info obtained from KGD
- *	@pcache - [OUT] memory into which cache data is to be filled in.
- *	@size_filled - [OUT] amount of data used up in pcache.
- *	@num_of_entries - [OUT] number of caches added
- */
-static int kfd_fill_gpu_cache_info(struct kfd_dev *kdev,
-			int gpu_processor_id,
-			int available_size,
-			struct kfd_cu_info *cu_info,
-			struct crat_subtype_cache *pcache,
-			int *size_filled,
-			int *num_of_entries)
+int kfd_get_gpu_cache_info(struct kfd_dev *kdev, struct kfd_gpu_cache_info **pcache_info)
 {
-	struct kfd_gpu_cache_info *pcache_info;
-	struct kfd_gpu_cache_info cache_info[KFD_MAX_CACHE_TYPES];
 	int num_of_cache_types = 0;
-	int i, j, k;
-	int ct = 0;
-	int mem_available = available_size;
-	unsigned int cu_processor_id;
-	int ret;
-	unsigned int num_cu_shared;
 
 	switch (kdev->adev->asic_type) {
 	case CHIP_KAVERI:
-		pcache_info = kaveri_cache_info;
+		*pcache_info = kaveri_cache_info;
 		num_of_cache_types = ARRAY_SIZE(kaveri_cache_info);
 		break;
 	case CHIP_HAWAII:
-		pcache_info = hawaii_cache_info;
+		*pcache_info = hawaii_cache_info;
 		num_of_cache_types = ARRAY_SIZE(hawaii_cache_info);
 		break;
 	case CHIP_CARRIZO:
-		pcache_info = carrizo_cache_info;
+		*pcache_info = carrizo_cache_info;
 		num_of_cache_types = ARRAY_SIZE(carrizo_cache_info);
 		break;
 	case CHIP_TONGA:
-		pcache_info = tonga_cache_info;
+		*pcache_info = tonga_cache_info;
 		num_of_cache_types = ARRAY_SIZE(tonga_cache_info);
 		break;
 	case CHIP_FIJI:
-		pcache_info = fiji_cache_info;
+		*pcache_info = fiji_cache_info;
 		num_of_cache_types = ARRAY_SIZE(fiji_cache_info);
 		break;
 	case CHIP_POLARIS10:
-		pcache_info = polaris10_cache_info;
+		*pcache_info = polaris10_cache_info;
 		num_of_cache_types = ARRAY_SIZE(polaris10_cache_info);
 		break;
 	case CHIP_POLARIS11:
-		pcache_info = polaris11_cache_info;
+		*pcache_info = polaris11_cache_info;
 		num_of_cache_types = ARRAY_SIZE(polaris11_cache_info);
 		break;
 	case CHIP_POLARIS12:
-		pcache_info = polaris12_cache_info;
+		*pcache_info = polaris12_cache_info;
 		num_of_cache_types = ARRAY_SIZE(polaris12_cache_info);
 		break;
 	case CHIP_VEGAM:
-		pcache_info = vegam_cache_info;
+		*pcache_info = vegam_cache_info;
 		num_of_cache_types = ARRAY_SIZE(vegam_cache_info);
 		break;
 	default:
 		switch (KFD_GC_VERSION(kdev)) {
 		case IP_VERSION(9, 0, 1):
-			pcache_info = vega10_cache_info;
+			*pcache_info = vega10_cache_info;
 			num_of_cache_types = ARRAY_SIZE(vega10_cache_info);
 			break;
 		case IP_VERSION(9, 2, 1):
-			pcache_info = vega12_cache_info;
+			*pcache_info = vega12_cache_info;
 			num_of_cache_types = ARRAY_SIZE(vega12_cache_info);
 			break;
 		case IP_VERSION(9, 4, 0):
 		case IP_VERSION(9, 4, 1):
-			pcache_info = vega20_cache_info;
+			*pcache_info = vega20_cache_info;
 			num_of_cache_types = ARRAY_SIZE(vega20_cache_info);
 			break;
 		case IP_VERSION(9, 4, 2):
-			pcache_info = aldebaran_cache_info;
+			*pcache_info = aldebaran_cache_info;
 			num_of_cache_types = ARRAY_SIZE(aldebaran_cache_info);
 			break;
 		case IP_VERSION(9, 1, 0):
 		case IP_VERSION(9, 2, 2):
-			pcache_info = raven_cache_info;
+			*pcache_info = raven_cache_info;
 			num_of_cache_types = ARRAY_SIZE(raven_cache_info);
 			break;
 		case IP_VERSION(9, 3, 0):
-			pcache_info = renoir_cache_info;
+			*pcache_info = renoir_cache_info;
 			num_of_cache_types = ARRAY_SIZE(renoir_cache_info);
 			break;
 		case IP_VERSION(10, 1, 10):
 		case IP_VERSION(10, 1, 2):
 		case IP_VERSION(10, 1, 3):
 		case IP_VERSION(10, 1, 4):
-			pcache_info = navi10_cache_info;
+			*pcache_info = navi10_cache_info;
 			num_of_cache_types = ARRAY_SIZE(navi10_cache_info);
 			break;
 		case IP_VERSION(10, 1, 1):
-			pcache_info = navi14_cache_info;
+			*pcache_info = navi14_cache_info;
 			num_of_cache_types = ARRAY_SIZE(navi14_cache_info);
 			break;
 		case IP_VERSION(10, 3, 0):
-			pcache_info = sienna_cichlid_cache_info;
+			*pcache_info = sienna_cichlid_cache_info;
 			num_of_cache_types = ARRAY_SIZE(sienna_cichlid_cache_info);
 			break;
 		case IP_VERSION(10, 3, 2):
-			pcache_info = navy_flounder_cache_info;
+			*pcache_info = navy_flounder_cache_info;
 			num_of_cache_types = ARRAY_SIZE(navy_flounder_cache_info);
 			break;
 		case IP_VERSION(10, 3, 4):
-			pcache_info = dimgrey_cavefish_cache_info;
+			*pcache_info = dimgrey_cavefish_cache_info;
 			num_of_cache_types = ARRAY_SIZE(dimgrey_cavefish_cache_info);
 			break;
 		case IP_VERSION(10, 3, 1):
-			pcache_info = vangogh_cache_info;
+			*pcache_info = vangogh_cache_info;
 			num_of_cache_types = ARRAY_SIZE(vangogh_cache_info);
 			break;
 		case IP_VERSION(10, 3, 5):
-			pcache_info = beige_goby_cache_info;
+			*pcache_info = beige_goby_cache_info;
 			num_of_cache_types = ARRAY_SIZE(beige_goby_cache_info);
 			break;
 		case IP_VERSION(10, 3, 3):
-			pcache_info = yellow_carp_cache_info;
+			*pcache_info = yellow_carp_cache_info;
 			num_of_cache_types = ARRAY_SIZE(yellow_carp_cache_info);
 			break;
 		case IP_VERSION(10, 3, 6):
-			pcache_info = gc_10_3_6_cache_info;
+			*pcache_info = gc_10_3_6_cache_info;
 			num_of_cache_types = ARRAY_SIZE(gc_10_3_6_cache_info);
 			break;
 		case IP_VERSION(10, 3, 7):
-			pcache_info = gfx1037_cache_info;
+			*pcache_info = gfx1037_cache_info;
 			num_of_cache_types = ARRAY_SIZE(gfx1037_cache_info);
 			break;
 		case IP_VERSION(11, 0, 0):
 		case IP_VERSION(11, 0, 1):
 		case IP_VERSION(11, 0, 2):
 		case IP_VERSION(11, 0, 3):
-			pcache_info = cache_info;
 			num_of_cache_types =
-				kfd_fill_gpu_cache_info_from_gfx_config(kdev, pcache_info);
+				kfd_fill_gpu_cache_info_from_gfx_config(kdev, *pcache_info);
 			break;
 		default:
-			pcache_info = dummy_cache_info;
+			*pcache_info = dummy_cache_info;
 			num_of_cache_types = ARRAY_SIZE(dummy_cache_info);
 			pr_warn("dummy cache info is used temporarily and real cache info need update later.\n");
 			break;
 		}
 	}
-
-	*size_filled = 0;
-	*num_of_entries = 0;
-
-	/* For each type of cache listed in the kfd_gpu_cache_info table,
-	 * go through all available Compute Units.
-	 * The [i,j,k] loop will
-	 *		if kfd_gpu_cache_info.num_cu_shared = 1
-	 *			will parse through all available CU
-	 *		If (kfd_gpu_cache_info.num_cu_shared != 1)
-	 *			then it will consider only one CU from
-	 *			the shared unit
-	 */
-
-	for (ct = 0; ct < num_of_cache_types; ct++) {
-	  cu_processor_id = gpu_processor_id;
-	  if (pcache_info[ct].cache_level == 1) {
-	    for (i = 0; i < cu_info->num_shader_engines; i++) {
-	      for (j = 0; j < cu_info->num_shader_arrays_per_engine; j++) {
-	        for (k = 0; k < cu_info->num_cu_per_sh;
-		  k += pcache_info[ct].num_cu_shared) {
-		  ret = fill_in_l1_pcache(pcache,
-					pcache_info,
-					cu_info,
-					mem_available,
-					cu_info->cu_bitmap[i % 4][j + i / 4],
-					ct,
-					cu_processor_id,
-					k);
-
-		  if (ret < 0)
-			break;
-
-		  if (!ret) {
-				pcache++;
-				(*num_of_entries)++;
-				mem_available -= sizeof(*pcache);
-				(*size_filled) += sizeof(*pcache);
-		  }
-
-		  /* Move to next CU block */
-		  num_cu_shared = ((k + pcache_info[ct].num_cu_shared) <=
-					cu_info->num_cu_per_sh) ?
-					pcache_info[ct].num_cu_shared :
-					(cu_info->num_cu_per_sh - k);
-		  cu_processor_id += num_cu_shared;
-		}
-	      }
-	    }
-	  } else {
-			ret = fill_in_l2_l3_pcache(pcache,
-				pcache_info,
-				cu_info,
-				mem_available,
-				ct,
-				cu_processor_id);
-
-			if (ret < 0)
-				break;
-
-			if (!ret) {
-				pcache++;
-				(*num_of_entries)++;
-				mem_available -= sizeof(*pcache);
-				(*size_filled) += sizeof(*pcache);
-			}
-	  }
-	}
-
-	pr_debug("Added [%d] GPU cache entries\n", *num_of_entries);
-
-	return 0;
+	return num_of_cache_types;
 }
 
 static bool kfd_ignore_crat(void)
@@ -2314,8 +2091,6 @@ static int kfd_create_vcrat_image_gpu(vo
 	struct kfd_cu_info cu_info;
 	int avail_size = *size;
 	uint32_t total_num_of_cu;
-	int num_of_cache_entries = 0;
-	int cache_mem_filled = 0;
 	uint32_t nid = 0;
 	int ret = 0;
 
@@ -2416,31 +2191,12 @@ static int kfd_create_vcrat_image_gpu(vo
 	crat_table->length += sizeof(struct crat_subtype_memory);
 	crat_table->total_entries++;
 
-	/* TODO: Fill in cache information. This information is NOT readily
-	 * available in KGD
-	 */
-	sub_type_hdr = (typeof(sub_type_hdr))((char *)sub_type_hdr +
-		sub_type_hdr->length);
-	ret = kfd_fill_gpu_cache_info(kdev, cu->processor_id_low,
-				avail_size,
-				&cu_info,
-				(struct crat_subtype_cache *)sub_type_hdr,
-				&cache_mem_filled,
-				&num_of_cache_entries);
-
-	if (ret < 0)
-		return ret;
-
-	crat_table->length += cache_mem_filled;
-	crat_table->total_entries += num_of_cache_entries;
-	avail_size -= cache_mem_filled;
-
 	/* Fill in Subtype: IO_LINKS
 	 *  Only direct links are added here which is Link from GPU to
 	 *  its NUMA node. Indirect links are added by userspace.
 	 */
 	sub_type_hdr = (typeof(sub_type_hdr))((char *)sub_type_hdr +
-		cache_mem_filled);
+		sub_type_hdr->length);
 	ret = kfd_fill_gpu_direct_io_link_to_cpu(&avail_size, kdev,
 		(struct crat_subtype_iolink *)sub_type_hdr, proximity_domain);
 
--- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.h
@@ -317,6 +317,18 @@ struct cdit_header {
 
 struct kfd_dev;
 
+/* Static table to describe GPU Cache information */
+struct kfd_gpu_cache_info {
+	uint32_t	cache_size;
+	uint32_t	cache_level;
+	uint32_t	flags;
+	/* Indicates how many Compute Units share this cache
+	 * within a SA. Value = 1 indicates the cache is not shared
+	 */
+	uint32_t	num_cu_shared;
+};
+int kfd_get_gpu_cache_info(struct kfd_dev *kdev, struct kfd_gpu_cache_info **pcache_info);
+
 int kfd_create_crat_image_acpi(void **crat_image, size_t *size);
 void kfd_destroy_crat_image(void *crat_image);
 int kfd_parse_crat_table(void *crat_image, struct list_head *device_list,
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
@@ -364,7 +364,6 @@ static ssize_t kfd_cache_show(struct kob
 
 	/* Making sure that the buffer is an empty string */
 	buffer[0] = 0;
-
 	cache = container_of(attr, struct kfd_cache_properties, attr);
 	if (cache->gpu && kfd_devcgroup_check_permission(cache->gpu))
 		return -EPERM;
@@ -379,12 +378,13 @@ static ssize_t kfd_cache_show(struct kob
 	sysfs_show_32bit_prop(buffer, offs, "association", cache->cache_assoc);
 	sysfs_show_32bit_prop(buffer, offs, "latency", cache->cache_latency);
 	sysfs_show_32bit_prop(buffer, offs, "type", cache->cache_type);
+
 	offs += snprintf(buffer+offs, PAGE_SIZE-offs, "sibling_map ");
-	for (i = 0; i < CRAT_SIBLINGMAP_SIZE; i++)
+	for (i = 0; i < cache->sibling_map_size; i++)
 		for (j = 0; j < sizeof(cache->sibling_map[0])*8; j++)
 			/* Check each bit */
 			offs += snprintf(buffer+offs, PAGE_SIZE-offs, "%d,",
-					 (cache->sibling_map[i] >> j) & 1);
+						(cache->sibling_map[i] >> j) & 1);
 
 	/* Replace the last "," with end of line */
 	buffer[offs-1] = '\n';
@@ -1198,7 +1198,6 @@ static struct kfd_topology_device *kfd_a
 	struct kfd_iolink_properties *iolink;
 	struct kfd_iolink_properties *p2plink;
 
-	down_write(&topology_lock);
 	list_for_each_entry(dev, &topology_device_list, list) {
 		/* Discrete GPUs need their own topology device list
 		 * entries. Don't assign them to CPU/APU nodes.
@@ -1222,7 +1221,6 @@ static struct kfd_topology_device *kfd_a
 			break;
 		}
 	}
-	up_write(&topology_lock);
 	return out_dev;
 }
 
@@ -1593,6 +1591,221 @@ out:
 	return ret;
 }
 
+
+/* Helper function. See kfd_fill_gpu_cache_info for parameter description */
+static int fill_in_l1_pcache(struct kfd_cache_properties **props_ext,
+				struct kfd_gpu_cache_info *pcache_info,
+				struct kfd_cu_info *cu_info,
+				int cu_bitmask,
+				int cache_type, unsigned int cu_processor_id,
+				int cu_block)
+{
+	unsigned int cu_sibling_map_mask;
+	int first_active_cu;
+	struct kfd_cache_properties *pcache = NULL;
+
+	cu_sibling_map_mask = cu_bitmask;
+	cu_sibling_map_mask >>= cu_block;
+	cu_sibling_map_mask &= ((1 << pcache_info[cache_type].num_cu_shared) - 1);
+	first_active_cu = ffs(cu_sibling_map_mask);
+
+	/* CU could be inactive. In case of shared cache find the first active
+	 * CU. and incase of non-shared cache check if the CU is inactive. If
+	 * inactive active skip it
+	 */
+	if (first_active_cu) {
+		pcache = kfd_alloc_struct(pcache);
+		if (!pcache)
+			return -ENOMEM;
+
+		memset(pcache, 0, sizeof(struct kfd_cache_properties));
+		pcache->processor_id_low = cu_processor_id + (first_active_cu - 1);
+		pcache->cache_level = pcache_info[cache_type].cache_level;
+		pcache->cache_size = pcache_info[cache_type].cache_size;
+
+		if (pcache_info[cache_type].flags & CRAT_CACHE_FLAGS_DATA_CACHE)
+			pcache->cache_type |= HSA_CACHE_TYPE_DATA;
+		if (pcache_info[cache_type].flags & CRAT_CACHE_FLAGS_INST_CACHE)
+			pcache->cache_type |= HSA_CACHE_TYPE_INSTRUCTION;
+		if (pcache_info[cache_type].flags & CRAT_CACHE_FLAGS_CPU_CACHE)
+			pcache->cache_type |= HSA_CACHE_TYPE_CPU;
+		if (pcache_info[cache_type].flags & CRAT_CACHE_FLAGS_SIMD_CACHE)
+			pcache->cache_type |= HSA_CACHE_TYPE_HSACU;
+
+		/* Sibling map is w.r.t processor_id_low, so shift out
+		 * inactive CU
+		 */
+		cu_sibling_map_mask =
+			cu_sibling_map_mask >> (first_active_cu - 1);
+
+		pcache->sibling_map[0] = (uint8_t)(cu_sibling_map_mask & 0xFF);
+		pcache->sibling_map[1] =
+				(uint8_t)((cu_sibling_map_mask >> 8) & 0xFF);
+		pcache->sibling_map[2] =
+				(uint8_t)((cu_sibling_map_mask >> 16) & 0xFF);
+		pcache->sibling_map[3] =
+				(uint8_t)((cu_sibling_map_mask >> 24) & 0xFF);
+
+		pcache->sibling_map_size = 4;
+		*props_ext = pcache;
+
+		return 0;
+	}
+	return 1;
+}
+
+/* Helper function. See kfd_fill_gpu_cache_info for parameter description */
+static int fill_in_l2_l3_pcache(struct kfd_cache_properties **props_ext,
+				struct kfd_gpu_cache_info *pcache_info,
+				struct kfd_cu_info *cu_info,
+				int cache_type, unsigned int cu_processor_id)
+{
+	unsigned int cu_sibling_map_mask;
+	int first_active_cu;
+	int i, j, k;
+	struct kfd_cache_properties *pcache = NULL;
+
+	cu_sibling_map_mask = cu_info->cu_bitmap[0][0];
+	cu_sibling_map_mask &=
+		((1 << pcache_info[cache_type].num_cu_shared) - 1);
+	first_active_cu = ffs(cu_sibling_map_mask);
+
+	/* CU could be inactive. In case of shared cache find the first active
+	 * CU. and incase of non-shared cache check if the CU is inactive. If
+	 * inactive active skip it
+	 */
+	if (first_active_cu) {
+		pcache = kfd_alloc_struct(pcache);
+		if (!pcache)
+			return -ENOMEM;
+
+		memset(pcache, 0, sizeof(struct kfd_cache_properties));
+		pcache->processor_id_low = cu_processor_id
+					+ (first_active_cu - 1);
+		pcache->cache_level = pcache_info[cache_type].cache_level;
+		pcache->cache_size = pcache_info[cache_type].cache_size;
+
+		if (pcache_info[cache_type].flags & CRAT_CACHE_FLAGS_DATA_CACHE)
+			pcache->cache_type |= HSA_CACHE_TYPE_DATA;
+		if (pcache_info[cache_type].flags & CRAT_CACHE_FLAGS_INST_CACHE)
+			pcache->cache_type |= HSA_CACHE_TYPE_INSTRUCTION;
+		if (pcache_info[cache_type].flags & CRAT_CACHE_FLAGS_CPU_CACHE)
+			pcache->cache_type |= HSA_CACHE_TYPE_CPU;
+		if (pcache_info[cache_type].flags & CRAT_CACHE_FLAGS_SIMD_CACHE)
+			pcache->cache_type |= HSA_CACHE_TYPE_HSACU;
+
+		/* Sibling map is w.r.t processor_id_low, so shift out
+		 * inactive CU
+		 */
+		cu_sibling_map_mask = cu_sibling_map_mask >> (first_active_cu - 1);
+		k = 0;
+
+		for (i = 0; i < cu_info->num_shader_engines; i++) {
+			for (j = 0; j < cu_info->num_shader_arrays_per_engine; j++) {
+				pcache->sibling_map[k] = (uint8_t)(cu_sibling_map_mask & 0xFF);
+				pcache->sibling_map[k+1] = (uint8_t)((cu_sibling_map_mask >> 8) & 0xFF);
+				pcache->sibling_map[k+2] = (uint8_t)((cu_sibling_map_mask >> 16) & 0xFF);
+				pcache->sibling_map[k+3] = (uint8_t)((cu_sibling_map_mask >> 24) & 0xFF);
+				k += 4;
+
+				cu_sibling_map_mask = cu_info->cu_bitmap[i % 4][j + i / 4];
+				cu_sibling_map_mask &= ((1 << pcache_info[cache_type].num_cu_shared) - 1);
+			}
+		}
+		pcache->sibling_map_size = k;
+		*props_ext = pcache;
+		return 0;
+	}
+	return 1;
+}
+
+#define KFD_MAX_CACHE_TYPES 6
+
+/* kfd_fill_cache_non_crat_info - Fill GPU cache info using kfd_gpu_cache_info
+ * tables
+ */
+void kfd_fill_cache_non_crat_info(struct kfd_topology_device *dev, struct kfd_dev *kdev)
+{
+	struct kfd_gpu_cache_info *pcache_info = NULL;
+	int i, j, k;
+	int ct = 0;
+	unsigned int cu_processor_id;
+	int ret;
+	unsigned int num_cu_shared;
+	struct kfd_cu_info cu_info;
+	struct kfd_cu_info *pcu_info;
+	int gpu_processor_id;
+	struct kfd_cache_properties *props_ext;
+	int num_of_entries = 0;
+	int num_of_cache_types = 0;
+	struct kfd_gpu_cache_info cache_info[KFD_MAX_CACHE_TYPES];
+
+	amdgpu_amdkfd_get_cu_info(kdev->adev, &cu_info);
+	pcu_info = &cu_info;
+
+	gpu_processor_id = dev->node_props.simd_id_base;
+
+	pcache_info = cache_info;
+	num_of_cache_types = kfd_get_gpu_cache_info(kdev, &pcache_info);
+	if (!num_of_cache_types) {
+		pr_warn("no cache info found\n");
+		return;
+	}
+
+	/* For each type of cache listed in the kfd_gpu_cache_info table,
+	 * go through all available Compute Units.
+	 * The [i,j,k] loop will
+	 *		if kfd_gpu_cache_info.num_cu_shared = 1
+	 *			will parse through all available CU
+	 *		If (kfd_gpu_cache_info.num_cu_shared != 1)
+	 *			then it will consider only one CU from
+	 *			the shared unit
+	 */
+	for (ct = 0; ct < num_of_cache_types; ct++) {
+		cu_processor_id = gpu_processor_id;
+		if (pcache_info[ct].cache_level == 1) {
+			for (i = 0; i < pcu_info->num_shader_engines; i++) {
+				for (j = 0; j < pcu_info->num_shader_arrays_per_engine; j++) {
+					for (k = 0; k < pcu_info->num_cu_per_sh; k += pcache_info[ct].num_cu_shared) {
+
+						ret = fill_in_l1_pcache(&props_ext, pcache_info, pcu_info,
+										pcu_info->cu_bitmap[i % 4][j + i / 4], ct,
+										cu_processor_id, k);
+
+						if (ret < 0)
+							break;
+
+						if (!ret) {
+							num_of_entries++;
+							list_add_tail(&props_ext->list, &dev->cache_props);
+						}
+
+						/* Move to next CU block */
+						num_cu_shared = ((k + pcache_info[ct].num_cu_shared) <=
+							pcu_info->num_cu_per_sh) ?
+							pcache_info[ct].num_cu_shared :
+							(pcu_info->num_cu_per_sh - k);
+						cu_processor_id += num_cu_shared;
+					}
+				}
+			}
+		} else {
+			ret = fill_in_l2_l3_pcache(&props_ext, pcache_info,
+								pcu_info, ct, cu_processor_id);
+
+			if (ret < 0)
+				break;
+
+			if (!ret) {
+				num_of_entries++;
+				list_add_tail(&props_ext->list, &dev->cache_props);
+			}
+		}
+	}
+	dev->node_props.caches_count += num_of_entries;
+	pr_debug("Added [%d] GPU cache entries\n", num_of_entries);
+}
+
 int kfd_topology_add_device(struct kfd_dev *gpu)
 {
 	uint32_t gpu_id;
@@ -1617,9 +1830,9 @@ int kfd_topology_add_device(struct kfd_d
 	 * CRAT to create a new topology device. Once created assign the gpu to
 	 * that topology device
 	 */
+	down_write(&topology_lock);
 	dev = kfd_assign_gpu(gpu);
 	if (!dev) {
-		down_write(&topology_lock);
 		proximity_domain = ++topology_crat_proximity_domain;
 
 		res = kfd_create_crat_image_virtual(&crat_image, &image_size,
@@ -1631,6 +1844,7 @@ int kfd_topology_add_device(struct kfd_d
 			topology_crat_proximity_domain--;
 			return res;
 		}
+
 		res = kfd_parse_crat_table(crat_image,
 					   &temp_topology_device_list,
 					   proximity_domain);
@@ -1644,23 +1858,28 @@ int kfd_topology_add_device(struct kfd_d
 		kfd_topology_update_device_list(&temp_topology_device_list,
 			&topology_device_list);
 
+		dev = kfd_assign_gpu(gpu);
+		if (WARN_ON(!dev)) {
+			res = -ENODEV;
+			goto err;
+		}
+
+		/* Fill the cache affinity information here for the GPUs
+		 * using VCRAT
+		 */
+		kfd_fill_cache_non_crat_info(dev, gpu);
+
 		/* Update the SYSFS tree, since we added another topology
 		 * device
 		 */
 		res = kfd_topology_update_sysfs();
-		up_write(&topology_lock);
-
 		if (!res)
 			sys_props.generation_count++;
 		else
 			pr_err("Failed to update GPU (ID: 0x%x) to sysfs topology. res=%d\n",
 						gpu_id, res);
-		dev = kfd_assign_gpu(gpu);
-		if (WARN_ON(!dev)) {
-			res = -ENODEV;
-			goto err;
-		}
 	}
+	up_write(&topology_lock);
 
 	dev->gpu_id = gpu_id;
 	gpu->id = gpu_id;
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
@@ -80,6 +80,8 @@ struct kfd_mem_properties {
 	struct attribute	attr;
 };
 
+#define CACHE_SIBLINGMAP_SIZE 64
+
 struct kfd_cache_properties {
 	struct list_head	list;
 	uint32_t		processor_id_low;
@@ -90,10 +92,11 @@ struct kfd_cache_properties {
 	uint32_t		cache_assoc;
 	uint32_t		cache_latency;
 	uint32_t		cache_type;
-	uint8_t			sibling_map[CRAT_SIBLINGMAP_SIZE];
+	uint8_t			sibling_map[CACHE_SIBLINGMAP_SIZE];
 	struct kfd_dev		*gpu;
 	struct kobject		*kobj;
 	struct attribute	attr;
+	uint32_t		sibling_map_size;
 };
 
 struct kfd_iolink_properties {



  parent reply	other threads:[~2023-03-28 15:05 UTC|newest]

Thread overview: 237+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-28 14:39 [PATCH 6.1 000/224] 6.1.22-rc1 review Greg Kroah-Hartman
2023-03-28 14:39 ` [PATCH 6.1 001/224] interconnect: qcom: osm-l3: fix icc_onecell_data allocation Greg Kroah-Hartman
2023-03-28 14:39 ` [PATCH 6.1 002/224] interconnect: qcom: sm8450: switch to qcom_icc_rpmh_* function Greg Kroah-Hartman
2023-03-28 14:39 ` [PATCH 6.1 003/224] interconnect: qcom: qcm2290: Fix MASTER_SNOC_BIMC_NRT Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 004/224] perf/core: Fix perf_output_begin parameter is incorrectly invoked in perf_event_bpf_output Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 005/224] perf: fix perf_event_context->time Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 006/224] tracing/hwlat: Replace sched_setaffinity with set_cpus_allowed_ptr Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 007/224] drm/amd/display: Include virtual signal to set k1 and k2 values Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 008/224] drm/amd/display: fix k1 k2 divider programming for phantom streams Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 009/224] drm/amd/display: Remove OTG DIV register write for Virtual signals Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 010/224] mptcp: refactor passive socket initialization Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 011/224] mptcp: use the workqueue to destroy unaccepted sockets Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 012/224] mptcp: fix UaF in listener shutdown Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 013/224] drm/amd/display: Fix DP MST sinks removal issue Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 014/224] arm64: dts: qcom: sm8450: Mark UFS controller as cache coherent Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 015/224] power: supply: bq24190: Fix use after free bug in bq24190_remove due to race condition Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 016/224] power: supply: da9150: Fix use after free bug in da9150_charger_remove " Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 017/224] arm64: dts: imx8dxl-evk: Disable hibernation mode of AR8031 for EQOS Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 018/224] arm64: dts: imx8dxl-evk: Fix eqos phy reset gpio Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 019/224] ARM: dts: imx6sll: e70k02: fix usbotg1 pinctrl Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 020/224] ARM: dts: imx6sll: e60k02: " Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 021/224] ARM: dts: imx6sl: tolino-shine2hd: " Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 022/224] arm64: dts: imx8mn: specify #sound-dai-cells for SAI nodes Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 023/224] arm64: dts: imx93: add missing #address-cells and #size-cells to i2c nodes Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 024/224] NFS: Fix /proc/PID/io read_bytes for buffered reads Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 025/224] xsk: Add missing overflow check in xdp_umem_reg Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 026/224] iavf: fix inverted Rx hash condition leading to disabled hash Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 027/224] iavf: fix non-tunneled IPv6 UDP packet type and hashing Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 028/224] iavf: do not track VLAN 0 filters Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 029/224] intel/igbvf: free irq on the error path in igbvf_request_msix() Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 030/224] igbvf: Regard vf reset nack as success Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 031/224] igc: fix the validation logic for taprios gate list Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 032/224] i2c: imx-lpi2c: check only for enabled interrupt flags Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 033/224] i2c: mxs: ensure that DMA buffers are safe for DMA Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 034/224] i2c: hisi: Only use the completion interrupt to finish the transfer Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 035/224] scsi: scsi_dh_alua: Fix memleak for qdata in alua_activate() Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 036/224] nfsd: dont replace page in rq_pages if its a continuation of last page Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 037/224] net: dsa: b53: mmap: fix device tree support Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 038/224] net: usb: smsc95xx: Limit packet length to skb->len Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 039/224] efi/libstub: smbios: Use length member instead of record struct size Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 040/224] qed/qed_sriov: guard against NULL derefs from qed_iov_get_vf_info Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 041/224] xirc2ps_cs: Fix use after free bug in xirc2ps_detach Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 042/224] net: phy: Ensure state transitions are processed from phy_stop() Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 043/224] net: mdio: fix owner field for mdio buses registered using device-tree Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 044/224] net: mdio: fix owner field for mdio buses registered using ACPI Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 045/224] net: stmmac: Fix for mismatched host/device DMA address width Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 046/224] thermal/drivers/mellanox: Use generic thermal_zone_get_trip() function Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 047/224] mlxsw: core_thermal: Fix fan speed in maximum cooling state Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 048/224] drm/i915: Print return value on error Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 049/224] drm/i915/fbdev: lock the fbdev obj before vma pin Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 050/224] drm/i915/guc: Rename GuC register state capture node to be more obvious Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 051/224] drm/i915/guc: Fix missing ecodes Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 052/224] drm/i915/gt: perform uc late init after probe error injection Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 053/224] net: qcom/emac: Fix use after free bug in emac_remove due to race condition Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 054/224] net: usb: lan78xx: Limit packet length to skb->len Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 055/224] net/ps3_gelic_net: Fix RX sk_buff length Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 056/224] net/ps3_gelic_net: Use dma_mapping_error Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 057/224] octeontx2-vf: Add missing free for alloc_percpu Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 058/224] bootconfig: Fix testcase to increase max node Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 059/224] keys: Do not cache key in task struct if key is requested from kernel thread Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 060/224] ice: check if VF exists before mode check Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 061/224] iavf: fix hang on reboot with ice Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 062/224] i40e: fix flow director packet filter programming Greg Kroah-Hartman
2023-03-28 14:40 ` [PATCH 6.1 063/224] bpf: Adjust insufficient default bpf_jit_limit Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 064/224] net/mlx5e: Set uplink rep as NETNS_LOCAL Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 065/224] net/mlx5e: Block entering switchdev mode with ns inconsistency Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 066/224] net/mlx5: Fix steering rules cleanup Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 067/224] net/mlx5e: Overcome slow response for first macsec ASO WQE Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 068/224] net/mlx5: Read the TC mapping of all priorities on ETS query Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 069/224] net/mlx5: E-Switch, Fix an Oops in error handling code Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 070/224] net: dsa: tag_brcm: legacy: fix daisy-chained switches Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 071/224] atm: idt77252: fix kmemleak when rmmod idt77252 Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 072/224] erspan: do not use skb_mac_header() in ndo_start_xmit() Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 073/224] net/sonic: use dma_mapping_error() for error check Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 074/224] nvme-tcp: fix nvme_tcp_term_pdu to match spec Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 075/224] mlxsw: spectrum_fid: Fix incorrect local port type Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 076/224] hvc/xen: prevent concurrent accesses to the shared ring Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 077/224] ksmbd: add low bound validation to FSCTL_SET_ZERO_DATA Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 078/224] ksmbd: add low bound validation to FSCTL_QUERY_ALLOCATED_RANGES Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 079/224] ksmbd: fix possible refcount leak in smb2_open() Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 080/224] Bluetooth: hci_sync: Resume adv with no RPA when active scan Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 081/224] Bluetooth: hci_core: Detect if an ACL packet is in fact an ISO packet Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 082/224] Bluetooth: btusb: Remove detection of ISO packets over bulk Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 083/224] Bluetooth: ISO: fix timestamped HCI ISO data packet parsing Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 084/224] Bluetooth: Remove "Power-on" check from Mesh feature Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 085/224] gve: Cache link_speed value from device Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 086/224] net: asix: fix modprobe "sysfs: cannot create duplicate filename" Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 087/224] net: dsa: mt7530: move enabling disabling core clock to mt7530_pll_setup() Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 088/224] net: dsa: mt7530: move lowering TRGMII driving to mt7530_setup() Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 089/224] net: dsa: mt7530: move setting ssc_delta to PHY_INTERFACE_MODE_TRGMII case Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 090/224] net: mdio: thunder: Add missing fwnode_handle_put() Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 091/224] drm/amd/display: Set dcn32 caps.seamless_odm Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 092/224] Bluetooth: btqcomsmd: Fix command timeout after setting BD address Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 093/224] Bluetooth: L2CAP: Fix responding with wrong PDU type Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 094/224] Bluetooth: btsdio: fix use after free bug in btsdio_remove due to unfinished work Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 095/224] Bluetooth: mgmt: Fix MGMT add advmon with RSSI command Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 096/224] Bluetooth: HCI: Fix global-out-of-bounds Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 097/224] platform/chrome: cros_ec_chardev: fix kernel data leak from ioctl Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 098/224] entry: Fix noinstr warning in __enter_from_user_mode() Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 099/224] perf/x86/amd/core: Always clear status for idx Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 100/224] entry/rcu: Check TIF_RESCHED _after_ delayed RCU wake-up Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 101/224] hwmon: fix potential sensor registration fail if of_node is missing Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 102/224] hwmon (it87): Fix voltage scaling for chips with 10.9mV ADCs Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 103/224] scsi: qla2xxx: Synchronize the IOCB count to be in order Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 104/224] scsi: qla2xxx: Perform lockless command completion in abort path Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 105/224] smb3: lower default deferred close timeout to address perf regression Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 106/224] smb3: fix unusable share after force unmount failure Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 107/224] uas: Add US_FL_NO_REPORT_OPCODES for JMicron JMS583Gen 2 Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 108/224] thunderbolt: Use scale field when allocating USB3 bandwidth Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 109/224] thunderbolt: Call tb_check_quirks() after initializing adapters Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 110/224] thunderbolt: Add quirk to disable CLx Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 111/224] thunderbolt: Fix memory leak in margining Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 112/224] thunderbolt: Disable interrupt auto clear for rings Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 113/224] thunderbolt: Add missing UNSET_INBOUND_SBTX for retimer access Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 114/224] thunderbolt: Use const qualifier for `ring_interrupt_index` Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 115/224] thunderbolt: Rename shadowed variables bit to interrupt_bit and auto_clear_bit Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 116/224] ASoC: amd: yp: Add OMEN by HP Gaming Laptop 16z-n000 to quirks Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 117/224] scsi: ufs: core: Initialize devfreq synchronously Greg Kroah-Hartman
2023-03-29 17:48   ` Adrien Thierry
2023-03-28 14:41 ` [PATCH 6.1 118/224] ASoC: amd: yc: Add DMI entries to support HP OMEN 16-n0xxx (8A43) Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 119/224] ACPI: x86: Drop quirk for HP Elitebook Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 120/224] ACPI: x86: utils: Add Cezanne to the list for forcing StorageD3Enable Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 121/224] riscv: Bump COMMAND_LINE_SIZE value to 1024 Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 122/224] drm/cirrus: NULL-check pipe->plane.state->fb in cirrus_pipe_update() Greg Kroah-Hartman
2023-03-28 14:41 ` [PATCH 6.1 123/224] HID: cp2112: Fix driver not registering GPIO IRQ chip as threaded Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 124/224] ca8210: fix mac_len negative array access Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 125/224] HID: logitech-hidpp: Add support for Logitech MX Master 3S mouse Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 126/224] HID: intel-ish-hid: ipc: Fix potential use-after-free in work function Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 127/224] m68k: mm: Fix systems with memory at end of 32-bit address space Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 128/224] m68k: Only force 030 bus error if PC not in exception table Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 129/224] selftests/bpf: check that modifier resolves after pointer Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 130/224] scsi: target: iscsi: Fix an error message in iscsi_check_key() Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 131/224] scsi: qla2xxx: Add option to disable FC2 Target support Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 132/224] scsi: hisi_sas: Check devm_add_action() return value Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 133/224] scsi: ufs: core: Add soft dependency on governor_simpleondemand Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 134/224] scsi: lpfc: Check kzalloc() in lpfc_sli4_cgn_params_read() Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 135/224] scsi: lpfc: Avoid usage of list iterator variable after loop Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 136/224] scsi: mpi3mr: Driver unload crashes host when enhanced logging is enabled Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 137/224] scsi: mpi3mr: Wait for diagnostic save during controller init Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 138/224] scsi: mpi3mr: NVMe command size greater than 8K fails Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 139/224] scsi: mpi3mr: Bad drive in topology results kernel crash Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 140/224] scsi: storvsc: Handle BlockSize change in Hyper-V VHD/VHDX file Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 141/224] platform/x86: int3472: Add GPIOs to Surface Go 3 Board data Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 142/224] net: usb: cdc_mbim: avoid altsetting toggling for Telit FE990 Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 143/224] net: usb: qmi_wwan: add Telit 0x1080 composition Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 144/224] drm/amd/display: Update clock table to include highest clock setting Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 145/224] sh: sanitize the flags on sigreturn Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 146/224] drm/amdgpu: Fix call trace warning and hang when removing amdgpu device Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 147/224] drm/amd: Fix initialization mistake for NBIO 7.3.0 Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 148/224] net/sched: act_mirred: better wording on protection against excessive stack growth Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 149/224] act_mirred: use the backlog for nested calls to mirred ingress Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 150/224] cifs: lock chan_lock outside match_session Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 151/224] cifs: append path to open_enter trace event Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 152/224] cifs: do not poll server interfaces too regularly Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 153/224] cifs: empty interface list when server doesnt support query interfaces Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 154/224] cifs: dump pending mids for all channels in DebugData Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 155/224] cifs: print session id while listing open files Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 156/224] cifs: fix dentry lookups in directory handle cache Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 157/224] x86/fpu/xstate: Prevent false-positive warning in __copy_xstate_uabi_buf() Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 158/224] selftests/x86/amx: Add a ptrace test Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 159/224] scsi: core: Add BLIST_SKIP_VPD_PAGES for SKhynix H28U74301AMR Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 160/224] usb: misc: onboard-hub: add support for Microchip USB2517 USB 2.0 hub Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 161/224] usb: dwc2: drd: fix inconsistent mode if role-switch-default-mode="host" Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 162/224] usb: dwc2: fix a devres leak in hw_enable upon suspend resume Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 163/224] usb: gadget: u_audio: dont let userspace block driver unbind Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 164/224] btrfs: zoned: fix btrfs_can_activate_zone() to support DUP profile Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 165/224] Bluetooth: Fix race condition in hci_cmd_sync_clear Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 166/224] efi: sysfb_efi: Fix DMI quirks not working for simpledrm Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 167/224] mm/slab: Fix undefined init_cache_node_node() for NUMA and !SMP Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 168/224] fscrypt: destroy keyring after security_sb_delete() Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 169/224] fsverity: Remove WQ_UNBOUND from fsverity read workqueue Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 170/224] lockd: set file_lock start and end when decoding nlm4 testargs Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 171/224] arm64: dts: imx8mm-nitrogen-r2: fix WM8960 clock name Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 172/224] igb: revert rtnl_lock() that causes deadlock Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 173/224] dm thin: fix deadlock when swapping to thin device Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 174/224] usb: typec: tcpm: fix create duplicate source-capabilities file Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 175/224] usb: typec: tcpm: fix warning when handle discover_identity message Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 176/224] usb: cdns3: Fix issue with using incorrect PCI device function Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 177/224] usb: cdnsp: Fixes issue with redundant Status Stage Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 178/224] usb: cdnsp: changes PCI Device ID to fix conflict with CNDS3 driver Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 179/224] usb: chipdea: core: fix return -EINVAL if request role is the same with current role Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 180/224] usb: chipidea: core: fix possible concurrent when switch role Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 181/224] usb: dwc3: gadget: Add 1ms delay after end transfer command without IOC Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 182/224] usb: ucsi: Fix NULL pointer deref in ucsi_connector_change() Greg Kroah-Hartman
2023-03-28 14:42 ` [PATCH 6.1 183/224] usb: ucsi_acpi: Increase the command completion timeout Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 184/224] mm: kfence: fix using kfence_metadata without initialization in show_object() Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 185/224] kfence: avoid passing -g for test Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 186/224] io_uring/net: avoid sending -ECONNABORTED on repeated connection requests Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 187/224] io_uring/rsrc: fix null-ptr-deref in io_file_bitmap_get() Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 188/224] Revert "kasan: drop skip_kasan_poison variable in free_pages_prepare" Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 189/224] test_maple_tree: add more testing for mas_empty_area() Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 190/224] maple_tree: fix mas_skip_node() end slot detection Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 191/224] ksmbd: fix wrong signingkey creation when encryption is AES256 Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 192/224] ksmbd: set FILE_NAMED_STREAMS attribute in FS_ATTRIBUTE_INFORMATION Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 193/224] ksmbd: dont terminate inactive sessions after a few seconds Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 194/224] ksmbd: return STATUS_NOT_SUPPORTED on unsupported smb2.0 dialect Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 195/224] ksmbd: return unsupported error on smb1 mount Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 196/224] wifi: mac80211: fix qos on mesh interfaces Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 197/224] nilfs2: fix kernel-infoleak in nilfs_ioctl_wrap_copy() Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 198/224] drm/bridge: lt8912b: return EPROBE_DEFER if bridge is not found Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 199/224] drm/amd/display: fix wrong index used in dccg32_set_dpstreamclk Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 200/224] drm/meson: fix missing component unbind on bind errors Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 201/224] drm/amdgpu/nv: Apply ASPM quirk on Intel ADL + AMD Navi Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 202/224] drm/i915/active: Fix missing debug object activation Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 203/224] drm/i915: Preserve crtc_state->inherited during state clearing Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 204/224] drm/amdgpu: skip ASIC reset for APUs when go to S4 Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 205/224] drm/amdgpu: reposition the gpu reset checking for reuse Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 206/224] riscv: mm: Fix incorrect ASID argument when flushing TLB Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 207/224] riscv: Handle zicsr/zifencei issues between clang and binutils Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 208/224] tee: amdtee: fix race condition in amdtee_open_session Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 209/224] firmware: arm_scmi: Fix device node validation for mailbox transport Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 210/224] arm64: dts: qcom: sc7280: Mark PCIe controller as cache coherent Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 211/224] arm64: dts: qcom: sm8150: Fix the iommu mask used for PCIe controllers Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 212/224] soc: qcom: llcc: Fix slice configuration values for SC8280XP Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 213/224] mm/ksm: fix race with VMA iteration and mm_struct teardown Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 214/224] bus: imx-weim: fix branch condition evaluates to a garbage value Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 215/224] i2c: xgene-slimpro: Fix out-of-bounds bug in xgene_slimpro_i2c_xfer() Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 216/224] dm stats: check for and propagate alloc_percpu failure Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 217/224] dm crypt: add cond_resched() to dmcrypt_write() Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 218/224] dm crypt: avoid accessing uninitialized tasklet Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 219/224] sched/fair: sanitize vruntime of entity being placed Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 220/224] sched/fair: Sanitize vruntime of entity being migrated Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 221/224] drm/amdkfd: introduce dummy cache info for property asic Greg Kroah-Hartman
2023-03-28 14:43 ` Greg Kroah-Hartman [this message]
2023-03-28 14:43 ` [PATCH 6.1 223/224] drm/amdkfd: add GC 11.0.4 KFD support Greg Kroah-Hartman
2023-03-28 14:43 ` [PATCH 6.1 224/224] drm/amdkfd: Fix the memory overrun Greg Kroah-Hartman
2023-03-28 21:06 ` [PATCH 6.1 000/224] 6.1.22-rc1 review Shuah Khan
2023-03-28 23:25 ` ogasawara takeshi
2023-03-29  4:10 ` Bagas Sanjaya
2023-03-29  8:31 ` Chris Paterson
2023-03-29 10:34 ` Rudi Heitbaum
2023-03-29 10:40 ` Conor Dooley
2023-03-29 11:17 ` Jon Hunter
2023-03-29 11:33 ` Naresh Kamboju
2023-03-29 17:39 ` Florian Fainelli
2023-03-29 21:07 ` Ron Economos
2023-03-29 21:54 ` Guenter Roeck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230328142626.545766087@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=Felix.Kuehling@amd.com \
    --cc=Jun.Ma2@amd.com \
    --cc=Mario.Limonciello@amd.com \
    --cc=alexander.deucher@amd.com \
    --cc=patches@lists.linux.dev \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox