lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250912195339.20635-10-yana2bsh@gmail.com>
Date: Fri, 12 Sep 2025 22:53:32 +0300
From: Yana Bashlykova <yana2bsh@...il.com>
To: "David S. Miller" <davem@...emloft.net>
Cc: Yana Bashlykova <yana2bsh@...il.com>,
	Eric Dumazet <edumazet@...gle.com>,
	Jakub Kicinski <kuba@...nel.org>,
	Paolo Abeni <pabeni@...hat.com>,
	linux-kernel@...r.kernel.org,
	netdev@...r.kernel.org,
	lvc-project@...uxtesting.org
Subject: [PATCH 6.1 09/15] genetlink: add LARGE_GENL stress test family

Added new test family with 190+ multicast groups to verify:
- Handling of large number of multicast groups
- Family registration with many groups

The family serves as a stress test for Generic Netlink scalability.

Signed-off-by: Yana Bashlykova <yana2bsh@...il.com>
---
 .../net-pf-16-proto-16-family-PARALLEL_GENL.c | 468 +++++++++++++++++-
 1 file changed, 467 insertions(+), 1 deletion(-)

diff --git a/drivers/net/genetlink/net-pf-16-proto-16-family-PARALLEL_GENL.c b/drivers/net/genetlink/net-pf-16-proto-16-family-PARALLEL_GENL.c
index ad4228eda2d5..0023aeaf4d42 100644
--- a/drivers/net/genetlink/net-pf-16-proto-16-family-PARALLEL_GENL.c
+++ b/drivers/net/genetlink/net-pf-16-proto-16-family-PARALLEL_GENL.c
@@ -1,4 +1,16 @@
 // SPDX-License-Identifier: GPL-2.0
+/*
+ * Generic Netlink Test Module
+ *
+ * Implements test families for Generic Netlink functionality:
+ * - TEST_GENL: Basic commands with mutex protection
+ * - PARALLEL_GENL: Advanced ops with parallel dump support
+ * - THIRD_GENL: Simple message handling supporting many multicast groups
+ * - LARGE_GENL: Stress test with 190+ multicast groups
+ *
+ * Includes sysfs interfaces for manual testing and validation
+ * of error cases and edge conditions.
+ */
 
 #include <linux/init.h>
 #include <linux/kernel.h>
@@ -146,6 +158,7 @@ static struct kobj_attribute my_attr_str_third_genl =
 	__ATTR(message, 0664, show_third_genl_message, store_third_genl_message);
 
 static DEFINE_MUTEX(genl_mutex);
+static DEFINE_MUTEX(sysfs_mutex);
 
 #define MY_GENL_FAMILY_NAME "TEST_GENL"
 #define MY_GENL_VERSION 1
@@ -154,6 +167,8 @@ static DEFINE_MUTEX(genl_mutex);
 
 #define THIRD_GENL_FAMILY_NAME "THIRD_GENL"
 
+#define LARGE_GENL_FAMILY_NAME "LARGE_GENL"
+
 #define PATH_GENL_TEST_NUM "/sys/kernel/genl_test/value"
 #define PATH_GENL_TEST_MES "/sys/kernel/genl_test/message"
 #define PATH_GENL_TEST_DEV "/sys/kernel/genl_test/some_info"
@@ -920,6 +935,410 @@ static const struct genl_ops parallel_genl_ops[] = {
 	},
 };
 
+enum my_multicast_many_groups_one {
+	MCGRP_1,
+	MCGRP_2,
+	MCGRP_3,
+	MCGRP_4,
+	MCGRP_5,
+	MCGRP_6,
+	MCGRP_7,
+	MCGRP_8,
+	MCGRP_9,
+	MCGRP_10,
+	MCGRP_11,
+	MCGRP_12,
+	MCGRP_13,
+	MCGRP_14,
+	MCGRP_15,
+	MCGRP_16,
+	MCGRP_17,
+	MCGRP_18,
+	MCGRP_19,
+	MCGRP_20,
+	MCGRP_21,
+	MCGRP_22,
+	MCGRP_23,
+	MCGRP_24,
+	MCGRP_25,
+	MCGRP_26,
+	MCGRP_27,
+	MCGRP_28,
+	MCGRP_29,
+	MCGRP_30,
+	MCGRP_31,
+	MCGRP_32,
+	MCGRP_33,
+	MCGRP_34,
+	MCGRP_35,
+	MCGRP_36,
+	MCGRP_37,
+	MCGRP_38,
+	MCGRP_39,
+	MCGRP_40,
+	MCGRP_41,
+	MCGRP_42,
+	MCGRP_43,
+	MCGRP_44,
+	MCGRP_45,
+	MCGRP_46,
+	MCGRP_47,
+	MCGRP_48,
+	MCGRP_49,
+	MCGRP_50,
+	MCGRP_51,
+	MCGRP_52,
+	MCGRP_53,
+	MCGRP_54,
+	MCGRP_55,
+	MCGRP_56,
+	MCGRP_57,
+	MCGRP_58,
+	MCGRP_59,
+	MCGRP_60,
+	MCGRP_61,
+	MCGRP_62,
+	MCGRP_63,
+	MCGRP_64,
+	MCGRP_65,
+	MCGRP_66,
+	MCGRP_67,
+	MCGRP_68,
+	MCGRP_69,
+	MCGRP_70,
+	MCGRP_71,
+	MCGRP_72,
+	MCGRP_73,
+	MCGRP_74,
+	MCGRP_75,
+	MCGRP_76,
+	MCGRP_77,
+	MCGRP_78,
+	MCGRP_79,
+	MCGRP_80,
+	MCGRP_81,
+	MCGRP_82,
+	MCGRP_83,
+	MCGRP_84,
+	MCGRP_85,
+	MCGRP_86,
+	MCGRP_87,
+	MCGRP_88,
+	MCGRP_89,
+	MCGRP_90,
+	MCGRP_91,
+	MCGRP_92,
+	MCGRP_93,
+	MCGRP_94,
+	MCGRP_95,
+	MCGRP_96,
+	MCGRP_97,
+	MCGRP_98,
+	MCGRP_99,
+	MCGRP_100,
+	MCGRP_101,
+	MCGRP_102,
+	MCGRP_103,
+	MCGRP_104,
+	MCGRP_105,
+	MCGRP_106,
+	MCGRP_107,
+	MCGRP_108,
+	MCGRP_109,
+	MCGRP_110,
+	MCGRP_111,
+	MCGRP_112,
+	MCGRP_113,
+	MCGRP_114,
+	MCGRP_115,
+	MCGRP_116,
+	MCGRP_117,
+	MCGRP_118,
+	MCGRP_119,
+	MCGRP_120,
+	MCGRP_121,
+	MCGRP_122,
+	MCGRP_123,
+	MCGRP_124,
+	MCGRP_125,
+	MCGRP_126,
+	MCGRP_127,
+	MCGRP_128,
+	MCGRP_129,
+	MCGRP_130,
+	MCGRP_131,
+	MCGRP_132,
+	MCGRP_133,
+	MCGRP_134,
+	MCGRP_135,
+	MCGRP_136,
+	MCGRP_137,
+	MCGRP_138,
+	MCGRP_139,
+	MCGRP_140,
+	MCGRP_141,
+	MCGRP_142,
+	MCGRP_143,
+	MCGRP_144,
+	MCGRP_145,
+	MCGRP_146,
+	MCGRP_147,
+	MCGRP_148,
+	MCGRP_149,
+	MCGRP_150,
+	MCGRP_151,
+	MCGRP_152,
+	MCGRP_153,
+	MCGRP_154,
+	MCGRP_155,
+	MCGRP_156,
+	MCGRP_157,
+	MCGRP_158,
+	MCGRP_159,
+	MCGRP_160,
+	MCGRP_161,
+	MCGRP_162,
+	MCGRP_163,
+	MCGRP_164,
+	MCGRP_165,
+	MCGRP_166,
+	MCGRP_167,
+	MCGRP_168,
+	MCGRP_169,
+	MCGRP_170,
+	MCGRP_171,
+	MCGRP_172,
+	MCGRP_173,
+	MCGRP_174,
+	MCGRP_175,
+	MCGRP_176,
+	MCGRP_177,
+	MCGRP_178,
+	MCGRP_179,
+	MCGRP_180,
+	MCGRP_181,
+	MCGRP_182,
+	MCGRP_183,
+	MCGRP_184,
+	MCGRP_185,
+	MCGRP_186,
+	MCGRP_187,
+	MCGRP_188,
+	MCGRP_189,
+	MCGRP_190,
+	MCGRP_191,
+	MCGRP_192,
+	MCGRP_193,
+	MCGRP_194,
+	MCGRP_195,
+	MCGRP_196,
+	MCGRP_197,
+	MCGRP_198,
+	MCGRP_199,
+};
+
+static const struct genl_multicast_group genl_many_mcgrps_one[] = {
+	[MCGRP_1] = { .name = "MCGRP_1", },
+	[MCGRP_2] = { .name = "MCGRP_2", },
+	[MCGRP_3] = { .name = "MCGRP_3", },
+	[MCGRP_4] = { .name = "MCGRP_4", },
+	[MCGRP_5] = { .name = "MCGRP_5", },
+	[MCGRP_6] = { .name = "MCGRP_6", },
+	[MCGRP_7] = { .name = "MCGRP_7", },
+	[MCGRP_8] = { .name = "MCGRP_8", },
+	[MCGRP_9] = { .name = "MCGRP_9", },
+	[MCGRP_10] = { .name = "MCGRP_10", },
+	[MCGRP_11] = { .name = "MCGRP_11", },
+	[MCGRP_12] = { .name = "MCGRP_12", },
+	[MCGRP_13] = { .name = "MCGRP_13", },
+	[MCGRP_14] = { .name = "MCGRP_14", },
+	[MCGRP_15] = { .name = "MCGRP_15", },
+	[MCGRP_16] = { .name = "MCGRP_16", },
+	[MCGRP_17] = { .name = "MCGRP_17", },
+	[MCGRP_18] = { .name = "MCGRP_18", },
+	[MCGRP_19] = { .name = "MCGRP_19", },
+	[MCGRP_20] = { .name = "MCGRP_20", },
+	[MCGRP_21] = { .name = "MCGRP_21", },
+	[MCGRP_22] = { .name = "MCGRP_22", },
+	[MCGRP_23] = { .name = "MCGRP_23", },
+	[MCGRP_24] = { .name = "MCGRP_24", },
+	[MCGRP_25] = { .name = "MCGRP_25", },
+	[MCGRP_26] = { .name = "MCGRP_26", },
+	[MCGRP_27] = { .name = "MCGRP_27", },
+	[MCGRP_28] = { .name = "MCGRP_28", },
+	[MCGRP_29] = { .name = "MCGRP_29", },
+	[MCGRP_30] = { .name = "MCGRP_30", },
+	[MCGRP_31] = { .name = "MCGRP_31", },
+	[MCGRP_32] = { .name = "MCGRP_32", },
+	[MCGRP_33] = { .name = "MCGRP_33", },
+	[MCGRP_34] = { .name = "MCGRP_34", },
+	[MCGRP_35] = { .name = "MCGRP_35", },
+	[MCGRP_36] = { .name = "MCGRP_36", },
+	[MCGRP_37] = { .name = "MCGRP_37", },
+	[MCGRP_38] = { .name = "MCGRP_38", },
+	[MCGRP_39] = { .name = "MCGRP_39", },
+	[MCGRP_40] = { .name = "MCGRP_40", },
+	[MCGRP_41] = { .name = "MCGRP_41", },
+	[MCGRP_42] = { .name = "MCGRP_42", },
+	[MCGRP_43] = { .name = "MCGRP_43", },
+	[MCGRP_44] = { .name = "MCGRP_44", },
+	[MCGRP_45] = { .name = "MCGRP_45", },
+	[MCGRP_46] = { .name = "MCGRP_46", },
+	[MCGRP_47] = { .name = "MCGRP_47", },
+	[MCGRP_48] = { .name = "MCGRP_48", },
+	[MCGRP_49] = { .name = "MCGRP_49", },
+	[MCGRP_50] = { .name = "MCGRP_50", },
+	[MCGRP_51] = { .name = "MCGRP_51", },
+	[MCGRP_52] = { .name = "MCGRP_52", },
+	[MCGRP_53] = { .name = "MCGRP_53", },
+	[MCGRP_54] = { .name = "MCGRP_54", },
+	[MCGRP_55] = { .name = "MCGRP_55", },
+	[MCGRP_56] = { .name = "MCGRP_56", },
+	[MCGRP_57] = { .name = "MCGRP_57", },
+	[MCGRP_58] = { .name = "MCGRP_58", },
+	[MCGRP_59] = { .name = "MCGRP_59", },
+	[MCGRP_60] = { .name = "MCGRP_60", },
+	[MCGRP_61] = { .name = "MCGRP_61", },
+	[MCGRP_62] = { .name = "MCGRP_62", },
+	[MCGRP_63] = { .name = "MCGRP_63", },
+	[MCGRP_64] = { .name = "MCGRP_64", },
+	[MCGRP_65] = { .name = "MCGRP_65", },
+	[MCGRP_66] = { .name = "MCGRP_66", },
+	[MCGRP_67] = { .name = "MCGRP_67", },
+	[MCGRP_68] = { .name = "MCGRP_68", },
+	[MCGRP_69] = { .name = "MCGRP_69", },
+	[MCGRP_70] = { .name = "MCGRP_70", },
+	[MCGRP_71] = { .name = "MCGRP_71", },
+	[MCGRP_72] = { .name = "MCGRP_72", },
+	[MCGRP_73] = { .name = "MCGRP_73", },
+	[MCGRP_74] = { .name = "MCGRP_74", },
+	[MCGRP_75] = { .name = "MCGRP_75", },
+	[MCGRP_76] = { .name = "MCGRP_76", },
+	[MCGRP_77] = { .name = "MCGRP_77", },
+	[MCGRP_78] = { .name = "MCGRP_78", },
+	[MCGRP_79] = { .name = "MCGRP_79", },
+	[MCGRP_80] = { .name = "MCGRP_80", },
+	[MCGRP_81] = { .name = "MCGRP_81", },
+	[MCGRP_82] = { .name = "MCGRP_82", },
+	[MCGRP_83] = { .name = "MCGRP_83", },
+	[MCGRP_84] = { .name = "MCGRP_84", },
+	[MCGRP_85] = { .name = "MCGRP_85", },
+	[MCGRP_86] = { .name = "MCGRP_86", },
+	[MCGRP_87] = { .name = "MCGRP_87", },
+	[MCGRP_88] = { .name = "MCGRP_88", },
+	[MCGRP_89] = { .name = "MCGRP_89", },
+	[MCGRP_90] = { .name = "MCGRP_90", },
+	[MCGRP_91] = { .name = "MCGRP_91", },
+	[MCGRP_92] = { .name = "MCGRP_92", },
+	[MCGRP_93] = { .name = "MCGRP_93", },
+	[MCGRP_94] = { .name = "MCGRP_94", },
+	[MCGRP_95] = { .name = "MCGRP_95", },
+	[MCGRP_96] = { .name = "MCGRP_96", },
+	[MCGRP_97] = { .name = "MCGRP_97", },
+	[MCGRP_98] = { .name = "MCGRP_98", },
+	[MCGRP_99] = { .name = "MCGRP_99", },
+	[MCGRP_100] = { .name = "MCGRP_100", },
+	[MCGRP_101] = { .name = "MCGRP_101", },
+	[MCGRP_102] = { .name = "MCGRP_102", },
+	[MCGRP_103] = { .name = "MCGRP_103", },
+	[MCGRP_104] = { .name = "MCGRP_104", },
+	[MCGRP_105] = { .name = "MCGRP_105", },
+	[MCGRP_106] = { .name = "MCGRP_106", },
+	[MCGRP_107] = { .name = "MCGRP_107", },
+	[MCGRP_108] = { .name = "MCGRP_108", },
+	[MCGRP_109] = { .name = "MCGRP_109", },
+	[MCGRP_110] = { .name = "MCGRP_100", },
+	[MCGRP_111] = { .name = "MCGRP_111", },
+	[MCGRP_112] = { .name = "MCGRP_112", },
+	[MCGRP_113] = { .name = "MCGRP_113", },
+	[MCGRP_114] = { .name = "MCGRP_114", },
+	[MCGRP_115] = { .name = "MCGRP_115", },
+	[MCGRP_116] = { .name = "MCGRP_116", },
+	[MCGRP_117] = { .name = "MCGRP_117", },
+	[MCGRP_118] = { .name = "MCGRP_118", },
+	[MCGRP_119] = { .name = "MCGRP_119", },
+	[MCGRP_120] = { .name = "MCGRP_120", },
+	[MCGRP_121] = { .name = "MCGRP_121", },
+	[MCGRP_122] = { .name = "MCGRP_122", },
+	[MCGRP_123] = { .name = "MCGRP_123", },
+	[MCGRP_124] = { .name = "MCGRP_124", },
+	[MCGRP_125] = { .name = "MCGRP_125", },
+	[MCGRP_126] = { .name = "MCGRP_126", },
+	[MCGRP_127] = { .name = "MCGRP_127", },
+	[MCGRP_128] = { .name = "MCGRP_128", },
+	[MCGRP_129] = { .name = "MCGRP_129", },
+	[MCGRP_130] = { .name = "MCGRP_130", },
+	[MCGRP_131] = { .name = "MCGRP_131", },
+	[MCGRP_132] = { .name = "MCGRP_132", },
+	[MCGRP_133] = { .name = "MCGRP_133", },
+	[MCGRP_134] = { .name = "MCGRP_134", },
+	[MCGRP_135] = { .name = "MCGRP_135", },
+	[MCGRP_136] = { .name = "MCGRP_136", },
+	[MCGRP_137] = { .name = "MCGRP_137", },
+	[MCGRP_138] = { .name = "MCGRP_138", },
+	[MCGRP_139] = { .name = "MCGRP_139", },
+	[MCGRP_140] = { .name = "MCGRP_140", },
+	[MCGRP_141] = { .name = "MCGRP_141", },
+	[MCGRP_142] = { .name = "MCGRP_142", },
+	[MCGRP_143] = { .name = "MCGRP_143", },
+	[MCGRP_144] = { .name = "MCGRP_144", },
+	[MCGRP_145] = { .name = "MCGRP_145", },
+	[MCGRP_146] = { .name = "MCGRP_146", },
+	[MCGRP_147] = { .name = "MCGRP_147", },
+	[MCGRP_148] = { .name = "MCGRP_148", },
+	[MCGRP_149] = { .name = "MCGRP_149", },
+	[MCGRP_150] = { .name = "MCGRP_150", },
+	[MCGRP_151] = { .name = "MCGRP_151", },
+	[MCGRP_152] = { .name = "MCGRP_152", },
+	[MCGRP_153] = { .name = "MCGRP_153", },
+	[MCGRP_154] = { .name = "MCGRP_154", },
+	[MCGRP_155] = { .name = "MCGRP_155", },
+	[MCGRP_156] = { .name = "MCGRP_156", },
+	[MCGRP_157] = { .name = "MCGRP_157", },
+	[MCGRP_158] = { .name = "MCGRP_158", },
+	[MCGRP_159] = { .name = "MCGRP_159", },
+	[MCGRP_160] = { .name = "MCGRP_160", },
+	[MCGRP_161] = { .name = "MCGRP_161", },
+	[MCGRP_162] = { .name = "MCGRP_162", },
+	[MCGRP_163] = { .name = "MCGRP_163", },
+	[MCGRP_164] = { .name = "MCGRP_164", },
+	[MCGRP_165] = { .name = "MCGRP_165", },
+	[MCGRP_166] = { .name = "MCGRP_166", },
+	[MCGRP_167] = { .name = "MCGRP_167", },
+	[MCGRP_168] = { .name = "MCGRP_168", },
+	[MCGRP_169] = { .name = "MCGRP_169", },
+	[MCGRP_170] = { .name = "MCGRP_170", },
+	[MCGRP_171] = { .name = "MCGRP_171", },
+	[MCGRP_172] = { .name = "MCGRP_172", },
+	[MCGRP_173] = { .name = "MCGRP_173", },
+	[MCGRP_174] = { .name = "MCGRP_174", },
+	[MCGRP_175] = { .name = "MCGRP_175", },
+	[MCGRP_176] = { .name = "MCGRP_176", },
+	[MCGRP_177] = { .name = "MCGRP_177", },
+	[MCGRP_178] = { .name = "MCGRP_178", },
+	[MCGRP_179] = { .name = "MCGRP_179", },
+	[MCGRP_180] = { .name = "MCGRP_180", },
+	[MCGRP_181] = { .name = "MCGRP_181", },
+	[MCGRP_182] = { .name = "MCGRP_182", },
+	[MCGRP_183] = { .name = "MCGRP_183", },
+	[MCGRP_184] = { .name = "MCGRP_184", },
+	[MCGRP_185] = { .name = "MCGRP_185", },
+	[MCGRP_186] = { .name = "MCGRP_186", },
+	[MCGRP_187] = { .name = "MCGRP_187", },
+	[MCGRP_188] = { .name = "MCGRP_188", },
+	[MCGRP_189] = { .name = "MCGRP_189", },
+	[MCGRP_190] = { .name = "MCGRP_190", },
+	[MCGRP_191] = { .name = "MCGRP_191", },
+	[MCGRP_192] = { .name = "MCGRP_192", },
+	[MCGRP_193] = { .name = "MCGRP_193", },
+	[MCGRP_194] = { .name = "MCGRP_194", },
+	[MCGRP_195] = { .name = "MCGRP_195", },
+	[MCGRP_196] = { .name = "MCGRP_196", },
+	[MCGRP_197] = { .name = "MCGRP_197", },
+	[MCGRP_198] = { .name = "MCGRP_198", },
+	[MCGRP_199] = { .name = "MCGRP_199", },
+};
+
 enum my_multicast_many_groups_two {
 	MCGRP_TWO_1,
 	MCGRP_TWO_2,
@@ -1170,6 +1589,43 @@ static struct genl_family third_genl_family = {
 	.policy = third_genl_policy,
 };
 
+// LARGE_GENL
+enum {
+	LARGE_GENL_CMD_UNSPEC,
+	LARGE_GENL_CMD_ECHO,
+	__LARGE_GENL_CMD_MAX,
+};
+
+#define LARGE_GENL_CMD_MAX (__LARGE_GENL_CMD_MAX - 1)
+
+static int large_genl_echo(struct sk_buff *skb, struct genl_info *info)
+{
+	return 0;
+}
+
+// Generic Netlink operations for LARGE_GENL family
+static const struct genl_ops large_genl_ops[] = {
+	{
+		.cmd = LARGE_GENL_CMD_ECHO,
+		.flags = 0,
+		.doit = large_genl_echo,
+		.dumpit = NULL,
+	},
+};
+
+// genl_family struct for LARGE_GENL family
+static struct genl_family large_genl_family = {
+	.hdrsize = 0,
+	.name = LARGE_GENL_FAMILY_NAME,
+	.version = 1,
+	.maxattr = 1,
+	.netnsok = true,
+	.ops = large_genl_ops,
+	.n_ops = ARRAY_SIZE(large_genl_ops),
+	.mcgrps = genl_many_mcgrps_one,
+	.n_mcgrps = ARRAY_SIZE(genl_many_mcgrps_one),
+};
+
 // genl_family struct with incorrect name
 static struct genl_family incorrect_genl_family = {
 	.hdrsize = 0,
@@ -1237,14 +1693,22 @@ static int __init init_netlink(void)
 		goto failure_2;
 	}
 
-	rc = genl_register_family(&third_genl_family);
+	rc = genl_register_family(&large_genl_family);
 	if (rc) {
 		pr_err("%s: Failed to register Generic Netlink family\n", __func__);
 		goto failure_3;
 	}
 
+	rc = genl_register_family(&third_genl_family);
+	if (rc) {
+		pr_err("%s: Failed to register Generic Netlink family\n", __func__);
+		goto failure_4;
+	}
+
 	return 0;
 
+failure_4:
+	genl_unregister_family(&large_genl_family);
 failure_3:
 	genl_unregister_family(&my_genl_family_parallel);
 failure_2:
@@ -1417,6 +1881,7 @@ static int __init module_netlink_init(void)
 	genl_unregister_family(&my_genl_family);
 	genl_unregister_family(&my_genl_family_parallel);
 	genl_unregister_family(&third_genl_family);
+	genl_unregister_family(&large_genl_family);
 err_sysfs:
 	sysfs_remove_file(kobj_genl_test, &my_attr_u32_genl_test.attr);
 	sysfs_remove_file(kobj_genl_test, &my_attr_str_genl_test.attr);
@@ -1437,6 +1902,7 @@ static void __exit module_netlink_exit(void)
 	genl_unregister_family(&my_genl_family);
 	genl_unregister_family(&my_genl_family_parallel);
 	genl_unregister_family(&third_genl_family);
+	genl_unregister_family(&large_genl_family);
 
 	sysfs_remove_file(kobj_genl_test, &my_attr_u32_genl_test.attr);
 	sysfs_remove_file(kobj_genl_test, &my_attr_str_genl_test.attr);
-- 
2.34.1


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ