From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-oo1-f44.google.com (mail-oo1-f44.google.com [209.85.161.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 387F43890FD for ; Wed, 8 Apr 2026 20:02:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.44 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775678564; cv=none; b=qiwNo3rifJYcgErerKI3IJShexAJt9Mbxu+yPKCdep76Pi25tAqbAM2PfAElLibv2raDpCQnTc2mmPBawQLT6rFi60qphp6PPLjrID5DReteGMa/xGPHHzUtnPXqNrbd439ZPf0lf6ezJdWnmug2KZmXNYDLwnGoEoYE8GctHh0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775678564; c=relaxed/simple; bh=Zzx4Sn733ZM1tO7JuXAJ/z8qin9BcfpX6BljoYIv/Xw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sfuaI/huFa/I2dw9g83bP+38FjAnNlOgg2LFlvSSg7GRWt4/i/BJ2NHGwVzmN9Aewv2hYU1w1kVH3MI6TfI3kkM566250o5fmq6MJ/whL90r/nYENT4Gs8NrIGTpPmtrVYCn6l0iVNBgUv7OpM+GfhxbUvmaGaWzhMxqoM3EmuE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ZtZtD3L0; arc=none smtp.client-ip=209.85.161.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZtZtD3L0" Received: by mail-oo1-f44.google.com with SMTP id 006d021491bc7-6894c5dc5a3so63690eaf.1 for ; Wed, 08 Apr 2026 13:02:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775678562; x=1776283362; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fhkUA1UVesD8yNrP4RsQIbF+Lt6WpQrbgggJ/VjIv9U=; b=ZtZtD3L0QS0Eks7EfYsa45ORxVrDQAaY9KZW33Xh+VM/VxnlFymvippYRqcHnTqqdq lwP2C+XM8fW6bGkRH49hfigAiJMfcLNnhio6dXTjtO0I2w4AnJkdhlU8NWRXfZCvBaCe rgRv2Llog02tI7n8liubVhibUa+6JFQ5eY9H1UFRNVmg6AyuiON3WfWllfttWZeuruMZ OkwW0zPYJKhMa/AQNc0McsYmyfaEhvGxZPnZvJgnxhiROgoH4TmVBqOhV2NHs0vLHbux AN/V8fRTeJQ2rYtvSsjufV5fzrfqDdjBkbnso+NmJfPatla+8PpzBzEy25ffdrZWdfzC wy4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775678562; x=1776283362; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=fhkUA1UVesD8yNrP4RsQIbF+Lt6WpQrbgggJ/VjIv9U=; b=MVUovERrf/KUNElcDoi/N8hgzYvQoDtxuloC5R7qOm4U22gJy00t2n098EqaLXuiLo w4eJq21mgA/ecbYSEklJFWrzCeHOtQoKU3mYJjWa4l5onFHo1BLvFH7dQmjjsTQe4ktz GiEsT2ks3c6LK/NVfeSL6DfbH08Bt82yMGONmb3fjMf0Njte5v5X6zst75coU3BlqiO2 qtayj5rEPuF7w7M1pHX+82fxY+U+CwTlAL/9KQT/YsyOqDQAOPV1PprAy3kUpsM1nLqD 9BDgjS8wcPPipoH22+otCGfIUJ1b7EnrWe6SV6mZuiYshFqwHwUcjEdc6bMoM/wMctNl ZwkA== X-Gm-Message-State: AOJu0Yx1ShPLoNVYfXcD4FfilMU1/CtgyhPRi4bt7ufFLhAzpqxK+Knu gsib9+av1jG62Koz9FMd4yhtX0Ffq85yWhrJHR4RDze5YX9Nlu2tDP7bOJpdaw== X-Gm-Gg: AeBDietvZZR8cy7CPLC28qcxwiRxewp0NjcXXGYwYyywU+RhZ3pXtXFEqPbhecMc+F7 NGMiWeq3Xczigy79c9I1Ls8qR8WU6cScUnx97V8ouX1w74NkkTPdRZPZ+TK4aUxBs35B2FP48aX v6WMJjq0gbXcNVnlU1bvHxP8n398JIFuWV7+O+M7d55bQVbTtNSXA9TCcxdCl/b6ITg72RN3Wiq 2MyfsoDCYiRXC0gEA2sNdV9EpOKlo/mwyVitodO96aj4jMQSYK1zs8nc7H0z20yLlmFd3LbvlPZ +j0Ph2oCuMWQc0ODDRjHVHwuGgAKcZVaeR1Wj8ifee2b0CQs+9lIv05l2d8HZuUquX79R0wXnZp Crh0J6CW/0q7R0RkUa4hwz6bX1F0OuTQlfmkGr/COlAHkvdOBjCD8mLzlwhcgnu5j7J3Wqd8+fk dlN7Pi6LocOShSXkPgyvkZD+d408sPlOoXpn0Ij7ZqOMLOk7YekofIDJLZMPA31++nm7UdbKOf8 tY= X-Received: by 2002:a05:6820:134d:b0:685:7d77:27 with SMTP id 006d021491bc7-68a62903705mr498721eaf.33.1775678561946; Wed, 08 Apr 2026 13:02:41 -0700 (PDT) Received: from frodo.raven-morpho.ts.net (c-98-38-17-99.hsd1.co.comcast.net. [98.38.17.99]) by smtp.googlemail.com with ESMTPSA id 006d021491bc7-680a63c7fd1sm12254208eaf.8.2026.04.08.13.02.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 13:02:41 -0700 (PDT) From: Jim Cromie To: linux-kernel@vger.kernel.org Cc: gregkh@linuxfoundation.org, jbaron@akamai.com, louis.chauvet@bootlin.com, Jim Cromie Subject: [PATCH v13 26/36] dyndbg: detect class_id reservation conflicts Date: Wed, 8 Apr 2026 14:02:01 -0600 Message-ID: <20260408200211.43821-27-jim.cromie@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260408200211.43821-1-jim.cromie@gmail.com> References: <20260408200211.43821-1-jim.cromie@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit If a module _DEFINEs 2 or more classmaps, it must devise them to share the per-module 0..62 class-id space; ie their respective base,+length reservations cannot overlap. To detect conflicts at modprobe, add ddebug_class_range_overlap(), call it from ddebug_add_module(), and WARN and return -EINVAL when they're detected. This insures that class_id -> classname lookup has just 1 answer, so the 1st-found search in find-class-name works properly. test_dynamic_debug.c: If built with -DFORCE_CLASSID_CONFLICT, the test-modules invoke 2 conflicting DYNAMIC_DEBUG_CLASSMAP_DEFINE() declarations, into parent and the _submod. These conflict with one of the good ones in the parent (D2_CORE..etc), causing the modprobe(s) to WARN and fail. Reviewed-by: Louis Chauvet Signed-off-by: Jim Cromie --- v9 - fix WARN() by adding new 1st arg 1. v12 - drop maybe_unused on range-overlap fn --- lib/dynamic_debug.c | 25 +++++++++++++++++++------ lib/test_dynamic_debug.c | 8 ++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index ce512efaeffd..a7f67ecbc4d7 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -1085,12 +1085,17 @@ static void *ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos) return dp; } -static bool ddebug_class_in_range(const int class_id, const struct _ddebug_class_map *map) +static bool ddebug_class_map_in_range(const int class_id, const struct _ddebug_class_map *map) { return (class_id >= map->base && class_id < map->base + map->length); } +static bool ddebug_class_user_in_range(const int class_id, const struct _ddebug_class_user *user) +{ + return ddebug_class_map_in_range(class_id - user->offset, user->map); +} + static const char *ddebug_class_name(struct _ddebug_info *di, struct _ddebug *dp) { struct _ddebug_class_map *map; @@ -1098,11 +1103,11 @@ static const char *ddebug_class_name(struct _ddebug_info *di, struct _ddebug *dp int i; for_subvec(i, map, di, maps) - if (ddebug_class_in_range(dp->class_id, map)) + if (ddebug_class_map_in_range(dp->class_id, map)) return map->class_names[dp->class_id - map->base]; for_subvec(i, cli, di, users) - if (ddebug_class_in_range(dp->class_id, cli->map)) + if (ddebug_class_user_in_range(dp->class_id, cli)) return cli->map->class_names[dp->class_id - cli->map->base - cli->offset]; return NULL; @@ -1295,9 +1300,7 @@ static void ddebug_apply_class_users(const struct _ddebug_info *di) __di->_vec.len = __nc; \ }) -static int __maybe_unused -ddebug_class_range_overlap(struct _ddebug_class_map *cm, - u64 *reserved_ids) +static int ddebug_class_range_overlap(struct _ddebug_class_map *cm, u64 *reserved_ids) { u64 range = (((1ULL << cm->length) - 1) << cm->base); @@ -1320,6 +1323,7 @@ static int ddebug_add_module(struct _ddebug_info *di) struct ddebug_table *dt; struct _ddebug_class_map *cm; struct _ddebug_class_user *cli; + u64 reserved_ids = 0; int i; if (!di->descs.len) @@ -1344,6 +1348,11 @@ static int ddebug_add_module(struct _ddebug_info *di) dd_set_module_subrange(i, cli, &dt->info, users); /* now di is stale */ + /* insure 2+ classmaps share the per-module 0..62 class_id space */ + for_subvec(i, cm, &dt->info, maps) + if (ddebug_class_range_overlap(cm, &reserved_ids)) + goto cleanup; + mutex_lock(&ddebug_lock); list_add_tail(&dt->link, &ddebug_tables); mutex_unlock(&ddebug_lock); @@ -1356,6 +1365,10 @@ static int ddebug_add_module(struct _ddebug_info *di) vpr_info("%3u debug prints in module %s\n", dt->info.descs.len, dt->info.mod_name); return 0; +cleanup: + WARN_ONCE(1, "dyndbg multi-classmap conflict in %s\n", di->mod_name); + kfree(dt); + return -EINVAL; } /* helper for ddebug_dyndbg_(boot|module)_param_cb */ diff --git a/lib/test_dynamic_debug.c b/lib/test_dynamic_debug.c index 6c4548f63512..fc599bbe605e 100644 --- a/lib/test_dynamic_debug.c +++ b/lib/test_dynamic_debug.c @@ -128,6 +128,14 @@ DYNAMIC_DEBUG_CLASSMAP_DEFINE(map_level_num, DD_CLASS_TYPE_LEVEL_NUM, DYNAMIC_DEBUG_CLASSMAP_PARAM(disjoint_bits, p); DYNAMIC_DEBUG_CLASSMAP_PARAM(level_num, p); +#ifdef FORCE_CLASSID_CONFLICT +/* + * Enable with -Dflag on compile to test overlapping class-id range + * detection. This should warn on modprobes. + */ +DYNAMIC_DEBUG_CLASSMAP_DEFINE(classid_range_conflict, 0, D2_CORE + 1, "D3_CORE"); +#endif + #else /* TEST_DYNAMIC_DEBUG_SUBMOD */ /* -- 2.53.0