:::::: :::::: Manual check reason: "only scripts/mod/modpost.c file changed" :::::: BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: Linux Memory Management List <linux-mm@kvack.org> TO: Masahiro Yamada <masahiroy@kernel.org> tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: a6bd6c9333397f5a0e2667d4d82fef8c970108f2 commit: 60fff9be7eff2de9e8439d43d0c5cc15a95f33b3 [1910/2532] modpost: do not make find_tosym() return NULL :::::: branch date: 22 hours ago :::::: commit date: 2 days ago config: arm-randconfig-001-20240329 (https://download.01.org/0day-ci/archive/20240329/202403291040.AjpOaxUc-lkp@intel.com/config) compiler: arm-linux-gnueabi-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240329/202403291040.AjpOaxUc-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/r/202403291040.AjpOaxUc-lkp@intel.com/ All warnings (new ones prefixed by >>, old ones prefixed by <<): WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/locking/test-ww_mutex.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/rcu/refscale.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/backtracetest.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_base.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp737.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp775.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp850.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp852.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp855.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp860.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp861.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp862.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp864.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp865.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp866.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp874.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp932.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_euc-jp.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp936.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp950.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp1250.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_ascii.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-1.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-2.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-4.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp1255.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-9.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-13.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-15.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_koi8-r.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_koi8-u.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_koi8-ru.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_utf8.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-centeuro.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-cyrillic.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-gaelic.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-greek.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-iceland.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-roman.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/autofs/autofs4.o WARNING: modpost: missing MODULE_DESCRIPTION() in security/keys/encrypted-keys/encrypted-keys.o WARNING: modpost: missing MODULE_DESCRIPTION() in crypto/curve25519-generic.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/crypto/libchacha.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/find_bit_benchmark.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_ida.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_user_copy.o >> WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x4 (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x10 (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x18 (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x24 (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x2c (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x38 (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x44 (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x4c (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x58 (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x60 (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x6c (section: .text.fixup) -> (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x74 (section: .text.fixup) -> (section: .init.text) WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_static_keys.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_static_key_base.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_printf.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_scanf.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_ref_tracker.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/bus/vexpress-config.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpio/gpio-gw-pld.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpio/gpio-pcf857x.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/pwm/pwm-imx27.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/video/backlight/platform_lcd.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/video/fbdev/goldfishfb.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/video/fbdev/vfb.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/regulator/rt4831-regulator.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/regulator/tps6286x-regulator.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/panel/panel-auo-a030jtn01.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/panel/panel-novatek-nt39016.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/panel/panel-orisetech-ota5601a.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/lontium-lt9611uxc.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/sil-sii8620.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/sii9234.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/drm_panel_orientation_quirks.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/drm_mipi_dbi.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/base/regmap/regmap-i2c.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/base/regmap/regmap-slimbus.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/base/regmap/regmap-w1.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/misc/open-dice.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/mfd/pcf50633-gpio.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/mfd/vexpress-sysreg.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/mfd/rt4831.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/spi/spi-fsl-lib.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/spmi/hisi-spmi-controller.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/auxdisplay/charlcd.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/auxdisplay/hd44780_common.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/mmc/core/pwrseq_simple.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/mmc/core/pwrseq_emmc.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/firmware/google/coreboot_table.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/firmware/google/framebuffer-coreboot.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/firmware/google/memconsole.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/firmware/google/memconsole-coreboot.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/firmware/google/vpd-sysfs.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/platform/goldfish/goldfish_pipe.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/perf/fsl_imx8_ddr_perf.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/hwtracing/intel_th/intel_th_msu_sink.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/nvmem/nvmem_u-boot-env.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/parport/parport.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/mtd/chips/cfi_util.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/mtd/chips/cfi_cmdset_0020.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/mtd/maps/map_funcs.o WARNING: modpost: missing MODULE_DESCRIPTION() in sound/core/snd-pcm-dmaengine.o WARNING: modpost: missing MODULE_DESCRIPTION() in sound/soc/codecs/snd-soc-sigmadsp.o WARNING: modpost: missing MODULE_DESCRIPTION() in sound/soc/codecs/snd-soc-wm-adsp.o WARNING: modpost: missing MODULE_DESCRIPTION() in sound/soc/fsl/imx-pcm-dma.o WARNING: modpost: missing MODULE_DESCRIPTION() in sound/soc/xilinx/snd-soc-xlnx-formatter-pcm.o -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: Linux Memory Management List <linux-mm@kvack.org> TO: Revalla Hari Krishna <harikrishna.revalla@amd.com> CC: Alex Deucher <alexander.deucher@amd.com> CC: Martin Leung <martin.leung@amd.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: a6bd6c9333397f5a0e2667d4d82fef8c970108f2 commit: 88867807564e28409d8220419da7559364109a2a [839/2532] drm/amd/display: Refactor DPP into a component directory :::::: branch date: 20 hours ago :::::: commit date: 8 days ago config: x86_64-randconfig-102-20240326 (https://download.01.org/0day-ci/archive/20240329/202403290907.kltbhQXM-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403290907.kltbhQXM-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:400:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:402:46-47: WARNING opportunity for min() -- >> drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c:269:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c:271:46-47: WARNING opportunity for min() -- >> drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c:43:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c:45:46-47: WARNING opportunity for min() vim +400 drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 390 dd93752b648309 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-10-10 391 void dpp1_dscl_calc_lb_num_partitions( 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 392 const struct scaler_data *scl_data, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 393 enum lb_memory_config lb_config, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 394 int *num_part_y, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 395 int *num_part_c) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 396 { 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 397 int lb_memory_size, lb_memory_size_c, lb_memory_size_a, num_partitions_a, 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 398 lb_bpc, memory_line_size_y, memory_line_size_c, memory_line_size_a; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 399 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 @400 int line_size = scl_data->viewport.width < scl_data->recout.width ? 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 401 scl_data->viewport.width : scl_data->recout.width; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 402 int line_size_c = scl_data->viewport_c.width < scl_data->recout.width ? 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 403 scl_data->viewport_c.width : scl_data->recout.width; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 404 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 405 if (line_size == 0) 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 406 line_size = 1; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 407 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 408 if (line_size_c == 0) 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 409 line_size_c = 1; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 410 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 411 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 412 lb_bpc = dpp1_dscl_get_lb_depth_bpc(scl_data->lb_params.depth); 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 413 memory_line_size_y = (line_size * lb_bpc + 71) / 72; /* +71 to ceil */ 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 414 memory_line_size_c = (line_size_c * lb_bpc + 71) / 72; /* +71 to ceil */ 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 415 memory_line_size_a = (line_size + 5) / 6; /* +5 to ceil */ 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 416 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 417 if (lb_config == LB_MEMORY_CONFIG_1) { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 418 lb_memory_size = 816; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 419 lb_memory_size_c = 816; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 420 lb_memory_size_a = 984; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 421 } else if (lb_config == LB_MEMORY_CONFIG_2) { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 422 lb_memory_size = 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 423 lb_memory_size_c = 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 424 lb_memory_size_a = 1312; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 425 } else if (lb_config == LB_MEMORY_CONFIG_3) { 734a092b1fe407 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Eric Bernstein 2017-09-29 426 /* 420 mode: using 3rd mem from Y, Cr and Cb */ 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 427 lb_memory_size = 816 + 1088 + 848 + 848 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 428 lb_memory_size_c = 816 + 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 429 lb_memory_size_a = 984 + 1312 + 456; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 430 } else { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 431 lb_memory_size = 816 + 1088 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 432 lb_memory_size_c = 816 + 1088 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 433 lb_memory_size_a = 984 + 1312 + 456; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 434 } 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 435 *num_part_y = lb_memory_size / memory_line_size_y; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 436 *num_part_c = lb_memory_size_c / memory_line_size_c; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 437 num_partitions_a = lb_memory_size_a / memory_line_size_a; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 438 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 439 if (scl_data->lb_params.alpha_en 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 440 && (num_partitions_a < *num_part_y)) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 441 *num_part_y = num_partitions_a; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 442 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 443 if (*num_part_y > 64) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 444 *num_part_y = 64; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 445 if (*num_part_c > 64) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 446 *num_part_c = 64; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 447 :::::: The code at line 400 was first introduced by commit :::::: 5e9a81b2c465557adbaeef7231834e3ab40e4102 drm/amd/display: separate scl functions out from dcn10_dpp :::::: TO: Yue Hin Lau <Yuehin.Lau@amd.com> :::::: CC: Alex Deucher <alexander.deucher@amd.com> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: "Gustavo A. R. Silva" <gustavo@embeddedor.com> CC: LKML <linux-kernel@vger.kernel.org> TO: "Gustavo A. R. Silva" <gustavoars@kernel.org> tree: https://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux.git testing/WFAMNAE-next20240325-CBC head: 17bfb8485e6c8faa5602b51762b51d1e3b33f889 commit: e43cef4b7f03e1ff61532a632d184304354b7d6a [4/19] rpmsg: glink: Avoid -Wflex-array-member-not-at-end warning :::::: branch date: 3 hours ago :::::: commit date: 3 days ago config: i386-randconfig-141-20240328 (https://download.01.org/0day-ci/archive/20240329/202403290814.cOUu3Mvn-lkp@intel.com/config) compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403290814.cOUu3Mvn-lkp@intel.com/ smatch warnings: drivers/rpmsg/qcom_glink_native.c:482 qcom_glink_send_open_req() error: strcpy() 'channel->name' too large for 'req->data' (1010102 vs 32) vim +482 drivers/rpmsg/qcom_glink_native.c fb23b97346f9aaa Bjorn Andersson 2023-02-13 447 835764ddd9af0d9 Bjorn Andersson 2017-08-24 448 /** 4e816d0318fdfe8 Bjorn Andersson 2023-02-14 449 * qcom_glink_send_open_req() - send a GLINK_CMD_OPEN request to the remote 835764ddd9af0d9 Bjorn Andersson 2017-08-24 450 * @glink: Ptr to the glink edge 835764ddd9af0d9 Bjorn Andersson 2017-08-24 451 * @channel: Ptr to the channel that the open req is sent 835764ddd9af0d9 Bjorn Andersson 2017-08-24 452 * 4e816d0318fdfe8 Bjorn Andersson 2023-02-14 453 * Allocates a local channel id and sends a GLINK_CMD_OPEN message to the remote. 835764ddd9af0d9 Bjorn Andersson 2017-08-24 454 * Will return with refcount held, regardless of outcome. 835764ddd9af0d9 Bjorn Andersson 2017-08-24 455 * 631af6e0f41002d Arnaud Pouliquen 2021-11-08 456 * Return: 0 on success, negative errno otherwise. 835764ddd9af0d9 Bjorn Andersson 2017-08-24 457 */ 835764ddd9af0d9 Bjorn Andersson 2017-08-24 458 static int qcom_glink_send_open_req(struct qcom_glink *glink, 835764ddd9af0d9 Bjorn Andersson 2017-08-24 459 struct glink_channel *channel) 835764ddd9af0d9 Bjorn Andersson 2017-08-24 460 { e43cef4b7f03e1f Gustavo A. R. Silva 2024-03-19 461 DEFINE_RAW_FLEX(struct glink_msg, req, data, GLINK_NAME_SIZE); 835764ddd9af0d9 Bjorn Andersson 2017-08-24 462 int name_len = strlen(channel->name) + 1; e43cef4b7f03e1f Gustavo A. R. Silva 2024-03-19 463 int req_len = ALIGN(sizeof(*req) + name_len, 8); 835764ddd9af0d9 Bjorn Andersson 2017-08-24 464 int ret; 44f6df922a260f1 Sricharan Ramabadhran 2017-08-24 465 unsigned long flags; 835764ddd9af0d9 Bjorn Andersson 2017-08-24 466 835764ddd9af0d9 Bjorn Andersson 2017-08-24 467 kref_get(&channel->refcount); 835764ddd9af0d9 Bjorn Andersson 2017-08-24 468 44f6df922a260f1 Sricharan Ramabadhran 2017-08-24 469 spin_lock_irqsave(&glink->idr_lock, flags); 835764ddd9af0d9 Bjorn Andersson 2017-08-24 470 ret = idr_alloc_cyclic(&glink->lcids, channel, 835764ddd9af0d9 Bjorn Andersson 2017-08-24 471 RPM_GLINK_CID_MIN, RPM_GLINK_CID_MAX, 44f6df922a260f1 Sricharan Ramabadhran 2017-08-24 472 GFP_ATOMIC); 44f6df922a260f1 Sricharan Ramabadhran 2017-08-24 473 spin_unlock_irqrestore(&glink->idr_lock, flags); 835764ddd9af0d9 Bjorn Andersson 2017-08-24 474 if (ret < 0) 835764ddd9af0d9 Bjorn Andersson 2017-08-24 475 return ret; 835764ddd9af0d9 Bjorn Andersson 2017-08-24 476 835764ddd9af0d9 Bjorn Andersson 2017-08-24 477 channel->lcid = ret; 835764ddd9af0d9 Bjorn Andersson 2017-08-24 478 e43cef4b7f03e1f Gustavo A. R. Silva 2024-03-19 479 req->cmd = cpu_to_le16(GLINK_CMD_OPEN); e43cef4b7f03e1f Gustavo A. R. Silva 2024-03-19 480 req->param1 = cpu_to_le16(channel->lcid); e43cef4b7f03e1f Gustavo A. R. Silva 2024-03-19 481 req->param2 = cpu_to_le32(name_len); e43cef4b7f03e1f Gustavo A. R. Silva 2024-03-19 @482 strcpy(req->data, channel->name); 835764ddd9af0d9 Bjorn Andersson 2017-08-24 483 835764ddd9af0d9 Bjorn Andersson 2017-08-24 484 ret = qcom_glink_tx(glink, &req, req_len, NULL, 0, true); 835764ddd9af0d9 Bjorn Andersson 2017-08-24 485 if (ret) 835764ddd9af0d9 Bjorn Andersson 2017-08-24 486 goto remove_idr; 835764ddd9af0d9 Bjorn Andersson 2017-08-24 487 835764ddd9af0d9 Bjorn Andersson 2017-08-24 488 return 0; 835764ddd9af0d9 Bjorn Andersson 2017-08-24 489 835764ddd9af0d9 Bjorn Andersson 2017-08-24 490 remove_idr: 44f6df922a260f1 Sricharan Ramabadhran 2017-08-24 491 spin_lock_irqsave(&glink->idr_lock, flags); 835764ddd9af0d9 Bjorn Andersson 2017-08-24 492 idr_remove(&glink->lcids, channel->lcid); 835764ddd9af0d9 Bjorn Andersson 2017-08-24 493 channel->lcid = 0; 44f6df922a260f1 Sricharan Ramabadhran 2017-08-24 494 spin_unlock_irqrestore(&glink->idr_lock, flags); 835764ddd9af0d9 Bjorn Andersson 2017-08-24 495 835764ddd9af0d9 Bjorn Andersson 2017-08-24 496 return ret; 835764ddd9af0d9 Bjorn Andersson 2017-08-24 497 } 835764ddd9af0d9 Bjorn Andersson 2017-08-24 498 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev In-Reply-To: <20240326080305.402382-4-ebiggers@kernel.org> References: <20240326080305.402382-4-ebiggers@kernel.org> TO: Eric Biggers <ebiggers@kernel.org> Hi Eric, kernel test robot noticed the following build warnings: [auto build test WARNING on 4cece764965020c22cff7665b18a012006359095] url: https://github.com/intel-lab-lkp/linux/commits/Eric-Biggers/x86-add-kconfig-symbols-for-assembler-VAES-and-VPCLMULQDQ-support/20240326-160900 base: 4cece764965020c22cff7665b18a012006359095 patch link: https://lore.kernel.org/r/20240326080305.402382-4-ebiggers%40kernel.org patch subject: [PATCH 3/6] crypto: x86/aes-xts - wire up AESNI + AVX implementation :::::: branch date: 2 days ago :::::: commit date: 2 days ago config: x86_64-randconfig-r081-20240328 (https://download.01.org/0day-ci/archive/20240329/202403290346.nnYJyAAY-lkp@intel.com/config) compiler: gcc-12 (Ubuntu 12.3.0-9ubuntu2) 12.3.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403290346.nnYJyAAY-lkp@intel.com/ smatch warnings: arch/x86/crypto/aesni-intel_glue.c:1200 xts_crypt_slowpath() error: uninitialized symbol 'err'. vim +/err +1200 arch/x86/crypto/aesni-intel_glue.c d77e52317c187e Eric Biggers 2024-03-26 1144 d77e52317c187e Eric Biggers 2024-03-26 1145 typedef void (*xts_asm_func)(const struct aesni_xts_ctx *key, d77e52317c187e Eric Biggers 2024-03-26 1146 const u8 *src, u8 *dst, size_t len, d77e52317c187e Eric Biggers 2024-03-26 1147 u8 iv[AES_BLOCK_SIZE], int flags); d77e52317c187e Eric Biggers 2024-03-26 1148 d77e52317c187e Eric Biggers 2024-03-26 1149 /* d77e52317c187e Eric Biggers 2024-03-26 1150 * This handles cases where the full message isn't available in one step of the d77e52317c187e Eric Biggers 2024-03-26 1151 * scatterlist walk. d77e52317c187e Eric Biggers 2024-03-26 1152 */ d77e52317c187e Eric Biggers 2024-03-26 1153 static noinline int d77e52317c187e Eric Biggers 2024-03-26 1154 xts_crypt_slowpath(struct skcipher_request *req, d77e52317c187e Eric Biggers 2024-03-26 1155 struct skcipher_walk *walk, xts_asm_func asm_func) d77e52317c187e Eric Biggers 2024-03-26 1156 { d77e52317c187e Eric Biggers 2024-03-26 1157 struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); d77e52317c187e Eric Biggers 2024-03-26 1158 const struct aesni_xts_ctx *ctx = aes_xts_ctx(tfm); d77e52317c187e Eric Biggers 2024-03-26 1159 int tail = req->cryptlen % AES_BLOCK_SIZE; d77e52317c187e Eric Biggers 2024-03-26 1160 struct scatterlist sg_src[2], sg_dst[2]; d77e52317c187e Eric Biggers 2024-03-26 1161 struct skcipher_request subreq; d77e52317c187e Eric Biggers 2024-03-26 1162 struct scatterlist *src, *dst; d77e52317c187e Eric Biggers 2024-03-26 1163 int flags = XTS_FIRST | XTS_UPDATE_IV; d77e52317c187e Eric Biggers 2024-03-26 1164 int err; d77e52317c187e Eric Biggers 2024-03-26 1165 d77e52317c187e Eric Biggers 2024-03-26 1166 /* d77e52317c187e Eric Biggers 2024-03-26 1167 * If the message length isn't divisible by the AES block size, then d77e52317c187e Eric Biggers 2024-03-26 1168 * separate off the last full block and the partial block. This ensures d77e52317c187e Eric Biggers 2024-03-26 1169 * that they are processed in the same call to the assembly function, d77e52317c187e Eric Biggers 2024-03-26 1170 * which is required for ciphertext stealing. d77e52317c187e Eric Biggers 2024-03-26 1171 */ d77e52317c187e Eric Biggers 2024-03-26 1172 if (tail) { d77e52317c187e Eric Biggers 2024-03-26 1173 skcipher_walk_abort(walk); d77e52317c187e Eric Biggers 2024-03-26 1174 d77e52317c187e Eric Biggers 2024-03-26 1175 skcipher_request_set_tfm(&subreq, tfm); d77e52317c187e Eric Biggers 2024-03-26 1176 skcipher_request_set_callback(&subreq, d77e52317c187e Eric Biggers 2024-03-26 1177 skcipher_request_flags(req), d77e52317c187e Eric Biggers 2024-03-26 1178 NULL, NULL); d77e52317c187e Eric Biggers 2024-03-26 1179 skcipher_request_set_crypt(&subreq, req->src, req->dst, d77e52317c187e Eric Biggers 2024-03-26 1180 req->cryptlen - tail - AES_BLOCK_SIZE, d77e52317c187e Eric Biggers 2024-03-26 1181 req->iv); d77e52317c187e Eric Biggers 2024-03-26 1182 req = &subreq; d77e52317c187e Eric Biggers 2024-03-26 1183 err = skcipher_walk_virt(walk, req, false); d77e52317c187e Eric Biggers 2024-03-26 1184 } d77e52317c187e Eric Biggers 2024-03-26 1185 d77e52317c187e Eric Biggers 2024-03-26 1186 while (walk->nbytes) { d77e52317c187e Eric Biggers 2024-03-26 1187 unsigned int nbytes = walk->nbytes; d77e52317c187e Eric Biggers 2024-03-26 1188 d77e52317c187e Eric Biggers 2024-03-26 1189 if (nbytes < walk->total) d77e52317c187e Eric Biggers 2024-03-26 1190 nbytes = round_down(nbytes, AES_BLOCK_SIZE); d77e52317c187e Eric Biggers 2024-03-26 1191 d77e52317c187e Eric Biggers 2024-03-26 1192 kernel_fpu_begin(); d77e52317c187e Eric Biggers 2024-03-26 1193 (*asm_func)(ctx, walk->src.virt.addr, walk->dst.virt.addr, d77e52317c187e Eric Biggers 2024-03-26 1194 nbytes, req->iv, flags); d77e52317c187e Eric Biggers 2024-03-26 1195 kernel_fpu_end(); d77e52317c187e Eric Biggers 2024-03-26 1196 flags &= ~XTS_FIRST; d77e52317c187e Eric Biggers 2024-03-26 1197 err = skcipher_walk_done(walk, walk->nbytes - nbytes); d77e52317c187e Eric Biggers 2024-03-26 1198 } d77e52317c187e Eric Biggers 2024-03-26 1199 d77e52317c187e Eric Biggers 2024-03-26 @1200 if (err || !tail) d77e52317c187e Eric Biggers 2024-03-26 1201 return err; d77e52317c187e Eric Biggers 2024-03-26 1202 d77e52317c187e Eric Biggers 2024-03-26 1203 /* Do ciphertext stealing with the last full block and partial block. */ d77e52317c187e Eric Biggers 2024-03-26 1204 d77e52317c187e Eric Biggers 2024-03-26 1205 dst = src = scatterwalk_ffwd(sg_src, req->src, req->cryptlen); d77e52317c187e Eric Biggers 2024-03-26 1206 if (req->dst != req->src) d77e52317c187e Eric Biggers 2024-03-26 1207 dst = scatterwalk_ffwd(sg_dst, req->dst, req->cryptlen); d77e52317c187e Eric Biggers 2024-03-26 1208 d77e52317c187e Eric Biggers 2024-03-26 1209 skcipher_request_set_crypt(req, src, dst, AES_BLOCK_SIZE + tail, d77e52317c187e Eric Biggers 2024-03-26 1210 req->iv); d77e52317c187e Eric Biggers 2024-03-26 1211 d77e52317c187e Eric Biggers 2024-03-26 1212 err = skcipher_walk_virt(walk, req, false); d77e52317c187e Eric Biggers 2024-03-26 1213 if (err) d77e52317c187e Eric Biggers 2024-03-26 1214 return err; d77e52317c187e Eric Biggers 2024-03-26 1215 d77e52317c187e Eric Biggers 2024-03-26 1216 kernel_fpu_begin(); d77e52317c187e Eric Biggers 2024-03-26 1217 (*asm_func)(ctx, walk->src.virt.addr, walk->dst.virt.addr, walk->nbytes, d77e52317c187e Eric Biggers 2024-03-26 1218 req->iv, flags); d77e52317c187e Eric Biggers 2024-03-26 1219 kernel_fpu_end(); d77e52317c187e Eric Biggers 2024-03-26 1220 d77e52317c187e Eric Biggers 2024-03-26 1221 return skcipher_walk_done(walk, 0); d77e52317c187e Eric Biggers 2024-03-26 1222 } d77e52317c187e Eric Biggers 2024-03-26 1223 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: David Howells <dhowells@redhat.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git netfs-writeback head: 56d9c02d8386e1fbfc521da523af44cf48dd97f7 commit: 4426913c4e18c06cfcdb92418a89a936d72dfc09 [23/26] netfs: Cut over to using new writeback code :::::: branch date: 3 hours ago :::::: commit date: 18 hours ago config: x86_64-randconfig-r081-20240328 (https://download.01.org/0day-ci/archive/20240329/202403290209.izqDvT86-lkp@intel.com/config) compiler: gcc-12 (Ubuntu 12.3.0-9ubuntu2) 12.3.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403290209.izqDvT86-lkp@intel.com/ smatch warnings: fs/netfs/write_issue.c:567 netfs_begin_writethrough() error: 'wreq' dereferencing possible ERR_PTR() vim +/wreq +567 fs/netfs/write_issue.c c272eda1e8b823 David Howells 2024-03-18 551 c272eda1e8b823 David Howells 2024-03-18 552 /* c272eda1e8b823 David Howells 2024-03-18 553 * Begin a write operation for writing through the pagecache. c272eda1e8b823 David Howells 2024-03-18 554 */ 4426913c4e18c0 David Howells 2024-03-08 555 struct netfs_io_request *netfs_begin_writethrough(struct kiocb *iocb, size_t len) c272eda1e8b823 David Howells 2024-03-18 556 { c272eda1e8b823 David Howells 2024-03-18 557 struct netfs_io_request *wreq = NULL; c272eda1e8b823 David Howells 2024-03-18 558 struct netfs_inode *ictx = netfs_inode(file_inode(iocb->ki_filp)); c272eda1e8b823 David Howells 2024-03-18 559 c272eda1e8b823 David Howells 2024-03-18 560 mutex_lock(&ictx->wb_lock); c272eda1e8b823 David Howells 2024-03-18 561 c272eda1e8b823 David Howells 2024-03-18 562 wreq = netfs_create_write_req(iocb->ki_filp->f_mapping, iocb->ki_filp, c272eda1e8b823 David Howells 2024-03-18 563 iocb->ki_pos, NETFS_WRITETHROUGH); c272eda1e8b823 David Howells 2024-03-18 564 if (IS_ERR(wreq)) c272eda1e8b823 David Howells 2024-03-18 565 mutex_unlock(&ictx->wb_lock); c272eda1e8b823 David Howells 2024-03-18 566 c272eda1e8b823 David Howells 2024-03-18 @567 wreq->io_streams[0].avail = true; c272eda1e8b823 David Howells 2024-03-18 568 trace_netfs_write(wreq, netfs_write_trace_writethrough); c272eda1e8b823 David Howells 2024-03-18 569 return wreq; c272eda1e8b823 David Howells 2024-03-18 570 } c272eda1e8b823 David Howells 2024-03-18 571 :::::: The code at line 567 was first introduced by commit :::::: c272eda1e8b823ac921a227ddcd7495d57a8226e netfs: New writeback implementation :::::: TO: David Howells <dhowells@redhat.com> :::::: CC: David Howells <dhowells@redhat.com> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Remove some code that was #if'd out with the netfslib conversion. This is split into parts for file.c as the diff generator otherwise produces a hard to read diff for part of it where a big chunk is cut out. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/file.c | 1004 ------------------------------------------ 1 file changed, 1004 deletions(-) diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index f45a830154d5..0b43fae0a96e 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2695,471 +2695,6 @@ int cifs_flush(struct file *file, fl_owner_t id) return rc; } -#if 0 // TODO remove 3594 -static void collect_uncached_write_data(struct cifs_aio_ctx *ctx); - -static void -cifs_uncached_writev_complete(struct work_struct *work) -{ - struct cifs_io_subrequest *wdata = container_of(work, - struct cifs_io_subrequest, work); - struct inode *inode = d_inode(wdata->cfile->dentry); - struct cifsInodeInfo *cifsi = CIFS_I(inode); - - spin_lock(&inode->i_lock); - cifs_update_eof(cifsi, wdata->subreq.start, wdata->subreq.len); - if (cifsi->netfs.remote_i_size > inode->i_size) - i_size_write(inode, cifsi->netfs.remote_i_size); - spin_unlock(&inode->i_lock); - - complete(&wdata->done); - collect_uncached_write_data(wdata->ctx); - /* the below call can possibly free the last ref to aio ctx */ - cifs_put_writedata(wdata); -} - -static int -cifs_resend_wdata(struct cifs_io_subrequest *wdata, struct list_head *wdata_list, - struct cifs_aio_ctx *ctx) -{ - size_t wsize; - struct cifs_credits credits; - int rc; - struct TCP_Server_Info *server = wdata->server; - - do { - if (wdata->cfile->invalidHandle) { - rc = cifs_reopen_file(wdata->cfile, false); - if (rc == -EAGAIN) - continue; - else if (rc) - break; - } - - - /* - * Wait for credits to resend this wdata. - * Note: we are attempting to resend the whole wdata not in - * segments - */ - do { - rc = server->ops->wait_mtu_credits(server, wdata->subreq.len, - &wsize, &credits); - if (rc) - goto fail; - - if (wsize < wdata->subreq.len) { - add_credits_and_wake_if(server, &credits, 0); - msleep(1000); - } - } while (wsize < wdata->subreq.len); - wdata->credits = credits; - - rc = adjust_credits(server, &wdata->credits, wdata->subreq.len); - - if (!rc) { - if (wdata->cfile->invalidHandle) - rc = -EAGAIN; - else { - set_bit(NETFS_SREQ_RETRYING, &wdata->subreq.flags); -#ifdef CONFIG_CIFS_SMB_DIRECT - if (wdata->mr) { - wdata->mr->need_invalidate = true; - smbd_deregister_mr(wdata->mr); - wdata->mr = NULL; - } -#endif - rc = server->ops->async_writev(wdata); - } - } - - /* If the write was successfully sent, we are done */ - if (!rc) { - list_add_tail(&wdata->list, wdata_list); - return 0; - } - - /* Roll back credits and retry if needed */ - add_credits_and_wake_if(server, &wdata->credits, 0); - } while (rc == -EAGAIN); - -fail: - cifs_put_writedata(wdata); - return rc; -} - -/* - * Select span of a bvec iterator we're going to use. Limit it by both maximum - * size and maximum number of segments. - */ -static size_t cifs_limit_bvec_subset(const struct iov_iter *iter, size_t max_size, - size_t max_segs, unsigned int *_nsegs) -{ - const struct bio_vec *bvecs = iter->bvec; - unsigned int nbv = iter->nr_segs, ix = 0, nsegs = 0; - size_t len, span = 0, n = iter->count; - size_t skip = iter->iov_offset; - - if (WARN_ON(!iov_iter_is_bvec(iter)) || n == 0) - return 0; - - while (n && ix < nbv && skip) { - len = bvecs[ix].bv_len; - if (skip < len) - break; - skip -= len; - n -= len; - ix++; - } - - while (n && ix < nbv) { - len = min3(n, bvecs[ix].bv_len - skip, max_size); - span += len; - max_size -= len; - nsegs++; - ix++; - if (max_size == 0 || nsegs >= max_segs) - break; - skip = 0; - n -= len; - } - - *_nsegs = nsegs; - return span; -} - -static int -cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, - struct cifsFileInfo *open_file, - struct cifs_sb_info *cifs_sb, struct list_head *wdata_list, - struct cifs_aio_ctx *ctx) -{ - int rc = 0; - size_t cur_len, max_len; - struct cifs_io_subrequest *wdata; - pid_t pid; - struct TCP_Server_Info *server; - unsigned int xid, max_segs = INT_MAX; - - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) - pid = open_file->pid; - else - pid = current->tgid; - - server = cifs_pick_channel(tlink_tcon(open_file->tlink)->ses); - xid = get_xid(); - -#ifdef CONFIG_CIFS_SMB_DIRECT - if (server->smbd_conn) - max_segs = server->smbd_conn->max_frmr_depth; -#endif - - do { - struct cifs_credits credits_on_stack; - struct cifs_credits *credits = &credits_on_stack; - unsigned int nsegs = 0; - size_t wsize; - - if (signal_pending(current)) { - rc = -EINTR; - break; - } - - if (open_file->invalidHandle) { - rc = cifs_reopen_file(open_file, false); - if (rc == -EAGAIN) - continue; - else if (rc) - break; - } - - rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->wsize, - &wsize, credits); - if (rc) - break; - - max_len = min_t(const size_t, len, wsize); - if (!max_len) { - rc = -EAGAIN; - add_credits_and_wake_if(server, credits, 0); - break; - } - - cur_len = cifs_limit_bvec_subset(from, max_len, max_segs, &nsegs); - cifs_dbg(FYI, "write_from_iter len=%zx/%zx nsegs=%u/%lu/%u\n", - cur_len, max_len, nsegs, from->nr_segs, max_segs); - if (cur_len == 0) { - rc = -EIO; - add_credits_and_wake_if(server, credits, 0); - break; - } - - wdata = cifs_writedata_alloc(cifs_uncached_writev_complete); - if (!wdata) { - rc = -ENOMEM; - add_credits_and_wake_if(server, credits, 0); - break; - } - - wdata->uncached = true; - wdata->sync_mode = WB_SYNC_ALL; - wdata->subreq.start = (__u64)fpos; - wdata->cfile = cifsFileInfo_get(open_file); - wdata->server = server; - wdata->pid = pid; - wdata->subreq.len = cur_len; - wdata->credits = credits_on_stack; - wdata->subreq.io_iter = *from; - wdata->ctx = ctx; - kref_get(&ctx->refcount); - - iov_iter_truncate(&wdata->subreq.io_iter, cur_len); - - rc = adjust_credits(server, &wdata->credits, wdata->subreq.len); - - if (!rc) { - if (wdata->cfile->invalidHandle) - rc = -EAGAIN; - else - rc = server->ops->async_writev(wdata); - } - - if (rc) { - add_credits_and_wake_if(server, &wdata->credits, 0); - cifs_put_writedata(wdata); - if (rc == -EAGAIN) - continue; - break; - } - - list_add_tail(&wdata->list, wdata_list); - iov_iter_advance(from, cur_len); - fpos += cur_len; - len -= cur_len; - } while (len > 0); - - free_xid(xid); - return rc; -} - -static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) -{ - struct cifs_io_subrequest *wdata, *tmp; - struct cifs_tcon *tcon; - struct cifs_sb_info *cifs_sb; - struct dentry *dentry = ctx->cfile->dentry; - ssize_t rc; - - tcon = tlink_tcon(ctx->cfile->tlink); - cifs_sb = CIFS_SB(dentry->d_sb); - - mutex_lock(&ctx->aio_mutex); - - if (list_empty(&ctx->list)) { - mutex_unlock(&ctx->aio_mutex); - return; - } - - rc = ctx->rc; - /* - * Wait for and collect replies for any successful sends in order of - * increasing offset. Once an error is hit, then return without waiting - * for any more replies. - */ -restart_loop: - list_for_each_entry_safe(wdata, tmp, &ctx->list, list) { - if (!rc) { - if (!try_wait_for_completion(&wdata->done)) { - mutex_unlock(&ctx->aio_mutex); - return; - } - - if (wdata->result) - rc = wdata->result; - else - ctx->total_len += wdata->subreq.len; - - /* resend call if it's a retryable error */ - if (rc == -EAGAIN) { - struct list_head tmp_list; - struct iov_iter tmp_from = ctx->iter; - - INIT_LIST_HEAD(&tmp_list); - list_del_init(&wdata->list); - - if (ctx->direct_io) - rc = cifs_resend_wdata( - wdata, &tmp_list, ctx); - else { - iov_iter_advance(&tmp_from, - wdata->subreq.start - ctx->pos); - - rc = cifs_write_from_iter(wdata->subreq.start, - wdata->subreq.len, &tmp_from, - ctx->cfile, cifs_sb, &tmp_list, - ctx); - - cifs_put_writedata(wdata); - } - - list_splice(&tmp_list, &ctx->list); - goto restart_loop; - } - } - list_del_init(&wdata->list); - cifs_put_writedata(wdata); - } - - cifs_stats_bytes_written(tcon, ctx->total_len); - set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(dentry->d_inode)->flags); - - ctx->rc = (rc == 0) ? ctx->total_len : rc; - - mutex_unlock(&ctx->aio_mutex); - - if (ctx->iocb && ctx->iocb->ki_complete) - ctx->iocb->ki_complete(ctx->iocb, ctx->rc); - else - complete(&ctx->done); -} - -static ssize_t __cifs_writev( - struct kiocb *iocb, struct iov_iter *from, bool direct) -{ - struct file *file = iocb->ki_filp; - ssize_t total_written = 0; - struct cifsFileInfo *cfile; - struct cifs_tcon *tcon; - struct cifs_sb_info *cifs_sb; - struct cifs_aio_ctx *ctx; - int rc; - - rc = generic_write_checks(iocb, from); - if (rc <= 0) - return rc; - - cifs_sb = CIFS_FILE_SB(file); - cfile = file->private_data; - tcon = tlink_tcon(cfile->tlink); - - if (!tcon->ses->server->ops->async_writev) - return -ENOSYS; - - ctx = cifs_aio_ctx_alloc(); - if (!ctx) - return -ENOMEM; - - ctx->cfile = cifsFileInfo_get(cfile); - - if (!is_sync_kiocb(iocb)) - ctx->iocb = iocb; - - ctx->pos = iocb->ki_pos; - ctx->direct_io = direct; - ctx->nr_pinned_pages = 0; - - if (user_backed_iter(from)) { - /* - * Extract IOVEC/UBUF-type iterators to a BVEC-type iterator as - * they contain references to the calling process's virtual - * memory layout which won't be available in an async worker - * thread. This also takes a pin on every folio involved. - */ - rc = netfs_extract_user_iter(from, iov_iter_count(from), - &ctx->iter, 0); - if (rc < 0) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return rc; - } - - ctx->nr_pinned_pages = rc; - ctx->bv = (void *)ctx->iter.bvec; - ctx->bv_need_unpin = iov_iter_extract_will_pin(from); - } else if ((iov_iter_is_bvec(from) || iov_iter_is_kvec(from)) && - !is_sync_kiocb(iocb)) { - /* - * If the op is asynchronous, we need to copy the list attached - * to a BVEC/KVEC-type iterator, but we assume that the storage - * will be pinned by the caller; in any case, we may or may not - * be able to pin the pages, so we don't try. - */ - ctx->bv = (void *)dup_iter(&ctx->iter, from, GFP_KERNEL); - if (!ctx->bv) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -ENOMEM; - } - } else { - /* - * Otherwise, we just pass the iterator down as-is and rely on - * the caller to make sure the pages referred to by the - * iterator don't evaporate. - */ - ctx->iter = *from; - } - - ctx->len = iov_iter_count(&ctx->iter); - - /* grab a lock here due to read response handlers can access ctx */ - mutex_lock(&ctx->aio_mutex); - - rc = cifs_write_from_iter(iocb->ki_pos, ctx->len, &ctx->iter, - cfile, cifs_sb, &ctx->list, ctx); - - /* - * If at least one write was successfully sent, then discard any rc - * value from the later writes. If the other write succeeds, then - * we'll end up returning whatever was written. If it fails, then - * we'll get a new rc value from that. - */ - if (!list_empty(&ctx->list)) - rc = 0; - - mutex_unlock(&ctx->aio_mutex); - - if (rc) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return rc; - } - - if (!is_sync_kiocb(iocb)) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -EIOCBQUEUED; - } - - rc = wait_for_completion_killable(&ctx->done); - if (rc) { - mutex_lock(&ctx->aio_mutex); - ctx->rc = rc = -EINTR; - total_written = ctx->total_len; - mutex_unlock(&ctx->aio_mutex); - } else { - rc = ctx->rc; - total_written = ctx->total_len; - } - - kref_put(&ctx->refcount, cifs_aio_ctx_release); - - if (unlikely(!total_written)) - return rc; - - iocb->ki_pos += total_written; - return total_written; -} - -ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *from) -{ - struct file *file = iocb->ki_filp; - - cifs_revalidate_mapping(file->f_inode); - return __cifs_writev(iocb, from, true); -} - -ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from) -{ - return __cifs_writev(iocb, from, false); -} -#endif // TODO remove 3594 - static ssize_t cifs_writev(struct kiocb *iocb, struct iov_iter *from) { @@ -3248,450 +2783,6 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from) return written; } -#if 0 // TODO remove 4143 -static struct cifs_io_subrequest *cifs_readdata_alloc(work_func_t complete) -{ - struct cifs_io_subrequest *rdata; - - rdata = kzalloc(sizeof(*rdata), GFP_KERNEL); - if (rdata) { - refcount_set(&rdata->subreq.ref, 1); - INIT_LIST_HEAD(&rdata->list); - init_completion(&rdata->done); - INIT_WORK(&rdata->work, complete); - } - - return rdata; -} - -void -cifs_readdata_release(struct cifs_io_subrequest *rdata) -{ - if (rdata->ctx) - kref_put(&rdata->ctx->refcount, cifs_aio_ctx_release); -#ifdef CONFIG_CIFS_SMB_DIRECT - if (rdata->mr) { - smbd_deregister_mr(rdata->mr); - rdata->mr = NULL; - } -#endif - if (rdata->cfile) - cifsFileInfo_put(rdata->cfile); - - kfree(rdata); -} - -static void collect_uncached_read_data(struct cifs_aio_ctx *ctx); - -static void -cifs_uncached_readv_complete(struct work_struct *work) -{ - struct cifs_io_subrequest *rdata = - container_of(work, struct cifs_io_subrequest, work); - - complete(&rdata->done); - collect_uncached_read_data(rdata->ctx); - /* the below call can possibly free the last ref to aio ctx */ - cifs_put_readdata(rdata); -} - -static int cifs_resend_rdata(struct cifs_io_subrequest *rdata, - struct list_head *rdata_list, - struct cifs_aio_ctx *ctx) -{ - size_t rsize; - struct cifs_credits credits; - int rc; - struct TCP_Server_Info *server; - - /* XXX: should we pick a new channel here? */ - server = rdata->server; - - do { - if (rdata->cfile->invalidHandle) { - rc = cifs_reopen_file(rdata->cfile, true); - if (rc == -EAGAIN) - continue; - else if (rc) - break; - } - - /* - * Wait for credits to resend this rdata. - * Note: we are attempting to resend the whole rdata not in - * segments - */ - do { - rc = server->ops->wait_mtu_credits(server, rdata->subreq.len, - &rsize, &credits); - - if (rc) - goto fail; - - if (rsize < rdata->subreq.len) { - add_credits_and_wake_if(server, &credits, 0); - msleep(1000); - } - } while (rsize < rdata->subreq.len); - rdata->credits = credits; - - rc = adjust_credits(server, &rdata->credits, rdata->subreq.len); - if (!rc) { - if (rdata->cfile->invalidHandle) - rc = -EAGAIN; - else { -#ifdef CONFIG_CIFS_SMB_DIRECT - if (rdata->mr) { - rdata->mr->need_invalidate = true; - smbd_deregister_mr(rdata->mr); - rdata->mr = NULL; - } -#endif - rc = server->ops->async_readv(rdata); - } - } - - /* If the read was successfully sent, we are done */ - if (!rc) { - /* Add to aio pending list */ - list_add_tail(&rdata->list, rdata_list); - return 0; - } - - /* Roll back credits and retry if needed */ - add_credits_and_wake_if(server, &rdata->credits, 0); - } while (rc == -EAGAIN); - -fail: - cifs_put_readdata(rdata); - return rc; -} - -static int -cifs_send_async_read(loff_t fpos, size_t len, struct cifsFileInfo *open_file, - struct cifs_sb_info *cifs_sb, struct list_head *rdata_list, - struct cifs_aio_ctx *ctx) -{ - struct cifs_io_subrequest *rdata; - unsigned int nsegs, max_segs = INT_MAX; - struct cifs_credits credits_on_stack; - struct cifs_credits *credits = &credits_on_stack; - size_t cur_len, max_len, rsize; - int rc; - pid_t pid; - struct TCP_Server_Info *server; - - server = cifs_pick_channel(tlink_tcon(open_file->tlink)->ses); - -#ifdef CONFIG_CIFS_SMB_DIRECT - if (server->smbd_conn) - max_segs = server->smbd_conn->max_frmr_depth; -#endif - - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) - pid = open_file->pid; - else - pid = current->tgid; - - do { - if (open_file->invalidHandle) { - rc = cifs_reopen_file(open_file, true); - if (rc == -EAGAIN) - continue; - else if (rc) - break; - } - - if (cifs_sb->ctx->rsize == 0) - cifs_sb->ctx->rsize = - server->ops->negotiate_rsize(tlink_tcon(open_file->tlink), - cifs_sb->ctx); - - rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, - &rsize, credits); - if (rc) - break; - - max_len = min_t(size_t, len, rsize); - - cur_len = cifs_limit_bvec_subset(&ctx->iter, max_len, - max_segs, &nsegs); - cifs_dbg(FYI, "read-to-iter len=%zx/%zx nsegs=%u/%lu/%u\n", - cur_len, max_len, nsegs, ctx->iter.nr_segs, max_segs); - if (cur_len == 0) { - rc = -EIO; - add_credits_and_wake_if(server, credits, 0); - break; - } - - rdata = cifs_readdata_alloc(cifs_uncached_readv_complete); - if (!rdata) { - add_credits_and_wake_if(server, credits, 0); - rc = -ENOMEM; - break; - } - - rdata->server = server; - rdata->cfile = cifsFileInfo_get(open_file); - rdata->subreq.start = fpos; - rdata->subreq.len = cur_len; - rdata->pid = pid; - rdata->credits = credits_on_stack; - rdata->ctx = ctx; - kref_get(&ctx->refcount); - - rdata->subreq.io_iter = ctx->iter; - iov_iter_truncate(&rdata->subreq.io_iter, cur_len); - - rc = adjust_credits(server, &rdata->credits, rdata->subreq.len); - - if (!rc) { - if (rdata->cfile->invalidHandle) - rc = -EAGAIN; - else - rc = server->ops->async_readv(rdata); - } - - if (rc) { - add_credits_and_wake_if(server, &rdata->credits, 0); - cifs_put_readdata(rdata); - if (rc == -EAGAIN) - continue; - break; - } - - list_add_tail(&rdata->list, rdata_list); - iov_iter_advance(&ctx->iter, cur_len); - fpos += cur_len; - len -= cur_len; - } while (len > 0); - - return rc; -} - -static void -collect_uncached_read_data(struct cifs_aio_ctx *ctx) -{ - struct cifs_io_subrequest *rdata, *tmp; - struct cifs_sb_info *cifs_sb; - int rc; - - cifs_sb = CIFS_SB(ctx->cfile->dentry->d_sb); - - mutex_lock(&ctx->aio_mutex); - - if (list_empty(&ctx->list)) { - mutex_unlock(&ctx->aio_mutex); - return; - } - - rc = ctx->rc; - /* the loop below should proceed in the order of increasing offsets */ -again: - list_for_each_entry_safe(rdata, tmp, &ctx->list, list) { - if (!rc) { - if (!try_wait_for_completion(&rdata->done)) { - mutex_unlock(&ctx->aio_mutex); - return; - } - - if (rdata->result == -EAGAIN) { - /* resend call if it's a retryable error */ - struct list_head tmp_list; - unsigned int got_bytes = rdata->got_bytes; - - list_del_init(&rdata->list); - INIT_LIST_HEAD(&tmp_list); - - if (ctx->direct_io) { - /* - * Re-use rdata as this is a - * direct I/O - */ - rc = cifs_resend_rdata( - rdata, - &tmp_list, ctx); - } else { - rc = cifs_send_async_read( - rdata->subreq.start + got_bytes, - rdata->subreq.len - got_bytes, - rdata->cfile, cifs_sb, - &tmp_list, ctx); - - cifs_put_readdata(rdata); - } - - list_splice(&tmp_list, &ctx->list); - - goto again; - } else if (rdata->result) - rc = rdata->result; - - /* if there was a short read -- discard anything left */ - if (rdata->got_bytes && rdata->got_bytes < rdata->subreq.len) - rc = -ENODATA; - - ctx->total_len += rdata->got_bytes; - } - list_del_init(&rdata->list); - cifs_put_readdata(rdata); - } - - /* mask nodata case */ - if (rc == -ENODATA) - rc = 0; - - ctx->rc = (rc == 0) ? (ssize_t)ctx->total_len : rc; - - mutex_unlock(&ctx->aio_mutex); - - if (ctx->iocb && ctx->iocb->ki_complete) - ctx->iocb->ki_complete(ctx->iocb, ctx->rc); - else - complete(&ctx->done); -} - -static ssize_t __cifs_readv( - struct kiocb *iocb, struct iov_iter *to, bool direct) -{ - size_t len; - struct file *file = iocb->ki_filp; - struct cifs_sb_info *cifs_sb; - struct cifsFileInfo *cfile; - struct cifs_tcon *tcon; - ssize_t rc, total_read = 0; - loff_t offset = iocb->ki_pos; - struct cifs_aio_ctx *ctx; - - len = iov_iter_count(to); - if (!len) - return 0; - - cifs_sb = CIFS_FILE_SB(file); - cfile = file->private_data; - tcon = tlink_tcon(cfile->tlink); - - if (!tcon->ses->server->ops->async_readv) - return -ENOSYS; - - if ((file->f_flags & O_ACCMODE) == O_WRONLY) - cifs_dbg(FYI, "attempting read on write only file instance\n"); - - ctx = cifs_aio_ctx_alloc(); - if (!ctx) - return -ENOMEM; - - ctx->pos = offset; - ctx->direct_io = direct; - ctx->len = len; - ctx->cfile = cifsFileInfo_get(cfile); - ctx->nr_pinned_pages = 0; - - if (!is_sync_kiocb(iocb)) - ctx->iocb = iocb; - - if (user_backed_iter(to)) { - /* - * Extract IOVEC/UBUF-type iterators to a BVEC-type iterator as - * they contain references to the calling process's virtual - * memory layout which won't be available in an async worker - * thread. This also takes a pin on every folio involved. - */ - rc = netfs_extract_user_iter(to, iov_iter_count(to), - &ctx->iter, 0); - if (rc < 0) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return rc; - } - - ctx->nr_pinned_pages = rc; - ctx->bv = (void *)ctx->iter.bvec; - ctx->bv_need_unpin = iov_iter_extract_will_pin(to); - ctx->should_dirty = true; - } else if ((iov_iter_is_bvec(to) || iov_iter_is_kvec(to)) && - !is_sync_kiocb(iocb)) { - /* - * If the op is asynchronous, we need to copy the list attached - * to a BVEC/KVEC-type iterator, but we assume that the storage - * will be retained by the caller; in any case, we may or may - * not be able to pin the pages, so we don't try. - */ - ctx->bv = (void *)dup_iter(&ctx->iter, to, GFP_KERNEL); - if (!ctx->bv) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -ENOMEM; - } - } else { - /* - * Otherwise, we just pass the iterator down as-is and rely on - * the caller to make sure the pages referred to by the - * iterator don't evaporate. - */ - ctx->iter = *to; - } - - if (direct) { - rc = filemap_write_and_wait_range(file->f_inode->i_mapping, - offset, offset + len - 1); - if (rc) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -EAGAIN; - } - } - - /* grab a lock here due to read response handlers can access ctx */ - mutex_lock(&ctx->aio_mutex); - - rc = cifs_send_async_read(offset, len, cfile, cifs_sb, &ctx->list, ctx); - - /* if at least one read request send succeeded, then reset rc */ - if (!list_empty(&ctx->list)) - rc = 0; - - mutex_unlock(&ctx->aio_mutex); - - if (rc) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return rc; - } - - if (!is_sync_kiocb(iocb)) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -EIOCBQUEUED; - } - - rc = wait_for_completion_killable(&ctx->done); - if (rc) { - mutex_lock(&ctx->aio_mutex); - ctx->rc = rc = -EINTR; - total_read = ctx->total_len; - mutex_unlock(&ctx->aio_mutex); - } else { - rc = ctx->rc; - total_read = ctx->total_len; - } - - kref_put(&ctx->refcount, cifs_aio_ctx_release); - - if (total_read) { - iocb->ki_pos += total_read; - return total_read; - } - return rc; -} - -ssize_t cifs_direct_readv(struct kiocb *iocb, struct iov_iter *to) -{ - return __cifs_readv(iocb, to, true); -} - -ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to) -{ - return __cifs_readv(iocb, to, false); - -} -#endif // end netfslib removal 4143 - ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter) { ssize_t rc; @@ -3790,101 +2881,6 @@ cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to) return rc; } -#if 0 // TODO remove 4633 -static ssize_t -cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *offset) -{ - int rc = -EACCES; - unsigned int bytes_read = 0; - unsigned int total_read; - unsigned int current_read_size; - unsigned int rsize; - struct cifs_sb_info *cifs_sb; - struct cifs_tcon *tcon; - struct TCP_Server_Info *server; - unsigned int xid; - char *cur_offset; - struct cifsFileInfo *open_file; - struct cifs_io_parms io_parms = {0}; - int buf_type = CIFS_NO_BUFFER; - __u32 pid; - - xid = get_xid(); - cifs_sb = CIFS_FILE_SB(file); - - /* FIXME: set up handlers for larger reads and/or convert to async */ - rsize = min_t(unsigned int, cifs_sb->ctx->rsize, CIFSMaxBufSize); - - if (file->private_data == NULL) { - rc = -EBADF; - free_xid(xid); - return rc; - } - open_file = file->private_data; - tcon = tlink_tcon(open_file->tlink); - server = cifs_pick_channel(tcon->ses); - - if (!server->ops->sync_read) { - free_xid(xid); - return -ENOSYS; - } - - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) - pid = open_file->pid; - else - pid = current->tgid; - - if ((file->f_flags & O_ACCMODE) == O_WRONLY) - cifs_dbg(FYI, "attempting read on write only file instance\n"); - - for (total_read = 0, cur_offset = read_data; read_size > total_read; - total_read += bytes_read, cur_offset += bytes_read) { - do { - current_read_size = min_t(uint, read_size - total_read, - rsize); - /* - * For windows me and 9x we do not want to request more - * than it negotiated since it will refuse the read - * then. - */ - if (!(tcon->ses->capabilities & - tcon->ses->server->vals->cap_large_files)) { - current_read_size = min_t(uint, - current_read_size, CIFSMaxBufSize); - } - if (open_file->invalidHandle) { - rc = cifs_reopen_file(open_file, true); - if (rc != 0) - break; - } - io_parms.pid = pid; - io_parms.tcon = tcon; - io_parms.offset = *offset; - io_parms.length = current_read_size; - io_parms.server = server; - rc = server->ops->sync_read(xid, &open_file->fid, &io_parms, - &bytes_read, &cur_offset, - &buf_type); - } while (rc == -EAGAIN); - - if (rc || (bytes_read == 0)) { - if (total_read) { - break; - } else { - free_xid(xid); - return rc; - } - } else { - cifs_stats_bytes_read(tcon, total_read); - *offset += bytes_read; - } - } - free_xid(xid); - return total_read; -} -#endif // end netfslib remove 4633 - - static vm_fault_t cifs_page_mkwrite(struct vm_fault *vmf) { return netfs_page_mkwrite(vmf, NULL);
Remove some code that was #if'd out with the netfslib conversion. This is split into parts for file.c as the diff generator otherwise produces a hard to read diff for part of it where a big chunk is cut out. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsglob.h | 12 - fs/smb/client/cifsproto.h | 25 -- fs/smb/client/file.c | 619 -------------------------------------- fs/smb/client/fscache.c | 111 ------- fs/smb/client/fscache.h | 58 ---- 5 files changed, 825 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 639cdeb3f77e..94885bf86ff2 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -1510,18 +1510,6 @@ struct cifs_io_subrequest { struct smbd_mr *mr; #endif struct cifs_credits credits; - -#if 0 // TODO: Remove following elements - struct list_head list; - struct completion done; - struct work_struct work; - struct cifsFileInfo *cfile; - struct address_space *mapping; - struct cifs_aio_ctx *ctx; - enum writeback_sync_modes sync_mode; - bool uncached; - struct bio_vec *bv; -#endif }; /* diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index e0ccf32d7ecd..57ec67cdc31e 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -600,36 +600,11 @@ void __cifs_put_smb_ses(struct cifs_ses *ses); extern struct cifs_ses * cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx); -#if 0 // TODO Remove -void cifs_readdata_release(struct cifs_io_subrequest *rdata); -static inline void cifs_get_readdata(struct cifs_io_subrequest *rdata) -{ - refcount_inc(&rdata->subreq.ref); -} -static inline void cifs_put_readdata(struct cifs_io_subrequest *rdata) -{ - if (refcount_dec_and_test(&rdata->subreq.ref)) - cifs_readdata_release(rdata); -} -#endif int cifs_async_readv(struct cifs_io_subrequest *rdata); int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid); void cifs_async_writev(struct cifs_io_subrequest *wdata); void cifs_writev_complete(struct work_struct *work); -#if 0 // TODO Remove -struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete); -void cifs_writedata_release(struct cifs_io_subrequest *rdata); -static inline void cifs_get_writedata(struct cifs_io_subrequest *wdata) -{ - refcount_inc(&wdata->subreq.ref); -} -static inline void cifs_put_writedata(struct cifs_io_subrequest *wdata) -{ - if (refcount_dec_and_test(&wdata->subreq.ref)) - cifs_writedata_release(wdata); -} -#endif int cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const unsigned char *path, char *pbuf, diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index c57a3638c51a..265d96f663d7 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -352,133 +352,6 @@ const struct netfs_request_ops cifs_req_ops = { .issue_write = cifs_issue_write, }; -#if 0 // TODO remove 397 -/* - * Remove the dirty flags from a span of pages. - */ -static void cifs_undirty_folios(struct inode *inode, loff_t start, unsigned int len) -{ - struct address_space *mapping = inode->i_mapping; - struct folio *folio; - pgoff_t end; - - XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE); - - rcu_read_lock(); - - end = (start + len - 1) / PAGE_SIZE; - xas_for_each_marked(&xas, folio, end, PAGECACHE_TAG_DIRTY) { - if (xas_retry(&xas, folio)) - continue; - xas_pause(&xas); - rcu_read_unlock(); - folio_lock(folio); - folio_clear_dirty_for_io(folio); - folio_unlock(folio); - rcu_read_lock(); - } - - rcu_read_unlock(); -} - -/* - * Completion of write to server. - */ -void cifs_pages_written_back(struct inode *inode, loff_t start, unsigned int len) -{ - struct address_space *mapping = inode->i_mapping; - struct folio *folio; - pgoff_t end; - - XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE); - - if (!len) - return; - - rcu_read_lock(); - - end = (start + len - 1) / PAGE_SIZE; - xas_for_each(&xas, folio, end) { - if (xas_retry(&xas, folio)) - continue; - if (!folio_test_writeback(folio)) { - WARN_ONCE(1, "bad %x @%llx page %lx %lx\n", - len, start, folio->index, end); - continue; - } - - folio_detach_private(folio); - folio_end_writeback(folio); - } - - rcu_read_unlock(); -} - -/* - * Failure of write to server. - */ -void cifs_pages_write_failed(struct inode *inode, loff_t start, unsigned int len) -{ - struct address_space *mapping = inode->i_mapping; - struct folio *folio; - pgoff_t end; - - XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE); - - if (!len) - return; - - rcu_read_lock(); - - end = (start + len - 1) / PAGE_SIZE; - xas_for_each(&xas, folio, end) { - if (xas_retry(&xas, folio)) - continue; - if (!folio_test_writeback(folio)) { - WARN_ONCE(1, "bad %x @%llx page %lx %lx\n", - len, start, folio->index, end); - continue; - } - - folio_set_error(folio); - folio_end_writeback(folio); - } - - rcu_read_unlock(); -} - -/* - * Redirty pages after a temporary failure. - */ -void cifs_pages_write_redirty(struct inode *inode, loff_t start, unsigned int len) -{ - struct address_space *mapping = inode->i_mapping; - struct folio *folio; - pgoff_t end; - - XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE); - - if (!len) - return; - - rcu_read_lock(); - - end = (start + len - 1) / PAGE_SIZE; - xas_for_each(&xas, folio, end) { - if (!folio_test_writeback(folio)) { - WARN_ONCE(1, "bad %x @%llx page %lx %lx\n", - len, start, folio->index, end); - continue; - } - - filemap_dirty_folio(folio->mapping, folio); - folio_end_writeback(folio); - } - - rcu_read_unlock(); -} -#endif // end netfslib remove 397 - /* * Mark as invalid, all open files on tree connections since they * were closed when session to server was lost. @@ -2492,92 +2365,6 @@ void cifs_write_subrequest_terminated(struct cifs_io_subrequest *wdata, ssize_t netfs_write_subrequest_terminated(&wdata->subreq, result, was_async); } -#if 0 // TODO remove 2483 -static ssize_t -cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_data, - size_t write_size, loff_t *offset) -{ - int rc = 0; - unsigned int bytes_written = 0; - unsigned int total_written; - struct cifs_tcon *tcon; - struct TCP_Server_Info *server; - unsigned int xid; - struct dentry *dentry = open_file->dentry; - struct cifsInodeInfo *cifsi = CIFS_I(d_inode(dentry)); - struct cifs_io_parms io_parms = {0}; - - cifs_dbg(FYI, "write %zd bytes to offset %lld of %pd\n", - write_size, *offset, dentry); - - tcon = tlink_tcon(open_file->tlink); - server = tcon->ses->server; - - if (!server->ops->sync_write) - return -ENOSYS; - - xid = get_xid(); - - for (total_written = 0; write_size > total_written; - total_written += bytes_written) { - rc = -EAGAIN; - while (rc == -EAGAIN) { - struct kvec iov[2]; - unsigned int len; - - if (open_file->invalidHandle) { - /* we could deadlock if we called - filemap_fdatawait from here so tell - reopen_file not to flush data to - server now */ - rc = cifs_reopen_file(open_file, false); - if (rc != 0) - break; - } - - len = min(server->ops->wp_retry_size(d_inode(dentry)), - (unsigned int)write_size - total_written); - /* iov[0] is reserved for smb header */ - iov[1].iov_base = (char *)write_data + total_written; - iov[1].iov_len = len; - io_parms.pid = pid; - io_parms.tcon = tcon; - io_parms.offset = *offset; - io_parms.length = len; - rc = server->ops->sync_write(xid, &open_file->fid, - &io_parms, &bytes_written, iov, 1); - } - if (rc || (bytes_written == 0)) { - if (total_written) - break; - else { - free_xid(xid); - return rc; - } - } else { - spin_lock(&d_inode(dentry)->i_lock); - cifs_update_eof(cifsi, *offset, bytes_written); - spin_unlock(&d_inode(dentry)->i_lock); - *offset += bytes_written; - } - } - - cifs_stats_bytes_written(tcon, total_written); - - if (total_written > 0) { - spin_lock(&d_inode(dentry)->i_lock); - if (*offset > d_inode(dentry)->i_size) { - i_size_write(d_inode(dentry), *offset); - d_inode(dentry)->i_blocks = (512 - 1 + *offset) >> 9; - } - spin_unlock(&d_inode(dentry)->i_lock); - } - mark_inode_dirty_sync(d_inode(dentry)); - free_xid(xid); - return total_written; -} -#endif // end netfslib remove 2483 - struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, bool fsuid_only) { @@ -4778,293 +4565,6 @@ int cifs_file_mmap(struct file *file, struct vm_area_struct *vma) return rc; } -#if 0 // TODO remove 4794 -/* - * Unlock a bunch of folios in the pagecache. - */ -static void cifs_unlock_folios(struct address_space *mapping, pgoff_t first, pgoff_t last) -{ - struct folio *folio; - XA_STATE(xas, &mapping->i_pages, first); - - rcu_read_lock(); - xas_for_each(&xas, folio, last) { - folio_unlock(folio); - } - rcu_read_unlock(); -} - -static void cifs_readahead_complete(struct work_struct *work) -{ - struct cifs_io_subrequest *rdata = container_of(work, - struct cifs_io_subrequest, work); - struct folio *folio; - pgoff_t last; - bool good = rdata->result == 0 || (rdata->result == -EAGAIN && rdata->got_bytes); - - XA_STATE(xas, &rdata->mapping->i_pages, rdata->subreq.start / PAGE_SIZE); - - if (good) - cifs_readahead_to_fscache(rdata->mapping->host, - rdata->subreq.start, rdata->subreq.len); - - if (iov_iter_count(&rdata->subreq.io_iter) > 0) - iov_iter_zero(iov_iter_count(&rdata->subreq.io_iter), &rdata->subreq.io_iter); - - last = (rdata->subreq.start + rdata->subreq.len - 1) / PAGE_SIZE; - - rcu_read_lock(); - xas_for_each(&xas, folio, last) { - if (good) { - flush_dcache_folio(folio); - folio_mark_uptodate(folio); - } - folio_unlock(folio); - } - rcu_read_unlock(); - - cifs_put_readdata(rdata); -} - -static void cifs_readahead(struct readahead_control *ractl) -{ - struct cifsFileInfo *open_file = ractl->file->private_data; - struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(ractl->file); - struct TCP_Server_Info *server; - unsigned int xid, nr_pages, cache_nr_pages = 0; - unsigned int ra_pages; - pgoff_t next_cached = ULONG_MAX, ra_index; - bool caching = fscache_cookie_enabled(cifs_inode_cookie(ractl->mapping->host)) && - cifs_inode_cookie(ractl->mapping->host)->cache_priv; - bool check_cache = caching; - pid_t pid; - int rc = 0; - - /* Note that readahead_count() lags behind our dequeuing of pages from - * the ractl, wo we have to keep track for ourselves. - */ - ra_pages = readahead_count(ractl); - ra_index = readahead_index(ractl); - - xid = get_xid(); - - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) - pid = open_file->pid; - else - pid = current->tgid; - - server = cifs_pick_channel(tlink_tcon(open_file->tlink)->ses); - - cifs_dbg(FYI, "%s: file=%p mapping=%p num_pages=%u\n", - __func__, ractl->file, ractl->mapping, ra_pages); - - /* - * Chop the readahead request up into rsize-sized read requests. - */ - while ((nr_pages = ra_pages)) { - unsigned int i; - struct cifs_io_subrequest *rdata; - struct cifs_credits credits_on_stack; - struct cifs_credits *credits = &credits_on_stack; - struct folio *folio; - pgoff_t fsize; - size_t rsize; - - /* - * Find out if we have anything cached in the range of - * interest, and if so, where the next chunk of cached data is. - */ - if (caching) { - if (check_cache) { - rc = cifs_fscache_query_occupancy( - ractl->mapping->host, ra_index, nr_pages, - &next_cached, &cache_nr_pages); - if (rc < 0) - caching = false; - check_cache = false; - } - - if (ra_index == next_cached) { - /* - * TODO: Send a whole batch of pages to be read - * by the cache. - */ - folio = readahead_folio(ractl); - fsize = folio_nr_pages(folio); - ra_pages -= fsize; - ra_index += fsize; - if (cifs_readpage_from_fscache(ractl->mapping->host, - &folio->page) < 0) { - /* - * TODO: Deal with cache read failure - * here, but for the moment, delegate - * that to readpage. - */ - caching = false; - } - folio_unlock(folio); - next_cached += fsize; - cache_nr_pages -= fsize; - if (cache_nr_pages == 0) - check_cache = true; - continue; - } - } - - if (open_file->invalidHandle) { - rc = cifs_reopen_file(open_file, true); - if (rc) { - if (rc == -EAGAIN) - continue; - break; - } - } - - if (cifs_sb->ctx->rsize == 0) - cifs_sb->ctx->rsize = - server->ops->negotiate_rsize(tlink_tcon(open_file->tlink), - cifs_sb->ctx); - - rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, - &rsize, credits); - if (rc) - break; - nr_pages = min_t(size_t, rsize / PAGE_SIZE, ra_pages); - if (next_cached != ULONG_MAX) - nr_pages = min_t(size_t, nr_pages, next_cached - ra_index); - - /* - * Give up immediately if rsize is too small to read an entire - * page. The VFS will fall back to readpage. We should never - * reach this point however since we set ra_pages to 0 when the - * rsize is smaller than a cache page. - */ - if (unlikely(!nr_pages)) { - add_credits_and_wake_if(server, credits, 0); - break; - } - - rdata = cifs_readdata_alloc(cifs_readahead_complete); - if (!rdata) { - /* best to give up if we're out of mem */ - add_credits_and_wake_if(server, credits, 0); - break; - } - - rdata->subreq.start = ra_index * PAGE_SIZE; - rdata->subreq.len = nr_pages * PAGE_SIZE; - rdata->cfile = cifsFileInfo_get(open_file); - rdata->server = server; - rdata->mapping = ractl->mapping; - rdata->pid = pid; - rdata->credits = credits_on_stack; - - for (i = 0; i < nr_pages; i++) { - if (!readahead_folio(ractl)) - WARN_ON(1); - } - ra_pages -= nr_pages; - ra_index += nr_pages; - - iov_iter_xarray(&rdata->subreq.io_iter, ITER_DEST, &rdata->mapping->i_pages, - rdata->subreq.start, rdata->subreq.len); - - rc = adjust_credits(server, &rdata->credits, rdata->subreq.len); - if (!rc) { - if (rdata->cfile->invalidHandle) - rc = -EAGAIN; - else - rc = server->ops->async_readv(rdata); - } - - if (rc) { - add_credits_and_wake_if(server, &rdata->credits, 0); - cifs_unlock_folios(rdata->mapping, - rdata->subreq.start / PAGE_SIZE, - (rdata->subreq.start + rdata->subreq.len - 1) / PAGE_SIZE); - /* Fallback to the readpage in error/reconnect cases */ - cifs_put_readdata(rdata); - break; - } - - cifs_put_readdata(rdata); - } - - free_xid(xid); -} - -/* - * cifs_readpage_worker must be called with the page pinned - */ -static int cifs_readpage_worker(struct file *file, struct page *page, - loff_t *poffset) -{ - struct inode *inode = file_inode(file); - struct timespec64 atime, mtime; - char *read_data; - int rc; - - /* Is the page cached? */ - rc = cifs_readpage_from_fscache(inode, page); - if (rc == 0) - goto read_complete; - - read_data = kmap(page); - /* for reads over a certain size could initiate async read ahead */ - - rc = cifs_read(file, read_data, PAGE_SIZE, poffset); - - if (rc < 0) - goto io_error; - else - cifs_dbg(FYI, "Bytes read %d\n", rc); - - /* we do not want atime to be less than mtime, it broke some apps */ - atime = inode_set_atime_to_ts(inode, current_time(inode)); - mtime = inode_get_mtime(inode); - if (timespec64_compare(&atime, &mtime) < 0) - inode_set_atime_to_ts(inode, inode_get_mtime(inode)); - - if (PAGE_SIZE > rc) - memset(read_data + rc, 0, PAGE_SIZE - rc); - - flush_dcache_page(page); - SetPageUptodate(page); - rc = 0; - -io_error: - kunmap(page); - -read_complete: - unlock_page(page); - return rc; -} - -static int cifs_read_folio(struct file *file, struct folio *folio) -{ - struct page *page = &folio->page; - loff_t offset = page_file_offset(page); - int rc = -EACCES; - unsigned int xid; - - xid = get_xid(); - - if (file->private_data == NULL) { - rc = -EBADF; - free_xid(xid); - return rc; - } - - cifs_dbg(FYI, "read_folio %p at offset %d 0x%x\n", - page, (int)offset, (int)offset); - - rc = cifs_readpage_worker(file, page, &offset); - - free_xid(xid); - return rc; -} -#endif // end netfslib remove 4794 - static int is_inode_writable(struct cifsInodeInfo *cifs_inode) { struct cifsFileInfo *open_file; @@ -5112,104 +4612,6 @@ bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file, return true; } -#if 0 // TODO remove 5152 -static int cifs_write_begin(struct file *file, struct address_space *mapping, - loff_t pos, unsigned len, - struct page **pagep, void **fsdata) -{ - int oncethru = 0; - pgoff_t index = pos >> PAGE_SHIFT; - loff_t offset = pos & (PAGE_SIZE - 1); - loff_t page_start = pos & PAGE_MASK; - loff_t i_size; - struct page *page; - int rc = 0; - - cifs_dbg(FYI, "write_begin from %lld len %d\n", (long long)pos, len); - -start: - page = grab_cache_page_write_begin(mapping, index); - if (!page) { - rc = -ENOMEM; - goto out; - } - - if (PageUptodate(page)) - goto out; - - /* - * If we write a full page it will be up to date, no need to read from - * the server. If the write is short, we'll end up doing a sync write - * instead. - */ - if (len == PAGE_SIZE) - goto out; - - /* - * optimize away the read when we have an oplock, and we're not - * expecting to use any of the data we'd be reading in. That - * is, when the page lies beyond the EOF, or straddles the EOF - * and the write will cover all of the existing data. - */ - if (CIFS_CACHE_READ(CIFS_I(mapping->host))) { - i_size = i_size_read(mapping->host); - if (page_start >= i_size || - (offset == 0 && (pos + len) >= i_size)) { - zero_user_segments(page, 0, offset, - offset + len, - PAGE_SIZE); - /* - * PageChecked means that the parts of the page - * to which we're not writing are considered up - * to date. Once the data is copied to the - * page, it can be set uptodate. - */ - SetPageChecked(page); - goto out; - } - } - - if ((file->f_flags & O_ACCMODE) != O_WRONLY && !oncethru) { - /* - * might as well read a page, it is fast enough. If we get - * an error, we don't need to return it. cifs_write_end will - * do a sync write instead since PG_uptodate isn't set. - */ - cifs_readpage_worker(file, page, &page_start); - put_page(page); - oncethru = 1; - goto start; - } else { - /* we could try using another file handle if there is one - - but how would we lock it to prevent close of that handle - racing with this read? In any case - this will be written out by write_end so is fine */ - } -out: - *pagep = page; - return rc; -} - -static bool cifs_release_folio(struct folio *folio, gfp_t gfp) -{ - if (folio_test_private(folio)) - return 0; - if (folio_test_private_2(folio)) { /* [DEPRECATED] */ - if (current_is_kswapd() || !(gfp & __GFP_FS)) - return false; - folio_wait_private_2(folio); - } - fscache_note_page_release(cifs_inode_cookie(folio->mapping->host)); - return true; -} - -static void cifs_invalidate_folio(struct folio *folio, size_t offset, - size_t length) -{ - folio_wait_private_2(folio); /* [DEPRECATED] */ -} -#endif // end netfslib remove 5152 - void cifs_oplock_break(struct work_struct *work) { struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo, @@ -5299,27 +4701,6 @@ void cifs_oplock_break(struct work_struct *work) cifs_done_oplock_break(cinode); } -#if 0 // TODO remove 5333 -/* - * The presence of cifs_direct_io() in the address space ops vector - * allowes open() O_DIRECT flags which would have failed otherwise. - * - * In the non-cached mode (mount with cache=none), we shunt off direct read and write requests - * so this method should never be called. - * - * Direct IO is not yet supported in the cached mode. - */ -static ssize_t -cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter) -{ - /* - * FIXME - * Eventually need to support direct IO for non forcedirectio mounts - */ - return -EINVAL; -} -#endif // netfs end remove 5333 - static int cifs_swap_activate(struct swap_info_struct *sis, struct file *swap_file, sector_t *span) { diff --git a/fs/smb/client/fscache.c b/fs/smb/client/fscache.c index 7aa1d633c027..147e8cd38fe1 100644 --- a/fs/smb/client/fscache.c +++ b/fs/smb/client/fscache.c @@ -150,114 +150,3 @@ void cifs_fscache_release_inode_cookie(struct inode *inode) cifsi->netfs.cache = NULL; } } - -#if 0 // TODO remove -/* - * Fallback page reading interface. - */ -static int fscache_fallback_read_page(struct inode *inode, struct page *page) -{ - struct netfs_cache_resources cres; - struct fscache_cookie *cookie = cifs_inode_cookie(inode); - struct iov_iter iter; - struct bio_vec bvec; - int ret; - - memset(&cres, 0, sizeof(cres)); - bvec_set_page(&bvec, page, PAGE_SIZE, 0); - iov_iter_bvec(&iter, ITER_DEST, &bvec, 1, PAGE_SIZE); - - ret = fscache_begin_read_operation(&cres, cookie); - if (ret < 0) - return ret; - - ret = fscache_read(&cres, page_offset(page), &iter, NETFS_READ_HOLE_FAIL, - NULL, NULL); - fscache_end_operation(&cres); - return ret; -} - -/* - * Fallback page writing interface. - */ -static int fscache_fallback_write_pages(struct inode *inode, loff_t start, size_t len, - bool no_space_allocated_yet) -{ - struct netfs_cache_resources cres; - struct fscache_cookie *cookie = cifs_inode_cookie(inode); - struct iov_iter iter; - int ret; - - memset(&cres, 0, sizeof(cres)); - iov_iter_xarray(&iter, ITER_SOURCE, &inode->i_mapping->i_pages, start, len); - - ret = fscache_begin_write_operation(&cres, cookie); - if (ret < 0) - return ret; - - ret = cres.ops->prepare_write(&cres, &start, &len, len, i_size_read(inode), - no_space_allocated_yet); - if (ret == 0) - ret = fscache_write(&cres, start, &iter, NULL, NULL); - fscache_end_operation(&cres); - return ret; -} - -/* - * Retrieve a page from FS-Cache - */ -int __cifs_readpage_from_fscache(struct inode *inode, struct page *page) -{ - int ret; - - cifs_dbg(FYI, "%s: (fsc:%p, p:%p, i:0x%p\n", - __func__, cifs_inode_cookie(inode), page, inode); - - ret = fscache_fallback_read_page(inode, page); - if (ret < 0) - return ret; - - /* Read completed synchronously */ - SetPageUptodate(page); - return 0; -} - -void __cifs_readahead_to_fscache(struct inode *inode, loff_t pos, size_t len) -{ - cifs_dbg(FYI, "%s: (fsc: %p, p: %llx, l: %zx, i: %p)\n", - __func__, cifs_inode_cookie(inode), pos, len, inode); - - fscache_fallback_write_pages(inode, pos, len, true); -} - -/* - * Query the cache occupancy. - */ -int __cifs_fscache_query_occupancy(struct inode *inode, - pgoff_t first, unsigned int nr_pages, - pgoff_t *_data_first, - unsigned int *_data_nr_pages) -{ - struct netfs_cache_resources cres; - struct fscache_cookie *cookie = cifs_inode_cookie(inode); - loff_t start, data_start; - size_t len, data_len; - int ret; - - ret = fscache_begin_read_operation(&cres, cookie); - if (ret < 0) - return ret; - - start = first * PAGE_SIZE; - len = nr_pages * PAGE_SIZE; - ret = cres.ops->query_occupancy(&cres, start, len, PAGE_SIZE, - &data_start, &data_len); - if (ret == 0) { - *_data_first = data_start / PAGE_SIZE; - *_data_nr_pages = len / PAGE_SIZE; - } - - fscache_end_operation(&cres); - return ret; -} -#endif diff --git a/fs/smb/client/fscache.h b/fs/smb/client/fscache.h index 08b30f79d4cd..f06cb24f5f3c 100644 --- a/fs/smb/client/fscache.h +++ b/fs/smb/client/fscache.h @@ -74,43 +74,6 @@ static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags i_size_read(inode), flags); } -#if 0 // TODO remove -extern int __cifs_fscache_query_occupancy(struct inode *inode, - pgoff_t first, unsigned int nr_pages, - pgoff_t *_data_first, - unsigned int *_data_nr_pages); - -static inline int cifs_fscache_query_occupancy(struct inode *inode, - pgoff_t first, unsigned int nr_pages, - pgoff_t *_data_first, - unsigned int *_data_nr_pages) -{ - if (!cifs_inode_cookie(inode)) - return -ENOBUFS; - return __cifs_fscache_query_occupancy(inode, first, nr_pages, - _data_first, _data_nr_pages); -} - -extern int __cifs_readpage_from_fscache(struct inode *pinode, struct page *ppage); -extern void __cifs_readahead_to_fscache(struct inode *pinode, loff_t pos, size_t len); - - -static inline int cifs_readpage_from_fscache(struct inode *inode, - struct page *page) -{ - if (cifs_inode_cookie(inode)) - return __cifs_readpage_from_fscache(inode, page); - return -ENOBUFS; -} - -static inline void cifs_readahead_to_fscache(struct inode *inode, - loff_t pos, size_t len) -{ - if (cifs_inode_cookie(inode)) - __cifs_readahead_to_fscache(inode, pos, len); -} -#endif - static inline bool cifs_fscache_enabled(struct inode *inode) { return fscache_cookie_enabled(cifs_inode_cookie(inode)); @@ -133,27 +96,6 @@ static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode) { re static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags) {} static inline bool cifs_fscache_enabled(struct inode *inode) { return false; } -#if 0 // TODO remove -static inline int cifs_fscache_query_occupancy(struct inode *inode, - pgoff_t first, unsigned int nr_pages, - pgoff_t *_data_first, - unsigned int *_data_nr_pages) -{ - *_data_first = ULONG_MAX; - *_data_nr_pages = 0; - return -ENOBUFS; -} - -static inline int -cifs_readpage_from_fscache(struct inode *inode, struct page *page) -{ - return -ENOBUFS; -} - -static inline -void cifs_readahead_to_fscache(struct inode *inode, loff_t pos, size_t len) {} -#endif - #endif /* CONFIG_CIFS_FSCACHE */ #endif /* _CIFS_FSCACHE_H */
Remove some code that was #if'd out with the netfslib conversion. This is split into parts for file.c as the diff generator otherwise produces a hard to read diff for part of it where a big chunk is cut out. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/file.c | 634 +------------------------------------------ 1 file changed, 1 insertion(+), 633 deletions(-) diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 265d96f663d7..f45a830154d5 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2569,639 +2569,6 @@ cifs_get_readable_path(struct cifs_tcon *tcon, const char *name, return -ENOENT; } -#if 0 // TODO remove 2773 -void -cifs_writedata_release(struct cifs_io_subrequest *wdata) -{ - if (wdata->uncached) - kref_put(&wdata->ctx->refcount, cifs_aio_ctx_release); -#ifdef CONFIG_CIFS_SMB_DIRECT - if (wdata->mr) { - smbd_deregister_mr(wdata->mr); - wdata->mr = NULL; - } -#endif - - if (wdata->cfile) - cifsFileInfo_put(wdata->cfile); - - kfree(wdata); -} - -/* - * Write failed with a retryable error. Resend the write request. It's also - * possible that the page was redirtied so re-clean the page. - */ -static void -cifs_writev_requeue(struct cifs_io_subrequest *wdata) -{ - int rc = 0; - struct inode *inode = d_inode(wdata->cfile->dentry); - struct TCP_Server_Info *server; - unsigned int rest_len = wdata->subreq.len; - loff_t fpos = wdata->subreq.start; - - server = tlink_tcon(wdata->cfile->tlink)->ses->server; - do { - struct cifs_io_subrequest *wdata2; - unsigned int wsize, cur_len; - - wsize = server->ops->wp_retry_size(inode); - if (wsize < rest_len) { - if (wsize < PAGE_SIZE) { - rc = -EOPNOTSUPP; - break; - } - cur_len = min(round_down(wsize, PAGE_SIZE), rest_len); - } else { - cur_len = rest_len; - } - - wdata2 = cifs_writedata_alloc(cifs_writev_complete); - if (!wdata2) { - rc = -ENOMEM; - break; - } - - wdata2->sync_mode = wdata->sync_mode; - wdata2->subreq.start = fpos; - wdata2->subreq.len = cur_len; - wdata2->subreq.io_iter = wdata->subreq.io_iter; - - iov_iter_advance(&wdata2->subreq.io_iter, fpos - wdata->subreq.start); - iov_iter_truncate(&wdata2->subreq.io_iter, wdata2->subreq.len); - - if (iov_iter_is_xarray(&wdata2->subreq.io_iter)) - /* Check for pages having been redirtied and clean - * them. We can do this by walking the xarray. If - * it's not an xarray, then it's a DIO and we shouldn't - * be mucking around with the page bits. - */ - cifs_undirty_folios(inode, fpos, cur_len); - - rc = cifs_get_writable_file(CIFS_I(inode), FIND_WR_ANY, - &wdata2->cfile); - if (!wdata2->cfile) { - cifs_dbg(VFS, "No writable handle to retry writepages rc=%d\n", - rc); - if (!is_retryable_error(rc)) - rc = -EBADF; - } else { - wdata2->pid = wdata2->cfile->pid; - rc = server->ops->async_writev(wdata2); - } - - cifs_put_writedata(wdata2); - if (rc) { - if (is_retryable_error(rc)) - continue; - fpos += cur_len; - rest_len -= cur_len; - break; - } - - fpos += cur_len; - rest_len -= cur_len; - } while (rest_len > 0); - - /* Clean up remaining pages from the original wdata */ - if (iov_iter_is_xarray(&wdata->subreq.io_iter)) - cifs_pages_write_failed(inode, fpos, rest_len); - - if (rc != 0 && !is_retryable_error(rc)) - mapping_set_error(inode->i_mapping, rc); - cifs_put_writedata(wdata); -} - -void -cifs_writev_complete(struct work_struct *work) -{ - struct cifs_io_subrequest *wdata = container_of(work, - struct cifs_io_subrequest, work); - struct inode *inode = d_inode(wdata->cfile->dentry); - - if (wdata->result == 0) { - spin_lock(&inode->i_lock); - cifs_update_eof(CIFS_I(inode), wdata->subreq.start, wdata->subreq.len); - spin_unlock(&inode->i_lock); - cifs_stats_bytes_written(tlink_tcon(wdata->cfile->tlink), - wdata->subreq.len); - } else if (wdata->sync_mode == WB_SYNC_ALL && wdata->result == -EAGAIN) - return cifs_writev_requeue(wdata); - - if (wdata->result == -EAGAIN) - cifs_pages_write_redirty(inode, wdata->subreq.start, wdata->subreq.len); - else if (wdata->result < 0) - cifs_pages_write_failed(inode, wdata->subreq.start, wdata->subreq.len); - else - cifs_pages_written_back(inode, wdata->subreq.start, wdata->subreq.len); - - if (wdata->result != -EAGAIN) - mapping_set_error(inode->i_mapping, wdata->result); - cifs_put_writedata(wdata); -} - -struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete) -{ - struct cifs_io_subrequest *wdata; - - wdata = kzalloc(sizeof(*wdata), GFP_NOFS); - if (wdata != NULL) { - refcount_set(&wdata->subreq.ref, 1); - INIT_LIST_HEAD(&wdata->list); - init_completion(&wdata->done); - INIT_WORK(&wdata->work, complete); - } - return wdata; -} - -/* - * Extend the region to be written back to include subsequent contiguously - * dirty pages if possible, but don't sleep while doing so. - */ -static void cifs_extend_writeback(struct address_space *mapping, - struct xa_state *xas, - long *_count, - loff_t start, - int max_pages, - loff_t max_len, - size_t *_len) -{ - struct folio_batch batch; - struct folio *folio; - unsigned int nr_pages; - pgoff_t index = (start + *_len) / PAGE_SIZE; - size_t len; - bool stop = true; - unsigned int i; - - folio_batch_init(&batch); - - do { - /* Firstly, we gather up a batch of contiguous dirty pages - * under the RCU read lock - but we can't clear the dirty flags - * there if any of those pages are mapped. - */ - rcu_read_lock(); - - xas_for_each(xas, folio, ULONG_MAX) { - stop = true; - if (xas_retry(xas, folio)) - continue; - if (xa_is_value(folio)) - break; - if (folio->index != index) { - xas_reset(xas); - break; - } - - if (!folio_try_get_rcu(folio)) { - xas_reset(xas); - continue; - } - nr_pages = folio_nr_pages(folio); - if (nr_pages > max_pages) { - xas_reset(xas); - break; - } - - /* Has the page moved or been split? */ - if (unlikely(folio != xas_reload(xas))) { - folio_put(folio); - xas_reset(xas); - break; - } - - if (!folio_trylock(folio)) { - folio_put(folio); - xas_reset(xas); - break; - } - if (!folio_test_dirty(folio) || - folio_test_writeback(folio)) { - folio_unlock(folio); - folio_put(folio); - xas_reset(xas); - break; - } - - max_pages -= nr_pages; - len = folio_size(folio); - stop = false; - - index += nr_pages; - *_count -= nr_pages; - *_len += len; - if (max_pages <= 0 || *_len >= max_len || *_count <= 0) - stop = true; - - if (!folio_batch_add(&batch, folio)) - break; - if (stop) - break; - } - - xas_pause(xas); - rcu_read_unlock(); - - /* Now, if we obtained any pages, we can shift them to being - * writable and mark them for caching. - */ - if (!folio_batch_count(&batch)) - break; - - for (i = 0; i < folio_batch_count(&batch); i++) { - folio = batch.folios[i]; - /* The folio should be locked, dirty and not undergoing - * writeback from the loop above. - */ - if (!folio_clear_dirty_for_io(folio)) - WARN_ON(1); - folio_start_writeback(folio); - folio_unlock(folio); - } - - folio_batch_release(&batch); - cond_resched(); - } while (!stop); -} - -/* - * Write back the locked page and any subsequent non-locked dirty pages. - */ -static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, - struct writeback_control *wbc, - struct xa_state *xas, - struct folio *folio, - unsigned long long start, - unsigned long long end) -{ - struct inode *inode = mapping->host; - struct TCP_Server_Info *server; - struct cifs_io_subrequest *wdata; - struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); - struct cifs_credits credits_on_stack; - struct cifs_credits *credits = &credits_on_stack; - struct cifsFileInfo *cfile = NULL; - unsigned long long i_size = i_size_read(inode), max_len; - unsigned int xid; - size_t wsize; - size_t len = folio_size(folio); - long count = wbc->nr_to_write; - int rc; - - /* The folio should be locked, dirty and not undergoing writeback. */ - if (!folio_clear_dirty_for_io(folio)) - WARN_ON_ONCE(1); - folio_start_writeback(folio); - - count -= folio_nr_pages(folio); - - xid = get_xid(); - server = cifs_pick_channel(cifs_sb_master_tcon(cifs_sb)->ses); - - rc = cifs_get_writable_file(CIFS_I(inode), FIND_WR_ANY, &cfile); - if (rc) { - cifs_dbg(VFS, "No writable handle in writepages rc=%d\n", rc); - goto err_xid; - } - - rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->wsize, - &wsize, credits); - if (rc != 0) - goto err_close; - - wdata = cifs_writedata_alloc(cifs_writev_complete); - if (!wdata) { - rc = -ENOMEM; - goto err_uncredit; - } - - wdata->sync_mode = wbc->sync_mode; - wdata->subreq.start = folio_pos(folio); - wdata->pid = cfile->pid; - wdata->credits = credits_on_stack; - wdata->cfile = cfile; - wdata->server = server; - cfile = NULL; - - /* Find all consecutive lockable dirty pages that have contiguous - * written regions, stopping when we find a page that is not - * immediately lockable, is not dirty or is missing, or we reach the - * end of the range. - */ - if (start < i_size) { - /* Trim the write to the EOF; the extra data is ignored. Also - * put an upper limit on the size of a single storedata op. - */ - max_len = wsize; - max_len = min_t(unsigned long long, max_len, end - start + 1); - max_len = min_t(unsigned long long, max_len, i_size - start); - - if (len < max_len) { - int max_pages = INT_MAX; - -#ifdef CONFIG_CIFS_SMB_DIRECT - if (server->smbd_conn) - max_pages = server->smbd_conn->max_frmr_depth; -#endif - max_pages -= folio_nr_pages(folio); - - if (max_pages > 0) - cifs_extend_writeback(mapping, xas, &count, start, - max_pages, max_len, &len); - } - } - len = min_t(unsigned long long, len, i_size - start); - - /* We now have a contiguous set of dirty pages, each with writeback - * set; the first page is still locked at this point, but all the rest - * have been unlocked. - */ - folio_unlock(folio); - wdata->subreq.len = len; - - if (start < i_size) { - iov_iter_xarray(&wdata->subreq.io_iter, ITER_SOURCE, &mapping->i_pages, - start, len); - - rc = adjust_credits(wdata->server, &wdata->credits, wdata->subreq.len); - if (rc) - goto err_wdata; - - if (wdata->cfile->invalidHandle) - rc = -EAGAIN; - else - rc = wdata->server->ops->async_writev(wdata); - if (rc >= 0) { - cifs_put_writedata(wdata); - goto err_close; - } - } else { - /* The dirty region was entirely beyond the EOF. */ - cifs_pages_written_back(inode, start, len); - rc = 0; - } - -err_wdata: - cifs_put_writedata(wdata); -err_uncredit: - add_credits_and_wake_if(server, credits, 0); -err_close: - if (cfile) - cifsFileInfo_put(cfile); -err_xid: - free_xid(xid); - if (rc == 0) { - wbc->nr_to_write = count; - rc = len; - } else if (is_retryable_error(rc)) { - cifs_pages_write_redirty(inode, start, len); - } else { - cifs_pages_write_failed(inode, start, len); - mapping_set_error(mapping, rc); - } - /* Indication to update ctime and mtime as close is deferred */ - set_bit(CIFS_INO_MODIFIED_ATTR, &CIFS_I(inode)->flags); - return rc; -} - -/* - * write a region of pages back to the server - */ -static ssize_t cifs_writepages_begin(struct address_space *mapping, - struct writeback_control *wbc, - struct xa_state *xas, - unsigned long long *_start, - unsigned long long end) -{ - struct folio *folio; - unsigned long long start = *_start; - ssize_t ret; - int skips = 0; - -search_again: - /* Find the first dirty page. */ - rcu_read_lock(); - - for (;;) { - folio = xas_find_marked(xas, end / PAGE_SIZE, PAGECACHE_TAG_DIRTY); - if (xas_retry(xas, folio) || xa_is_value(folio)) - continue; - if (!folio) - break; - - if (!folio_try_get_rcu(folio)) { - xas_reset(xas); - continue; - } - - if (unlikely(folio != xas_reload(xas))) { - folio_put(folio); - xas_reset(xas); - continue; - } - - xas_pause(xas); - break; - } - rcu_read_unlock(); - if (!folio) - return 0; - - start = folio_pos(folio); /* May regress with THPs */ - - /* At this point we hold neither the i_pages lock nor the page lock: - * the page may be truncated or invalidated (changing page->mapping to - * NULL), or even swizzled back from swapper_space to tmpfs file - * mapping - */ -lock_again: - if (wbc->sync_mode != WB_SYNC_NONE) { - ret = folio_lock_killable(folio); - if (ret < 0) - return ret; - } else { - if (!folio_trylock(folio)) - goto search_again; - } - - if (folio->mapping != mapping || - !folio_test_dirty(folio)) { - start += folio_size(folio); - folio_unlock(folio); - goto search_again; - } - - if (folio_test_writeback(folio) || - folio_test_private_2(folio)) { /* [DEPRECATED] */ - folio_unlock(folio); - if (wbc->sync_mode != WB_SYNC_NONE) { - folio_wait_writeback(folio); -#ifdef CONFIG_CIFS_FSCACHE - folio_wait_private_2(folio); -#endif - goto lock_again; - } - - start += folio_size(folio); - if (wbc->sync_mode == WB_SYNC_NONE) { - if (skips >= 5 || need_resched()) { - ret = 0; - goto out; - } - skips++; - } - goto search_again; - } - - ret = cifs_write_back_from_locked_folio(mapping, wbc, xas, folio, start, end); -out: - if (ret > 0) - *_start = start + ret; - return ret; -} - -/* - * Write a region of pages back to the server - */ -static int cifs_writepages_region(struct address_space *mapping, - struct writeback_control *wbc, - unsigned long long *_start, - unsigned long long end) -{ - ssize_t ret; - - XA_STATE(xas, &mapping->i_pages, *_start / PAGE_SIZE); - - do { - ret = cifs_writepages_begin(mapping, wbc, &xas, _start, end); - if (ret > 0 && wbc->nr_to_write > 0) - cond_resched(); - } while (ret > 0 && wbc->nr_to_write > 0); - - return ret > 0 ? 0 : ret; -} - -/* - * Write some of the pending data back to the server - */ -static int cifs_writepages(struct address_space *mapping, - struct writeback_control *wbc) -{ - loff_t start, end; - int ret; - - /* We have to be careful as we can end up racing with setattr() - * truncating the pagecache since the caller doesn't take a lock here - * to prevent it. - */ - - if (wbc->range_cyclic && mapping->writeback_index) { - start = mapping->writeback_index * PAGE_SIZE; - ret = cifs_writepages_region(mapping, wbc, &start, LLONG_MAX); - if (ret < 0) - goto out; - - if (wbc->nr_to_write <= 0) { - mapping->writeback_index = start / PAGE_SIZE; - goto out; - } - - start = 0; - end = mapping->writeback_index * PAGE_SIZE; - mapping->writeback_index = 0; - ret = cifs_writepages_region(mapping, wbc, &start, end); - if (ret == 0) - mapping->writeback_index = start / PAGE_SIZE; - } else if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) { - start = 0; - ret = cifs_writepages_region(mapping, wbc, &start, LLONG_MAX); - if (wbc->nr_to_write > 0 && ret == 0) - mapping->writeback_index = start / PAGE_SIZE; - } else { - start = wbc->range_start; - ret = cifs_writepages_region(mapping, wbc, &start, wbc->range_end); - } - -out: - return ret; -} - -static int cifs_write_end(struct file *file, struct address_space *mapping, - loff_t pos, unsigned len, unsigned copied, - struct page *page, void *fsdata) -{ - int rc; - struct inode *inode = mapping->host; - struct cifsFileInfo *cfile = file->private_data; - struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb); - struct folio *folio = page_folio(page); - __u32 pid; - - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) - pid = cfile->pid; - else - pid = current->tgid; - - cifs_dbg(FYI, "write_end for page %p from pos %lld with %d bytes\n", - page, pos, copied); - - if (folio_test_checked(folio)) { - if (copied == len) - folio_mark_uptodate(folio); - folio_clear_checked(folio); - } else if (!folio_test_uptodate(folio) && copied == PAGE_SIZE) - folio_mark_uptodate(folio); - - if (!folio_test_uptodate(folio)) { - char *page_data; - unsigned offset = pos & (PAGE_SIZE - 1); - unsigned int xid; - - xid = get_xid(); - /* this is probably better than directly calling - partialpage_write since in this function the file handle is - known which we might as well leverage */ - /* BB check if anything else missing out of ppw - such as updating last write time */ - page_data = kmap(page); - rc = cifs_write(cfile, pid, page_data + offset, copied, &pos); - /* if (rc < 0) should we set writebehind rc? */ - kunmap(page); - - free_xid(xid); - } else { - rc = copied; - pos += copied; - set_page_dirty(page); - } - - if (rc > 0) { - spin_lock(&inode->i_lock); - if (pos > inode->i_size) { - loff_t additional_blocks = (512 - 1 + copied) >> 9; - - i_size_write(inode, pos); - /* - * Estimate new allocation size based on the amount written. - * This will be updated from server on close (and on queryinfo) - */ - inode->i_blocks = min_t(blkcnt_t, (512 - 1 + pos) >> 9, - inode->i_blocks + additional_blocks); - } - spin_unlock(&inode->i_lock); - } - - unlock_page(page); - put_page(page); - /* Indication to update ctime and mtime as close is deferred */ - set_bit(CIFS_INO_MODIFIED_ATTR, &CIFS_I(inode)->flags); - - return rc; -} -#endif // End netfs removal 2773 - /* * Flush data on a strict file. */ @@ -4517,6 +3884,7 @@ cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *offset) } #endif // end netfslib remove 4633 + static vm_fault_t cifs_page_mkwrite(struct vm_fault *vmf) { return netfs_page_mkwrite(vmf, NULL);
Make the cifs filesystem use netfslib to handle reading and writing on behalf of cifs. The changes include: (1) Various read_iter/write_iter type functions are turned into wrappers around netfslib API functions or are pointed directly at those functions: cifs_file_direct{,_nobrl}_ops switch to use netfs_unbuffered_read_iter and netfs_unbuffered_write_iter. Large pieces of code that will be removed are #if'd out and will be removed in subsequent patches. [?] Why does cifs mark the page dirty in the destination buffer of a DIO read? Should that happen automatically? Does netfs need to do that? Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/netfs/io.c | 7 +- fs/smb/client/cifsfs.c | 8 +- fs/smb/client/cifsfs.h | 7 -- fs/smb/client/cifsglob.h | 5 +- fs/smb/client/cifsproto.h | 8 +- fs/smb/client/cifssmb.c | 54 +++++++------ fs/smb/client/file.c | 161 ++++++++++++++++++++------------------ fs/smb/client/fscache.c | 2 + fs/smb/client/fscache.h | 4 + fs/smb/client/inode.c | 19 ++++- fs/smb/client/smb2pdu.c | 117 ++++++++++++++++----------- fs/smb/client/smb2proto.h | 2 +- fs/smb/client/trace.h | 144 +++++++++++++++++++++++++++++----- fs/smb/client/transport.c | 3 + 14 files changed, 361 insertions(+), 180 deletions(-) diff --git a/fs/netfs/io.c b/fs/netfs/io.c index 6cfecfcd02e1..c93851b98368 100644 --- a/fs/netfs/io.c +++ b/fs/netfs/io.c @@ -213,8 +213,13 @@ static void netfs_rreq_assess_dio(struct netfs_io_request *rreq) unsigned int i; size_t transferred = 0; - for (i = 0; i < rreq->direct_bv_count; i++) + for (i = 0; i < rreq->direct_bv_count; i++) { flush_dcache_page(rreq->direct_bv[i].bv_page); + // TODO: cifs marks pages in the destination buffer + // dirty under some circumstances after a read. Do we + // need to do that too? + set_page_dirty(rreq->direct_bv[i].bv_page); + } list_for_each_entry(subreq, &rreq->subrequests, rreq_link) { if (subreq->error || subreq->transferred == 0) diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index 90801a0077da..5ce2f54cb086 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -1518,8 +1518,8 @@ const struct file_operations cifs_file_strict_ops = { }; const struct file_operations cifs_file_direct_ops = { - .read_iter = cifs_direct_readv, - .write_iter = cifs_direct_writev, + .read_iter = netfs_unbuffered_read_iter, + .write_iter = netfs_file_write_iter, .open = cifs_open, .release = cifs_close, .lock = cifs_lock, @@ -1574,8 +1574,8 @@ const struct file_operations cifs_file_strict_nobrl_ops = { }; const struct file_operations cifs_file_direct_nobrl_ops = { - .read_iter = cifs_direct_readv, - .write_iter = cifs_direct_writev, + .read_iter = netfs_unbuffered_read_iter, + .write_iter = netfs_file_write_iter, .open = cifs_open, .release = cifs_close, .fsync = cifs_fsync, diff --git a/fs/smb/client/cifsfs.h b/fs/smb/client/cifsfs.h index 922c10d7cfdd..87310f05d397 100644 --- a/fs/smb/client/cifsfs.h +++ b/fs/smb/client/cifsfs.h @@ -94,11 +94,7 @@ extern const struct file_operations cifs_file_strict_nobrl_ops; extern int cifs_open(struct inode *inode, struct file *file); extern int cifs_close(struct inode *inode, struct file *file); extern int cifs_closedir(struct inode *inode, struct file *file); -extern ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to); -extern ssize_t cifs_direct_readv(struct kiocb *iocb, struct iov_iter *to); extern ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to); -extern ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from); -extern ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *from); extern ssize_t cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from); ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from); ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter); @@ -112,9 +108,6 @@ extern int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma); extern const struct file_operations cifs_dir_ops; extern int cifs_dir_open(struct inode *inode, struct file *file); extern int cifs_readdir(struct file *file, struct dir_context *ctx); -extern void cifs_pages_written_back(struct inode *inode, loff_t start, unsigned int len); -extern void cifs_pages_write_failed(struct inode *inode, loff_t start, unsigned int len); -extern void cifs_pages_write_redirty(struct inode *inode, loff_t start, unsigned int len); /* Functions related to dir entries */ extern const struct dentry_operations cifs_dentry_ops; diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 18a3babbe577..639cdeb3f77e 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -451,7 +451,7 @@ struct smb_version_operations { /* async read from the server */ int (*async_readv)(struct cifs_io_subrequest *); /* async write to the server */ - int (*async_writev)(struct cifs_io_subrequest *); + void (*async_writev)(struct cifs_io_subrequest *); /* sync read from the server */ int (*sync_read)(const unsigned int, struct cifs_fid *, struct cifs_io_parms *, unsigned int *, char **, @@ -1511,7 +1511,7 @@ struct cifs_io_subrequest { #endif struct cifs_credits credits; - // TODO: Remove following elements +#if 0 // TODO: Remove following elements struct list_head list; struct completion done; struct work_struct work; @@ -1521,6 +1521,7 @@ struct cifs_io_subrequest { enum writeback_sync_modes sync_mode; bool uncached; struct bio_vec *bv; +#endif }; /* diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 95b5fa385196..e0ccf32d7ecd 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -148,6 +148,8 @@ extern bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 eof, bool from_readdir); extern void cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset, unsigned int bytes_written); +void cifs_write_subrequest_terminated(struct cifs_io_subrequest *wdata, ssize_t result, + bool was_async); extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *, int); extern int cifs_get_writable_file(struct cifsInodeInfo *cifs_inode, int flags, @@ -598,6 +600,7 @@ void __cifs_put_smb_ses(struct cifs_ses *ses); extern struct cifs_ses * cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx); +#if 0 // TODO Remove void cifs_readdata_release(struct cifs_io_subrequest *rdata); static inline void cifs_get_readdata(struct cifs_io_subrequest *rdata) { @@ -608,11 +611,13 @@ static inline void cifs_put_readdata(struct cifs_io_subrequest *rdata) if (refcount_dec_and_test(&rdata->subreq.ref)) cifs_readdata_release(rdata); } +#endif int cifs_async_readv(struct cifs_io_subrequest *rdata); int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid); -int cifs_async_writev(struct cifs_io_subrequest *wdata); +void cifs_async_writev(struct cifs_io_subrequest *wdata); void cifs_writev_complete(struct work_struct *work); +#if 0 // TODO Remove struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete); void cifs_writedata_release(struct cifs_io_subrequest *rdata); static inline void cifs_get_writedata(struct cifs_io_subrequest *wdata) @@ -624,6 +629,7 @@ static inline void cifs_put_writedata(struct cifs_io_subrequest *wdata) if (refcount_dec_and_test(&wdata->subreq.ref)) cifs_writedata_release(wdata); } +#endif int cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const unsigned char *path, char *pbuf, diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index 72962985bac5..1b7f45ea3ec7 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -1265,7 +1265,7 @@ static void cifs_readv_callback(struct mid_q_entry *mid) { struct cifs_io_subrequest *rdata = mid->callback_data; - struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); + struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); struct TCP_Server_Info *server = tcon->ses->server; struct smb_rqst rqst = { .rq_iov = rdata->iov, .rq_nvec = 2, @@ -1306,7 +1306,13 @@ cifs_readv_callback(struct mid_q_entry *mid) rdata->result = -EIO; } - queue_work(cifsiod_wq, &rdata->work); + if (rdata->result == 0 || rdata->result == -EAGAIN) + iov_iter_advance(&rdata->subreq.io_iter, rdata->got_bytes); + rdata->credits.value = 0; + netfs_subreq_terminated(&rdata->subreq, + (rdata->result == 0 || rdata->result == -EAGAIN) ? + rdata->got_bytes : rdata->result, + false); release_mid(mid); add_credits(server, &credits, 0); } @@ -1318,7 +1324,7 @@ cifs_async_readv(struct cifs_io_subrequest *rdata) int rc; READ_REQ *smb = NULL; int wct; - struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); + struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); struct smb_rqst rqst = { .rq_iov = rdata->iov, .rq_nvec = 2 }; @@ -1343,7 +1349,7 @@ cifs_async_readv(struct cifs_io_subrequest *rdata) smb->hdr.PidHigh = cpu_to_le16((__u16)(rdata->pid >> 16)); smb->AndXCommand = 0xFF; /* none */ - smb->Fid = rdata->cfile->fid.netfid; + smb->Fid = rdata->req->cfile->fid.netfid; smb->OffsetLow = cpu_to_le32(rdata->subreq.start & 0xFFFFFFFF); if (wct == 12) smb->OffsetHigh = cpu_to_le32(rdata->subreq.start >> 32); @@ -1613,15 +1619,16 @@ static void cifs_writev_callback(struct mid_q_entry *mid) { struct cifs_io_subrequest *wdata = mid->callback_data; - struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); - unsigned int written; + struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf; struct cifs_credits credits = { .value = 1, .instance = 0 }; + ssize_t result; + size_t written; switch (mid->mid_state) { case MID_RESPONSE_RECEIVED: - wdata->result = cifs_check_receive(mid, tcon->ses->server, 0); - if (wdata->result != 0) + result = cifs_check_receive(mid, tcon->ses->server, 0); + if (result != 0) break; written = le16_to_cpu(smb->CountHigh); @@ -1637,32 +1644,33 @@ cifs_writev_callback(struct mid_q_entry *mid) written &= 0xFFFF; if (written < wdata->subreq.len) - wdata->result = -ENOSPC; + result = -ENOSPC; else - wdata->subreq.len = written; + result = written; break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: - wdata->result = -EAGAIN; + result = -EAGAIN; break; default: - wdata->result = -EIO; + result = -EIO; break; } - queue_work(cifsiod_wq, &wdata->work); + wdata->credits.value = 0; + cifs_write_subrequest_terminated(wdata, result, true); release_mid(mid); add_credits(tcon->ses->server, &credits, 0); } /* cifs_async_writev - send an async write, and set up mid to handle result */ -int +void cifs_async_writev(struct cifs_io_subrequest *wdata) { int rc = -EACCES; WRITE_REQ *smb = NULL; int wct; - struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); + struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); struct kvec iov[2]; struct smb_rqst rqst = { }; @@ -1672,7 +1680,8 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) wct = 12; if (wdata->subreq.start >> 32 > 0) { /* can not handle big offset for old srv */ - return -EIO; + rc = -EIO; + goto out; } } @@ -1684,7 +1693,7 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) smb->hdr.PidHigh = cpu_to_le16((__u16)(wdata->pid >> 16)); smb->AndXCommand = 0xFF; /* none */ - smb->Fid = wdata->cfile->fid.netfid; + smb->Fid = wdata->req->cfile->fid.netfid; smb->OffsetLow = cpu_to_le32(wdata->subreq.start & 0xFFFFFFFF); if (wct == 14) smb->OffsetHigh = cpu_to_le32(wdata->subreq.start >> 32); @@ -1724,18 +1733,19 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) iov[1].iov_len += 4; /* pad bigger by four bytes */ } - cifs_get_writedata(wdata); rc = cifs_call_async(tcon->ses->server, &rqst, NULL, cifs_writev_callback, NULL, wdata, 0, NULL); - + /* Can't touch wdata if rc == 0 */ if (rc == 0) cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); - else - cifs_put_writedata(wdata); async_writev_out: cifs_small_buf_release(smb); - return rc; +out: + if (rc) { + add_credits_and_wake_if(wdata->server, &wdata->credits, 0); + cifs_write_subrequest_terminated(wdata, rc, false); + } } int diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 761a80963f76..c57a3638c51a 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -119,7 +119,7 @@ static void cifs_issue_write(struct netfs_io_subrequest *subreq) else trace_netfs_sreq(subreq, netfs_sreq_trace_fail); add_credits_and_wake_if(wdata->server, &wdata->credits, 0); - netfs_write_subrequest_terminated(wdata, rc, false); + cifs_write_subrequest_terminated(wdata, rc, false); goto out; } @@ -352,6 +352,7 @@ const struct netfs_request_ops cifs_req_ops = { .issue_write = cifs_issue_write, }; +#if 0 // TODO remove 397 /* * Remove the dirty flags from a span of pages. */ @@ -476,6 +477,7 @@ void cifs_pages_write_redirty(struct inode *inode, loff_t start, unsigned int le rcu_read_unlock(); } +#endif // end netfslib remove 397 /* * Mark as invalid, all open files on tree connections since they @@ -2474,20 +2476,23 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *flock) return rc; } -/* - * update the file size (if needed) after a write. Should be called with - * the inode->i_lock held - */ -void -cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset, - unsigned int bytes_written) +void cifs_write_subrequest_terminated(struct cifs_io_subrequest *wdata, ssize_t result, + bool was_async) { - loff_t end_of_write = offset + bytes_written; + struct netfs_io_request *wreq = wdata->rreq; + loff_t new_server_eof; - if (end_of_write > cifsi->netfs.remote_i_size) - netfs_resize_file(&cifsi->netfs, end_of_write, true); + if (result > 0) { + new_server_eof = wdata->subreq.start + wdata->subreq.transferred + result; + + if (new_server_eof > netfs_inode(wreq->inode)->remote_i_size) + netfs_resize_file(netfs_inode(wreq->inode), new_server_eof, true); + } + + netfs_write_subrequest_terminated(&wdata->subreq, result, was_async); } +#if 0 // TODO remove 2483 static ssize_t cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_data, size_t write_size, loff_t *offset) @@ -2571,6 +2576,7 @@ cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_data, free_xid(xid); return total_written; } +#endif // end netfslib remove 2483 struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, bool fsuid_only) @@ -2776,6 +2782,7 @@ cifs_get_readable_path(struct cifs_tcon *tcon, const char *name, return -ENOENT; } +#if 0 // TODO remove 2773 void cifs_writedata_release(struct cifs_io_subrequest *wdata) { @@ -3406,7 +3413,11 @@ static int cifs_write_end(struct file *file, struct address_space *mapping, return rc; } +#endif // End netfs removal 2773 +/* + * Flush data on a strict file. + */ int cifs_strict_fsync(struct file *file, loff_t start, loff_t end, int datasync) { @@ -3461,6 +3472,9 @@ int cifs_strict_fsync(struct file *file, loff_t start, loff_t end, return rc; } +/* + * Flush data on a non-strict data. + */ int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync) { unsigned int xid; @@ -3527,6 +3541,7 @@ int cifs_flush(struct file *file, fl_owner_t id) return rc; } +#if 0 // TODO remove 3594 static void collect_uncached_write_data(struct cifs_aio_ctx *ctx); static void @@ -3989,6 +4004,7 @@ ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from) { return __cifs_writev(iocb, from, false); } +#endif // TODO remove 3594 static ssize_t cifs_writev(struct kiocb *iocb, struct iov_iter *from) @@ -4000,7 +4016,10 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from) struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server; ssize_t rc; - inode_lock(inode); + rc = netfs_start_io_write(inode); + if (rc < 0) + return rc; + /* * We need to hold the sem to be sure nobody modifies lock list * with a brlock that prevents writing. @@ -4014,13 +4033,12 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from) if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(from), server->vals->exclusive_lock_type, 0, NULL, CIFS_WRITE_OP)) - rc = __generic_file_write_iter(iocb, from); + rc = netfs_buffered_write_iter_locked(iocb, from, NULL); else rc = -EACCES; out: up_read(&cinode->lock_sem); - inode_unlock(inode); - + netfs_end_io_write(inode); if (rc > 0) rc = generic_write_sync(iocb, rc); return rc; @@ -4043,9 +4061,9 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from) if (CIFS_CACHE_WRITE(cinode)) { if (cap_unix(tcon->ses) && - (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) - && ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0)) { - written = generic_file_write_iter(iocb, from); + (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && + ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0)) { + written = netfs_file_write_iter(iocb, from); goto out; } written = cifs_writev(iocb, from); @@ -4057,7 +4075,7 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from) * affected pages because it may cause a error with mandatory locks on * these pages but not on the region from pos to ppos+len-1. */ - written = cifs_user_writev(iocb, from); + written = netfs_file_write_iter(iocb, from); if (CIFS_CACHE_READ(cinode)) { /* * We have read level caching and we have just sent a write @@ -4076,6 +4094,7 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from) return written; } +#if 0 // TODO remove 4143 static struct cifs_io_subrequest *cifs_readdata_alloc(work_func_t complete) { struct cifs_io_subrequest *rdata; @@ -4515,7 +4534,9 @@ ssize_t cifs_direct_readv(struct kiocb *iocb, struct iov_iter *to) ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to) { return __cifs_readv(iocb, to, false); + } +#endif // end netfslib removal 4143 ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter) { @@ -4523,13 +4544,13 @@ ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter) struct inode *inode = file_inode(iocb->ki_filp); if (iocb->ki_flags & IOCB_DIRECT) - return cifs_user_readv(iocb, iter); + return netfs_unbuffered_read_iter(iocb, iter); rc = cifs_revalidate_mapping(inode); if (rc) return rc; - return generic_file_read_iter(iocb, iter); + return netfs_file_read_iter(iocb, iter); } ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) @@ -4540,7 +4561,7 @@ ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) int rc; if (iocb->ki_filp->f_flags & O_DIRECT) { - written = cifs_user_writev(iocb, from); + written = netfs_unbuffered_write_iter(iocb, from); if (written > 0 && CIFS_CACHE_READ(cinode)) { cifs_zap_mapping(inode); cifs_dbg(FYI, @@ -4555,17 +4576,15 @@ ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) if (written) return written; - written = generic_file_write_iter(iocb, from); - - if (CIFS_CACHE_WRITE(CIFS_I(inode))) - goto out; + written = netfs_file_write_iter(iocb, from); - rc = filemap_fdatawrite(inode->i_mapping); - if (rc) - cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n", - rc, inode); + if (!CIFS_CACHE_WRITE(CIFS_I(inode))) { + rc = filemap_fdatawrite(inode->i_mapping); + if (rc) + cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n", + rc, inode); + } -out: cifs_put_writer(cinode); return written; } @@ -4590,12 +4609,15 @@ cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to) * pos+len-1. */ if (!CIFS_CACHE_READ(cinode)) - return cifs_user_readv(iocb, to); + return netfs_unbuffered_read_iter(iocb, to); if (cap_unix(tcon->ses) && (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && - ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0)) - return generic_file_read_iter(iocb, to); + ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0)) { + if (iocb->ki_flags & IOCB_DIRECT) + return netfs_unbuffered_read_iter(iocb, to); + return netfs_buffered_read_iter(iocb, to); + } /* * We need to hold the sem to be sure nobody modifies lock list @@ -4604,12 +4626,17 @@ cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to) down_read(&cinode->lock_sem); if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(to), tcon->ses->server->vals->shared_lock_type, - 0, NULL, CIFS_READ_OP)) - rc = generic_file_read_iter(iocb, to); + 0, NULL, CIFS_READ_OP)) { + if (iocb->ki_flags & IOCB_DIRECT) + rc = netfs_unbuffered_read_iter(iocb, to); + else + rc = netfs_buffered_read_iter(iocb, to); + } up_read(&cinode->lock_sem); return rc; } +#if 0 // TODO remove 4633 static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *offset) { @@ -4701,29 +4728,11 @@ cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *offset) free_xid(xid); return total_read; } +#endif // end netfslib remove 4633 -/* - * If the page is mmap'ed into a process' page tables, then we need to make - * sure that it doesn't change while being written back. - */ static vm_fault_t cifs_page_mkwrite(struct vm_fault *vmf) { - struct folio *folio = page_folio(vmf->page); - - /* Wait for the folio to be written to the cache before we allow it to - * be modified. We then assume the entire folio will need writing back. - */ -#ifdef CONFIG_CIFS_FSCACHE - if (folio_test_private_2(folio) && /* [DEPRECATED] */ - folio_wait_private_2_killable(folio) < 0) - return VM_FAULT_RETRY; -#endif - - folio_wait_writeback(folio); - - if (folio_lock_killable(folio) < 0) - return VM_FAULT_RETRY; - return VM_FAULT_LOCKED; + return netfs_page_mkwrite(vmf, NULL); } static const struct vm_operations_struct cifs_file_vm_ops = { @@ -4769,6 +4778,7 @@ int cifs_file_mmap(struct file *file, struct vm_area_struct *vma) return rc; } +#if 0 // TODO remove 4794 /* * Unlock a bunch of folios in the pagecache. */ @@ -5053,6 +5063,7 @@ static int cifs_read_folio(struct file *file, struct folio *folio) free_xid(xid); return rc; } +#endif // end netfslib remove 4794 static int is_inode_writable(struct cifsInodeInfo *cifs_inode) { @@ -5101,6 +5112,7 @@ bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file, return true; } +#if 0 // TODO remove 5152 static int cifs_write_begin(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, struct page **pagep, void **fsdata) @@ -5196,6 +5208,7 @@ static void cifs_invalidate_folio(struct folio *folio, size_t offset, { folio_wait_private_2(folio); /* [DEPRECATED] */ } +#endif // end netfslib remove 5152 void cifs_oplock_break(struct work_struct *work) { @@ -5286,6 +5299,7 @@ void cifs_oplock_break(struct work_struct *work) cifs_done_oplock_break(cinode); } +#if 0 // TODO remove 5333 /* * The presence of cifs_direct_io() in the address space ops vector * allowes open() O_DIRECT flags which would have failed otherwise. @@ -5304,6 +5318,7 @@ cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter) */ return -EINVAL; } +#endif // netfs end remove 5333 static int cifs_swap_activate(struct swap_info_struct *sis, struct file *swap_file, sector_t *span) @@ -5366,21 +5381,19 @@ static void cifs_swap_deactivate(struct file *file) } const struct address_space_operations cifs_addr_ops = { - .read_folio = cifs_read_folio, - .readahead = cifs_readahead, - .writepages = cifs_writepages, - .write_begin = cifs_write_begin, - .write_end = cifs_write_end, - .dirty_folio = netfs_dirty_folio, - .release_folio = cifs_release_folio, - .direct_IO = cifs_direct_io, - .invalidate_folio = cifs_invalidate_folio, - .migrate_folio = filemap_migrate_folio, + .read_folio = netfs_read_folio, + .readahead = netfs_readahead, + .writepages = netfs_writepages, + .dirty_folio = netfs_dirty_folio, + .release_folio = netfs_release_folio, + .direct_IO = noop_direct_IO, + .invalidate_folio = netfs_invalidate_folio, + .migrate_folio = filemap_migrate_folio, /* * TODO: investigate and if useful we could add an is_dirty_writeback * helper if needed */ - .swap_activate = cifs_swap_activate, + .swap_activate = cifs_swap_activate, .swap_deactivate = cifs_swap_deactivate, }; @@ -5390,12 +5403,10 @@ const struct address_space_operations cifs_addr_ops = { * to leave cifs_readahead out of the address space operations. */ const struct address_space_operations cifs_addr_ops_smallbuf = { - .read_folio = cifs_read_folio, - .writepages = cifs_writepages, - .write_begin = cifs_write_begin, - .write_end = cifs_write_end, - .dirty_folio = netfs_dirty_folio, - .release_folio = cifs_release_folio, - .invalidate_folio = cifs_invalidate_folio, - .migrate_folio = filemap_migrate_folio, + .read_folio = netfs_read_folio, + .writepages = netfs_writepages, + .dirty_folio = netfs_dirty_folio, + .release_folio = netfs_release_folio, + .invalidate_folio = netfs_invalidate_folio, + .migrate_folio = filemap_migrate_folio, }; diff --git a/fs/smb/client/fscache.c b/fs/smb/client/fscache.c index 340efce8f052..7aa1d633c027 100644 --- a/fs/smb/client/fscache.c +++ b/fs/smb/client/fscache.c @@ -151,6 +151,7 @@ void cifs_fscache_release_inode_cookie(struct inode *inode) } } +#if 0 // TODO remove /* * Fallback page reading interface. */ @@ -259,3 +260,4 @@ int __cifs_fscache_query_occupancy(struct inode *inode, fscache_end_operation(&cres); return ret; } +#endif diff --git a/fs/smb/client/fscache.h b/fs/smb/client/fscache.h index 1f2ea9f5cc9a..08b30f79d4cd 100644 --- a/fs/smb/client/fscache.h +++ b/fs/smb/client/fscache.h @@ -74,6 +74,7 @@ static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags i_size_read(inode), flags); } +#if 0 // TODO remove extern int __cifs_fscache_query_occupancy(struct inode *inode, pgoff_t first, unsigned int nr_pages, pgoff_t *_data_first, @@ -108,6 +109,7 @@ static inline void cifs_readahead_to_fscache(struct inode *inode, if (cifs_inode_cookie(inode)) __cifs_readahead_to_fscache(inode, pos, len); } +#endif static inline bool cifs_fscache_enabled(struct inode *inode) { @@ -131,6 +133,7 @@ static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode) { re static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags) {} static inline bool cifs_fscache_enabled(struct inode *inode) { return false; } +#if 0 // TODO remove static inline int cifs_fscache_query_occupancy(struct inode *inode, pgoff_t first, unsigned int nr_pages, pgoff_t *_data_first, @@ -149,6 +152,7 @@ cifs_readpage_from_fscache(struct inode *inode, struct page *page) static inline void cifs_readahead_to_fscache(struct inode *inode, loff_t pos, size_t len) {} +#endif #endif /* CONFIG_CIFS_FSCACHE */ diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index 468ea2312a1a..f0f90c11ca66 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -28,14 +28,29 @@ #include "cached_dir.h" #include "reparse.h" +/* + * Set parameters for the netfs library + */ +static void cifs_set_netfs_context(struct inode *inode) +{ + struct cifsInodeInfo *cifs_i = CIFS_I(inode); + struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); + + netfs_inode_init(&cifs_i->netfs, &cifs_req_ops, true); + if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) + __set_bit(NETFS_ICTX_WRITETHROUGH, &cifs_i->netfs.flags); +} + static void cifs_set_ops(struct inode *inode) { struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); + struct netfs_inode *ictx = netfs_inode(inode); switch (inode->i_mode & S_IFMT) { case S_IFREG: inode->i_op = &cifs_file_inode_ops; if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { + set_bit(NETFS_ICTX_UNBUFFERED, &ictx->flags); if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) inode->i_fop = &cifs_file_direct_nobrl_ops; else @@ -221,8 +236,10 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr, if (fattr->cf_flags & CIFS_FATTR_JUNCTION) inode->i_flags |= S_AUTOMOUNT; - if (inode->i_state & I_NEW) + if (inode->i_state & I_NEW) { + cifs_set_netfs_context(inode); cifs_set_ops(inode); + } return 0; } diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 2e29c6c2dca6..96a23a26d205 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -4408,10 +4408,12 @@ smb2_new_read_req(void **buf, unsigned int *total_len, req->Length = cpu_to_le32(io_parms->length); req->Offset = cpu_to_le64(io_parms->offset); - trace_smb3_read_enter(0 /* xid */, - io_parms->persistent_fid, - io_parms->tcon->tid, io_parms->tcon->ses->Suid, - io_parms->offset, io_parms->length); + trace_smb3_read_enter(rdata ? rdata->rreq->debug_id : 0, + rdata ? rdata->subreq.debug_index : 0, + rdata ? rdata->xid : 0, + io_parms->persistent_fid, + io_parms->tcon->tid, io_parms->tcon->ses->Suid, + io_parms->offset, io_parms->length); #ifdef CONFIG_CIFS_SMB_DIRECT /* * If we want to do a RDMA write, fill in and append @@ -4473,7 +4475,7 @@ static void smb2_readv_callback(struct mid_q_entry *mid) { struct cifs_io_subrequest *rdata = mid->callback_data; - struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); + struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); struct TCP_Server_Info *server = rdata->server; struct smb2_hdr *shdr = (struct smb2_hdr *)rdata->iov[0].iov_base; @@ -4501,7 +4503,6 @@ smb2_readv_callback(struct mid_q_entry *mid) if (server->sign && !mid->decrypted) { int rc; - iov_iter_revert(&rqst.rq_iter, rdata->got_bytes); iov_iter_truncate(&rqst.rq_iter, rdata->got_bytes); rc = smb2_verify_signature(&rqst, server); if (rc) @@ -4542,17 +4543,33 @@ smb2_readv_callback(struct mid_q_entry *mid) #endif if (rdata->result && rdata->result != -ENODATA) { cifs_stats_fail_inc(tcon, SMB2_READ_HE); - trace_smb3_read_err(0 /* xid */, - rdata->cfile->fid.persistent_fid, + trace_smb3_read_err(rdata->rreq->debug_id, + rdata->subreq.debug_index, + rdata->xid, + rdata->req->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, rdata->subreq.start, rdata->subreq.len, rdata->result); } else - trace_smb3_read_done(0 /* xid */, - rdata->cfile->fid.persistent_fid, + trace_smb3_read_done(rdata->rreq->debug_id, + rdata->subreq.debug_index, + rdata->xid, + rdata->req->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, rdata->subreq.start, rdata->got_bytes); - queue_work(cifsiod_wq, &rdata->work); + if (rdata->result == -ENODATA) { + /* We may have got an EOF error because fallocate + * failed to enlarge the file. + */ + if (rdata->subreq.start < rdata->subreq.rreq->i_size) + rdata->result = 0; + } + if (rdata->result == 0 || rdata->result == -EAGAIN) + iov_iter_advance(&rdata->subreq.io_iter, rdata->got_bytes); + rdata->credits.value = 0; + netfs_subreq_terminated(&rdata->subreq, + (rdata->result == 0 || rdata->result == -EAGAIN) ? + rdata->got_bytes : rdata->result, true); release_mid(mid); add_credits(server, &credits, 0); } @@ -4568,7 +4585,7 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) struct smb_rqst rqst = { .rq_iov = rdata->iov, .rq_nvec = 1 }; struct TCP_Server_Info *server; - struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); + struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); unsigned int total_len; int credit_request; @@ -4578,12 +4595,12 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) if (!rdata->server) rdata->server = cifs_pick_channel(tcon->ses); - io_parms.tcon = tlink_tcon(rdata->cfile->tlink); + io_parms.tcon = tlink_tcon(rdata->req->cfile->tlink); io_parms.server = server = rdata->server; io_parms.offset = rdata->subreq.start; io_parms.length = rdata->subreq.len; - io_parms.persistent_fid = rdata->cfile->fid.persistent_fid; - io_parms.volatile_fid = rdata->cfile->fid.volatile_fid; + io_parms.persistent_fid = rdata->req->cfile->fid.persistent_fid; + io_parms.volatile_fid = rdata->req->cfile->fid.volatile_fid; io_parms.pid = rdata->pid; rc = smb2_new_read_req( @@ -4617,15 +4634,15 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) flags |= CIFS_HAS_CREDITS; } - cifs_get_readdata(rdata); rc = cifs_call_async(server, &rqst, cifs_readv_receive, smb2_readv_callback, smb3_handle_read_data, rdata, flags, &rdata->credits); if (rc) { - cifs_put_readdata(rdata); cifs_stats_fail_inc(io_parms.tcon, SMB2_READ_HE); - trace_smb3_read_err(0 /* xid */, io_parms.persistent_fid, + trace_smb3_read_err(rdata->rreq->debug_id, + rdata->subreq.debug_index, + rdata->xid, io_parms.persistent_fid, io_parms.tcon->tid, io_parms.tcon->ses->Suid, io_parms.offset, io_parms.length, rc); @@ -4676,22 +4693,23 @@ SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms, if (rc != -ENODATA) { cifs_stats_fail_inc(io_parms->tcon, SMB2_READ_HE); cifs_dbg(VFS, "Send error in read = %d\n", rc); - trace_smb3_read_err(xid, + trace_smb3_read_err(0, 0, xid, req->PersistentFileId, io_parms->tcon->tid, ses->Suid, io_parms->offset, io_parms->length, rc); } else - trace_smb3_read_done(xid, req->PersistentFileId, io_parms->tcon->tid, + trace_smb3_read_done(0, 0, xid, + req->PersistentFileId, io_parms->tcon->tid, ses->Suid, io_parms->offset, 0); free_rsp_buf(resp_buftype, rsp_iov.iov_base); cifs_small_buf_release(req); return rc == -ENODATA ? 0 : rc; } else - trace_smb3_read_done(xid, - req->PersistentFileId, - io_parms->tcon->tid, ses->Suid, - io_parms->offset, io_parms->length); + trace_smb3_read_done(0, 0, xid, + req->PersistentFileId, + io_parms->tcon->tid, ses->Suid, + io_parms->offset, io_parms->length); cifs_small_buf_release(req); @@ -4725,11 +4743,12 @@ static void smb2_writev_callback(struct mid_q_entry *mid) { struct cifs_io_subrequest *wdata = mid->callback_data; - struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); + struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); struct TCP_Server_Info *server = wdata->server; - unsigned int written; struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf; struct cifs_credits credits = { .value = 0, .instance = 0 }; + ssize_t result = 0; + size_t written; WARN_ONCE(wdata->server != mid->server, "wdata server %p != mid server %p", @@ -4739,8 +4758,8 @@ smb2_writev_callback(struct mid_q_entry *mid) case MID_RESPONSE_RECEIVED: credits.value = le16_to_cpu(rsp->hdr.CreditRequest); credits.instance = server->reconnect_instance; - wdata->result = smb2_check_receive(mid, server, 0); - if (wdata->result != 0) + result = smb2_check_receive(mid, server, 0); + if (result != 0) break; written = le32_to_cpu(rsp->DataLength); @@ -4757,17 +4776,18 @@ smb2_writev_callback(struct mid_q_entry *mid) wdata->result = -ENOSPC; else wdata->subreq.len = written; + iov_iter_advance(&wdata->subreq.io_iter, written); break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: - wdata->result = -EAGAIN; + result = -EAGAIN; break; case MID_RESPONSE_MALFORMED: credits.value = le16_to_cpu(rsp->hdr.CreditRequest); credits.instance = server->reconnect_instance; fallthrough; default: - wdata->result = -EIO; + result = -EIO; break; } #ifdef CONFIG_CIFS_SMB_DIRECT @@ -4783,10 +4803,10 @@ smb2_writev_callback(struct mid_q_entry *mid) wdata->mr = NULL; } #endif - if (wdata->result) { + if (result) { cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); - trace_smb3_write_err(0 /* no xid */, - wdata->cfile->fid.persistent_fid, + trace_smb3_write_err(wdata->xid, + wdata->req->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, wdata->subreq.start, wdata->subreq.len, wdata->result); if (wdata->result == -ENOSPC) @@ -4794,27 +4814,28 @@ smb2_writev_callback(struct mid_q_entry *mid) tcon->tree_name); } else trace_smb3_write_done(0 /* no xid */, - wdata->cfile->fid.persistent_fid, + wdata->req->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, wdata->subreq.start, wdata->subreq.len); - queue_work(cifsiod_wq, &wdata->work); + wdata->credits.value = 0; + cifs_write_subrequest_terminated(wdata, result ?: written, true); release_mid(mid); add_credits(server, &credits, 0); } /* smb2_async_writev - send an async write, and set up mid to handle result */ -int +void smb2_async_writev(struct cifs_io_subrequest *wdata) { int rc = -EACCES, flags = 0; struct smb2_write_req *req = NULL; struct smb2_hdr *shdr; - struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); + struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); struct TCP_Server_Info *server = wdata->server; struct kvec iov[1]; struct smb_rqst rqst = { }; - unsigned int total_len; + unsigned int total_len, xid = wdata->xid; struct cifs_io_parms _io_parms; struct cifs_io_parms *io_parms = NULL; int credit_request; @@ -4831,8 +4852,8 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) .server = server, .offset = wdata->subreq.start, .length = wdata->subreq.len, - .persistent_fid = wdata->cfile->fid.persistent_fid, - .volatile_fid = wdata->cfile->fid.volatile_fid, + .persistent_fid = wdata->req->cfile->fid.persistent_fid, + .volatile_fid = wdata->req->cfile->fid.volatile_fid, .pid = wdata->pid, }; io_parms = &_io_parms; @@ -4840,7 +4861,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) rc = smb2_plain_req_init(SMB2_WRITE, tcon, server, (void **) &req, &total_len); if (rc) - return rc; + goto out; if (smb3_encryption_required(tcon)) flags |= CIFS_TRANSFORM_REQ; @@ -4858,7 +4879,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) offsetof(struct smb2_write_req, Buffer)); req->RemainingBytes = 0; - trace_smb3_write_enter(0 /* xid */, + trace_smb3_write_enter(wdata->xid, io_parms->persistent_fid, io_parms->tcon->tid, io_parms->tcon->ses->Suid, @@ -4939,25 +4960,27 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) flags |= CIFS_HAS_CREDITS; } - cifs_get_writedata(wdata); rc = cifs_call_async(server, &rqst, NULL, smb2_writev_callback, NULL, wdata, flags, &wdata->credits); - + /* Can't touch wdata if rc == 0 */ if (rc) { - trace_smb3_write_err(0 /* no xid */, + trace_smb3_write_err(xid, io_parms->persistent_fid, io_parms->tcon->tid, io_parms->tcon->ses->Suid, io_parms->offset, io_parms->length, rc); - cifs_put_writedata(wdata); cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); } async_writev_out: cifs_small_buf_release(req); - return rc; +out: + if (rc) { + add_credits_and_wake_if(wdata->server, &wdata->credits, 0); + cifs_write_subrequest_terminated(wdata, rc, true); + } } /* diff --git a/fs/smb/client/smb2proto.h b/fs/smb/client/smb2proto.h index c781eaa0cba8..b208232b12a2 100644 --- a/fs/smb/client/smb2proto.h +++ b/fs/smb/client/smb2proto.h @@ -213,7 +213,7 @@ extern int SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon, extern int smb2_async_readv(struct cifs_io_subrequest *rdata); extern int SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms, unsigned int *nbytes, char **buf, int *buf_type); -extern int smb2_async_writev(struct cifs_io_subrequest *wdata); +extern void smb2_async_writev(struct cifs_io_subrequest *wdata); extern int SMB2_write(const unsigned int xid, struct cifs_io_parms *io_parms, unsigned int *nbytes, struct kvec *iov, int n_vec); extern int SMB2_echo(struct TCP_Server_Info *server); diff --git a/fs/smb/client/trace.h b/fs/smb/client/trace.h index f9c1fd32d0b8..59f27ccad1cf 100644 --- a/fs/smb/client/trace.h +++ b/fs/smb/client/trace.h @@ -21,6 +21,62 @@ /* For logging errors in read or write */ DECLARE_EVENT_CLASS(smb3_rw_err_class, + TP_PROTO(unsigned int rreq_debug_id, + unsigned int rreq_debug_index, + unsigned int xid, + __u64 fid, + __u32 tid, + __u64 sesid, + __u64 offset, + __u32 len, + int rc), + TP_ARGS(rreq_debug_id, rreq_debug_index, + xid, fid, tid, sesid, offset, len, rc), + TP_STRUCT__entry( + __field(unsigned int, rreq_debug_id) + __field(unsigned int, rreq_debug_index) + __field(unsigned int, xid) + __field(__u64, fid) + __field(__u32, tid) + __field(__u64, sesid) + __field(__u64, offset) + __field(__u32, len) + __field(int, rc) + ), + TP_fast_assign( + __entry->rreq_debug_id = rreq_debug_id; + __entry->rreq_debug_index = rreq_debug_index; + __entry->xid = xid; + __entry->fid = fid; + __entry->tid = tid; + __entry->sesid = sesid; + __entry->offset = offset; + __entry->len = len; + __entry->rc = rc; + ), + TP_printk("\tR=%08x[%x] xid=%u sid=0x%llx tid=0x%x fid=0x%llx offset=0x%llx len=0x%x rc=%d", + __entry->rreq_debug_id, __entry->rreq_debug_index, + __entry->xid, __entry->sesid, __entry->tid, __entry->fid, + __entry->offset, __entry->len, __entry->rc) +) + +#define DEFINE_SMB3_RW_ERR_EVENT(name) \ +DEFINE_EVENT(smb3_rw_err_class, smb3_##name, \ + TP_PROTO(unsigned int rreq_debug_id, \ + unsigned int rreq_debug_index, \ + unsigned int xid, \ + __u64 fid, \ + __u32 tid, \ + __u64 sesid, \ + __u64 offset, \ + __u32 len, \ + int rc), \ + TP_ARGS(rreq_debug_id, rreq_debug_index, xid, fid, tid, sesid, offset, len, rc)) + +DEFINE_SMB3_RW_ERR_EVENT(read_err); + +/* For logging errors in other file I/O ops */ +DECLARE_EVENT_CLASS(smb3_other_err_class, TP_PROTO(unsigned int xid, __u64 fid, __u32 tid, @@ -52,8 +108,8 @@ DECLARE_EVENT_CLASS(smb3_rw_err_class, __entry->offset, __entry->len, __entry->rc) ) -#define DEFINE_SMB3_RW_ERR_EVENT(name) \ -DEFINE_EVENT(smb3_rw_err_class, smb3_##name, \ +#define DEFINE_SMB3_OTHER_ERR_EVENT(name) \ +DEFINE_EVENT(smb3_other_err_class, smb3_##name, \ TP_PROTO(unsigned int xid, \ __u64 fid, \ __u32 tid, \ @@ -63,15 +119,67 @@ DEFINE_EVENT(smb3_rw_err_class, smb3_##name, \ int rc), \ TP_ARGS(xid, fid, tid, sesid, offset, len, rc)) -DEFINE_SMB3_RW_ERR_EVENT(write_err); -DEFINE_SMB3_RW_ERR_EVENT(read_err); -DEFINE_SMB3_RW_ERR_EVENT(query_dir_err); -DEFINE_SMB3_RW_ERR_EVENT(zero_err); -DEFINE_SMB3_RW_ERR_EVENT(falloc_err); +DEFINE_SMB3_OTHER_ERR_EVENT(write_err); +DEFINE_SMB3_OTHER_ERR_EVENT(query_dir_err); +DEFINE_SMB3_OTHER_ERR_EVENT(zero_err); +DEFINE_SMB3_OTHER_ERR_EVENT(falloc_err); /* For logging successful read or write */ DECLARE_EVENT_CLASS(smb3_rw_done_class, + TP_PROTO(unsigned int rreq_debug_id, + unsigned int rreq_debug_index, + unsigned int xid, + __u64 fid, + __u32 tid, + __u64 sesid, + __u64 offset, + __u32 len), + TP_ARGS(rreq_debug_id, rreq_debug_index, + xid, fid, tid, sesid, offset, len), + TP_STRUCT__entry( + __field(unsigned int, rreq_debug_id) + __field(unsigned int, rreq_debug_index) + __field(unsigned int, xid) + __field(__u64, fid) + __field(__u32, tid) + __field(__u64, sesid) + __field(__u64, offset) + __field(__u32, len) + ), + TP_fast_assign( + __entry->rreq_debug_id = rreq_debug_id; + __entry->rreq_debug_index = rreq_debug_index; + __entry->xid = xid; + __entry->fid = fid; + __entry->tid = tid; + __entry->sesid = sesid; + __entry->offset = offset; + __entry->len = len; + ), + TP_printk("R=%08x[%x] xid=%u sid=0x%llx tid=0x%x fid=0x%llx offset=0x%llx len=0x%x", + __entry->rreq_debug_id, __entry->rreq_debug_index, + __entry->xid, __entry->sesid, __entry->tid, __entry->fid, + __entry->offset, __entry->len) +) + +#define DEFINE_SMB3_RW_DONE_EVENT(name) \ +DEFINE_EVENT(smb3_rw_done_class, smb3_##name, \ + TP_PROTO(unsigned int rreq_debug_id, \ + unsigned int rreq_debug_index, \ + unsigned int xid, \ + __u64 fid, \ + __u32 tid, \ + __u64 sesid, \ + __u64 offset, \ + __u32 len), \ + TP_ARGS(rreq_debug_id, rreq_debug_index, xid, fid, tid, sesid, offset, len)) + +DEFINE_SMB3_RW_DONE_EVENT(read_enter); +DEFINE_SMB3_RW_DONE_EVENT(read_done); + +/* For logging successful other op */ +DECLARE_EVENT_CLASS(smb3_other_done_class, TP_PROTO(unsigned int xid, __u64 fid, __u32 tid, @@ -100,8 +208,8 @@ DECLARE_EVENT_CLASS(smb3_rw_done_class, __entry->offset, __entry->len) ) -#define DEFINE_SMB3_RW_DONE_EVENT(name) \ -DEFINE_EVENT(smb3_rw_done_class, smb3_##name, \ +#define DEFINE_SMB3_OTHER_DONE_EVENT(name) \ +DEFINE_EVENT(smb3_other_done_class, smb3_##name, \ TP_PROTO(unsigned int xid, \ __u64 fid, \ __u32 tid, \ @@ -110,16 +218,14 @@ DEFINE_EVENT(smb3_rw_done_class, smb3_##name, \ __u32 len), \ TP_ARGS(xid, fid, tid, sesid, offset, len)) -DEFINE_SMB3_RW_DONE_EVENT(write_enter); -DEFINE_SMB3_RW_DONE_EVENT(read_enter); -DEFINE_SMB3_RW_DONE_EVENT(query_dir_enter); -DEFINE_SMB3_RW_DONE_EVENT(zero_enter); -DEFINE_SMB3_RW_DONE_EVENT(falloc_enter); -DEFINE_SMB3_RW_DONE_EVENT(write_done); -DEFINE_SMB3_RW_DONE_EVENT(read_done); -DEFINE_SMB3_RW_DONE_EVENT(query_dir_done); -DEFINE_SMB3_RW_DONE_EVENT(zero_done); -DEFINE_SMB3_RW_DONE_EVENT(falloc_done); +DEFINE_SMB3_OTHER_DONE_EVENT(write_enter); +DEFINE_SMB3_OTHER_DONE_EVENT(query_dir_enter); +DEFINE_SMB3_OTHER_DONE_EVENT(zero_enter); +DEFINE_SMB3_OTHER_DONE_EVENT(falloc_enter); +DEFINE_SMB3_OTHER_DONE_EVENT(write_done); +DEFINE_SMB3_OTHER_DONE_EVENT(query_dir_done); +DEFINE_SMB3_OTHER_DONE_EVENT(zero_done); +DEFINE_SMB3_OTHER_DONE_EVENT(falloc_done); /* For logging successful set EOF (truncate) */ DECLARE_EVENT_CLASS(smb3_eof_class, diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index 5a69a7430ffa..4bf8b2ff26f5 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -1808,8 +1808,11 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid) length = data_len; /* An RDMA read is already done. */ else #endif + { length = cifs_read_iter_from_socket(server, &rdata->subreq.io_iter, data_len); + iov_iter_revert(&rdata->subreq.io_iter, data_len); + } if (length > 0) rdata->got_bytes += length; server->total_read += length;
When we're engaged in local caching of a cifs filesystem, we cannot perform caching of a partially written cache granule unless we can read the rest of the granule. To deal with this, if a file is opened O_WRONLY locally, but the mount was given the "-o fsc" flag, try first opening the remote file with GENERIC_READ|GENERIC_WRITE and if that returns -EACCES, try dropping the GENERIC_READ and doing the open again. If that last succeeds, invalidate the cache for that file as for O_DIRECT. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/dir.c | 15 ++++++++++++ fs/smb/client/file.c | 51 +++++++++++++++++++++++++++++++++-------- fs/smb/client/fscache.h | 6 +++++ 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/fs/smb/client/dir.c b/fs/smb/client/dir.c index 89333d9bce36..37897b919dd5 100644 --- a/fs/smb/client/dir.c +++ b/fs/smb/client/dir.c @@ -189,6 +189,7 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int disposition; struct TCP_Server_Info *server = tcon->ses->server; struct cifs_open_parms oparms; + int rdwr_for_fscache = 0; *oplock = 0; if (tcon->ses->server->oplocks) @@ -200,6 +201,10 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned return PTR_ERR(full_path); } + /* If we're caching, we need to be able to fill in around partial writes. */ + if (cifs_fscache_enabled(inode) && (oflags & O_ACCMODE) == O_WRONLY) + rdwr_for_fscache = 1; + #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY if (tcon->unix_ext && cap_unix(tcon->ses) && !tcon->broken_posix_open && (CIFS_UNIX_POSIX_PATH_OPS_CAP & @@ -276,6 +281,8 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned desired_access |= GENERIC_READ; /* is this too little? */ if (OPEN_FMODE(oflags) & FMODE_WRITE) desired_access |= GENERIC_WRITE; + if (rdwr_for_fscache == 1) + desired_access |= GENERIC_READ; disposition = FILE_OVERWRITE_IF; if ((oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) @@ -304,6 +311,7 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned if (!tcon->unix_ext && (mode & S_IWUGO) == 0) create_options |= CREATE_OPTION_READONLY; +retry_open: oparms = (struct cifs_open_parms) { .tcon = tcon, .cifs_sb = cifs_sb, @@ -317,8 +325,15 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned rc = server->ops->open(xid, &oparms, oplock, buf); if (rc) { cifs_dbg(FYI, "cifs_create returned 0x%x\n", rc); + if (rc == -EACCES && rdwr_for_fscache == 1) { + desired_access &= ~GENERIC_READ; + rdwr_for_fscache = 2; + goto retry_open; + } goto out; } + if (rdwr_for_fscache == 2) + cifs_invalidate_cache(inode, FSCACHE_INVAL_DIO_WRITE); #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY /* diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 73573dadf90e..761a80963f76 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -521,12 +521,12 @@ cifs_mark_open_files_invalid(struct cifs_tcon *tcon) */ } -static inline int cifs_convert_flags(unsigned int flags) +static inline int cifs_convert_flags(unsigned int flags, int rdwr_for_fscache) { if ((flags & O_ACCMODE) == O_RDONLY) return GENERIC_READ; else if ((flags & O_ACCMODE) == O_WRONLY) - return GENERIC_WRITE; + return rdwr_for_fscache == 1 ? (GENERIC_READ | GENERIC_WRITE) : GENERIC_WRITE; else if ((flags & O_ACCMODE) == O_RDWR) { /* GENERIC_ALL is too much permission to request can cause unnecessary access denied on create */ @@ -663,11 +663,16 @@ static int cifs_nt_open(const char *full_path, struct inode *inode, struct cifs_ int create_options = CREATE_NOT_DIR; struct TCP_Server_Info *server = tcon->ses->server; struct cifs_open_parms oparms; + int rdwr_for_fscache = 0; if (!server->ops->open) return -ENOSYS; - desired_access = cifs_convert_flags(f_flags); + /* If we're caching, we need to be able to fill in around partial writes. */ + if (cifs_fscache_enabled(inode) && (f_flags & O_ACCMODE) == O_WRONLY) + rdwr_for_fscache = 1; + + desired_access = cifs_convert_flags(f_flags, rdwr_for_fscache); /********************************************************************* * open flag mapping table: @@ -704,6 +709,7 @@ static int cifs_nt_open(const char *full_path, struct inode *inode, struct cifs_ if (f_flags & O_DIRECT) create_options |= CREATE_NO_BUFFER; +retry_open: oparms = (struct cifs_open_parms) { .tcon = tcon, .cifs_sb = cifs_sb, @@ -715,8 +721,16 @@ static int cifs_nt_open(const char *full_path, struct inode *inode, struct cifs_ }; rc = server->ops->open(xid, &oparms, oplock, buf); - if (rc) + if (rc) { + if (rc == -EACCES && rdwr_for_fscache == 1) { + desired_access = cifs_convert_flags(f_flags, 0); + rdwr_for_fscache = 2; + goto retry_open; + } return rc; + } + if (rdwr_for_fscache == 2) + cifs_invalidate_cache(inode, FSCACHE_INVAL_DIO_WRITE); /* TODO: Add support for calling posix query info but with passing in fid */ if (tcon->unix_ext) @@ -1149,11 +1163,14 @@ int cifs_open(struct inode *inode, struct file *file) use_cache: fscache_use_cookie(cifs_inode_cookie(file_inode(file)), file->f_mode & FMODE_WRITE); - if (file->f_flags & O_DIRECT && - (!((file->f_flags & O_ACCMODE) != O_RDONLY) || - file->f_flags & O_APPEND)) - cifs_invalidate_cache(file_inode(file), - FSCACHE_INVAL_DIO_WRITE); + //if ((file->f_flags & O_ACCMODE) == O_WRONLY) + // goto inval; + if (!(file->f_flags & O_DIRECT)) + goto out; + if ((file->f_flags & (O_ACCMODE | O_APPEND)) == O_RDONLY) + goto out; +//inval: + cifs_invalidate_cache(file_inode(file), FSCACHE_INVAL_DIO_WRITE); out: free_dentry_path(page); @@ -1218,6 +1235,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) int disposition = FILE_OPEN; int create_options = CREATE_NOT_DIR; struct cifs_open_parms oparms; + int rdwr_for_fscache = 0; xid = get_xid(); mutex_lock(&cfile->fh_mutex); @@ -1281,7 +1299,11 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) } #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ - desired_access = cifs_convert_flags(cfile->f_flags); + /* If we're caching, we need to be able to fill in around partial writes. */ + if (cifs_fscache_enabled(inode) && (cfile->f_flags & O_ACCMODE) == O_WRONLY) + rdwr_for_fscache = 1; + + desired_access = cifs_convert_flags(cfile->f_flags, rdwr_for_fscache); /* O_SYNC also has bit for O_DSYNC so following check picks up either */ if (cfile->f_flags & O_SYNC) @@ -1293,6 +1315,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) if (server->ops->get_lease_key) server->ops->get_lease_key(inode, &cfile->fid); +retry_open: oparms = (struct cifs_open_parms) { .tcon = tcon, .cifs_sb = cifs_sb, @@ -1318,6 +1341,11 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) /* indicate that we need to relock the file */ oparms.reconnect = true; } + if (rc == -EACCES && rdwr_for_fscache == 1) { + desired_access = cifs_convert_flags(cfile->f_flags, 0); + rdwr_for_fscache = 2; + goto retry_open; + } if (rc) { mutex_unlock(&cfile->fh_mutex); @@ -1326,6 +1354,9 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) goto reopen_error_exit; } + if (rdwr_for_fscache == 2) + cifs_invalidate_cache(inode, FSCACHE_INVAL_DIO_WRITE); + #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY reopen_success: #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ diff --git a/fs/smb/client/fscache.h b/fs/smb/client/fscache.h index a3d73720914f..1f2ea9f5cc9a 100644 --- a/fs/smb/client/fscache.h +++ b/fs/smb/client/fscache.h @@ -109,6 +109,11 @@ static inline void cifs_readahead_to_fscache(struct inode *inode, __cifs_readahead_to_fscache(inode, pos, len); } +static inline bool cifs_fscache_enabled(struct inode *inode) +{ + return fscache_cookie_enabled(cifs_inode_cookie(inode)); +} + #else /* CONFIG_CIFS_FSCACHE */ static inline void cifs_fscache_fill_coherency(struct inode *inode, @@ -124,6 +129,7 @@ static inline void cifs_fscache_release_inode_cookie(struct inode *inode) {} static inline void cifs_fscache_unuse_inode_cookie(struct inode *inode, bool update) {} static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode) { return NULL; } static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags) {} +static inline bool cifs_fscache_enabled(struct inode *inode) { return false; } static inline int cifs_fscache_query_occupancy(struct inode *inode, pgoff_t first, unsigned int nr_pages,
Provide implementation of the netfslib hooks that will be used by netfslib to ask cifs to set up and perform operations. Of particular note are (*) cifs_clamp_length() - This is used to negotiate the size of the next subrequest in a read request, taking into account the credit available and the rsize. The credits are attached to the subrequest. (*) cifs_req_issue_read() - This is used to issue a subrequest that has been set up and clamped. (*) cifs_prepare_write() - This prepares to fill a subrequest by picking a channel, reopening the file and requesting credits so that we can set the maximum size of the subrequest and also sets the maximum number of segments if we're doing RDMA. (*) cifs_issue_write() - This releases any unneeded credits and issues an asynchronous data write for the contiguous slice of file covered by the subrequest. This should possibly be folded in to all ->async_writev() ops and that called directly. (*) cifs_begin_writeback() - This gets the cached writable handle through which we do writeback (this does not affect writethrough, unbuffered or direct writes). At this point, cifs is not wired up to actually *use* netfslib; that will be done in a subsequent patch. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/netfs/buffered_write.c | 6 + fs/smb/client/Kconfig | 1 + fs/smb/client/cifsfs.c | 2 +- fs/smb/client/cifsfs.h | 1 + fs/smb/client/cifsglob.h | 28 +++- fs/smb/client/file.c | 315 +++++++++++++++++++++++++++++++++++ include/linux/netfs.h | 1 + include/trace/events/netfs.h | 1 + 8 files changed, 345 insertions(+), 10 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 1eff9413eb1b..a3ef053d9789 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -407,6 +407,9 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, } while (iov_iter_count(iter)); out: + if (likely(written) && ctx->ops->post_modify) + ctx->ops->post_modify(inode); + if (unlikely(wreq)) { ret2 = netfs_end_writethrough(wreq, &wbc, writethrough); wbc_detach_inode(&wbc); @@ -523,6 +526,7 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr struct folio *folio = page_folio(vmf->page); struct file *file = vmf->vma->vm_file; struct inode *inode = file_inode(file); + struct netfs_inode *ictx = netfs_inode(inode); vm_fault_t ret = VM_FAULT_RETRY; int err; @@ -569,6 +573,8 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr trace_netfs_folio(folio, netfs_folio_trace_mkwrite); netfs_set_group(folio, netfs_group); file_update_time(file); + if (ictx->ops->post_modify) + ictx->ops->post_modify(inode); ret = VM_FAULT_LOCKED; out: sb_end_pagefault(inode->i_sb); diff --git a/fs/smb/client/Kconfig b/fs/smb/client/Kconfig index 2927bd174a88..2517dc242386 100644 --- a/fs/smb/client/Kconfig +++ b/fs/smb/client/Kconfig @@ -2,6 +2,7 @@ config CIFS tristate "SMB3 and CIFS support (advanced network filesystem)" depends on INET + select NETFS_SUPPORT select NLS select NLS_UCS2_UTILS select CRYPTO diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index d8c31383752a..90801a0077da 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -1754,7 +1754,7 @@ static int cifs_init_netfs(void) { cifs_io_request_cachep = kmem_cache_create("cifs_io_request", - sizeof(struct netfs_io_request), 0, + sizeof(struct cifs_io_request), 0, SLAB_HWCACHE_ALIGN, NULL); if (!cifs_io_request_cachep) goto nomem_req; diff --git a/fs/smb/client/cifsfs.h b/fs/smb/client/cifsfs.h index 1acf6bfc06de..922c10d7cfdd 100644 --- a/fs/smb/client/cifsfs.h +++ b/fs/smb/client/cifsfs.h @@ -84,6 +84,7 @@ extern const struct inode_operations cifs_namespace_inode_operations; /* Functions related to files and directories */ +extern const struct netfs_request_ops cifs_req_ops; extern const struct file_operations cifs_file_ops; extern const struct file_operations cifs_file_direct_ops; /* if directio mnt */ extern const struct file_operations cifs_file_strict_ops; /* if strictio mnt */ diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 704f526a9e81..18a3babbe577 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -1486,15 +1486,24 @@ struct cifs_aio_ctx { bool direct_io; }; +struct cifs_io_request { + struct netfs_io_request rreq; + struct cifsFileInfo *cfile; +}; + /* asynchronous read support */ struct cifs_io_subrequest { - struct netfs_io_subrequest subreq; - struct cifsFileInfo *cfile; - struct address_space *mapping; - struct cifs_aio_ctx *ctx; + union { + struct netfs_io_subrequest subreq; + struct netfs_io_request *rreq; + struct cifs_io_request *req; + }; ssize_t got_bytes; pid_t pid; + unsigned int xid; int result; + bool have_xid; + bool replay; struct kvec iov[2]; struct TCP_Server_Info *server; #ifdef CONFIG_CIFS_SMB_DIRECT @@ -1502,15 +1511,16 @@ struct cifs_io_subrequest { #endif struct cifs_credits credits; - enum writeback_sync_modes sync_mode; - bool uncached; - bool replay; - struct bio_vec *bv; - // TODO: Remove following elements struct list_head list; struct completion done; struct work_struct work; + struct cifsFileInfo *cfile; + struct address_space *mapping; + struct cifs_aio_ctx *ctx; + enum writeback_sync_modes sync_mode; + bool uncached; + struct bio_vec *bv; }; /* diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index e40ba6de0a28..73573dadf90e 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -36,6 +36,321 @@ #include "fs_context.h" #include "cifs_ioctl.h" #include "cached_dir.h" +#include <trace/events/netfs.h> + +static int cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush); + +/* + * Prepare a subrequest to upload to the server. We need to allocate credits + * so that we know the maximum amount of data that we can include in it. + */ +static void cifs_prepare_write(struct netfs_io_subrequest *subreq) +{ + struct cifs_io_subrequest *wdata = + container_of(subreq, struct cifs_io_subrequest, subreq); + struct cifs_io_request *req = wdata->req; + struct TCP_Server_Info *server; + struct cifsFileInfo *open_file = req->cfile; + size_t wsize = req->rreq.wsize; + int rc; + + if (!wdata->have_xid) { + wdata->xid = get_xid(); + wdata->have_xid = true; + } + + server = cifs_pick_channel(tlink_tcon(open_file->tlink)->ses); + wdata->server = server; + +retry: + if (open_file->invalidHandle) { + rc = cifs_reopen_file(open_file, false); + if (rc < 0) { + if (rc == -EAGAIN) + goto retry; + subreq->error = rc; + return netfs_prepare_write_failed(subreq); + } + } + + rc = server->ops->wait_mtu_credits(server, wsize, &wdata->subreq.max_len, + &wdata->credits); + if (rc < 0) { + subreq->error = rc; + return netfs_prepare_write_failed(subreq); + } + +#ifdef CONFIG_CIFS_SMB_DIRECT + if (server->smbd_conn) + subreq->max_nr_segs = server->smbd_conn->max_frmr_depth; +#endif +} + +/* + * Issue a subrequest to upload to the server. + */ +static void cifs_issue_write(struct netfs_io_subrequest *subreq) +{ + struct cifs_io_subrequest *wdata = + container_of(subreq, struct cifs_io_subrequest, subreq); + struct cifs_sb_info *sbi = CIFS_SB(subreq->rreq->inode->i_sb); + int rc; + + if (cifs_forced_shutdown(sbi)) { + rc = -EIO; + goto fail; + } + + rc = adjust_credits(wdata->server, &wdata->credits, wdata->subreq.len); + if (rc) + goto fail; + + rc = -EAGAIN; + if (wdata->req->cfile->invalidHandle) + goto fail; + + wdata->server->ops->async_writev(wdata); +out: + return; + +fail: + if (rc == -EAGAIN) + trace_netfs_sreq(subreq, netfs_sreq_trace_retry); + else + trace_netfs_sreq(subreq, netfs_sreq_trace_fail); + add_credits_and_wake_if(wdata->server, &wdata->credits, 0); + netfs_write_subrequest_terminated(wdata, rc, false); + goto out; +} + +/* + * Split the read up according to how many credits we can get for each piece. + * It's okay to sleep here if we need to wait for more credit to become + * available. + * + * We also choose the server and allocate an operation ID to be cleaned up + * later. + */ +static bool cifs_clamp_length(struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *rreq = subreq->rreq; + struct TCP_Server_Info *server; + struct cifs_io_subrequest *rdata = container_of(subreq, struct cifs_io_subrequest, subreq); + struct cifs_io_request *req = container_of(subreq->rreq, struct cifs_io_request, rreq); + struct cifs_sb_info *cifs_sb = CIFS_SB(rreq->inode->i_sb); + size_t rsize = 0; + int rc; + + rdata->xid = get_xid(); + rdata->have_xid = true; + + server = cifs_pick_channel(tlink_tcon(req->cfile->tlink)->ses); + rdata->server = server; + + if (cifs_sb->ctx->rsize == 0) + cifs_sb->ctx->rsize = + server->ops->negotiate_rsize(tlink_tcon(req->cfile->tlink), + cifs_sb->ctx); + + + rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, &rsize, + &rdata->credits); + if (rc) { + subreq->error = rc; + return false; + } + + subreq->len = min_t(size_t, subreq->len, rsize); +#ifdef CONFIG_CIFS_SMB_DIRECT + if (server->smbd_conn) + subreq->max_nr_segs = server->smbd_conn->max_frmr_depth; +#endif + return true; +} + +/* + * Issue a read operation on behalf of the netfs helper functions. We're asked + * to make a read of a certain size at a point in the file. We are permitted + * to only read a portion of that, but as long as we read something, the netfs + * helper will call us again so that we can issue another read. + */ +static void cifs_req_issue_read(struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *rreq = subreq->rreq; + struct cifs_io_subrequest *rdata = container_of(subreq, struct cifs_io_subrequest, subreq); + struct cifs_io_request *req = container_of(subreq->rreq, struct cifs_io_request, rreq); + struct cifs_sb_info *cifs_sb = CIFS_SB(rreq->inode->i_sb); + pid_t pid; + int rc = 0; + + if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) + pid = req->cfile->pid; + else + pid = current->tgid; // Ummm... This may be a workqueue + + cifs_dbg(FYI, "%s: op=%08x[%x] mapping=%p len=%zu/%zu\n", + __func__, rreq->debug_id, subreq->debug_index, rreq->mapping, + subreq->transferred, subreq->len); + + if (req->cfile->invalidHandle) { + do { + rc = cifs_reopen_file(req->cfile, true); + } while (rc == -EAGAIN); + if (rc) + goto out; + } + + __set_bit(NETFS_SREQ_CLEAR_TAIL, &subreq->flags); + rdata->pid = pid; + + rc = adjust_credits(rdata->server, &rdata->credits, rdata->subreq.len); + if (!rc) { + if (rdata->req->cfile->invalidHandle) + rc = -EAGAIN; + else + rc = rdata->server->ops->async_readv(rdata); + } + +out: + if (rc) + netfs_subreq_terminated(subreq, rc, false); +} + +/* + * Writeback calls this when it finds a folio that needs uploading. This isn't + * called if writeback only has copy-to-cache to deal with. + */ +static void cifs_begin_writeback(struct netfs_io_request *wreq) +{ + struct cifs_io_request *req = container_of(wreq, struct cifs_io_request, rreq); + int ret; + + ret = cifs_get_writable_file(CIFS_I(wreq->inode), FIND_WR_ANY, &req->cfile); + if (ret) { + cifs_dbg(VFS, "No writable handle in writepages ret=%d\n", ret); + return; + } + + wreq->io_streams[0].avail = true; +} + +/* + * Initialise a request. + */ +static int cifs_init_request(struct netfs_io_request *rreq, struct file *file) +{ + struct cifs_io_request *req = container_of(rreq, struct cifs_io_request, rreq); + struct cifs_sb_info *cifs_sb = CIFS_SB(rreq->inode->i_sb); + struct cifsFileInfo *open_file = NULL; + + rreq->rsize = cifs_sb->ctx->rsize; + rreq->wsize = cifs_sb->ctx->wsize; + + if (file) { + open_file = file->private_data; + rreq->netfs_priv = file->private_data; + req->cfile = cifsFileInfo_get(open_file); + } else if (rreq->origin != NETFS_WRITEBACK) { + WARN_ON_ONCE(1); + return -EIO; + } + + return 0; +} + +/* + * Expand the size of a readahead to the size of the rsize, if at least as + * large as a page, allowing for the possibility that rsize is not pow-2 + * aligned. + */ +static void cifs_expand_readahead(struct netfs_io_request *rreq) +{ + unsigned int rsize = rreq->rsize; + loff_t misalignment, i_size = i_size_read(rreq->inode); + + if (rsize < PAGE_SIZE) + return; + + if (rsize < INT_MAX) + rsize = roundup_pow_of_two(rsize); + else + rsize = ((unsigned int)INT_MAX + 1) / 2; + + misalignment = rreq->start & (rsize - 1); + if (misalignment) { + rreq->start -= misalignment; + rreq->len += misalignment; + } + + rreq->len = round_up(rreq->len, rsize); + if (rreq->start < i_size && rreq->len > i_size - rreq->start) + rreq->len = i_size - rreq->start; +} + +/* + * Completion of a request operation. + */ +static void cifs_rreq_done(struct netfs_io_request *rreq) +{ + struct timespec64 atime, mtime; + struct inode *inode = rreq->inode; + + /* we do not want atime to be less than mtime, it broke some apps */ + atime = inode_set_atime_to_ts(inode, current_time(inode)); + mtime = inode_get_mtime(inode); + if (timespec64_compare(&atime, &mtime)) + inode_set_atime_to_ts(inode, inode_get_mtime(inode)); +} + +static void cifs_post_modify(struct inode *inode) +{ + /* Indication to update ctime and mtime as close is deferred */ + set_bit(CIFS_INO_MODIFIED_ATTR, &CIFS_I(inode)->flags); +} + +static void cifs_free_request(struct netfs_io_request *rreq) +{ + struct cifs_io_request *req = container_of(rreq, struct cifs_io_request, rreq); + + if (req->cfile) + cifsFileInfo_put(req->cfile); +} + +static void cifs_free_subrequest(struct netfs_io_subrequest *subreq) +{ + struct cifs_io_subrequest *rdata = + container_of(subreq, struct cifs_io_subrequest, subreq); + int rc = subreq->error; + + if (rdata->subreq.source == NETFS_DOWNLOAD_FROM_SERVER) { +#ifdef CONFIG_CIFS_SMB_DIRECT + if (rdata->mr) { + smbd_deregister_mr(rdata->mr); + rdata->mr = NULL; + } +#endif + } + + add_credits_and_wake_if(rdata->server, &rdata->credits, 0); + if (rdata->have_xid) + free_xid(rdata->xid); +} + +const struct netfs_request_ops cifs_req_ops = { + .request_pool = &cifs_io_request_pool, + .subrequest_pool = &cifs_io_subrequest_pool, + .init_request = cifs_init_request, + .free_request = cifs_free_request, + .free_subrequest = cifs_free_subrequest, + .expand_readahead = cifs_expand_readahead, + .clamp_length = cifs_clamp_length, + .issue_read = cifs_req_issue_read, + .done = cifs_rreq_done, + .post_modify = cifs_post_modify, + .begin_writeback = cifs_begin_writeback, + .prepare_write = cifs_prepare_write, + .issue_write = cifs_issue_write, +}; /* * Remove the dirty flags from a span of pages. diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 298552f5122c..f45d06284f2f 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -302,6 +302,7 @@ struct netfs_request_ops { /* Modification handling */ void (*update_i_size)(struct inode *inode, loff_t i_size); + void (*post_modify)(struct inode *inode); /* Write request handling */ void (*begin_writeback)(struct netfs_io_request *wreq); diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index 4ba553a6d71b..da23484268df 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -112,6 +112,7 @@ #define netfs_sreq_ref_traces \ EM(netfs_sreq_trace_get_copy_to_cache, "GET COPY2C ") \ EM(netfs_sreq_trace_get_resubmit, "GET RESUBMIT") \ + EM(netfs_sreq_trace_get_submit, "GET SUBMIT") \ EM(netfs_sreq_trace_get_short_read, "GET SHORTRD") \ EM(netfs_sreq_trace_new, "NEW ") \ EM(netfs_sreq_trace_put_cancel, "PUT CANCEL ") \
Make add_credits_and_wake_if() clear the amount of credits in the cifs_credits struct after it has returned them to the overall counter. This allows add_credits_and_wake_if() to be called multiple times during the error handling and cleanup without accidentally returning the credits again and again. Note that the wake_up() in add_credits_and_wake_if() may also be superfluous as ->add_credits() also does a wake on the request_q. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/smb/client/cifsglob.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 057a7933b175..704f526a9e81 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -881,11 +881,12 @@ add_credits(struct TCP_Server_Info *server, const struct cifs_credits *credits, static inline void add_credits_and_wake_if(struct TCP_Server_Info *server, - const struct cifs_credits *credits, const int optype) + struct cifs_credits *credits, const int optype) { if (credits->value) { server->ops->add_credits(server, credits, optype); wake_up(&server->request_q); + credits->value = 0; } }
Add mempools for the allocation of cifs_io_request and cifs_io_subrequest structs for netfslib to use so that it can guarantee eventual allocation in writeback. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsfs.c | 55 +++++++++++++++++++++++++++++++++++++++- fs/smb/client/cifsglob.h | 2 ++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index 2dd29663dab1..d8c31383752a 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -370,9 +370,13 @@ static struct kmem_cache *cifs_inode_cachep; static struct kmem_cache *cifs_req_cachep; static struct kmem_cache *cifs_mid_cachep; static struct kmem_cache *cifs_sm_req_cachep; +static struct kmem_cache *cifs_io_request_cachep; +static struct kmem_cache *cifs_io_subrequest_cachep; mempool_t *cifs_sm_req_poolp; mempool_t *cifs_req_poolp; mempool_t *cifs_mid_poolp; +mempool_t cifs_io_request_pool; +mempool_t cifs_io_subrequest_pool; static struct inode * cifs_alloc_inode(struct super_block *sb) @@ -1746,6 +1750,48 @@ static void destroy_mids(void) kmem_cache_destroy(cifs_mid_cachep); } +static int cifs_init_netfs(void) +{ + cifs_io_request_cachep = + kmem_cache_create("cifs_io_request", + sizeof(struct netfs_io_request), 0, + SLAB_HWCACHE_ALIGN, NULL); + if (!cifs_io_request_cachep) + goto nomem_req; + + if (mempool_init_slab_pool(&cifs_io_request_pool, 100, cifs_io_request_cachep) < 0) + goto nomem_reqpool; + + cifs_io_subrequest_cachep = + kmem_cache_create("cifs_io_subrequest", + sizeof(struct cifs_io_subrequest), 0, + SLAB_HWCACHE_ALIGN, NULL); + if (!cifs_io_subrequest_cachep) + goto nomem_subreq; + + if (mempool_init_slab_pool(&cifs_io_subrequest_pool, 100, cifs_io_subrequest_cachep) < 0) + goto nomem_subreqpool; + + return 0; + +nomem_subreqpool: + kmem_cache_destroy(cifs_io_subrequest_cachep); +nomem_subreq: + mempool_destroy(&cifs_io_request_pool); +nomem_reqpool: + kmem_cache_destroy(cifs_io_request_cachep); +nomem_req: + return -ENOMEM; +} + +static void cifs_destroy_netfs(void) +{ + mempool_destroy(&cifs_io_subrequest_pool); + kmem_cache_destroy(cifs_io_subrequest_cachep); + mempool_destroy(&cifs_io_request_pool); + kmem_cache_destroy(cifs_io_request_cachep); +} + static int __init init_cifs(void) { @@ -1843,10 +1889,14 @@ init_cifs(void) if (rc) goto out_destroy_deferredclose_wq; - rc = init_mids(); + rc = cifs_init_netfs(); if (rc) goto out_destroy_inodecache; + rc = init_mids(); + if (rc) + goto out_destroy_netfs; + rc = cifs_init_request_bufs(); if (rc) goto out_destroy_mids; @@ -1901,6 +1951,8 @@ init_cifs(void) cifs_destroy_request_bufs(); out_destroy_mids: destroy_mids(); +out_destroy_netfs: + cifs_destroy_netfs(); out_destroy_inodecache: cifs_destroy_inodecache(); out_destroy_deferredclose_wq: @@ -1937,6 +1989,7 @@ exit_cifs(void) #endif cifs_destroy_request_bufs(); destroy_mids(); + cifs_destroy_netfs(); cifs_destroy_inodecache(); destroy_workqueue(deferredclose_wq); destroy_workqueue(cifsoplockd_wq); diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 6436d360b9f4..057a7933b175 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -2089,6 +2089,8 @@ extern __u32 cifs_lock_secret; extern mempool_t *cifs_sm_req_poolp; extern mempool_t *cifs_req_poolp; extern mempool_t *cifs_mid_poolp; +extern mempool_t cifs_io_request_pool; +extern mempool_t cifs_io_subrequest_pool; /* Operations for different SMB versions */ #define SMB1_VERSION_STRING "1.0"
Set zero_point in the copy_file_range() and remap_file_range() implementations so that we don't skip reading data modified on a server-side copy. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsfs.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index e01ba9f8706a..2dd29663dab1 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -1283,6 +1283,8 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off, rc = cifs_flush_folio(target_inode, destend, &fstart, &fend, false); if (rc) goto unlock; + if (fend > target_cifsi->netfs.zero_point) + target_cifsi->netfs.zero_point = fend + 1; /* Discard all the folios that overlap the destination region. */ cifs_dbg(FYI, "about to discard pages %llx-%llx\n", fstart, fend); @@ -1301,6 +1303,8 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off, fscache_resize_cookie(cifs_inode_cookie(target_inode), new_size); } + if (rc == 0 && new_size > target_cifsi->netfs.zero_point) + target_cifsi->netfs.zero_point = new_size; } /* force revalidate of size and timestamps of target file now @@ -1392,6 +1396,8 @@ ssize_t cifs_file_copychunk_range(unsigned int xid, rc = cifs_flush_folio(target_inode, destend, &fstart, &fend, false); if (rc) goto unlock; + if (fend > target_cifsi->netfs.zero_point) + target_cifsi->netfs.zero_point = fend + 1; /* Discard all the folios that overlap the destination region. */ truncate_inode_pages_range(&target_inode->i_data, fstart, fend);
Move cifs_loose_read_iter() and cifs_file_write_iter() to file.c so that they are colocated with similar functions rather than being split with cifsfs.c. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsfs.c | 55 ------------------------------------------ fs/smb/client/cifsfs.h | 2 ++ fs/smb/client/file.c | 53 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index aa6f1ecb7c0e..e01ba9f8706a 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -982,61 +982,6 @@ cifs_smb3_do_mount(struct file_system_type *fs_type, return root; } - -static ssize_t -cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter) -{ - ssize_t rc; - struct inode *inode = file_inode(iocb->ki_filp); - - if (iocb->ki_flags & IOCB_DIRECT) - return cifs_user_readv(iocb, iter); - - rc = cifs_revalidate_mapping(inode); - if (rc) - return rc; - - return generic_file_read_iter(iocb, iter); -} - -static ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) -{ - struct inode *inode = file_inode(iocb->ki_filp); - struct cifsInodeInfo *cinode = CIFS_I(inode); - ssize_t written; - int rc; - - if (iocb->ki_filp->f_flags & O_DIRECT) { - written = cifs_user_writev(iocb, from); - if (written > 0 && CIFS_CACHE_READ(cinode)) { - cifs_zap_mapping(inode); - cifs_dbg(FYI, - "Set no oplock for inode=%p after a write operation\n", - inode); - cinode->oplock = 0; - } - return written; - } - - written = cifs_get_writer(cinode); - if (written) - return written; - - written = generic_file_write_iter(iocb, from); - - if (CIFS_CACHE_WRITE(CIFS_I(inode))) - goto out; - - rc = filemap_fdatawrite(inode->i_mapping); - if (rc) - cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n", - rc, inode); - -out: - cifs_put_writer(cinode); - return written; -} - static loff_t cifs_llseek(struct file *file, loff_t offset, int whence) { struct cifsFileInfo *cfile = file->private_data; diff --git a/fs/smb/client/cifsfs.h b/fs/smb/client/cifsfs.h index 1ab7e5998c58..1acf6bfc06de 100644 --- a/fs/smb/client/cifsfs.h +++ b/fs/smb/client/cifsfs.h @@ -99,6 +99,8 @@ extern ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to); extern ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from); extern ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *from); extern ssize_t cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from); +ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from); +ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter); extern int cifs_flock(struct file *pfile, int cmd, struct file_lock *plock); extern int cifs_lock(struct file *, int, struct file_lock *); extern int cifs_fsync(struct file *, loff_t, loff_t, int); diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 6f6459b506d1..e40ba6de0a28 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -4171,6 +4171,59 @@ ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to) return __cifs_readv(iocb, to, false); } +ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + ssize_t rc; + struct inode *inode = file_inode(iocb->ki_filp); + + if (iocb->ki_flags & IOCB_DIRECT) + return cifs_user_readv(iocb, iter); + + rc = cifs_revalidate_mapping(inode); + if (rc) + return rc; + + return generic_file_read_iter(iocb, iter); +} + +ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) +{ + struct inode *inode = file_inode(iocb->ki_filp); + struct cifsInodeInfo *cinode = CIFS_I(inode); + ssize_t written; + int rc; + + if (iocb->ki_filp->f_flags & O_DIRECT) { + written = cifs_user_writev(iocb, from); + if (written > 0 && CIFS_CACHE_READ(cinode)) { + cifs_zap_mapping(inode); + cifs_dbg(FYI, + "Set no oplock for inode=%p after a write operation\n", + inode); + cinode->oplock = 0; + } + return written; + } + + written = cifs_get_writer(cinode); + if (written) + return written; + + written = generic_file_write_iter(iocb, from); + + if (CIFS_CACHE_WRITE(CIFS_I(inode))) + goto out; + + rc = filemap_fdatawrite(inode->i_mapping); + if (rc) + cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n", + rc, inode); + +out: + cifs_put_writer(cinode); + return written; +} + ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to) {
Replace the 'replay' bool in cifs_writedata (now cifs_io_subrequest) with a flag in the netfs_io_subrequest flags. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/file.c | 2 +- fs/smb/client/smb2pdu.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 76bfefa9b669..6f6459b506d1 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -3246,7 +3246,7 @@ cifs_resend_wdata(struct cifs_io_subrequest *wdata, struct list_head *wdata_list if (wdata->cfile->invalidHandle) rc = -EAGAIN; else { - wdata->replay = true; + set_bit(NETFS_SREQ_RETRYING, &wdata->subreq.flags); #ifdef CONFIG_CIFS_SMB_DIRECT if (wdata->mr) { wdata->mr->need_invalidate = true; diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index ddd69db1f0a8..2e29c6c2dca6 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -4819,7 +4819,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) struct cifs_io_parms *io_parms = NULL; int credit_request; - if (!wdata->server || wdata->replay) + if (!wdata->server || test_bit(NETFS_SREQ_RETRYING, &wdata->subreq.flags)) server = wdata->server = cifs_pick_channel(tcon->ses); /* @@ -4904,7 +4904,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) rqst.rq_nvec = 1; rqst.rq_iter = wdata->subreq.io_iter; rqst.rq_iter_size = iov_iter_count(&rqst.rq_iter); - if (wdata->replay) + if (test_bit(NETFS_SREQ_RETRYING, &wdata->subreq.flags)) smb2_set_replay(server, &rqst); #ifdef CONFIG_CIFS_SMB_DIRECT if (wdata->mr)
Make the wait_mtu_credits functions use size_t for the size and num arguments rather than unsigned int as netfslib uses size_t/ssize_t for arguments and return values to allow for extra capacity. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: linux-cachefs@redhat.com cc: netfs@lists.linux.dev cc: linux-mm@kvack.org --- fs/smb/client/cifsglob.h | 4 ++-- fs/smb/client/cifsproto.h | 2 +- fs/smb/client/file.c | 17 ++++++++++------- fs/smb/client/smb2ops.c | 4 ++-- fs/smb/client/transport.c | 4 ++-- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index ff86ab3d6166..6436d360b9f4 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -546,8 +546,8 @@ struct smb_version_operations { /* writepages retry size */ unsigned int (*wp_retry_size)(struct inode *); /* get mtu credits */ - int (*wait_mtu_credits)(struct TCP_Server_Info *, unsigned int, - unsigned int *, struct cifs_credits *); + int (*wait_mtu_credits)(struct TCP_Server_Info *, size_t, + size_t *, struct cifs_credits *); /* adjust previously taken mtu credits to request size */ int (*adjust_credits)(struct TCP_Server_Info *server, struct cifs_credits *credits, diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 010601a89fe5..95b5fa385196 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -121,7 +121,7 @@ extern struct mid_q_entry *cifs_setup_async_request(struct TCP_Server_Info *, extern int cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server, bool log_error); extern int cifs_wait_mtu_credits(struct TCP_Server_Info *server, - unsigned int size, unsigned int *num, + size_t size, size_t *num, struct cifs_credits *credits); extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *, struct kvec *, int /* nvec to send */, diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index c5850a1c484f..76bfefa9b669 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2704,7 +2704,8 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, struct cifs_credits *credits = &credits_on_stack; struct cifsFileInfo *cfile = NULL; unsigned long long i_size = i_size_read(inode), max_len; - unsigned int xid, wsize; + unsigned int xid; + size_t wsize; size_t len = folio_size(folio); long count = wbc->nr_to_write; int rc; @@ -3206,7 +3207,7 @@ static int cifs_resend_wdata(struct cifs_io_subrequest *wdata, struct list_head *wdata_list, struct cifs_aio_ctx *ctx) { - unsigned int wsize; + size_t wsize; struct cifs_credits credits; int rc; struct TCP_Server_Info *server = wdata->server; @@ -3341,7 +3342,8 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, do { struct cifs_credits credits_on_stack; struct cifs_credits *credits = &credits_on_stack; - unsigned int wsize, nsegs = 0; + unsigned int nsegs = 0; + size_t wsize; if (signal_pending(current)) { rc = -EINTR; @@ -3778,7 +3780,7 @@ static int cifs_resend_rdata(struct cifs_io_subrequest *rdata, struct list_head *rdata_list, struct cifs_aio_ctx *ctx) { - unsigned int rsize; + size_t rsize; struct cifs_credits credits; int rc; struct TCP_Server_Info *server; @@ -3852,10 +3854,10 @@ cifs_send_async_read(loff_t fpos, size_t len, struct cifsFileInfo *open_file, struct cifs_aio_ctx *ctx) { struct cifs_io_subrequest *rdata; - unsigned int rsize, nsegs, max_segs = INT_MAX; + unsigned int nsegs, max_segs = INT_MAX; struct cifs_credits credits_on_stack; struct cifs_credits *credits = &credits_on_stack; - size_t cur_len, max_len; + size_t cur_len, max_len, rsize; int rc; pid_t pid; struct TCP_Server_Info *server; @@ -4451,12 +4453,13 @@ static void cifs_readahead(struct readahead_control *ractl) * Chop the readahead request up into rsize-sized read requests. */ while ((nr_pages = ra_pages)) { - unsigned int i, rsize; + unsigned int i; struct cifs_io_subrequest *rdata; struct cifs_credits credits_on_stack; struct cifs_credits *credits = &credits_on_stack; struct folio *folio; pgoff_t fsize; + size_t rsize; /* * Find out if we have anything cached in the range of diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index b185b07ea86b..2413006e5f39 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -217,8 +217,8 @@ smb2_get_credits(struct mid_q_entry *mid) } static int -smb2_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size, - unsigned int *num, struct cifs_credits *credits) +smb2_wait_mtu_credits(struct TCP_Server_Info *server, size_t size, + size_t *num, struct cifs_credits *credits) { int rc = 0; unsigned int scredits, in_flight; diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index e52967de59e6..5a69a7430ffa 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -691,8 +691,8 @@ wait_for_compound_request(struct TCP_Server_Info *server, int num, } int -cifs_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size, - unsigned int *num, struct cifs_credits *credits) +cifs_wait_mtu_credits(struct TCP_Server_Info *server, size_t size, + size_t *num, struct cifs_credits *credits) { *num = size; credits->value = 0;
Use more fields from netfs_io_subrequest instead of those incorporated into cifs_io_subrequest from cifs_readdata and cifs_writedata. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsglob.h | 3 - fs/smb/client/cifssmb.c | 52 +++++++++--------- fs/smb/client/file.c | 112 +++++++++++++++++++------------------- fs/smb/client/smb2ops.c | 4 +- fs/smb/client/smb2pdu.c | 52 +++++++++--------- fs/smb/client/transport.c | 6 +- 6 files changed, 113 insertions(+), 116 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 99c235bac554..ff86ab3d6166 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -1510,9 +1510,6 @@ struct cifs_io_subrequest { struct list_head list; struct completion done; struct work_struct work; - struct iov_iter iter; - __u64 offset; - unsigned int bytes; }; /* diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index c84f2991c93a..72962985bac5 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -1269,12 +1269,12 @@ cifs_readv_callback(struct mid_q_entry *mid) struct TCP_Server_Info *server = tcon->ses->server; struct smb_rqst rqst = { .rq_iov = rdata->iov, .rq_nvec = 2, - .rq_iter = rdata->iter }; + .rq_iter = rdata->subreq.io_iter }; struct cifs_credits credits = { .value = 1, .instance = 0 }; - cifs_dbg(FYI, "%s: mid=%llu state=%d result=%d bytes=%u\n", + cifs_dbg(FYI, "%s: mid=%llu state=%d result=%d bytes=%zu\n", __func__, mid->mid, mid->mid_state, rdata->result, - rdata->bytes); + rdata->subreq.len); switch (mid->mid_state) { case MID_RESPONSE_RECEIVED: @@ -1322,14 +1322,14 @@ cifs_async_readv(struct cifs_io_subrequest *rdata) struct smb_rqst rqst = { .rq_iov = rdata->iov, .rq_nvec = 2 }; - cifs_dbg(FYI, "%s: offset=%llu bytes=%u\n", - __func__, rdata->offset, rdata->bytes); + cifs_dbg(FYI, "%s: offset=%llu bytes=%zu\n", + __func__, rdata->subreq.start, rdata->subreq.len); if (tcon->ses->capabilities & CAP_LARGE_FILES) wct = 12; else { wct = 10; /* old style read */ - if ((rdata->offset >> 32) > 0) { + if ((rdata->subreq.start >> 32) > 0) { /* can not handle this big offset for old */ return -EIO; } @@ -1344,12 +1344,12 @@ cifs_async_readv(struct cifs_io_subrequest *rdata) smb->AndXCommand = 0xFF; /* none */ smb->Fid = rdata->cfile->fid.netfid; - smb->OffsetLow = cpu_to_le32(rdata->offset & 0xFFFFFFFF); + smb->OffsetLow = cpu_to_le32(rdata->subreq.start & 0xFFFFFFFF); if (wct == 12) - smb->OffsetHigh = cpu_to_le32(rdata->offset >> 32); + smb->OffsetHigh = cpu_to_le32(rdata->subreq.start >> 32); smb->Remaining = 0; - smb->MaxCount = cpu_to_le16(rdata->bytes & 0xFFFF); - smb->MaxCountHigh = cpu_to_le32(rdata->bytes >> 16); + smb->MaxCount = cpu_to_le16(rdata->subreq.len & 0xFFFF); + smb->MaxCountHigh = cpu_to_le32(rdata->subreq.len >> 16); if (wct == 12) smb->ByteCount = 0; else { @@ -1633,13 +1633,13 @@ cifs_writev_callback(struct mid_q_entry *mid) * client. OS/2 servers are known to set incorrect * CountHigh values. */ - if (written > wdata->bytes) + if (written > wdata->subreq.len) written &= 0xFFFF; - if (written < wdata->bytes) + if (written < wdata->subreq.len) wdata->result = -ENOSPC; else - wdata->bytes = written; + wdata->subreq.len = written; break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: @@ -1670,7 +1670,7 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) wct = 14; } else { wct = 12; - if (wdata->offset >> 32 > 0) { + if (wdata->subreq.start >> 32 > 0) { /* can not handle big offset for old srv */ return -EIO; } @@ -1685,9 +1685,9 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) smb->AndXCommand = 0xFF; /* none */ smb->Fid = wdata->cfile->fid.netfid; - smb->OffsetLow = cpu_to_le32(wdata->offset & 0xFFFFFFFF); + smb->OffsetLow = cpu_to_le32(wdata->subreq.start & 0xFFFFFFFF); if (wct == 14) - smb->OffsetHigh = cpu_to_le32(wdata->offset >> 32); + smb->OffsetHigh = cpu_to_le32(wdata->subreq.start >> 32); smb->Reserved = 0xFFFFFFFF; smb->WriteMode = 0; smb->Remaining = 0; @@ -1703,24 +1703,24 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) rqst.rq_iov = iov; rqst.rq_nvec = 2; - rqst.rq_iter = wdata->iter; - rqst.rq_iter_size = iov_iter_count(&wdata->iter); + rqst.rq_iter = wdata->subreq.io_iter; + rqst.rq_iter_size = iov_iter_count(&wdata->subreq.io_iter); - cifs_dbg(FYI, "async write at %llu %u bytes\n", - wdata->offset, wdata->bytes); + cifs_dbg(FYI, "async write at %llu %zu bytes\n", + wdata->subreq.start, wdata->subreq.len); - smb->DataLengthLow = cpu_to_le16(wdata->bytes & 0xFFFF); - smb->DataLengthHigh = cpu_to_le16(wdata->bytes >> 16); + smb->DataLengthLow = cpu_to_le16(wdata->subreq.len & 0xFFFF); + smb->DataLengthHigh = cpu_to_le16(wdata->subreq.len >> 16); if (wct == 14) { - inc_rfc1001_len(&smb->hdr, wdata->bytes + 1); - put_bcc(wdata->bytes + 1, &smb->hdr); + inc_rfc1001_len(&smb->hdr, wdata->subreq.len + 1); + put_bcc(wdata->subreq.len + 1, &smb->hdr); } else { /* wct == 12 */ struct smb_com_writex_req *smbw = (struct smb_com_writex_req *)smb; - inc_rfc1001_len(&smbw->hdr, wdata->bytes + 5); - put_bcc(wdata->bytes + 5, &smbw->hdr); + inc_rfc1001_len(&smbw->hdr, wdata->subreq.len + 5); + put_bcc(wdata->subreq.len + 5, &smbw->hdr); iov[1].iov_len += 4; /* pad bigger by four bytes */ } diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 32c36947c515..c5850a1c484f 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2458,8 +2458,8 @@ cifs_writev_requeue(struct cifs_io_subrequest *wdata) int rc = 0; struct inode *inode = d_inode(wdata->cfile->dentry); struct TCP_Server_Info *server; - unsigned int rest_len = wdata->bytes; - loff_t fpos = wdata->offset; + unsigned int rest_len = wdata->subreq.len; + loff_t fpos = wdata->subreq.start; server = tlink_tcon(wdata->cfile->tlink)->ses->server; do { @@ -2484,14 +2484,14 @@ cifs_writev_requeue(struct cifs_io_subrequest *wdata) } wdata2->sync_mode = wdata->sync_mode; - wdata2->offset = fpos; - wdata2->bytes = cur_len; - wdata2->iter = wdata->iter; + wdata2->subreq.start = fpos; + wdata2->subreq.len = cur_len; + wdata2->subreq.io_iter = wdata->subreq.io_iter; - iov_iter_advance(&wdata2->iter, fpos - wdata->offset); - iov_iter_truncate(&wdata2->iter, wdata2->bytes); + iov_iter_advance(&wdata2->subreq.io_iter, fpos - wdata->subreq.start); + iov_iter_truncate(&wdata2->subreq.io_iter, wdata2->subreq.len); - if (iov_iter_is_xarray(&wdata2->iter)) + if (iov_iter_is_xarray(&wdata2->subreq.io_iter)) /* Check for pages having been redirtied and clean * them. We can do this by walking the xarray. If * it's not an xarray, then it's a DIO and we shouldn't @@ -2525,7 +2525,7 @@ cifs_writev_requeue(struct cifs_io_subrequest *wdata) } while (rest_len > 0); /* Clean up remaining pages from the original wdata */ - if (iov_iter_is_xarray(&wdata->iter)) + if (iov_iter_is_xarray(&wdata->subreq.io_iter)) cifs_pages_write_failed(inode, fpos, rest_len); if (rc != 0 && !is_retryable_error(rc)) @@ -2542,19 +2542,19 @@ cifs_writev_complete(struct work_struct *work) if (wdata->result == 0) { spin_lock(&inode->i_lock); - cifs_update_eof(CIFS_I(inode), wdata->offset, wdata->bytes); + cifs_update_eof(CIFS_I(inode), wdata->subreq.start, wdata->subreq.len); spin_unlock(&inode->i_lock); cifs_stats_bytes_written(tlink_tcon(wdata->cfile->tlink), - wdata->bytes); + wdata->subreq.len); } else if (wdata->sync_mode == WB_SYNC_ALL && wdata->result == -EAGAIN) return cifs_writev_requeue(wdata); if (wdata->result == -EAGAIN) - cifs_pages_write_redirty(inode, wdata->offset, wdata->bytes); + cifs_pages_write_redirty(inode, wdata->subreq.start, wdata->subreq.len); else if (wdata->result < 0) - cifs_pages_write_failed(inode, wdata->offset, wdata->bytes); + cifs_pages_write_failed(inode, wdata->subreq.start, wdata->subreq.len); else - cifs_pages_written_back(inode, wdata->offset, wdata->bytes); + cifs_pages_written_back(inode, wdata->subreq.start, wdata->subreq.len); if (wdata->result != -EAGAIN) mapping_set_error(inode->i_mapping, wdata->result); @@ -2737,7 +2737,7 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, } wdata->sync_mode = wbc->sync_mode; - wdata->offset = folio_pos(folio); + wdata->subreq.start = folio_pos(folio); wdata->pid = cfile->pid; wdata->credits = credits_on_stack; wdata->cfile = cfile; @@ -2778,13 +2778,13 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, * have been unlocked. */ folio_unlock(folio); - wdata->bytes = len; + wdata->subreq.len = len; if (start < i_size) { - iov_iter_xarray(&wdata->iter, ITER_SOURCE, &mapping->i_pages, + iov_iter_xarray(&wdata->subreq.io_iter, ITER_SOURCE, &mapping->i_pages, start, len); - rc = adjust_credits(wdata->server, &wdata->credits, wdata->bytes); + rc = adjust_credits(wdata->server, &wdata->credits, wdata->subreq.len); if (rc) goto err_wdata; @@ -3191,7 +3191,7 @@ cifs_uncached_writev_complete(struct work_struct *work) struct cifsInodeInfo *cifsi = CIFS_I(inode); spin_lock(&inode->i_lock); - cifs_update_eof(cifsi, wdata->offset, wdata->bytes); + cifs_update_eof(cifsi, wdata->subreq.start, wdata->subreq.len); if (cifsi->netfs.remote_i_size > inode->i_size) i_size_write(inode, cifsi->netfs.remote_i_size); spin_unlock(&inode->i_lock); @@ -3227,19 +3227,19 @@ cifs_resend_wdata(struct cifs_io_subrequest *wdata, struct list_head *wdata_list * segments */ do { - rc = server->ops->wait_mtu_credits(server, wdata->bytes, + rc = server->ops->wait_mtu_credits(server, wdata->subreq.len, &wsize, &credits); if (rc) goto fail; - if (wsize < wdata->bytes) { + if (wsize < wdata->subreq.len) { add_credits_and_wake_if(server, &credits, 0); msleep(1000); } - } while (wsize < wdata->bytes); + } while (wsize < wdata->subreq.len); wdata->credits = credits; - rc = adjust_credits(server, &wdata->credits, wdata->bytes); + rc = adjust_credits(server, &wdata->credits, wdata->subreq.len); if (!rc) { if (wdata->cfile->invalidHandle) @@ -3386,19 +3386,19 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, wdata->uncached = true; wdata->sync_mode = WB_SYNC_ALL; - wdata->offset = (__u64)fpos; + wdata->subreq.start = (__u64)fpos; wdata->cfile = cifsFileInfo_get(open_file); wdata->server = server; wdata->pid = pid; - wdata->bytes = cur_len; + wdata->subreq.len = cur_len; wdata->credits = credits_on_stack; - wdata->iter = *from; + wdata->subreq.io_iter = *from; wdata->ctx = ctx; kref_get(&ctx->refcount); - iov_iter_truncate(&wdata->iter, cur_len); + iov_iter_truncate(&wdata->subreq.io_iter, cur_len); - rc = adjust_credits(server, &wdata->credits, wdata->bytes); + rc = adjust_credits(server, &wdata->credits, wdata->subreq.len); if (!rc) { if (wdata->cfile->invalidHandle) @@ -3460,7 +3460,7 @@ static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) if (wdata->result) rc = wdata->result; else - ctx->total_len += wdata->bytes; + ctx->total_len += wdata->subreq.len; /* resend call if it's a retryable error */ if (rc == -EAGAIN) { @@ -3475,10 +3475,10 @@ static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) wdata, &tmp_list, ctx); else { iov_iter_advance(&tmp_from, - wdata->offset - ctx->pos); + wdata->subreq.start - ctx->pos); - rc = cifs_write_from_iter(wdata->offset, - wdata->bytes, &tmp_from, + rc = cifs_write_from_iter(wdata->subreq.start, + wdata->subreq.len, &tmp_from, ctx->cfile, cifs_sb, &tmp_list, ctx); @@ -3801,20 +3801,20 @@ static int cifs_resend_rdata(struct cifs_io_subrequest *rdata, * segments */ do { - rc = server->ops->wait_mtu_credits(server, rdata->bytes, + rc = server->ops->wait_mtu_credits(server, rdata->subreq.len, &rsize, &credits); if (rc) goto fail; - if (rsize < rdata->bytes) { + if (rsize < rdata->subreq.len) { add_credits_and_wake_if(server, &credits, 0); msleep(1000); } - } while (rsize < rdata->bytes); + } while (rsize < rdata->subreq.len); rdata->credits = credits; - rc = adjust_credits(server, &rdata->credits, rdata->bytes); + rc = adjust_credits(server, &rdata->credits, rdata->subreq.len); if (!rc) { if (rdata->cfile->invalidHandle) rc = -EAGAIN; @@ -3912,17 +3912,17 @@ cifs_send_async_read(loff_t fpos, size_t len, struct cifsFileInfo *open_file, rdata->server = server; rdata->cfile = cifsFileInfo_get(open_file); - rdata->offset = fpos; - rdata->bytes = cur_len; + rdata->subreq.start = fpos; + rdata->subreq.len = cur_len; rdata->pid = pid; rdata->credits = credits_on_stack; rdata->ctx = ctx; kref_get(&ctx->refcount); - rdata->iter = ctx->iter; - iov_iter_truncate(&rdata->iter, cur_len); + rdata->subreq.io_iter = ctx->iter; + iov_iter_truncate(&rdata->subreq.io_iter, cur_len); - rc = adjust_credits(server, &rdata->credits, rdata->bytes); + rc = adjust_credits(server, &rdata->credits, rdata->subreq.len); if (!rc) { if (rdata->cfile->invalidHandle) @@ -3992,8 +3992,8 @@ collect_uncached_read_data(struct cifs_aio_ctx *ctx) &tmp_list, ctx); } else { rc = cifs_send_async_read( - rdata->offset + got_bytes, - rdata->bytes - got_bytes, + rdata->subreq.start + got_bytes, + rdata->subreq.len - got_bytes, rdata->cfile, cifs_sb, &tmp_list, ctx); @@ -4007,7 +4007,7 @@ collect_uncached_read_data(struct cifs_aio_ctx *ctx) rc = rdata->result; /* if there was a short read -- discard anything left */ - if (rdata->got_bytes && rdata->got_bytes < rdata->bytes) + if (rdata->got_bytes && rdata->got_bytes < rdata->subreq.len) rc = -ENODATA; ctx->total_len += rdata->got_bytes; @@ -4391,16 +4391,16 @@ static void cifs_readahead_complete(struct work_struct *work) pgoff_t last; bool good = rdata->result == 0 || (rdata->result == -EAGAIN && rdata->got_bytes); - XA_STATE(xas, &rdata->mapping->i_pages, rdata->offset / PAGE_SIZE); + XA_STATE(xas, &rdata->mapping->i_pages, rdata->subreq.start / PAGE_SIZE); if (good) cifs_readahead_to_fscache(rdata->mapping->host, - rdata->offset, rdata->bytes); + rdata->subreq.start, rdata->subreq.len); - if (iov_iter_count(&rdata->iter) > 0) - iov_iter_zero(iov_iter_count(&rdata->iter), &rdata->iter); + if (iov_iter_count(&rdata->subreq.io_iter) > 0) + iov_iter_zero(iov_iter_count(&rdata->subreq.io_iter), &rdata->subreq.io_iter); - last = (rdata->offset + rdata->bytes - 1) / PAGE_SIZE; + last = (rdata->subreq.start + rdata->subreq.len - 1) / PAGE_SIZE; rcu_read_lock(); xas_for_each(&xas, folio, last) { @@ -4539,8 +4539,8 @@ static void cifs_readahead(struct readahead_control *ractl) break; } - rdata->offset = ra_index * PAGE_SIZE; - rdata->bytes = nr_pages * PAGE_SIZE; + rdata->subreq.start = ra_index * PAGE_SIZE; + rdata->subreq.len = nr_pages * PAGE_SIZE; rdata->cfile = cifsFileInfo_get(open_file); rdata->server = server; rdata->mapping = ractl->mapping; @@ -4554,10 +4554,10 @@ static void cifs_readahead(struct readahead_control *ractl) ra_pages -= nr_pages; ra_index += nr_pages; - iov_iter_xarray(&rdata->iter, ITER_DEST, &rdata->mapping->i_pages, - rdata->offset, rdata->bytes); + iov_iter_xarray(&rdata->subreq.io_iter, ITER_DEST, &rdata->mapping->i_pages, + rdata->subreq.start, rdata->subreq.len); - rc = adjust_credits(server, &rdata->credits, rdata->bytes); + rc = adjust_credits(server, &rdata->credits, rdata->subreq.len); if (!rc) { if (rdata->cfile->invalidHandle) rc = -EAGAIN; @@ -4568,8 +4568,8 @@ static void cifs_readahead(struct readahead_control *ractl) if (rc) { add_credits_and_wake_if(server, &rdata->credits, 0); cifs_unlock_folios(rdata->mapping, - rdata->offset / PAGE_SIZE, - (rdata->offset + rdata->bytes - 1) / PAGE_SIZE); + rdata->subreq.start / PAGE_SIZE, + (rdata->subreq.start + rdata->subreq.len - 1) / PAGE_SIZE); /* Fallback to the readpage in error/reconnect cases */ cifs_put_readdata(rdata); break; diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 072230d5b19b..b185b07ea86b 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -4584,7 +4584,7 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid, /* Copy the data to the output I/O iterator. */ rdata->result = cifs_copy_pages_to_iter(pages, pages_len, - cur_off, &rdata->iter); + cur_off, &rdata->subreq.io_iter); if (rdata->result != 0) { if (is_offloaded) mid->mid_state = MID_RESPONSE_MALFORMED; @@ -4598,7 +4598,7 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid, /* read response payload is in buf */ WARN_ONCE(pages && !xa_empty(pages), "read data can be either in buf or in pages"); - length = copy_to_iter(buf + data_offset, data_len, &rdata->iter); + length = copy_to_iter(buf + data_offset, data_len, &rdata->subreq.io_iter); if (length < 0) return length; rdata->got_bytes = data_len; diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index f2f7e107fab4..ddd69db1f0a8 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -4421,7 +4421,7 @@ smb2_new_read_req(void **buf, unsigned int *total_len, struct smbd_buffer_descriptor_v1 *v1; bool need_invalidate = server->dialect == SMB30_PROT_ID; - rdata->mr = smbd_register_mr(server->smbd_conn, &rdata->iter, + rdata->mr = smbd_register_mr(server->smbd_conn, &rdata->subreq.io_iter, true, need_invalidate); if (!rdata->mr) return -EAGAIN; @@ -4481,17 +4481,17 @@ smb2_readv_callback(struct mid_q_entry *mid) struct smb_rqst rqst = { .rq_iov = &rdata->iov[1], .rq_nvec = 1 }; if (rdata->got_bytes) { - rqst.rq_iter = rdata->iter; - rqst.rq_iter_size = iov_iter_count(&rdata->iter); + rqst.rq_iter = rdata->subreq.io_iter; + rqst.rq_iter_size = iov_iter_count(&rdata->subreq.io_iter); } WARN_ONCE(rdata->server != mid->server, "rdata server %p != mid server %p", rdata->server, mid->server); - cifs_dbg(FYI, "%s: mid=%llu state=%d result=%d bytes=%u\n", + cifs_dbg(FYI, "%s: mid=%llu state=%d result=%d bytes=%zu\n", __func__, mid->mid, mid->mid_state, rdata->result, - rdata->bytes); + rdata->subreq.len); switch (mid->mid_state) { case MID_RESPONSE_RECEIVED: @@ -4544,13 +4544,13 @@ smb2_readv_callback(struct mid_q_entry *mid) cifs_stats_fail_inc(tcon, SMB2_READ_HE); trace_smb3_read_err(0 /* xid */, rdata->cfile->fid.persistent_fid, - tcon->tid, tcon->ses->Suid, rdata->offset, - rdata->bytes, rdata->result); + tcon->tid, tcon->ses->Suid, rdata->subreq.start, + rdata->subreq.len, rdata->result); } else trace_smb3_read_done(0 /* xid */, rdata->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, - rdata->offset, rdata->got_bytes); + rdata->subreq.start, rdata->got_bytes); queue_work(cifsiod_wq, &rdata->work); release_mid(mid); @@ -4572,16 +4572,16 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) unsigned int total_len; int credit_request; - cifs_dbg(FYI, "%s: offset=%llu bytes=%u\n", - __func__, rdata->offset, rdata->bytes); + cifs_dbg(FYI, "%s: offset=%llu bytes=%zu\n", + __func__, rdata->subreq.start, rdata->subreq.len); if (!rdata->server) rdata->server = cifs_pick_channel(tcon->ses); io_parms.tcon = tlink_tcon(rdata->cfile->tlink); io_parms.server = server = rdata->server; - io_parms.offset = rdata->offset; - io_parms.length = rdata->bytes; + io_parms.offset = rdata->subreq.start; + io_parms.length = rdata->subreq.len; io_parms.persistent_fid = rdata->cfile->fid.persistent_fid; io_parms.volatile_fid = rdata->cfile->fid.volatile_fid; io_parms.pid = rdata->pid; @@ -4600,7 +4600,7 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) shdr = (struct smb2_hdr *)buf; if (rdata->credits.value > 0) { - shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(rdata->bytes, + shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(rdata->subreq.len, SMB2_MAX_BUFFER_SIZE)); credit_request = le16_to_cpu(shdr->CreditCharge) + 8; if (server->credits >= server->max_credits) @@ -4610,7 +4610,7 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) min_t(int, server->max_credits - server->credits, credit_request)); - rc = adjust_credits(server, &rdata->credits, rdata->bytes); + rc = adjust_credits(server, &rdata->credits, rdata->subreq.len); if (rc) goto async_readv_out; @@ -4750,13 +4750,13 @@ smb2_writev_callback(struct mid_q_entry *mid) * client. OS/2 servers are known to set incorrect * CountHigh values. */ - if (written > wdata->bytes) + if (written > wdata->subreq.len) written &= 0xFFFF; - if (written < wdata->bytes) + if (written < wdata->subreq.len) wdata->result = -ENOSPC; else - wdata->bytes = written; + wdata->subreq.len = written; break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: @@ -4787,8 +4787,8 @@ smb2_writev_callback(struct mid_q_entry *mid) cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); trace_smb3_write_err(0 /* no xid */, wdata->cfile->fid.persistent_fid, - tcon->tid, tcon->ses->Suid, wdata->offset, - wdata->bytes, wdata->result); + tcon->tid, tcon->ses->Suid, wdata->subreq.start, + wdata->subreq.len, wdata->result); if (wdata->result == -ENOSPC) pr_warn_once("Out of space writing to %s\n", tcon->tree_name); @@ -4796,7 +4796,7 @@ smb2_writev_callback(struct mid_q_entry *mid) trace_smb3_write_done(0 /* no xid */, wdata->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, - wdata->offset, wdata->bytes); + wdata->subreq.start, wdata->subreq.len); queue_work(cifsiod_wq, &wdata->work); release_mid(mid); @@ -4829,8 +4829,8 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) _io_parms = (struct cifs_io_parms) { .tcon = tcon, .server = server, - .offset = wdata->offset, - .length = wdata->bytes, + .offset = wdata->subreq.start, + .length = wdata->subreq.len, .persistent_fid = wdata->cfile->fid.persistent_fid, .volatile_fid = wdata->cfile->fid.volatile_fid, .pid = wdata->pid, @@ -4872,10 +4872,10 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) */ if (smb3_use_rdma_offload(io_parms)) { struct smbd_buffer_descriptor_v1 *v1; - size_t data_size = iov_iter_count(&wdata->iter); + size_t data_size = iov_iter_count(&wdata->subreq.io_iter); bool need_invalidate = server->dialect == SMB30_PROT_ID; - wdata->mr = smbd_register_mr(server->smbd_conn, &wdata->iter, + wdata->mr = smbd_register_mr(server->smbd_conn, &wdata->subreq.io_iter, false, need_invalidate); if (!wdata->mr) { rc = -EAGAIN; @@ -4902,7 +4902,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) rqst.rq_iov = iov; rqst.rq_nvec = 1; - rqst.rq_iter = wdata->iter; + rqst.rq_iter = wdata->subreq.io_iter; rqst.rq_iter_size = iov_iter_count(&rqst.rq_iter); if (wdata->replay) smb2_set_replay(server, &rqst); @@ -4922,7 +4922,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) #endif if (wdata->credits.value > 0) { - shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(wdata->bytes, + shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(wdata->subreq.len, SMB2_MAX_BUFFER_SIZE)); credit_request = le16_to_cpu(shdr->CreditCharge) + 8; if (server->credits >= server->max_credits) diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index a5bab478e6de..e52967de59e6 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -1702,8 +1702,8 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid) unsigned int buflen = server->pdu_size + HEADER_PREAMBLE_SIZE(server); bool use_rdma_mr = false; - cifs_dbg(FYI, "%s: mid=%llu offset=%llu bytes=%u\n", - __func__, mid->mid, rdata->offset, rdata->bytes); + cifs_dbg(FYI, "%s: mid=%llu offset=%llu bytes=%zu\n", + __func__, mid->mid, rdata->subreq.start, rdata->subreq.len); /* * read the rest of READ_RSP header (sans Data array), or whatever we @@ -1808,7 +1808,7 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid) length = data_len; /* An RDMA read is already done. */ else #endif - length = cifs_read_iter_from_socket(server, &rdata->iter, + length = cifs_read_iter_from_socket(server, &rdata->subreq.io_iter, data_len); if (length > 0) rdata->got_bytes += length;
Replace the cifs_writedata struct with the same wrapper around netfs_io_subrequest that was used to replace cifs_readdata. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsglob.h | 32 +++------------- fs/smb/client/cifsproto.h | 16 ++++++-- fs/smb/client/cifssmb.c | 9 ++--- fs/smb/client/file.c | 79 ++++++++++++++++----------------------- fs/smb/client/smb2pdu.c | 9 ++--- fs/smb/client/smb2proto.h | 3 +- 6 files changed, 59 insertions(+), 89 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 930b2879383a..99c235bac554 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -269,7 +269,6 @@ struct cifs_fattr; struct smb3_fs_context; struct cifs_fid; struct cifs_io_subrequest; -struct cifs_writedata; struct cifs_io_parms; struct cifs_search_info; struct cifsInodeInfo; @@ -452,8 +451,7 @@ struct smb_version_operations { /* async read from the server */ int (*async_readv)(struct cifs_io_subrequest *); /* async write to the server */ - int (*async_writev)(struct cifs_writedata *, - void (*release)(struct kref *)); + int (*async_writev)(struct cifs_io_subrequest *); /* sync read from the server */ int (*sync_read)(const unsigned int, struct cifs_fid *, struct cifs_io_parms *, unsigned int *, char **, @@ -1503,36 +1501,18 @@ struct cifs_io_subrequest { #endif struct cifs_credits credits; - // TODO: Remove following elements - struct list_head list; - struct completion done; - struct work_struct work; - struct iov_iter iter; - __u64 offset; - unsigned int bytes; -}; + enum writeback_sync_modes sync_mode; + bool uncached; + bool replay; + struct bio_vec *bv; -/* asynchronous write support */ -struct cifs_writedata { - struct kref refcount; + // TODO: Remove following elements struct list_head list; struct completion done; - enum writeback_sync_modes sync_mode; struct work_struct work; - struct cifsFileInfo *cfile; - struct cifs_aio_ctx *ctx; struct iov_iter iter; - struct bio_vec *bv; __u64 offset; - pid_t pid; unsigned int bytes; - int result; - struct TCP_Server_Info *server; -#ifdef CONFIG_CIFS_SMB_DIRECT - struct smbd_mr *mr; -#endif - struct cifs_credits credits; - bool replay; }; /* diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index ccb6999dd26f..010601a89fe5 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -611,11 +611,19 @@ static inline void cifs_put_readdata(struct cifs_io_subrequest *rdata) int cifs_async_readv(struct cifs_io_subrequest *rdata); int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid); -int cifs_async_writev(struct cifs_writedata *wdata, - void (*release)(struct kref *kref)); +int cifs_async_writev(struct cifs_io_subrequest *wdata); void cifs_writev_complete(struct work_struct *work); -struct cifs_writedata *cifs_writedata_alloc(work_func_t complete); -void cifs_writedata_release(struct kref *refcount); +struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete); +void cifs_writedata_release(struct cifs_io_subrequest *rdata); +static inline void cifs_get_writedata(struct cifs_io_subrequest *wdata) +{ + refcount_inc(&wdata->subreq.ref); +} +static inline void cifs_put_writedata(struct cifs_io_subrequest *wdata) +{ + if (refcount_dec_and_test(&wdata->subreq.ref)) + cifs_writedata_release(wdata); +} int cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const unsigned char *path, char *pbuf, diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index 014171cc5cf7..c84f2991c93a 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -1612,7 +1612,7 @@ CIFSSMBWrite(const unsigned int xid, struct cifs_io_parms *io_parms, static void cifs_writev_callback(struct mid_q_entry *mid) { - struct cifs_writedata *wdata = mid->callback_data; + struct cifs_io_subrequest *wdata = mid->callback_data; struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); unsigned int written; WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf; @@ -1657,8 +1657,7 @@ cifs_writev_callback(struct mid_q_entry *mid) /* cifs_async_writev - send an async write, and set up mid to handle result */ int -cifs_async_writev(struct cifs_writedata *wdata, - void (*release)(struct kref *kref)) +cifs_async_writev(struct cifs_io_subrequest *wdata) { int rc = -EACCES; WRITE_REQ *smb = NULL; @@ -1725,14 +1724,14 @@ cifs_async_writev(struct cifs_writedata *wdata, iov[1].iov_len += 4; /* pad bigger by four bytes */ } - kref_get(&wdata->refcount); + cifs_get_writedata(wdata); rc = cifs_call_async(tcon->ses->server, &rqst, NULL, cifs_writev_callback, NULL, wdata, 0, NULL); if (rc == 0) cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); else - kref_put(&wdata->refcount, release); + cifs_put_writedata(wdata); async_writev_out: cifs_small_buf_release(smb); diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index d70d3c12bb70..32c36947c515 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2431,10 +2431,10 @@ cifs_get_readable_path(struct cifs_tcon *tcon, const char *name, } void -cifs_writedata_release(struct kref *refcount) +cifs_writedata_release(struct cifs_io_subrequest *wdata) { - struct cifs_writedata *wdata = container_of(refcount, - struct cifs_writedata, refcount); + if (wdata->uncached) + kref_put(&wdata->ctx->refcount, cifs_aio_ctx_release); #ifdef CONFIG_CIFS_SMB_DIRECT if (wdata->mr) { smbd_deregister_mr(wdata->mr); @@ -2453,7 +2453,7 @@ cifs_writedata_release(struct kref *refcount) * possible that the page was redirtied so re-clean the page. */ static void -cifs_writev_requeue(struct cifs_writedata *wdata) +cifs_writev_requeue(struct cifs_io_subrequest *wdata) { int rc = 0; struct inode *inode = d_inode(wdata->cfile->dentry); @@ -2463,7 +2463,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata) server = tlink_tcon(wdata->cfile->tlink)->ses->server; do { - struct cifs_writedata *wdata2; + struct cifs_io_subrequest *wdata2; unsigned int wsize, cur_len; wsize = server->ops->wp_retry_size(inode); @@ -2486,7 +2486,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata) wdata2->sync_mode = wdata->sync_mode; wdata2->offset = fpos; wdata2->bytes = cur_len; - wdata2->iter = wdata->iter; + wdata2->iter = wdata->iter; iov_iter_advance(&wdata2->iter, fpos - wdata->offset); iov_iter_truncate(&wdata2->iter, wdata2->bytes); @@ -2508,11 +2508,10 @@ cifs_writev_requeue(struct cifs_writedata *wdata) rc = -EBADF; } else { wdata2->pid = wdata2->cfile->pid; - rc = server->ops->async_writev(wdata2, - cifs_writedata_release); + rc = server->ops->async_writev(wdata2); } - kref_put(&wdata2->refcount, cifs_writedata_release); + cifs_put_writedata(wdata2); if (rc) { if (is_retryable_error(rc)) continue; @@ -2531,14 +2530,14 @@ cifs_writev_requeue(struct cifs_writedata *wdata) if (rc != 0 && !is_retryable_error(rc)) mapping_set_error(inode->i_mapping, rc); - kref_put(&wdata->refcount, cifs_writedata_release); + cifs_put_writedata(wdata); } void cifs_writev_complete(struct work_struct *work) { - struct cifs_writedata *wdata = container_of(work, - struct cifs_writedata, work); + struct cifs_io_subrequest *wdata = container_of(work, + struct cifs_io_subrequest, work); struct inode *inode = d_inode(wdata->cfile->dentry); if (wdata->result == 0) { @@ -2559,16 +2558,16 @@ cifs_writev_complete(struct work_struct *work) if (wdata->result != -EAGAIN) mapping_set_error(inode->i_mapping, wdata->result); - kref_put(&wdata->refcount, cifs_writedata_release); + cifs_put_writedata(wdata); } -struct cifs_writedata *cifs_writedata_alloc(work_func_t complete) +struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete) { - struct cifs_writedata *wdata; + struct cifs_io_subrequest *wdata; wdata = kzalloc(sizeof(*wdata), GFP_NOFS); if (wdata != NULL) { - kref_init(&wdata->refcount); + refcount_set(&wdata->subreq.ref, 1); INIT_LIST_HEAD(&wdata->list); init_completion(&wdata->done); INIT_WORK(&wdata->work, complete); @@ -2699,7 +2698,7 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, { struct inode *inode = mapping->host; struct TCP_Server_Info *server; - struct cifs_writedata *wdata; + struct cifs_io_subrequest *wdata; struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct cifs_credits credits_on_stack; struct cifs_credits *credits = &credits_on_stack; @@ -2792,10 +2791,9 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, if (wdata->cfile->invalidHandle) rc = -EAGAIN; else - rc = wdata->server->ops->async_writev(wdata, - cifs_writedata_release); + rc = wdata->server->ops->async_writev(wdata); if (rc >= 0) { - kref_put(&wdata->refcount, cifs_writedata_release); + cifs_put_writedata(wdata); goto err_close; } } else { @@ -2805,7 +2803,7 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, } err_wdata: - kref_put(&wdata->refcount, cifs_writedata_release); + cifs_put_writedata(wdata); err_uncredit: add_credits_and_wake_if(server, credits, 0); err_close: @@ -3182,23 +3180,13 @@ int cifs_flush(struct file *file, fl_owner_t id) return rc; } -static void -cifs_uncached_writedata_release(struct kref *refcount) -{ - struct cifs_writedata *wdata = container_of(refcount, - struct cifs_writedata, refcount); - - kref_put(&wdata->ctx->refcount, cifs_aio_ctx_release); - cifs_writedata_release(refcount); -} - static void collect_uncached_write_data(struct cifs_aio_ctx *ctx); static void cifs_uncached_writev_complete(struct work_struct *work) { - struct cifs_writedata *wdata = container_of(work, - struct cifs_writedata, work); + struct cifs_io_subrequest *wdata = container_of(work, + struct cifs_io_subrequest, work); struct inode *inode = d_inode(wdata->cfile->dentry); struct cifsInodeInfo *cifsi = CIFS_I(inode); @@ -3211,11 +3199,11 @@ cifs_uncached_writev_complete(struct work_struct *work) complete(&wdata->done); collect_uncached_write_data(wdata->ctx); /* the below call can possibly free the last ref to aio ctx */ - kref_put(&wdata->refcount, cifs_uncached_writedata_release); + cifs_put_writedata(wdata); } static int -cifs_resend_wdata(struct cifs_writedata *wdata, struct list_head *wdata_list, +cifs_resend_wdata(struct cifs_io_subrequest *wdata, struct list_head *wdata_list, struct cifs_aio_ctx *ctx) { unsigned int wsize; @@ -3265,8 +3253,7 @@ cifs_resend_wdata(struct cifs_writedata *wdata, struct list_head *wdata_list, wdata->mr = NULL; } #endif - rc = server->ops->async_writev(wdata, - cifs_uncached_writedata_release); + rc = server->ops->async_writev(wdata); } } @@ -3281,7 +3268,7 @@ cifs_resend_wdata(struct cifs_writedata *wdata, struct list_head *wdata_list, } while (rc == -EAGAIN); fail: - kref_put(&wdata->refcount, cifs_uncached_writedata_release); + cifs_put_writedata(wdata); return rc; } @@ -3333,7 +3320,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, { int rc = 0; size_t cur_len, max_len; - struct cifs_writedata *wdata; + struct cifs_io_subrequest *wdata; pid_t pid; struct TCP_Server_Info *server; unsigned int xid, max_segs = INT_MAX; @@ -3397,6 +3384,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, break; } + wdata->uncached = true; wdata->sync_mode = WB_SYNC_ALL; wdata->offset = (__u64)fpos; wdata->cfile = cifsFileInfo_get(open_file); @@ -3416,14 +3404,12 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, if (wdata->cfile->invalidHandle) rc = -EAGAIN; else - rc = server->ops->async_writev(wdata, - cifs_uncached_writedata_release); + rc = server->ops->async_writev(wdata); } if (rc) { add_credits_and_wake_if(server, &wdata->credits, 0); - kref_put(&wdata->refcount, - cifs_uncached_writedata_release); + cifs_put_writedata(wdata); if (rc == -EAGAIN) continue; break; @@ -3441,7 +3427,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) { - struct cifs_writedata *wdata, *tmp; + struct cifs_io_subrequest *wdata, *tmp; struct cifs_tcon *tcon; struct cifs_sb_info *cifs_sb; struct dentry *dentry = ctx->cfile->dentry; @@ -3496,8 +3482,7 @@ static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) ctx->cfile, cifs_sb, &tmp_list, ctx); - kref_put(&wdata->refcount, - cifs_uncached_writedata_release); + cifs_put_writedata(wdata); } list_splice(&tmp_list, &ctx->list); @@ -3505,7 +3490,7 @@ static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) } } list_del_init(&wdata->list); - kref_put(&wdata->refcount, cifs_uncached_writedata_release); + cifs_put_writedata(wdata); } cifs_stats_bytes_written(tcon, ctx->total_len); diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 33a7ad4f16bb..f2f7e107fab4 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -4724,7 +4724,7 @@ SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms, static void smb2_writev_callback(struct mid_q_entry *mid) { - struct cifs_writedata *wdata = mid->callback_data; + struct cifs_io_subrequest *wdata = mid->callback_data; struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); struct TCP_Server_Info *server = wdata->server; unsigned int written; @@ -4805,8 +4805,7 @@ smb2_writev_callback(struct mid_q_entry *mid) /* smb2_async_writev - send an async write, and set up mid to handle result */ int -smb2_async_writev(struct cifs_writedata *wdata, - void (*release)(struct kref *kref)) +smb2_async_writev(struct cifs_io_subrequest *wdata) { int rc = -EACCES, flags = 0; struct smb2_write_req *req = NULL; @@ -4940,7 +4939,7 @@ smb2_async_writev(struct cifs_writedata *wdata, flags |= CIFS_HAS_CREDITS; } - kref_get(&wdata->refcount); + cifs_get_writedata(wdata); rc = cifs_call_async(server, &rqst, NULL, smb2_writev_callback, NULL, wdata, flags, &wdata->credits); @@ -4952,7 +4951,7 @@ smb2_async_writev(struct cifs_writedata *wdata, io_parms->offset, io_parms->length, rc); - kref_put(&wdata->refcount, release); + cifs_put_writedata(wdata); cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); } diff --git a/fs/smb/client/smb2proto.h b/fs/smb/client/smb2proto.h index 740053c0118e..c781eaa0cba8 100644 --- a/fs/smb/client/smb2proto.h +++ b/fs/smb/client/smb2proto.h @@ -213,8 +213,7 @@ extern int SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon, extern int smb2_async_readv(struct cifs_io_subrequest *rdata); extern int SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms, unsigned int *nbytes, char **buf, int *buf_type); -extern int smb2_async_writev(struct cifs_writedata *wdata, - void (*release)(struct kref *kref)); +extern int smb2_async_writev(struct cifs_io_subrequest *wdata); extern int SMB2_write(const unsigned int xid, struct cifs_io_parms *io_parms, unsigned int *nbytes, struct kvec *iov, int n_vec); extern int SMB2_echo(struct TCP_Server_Info *server);
Netfslib has a facility whereby the allocation for netfs_io_subrequest can be increased to so that filesystem-specific data can be tagged on the end. Prepare to use this by making a struct, cifs_io_subrequest, that wraps netfs_io_subrequest, and absorb struct cifs_readdata into it. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsglob.h | 22 +++++++++++--------- fs/smb/client/cifsproto.h | 13 ++++++++++-- fs/smb/client/cifssmb.c | 11 ++++------ fs/smb/client/file.c | 44 ++++++++++++++++++--------------------- fs/smb/client/smb2ops.c | 2 +- fs/smb/client/smb2pdu.c | 12 ++++++----- fs/smb/client/smb2proto.h | 2 +- fs/smb/client/transport.c | 4 ++-- 8 files changed, 58 insertions(+), 52 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 7ed9d05f6890..930b2879383a 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -268,7 +268,7 @@ struct dfs_info3_param; struct cifs_fattr; struct smb3_fs_context; struct cifs_fid; -struct cifs_readdata; +struct cifs_io_subrequest; struct cifs_writedata; struct cifs_io_parms; struct cifs_search_info; @@ -450,7 +450,7 @@ struct smb_version_operations { /* send a flush request to the server */ int (*flush)(const unsigned int, struct cifs_tcon *, struct cifs_fid *); /* async read from the server */ - int (*async_readv)(struct cifs_readdata *); + int (*async_readv)(struct cifs_io_subrequest *); /* async write to the server */ int (*async_writev)(struct cifs_writedata *, void (*release)(struct kref *)); @@ -1488,26 +1488,28 @@ struct cifs_aio_ctx { }; /* asynchronous read support */ -struct cifs_readdata { - struct kref refcount; - struct list_head list; - struct completion done; +struct cifs_io_subrequest { + struct netfs_io_subrequest subreq; struct cifsFileInfo *cfile; struct address_space *mapping; struct cifs_aio_ctx *ctx; - __u64 offset; ssize_t got_bytes; - unsigned int bytes; pid_t pid; int result; - struct work_struct work; - struct iov_iter iter; struct kvec iov[2]; struct TCP_Server_Info *server; #ifdef CONFIG_CIFS_SMB_DIRECT struct smbd_mr *mr; #endif struct cifs_credits credits; + + // TODO: Remove following elements + struct list_head list; + struct completion done; + struct work_struct work; + struct iov_iter iter; + __u64 offset; + unsigned int bytes; }; /* asynchronous write support */ diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 0723e1b57256..ccb6999dd26f 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -598,8 +598,17 @@ void __cifs_put_smb_ses(struct cifs_ses *ses); extern struct cifs_ses * cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx); -void cifs_readdata_release(struct kref *refcount); -int cifs_async_readv(struct cifs_readdata *rdata); +void cifs_readdata_release(struct cifs_io_subrequest *rdata); +static inline void cifs_get_readdata(struct cifs_io_subrequest *rdata) +{ + refcount_inc(&rdata->subreq.ref); +} +static inline void cifs_put_readdata(struct cifs_io_subrequest *rdata) +{ + if (refcount_dec_and_test(&rdata->subreq.ref)) + cifs_readdata_release(rdata); +} +int cifs_async_readv(struct cifs_io_subrequest *rdata); int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid); int cifs_async_writev(struct cifs_writedata *wdata, diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index 5aee55551573..014171cc5cf7 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -24,6 +24,8 @@ #include <linux/swap.h> #include <linux/task_io_accounting_ops.h> #include <linux/uaccess.h> +#include <linux/netfs.h> +#include <trace/events/netfs.h> #include "cifspdu.h" #include "cifsfs.h" #include "cifsglob.h" @@ -1262,12 +1264,11 @@ CIFS_open(const unsigned int xid, struct cifs_open_parms *oparms, int *oplock, static void cifs_readv_callback(struct mid_q_entry *mid) { - struct cifs_readdata *rdata = mid->callback_data; + struct cifs_io_subrequest *rdata = mid->callback_data; struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); struct TCP_Server_Info *server = tcon->ses->server; struct smb_rqst rqst = { .rq_iov = rdata->iov, .rq_nvec = 2, - .rq_iter_size = iov_iter_count(&rdata->iter), .rq_iter = rdata->iter }; struct cifs_credits credits = { .value = 1, .instance = 0 }; @@ -1312,7 +1313,7 @@ cifs_readv_callback(struct mid_q_entry *mid) /* cifs_async_readv - send an async write, and set up mid to handle result */ int -cifs_async_readv(struct cifs_readdata *rdata) +cifs_async_readv(struct cifs_io_subrequest *rdata) { int rc; READ_REQ *smb = NULL; @@ -1364,15 +1365,11 @@ cifs_async_readv(struct cifs_readdata *rdata) rdata->iov[1].iov_base = (char *)smb + 4; rdata->iov[1].iov_len = get_rfc1002_length(smb); - kref_get(&rdata->refcount); rc = cifs_call_async(tcon->ses->server, &rqst, cifs_readv_receive, cifs_readv_callback, NULL, rdata, 0, NULL); if (rc == 0) cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); - else - kref_put(&rdata->refcount, cifs_readdata_release); - cifs_small_buf_release(smb); return rc; } diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index f92d4d42e87e..d70d3c12bb70 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -3743,13 +3743,13 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from) return written; } -static struct cifs_readdata *cifs_readdata_alloc(work_func_t complete) +static struct cifs_io_subrequest *cifs_readdata_alloc(work_func_t complete) { - struct cifs_readdata *rdata; + struct cifs_io_subrequest *rdata; rdata = kzalloc(sizeof(*rdata), GFP_KERNEL); if (rdata) { - kref_init(&rdata->refcount); + refcount_set(&rdata->subreq.ref, 1); INIT_LIST_HEAD(&rdata->list); init_completion(&rdata->done); INIT_WORK(&rdata->work, complete); @@ -3759,11 +3759,8 @@ static struct cifs_readdata *cifs_readdata_alloc(work_func_t complete) } void -cifs_readdata_release(struct kref *refcount) +cifs_readdata_release(struct cifs_io_subrequest *rdata) { - struct cifs_readdata *rdata = container_of(refcount, - struct cifs_readdata, refcount); - if (rdata->ctx) kref_put(&rdata->ctx->refcount, cifs_aio_ctx_release); #ifdef CONFIG_CIFS_SMB_DIRECT @@ -3783,16 +3780,16 @@ static void collect_uncached_read_data(struct cifs_aio_ctx *ctx); static void cifs_uncached_readv_complete(struct work_struct *work) { - struct cifs_readdata *rdata = container_of(work, - struct cifs_readdata, work); + struct cifs_io_subrequest *rdata = + container_of(work, struct cifs_io_subrequest, work); complete(&rdata->done); collect_uncached_read_data(rdata->ctx); /* the below call can possibly free the last ref to aio ctx */ - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); } -static int cifs_resend_rdata(struct cifs_readdata *rdata, +static int cifs_resend_rdata(struct cifs_io_subrequest *rdata, struct list_head *rdata_list, struct cifs_aio_ctx *ctx) { @@ -3860,7 +3857,7 @@ static int cifs_resend_rdata(struct cifs_readdata *rdata, } while (rc == -EAGAIN); fail: - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); return rc; } @@ -3869,7 +3866,7 @@ cifs_send_async_read(loff_t fpos, size_t len, struct cifsFileInfo *open_file, struct cifs_sb_info *cifs_sb, struct list_head *rdata_list, struct cifs_aio_ctx *ctx) { - struct cifs_readdata *rdata; + struct cifs_io_subrequest *rdata; unsigned int rsize, nsegs, max_segs = INT_MAX; struct cifs_credits credits_on_stack; struct cifs_credits *credits = &credits_on_stack; @@ -3951,7 +3948,7 @@ cifs_send_async_read(loff_t fpos, size_t len, struct cifsFileInfo *open_file, if (rc) { add_credits_and_wake_if(server, &rdata->credits, 0); - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); if (rc == -EAGAIN) continue; break; @@ -3969,7 +3966,7 @@ cifs_send_async_read(loff_t fpos, size_t len, struct cifsFileInfo *open_file, static void collect_uncached_read_data(struct cifs_aio_ctx *ctx) { - struct cifs_readdata *rdata, *tmp; + struct cifs_io_subrequest *rdata, *tmp; struct cifs_sb_info *cifs_sb; int rc; @@ -4015,8 +4012,7 @@ collect_uncached_read_data(struct cifs_aio_ctx *ctx) rdata->cfile, cifs_sb, &tmp_list, ctx); - kref_put(&rdata->refcount, - cifs_readdata_release); + cifs_put_readdata(rdata); } list_splice(&tmp_list, &ctx->list); @@ -4032,7 +4028,7 @@ collect_uncached_read_data(struct cifs_aio_ctx *ctx) ctx->total_len += rdata->got_bytes; } list_del_init(&rdata->list); - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); } /* mask nodata case */ @@ -4404,8 +4400,8 @@ static void cifs_unlock_folios(struct address_space *mapping, pgoff_t first, pgo static void cifs_readahead_complete(struct work_struct *work) { - struct cifs_readdata *rdata = container_of(work, - struct cifs_readdata, work); + struct cifs_io_subrequest *rdata = container_of(work, + struct cifs_io_subrequest, work); struct folio *folio; pgoff_t last; bool good = rdata->result == 0 || (rdata->result == -EAGAIN && rdata->got_bytes); @@ -4431,7 +4427,7 @@ static void cifs_readahead_complete(struct work_struct *work) } rcu_read_unlock(); - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); } static void cifs_readahead(struct readahead_control *ractl) @@ -4471,7 +4467,7 @@ static void cifs_readahead(struct readahead_control *ractl) */ while ((nr_pages = ra_pages)) { unsigned int i, rsize; - struct cifs_readdata *rdata; + struct cifs_io_subrequest *rdata; struct cifs_credits credits_on_stack; struct cifs_credits *credits = &credits_on_stack; struct folio *folio; @@ -4590,11 +4586,11 @@ static void cifs_readahead(struct readahead_control *ractl) rdata->offset / PAGE_SIZE, (rdata->offset + rdata->bytes - 1) / PAGE_SIZE); /* Fallback to the readpage in error/reconnect cases */ - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); break; } - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); } free_xid(xid); diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 2ed456948f34..072230d5b19b 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -4482,7 +4482,7 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid, unsigned int cur_off; unsigned int cur_page_idx; unsigned int pad_len; - struct cifs_readdata *rdata = mid->callback_data; + struct cifs_io_subrequest *rdata = mid->callback_data; struct smb2_hdr *shdr = (struct smb2_hdr *)buf; int length; bool use_rdma_mr = false; diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 3ea688558e6c..33a7ad4f16bb 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -23,6 +23,8 @@ #include <linux/uuid.h> #include <linux/pagemap.h> #include <linux/xattr.h> +#include <linux/netfs.h> +#include <trace/events/netfs.h> #include "cifsglob.h" #include "cifsacl.h" #include "cifsproto.h" @@ -4378,7 +4380,7 @@ static inline bool smb3_use_rdma_offload(struct cifs_io_parms *io_parms) */ static int smb2_new_read_req(void **buf, unsigned int *total_len, - struct cifs_io_parms *io_parms, struct cifs_readdata *rdata, + struct cifs_io_parms *io_parms, struct cifs_io_subrequest *rdata, unsigned int remaining_bytes, int request_type) { int rc = -EACCES; @@ -4470,7 +4472,7 @@ smb2_new_read_req(void **buf, unsigned int *total_len, static void smb2_readv_callback(struct mid_q_entry *mid) { - struct cifs_readdata *rdata = mid->callback_data; + struct cifs_io_subrequest *rdata = mid->callback_data; struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); struct TCP_Server_Info *server = rdata->server; struct smb2_hdr *shdr = @@ -4557,7 +4559,7 @@ smb2_readv_callback(struct mid_q_entry *mid) /* smb2_async_readv - send an async read, and set up mid to handle result */ int -smb2_async_readv(struct cifs_readdata *rdata) +smb2_async_readv(struct cifs_io_subrequest *rdata) { int rc, flags = 0; char *buf; @@ -4615,13 +4617,13 @@ smb2_async_readv(struct cifs_readdata *rdata) flags |= CIFS_HAS_CREDITS; } - kref_get(&rdata->refcount); + cifs_get_readdata(rdata); rc = cifs_call_async(server, &rqst, cifs_readv_receive, smb2_readv_callback, smb3_handle_read_data, rdata, flags, &rdata->credits); if (rc) { - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); cifs_stats_fail_inc(io_parms.tcon, SMB2_READ_HE); trace_smb3_read_err(0 /* xid */, io_parms.persistent_fid, io_parms.tcon->tid, diff --git a/fs/smb/client/smb2proto.h b/fs/smb/client/smb2proto.h index 732169d8a67a..740053c0118e 100644 --- a/fs/smb/client/smb2proto.h +++ b/fs/smb/client/smb2proto.h @@ -210,7 +210,7 @@ extern int SMB2_query_acl(const unsigned int xid, struct cifs_tcon *tcon, extern int SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, u64 volatile_fid, __le64 *uniqueid); -extern int smb2_async_readv(struct cifs_readdata *rdata); +extern int smb2_async_readv(struct cifs_io_subrequest *rdata); extern int SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms, unsigned int *nbytes, char **buf, int *buf_type); extern int smb2_async_writev(struct cifs_writedata *wdata, diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index 994d70193432..a5bab478e6de 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -1687,7 +1687,7 @@ __cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid, static int cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid) { - struct cifs_readdata *rdata = mid->callback_data; + struct cifs_io_subrequest *rdata = mid->callback_data; return __cifs_readv_discard(server, mid, rdata->result); } @@ -1697,7 +1697,7 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid) { int length, len; unsigned int data_offset, data_len; - struct cifs_readdata *rdata = mid->callback_data; + struct cifs_io_subrequest *rdata = mid->callback_data; char *buf = server->smallbuf; unsigned int buflen = server->pdu_size + HEADER_PREAMBLE_SIZE(server); bool use_rdma_mr = false;
Use a hook in the new writeback code's retry algorithm to rotate the keys once all the outstanding subreqs have failed rather than doing it separately on each subreq. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/afs/file.c | 1 + fs/afs/internal.h | 1 + fs/afs/write.c | 175 +++++++++++++++++++-------------------- fs/netfs/write_collect.c | 9 +- include/linux/netfs.h | 2 + 5 files changed, 96 insertions(+), 92 deletions(-) diff --git a/fs/afs/file.c b/fs/afs/file.c index 8f983e3ecae7..c3f0c45ae9a9 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -368,6 +368,7 @@ static int afs_check_write_begin(struct file *file, loff_t pos, unsigned len, static void afs_free_request(struct netfs_io_request *rreq) { key_put(rreq->netfs_priv); + afs_put_wb_key(rreq->netfs_priv2); } static void afs_update_i_size(struct inode *inode, loff_t new_i_size) diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 887245f9336d..6e1d3c4daf72 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -1601,6 +1601,7 @@ extern int afs_check_volume_status(struct afs_volume *, struct afs_operation *); void afs_prepare_write(struct netfs_io_subrequest *subreq); void afs_issue_write(struct netfs_io_subrequest *subreq); void afs_begin_writeback(struct netfs_io_request *wreq); +void afs_retry_request(struct netfs_io_request *wreq, struct netfs_io_stream *stream); extern int afs_writepages(struct address_space *, struct writeback_control *); extern int afs_fsync(struct file *, loff_t, loff_t, int); extern vm_fault_t afs_page_mkwrite(struct vm_fault *vmf); diff --git a/fs/afs/write.c b/fs/afs/write.c index 6ef7d4cbc008..838db2e94388 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -29,43 +29,39 @@ static void afs_pages_written_back(struct afs_vnode *vnode, loff_t start, unsign /* * Find a key to use for the writeback. We cached the keys used to author the - * writes on the vnode. *_wbk will contain the last writeback key used or NULL - * and we need to start from there if it's set. + * writes on the vnode. wreq->netfs_priv2 will contain the last writeback key + * record used or NULL and we need to start from there if it's set. + * wreq->netfs_priv will be set to the key itself or NULL. */ -static int afs_get_writeback_key(struct afs_vnode *vnode, - struct afs_wb_key **_wbk) +static void afs_get_writeback_key(struct netfs_io_request *wreq) { - struct afs_wb_key *wbk = NULL; - struct list_head *p; - int ret = -ENOKEY, ret2; + struct afs_wb_key *wbk, *old = wreq->netfs_priv2; + struct afs_vnode *vnode = AFS_FS_I(wreq->inode); + + key_put(wreq->netfs_priv); + wreq->netfs_priv = NULL; + wreq->netfs_priv2 = NULL; spin_lock(&vnode->wb_lock); - if (*_wbk) - p = (*_wbk)->vnode_link.next; + if (old) + wbk = list_next_entry(old, vnode_link); else - p = vnode->wb_keys.next; + wbk = list_first_entry(&vnode->wb_keys, struct afs_wb_key, vnode_link); - while (p != &vnode->wb_keys) { - wbk = list_entry(p, struct afs_wb_key, vnode_link); + list_for_each_entry_from(wbk, &vnode->wb_keys, vnode_link) { _debug("wbk %u", key_serial(wbk->key)); - ret2 = key_validate(wbk->key); - if (ret2 == 0) { + if (key_validate(wbk->key) == 0) { refcount_inc(&wbk->usage); + wreq->netfs_priv = key_get(wbk->key); + wreq->netfs_priv2 = wbk; _debug("USE WB KEY %u", key_serial(wbk->key)); break; } - - wbk = NULL; - if (ret == -ENOKEY) - ret = ret2; - p = p->next; } spin_unlock(&vnode->wb_lock); - if (*_wbk) - afs_put_wb_key(*_wbk); - *_wbk = wbk; - return 0; + + afs_put_wb_key(old); } static void afs_store_data_success(struct afs_operation *op) @@ -88,72 +84,83 @@ static const struct afs_operation_ops afs_store_data_operation = { }; /* - * write to a file + * Prepare a subrequest to write to the server. This sets the max_len + * parameter. */ -static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t pos) +void afs_prepare_write(struct netfs_io_subrequest *subreq) +{ + //if (test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) + // subreq->max_len = 512 * 1024; + //else + subreq->max_len = 256 * 1024 * 1024; +} + +/* + * Issue a subrequest to write to the server. + */ +void afs_issue_write(struct netfs_io_subrequest *subreq) { + struct netfs_io_request *wreq = subreq->rreq; struct afs_operation *op; - struct afs_wb_key *wbk = NULL; - loff_t size = iov_iter_count(iter); + struct afs_vnode *vnode = AFS_FS_I(wreq->inode); + unsigned long long pos = subreq->start + subreq->transferred; + size_t len = subreq->len - subreq->transferred; int ret = -ENOKEY; - _enter("%s{%llx:%llu.%u},%llx,%llx", + _enter("R=%x[%x],%s{%llx:%llu.%u},%llx,%zx", + wreq->debug_id, subreq->debug_index, vnode->volume->name, vnode->fid.vid, vnode->fid.vnode, vnode->fid.unique, - size, pos); + pos, len); - ret = afs_get_writeback_key(vnode, &wbk); - if (ret) { - _leave(" = %d [no keys]", ret); - return ret; - } +#if 0 // Error injection + if (subreq->debug_index == 3) + return netfs_write_subrequest_terminated(subreq, -ENOANO, false); - op = afs_alloc_operation(wbk->key, vnode->volume); - if (IS_ERR(op)) { - afs_put_wb_key(wbk); - return -ENOMEM; + if (!test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) { + set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); + return netfs_write_subrequest_terminated(subreq, -EAGAIN, false); } +#endif + + op = afs_alloc_operation(wreq->netfs_priv, vnode->volume); + if (IS_ERR(op)) + return netfs_write_subrequest_terminated(subreq, -EAGAIN, false); afs_op_set_vnode(op, 0, vnode); - op->file[0].dv_delta = 1; + op->file[0].dv_delta = 1; op->file[0].modification = true; - op->store.pos = pos; - op->store.size = size; - op->flags |= AFS_OPERATION_UNINTR; - op->ops = &afs_store_data_operation; + op->store.pos = pos; + op->store.size = len, + op->flags |= AFS_OPERATION_UNINTR; + op->ops = &afs_store_data_operation; -try_next_key: afs_begin_vnode_operation(op); - op->store.write_iter = iter; - op->store.i_size = max(pos + size, vnode->netfs.remote_i_size); - op->mtime = inode_get_mtime(&vnode->netfs.inode); + op->store.write_iter = &subreq->io_iter; + op->store.i_size = umax(pos + len, vnode->netfs.remote_i_size); + op->mtime = inode_get_mtime(&vnode->netfs.inode); afs_wait_for_operation(op); - - switch (afs_op_error(op)) { + ret = afs_put_operation(op); + switch (ret) { case -EACCES: case -EPERM: case -ENOKEY: case -EKEYEXPIRED: case -EKEYREJECTED: case -EKEYREVOKED: - _debug("next"); - - ret = afs_get_writeback_key(vnode, &wbk); - if (ret == 0) { - key_put(op->key); - op->key = key_get(wbk->key); - goto try_next_key; - } + /* If there are more keys we can try, use the retry algorithm + * to rotate the keys. + */ + if (wreq->netfs_priv2) + set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); break; } - afs_put_wb_key(wbk); - _leave(" = %d", afs_op_error(op)); - return afs_put_operation(op); + netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, false); } /* @@ -162,44 +169,32 @@ static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t */ void afs_begin_writeback(struct netfs_io_request *wreq) { + afs_get_writeback_key(wreq); wreq->io_streams[0].avail = true; } /* - * Prepare a subrequest to write to the server. This sets the max_len - * parameter. - */ -void afs_prepare_write(struct netfs_io_subrequest *subreq) -{ - //if (test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) - // subreq->max_len = 512 * 1024; - //else - subreq->max_len = 256 * 1024 * 1024; -} - -/* - * Issue a subrequest to write to the server. + * Prepare to retry the writes in request. Use this to try rotating the + * available writeback keys. */ -void afs_issue_write(struct netfs_io_subrequest *subreq) +void afs_retry_request(struct netfs_io_request *wreq, struct netfs_io_stream *stream) { - struct afs_vnode *vnode = AFS_FS_I(subreq->rreq->inode); - ssize_t ret; - - _enter("%x[%x],%zx", - subreq->rreq->debug_id, subreq->debug_index, subreq->io_iter.count); - -#if 0 // Error injection - if (subreq->debug_index == 3) - return netfs_write_subrequest_terminated(subreq, -ENOANO, false); + struct netfs_io_subrequest *subreq = + list_first_entry(&stream->subrequests, + struct netfs_io_subrequest, rreq_link); - if (!test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) { - set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); - return netfs_write_subrequest_terminated(subreq, -EAGAIN, false); + switch (subreq->error) { + case -EACCES: + case -EPERM: + case -ENOKEY: + case -EKEYEXPIRED: + case -EKEYREJECTED: + case -EKEYREVOKED: + afs_get_writeback_key(wreq); + if (!wreq->netfs_priv) + stream->failed = true; + break; } -#endif - - ret = afs_store_data(vnode, &subreq->io_iter, subreq->start); - netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, false); } /* diff --git a/fs/netfs/write_collect.c b/fs/netfs/write_collect.c index bea939ab0830..7ff15e2d7270 100644 --- a/fs/netfs/write_collect.c +++ b/fs/netfs/write_collect.c @@ -168,6 +168,13 @@ static void netfs_retry_write_stream(struct netfs_io_request *wreq, _enter("R=%x[%x:]", wreq->debug_id, stream->stream_nr); + if (list_empty(&stream->subrequests)) + return; + + if (stream->source == NETFS_UPLOAD_TO_SERVER && + wreq->netfs_ops->retry_request) + wreq->netfs_ops->retry_request(wreq, stream); + if (unlikely(stream->failed)) return; @@ -187,8 +194,6 @@ static void netfs_retry_write_stream(struct netfs_io_request *wreq, return; } - if (list_empty(&stream->subrequests)) - return; next = stream->subrequests.next; do { diff --git a/include/linux/netfs.h b/include/linux/netfs.h index c2ba364041b0..298552f5122c 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -235,6 +235,7 @@ struct netfs_io_request { struct iov_iter iter; /* Unencrypted-side iterator */ struct iov_iter io_iter; /* I/O (Encrypted-side) iterator */ void *netfs_priv; /* Private data for the netfs */ + void *netfs_priv2; /* Private data for the netfs */ struct bio_vec *direct_bv; /* DIO buffer list (when handling iovec-iter) */ unsigned int direct_bv_count; /* Number of elements in direct_bv[] */ unsigned int debug_id; @@ -306,6 +307,7 @@ struct netfs_request_ops { void (*begin_writeback)(struct netfs_io_request *wreq); void (*prepare_write)(struct netfs_io_subrequest *subreq); void (*issue_write)(struct netfs_io_subrequest *subreq); + void (*retry_request)(struct netfs_io_request *wreq, struct netfs_io_stream *stream); void (*invalidate_cache)(struct netfs_io_request *wreq); };
Do a couple of miscellaneous tidy ups: (1) Add a qualifier into a file banner comment. (2) Put the writeback folio traces back into alphabetical order. (3) Remove some unused folio traces. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/buffered_write.c | 2 +- include/trace/events/netfs.h | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 2da9905abec9..1eff9413eb1b 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Network filesystem high-level write support. +/* Network filesystem high-level buffered write support. * * Copyright (C) 2023 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com) diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index e7700172ae7e..4ba553a6d71b 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -141,12 +141,9 @@ EM(netfs_folio_trace_cancel_copy, "cancel-copy") \ EM(netfs_folio_trace_clear, "clear") \ EM(netfs_folio_trace_clear_cc, "clear-cc") \ - EM(netfs_folio_trace_clear_s, "clear-s") \ EM(netfs_folio_trace_clear_g, "clear-g") \ - EM(netfs_folio_trace_copy, "copy") \ - EM(netfs_folio_trace_copy_plus, "copy+") \ + EM(netfs_folio_trace_clear_s, "clear-s") \ EM(netfs_folio_trace_copy_to_cache, "mark-copy") \ - EM(netfs_folio_trace_end_copy, "end-copy") \ EM(netfs_folio_trace_filled_gaps, "filled-gaps") \ EM(netfs_folio_trace_kill, "kill") \ EM(netfs_folio_trace_kill_cc, "kill-cc") \ @@ -156,7 +153,6 @@ EM(netfs_folio_trace_mkwrite_plus, "mkwrite+") \ EM(netfs_folio_trace_not_under_wback, "!wback") \ EM(netfs_folio_trace_read_gaps, "read-gaps") \ - EM(netfs_folio_trace_redirty, "redirty") \ EM(netfs_folio_trace_redirtied, "redirtied") \ EM(netfs_folio_trace_store, "store") \ EM(netfs_folio_trace_store_copy, "store-copy") \
Use a hook in the new writeback code's retry algorithm to rotate the keys once all the outstanding subreqs have failed rather than doing it separately on each subreq. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/afs/file.c | 1 + fs/afs/internal.h | 1 + fs/afs/write.c | 175 +++++++++++++++++++-------------------- fs/netfs/write_collect.c | 9 +- include/linux/netfs.h | 2 + 5 files changed, 96 insertions(+), 92 deletions(-) diff --git a/fs/afs/file.c b/fs/afs/file.c index 8f983e3ecae7..c3f0c45ae9a9 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -368,6 +368,7 @@ static int afs_check_write_begin(struct file *file, loff_t pos, unsigned len, static void afs_free_request(struct netfs_io_request *rreq) { key_put(rreq->netfs_priv); + afs_put_wb_key(rreq->netfs_priv2); } static void afs_update_i_size(struct inode *inode, loff_t new_i_size) diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 887245f9336d..6e1d3c4daf72 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -1601,6 +1601,7 @@ extern int afs_check_volume_status(struct afs_volume *, struct afs_operation *); void afs_prepare_write(struct netfs_io_subrequest *subreq); void afs_issue_write(struct netfs_io_subrequest *subreq); void afs_begin_writeback(struct netfs_io_request *wreq); +void afs_retry_request(struct netfs_io_request *wreq, struct netfs_io_stream *stream); extern int afs_writepages(struct address_space *, struct writeback_control *); extern int afs_fsync(struct file *, loff_t, loff_t, int); extern vm_fault_t afs_page_mkwrite(struct vm_fault *vmf); diff --git a/fs/afs/write.c b/fs/afs/write.c index 6ef7d4cbc008..838db2e94388 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -29,43 +29,39 @@ static void afs_pages_written_back(struct afs_vnode *vnode, loff_t start, unsign /* * Find a key to use for the writeback. We cached the keys used to author the - * writes on the vnode. *_wbk will contain the last writeback key used or NULL - * and we need to start from there if it's set. + * writes on the vnode. wreq->netfs_priv2 will contain the last writeback key + * record used or NULL and we need to start from there if it's set. + * wreq->netfs_priv will be set to the key itself or NULL. */ -static int afs_get_writeback_key(struct afs_vnode *vnode, - struct afs_wb_key **_wbk) +static void afs_get_writeback_key(struct netfs_io_request *wreq) { - struct afs_wb_key *wbk = NULL; - struct list_head *p; - int ret = -ENOKEY, ret2; + struct afs_wb_key *wbk, *old = wreq->netfs_priv2; + struct afs_vnode *vnode = AFS_FS_I(wreq->inode); + + key_put(wreq->netfs_priv); + wreq->netfs_priv = NULL; + wreq->netfs_priv2 = NULL; spin_lock(&vnode->wb_lock); - if (*_wbk) - p = (*_wbk)->vnode_link.next; + if (old) + wbk = list_next_entry(old, vnode_link); else - p = vnode->wb_keys.next; + wbk = list_first_entry(&vnode->wb_keys, struct afs_wb_key, vnode_link); - while (p != &vnode->wb_keys) { - wbk = list_entry(p, struct afs_wb_key, vnode_link); + list_for_each_entry_from(wbk, &vnode->wb_keys, vnode_link) { _debug("wbk %u", key_serial(wbk->key)); - ret2 = key_validate(wbk->key); - if (ret2 == 0) { + if (key_validate(wbk->key) == 0) { refcount_inc(&wbk->usage); + wreq->netfs_priv = key_get(wbk->key); + wreq->netfs_priv2 = wbk; _debug("USE WB KEY %u", key_serial(wbk->key)); break; } - - wbk = NULL; - if (ret == -ENOKEY) - ret = ret2; - p = p->next; } spin_unlock(&vnode->wb_lock); - if (*_wbk) - afs_put_wb_key(*_wbk); - *_wbk = wbk; - return 0; + + afs_put_wb_key(old); } static void afs_store_data_success(struct afs_operation *op) @@ -88,72 +84,83 @@ static const struct afs_operation_ops afs_store_data_operation = { }; /* - * write to a file + * Prepare a subrequest to write to the server. This sets the max_len + * parameter. */ -static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t pos) +void afs_prepare_write(struct netfs_io_subrequest *subreq) +{ + //if (test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) + // subreq->max_len = 512 * 1024; + //else + subreq->max_len = 256 * 1024 * 1024; +} + +/* + * Issue a subrequest to write to the server. + */ +void afs_issue_write(struct netfs_io_subrequest *subreq) { + struct netfs_io_request *wreq = subreq->rreq; struct afs_operation *op; - struct afs_wb_key *wbk = NULL; - loff_t size = iov_iter_count(iter); + struct afs_vnode *vnode = AFS_FS_I(wreq->inode); + unsigned long long pos = subreq->start + subreq->transferred; + size_t len = subreq->len - subreq->transferred; int ret = -ENOKEY; - _enter("%s{%llx:%llu.%u},%llx,%llx", + _enter("R=%x[%x],%s{%llx:%llu.%u},%llx,%zx", + wreq->debug_id, subreq->debug_index, vnode->volume->name, vnode->fid.vid, vnode->fid.vnode, vnode->fid.unique, - size, pos); + pos, len); - ret = afs_get_writeback_key(vnode, &wbk); - if (ret) { - _leave(" = %d [no keys]", ret); - return ret; - } +#if 0 // Error injection + if (subreq->debug_index == 3) + return netfs_write_subrequest_terminated(subreq, -ENOANO, false); - op = afs_alloc_operation(wbk->key, vnode->volume); - if (IS_ERR(op)) { - afs_put_wb_key(wbk); - return -ENOMEM; + if (!test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) { + set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); + return netfs_write_subrequest_terminated(subreq, -EAGAIN, false); } +#endif + + op = afs_alloc_operation(wreq->netfs_priv, vnode->volume); + if (IS_ERR(op)) + return netfs_write_subrequest_terminated(subreq, -EAGAIN, false); afs_op_set_vnode(op, 0, vnode); - op->file[0].dv_delta = 1; + op->file[0].dv_delta = 1; op->file[0].modification = true; - op->store.pos = pos; - op->store.size = size; - op->flags |= AFS_OPERATION_UNINTR; - op->ops = &afs_store_data_operation; + op->store.pos = pos; + op->store.size = len, + op->flags |= AFS_OPERATION_UNINTR; + op->ops = &afs_store_data_operation; -try_next_key: afs_begin_vnode_operation(op); - op->store.write_iter = iter; - op->store.i_size = max(pos + size, vnode->netfs.remote_i_size); - op->mtime = inode_get_mtime(&vnode->netfs.inode); + op->store.write_iter = &subreq->io_iter; + op->store.i_size = umax(pos + len, vnode->netfs.remote_i_size); + op->mtime = inode_get_mtime(&vnode->netfs.inode); afs_wait_for_operation(op); - - switch (afs_op_error(op)) { + ret = afs_put_operation(op); + switch (ret) { case -EACCES: case -EPERM: case -ENOKEY: case -EKEYEXPIRED: case -EKEYREJECTED: case -EKEYREVOKED: - _debug("next"); - - ret = afs_get_writeback_key(vnode, &wbk); - if (ret == 0) { - key_put(op->key); - op->key = key_get(wbk->key); - goto try_next_key; - } + /* If there are more keys we can try, use the retry algorithm + * to rotate the keys. + */ + if (wreq->netfs_priv2) + set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); break; } - afs_put_wb_key(wbk); - _leave(" = %d", afs_op_error(op)); - return afs_put_operation(op); + netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, false); } /* @@ -162,44 +169,32 @@ static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t */ void afs_begin_writeback(struct netfs_io_request *wreq) { + afs_get_writeback_key(wreq); wreq->io_streams[0].avail = true; } /* - * Prepare a subrequest to write to the server. This sets the max_len - * parameter. - */ -void afs_prepare_write(struct netfs_io_subrequest *subreq) -{ - //if (test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) - // subreq->max_len = 512 * 1024; - //else - subreq->max_len = 256 * 1024 * 1024; -} - -/* - * Issue a subrequest to write to the server. + * Prepare to retry the writes in request. Use this to try rotating the + * available writeback keys. */ -void afs_issue_write(struct netfs_io_subrequest *subreq) +void afs_retry_request(struct netfs_io_request *wreq, struct netfs_io_stream *stream) { - struct afs_vnode *vnode = AFS_FS_I(subreq->rreq->inode); - ssize_t ret; - - _enter("%x[%x],%zx", - subreq->rreq->debug_id, subreq->debug_index, subreq->io_iter.count); - -#if 0 // Error injection - if (subreq->debug_index == 3) - return netfs_write_subrequest_terminated(subreq, -ENOANO, false); + struct netfs_io_subrequest *subreq = + list_first_entry(&stream->subrequests, + struct netfs_io_subrequest, rreq_link); - if (!test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) { - set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); - return netfs_write_subrequest_terminated(subreq, -EAGAIN, false); + switch (subreq->error) { + case -EACCES: + case -EPERM: + case -ENOKEY: + case -EKEYEXPIRED: + case -EKEYREJECTED: + case -EKEYREVOKED: + afs_get_writeback_key(wreq); + if (!wreq->netfs_priv) + stream->failed = true; + break; } -#endif - - ret = afs_store_data(vnode, &subreq->io_iter, subreq->start); - netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, false); } /* diff --git a/fs/netfs/write_collect.c b/fs/netfs/write_collect.c index bea939ab0830..7ff15e2d7270 100644 --- a/fs/netfs/write_collect.c +++ b/fs/netfs/write_collect.c @@ -168,6 +168,13 @@ static void netfs_retry_write_stream(struct netfs_io_request *wreq, _enter("R=%x[%x:]", wreq->debug_id, stream->stream_nr); + if (list_empty(&stream->subrequests)) + return; + + if (stream->source == NETFS_UPLOAD_TO_SERVER && + wreq->netfs_ops->retry_request) + wreq->netfs_ops->retry_request(wreq, stream); + if (unlikely(stream->failed)) return; @@ -187,8 +194,6 @@ static void netfs_retry_write_stream(struct netfs_io_request *wreq, return; } - if (list_empty(&stream->subrequests)) - return; next = stream->subrequests.next; do { diff --git a/include/linux/netfs.h b/include/linux/netfs.h index c2ba364041b0..298552f5122c 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -235,6 +235,7 @@ struct netfs_io_request { struct iov_iter iter; /* Unencrypted-side iterator */ struct iov_iter io_iter; /* I/O (Encrypted-side) iterator */ void *netfs_priv; /* Private data for the netfs */ + void *netfs_priv2; /* Private data for the netfs */ struct bio_vec *direct_bv; /* DIO buffer list (when handling iovec-iter) */ unsigned int direct_bv_count; /* Number of elements in direct_bv[] */ unsigned int debug_id; @@ -306,6 +307,7 @@ struct netfs_request_ops { void (*begin_writeback)(struct netfs_io_request *wreq); void (*prepare_write)(struct netfs_io_subrequest *subreq); void (*issue_write)(struct netfs_io_subrequest *subreq); + void (*retry_request)(struct netfs_io_request *wreq, struct netfs_io_stream *stream); void (*invalidate_cache)(struct netfs_io_request *wreq); };
Remove the old writeback code. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/9p/vfs_addr.c | 34 --- fs/afs/write.c | 40 --- fs/netfs/buffered_write.c | 629 -------------------------------------- fs/netfs/direct_write.c | 2 +- fs/netfs/output.c | 477 ----------------------------- 5 files changed, 1 insertion(+), 1181 deletions(-) delete mode 100644 fs/netfs/output.c diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 4845e655bc39..a97ceb105cd8 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -60,40 +60,6 @@ static void v9fs_issue_write(struct netfs_io_subrequest *subreq) netfs_write_subrequest_terminated(subreq, len ?: err, false); } -#if 0 // TODO: Remove -static void v9fs_upload_to_server(struct netfs_io_subrequest *subreq) -{ - struct p9_fid *fid = subreq->rreq->netfs_priv; - int err, len; - - trace_netfs_sreq(subreq, netfs_sreq_trace_submit); - len = p9_client_write(fid, subreq->start, &subreq->io_iter, &err); - netfs_write_subrequest_terminated(subreq, len ?: err, false); -} - -static void v9fs_upload_to_server_worker(struct work_struct *work) -{ - struct netfs_io_subrequest *subreq = - container_of(work, struct netfs_io_subrequest, work); - - v9fs_upload_to_server(subreq); -} - -/* - * Set up write requests for a writeback slice. We need to add a write request - * for each write we want to make. - */ -static void v9fs_create_write_requests(struct netfs_io_request *wreq, loff_t start, size_t len) -{ - struct netfs_io_subrequest *subreq; - - subreq = netfs_create_write_request(wreq, NETFS_UPLOAD_TO_SERVER, - start, len, v9fs_upload_to_server_worker); - if (subreq) - netfs_queue_write_request(subreq); -} -#endif - /** * v9fs_issue_read - Issue a read from 9P * @subreq: The read to make diff --git a/fs/afs/write.c b/fs/afs/write.c index 0ead204c84cb..6ef7d4cbc008 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -156,46 +156,6 @@ static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t return afs_put_operation(op); } -#if 0 // TODO: Remove -static void afs_upload_to_server(struct netfs_io_subrequest *subreq) -{ - struct afs_vnode *vnode = AFS_FS_I(subreq->rreq->inode); - ssize_t ret; - - _enter("%x[%x],%zx", - subreq->rreq->debug_id, subreq->debug_index, subreq->io_iter.count); - - trace_netfs_sreq(subreq, netfs_sreq_trace_submit); - ret = afs_store_data(vnode, &subreq->io_iter, subreq->start); - netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, - false); -} - -static void afs_upload_to_server_worker(struct work_struct *work) -{ - struct netfs_io_subrequest *subreq = - container_of(work, struct netfs_io_subrequest, work); - - afs_upload_to_server(subreq); -} - -/* - * Set up write requests for a writeback slice. We need to add a write request - * for each write we want to make. - */ -void afs_create_write_requests(struct netfs_io_request *wreq, loff_t start, size_t len) -{ - struct netfs_io_subrequest *subreq; - - _enter("%x,%llx-%llx", wreq->debug_id, start, start + len); - - subreq = netfs_create_write_request(wreq, NETFS_UPLOAD_TO_SERVER, - start, len, afs_upload_to_server_worker); - if (subreq) - netfs_queue_write_request(subreq); -} -#endif - /* * Writeback calls this when it finds a folio that needs uploading. This isn't * called if writeback only has copy-to-cache to deal with. diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 945e646cd2db..2da9905abec9 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -575,632 +575,3 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr return ret; } EXPORT_SYMBOL(netfs_page_mkwrite); - -#if 0 // TODO: Remove -/* - * Kill all the pages in the given range - */ -static void netfs_kill_pages(struct address_space *mapping, - loff_t start, loff_t len) -{ - struct folio *folio; - pgoff_t index = start / PAGE_SIZE; - pgoff_t last = (start + len - 1) / PAGE_SIZE, next; - - _enter("%llx-%llx", start, start + len - 1); - - do { - _debug("kill %lx (to %lx)", index, last); - - folio = filemap_get_folio(mapping, index); - if (IS_ERR(folio)) { - next = index + 1; - continue; - } - - next = folio_next_index(folio); - - trace_netfs_folio(folio, netfs_folio_trace_kill); - folio_clear_uptodate(folio); - folio_end_writeback(folio); - folio_lock(folio); - generic_error_remove_folio(mapping, folio); - folio_unlock(folio); - folio_put(folio); - - } while (index = next, index <= last); - - _leave(""); -} - -/* - * Redirty all the pages in a given range. - */ -static void netfs_redirty_pages(struct address_space *mapping, - loff_t start, loff_t len) -{ - struct folio *folio; - pgoff_t index = start / PAGE_SIZE; - pgoff_t last = (start + len - 1) / PAGE_SIZE, next; - - _enter("%llx-%llx", start, start + len - 1); - - do { - _debug("redirty %llx @%llx", len, start); - - folio = filemap_get_folio(mapping, index); - if (IS_ERR(folio)) { - next = index + 1; - continue; - } - - next = folio_next_index(folio); - trace_netfs_folio(folio, netfs_folio_trace_redirty); - filemap_dirty_folio(mapping, folio); - folio_end_writeback(folio); - folio_put(folio); - } while (index = next, index <= last); - - balance_dirty_pages_ratelimited(mapping); - - _leave(""); -} - -/* - * Completion of write to server - */ -static void netfs_pages_written_back(struct netfs_io_request *wreq) -{ - struct address_space *mapping = wreq->mapping; - struct netfs_folio *finfo; - struct netfs_group *group = NULL; - struct folio *folio; - pgoff_t last; - int gcount = 0; - - XA_STATE(xas, &mapping->i_pages, wreq->start / PAGE_SIZE); - - _enter("%llx-%llx", wreq->start, wreq->start + wreq->len); - - rcu_read_lock(); - - last = (wreq->start + wreq->len - 1) / PAGE_SIZE; - xas_for_each(&xas, folio, last) { - WARN(!folio_test_writeback(folio), - "bad %llx @%llx page %lx %lx\n", - wreq->len, wreq->start, folio->index, last); - - if ((finfo = netfs_folio_info(folio))) { - /* Streaming writes cannot be redirtied whilst under - * writeback, so discard the streaming record. - */ - folio_detach_private(folio); - group = finfo->netfs_group; - gcount++; - trace_netfs_folio(folio, netfs_folio_trace_clear_s); - kfree(finfo); - } else if ((group = netfs_folio_group(folio))) { - /* Need to detach the group pointer if the page didn't - * get redirtied. If it has been redirtied, then it - * must be within the same group. - */ - if (folio_test_dirty(folio)) { - trace_netfs_folio(folio, netfs_folio_trace_redirtied); - goto end_wb; - } - if (folio_trylock(folio)) { - if (!folio_test_dirty(folio)) { - folio_detach_private(folio); - gcount++; - if (group == NETFS_FOLIO_COPY_TO_CACHE) - trace_netfs_folio(folio, - netfs_folio_trace_end_copy); - else - trace_netfs_folio(folio, netfs_folio_trace_clear_g); - } else { - trace_netfs_folio(folio, netfs_folio_trace_redirtied); - } - folio_unlock(folio); - goto end_wb; - } - - xas_pause(&xas); - rcu_read_unlock(); - folio_lock(folio); - if (!folio_test_dirty(folio)) { - folio_detach_private(folio); - gcount++; - trace_netfs_folio(folio, netfs_folio_trace_clear_g); - } else { - trace_netfs_folio(folio, netfs_folio_trace_redirtied); - } - folio_unlock(folio); - rcu_read_lock(); - } else { - trace_netfs_folio(folio, netfs_folio_trace_clear); - } - end_wb: - xas_advance(&xas, folio_next_index(folio) - 1); - folio_end_writeback(folio); - } - - rcu_read_unlock(); - netfs_put_group_many(group, gcount); - _leave(""); -} - -/* - * Deal with the disposition of the folios that are under writeback to close - * out the operation. - */ -static void netfs_cleanup_buffered_write(struct netfs_io_request *wreq) -{ - struct address_space *mapping = wreq->mapping; - - _enter(""); - - switch (wreq->error) { - case 0: - netfs_pages_written_back(wreq); - break; - - default: - pr_notice("R=%08x Unexpected error %d\n", wreq->debug_id, wreq->error); - fallthrough; - case -EACCES: - case -EPERM: - case -ENOKEY: - case -EKEYEXPIRED: - case -EKEYREJECTED: - case -EKEYREVOKED: - case -ENETRESET: - case -EDQUOT: - case -ENOSPC: - netfs_redirty_pages(mapping, wreq->start, wreq->len); - break; - - case -EROFS: - case -EIO: - case -EREMOTEIO: - case -EFBIG: - case -ENOENT: - case -ENOMEDIUM: - case -ENXIO: - netfs_kill_pages(mapping, wreq->start, wreq->len); - break; - } - - if (wreq->error) - mapping_set_error(mapping, wreq->error); - if (wreq->netfs_ops->done) - wreq->netfs_ops->done(wreq); -} - -/* - * Extend the region to be written back to include subsequent contiguously - * dirty pages if possible, but don't sleep while doing so. - * - * If this page holds new content, then we can include filler zeros in the - * writeback. - */ -static void netfs_extend_writeback(struct address_space *mapping, - struct netfs_group *group, - struct xa_state *xas, - long *_count, - loff_t start, - loff_t max_len, - size_t *_len, - size_t *_top) -{ - struct netfs_folio *finfo; - struct folio_batch fbatch; - struct folio *folio; - unsigned int i; - pgoff_t index = (start + *_len) / PAGE_SIZE; - size_t len; - void *priv; - bool stop = true; - - folio_batch_init(&fbatch); - - do { - /* Firstly, we gather up a batch of contiguous dirty pages - * under the RCU read lock - but we can't clear the dirty flags - * there if any of those pages are mapped. - */ - rcu_read_lock(); - - xas_for_each(xas, folio, ULONG_MAX) { - stop = true; - if (xas_retry(xas, folio)) - continue; - if (xa_is_value(folio)) - break; - if (folio->index != index) { - xas_reset(xas); - break; - } - - if (!folio_try_get_rcu(folio)) { - xas_reset(xas); - continue; - } - - /* Has the folio moved or been split? */ - if (unlikely(folio != xas_reload(xas))) { - folio_put(folio); - xas_reset(xas); - break; - } - - if (!folio_trylock(folio)) { - folio_put(folio); - xas_reset(xas); - break; - } - if (!folio_test_dirty(folio) || - folio_test_writeback(folio)) { - folio_unlock(folio); - folio_put(folio); - xas_reset(xas); - break; - } - - stop = false; - len = folio_size(folio); - priv = folio_get_private(folio); - if ((const struct netfs_group *)priv != group) { - stop = true; - finfo = netfs_folio_info(folio); - if (!finfo || - finfo->netfs_group != group || - finfo->dirty_offset > 0) { - folio_unlock(folio); - folio_put(folio); - xas_reset(xas); - break; - } - len = finfo->dirty_len; - } - - *_top += folio_size(folio); - index += folio_nr_pages(folio); - *_count -= folio_nr_pages(folio); - *_len += len; - if (*_len >= max_len || *_count <= 0) - stop = true; - - if (!folio_batch_add(&fbatch, folio)) - break; - if (stop) - break; - } - - xas_pause(xas); - rcu_read_unlock(); - - /* Now, if we obtained any folios, we can shift them to being - * writable and mark them for caching. - */ - if (!folio_batch_count(&fbatch)) - break; - - for (i = 0; i < folio_batch_count(&fbatch); i++) { - folio = fbatch.folios[i]; - if (group == NETFS_FOLIO_COPY_TO_CACHE) - trace_netfs_folio(folio, netfs_folio_trace_copy_plus); - else - trace_netfs_folio(folio, netfs_folio_trace_store_plus); - - if (!folio_clear_dirty_for_io(folio)) - BUG(); - folio_start_writeback(folio); - folio_unlock(folio); - } - - folio_batch_release(&fbatch); - cond_resched(); - } while (!stop); -} - -/* - * Synchronously write back the locked page and any subsequent non-locked dirty - * pages. - */ -static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, - struct writeback_control *wbc, - struct netfs_group *group, - struct xa_state *xas, - struct folio *folio, - unsigned long long start, - unsigned long long end) -{ - struct netfs_io_request *wreq; - struct netfs_folio *finfo; - struct netfs_inode *ctx = netfs_inode(mapping->host); - unsigned long long i_size = i_size_read(&ctx->inode); - size_t len, max_len; - long count = wbc->nr_to_write; - int ret; - - _enter(",%lx,%llx-%llx", folio->index, start, end); - - wreq = netfs_alloc_request(mapping, NULL, start, folio_size(folio), - group == NETFS_FOLIO_COPY_TO_CACHE ? - NETFS_COPY_TO_CACHE : NETFS_WRITEBACK); - if (IS_ERR(wreq)) { - folio_unlock(folio); - return PTR_ERR(wreq); - } - - if (!folio_clear_dirty_for_io(folio)) - BUG(); - folio_start_writeback(folio); - - count -= folio_nr_pages(folio); - - /* Find all consecutive lockable dirty pages that have contiguous - * written regions, stopping when we find a page that is not - * immediately lockable, is not dirty or is missing, or we reach the - * end of the range. - */ - if (group == NETFS_FOLIO_COPY_TO_CACHE) - trace_netfs_folio(folio, netfs_folio_trace_copy); - else - trace_netfs_folio(folio, netfs_folio_trace_store); - - len = wreq->len; - finfo = netfs_folio_info(folio); - if (finfo) { - start += finfo->dirty_offset; - if (finfo->dirty_offset + finfo->dirty_len != len) { - len = finfo->dirty_len; - goto cant_expand; - } - len = finfo->dirty_len; - } - - if (start < i_size) { - /* Trim the write to the EOF; the extra data is ignored. Also - * put an upper limit on the size of a single storedata op. - */ - max_len = 65536 * 4096; - max_len = min_t(unsigned long long, max_len, end - start + 1); - max_len = min_t(unsigned long long, max_len, i_size - start); - - if (len < max_len) - netfs_extend_writeback(mapping, group, xas, &count, start, - max_len, &len, &wreq->upper_len); - } - -cant_expand: - len = min_t(unsigned long long, len, i_size - start); - - /* We now have a contiguous set of dirty pages, each with writeback - * set; the first page is still locked at this point, but all the rest - * have been unlocked. - */ - folio_unlock(folio); - wreq->start = start; - wreq->len = len; - - if (start < i_size) { - _debug("write back %zx @%llx [%llx]", len, start, i_size); - - /* Speculatively write to the cache. We have to fix this up - * later if the store fails. - */ - wreq->cleanup = netfs_cleanup_buffered_write; - - iov_iter_xarray(&wreq->iter, ITER_SOURCE, &mapping->i_pages, start, - wreq->upper_len); - if (group != NETFS_FOLIO_COPY_TO_CACHE) { - __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); - ret = netfs_begin_write(wreq, true, netfs_write_trace_writeback); - } else { - ret = netfs_begin_write(wreq, true, netfs_write_trace_copy_to_cache); - } - if (ret == 0 || ret == -EIOCBQUEUED) - wbc->nr_to_write -= len / PAGE_SIZE; - } else { - _debug("write discard %zx @%llx [%llx]", len, start, i_size); - - /* The dirty region was entirely beyond the EOF. */ - netfs_pages_written_back(wreq); - ret = 0; - } - - netfs_put_request(wreq, false, netfs_rreq_trace_put_return); - _leave(" = 1"); - return 1; -} - -/* - * Write a region of pages back to the server - */ -static ssize_t netfs_writepages_begin(struct address_space *mapping, - struct writeback_control *wbc, - struct netfs_group *group, - struct xa_state *xas, - unsigned long long *_start, - unsigned long long end) -{ - const struct netfs_folio *finfo; - struct folio *folio; - unsigned long long start = *_start; - ssize_t ret; - void *priv; - int skips = 0; - - _enter("%llx,%llx,", start, end); - -search_again: - /* Find the first dirty page in the group. */ - rcu_read_lock(); - - for (;;) { - folio = xas_find_marked(xas, end / PAGE_SIZE, PAGECACHE_TAG_DIRTY); - if (xas_retry(xas, folio) || xa_is_value(folio)) - continue; - if (!folio) - break; - - if (!folio_try_get_rcu(folio)) { - xas_reset(xas); - continue; - } - - if (unlikely(folio != xas_reload(xas))) { - folio_put(folio); - xas_reset(xas); - continue; - } - - /* Skip any dirty folio that's not in the group of interest. */ - priv = folio_get_private(folio); - if ((const struct netfs_group *)priv == NETFS_FOLIO_COPY_TO_CACHE) { - group = NETFS_FOLIO_COPY_TO_CACHE; - } else if ((const struct netfs_group *)priv != group) { - finfo = __netfs_folio_info(priv); - if (!finfo || finfo->netfs_group != group) { - folio_put(folio); - continue; - } - } - - xas_pause(xas); - break; - } - rcu_read_unlock(); - if (!folio) - return 0; - - start = folio_pos(folio); /* May regress with THPs */ - - _debug("wback %lx", folio->index); - - /* At this point we hold neither the i_pages lock nor the page lock: - * the page may be truncated or invalidated (changing page->mapping to - * NULL), or even swizzled back from swapper_space to tmpfs file - * mapping - */ -lock_again: - if (wbc->sync_mode != WB_SYNC_NONE) { - ret = folio_lock_killable(folio); - if (ret < 0) - return ret; - } else { - if (!folio_trylock(folio)) - goto search_again; - } - - if (folio->mapping != mapping || - !folio_test_dirty(folio)) { - start += folio_size(folio); - folio_unlock(folio); - goto search_again; - } - - if (folio_test_writeback(folio)) { - folio_unlock(folio); - if (wbc->sync_mode != WB_SYNC_NONE) { - folio_wait_writeback(folio); - goto lock_again; - } - - start += folio_size(folio); - if (wbc->sync_mode == WB_SYNC_NONE) { - if (skips >= 5 || need_resched()) { - ret = 0; - goto out; - } - skips++; - } - goto search_again; - } - - ret = netfs_write_back_from_locked_folio(mapping, wbc, group, xas, - folio, start, end); -out: - if (ret > 0) - *_start = start + ret; - _leave(" = %zd [%llx]", ret, *_start); - return ret; -} - -/* - * Write a region of pages back to the server - */ -static int netfs_writepages_region(struct address_space *mapping, - struct writeback_control *wbc, - struct netfs_group *group, - unsigned long long *_start, - unsigned long long end) -{ - ssize_t ret; - - XA_STATE(xas, &mapping->i_pages, *_start / PAGE_SIZE); - - do { - ret = netfs_writepages_begin(mapping, wbc, group, &xas, - _start, end); - if (ret > 0 && wbc->nr_to_write > 0) - cond_resched(); - } while (ret > 0 && wbc->nr_to_write > 0); - - return ret > 0 ? 0 : ret; -} - -/* - * write some of the pending data back to the server - */ -int netfs_writepages(struct address_space *mapping, - struct writeback_control *wbc) -{ - struct netfs_group *group = NULL; - loff_t start, end; - int ret; - - _enter(""); - - /* We have to be careful as we can end up racing with setattr() - * truncating the pagecache since the caller doesn't take a lock here - * to prevent it. - */ - - if (wbc->range_cyclic && mapping->writeback_index) { - start = mapping->writeback_index * PAGE_SIZE; - ret = netfs_writepages_region(mapping, wbc, group, - &start, LLONG_MAX); - if (ret < 0) - goto out; - - if (wbc->nr_to_write <= 0) { - mapping->writeback_index = start / PAGE_SIZE; - goto out; - } - - start = 0; - end = mapping->writeback_index * PAGE_SIZE; - mapping->writeback_index = 0; - ret = netfs_writepages_region(mapping, wbc, group, &start, end); - if (ret == 0) - mapping->writeback_index = start / PAGE_SIZE; - } else if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) { - start = 0; - ret = netfs_writepages_region(mapping, wbc, group, - &start, LLONG_MAX); - if (wbc->nr_to_write > 0 && ret == 0) - mapping->writeback_index = start / PAGE_SIZE; - } else { - start = wbc->range_start; - ret = netfs_writepages_region(mapping, wbc, group, - &start, wbc->range_end); - } - -out: - _leave(" = %d", ret); - return ret; -} -EXPORT_SYMBOL(netfs_writepages); -#endif diff --git a/fs/netfs/direct_write.c b/fs/netfs/direct_write.c index 330ba7cb3f10..e4a9cf7cd234 100644 --- a/fs/netfs/direct_write.c +++ b/fs/netfs/direct_write.c @@ -37,7 +37,7 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov size_t len = iov_iter_count(iter); bool async = !is_sync_kiocb(iocb); - _enter(""); + _enter("%lx", iov_iter_count(iter)); /* We're going to need a bounce buffer if what we transmit is going to * be different in some way to the source buffer, e.g. because it gets diff --git a/fs/netfs/output.c b/fs/netfs/output.c deleted file mode 100644 index 85374322f10f..000000000000 --- a/fs/netfs/output.c +++ /dev/null @@ -1,477 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Network filesystem high-level write support. - * - * Copyright (C) 2023 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - */ - -#include <linux/fs.h> -#include <linux/mm.h> -#include <linux/pagemap.h> -#include <linux/slab.h> -#include <linux/writeback.h> -#include <linux/pagevec.h> -#include "internal.h" - -/** - * netfs_create_write_request - Create a write operation. - * @wreq: The write request this is storing from. - * @dest: The destination type - * @start: Start of the region this write will modify - * @len: Length of the modification - * @worker: The worker function to handle the write(s) - * - * Allocate a write operation, set it up and add it to the list on a write - * request. - */ -struct netfs_io_subrequest *netfs_create_write_request(struct netfs_io_request *wreq, - enum netfs_io_source dest, - loff_t start, size_t len, - work_func_t worker) -{ - struct netfs_io_subrequest *subreq; - - subreq = netfs_alloc_subrequest(wreq); - if (subreq) { - INIT_WORK(&subreq->work, worker); - subreq->source = dest; - subreq->start = start; - subreq->len = len; - - switch (subreq->source) { - case NETFS_UPLOAD_TO_SERVER: - netfs_stat(&netfs_n_wh_upload); - break; - case NETFS_WRITE_TO_CACHE: - netfs_stat(&netfs_n_wh_write); - break; - default: - BUG(); - } - - subreq->io_iter = wreq->io_iter; - iov_iter_advance(&subreq->io_iter, subreq->start - wreq->start); - iov_iter_truncate(&subreq->io_iter, subreq->len); - - trace_netfs_sreq_ref(wreq->debug_id, subreq->debug_index, - refcount_read(&subreq->ref), - netfs_sreq_trace_new); - atomic_inc(&wreq->nr_outstanding); - list_add_tail(&subreq->rreq_link, &wreq->subrequests); - trace_netfs_sreq(subreq, netfs_sreq_trace_prepare); - } - - return subreq; -} -EXPORT_SYMBOL(netfs_create_write_request); - -/* - * Process a completed write request once all the component operations have - * been completed. - */ -static void netfs_write_terminated(struct netfs_io_request *wreq, bool was_async) -{ - struct netfs_io_subrequest *subreq; - struct netfs_inode *ctx = netfs_inode(wreq->inode); - size_t transferred = 0; - - _enter("R=%x[]", wreq->debug_id); - - trace_netfs_rreq(wreq, netfs_rreq_trace_write_done); - - list_for_each_entry(subreq, &wreq->subrequests, rreq_link) { - if (subreq->error || subreq->transferred == 0) - break; - transferred += subreq->transferred; - if (subreq->transferred < subreq->len) - break; - } - wreq->transferred = transferred; - - list_for_each_entry(subreq, &wreq->subrequests, rreq_link) { - if (!subreq->error) - continue; - switch (subreq->source) { - case NETFS_UPLOAD_TO_SERVER: - /* Depending on the type of failure, this may prevent - * writeback completion unless we're in disconnected - * mode. - */ - if (!wreq->error) - wreq->error = subreq->error; - break; - - case NETFS_WRITE_TO_CACHE: - /* Failure doesn't prevent writeback completion unless - * we're in disconnected mode. - */ - if (subreq->error != -ENOBUFS) - ctx->ops->invalidate_cache(wreq); - break; - - default: - WARN_ON_ONCE(1); - if (!wreq->error) - wreq->error = -EIO; - return; - } - } - - wreq->cleanup(wreq); - - if (wreq->origin == NETFS_DIO_WRITE && - wreq->mapping->nrpages) { - pgoff_t first = wreq->start >> PAGE_SHIFT; - pgoff_t last = (wreq->start + wreq->transferred - 1) >> PAGE_SHIFT; - invalidate_inode_pages2_range(wreq->mapping, first, last); - } - - if (wreq->origin == NETFS_DIO_WRITE) - inode_dio_end(wreq->inode); - - _debug("finished"); - trace_netfs_rreq(wreq, netfs_rreq_trace_wake_ip); - clear_bit_unlock(NETFS_RREQ_IN_PROGRESS, &wreq->flags); - wake_up_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS); - - if (wreq->iocb) { - wreq->iocb->ki_pos += transferred; - if (wreq->iocb->ki_complete) - wreq->iocb->ki_complete( - wreq->iocb, wreq->error ? wreq->error : transferred); - } - - netfs_clear_subrequests(wreq, was_async); - netfs_put_request(wreq, was_async, netfs_rreq_trace_put_complete); -} - -/* - * Deal with the completion of writing the data to the cache. - */ -void netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, - bool was_async) -{ - struct netfs_io_subrequest *subreq = _op; - struct netfs_io_request *wreq = subreq->rreq; - unsigned int u; - - _enter("%x[%x] %zd", wreq->debug_id, subreq->debug_index, transferred_or_error); - - switch (subreq->source) { - case NETFS_UPLOAD_TO_SERVER: - netfs_stat(&netfs_n_wh_upload_done); - break; - case NETFS_WRITE_TO_CACHE: - netfs_stat(&netfs_n_wh_write_done); - break; - case NETFS_INVALID_WRITE: - break; - default: - BUG(); - } - - if (IS_ERR_VALUE(transferred_or_error)) { - subreq->error = transferred_or_error; - trace_netfs_failure(wreq, subreq, transferred_or_error, - netfs_fail_write); - goto failed; - } - - if (WARN(transferred_or_error > subreq->len - subreq->transferred, - "Subreq excess write: R%x[%x] %zd > %zu - %zu", - wreq->debug_id, subreq->debug_index, - transferred_or_error, subreq->len, subreq->transferred)) - transferred_or_error = subreq->len - subreq->transferred; - - subreq->error = 0; - subreq->transferred += transferred_or_error; - - if (iov_iter_count(&subreq->io_iter) != subreq->len - subreq->transferred) - pr_warn("R=%08x[%u] ITER POST-MISMATCH %zx != %zx-%zx %x\n", - wreq->debug_id, subreq->debug_index, - iov_iter_count(&subreq->io_iter), subreq->len, - subreq->transferred, subreq->io_iter.iter_type); - - if (subreq->transferred < subreq->len) - goto incomplete; - - __clear_bit(NETFS_SREQ_NO_PROGRESS, &subreq->flags); -out: - trace_netfs_sreq(subreq, netfs_sreq_trace_terminated); - - /* If we decrement nr_outstanding to 0, the ref belongs to us. */ - u = atomic_dec_return(&wreq->nr_outstanding); - if (u == 0) - netfs_write_terminated(wreq, was_async); - else if (u == 1) - wake_up_var(&wreq->nr_outstanding); - - netfs_put_subrequest(subreq, was_async, netfs_sreq_trace_put_terminated); - return; - -incomplete: - if (transferred_or_error == 0) { - if (__test_and_set_bit(NETFS_SREQ_NO_PROGRESS, &subreq->flags)) { - subreq->error = -ENODATA; - goto failed; - } - } else { - __clear_bit(NETFS_SREQ_NO_PROGRESS, &subreq->flags); - } - - __set_bit(NETFS_SREQ_SHORT_IO, &subreq->flags); - set_bit(NETFS_RREQ_INCOMPLETE_IO, &wreq->flags); - goto out; - -failed: - switch (subreq->source) { - case NETFS_WRITE_TO_CACHE: - netfs_stat(&netfs_n_wh_write_failed); - set_bit(NETFS_RREQ_INCOMPLETE_IO, &wreq->flags); - break; - case NETFS_UPLOAD_TO_SERVER: - netfs_stat(&netfs_n_wh_upload_failed); - set_bit(NETFS_RREQ_FAILED, &wreq->flags); - wreq->error = subreq->error; - break; - default: - break; - } - goto out; -} -EXPORT_SYMBOL(netfs_write_subrequest_terminated); - -static void netfs_write_to_cache_op(struct netfs_io_subrequest *subreq) -{ - struct netfs_io_request *wreq = subreq->rreq; - struct netfs_cache_resources *cres = &wreq->cache_resources; - - trace_netfs_sreq(subreq, netfs_sreq_trace_submit); - - cres->ops->write(cres, subreq->start, &subreq->io_iter, - netfs_write_subrequest_terminated, subreq); -} - -static void netfs_write_to_cache_op_worker(struct work_struct *work) -{ - struct netfs_io_subrequest *subreq = - container_of(work, struct netfs_io_subrequest, work); - - netfs_write_to_cache_op(subreq); -} - -/** - * netfs_queue_write_request - Queue a write request for attention - * @subreq: The write request to be queued - * - * Queue the specified write request for processing by a worker thread. We - * pass the caller's ref on the request to the worker thread. - */ -void netfs_queue_write_request(struct netfs_io_subrequest *subreq) -{ - if (!queue_work(system_unbound_wq, &subreq->work)) - netfs_put_subrequest(subreq, false, netfs_sreq_trace_put_wip); -} -EXPORT_SYMBOL(netfs_queue_write_request); - -/* - * Set up a op for writing to the cache. - */ -static void netfs_set_up_write_to_cache(struct netfs_io_request *wreq) -{ - struct netfs_cache_resources *cres = &wreq->cache_resources; - struct netfs_io_subrequest *subreq; - struct netfs_inode *ctx = netfs_inode(wreq->inode); - struct fscache_cookie *cookie = netfs_i_cookie(ctx); - loff_t start = wreq->start; - size_t len = wreq->len; - int ret; - - if (!fscache_cookie_enabled(cookie)) { - clear_bit(NETFS_RREQ_WRITE_TO_CACHE, &wreq->flags); - return; - } - - _debug("write to cache"); - ret = fscache_begin_write_operation(cres, cookie); - if (ret < 0) - return; - - ret = cres->ops->prepare_write(cres, &start, &len, wreq->upper_len, - i_size_read(wreq->inode), true); - if (ret < 0) - return; - - subreq = netfs_create_write_request(wreq, NETFS_WRITE_TO_CACHE, start, len, - netfs_write_to_cache_op_worker); - if (!subreq) - return; - - netfs_write_to_cache_op(subreq); -} - -/* - * Begin the process of writing out a chunk of data. - * - * We are given a write request that holds a series of dirty regions and - * (partially) covers a sequence of folios, all of which are present. The - * pages must have been marked as writeback as appropriate. - * - * We need to perform the following steps: - * - * (1) If encrypting, create an output buffer and encrypt each block of the - * data into it, otherwise the output buffer will point to the original - * folios. - * - * (2) If the data is to be cached, set up a write op for the entire output - * buffer to the cache, if the cache wants to accept it. - * - * (3) If the data is to be uploaded (ie. not merely cached): - * - * (a) If the data is to be compressed, create a compression buffer and - * compress the data into it. - * - * (b) For each destination we want to upload to, set up write ops to write - * to that destination. We may need multiple writes if the data is not - * contiguous or the span exceeds wsize for a server. - */ -int netfs_begin_write(struct netfs_io_request *wreq, bool may_wait, - enum netfs_write_trace what) -{ - struct netfs_inode *ctx = netfs_inode(wreq->inode); - - _enter("R=%x %llx-%llx f=%lx", - wreq->debug_id, wreq->start, wreq->start + wreq->len - 1, - wreq->flags); - - trace_netfs_write(wreq, what); - if (wreq->len == 0 || wreq->iter.count == 0) { - pr_err("Zero-sized write [R=%x]\n", wreq->debug_id); - return -EIO; - } - - if (wreq->origin == NETFS_DIO_WRITE) - inode_dio_begin(wreq->inode); - - wreq->io_iter = wreq->iter; - - /* ->outstanding > 0 carries a ref */ - netfs_get_request(wreq, netfs_rreq_trace_get_for_outstanding); - atomic_set(&wreq->nr_outstanding, 1); - - /* Start the encryption/compression going. We can do that in the - * background whilst we generate a list of write ops that we want to - * perform. - */ - // TODO: Encrypt or compress the region as appropriate - - /* We need to write all of the region to the cache */ - if (test_bit(NETFS_RREQ_WRITE_TO_CACHE, &wreq->flags)) - netfs_set_up_write_to_cache(wreq); - - /* However, we don't necessarily write all of the region to the server. - * Caching of reads is being managed this way also. - */ - if (test_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags)) - ctx->ops->create_write_requests(wreq, wreq->start, wreq->len); - - if (atomic_dec_and_test(&wreq->nr_outstanding)) - netfs_write_terminated(wreq, false); - - if (!may_wait) - return -EIOCBQUEUED; - - wait_on_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS, - TASK_UNINTERRUPTIBLE); - return wreq->error; -} - -/* - * Begin a write operation for writing through the pagecache. - */ -struct netfs_io_request *netfs_begin_writethrough(struct kiocb *iocb, size_t len) -{ - struct netfs_io_request *wreq; - struct file *file = iocb->ki_filp; - - wreq = netfs_alloc_request(file->f_mapping, file, iocb->ki_pos, len, - NETFS_WRITETHROUGH); - if (IS_ERR(wreq)) - return wreq; - - trace_netfs_write(wreq, netfs_write_trace_writethrough); - - __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); - iov_iter_xarray(&wreq->iter, ITER_SOURCE, &wreq->mapping->i_pages, wreq->start, 0); - wreq->io_iter = wreq->iter; - - /* ->outstanding > 0 carries a ref */ - netfs_get_request(wreq, netfs_rreq_trace_get_for_outstanding); - atomic_set(&wreq->nr_outstanding, 1); - return wreq; -} - -static void netfs_submit_writethrough(struct netfs_io_request *wreq, bool final) -{ - struct netfs_inode *ictx = netfs_inode(wreq->inode); - unsigned long long start; - size_t len; - - if (!test_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags)) - return; - - start = wreq->start + wreq->submitted; - len = wreq->iter.count - wreq->submitted; - if (!final) { - len /= wreq->wsize; /* Round to number of maximum packets */ - len *= wreq->wsize; - } - - ictx->ops->create_write_requests(wreq, start, len); - wreq->submitted += len; -} - -/* - * Advance the state of the write operation used when writing through the - * pagecache. Data has been copied into the pagecache that we need to append - * to the request. If we've added more than wsize then we need to create a new - * subrequest. - */ -int netfs_advance_writethrough(struct netfs_io_request *wreq, size_t copied, bool to_page_end) -{ - _enter("ic=%zu sb=%llu ws=%u cp=%zu tp=%u", - wreq->iter.count, wreq->submitted, wreq->wsize, copied, to_page_end); - - wreq->iter.count += copied; - wreq->io_iter.count += copied; - if (to_page_end && wreq->io_iter.count - wreq->submitted >= wreq->wsize) - netfs_submit_writethrough(wreq, false); - - return wreq->error; -} - -/* - * End a write operation used when writing through the pagecache. - */ -int netfs_end_writethrough(struct netfs_io_request *wreq, struct kiocb *iocb) -{ - int ret = -EIOCBQUEUED; - - _enter("ic=%zu sb=%llu ws=%u", - wreq->iter.count, wreq->submitted, wreq->wsize); - - if (wreq->submitted < wreq->io_iter.count) - netfs_submit_writethrough(wreq, true); - - if (atomic_dec_and_test(&wreq->nr_outstanding)) - netfs_write_terminated(wreq, false); - - if (is_sync_kiocb(iocb)) { - wait_on_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS, - TASK_UNINTERRUPTIBLE); - ret = wreq->error; - } - - netfs_put_request(wreq, false, netfs_rreq_trace_put_return); - return ret; -}
Do a couple of miscellaneous tidy ups: (1) Add a qualifier into a file banner comment. (2) Put the writeback folio traces back into alphabetical order. (3) Remove some unused folio traces. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/buffered_write.c | 2 +- include/trace/events/netfs.h | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 2da9905abec9..1eff9413eb1b 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Network filesystem high-level write support. +/* Network filesystem high-level buffered write support. * * Copyright (C) 2023 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com) diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index e7700172ae7e..4ba553a6d71b 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -141,12 +141,9 @@ EM(netfs_folio_trace_cancel_copy, "cancel-copy") \ EM(netfs_folio_trace_clear, "clear") \ EM(netfs_folio_trace_clear_cc, "clear-cc") \ - EM(netfs_folio_trace_clear_s, "clear-s") \ EM(netfs_folio_trace_clear_g, "clear-g") \ - EM(netfs_folio_trace_copy, "copy") \ - EM(netfs_folio_trace_copy_plus, "copy+") \ + EM(netfs_folio_trace_clear_s, "clear-s") \ EM(netfs_folio_trace_copy_to_cache, "mark-copy") \ - EM(netfs_folio_trace_end_copy, "end-copy") \ EM(netfs_folio_trace_filled_gaps, "filled-gaps") \ EM(netfs_folio_trace_kill, "kill") \ EM(netfs_folio_trace_kill_cc, "kill-cc") \ @@ -156,7 +153,6 @@ EM(netfs_folio_trace_mkwrite_plus, "mkwrite+") \ EM(netfs_folio_trace_not_under_wback, "!wback") \ EM(netfs_folio_trace_read_gaps, "read-gaps") \ - EM(netfs_folio_trace_redirty, "redirty") \ EM(netfs_folio_trace_redirtied, "redirtied") \ EM(netfs_folio_trace_store, "store") \ EM(netfs_folio_trace_store_copy, "store-copy") \
Cut over to using the new writeback code. The old code is #ifdef'd out or otherwise removed from compilation to avoid conflicts and will be removed in a future patch. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/9p/vfs_addr.c | 6 ++--- fs/afs/file.c | 3 +-- fs/afs/internal.h | 1 - fs/afs/write.c | 2 ++ fs/netfs/Makefile | 1 - fs/netfs/buffered_write.c | 46 +++++++++++++++++++++------------------ fs/netfs/direct_write.c | 26 ++++++++++++---------- fs/netfs/internal.h | 21 +++++------------- fs/netfs/write_collect.c | 8 +++---- fs/netfs/write_issue.c | 18 +++++++-------- include/linux/netfs.h | 9 -------- 11 files changed, 63 insertions(+), 78 deletions(-) diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 07d03efdd594..4845e655bc39 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -60,6 +60,7 @@ static void v9fs_issue_write(struct netfs_io_subrequest *subreq) netfs_write_subrequest_terminated(subreq, len ?: err, false); } +#if 0 // TODO: Remove static void v9fs_upload_to_server(struct netfs_io_subrequest *subreq) { struct p9_fid *fid = subreq->rreq->netfs_priv; @@ -91,6 +92,7 @@ static void v9fs_create_write_requests(struct netfs_io_request *wreq, loff_t sta if (subreq) netfs_queue_write_request(subreq); } +#endif /** * v9fs_issue_read - Issue a read from 9P @@ -121,18 +123,15 @@ static int v9fs_init_request(struct netfs_io_request *rreq, struct file *file) { struct p9_fid *fid; bool writing = (rreq->origin == NETFS_READ_FOR_WRITE || - rreq->origin == NETFS_WRITEBACK || rreq->origin == NETFS_WRITETHROUGH || rreq->origin == NETFS_UNBUFFERED_WRITE || rreq->origin == NETFS_DIO_WRITE); -#if 0 // TODO: Cut over if (rreq->origin == NETFS_WRITEBACK) return 0; /* We don't get the write handle until we find we * have actually dirty data and not just * copy-to-cache data. */ -#endif if (file) { fid = file->private_data; @@ -179,7 +178,6 @@ const struct netfs_request_ops v9fs_req_ops = { .issue_read = v9fs_issue_read, .begin_writeback = v9fs_begin_writeback, .issue_write = v9fs_issue_write, - .create_write_requests = v9fs_create_write_requests, }; const struct address_space_operations v9fs_addr_operations = { diff --git a/fs/afs/file.c b/fs/afs/file.c index db9ebae84fa2..8f983e3ecae7 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -353,7 +353,7 @@ static int afs_init_request(struct netfs_io_request *rreq, struct file *file) if (file) rreq->netfs_priv = key_get(afs_file_key(file)); rreq->rsize = 256 * 1024; - rreq->wsize = 256 * 1024; + rreq->wsize = 256 * 1024 * 1024; return 0; } @@ -399,7 +399,6 @@ const struct netfs_request_ops afs_req_ops = { .issue_read = afs_issue_read, .update_i_size = afs_update_i_size, .invalidate_cache = afs_netfs_invalidate_cache, - .create_write_requests = afs_create_write_requests, .begin_writeback = afs_begin_writeback, .prepare_write = afs_prepare_write, .issue_write = afs_issue_write, diff --git a/fs/afs/internal.h b/fs/afs/internal.h index dcf0ae0323d3..887245f9336d 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -1605,7 +1605,6 @@ extern int afs_writepages(struct address_space *, struct writeback_control *); extern int afs_fsync(struct file *, loff_t, loff_t, int); extern vm_fault_t afs_page_mkwrite(struct vm_fault *vmf); extern void afs_prune_wb_keys(struct afs_vnode *); -void afs_create_write_requests(struct netfs_io_request *wreq, loff_t start, size_t len); /* * xattr.c diff --git a/fs/afs/write.c b/fs/afs/write.c index 89b073881cac..0ead204c84cb 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -156,6 +156,7 @@ static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t return afs_put_operation(op); } +#if 0 // TODO: Remove static void afs_upload_to_server(struct netfs_io_subrequest *subreq) { struct afs_vnode *vnode = AFS_FS_I(subreq->rreq->inode); @@ -193,6 +194,7 @@ void afs_create_write_requests(struct netfs_io_request *wreq, loff_t start, size if (subreq) netfs_queue_write_request(subreq); } +#endif /* * Writeback calls this when it finds a folio that needs uploading. This isn't diff --git a/fs/netfs/Makefile b/fs/netfs/Makefile index 1eb86e34b5a9..8e6781e0b10b 100644 --- a/fs/netfs/Makefile +++ b/fs/netfs/Makefile @@ -11,7 +11,6 @@ netfs-y := \ main.o \ misc.o \ objects.o \ - output.o \ write_collect.o \ write_issue.o diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 621532dacef5..945e646cd2db 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -26,8 +26,6 @@ enum netfs_how_to_modify { NETFS_FLUSH_CONTENT, /* Flush incompatible content. */ }; -static void netfs_cleanup_buffered_write(struct netfs_io_request *wreq); - static void netfs_set_group(struct folio *folio, struct netfs_group *netfs_group) { void *priv = folio_get_private(folio); @@ -180,7 +178,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, }; struct netfs_io_request *wreq = NULL; struct netfs_folio *finfo; - struct folio *folio; + struct folio *folio, *writethrough = NULL; enum netfs_how_to_modify howto; enum netfs_folio_trace trace; unsigned int bdp_flags = (iocb->ki_flags & IOCB_SYNC) ? 0: BDP_ASYNC; @@ -210,7 +208,6 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, } if (!is_sync_kiocb(iocb)) wreq->iocb = iocb; - wreq->cleanup = netfs_cleanup_buffered_write; netfs_stat(&netfs_n_wh_writethrough); } else { netfs_stat(&netfs_n_wh_buffered_write); @@ -254,6 +251,15 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, offset = pos & (flen - 1); part = min_t(size_t, flen - offset, part); + /* Wait for writeback to complete. The writeback engine owns + * the info in folio->private and may change it until it + * removes the WB mark. + */ + if (folio_wait_writeback_killable(folio)) { + ret = written ? -EINTR : -ERESTARTSYS; + goto error_folio_unlock; + } + if (signal_pending(current)) { ret = written ? -EINTR : -ERESTARTSYS; goto error_folio_unlock; @@ -328,6 +334,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, maybe_trouble = true; iov_iter_revert(iter, copied); copied = 0; + folio_unlock(folio); goto retry; } netfs_set_group(folio, netfs_group); @@ -383,23 +390,16 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, if (likely(!wreq)) { folio_mark_dirty(folio); + folio_unlock(folio); } else { - if (folio_test_dirty(folio)) - /* Sigh. mmap. */ - folio_clear_dirty_for_io(folio); - /* We make multiple writes to the folio... */ - if (!folio_test_writeback(folio)) { - folio_start_writeback(folio); - if (wreq->iter.count == 0) - trace_netfs_folio(folio, netfs_folio_trace_wthru); - else - trace_netfs_folio(folio, netfs_folio_trace_wthru_plus); - } - netfs_advance_writethrough(wreq, copied, - offset + copied == flen); + if (pos > wreq->i_size) + wreq->i_size = pos; + netfs_advance_writethrough(wreq, &wbc, folio, copied, + offset + copied == flen, + &writethrough); + /* Folio unlocked */ } retry: - folio_unlock(folio); folio_put(folio); folio = NULL; @@ -408,7 +408,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, out: if (unlikely(wreq)) { - ret2 = netfs_end_writethrough(wreq, iocb); + ret2 = netfs_end_writethrough(wreq, &wbc, writethrough); wbc_detach_inode(&wbc); if (ret2 == -EIOCBQUEUED) return ret2; @@ -530,11 +530,13 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr sb_start_pagefault(inode->i_sb); - if (folio_wait_writeback_killable(folio)) + if (folio_lock_killable(folio) < 0) goto out; - if (folio_lock_killable(folio) < 0) + if (folio_wait_writeback_killable(folio)) { + ret = VM_FAULT_LOCKED; goto out; + } /* Can we see a streaming write here? */ if (WARN_ON(!folio_test_uptodate(folio))) { @@ -574,6 +576,7 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr } EXPORT_SYMBOL(netfs_page_mkwrite); +#if 0 // TODO: Remove /* * Kill all the pages in the given range */ @@ -1200,3 +1203,4 @@ int netfs_writepages(struct address_space *mapping, return ret; } EXPORT_SYMBOL(netfs_writepages); +#endif diff --git a/fs/netfs/direct_write.c b/fs/netfs/direct_write.c index 37c91188107b..330ba7cb3f10 100644 --- a/fs/netfs/direct_write.c +++ b/fs/netfs/direct_write.c @@ -34,6 +34,7 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov unsigned long long start = iocb->ki_pos; unsigned long long end = start + iov_iter_count(iter); ssize_t ret, n; + size_t len = iov_iter_count(iter); bool async = !is_sync_kiocb(iocb); _enter(""); @@ -46,13 +47,17 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov _debug("uw %llx-%llx", start, end); - wreq = netfs_alloc_request(iocb->ki_filp->f_mapping, iocb->ki_filp, - start, end - start, - iocb->ki_flags & IOCB_DIRECT ? - NETFS_DIO_WRITE : NETFS_UNBUFFERED_WRITE); + wreq = netfs_create_write_req(iocb->ki_filp->f_mapping, iocb->ki_filp, start, + iocb->ki_flags & IOCB_DIRECT ? + NETFS_DIO_WRITE : NETFS_UNBUFFERED_WRITE); if (IS_ERR(wreq)) return PTR_ERR(wreq); + wreq->io_streams[0].avail = true; + trace_netfs_write(wreq, (iocb->ki_flags & IOCB_DIRECT ? + netfs_write_trace_dio_write : + netfs_write_trace_unbuffered_write)); + { /* If this is an async op and we're not using a bounce buffer, * we have to save the source buffer as the iterator is only @@ -63,7 +68,7 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov * request. */ if (async || user_backed_iter(iter)) { - n = netfs_extract_user_iter(iter, wreq->len, &wreq->iter, 0); + n = netfs_extract_user_iter(iter, len, &wreq->iter, 0); if (n < 0) { ret = n; goto out; @@ -71,7 +76,6 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov wreq->direct_bv = (struct bio_vec *)wreq->iter.bvec; wreq->direct_bv_count = n; wreq->direct_bv_unpin = iov_iter_extract_will_pin(iter); - wreq->len = iov_iter_count(&wreq->iter); } else { wreq->iter = *iter; } @@ -79,6 +83,8 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov wreq->io_iter = wreq->iter; } + __set_bit(NETFS_RREQ_USE_IO_ITER, &wreq->flags); + /* Copy the data into the bounce buffer and encrypt it. */ // TODO @@ -87,10 +93,7 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov if (async) wreq->iocb = iocb; wreq->cleanup = netfs_cleanup_dio_write; - ret = netfs_begin_write(wreq, is_sync_kiocb(iocb), - iocb->ki_flags & IOCB_DIRECT ? - netfs_write_trace_dio_write : - netfs_write_trace_unbuffered_write); + ret = netfs_unbuffered_write(wreq, is_sync_kiocb(iocb), iov_iter_count(&wreq->io_iter)); if (ret < 0) { _debug("begin = %zd", ret); goto out; @@ -100,9 +103,8 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov trace_netfs_rreq(wreq, netfs_rreq_trace_wait_ip); wait_on_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS, TASK_UNINTERRUPTIBLE); - + smp_rmb(); /* Read error/transferred after RIP flag */ ret = wreq->error; - _debug("waited = %zd", ret); if (ret == 0) { ret = wreq->transferred; iocb->ki_pos += ret; diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h index 5d3f74a70fa7..95e281a8af78 100644 --- a/fs/netfs/internal.h +++ b/fs/netfs/internal.h @@ -92,15 +92,6 @@ static inline void netfs_see_request(struct netfs_io_request *rreq, trace_netfs_rreq_ref(rreq->debug_id, refcount_read(&rreq->ref), what); } -/* - * output.c - */ -int netfs_begin_write(struct netfs_io_request *wreq, bool may_wait, - enum netfs_write_trace what); -struct netfs_io_request *netfs_begin_writethrough(struct kiocb *iocb, size_t len); -int netfs_advance_writethrough(struct netfs_io_request *wreq, size_t copied, bool to_page_end); -int netfs_end_writethrough(struct netfs_io_request *wreq, struct kiocb *iocb); - /* * stats.c */ @@ -172,12 +163,12 @@ void netfs_reissue_write(struct netfs_io_stream *stream, int netfs_advance_write(struct netfs_io_request *wreq, struct netfs_io_stream *stream, loff_t start, size_t len, bool to_eof); -struct netfs_io_request *new_netfs_begin_writethrough(struct kiocb *iocb, size_t len); -int new_netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, - struct folio *folio, size_t copied, bool to_page_end, - struct folio **writethrough_cache); -int new_netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, - struct folio *writethrough_cache); +struct netfs_io_request *netfs_begin_writethrough(struct kiocb *iocb, size_t len); +int netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *folio, size_t copied, bool to_page_end, + struct folio **writethrough_cache); +int netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *writethrough_cache); int netfs_unbuffered_write(struct netfs_io_request *wreq, bool may_wait, size_t len); /* diff --git a/fs/netfs/write_collect.c b/fs/netfs/write_collect.c index 5e2ca8b25af0..bea939ab0830 100644 --- a/fs/netfs/write_collect.c +++ b/fs/netfs/write_collect.c @@ -714,7 +714,7 @@ void netfs_wake_write_collector(struct netfs_io_request *wreq, bool was_async) } /** - * new_netfs_write_subrequest_terminated - Note the termination of a write operation. + * netfs_write_subrequest_terminated - Note the termination of a write operation. * @_op: The I/O request that has terminated. * @transferred_or_error: The amount of data transferred or an error code. * @was_async: The termination was asynchronous @@ -736,8 +736,8 @@ void netfs_wake_write_collector(struct netfs_io_request *wreq, bool was_async) * Note that %_op is a void* so that the function can be passed to * kiocb::term_func without the need for a casting wrapper. */ -void new_netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, - bool was_async) +void netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, + bool was_async) { struct netfs_io_subrequest *subreq = _op; struct netfs_io_request *wreq = subreq->rreq; @@ -805,4 +805,4 @@ void new_netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_err netfs_put_subrequest(subreq, was_async, netfs_sreq_trace_put_terminated); } -EXPORT_SYMBOL(new_netfs_write_subrequest_terminated); +EXPORT_SYMBOL(netfs_write_subrequest_terminated); diff --git a/fs/netfs/write_issue.c b/fs/netfs/write_issue.c index e0fb472898f5..61e6208de235 100644 --- a/fs/netfs/write_issue.c +++ b/fs/netfs/write_issue.c @@ -485,8 +485,8 @@ static int netfs_write_folio(struct netfs_io_request *wreq, /* * Write some of the pending data back to the server */ -int new_netfs_writepages(struct address_space *mapping, - struct writeback_control *wbc) +int netfs_writepages(struct address_space *mapping, + struct writeback_control *wbc) { struct netfs_inode *ictx = netfs_inode(mapping->host); struct netfs_io_request *wreq = NULL; @@ -547,12 +547,12 @@ int new_netfs_writepages(struct address_space *mapping, _leave(" = %d", error); return error; } -EXPORT_SYMBOL(new_netfs_writepages); +EXPORT_SYMBOL(netfs_writepages); /* * Begin a write operation for writing through the pagecache. */ -struct netfs_io_request *new_netfs_begin_writethrough(struct kiocb *iocb, size_t len) +struct netfs_io_request *netfs_begin_writethrough(struct kiocb *iocb, size_t len) { struct netfs_io_request *wreq = NULL; struct netfs_inode *ictx = netfs_inode(file_inode(iocb->ki_filp)); @@ -575,9 +575,9 @@ struct netfs_io_request *new_netfs_begin_writethrough(struct kiocb *iocb, size_t * to the request. If we've added more than wsize then we need to create a new * subrequest. */ -int new_netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, - struct folio *folio, size_t copied, bool to_page_end, - struct folio **writethrough_cache) +int netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *folio, size_t copied, bool to_page_end, + struct folio **writethrough_cache) { _enter("R=%x ic=%zu ws=%u cp=%zu tp=%u", wreq->debug_id, wreq->iter.count, wreq->wsize, copied, to_page_end); @@ -607,8 +607,8 @@ int new_netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeba /* * End a write operation used when writing through the pagecache. */ -int new_netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, - struct folio *writethrough_cache) +int netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *writethrough_cache) { struct netfs_inode *ictx = netfs_inode(wreq->inode); int ret; diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 42dba05a428b..c2ba364041b0 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -303,8 +303,6 @@ struct netfs_request_ops { void (*update_i_size)(struct inode *inode, loff_t i_size); /* Write request handling */ - void (*create_write_requests)(struct netfs_io_request *wreq, - loff_t start, size_t len); void (*begin_writeback)(struct netfs_io_request *wreq); void (*prepare_write)(struct netfs_io_subrequest *subreq); void (*issue_write)(struct netfs_io_subrequest *subreq); @@ -409,8 +407,6 @@ int netfs_write_begin(struct netfs_inode *, struct file *, struct folio **, void **fsdata); int netfs_writepages(struct address_space *mapping, struct writeback_control *wbc); -int new_netfs_writepages(struct address_space *mapping, - struct writeback_control *wbc); bool netfs_dirty_folio(struct address_space *mapping, struct folio *folio); int netfs_unpin_writeback(struct inode *inode, struct writeback_control *wbc); void netfs_clear_inode_writeback(struct inode *inode, const void *aux); @@ -431,14 +427,9 @@ ssize_t netfs_extract_user_iter(struct iov_iter *orig, size_t orig_len, iov_iter_extraction_t extraction_flags); size_t netfs_limit_iter(const struct iov_iter *iter, size_t start_offset, size_t max_size, size_t max_segs); -struct netfs_io_subrequest *netfs_create_write_request( - struct netfs_io_request *wreq, enum netfs_io_source dest, - loff_t start, size_t len, work_func_t worker); void netfs_prepare_write_failed(struct netfs_io_subrequest *subreq); void netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, bool was_async); -void new_netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, - bool was_async); void netfs_queue_write_request(struct netfs_io_subrequest *subreq); int netfs_start_io_read(struct inode *inode);
Remove the old writeback code. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/9p/vfs_addr.c | 34 --- fs/afs/write.c | 40 --- fs/netfs/buffered_write.c | 629 -------------------------------------- fs/netfs/direct_write.c | 2 +- fs/netfs/output.c | 477 ----------------------------- 5 files changed, 1 insertion(+), 1181 deletions(-) delete mode 100644 fs/netfs/output.c diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 4845e655bc39..a97ceb105cd8 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -60,40 +60,6 @@ static void v9fs_issue_write(struct netfs_io_subrequest *subreq) netfs_write_subrequest_terminated(subreq, len ?: err, false); } -#if 0 // TODO: Remove -static void v9fs_upload_to_server(struct netfs_io_subrequest *subreq) -{ - struct p9_fid *fid = subreq->rreq->netfs_priv; - int err, len; - - trace_netfs_sreq(subreq, netfs_sreq_trace_submit); - len = p9_client_write(fid, subreq->start, &subreq->io_iter, &err); - netfs_write_subrequest_terminated(subreq, len ?: err, false); -} - -static void v9fs_upload_to_server_worker(struct work_struct *work) -{ - struct netfs_io_subrequest *subreq = - container_of(work, struct netfs_io_subrequest, work); - - v9fs_upload_to_server(subreq); -} - -/* - * Set up write requests for a writeback slice. We need to add a write request - * for each write we want to make. - */ -static void v9fs_create_write_requests(struct netfs_io_request *wreq, loff_t start, size_t len) -{ - struct netfs_io_subrequest *subreq; - - subreq = netfs_create_write_request(wreq, NETFS_UPLOAD_TO_SERVER, - start, len, v9fs_upload_to_server_worker); - if (subreq) - netfs_queue_write_request(subreq); -} -#endif - /** * v9fs_issue_read - Issue a read from 9P * @subreq: The read to make diff --git a/fs/afs/write.c b/fs/afs/write.c index 0ead204c84cb..6ef7d4cbc008 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -156,46 +156,6 @@ static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t return afs_put_operation(op); } -#if 0 // TODO: Remove -static void afs_upload_to_server(struct netfs_io_subrequest *subreq) -{ - struct afs_vnode *vnode = AFS_FS_I(subreq->rreq->inode); - ssize_t ret; - - _enter("%x[%x],%zx", - subreq->rreq->debug_id, subreq->debug_index, subreq->io_iter.count); - - trace_netfs_sreq(subreq, netfs_sreq_trace_submit); - ret = afs_store_data(vnode, &subreq->io_iter, subreq->start); - netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, - false); -} - -static void afs_upload_to_server_worker(struct work_struct *work) -{ - struct netfs_io_subrequest *subreq = - container_of(work, struct netfs_io_subrequest, work); - - afs_upload_to_server(subreq); -} - -/* - * Set up write requests for a writeback slice. We need to add a write request - * for each write we want to make. - */ -void afs_create_write_requests(struct netfs_io_request *wreq, loff_t start, size_t len) -{ - struct netfs_io_subrequest *subreq; - - _enter("%x,%llx-%llx", wreq->debug_id, start, start + len); - - subreq = netfs_create_write_request(wreq, NETFS_UPLOAD_TO_SERVER, - start, len, afs_upload_to_server_worker); - if (subreq) - netfs_queue_write_request(subreq); -} -#endif - /* * Writeback calls this when it finds a folio that needs uploading. This isn't * called if writeback only has copy-to-cache to deal with. diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 945e646cd2db..2da9905abec9 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -575,632 +575,3 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr return ret; } EXPORT_SYMBOL(netfs_page_mkwrite); - -#if 0 // TODO: Remove -/* - * Kill all the pages in the given range - */ -static void netfs_kill_pages(struct address_space *mapping, - loff_t start, loff_t len) -{ - struct folio *folio; - pgoff_t index = start / PAGE_SIZE; - pgoff_t last = (start + len - 1) / PAGE_SIZE, next; - - _enter("%llx-%llx", start, start + len - 1); - - do { - _debug("kill %lx (to %lx)", index, last); - - folio = filemap_get_folio(mapping, index); - if (IS_ERR(folio)) { - next = index + 1; - continue; - } - - next = folio_next_index(folio); - - trace_netfs_folio(folio, netfs_folio_trace_kill); - folio_clear_uptodate(folio); - folio_end_writeback(folio); - folio_lock(folio); - generic_error_remove_folio(mapping, folio); - folio_unlock(folio); - folio_put(folio); - - } while (index = next, index <= last); - - _leave(""); -} - -/* - * Redirty all the pages in a given range. - */ -static void netfs_redirty_pages(struct address_space *mapping, - loff_t start, loff_t len) -{ - struct folio *folio; - pgoff_t index = start / PAGE_SIZE; - pgoff_t last = (start + len - 1) / PAGE_SIZE, next; - - _enter("%llx-%llx", start, start + len - 1); - - do { - _debug("redirty %llx @%llx", len, start); - - folio = filemap_get_folio(mapping, index); - if (IS_ERR(folio)) { - next = index + 1; - continue; - } - - next = folio_next_index(folio); - trace_netfs_folio(folio, netfs_folio_trace_redirty); - filemap_dirty_folio(mapping, folio); - folio_end_writeback(folio); - folio_put(folio); - } while (index = next, index <= last); - - balance_dirty_pages_ratelimited(mapping); - - _leave(""); -} - -/* - * Completion of write to server - */ -static void netfs_pages_written_back(struct netfs_io_request *wreq) -{ - struct address_space *mapping = wreq->mapping; - struct netfs_folio *finfo; - struct netfs_group *group = NULL; - struct folio *folio; - pgoff_t last; - int gcount = 0; - - XA_STATE(xas, &mapping->i_pages, wreq->start / PAGE_SIZE); - - _enter("%llx-%llx", wreq->start, wreq->start + wreq->len); - - rcu_read_lock(); - - last = (wreq->start + wreq->len - 1) / PAGE_SIZE; - xas_for_each(&xas, folio, last) { - WARN(!folio_test_writeback(folio), - "bad %llx @%llx page %lx %lx\n", - wreq->len, wreq->start, folio->index, last); - - if ((finfo = netfs_folio_info(folio))) { - /* Streaming writes cannot be redirtied whilst under - * writeback, so discard the streaming record. - */ - folio_detach_private(folio); - group = finfo->netfs_group; - gcount++; - trace_netfs_folio(folio, netfs_folio_trace_clear_s); - kfree(finfo); - } else if ((group = netfs_folio_group(folio))) { - /* Need to detach the group pointer if the page didn't - * get redirtied. If it has been redirtied, then it - * must be within the same group. - */ - if (folio_test_dirty(folio)) { - trace_netfs_folio(folio, netfs_folio_trace_redirtied); - goto end_wb; - } - if (folio_trylock(folio)) { - if (!folio_test_dirty(folio)) { - folio_detach_private(folio); - gcount++; - if (group == NETFS_FOLIO_COPY_TO_CACHE) - trace_netfs_folio(folio, - netfs_folio_trace_end_copy); - else - trace_netfs_folio(folio, netfs_folio_trace_clear_g); - } else { - trace_netfs_folio(folio, netfs_folio_trace_redirtied); - } - folio_unlock(folio); - goto end_wb; - } - - xas_pause(&xas); - rcu_read_unlock(); - folio_lock(folio); - if (!folio_test_dirty(folio)) { - folio_detach_private(folio); - gcount++; - trace_netfs_folio(folio, netfs_folio_trace_clear_g); - } else { - trace_netfs_folio(folio, netfs_folio_trace_redirtied); - } - folio_unlock(folio); - rcu_read_lock(); - } else { - trace_netfs_folio(folio, netfs_folio_trace_clear); - } - end_wb: - xas_advance(&xas, folio_next_index(folio) - 1); - folio_end_writeback(folio); - } - - rcu_read_unlock(); - netfs_put_group_many(group, gcount); - _leave(""); -} - -/* - * Deal with the disposition of the folios that are under writeback to close - * out the operation. - */ -static void netfs_cleanup_buffered_write(struct netfs_io_request *wreq) -{ - struct address_space *mapping = wreq->mapping; - - _enter(""); - - switch (wreq->error) { - case 0: - netfs_pages_written_back(wreq); - break; - - default: - pr_notice("R=%08x Unexpected error %d\n", wreq->debug_id, wreq->error); - fallthrough; - case -EACCES: - case -EPERM: - case -ENOKEY: - case -EKEYEXPIRED: - case -EKEYREJECTED: - case -EKEYREVOKED: - case -ENETRESET: - case -EDQUOT: - case -ENOSPC: - netfs_redirty_pages(mapping, wreq->start, wreq->len); - break; - - case -EROFS: - case -EIO: - case -EREMOTEIO: - case -EFBIG: - case -ENOENT: - case -ENOMEDIUM: - case -ENXIO: - netfs_kill_pages(mapping, wreq->start, wreq->len); - break; - } - - if (wreq->error) - mapping_set_error(mapping, wreq->error); - if (wreq->netfs_ops->done) - wreq->netfs_ops->done(wreq); -} - -/* - * Extend the region to be written back to include subsequent contiguously - * dirty pages if possible, but don't sleep while doing so. - * - * If this page holds new content, then we can include filler zeros in the - * writeback. - */ -static void netfs_extend_writeback(struct address_space *mapping, - struct netfs_group *group, - struct xa_state *xas, - long *_count, - loff_t start, - loff_t max_len, - size_t *_len, - size_t *_top) -{ - struct netfs_folio *finfo; - struct folio_batch fbatch; - struct folio *folio; - unsigned int i; - pgoff_t index = (start + *_len) / PAGE_SIZE; - size_t len; - void *priv; - bool stop = true; - - folio_batch_init(&fbatch); - - do { - /* Firstly, we gather up a batch of contiguous dirty pages - * under the RCU read lock - but we can't clear the dirty flags - * there if any of those pages are mapped. - */ - rcu_read_lock(); - - xas_for_each(xas, folio, ULONG_MAX) { - stop = true; - if (xas_retry(xas, folio)) - continue; - if (xa_is_value(folio)) - break; - if (folio->index != index) { - xas_reset(xas); - break; - } - - if (!folio_try_get_rcu(folio)) { - xas_reset(xas); - continue; - } - - /* Has the folio moved or been split? */ - if (unlikely(folio != xas_reload(xas))) { - folio_put(folio); - xas_reset(xas); - break; - } - - if (!folio_trylock(folio)) { - folio_put(folio); - xas_reset(xas); - break; - } - if (!folio_test_dirty(folio) || - folio_test_writeback(folio)) { - folio_unlock(folio); - folio_put(folio); - xas_reset(xas); - break; - } - - stop = false; - len = folio_size(folio); - priv = folio_get_private(folio); - if ((const struct netfs_group *)priv != group) { - stop = true; - finfo = netfs_folio_info(folio); - if (!finfo || - finfo->netfs_group != group || - finfo->dirty_offset > 0) { - folio_unlock(folio); - folio_put(folio); - xas_reset(xas); - break; - } - len = finfo->dirty_len; - } - - *_top += folio_size(folio); - index += folio_nr_pages(folio); - *_count -= folio_nr_pages(folio); - *_len += len; - if (*_len >= max_len || *_count <= 0) - stop = true; - - if (!folio_batch_add(&fbatch, folio)) - break; - if (stop) - break; - } - - xas_pause(xas); - rcu_read_unlock(); - - /* Now, if we obtained any folios, we can shift them to being - * writable and mark them for caching. - */ - if (!folio_batch_count(&fbatch)) - break; - - for (i = 0; i < folio_batch_count(&fbatch); i++) { - folio = fbatch.folios[i]; - if (group == NETFS_FOLIO_COPY_TO_CACHE) - trace_netfs_folio(folio, netfs_folio_trace_copy_plus); - else - trace_netfs_folio(folio, netfs_folio_trace_store_plus); - - if (!folio_clear_dirty_for_io(folio)) - BUG(); - folio_start_writeback(folio); - folio_unlock(folio); - } - - folio_batch_release(&fbatch); - cond_resched(); - } while (!stop); -} - -/* - * Synchronously write back the locked page and any subsequent non-locked dirty - * pages. - */ -static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, - struct writeback_control *wbc, - struct netfs_group *group, - struct xa_state *xas, - struct folio *folio, - unsigned long long start, - unsigned long long end) -{ - struct netfs_io_request *wreq; - struct netfs_folio *finfo; - struct netfs_inode *ctx = netfs_inode(mapping->host); - unsigned long long i_size = i_size_read(&ctx->inode); - size_t len, max_len; - long count = wbc->nr_to_write; - int ret; - - _enter(",%lx,%llx-%llx", folio->index, start, end); - - wreq = netfs_alloc_request(mapping, NULL, start, folio_size(folio), - group == NETFS_FOLIO_COPY_TO_CACHE ? - NETFS_COPY_TO_CACHE : NETFS_WRITEBACK); - if (IS_ERR(wreq)) { - folio_unlock(folio); - return PTR_ERR(wreq); - } - - if (!folio_clear_dirty_for_io(folio)) - BUG(); - folio_start_writeback(folio); - - count -= folio_nr_pages(folio); - - /* Find all consecutive lockable dirty pages that have contiguous - * written regions, stopping when we find a page that is not - * immediately lockable, is not dirty or is missing, or we reach the - * end of the range. - */ - if (group == NETFS_FOLIO_COPY_TO_CACHE) - trace_netfs_folio(folio, netfs_folio_trace_copy); - else - trace_netfs_folio(folio, netfs_folio_trace_store); - - len = wreq->len; - finfo = netfs_folio_info(folio); - if (finfo) { - start += finfo->dirty_offset; - if (finfo->dirty_offset + finfo->dirty_len != len) { - len = finfo->dirty_len; - goto cant_expand; - } - len = finfo->dirty_len; - } - - if (start < i_size) { - /* Trim the write to the EOF; the extra data is ignored. Also - * put an upper limit on the size of a single storedata op. - */ - max_len = 65536 * 4096; - max_len = min_t(unsigned long long, max_len, end - start + 1); - max_len = min_t(unsigned long long, max_len, i_size - start); - - if (len < max_len) - netfs_extend_writeback(mapping, group, xas, &count, start, - max_len, &len, &wreq->upper_len); - } - -cant_expand: - len = min_t(unsigned long long, len, i_size - start); - - /* We now have a contiguous set of dirty pages, each with writeback - * set; the first page is still locked at this point, but all the rest - * have been unlocked. - */ - folio_unlock(folio); - wreq->start = start; - wreq->len = len; - - if (start < i_size) { - _debug("write back %zx @%llx [%llx]", len, start, i_size); - - /* Speculatively write to the cache. We have to fix this up - * later if the store fails. - */ - wreq->cleanup = netfs_cleanup_buffered_write; - - iov_iter_xarray(&wreq->iter, ITER_SOURCE, &mapping->i_pages, start, - wreq->upper_len); - if (group != NETFS_FOLIO_COPY_TO_CACHE) { - __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); - ret = netfs_begin_write(wreq, true, netfs_write_trace_writeback); - } else { - ret = netfs_begin_write(wreq, true, netfs_write_trace_copy_to_cache); - } - if (ret == 0 || ret == -EIOCBQUEUED) - wbc->nr_to_write -= len / PAGE_SIZE; - } else { - _debug("write discard %zx @%llx [%llx]", len, start, i_size); - - /* The dirty region was entirely beyond the EOF. */ - netfs_pages_written_back(wreq); - ret = 0; - } - - netfs_put_request(wreq, false, netfs_rreq_trace_put_return); - _leave(" = 1"); - return 1; -} - -/* - * Write a region of pages back to the server - */ -static ssize_t netfs_writepages_begin(struct address_space *mapping, - struct writeback_control *wbc, - struct netfs_group *group, - struct xa_state *xas, - unsigned long long *_start, - unsigned long long end) -{ - const struct netfs_folio *finfo; - struct folio *folio; - unsigned long long start = *_start; - ssize_t ret; - void *priv; - int skips = 0; - - _enter("%llx,%llx,", start, end); - -search_again: - /* Find the first dirty page in the group. */ - rcu_read_lock(); - - for (;;) { - folio = xas_find_marked(xas, end / PAGE_SIZE, PAGECACHE_TAG_DIRTY); - if (xas_retry(xas, folio) || xa_is_value(folio)) - continue; - if (!folio) - break; - - if (!folio_try_get_rcu(folio)) { - xas_reset(xas); - continue; - } - - if (unlikely(folio != xas_reload(xas))) { - folio_put(folio); - xas_reset(xas); - continue; - } - - /* Skip any dirty folio that's not in the group of interest. */ - priv = folio_get_private(folio); - if ((const struct netfs_group *)priv == NETFS_FOLIO_COPY_TO_CACHE) { - group = NETFS_FOLIO_COPY_TO_CACHE; - } else if ((const struct netfs_group *)priv != group) { - finfo = __netfs_folio_info(priv); - if (!finfo || finfo->netfs_group != group) { - folio_put(folio); - continue; - } - } - - xas_pause(xas); - break; - } - rcu_read_unlock(); - if (!folio) - return 0; - - start = folio_pos(folio); /* May regress with THPs */ - - _debug("wback %lx", folio->index); - - /* At this point we hold neither the i_pages lock nor the page lock: - * the page may be truncated or invalidated (changing page->mapping to - * NULL), or even swizzled back from swapper_space to tmpfs file - * mapping - */ -lock_again: - if (wbc->sync_mode != WB_SYNC_NONE) { - ret = folio_lock_killable(folio); - if (ret < 0) - return ret; - } else { - if (!folio_trylock(folio)) - goto search_again; - } - - if (folio->mapping != mapping || - !folio_test_dirty(folio)) { - start += folio_size(folio); - folio_unlock(folio); - goto search_again; - } - - if (folio_test_writeback(folio)) { - folio_unlock(folio); - if (wbc->sync_mode != WB_SYNC_NONE) { - folio_wait_writeback(folio); - goto lock_again; - } - - start += folio_size(folio); - if (wbc->sync_mode == WB_SYNC_NONE) { - if (skips >= 5 || need_resched()) { - ret = 0; - goto out; - } - skips++; - } - goto search_again; - } - - ret = netfs_write_back_from_locked_folio(mapping, wbc, group, xas, - folio, start, end); -out: - if (ret > 0) - *_start = start + ret; - _leave(" = %zd [%llx]", ret, *_start); - return ret; -} - -/* - * Write a region of pages back to the server - */ -static int netfs_writepages_region(struct address_space *mapping, - struct writeback_control *wbc, - struct netfs_group *group, - unsigned long long *_start, - unsigned long long end) -{ - ssize_t ret; - - XA_STATE(xas, &mapping->i_pages, *_start / PAGE_SIZE); - - do { - ret = netfs_writepages_begin(mapping, wbc, group, &xas, - _start, end); - if (ret > 0 && wbc->nr_to_write > 0) - cond_resched(); - } while (ret > 0 && wbc->nr_to_write > 0); - - return ret > 0 ? 0 : ret; -} - -/* - * write some of the pending data back to the server - */ -int netfs_writepages(struct address_space *mapping, - struct writeback_control *wbc) -{ - struct netfs_group *group = NULL; - loff_t start, end; - int ret; - - _enter(""); - - /* We have to be careful as we can end up racing with setattr() - * truncating the pagecache since the caller doesn't take a lock here - * to prevent it. - */ - - if (wbc->range_cyclic && mapping->writeback_index) { - start = mapping->writeback_index * PAGE_SIZE; - ret = netfs_writepages_region(mapping, wbc, group, - &start, LLONG_MAX); - if (ret < 0) - goto out; - - if (wbc->nr_to_write <= 0) { - mapping->writeback_index = start / PAGE_SIZE; - goto out; - } - - start = 0; - end = mapping->writeback_index * PAGE_SIZE; - mapping->writeback_index = 0; - ret = netfs_writepages_region(mapping, wbc, group, &start, end); - if (ret == 0) - mapping->writeback_index = start / PAGE_SIZE; - } else if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) { - start = 0; - ret = netfs_writepages_region(mapping, wbc, group, - &start, LLONG_MAX); - if (wbc->nr_to_write > 0 && ret == 0) - mapping->writeback_index = start / PAGE_SIZE; - } else { - start = wbc->range_start; - ret = netfs_writepages_region(mapping, wbc, group, - &start, wbc->range_end); - } - -out: - _leave(" = %d", ret); - return ret; -} -EXPORT_SYMBOL(netfs_writepages); -#endif diff --git a/fs/netfs/direct_write.c b/fs/netfs/direct_write.c index 330ba7cb3f10..e4a9cf7cd234 100644 --- a/fs/netfs/direct_write.c +++ b/fs/netfs/direct_write.c @@ -37,7 +37,7 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov size_t len = iov_iter_count(iter); bool async = !is_sync_kiocb(iocb); - _enter(""); + _enter("%lx", iov_iter_count(iter)); /* We're going to need a bounce buffer if what we transmit is going to * be different in some way to the source buffer, e.g. because it gets diff --git a/fs/netfs/output.c b/fs/netfs/output.c deleted file mode 100644 index 85374322f10f..000000000000 --- a/fs/netfs/output.c +++ /dev/null @@ -1,477 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Network filesystem high-level write support. - * - * Copyright (C) 2023 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - */ - -#include <linux/fs.h> -#include <linux/mm.h> -#include <linux/pagemap.h> -#include <linux/slab.h> -#include <linux/writeback.h> -#include <linux/pagevec.h> -#include "internal.h" - -/** - * netfs_create_write_request - Create a write operation. - * @wreq: The write request this is storing from. - * @dest: The destination type - * @start: Start of the region this write will modify - * @len: Length of the modification - * @worker: The worker function to handle the write(s) - * - * Allocate a write operation, set it up and add it to the list on a write - * request. - */ -struct netfs_io_subrequest *netfs_create_write_request(struct netfs_io_request *wreq, - enum netfs_io_source dest, - loff_t start, size_t len, - work_func_t worker) -{ - struct netfs_io_subrequest *subreq; - - subreq = netfs_alloc_subrequest(wreq); - if (subreq) { - INIT_WORK(&subreq->work, worker); - subreq->source = dest; - subreq->start = start; - subreq->len = len; - - switch (subreq->source) { - case NETFS_UPLOAD_TO_SERVER: - netfs_stat(&netfs_n_wh_upload); - break; - case NETFS_WRITE_TO_CACHE: - netfs_stat(&netfs_n_wh_write); - break; - default: - BUG(); - } - - subreq->io_iter = wreq->io_iter; - iov_iter_advance(&subreq->io_iter, subreq->start - wreq->start); - iov_iter_truncate(&subreq->io_iter, subreq->len); - - trace_netfs_sreq_ref(wreq->debug_id, subreq->debug_index, - refcount_read(&subreq->ref), - netfs_sreq_trace_new); - atomic_inc(&wreq->nr_outstanding); - list_add_tail(&subreq->rreq_link, &wreq->subrequests); - trace_netfs_sreq(subreq, netfs_sreq_trace_prepare); - } - - return subreq; -} -EXPORT_SYMBOL(netfs_create_write_request); - -/* - * Process a completed write request once all the component operations have - * been completed. - */ -static void netfs_write_terminated(struct netfs_io_request *wreq, bool was_async) -{ - struct netfs_io_subrequest *subreq; - struct netfs_inode *ctx = netfs_inode(wreq->inode); - size_t transferred = 0; - - _enter("R=%x[]", wreq->debug_id); - - trace_netfs_rreq(wreq, netfs_rreq_trace_write_done); - - list_for_each_entry(subreq, &wreq->subrequests, rreq_link) { - if (subreq->error || subreq->transferred == 0) - break; - transferred += subreq->transferred; - if (subreq->transferred < subreq->len) - break; - } - wreq->transferred = transferred; - - list_for_each_entry(subreq, &wreq->subrequests, rreq_link) { - if (!subreq->error) - continue; - switch (subreq->source) { - case NETFS_UPLOAD_TO_SERVER: - /* Depending on the type of failure, this may prevent - * writeback completion unless we're in disconnected - * mode. - */ - if (!wreq->error) - wreq->error = subreq->error; - break; - - case NETFS_WRITE_TO_CACHE: - /* Failure doesn't prevent writeback completion unless - * we're in disconnected mode. - */ - if (subreq->error != -ENOBUFS) - ctx->ops->invalidate_cache(wreq); - break; - - default: - WARN_ON_ONCE(1); - if (!wreq->error) - wreq->error = -EIO; - return; - } - } - - wreq->cleanup(wreq); - - if (wreq->origin == NETFS_DIO_WRITE && - wreq->mapping->nrpages) { - pgoff_t first = wreq->start >> PAGE_SHIFT; - pgoff_t last = (wreq->start + wreq->transferred - 1) >> PAGE_SHIFT; - invalidate_inode_pages2_range(wreq->mapping, first, last); - } - - if (wreq->origin == NETFS_DIO_WRITE) - inode_dio_end(wreq->inode); - - _debug("finished"); - trace_netfs_rreq(wreq, netfs_rreq_trace_wake_ip); - clear_bit_unlock(NETFS_RREQ_IN_PROGRESS, &wreq->flags); - wake_up_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS); - - if (wreq->iocb) { - wreq->iocb->ki_pos += transferred; - if (wreq->iocb->ki_complete) - wreq->iocb->ki_complete( - wreq->iocb, wreq->error ? wreq->error : transferred); - } - - netfs_clear_subrequests(wreq, was_async); - netfs_put_request(wreq, was_async, netfs_rreq_trace_put_complete); -} - -/* - * Deal with the completion of writing the data to the cache. - */ -void netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, - bool was_async) -{ - struct netfs_io_subrequest *subreq = _op; - struct netfs_io_request *wreq = subreq->rreq; - unsigned int u; - - _enter("%x[%x] %zd", wreq->debug_id, subreq->debug_index, transferred_or_error); - - switch (subreq->source) { - case NETFS_UPLOAD_TO_SERVER: - netfs_stat(&netfs_n_wh_upload_done); - break; - case NETFS_WRITE_TO_CACHE: - netfs_stat(&netfs_n_wh_write_done); - break; - case NETFS_INVALID_WRITE: - break; - default: - BUG(); - } - - if (IS_ERR_VALUE(transferred_or_error)) { - subreq->error = transferred_or_error; - trace_netfs_failure(wreq, subreq, transferred_or_error, - netfs_fail_write); - goto failed; - } - - if (WARN(transferred_or_error > subreq->len - subreq->transferred, - "Subreq excess write: R%x[%x] %zd > %zu - %zu", - wreq->debug_id, subreq->debug_index, - transferred_or_error, subreq->len, subreq->transferred)) - transferred_or_error = subreq->len - subreq->transferred; - - subreq->error = 0; - subreq->transferred += transferred_or_error; - - if (iov_iter_count(&subreq->io_iter) != subreq->len - subreq->transferred) - pr_warn("R=%08x[%u] ITER POST-MISMATCH %zx != %zx-%zx %x\n", - wreq->debug_id, subreq->debug_index, - iov_iter_count(&subreq->io_iter), subreq->len, - subreq->transferred, subreq->io_iter.iter_type); - - if (subreq->transferred < subreq->len) - goto incomplete; - - __clear_bit(NETFS_SREQ_NO_PROGRESS, &subreq->flags); -out: - trace_netfs_sreq(subreq, netfs_sreq_trace_terminated); - - /* If we decrement nr_outstanding to 0, the ref belongs to us. */ - u = atomic_dec_return(&wreq->nr_outstanding); - if (u == 0) - netfs_write_terminated(wreq, was_async); - else if (u == 1) - wake_up_var(&wreq->nr_outstanding); - - netfs_put_subrequest(subreq, was_async, netfs_sreq_trace_put_terminated); - return; - -incomplete: - if (transferred_or_error == 0) { - if (__test_and_set_bit(NETFS_SREQ_NO_PROGRESS, &subreq->flags)) { - subreq->error = -ENODATA; - goto failed; - } - } else { - __clear_bit(NETFS_SREQ_NO_PROGRESS, &subreq->flags); - } - - __set_bit(NETFS_SREQ_SHORT_IO, &subreq->flags); - set_bit(NETFS_RREQ_INCOMPLETE_IO, &wreq->flags); - goto out; - -failed: - switch (subreq->source) { - case NETFS_WRITE_TO_CACHE: - netfs_stat(&netfs_n_wh_write_failed); - set_bit(NETFS_RREQ_INCOMPLETE_IO, &wreq->flags); - break; - case NETFS_UPLOAD_TO_SERVER: - netfs_stat(&netfs_n_wh_upload_failed); - set_bit(NETFS_RREQ_FAILED, &wreq->flags); - wreq->error = subreq->error; - break; - default: - break; - } - goto out; -} -EXPORT_SYMBOL(netfs_write_subrequest_terminated); - -static void netfs_write_to_cache_op(struct netfs_io_subrequest *subreq) -{ - struct netfs_io_request *wreq = subreq->rreq; - struct netfs_cache_resources *cres = &wreq->cache_resources; - - trace_netfs_sreq(subreq, netfs_sreq_trace_submit); - - cres->ops->write(cres, subreq->start, &subreq->io_iter, - netfs_write_subrequest_terminated, subreq); -} - -static void netfs_write_to_cache_op_worker(struct work_struct *work) -{ - struct netfs_io_subrequest *subreq = - container_of(work, struct netfs_io_subrequest, work); - - netfs_write_to_cache_op(subreq); -} - -/** - * netfs_queue_write_request - Queue a write request for attention - * @subreq: The write request to be queued - * - * Queue the specified write request for processing by a worker thread. We - * pass the caller's ref on the request to the worker thread. - */ -void netfs_queue_write_request(struct netfs_io_subrequest *subreq) -{ - if (!queue_work(system_unbound_wq, &subreq->work)) - netfs_put_subrequest(subreq, false, netfs_sreq_trace_put_wip); -} -EXPORT_SYMBOL(netfs_queue_write_request); - -/* - * Set up a op for writing to the cache. - */ -static void netfs_set_up_write_to_cache(struct netfs_io_request *wreq) -{ - struct netfs_cache_resources *cres = &wreq->cache_resources; - struct netfs_io_subrequest *subreq; - struct netfs_inode *ctx = netfs_inode(wreq->inode); - struct fscache_cookie *cookie = netfs_i_cookie(ctx); - loff_t start = wreq->start; - size_t len = wreq->len; - int ret; - - if (!fscache_cookie_enabled(cookie)) { - clear_bit(NETFS_RREQ_WRITE_TO_CACHE, &wreq->flags); - return; - } - - _debug("write to cache"); - ret = fscache_begin_write_operation(cres, cookie); - if (ret < 0) - return; - - ret = cres->ops->prepare_write(cres, &start, &len, wreq->upper_len, - i_size_read(wreq->inode), true); - if (ret < 0) - return; - - subreq = netfs_create_write_request(wreq, NETFS_WRITE_TO_CACHE, start, len, - netfs_write_to_cache_op_worker); - if (!subreq) - return; - - netfs_write_to_cache_op(subreq); -} - -/* - * Begin the process of writing out a chunk of data. - * - * We are given a write request that holds a series of dirty regions and - * (partially) covers a sequence of folios, all of which are present. The - * pages must have been marked as writeback as appropriate. - * - * We need to perform the following steps: - * - * (1) If encrypting, create an output buffer and encrypt each block of the - * data into it, otherwise the output buffer will point to the original - * folios. - * - * (2) If the data is to be cached, set up a write op for the entire output - * buffer to the cache, if the cache wants to accept it. - * - * (3) If the data is to be uploaded (ie. not merely cached): - * - * (a) If the data is to be compressed, create a compression buffer and - * compress the data into it. - * - * (b) For each destination we want to upload to, set up write ops to write - * to that destination. We may need multiple writes if the data is not - * contiguous or the span exceeds wsize for a server. - */ -int netfs_begin_write(struct netfs_io_request *wreq, bool may_wait, - enum netfs_write_trace what) -{ - struct netfs_inode *ctx = netfs_inode(wreq->inode); - - _enter("R=%x %llx-%llx f=%lx", - wreq->debug_id, wreq->start, wreq->start + wreq->len - 1, - wreq->flags); - - trace_netfs_write(wreq, what); - if (wreq->len == 0 || wreq->iter.count == 0) { - pr_err("Zero-sized write [R=%x]\n", wreq->debug_id); - return -EIO; - } - - if (wreq->origin == NETFS_DIO_WRITE) - inode_dio_begin(wreq->inode); - - wreq->io_iter = wreq->iter; - - /* ->outstanding > 0 carries a ref */ - netfs_get_request(wreq, netfs_rreq_trace_get_for_outstanding); - atomic_set(&wreq->nr_outstanding, 1); - - /* Start the encryption/compression going. We can do that in the - * background whilst we generate a list of write ops that we want to - * perform. - */ - // TODO: Encrypt or compress the region as appropriate - - /* We need to write all of the region to the cache */ - if (test_bit(NETFS_RREQ_WRITE_TO_CACHE, &wreq->flags)) - netfs_set_up_write_to_cache(wreq); - - /* However, we don't necessarily write all of the region to the server. - * Caching of reads is being managed this way also. - */ - if (test_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags)) - ctx->ops->create_write_requests(wreq, wreq->start, wreq->len); - - if (atomic_dec_and_test(&wreq->nr_outstanding)) - netfs_write_terminated(wreq, false); - - if (!may_wait) - return -EIOCBQUEUED; - - wait_on_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS, - TASK_UNINTERRUPTIBLE); - return wreq->error; -} - -/* - * Begin a write operation for writing through the pagecache. - */ -struct netfs_io_request *netfs_begin_writethrough(struct kiocb *iocb, size_t len) -{ - struct netfs_io_request *wreq; - struct file *file = iocb->ki_filp; - - wreq = netfs_alloc_request(file->f_mapping, file, iocb->ki_pos, len, - NETFS_WRITETHROUGH); - if (IS_ERR(wreq)) - return wreq; - - trace_netfs_write(wreq, netfs_write_trace_writethrough); - - __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); - iov_iter_xarray(&wreq->iter, ITER_SOURCE, &wreq->mapping->i_pages, wreq->start, 0); - wreq->io_iter = wreq->iter; - - /* ->outstanding > 0 carries a ref */ - netfs_get_request(wreq, netfs_rreq_trace_get_for_outstanding); - atomic_set(&wreq->nr_outstanding, 1); - return wreq; -} - -static void netfs_submit_writethrough(struct netfs_io_request *wreq, bool final) -{ - struct netfs_inode *ictx = netfs_inode(wreq->inode); - unsigned long long start; - size_t len; - - if (!test_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags)) - return; - - start = wreq->start + wreq->submitted; - len = wreq->iter.count - wreq->submitted; - if (!final) { - len /= wreq->wsize; /* Round to number of maximum packets */ - len *= wreq->wsize; - } - - ictx->ops->create_write_requests(wreq, start, len); - wreq->submitted += len; -} - -/* - * Advance the state of the write operation used when writing through the - * pagecache. Data has been copied into the pagecache that we need to append - * to the request. If we've added more than wsize then we need to create a new - * subrequest. - */ -int netfs_advance_writethrough(struct netfs_io_request *wreq, size_t copied, bool to_page_end) -{ - _enter("ic=%zu sb=%llu ws=%u cp=%zu tp=%u", - wreq->iter.count, wreq->submitted, wreq->wsize, copied, to_page_end); - - wreq->iter.count += copied; - wreq->io_iter.count += copied; - if (to_page_end && wreq->io_iter.count - wreq->submitted >= wreq->wsize) - netfs_submit_writethrough(wreq, false); - - return wreq->error; -} - -/* - * End a write operation used when writing through the pagecache. - */ -int netfs_end_writethrough(struct netfs_io_request *wreq, struct kiocb *iocb) -{ - int ret = -EIOCBQUEUED; - - _enter("ic=%zu sb=%llu ws=%u", - wreq->iter.count, wreq->submitted, wreq->wsize); - - if (wreq->submitted < wreq->io_iter.count) - netfs_submit_writethrough(wreq, true); - - if (atomic_dec_and_test(&wreq->nr_outstanding)) - netfs_write_terminated(wreq, false); - - if (is_sync_kiocb(iocb)) { - wait_on_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS, - TASK_UNINTERRUPTIBLE); - ret = wreq->error; - } - - netfs_put_request(wreq, false, netfs_rreq_trace_put_return); - return ret; -}
Implement the helpers for the new write code in cachefiles. There's now an optional ->prepare_write() that allows the filesystem to set the parameters for the next write, such as maximum size and maximum segment count, and an ->issue_write() that is called to initiate an (asynchronous) write operation. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-erofs@lists.ozlabs.org cc: linux-fsdevel@vger.kernel.org --- fs/cachefiles/io.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c index 5ba5c7814fe4..437b24b0fd1c 100644 --- a/fs/cachefiles/io.c +++ b/fs/cachefiles/io.c @@ -622,6 +622,77 @@ static int cachefiles_prepare_write(struct netfs_cache_resources *cres, return ret; } +static void cachefiles_prepare_write_subreq(struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *wreq = subreq->rreq; + struct netfs_cache_resources *cres = &wreq->cache_resources; + + _enter("W=%x[%x] %llx", wreq->debug_id, subreq->debug_index, subreq->start); + + subreq->max_len = ULONG_MAX; + subreq->max_nr_segs = BIO_MAX_VECS; + + if (!cachefiles_cres_file(cres)) { + if (!fscache_wait_for_operation(cres, FSCACHE_WANT_WRITE)) + return netfs_prepare_write_failed(subreq); + if (!cachefiles_cres_file(cres)) + return netfs_prepare_write_failed(subreq); + } +} + +static void cachefiles_issue_write(struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *wreq = subreq->rreq; + struct netfs_cache_resources *cres = &wreq->cache_resources; + struct cachefiles_object *object = cachefiles_cres_object(cres); + struct cachefiles_cache *cache = object->volume->cache; + const struct cred *saved_cred; + size_t off, pre, post, len = subreq->len; + loff_t start = subreq->start; + int ret; + + _enter("W=%x[%x] %llx-%llx", + wreq->debug_id, subreq->debug_index, start, start + len - 1); + + /* We need to start on the cache granularity boundary */ + off = start & (CACHEFILES_DIO_BLOCK_SIZE - 1); + if (off) { + pre = CACHEFILES_DIO_BLOCK_SIZE - off; + if (pre >= len) { + netfs_write_subrequest_terminated(subreq, len, false); + return; + } + subreq->transferred += pre; + start += pre; + len -= pre; + iov_iter_advance(&subreq->io_iter, pre); + } + + /* We also need to end on the cache granularity boundary */ + post = len & (CACHEFILES_DIO_BLOCK_SIZE - 1); + if (post) { + len -= post; + if (len == 0) { + netfs_write_subrequest_terminated(subreq, post, false); + return; + } + iov_iter_truncate(&subreq->io_iter, len); + } + + cachefiles_begin_secure(cache, &saved_cred); + ret = __cachefiles_prepare_write(object, cachefiles_cres_file(cres), + &start, &len, len, true); + cachefiles_end_secure(cache, saved_cred); + if (ret < 0) { + netfs_write_subrequest_terminated(subreq, ret, false); + return; + } + + cachefiles_write(&subreq->rreq->cache_resources, + subreq->start, &subreq->io_iter, + netfs_write_subrequest_terminated, subreq); +} + /* * Clean up an operation. */ @@ -638,8 +709,10 @@ static const struct netfs_cache_ops cachefiles_netfs_cache_ops = { .end_operation = cachefiles_end_operation, .read = cachefiles_read, .write = cachefiles_write, + .issue_write = cachefiles_issue_write, .prepare_read = cachefiles_prepare_read, .prepare_write = cachefiles_prepare_write, + .prepare_write_subreq = cachefiles_prepare_write_subreq, .prepare_ondemand_read = cachefiles_prepare_ondemand_read, .query_occupancy = cachefiles_query_occupancy, };
Cut over to using the new writeback code. The old code is #ifdef'd out or otherwise removed from compilation to avoid conflicts and will be removed in a future patch. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/9p/vfs_addr.c | 6 ++--- fs/afs/file.c | 3 +-- fs/afs/internal.h | 1 - fs/afs/write.c | 2 ++ fs/netfs/Makefile | 1 - fs/netfs/buffered_write.c | 46 +++++++++++++++++++++------------------ fs/netfs/direct_write.c | 26 ++++++++++++---------- fs/netfs/internal.h | 21 +++++------------- fs/netfs/write_collect.c | 8 +++---- fs/netfs/write_issue.c | 18 +++++++-------- include/linux/netfs.h | 9 -------- 11 files changed, 63 insertions(+), 78 deletions(-) diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 07d03efdd594..4845e655bc39 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -60,6 +60,7 @@ static void v9fs_issue_write(struct netfs_io_subrequest *subreq) netfs_write_subrequest_terminated(subreq, len ?: err, false); } +#if 0 // TODO: Remove static void v9fs_upload_to_server(struct netfs_io_subrequest *subreq) { struct p9_fid *fid = subreq->rreq->netfs_priv; @@ -91,6 +92,7 @@ static void v9fs_create_write_requests(struct netfs_io_request *wreq, loff_t sta if (subreq) netfs_queue_write_request(subreq); } +#endif /** * v9fs_issue_read - Issue a read from 9P @@ -121,18 +123,15 @@ static int v9fs_init_request(struct netfs_io_request *rreq, struct file *file) { struct p9_fid *fid; bool writing = (rreq->origin == NETFS_READ_FOR_WRITE || - rreq->origin == NETFS_WRITEBACK || rreq->origin == NETFS_WRITETHROUGH || rreq->origin == NETFS_UNBUFFERED_WRITE || rreq->origin == NETFS_DIO_WRITE); -#if 0 // TODO: Cut over if (rreq->origin == NETFS_WRITEBACK) return 0; /* We don't get the write handle until we find we * have actually dirty data and not just * copy-to-cache data. */ -#endif if (file) { fid = file->private_data; @@ -179,7 +178,6 @@ const struct netfs_request_ops v9fs_req_ops = { .issue_read = v9fs_issue_read, .begin_writeback = v9fs_begin_writeback, .issue_write = v9fs_issue_write, - .create_write_requests = v9fs_create_write_requests, }; const struct address_space_operations v9fs_addr_operations = { diff --git a/fs/afs/file.c b/fs/afs/file.c index db9ebae84fa2..8f983e3ecae7 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -353,7 +353,7 @@ static int afs_init_request(struct netfs_io_request *rreq, struct file *file) if (file) rreq->netfs_priv = key_get(afs_file_key(file)); rreq->rsize = 256 * 1024; - rreq->wsize = 256 * 1024; + rreq->wsize = 256 * 1024 * 1024; return 0; } @@ -399,7 +399,6 @@ const struct netfs_request_ops afs_req_ops = { .issue_read = afs_issue_read, .update_i_size = afs_update_i_size, .invalidate_cache = afs_netfs_invalidate_cache, - .create_write_requests = afs_create_write_requests, .begin_writeback = afs_begin_writeback, .prepare_write = afs_prepare_write, .issue_write = afs_issue_write, diff --git a/fs/afs/internal.h b/fs/afs/internal.h index dcf0ae0323d3..887245f9336d 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -1605,7 +1605,6 @@ extern int afs_writepages(struct address_space *, struct writeback_control *); extern int afs_fsync(struct file *, loff_t, loff_t, int); extern vm_fault_t afs_page_mkwrite(struct vm_fault *vmf); extern void afs_prune_wb_keys(struct afs_vnode *); -void afs_create_write_requests(struct netfs_io_request *wreq, loff_t start, size_t len); /* * xattr.c diff --git a/fs/afs/write.c b/fs/afs/write.c index 89b073881cac..0ead204c84cb 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -156,6 +156,7 @@ static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t return afs_put_operation(op); } +#if 0 // TODO: Remove static void afs_upload_to_server(struct netfs_io_subrequest *subreq) { struct afs_vnode *vnode = AFS_FS_I(subreq->rreq->inode); @@ -193,6 +194,7 @@ void afs_create_write_requests(struct netfs_io_request *wreq, loff_t start, size if (subreq) netfs_queue_write_request(subreq); } +#endif /* * Writeback calls this when it finds a folio that needs uploading. This isn't diff --git a/fs/netfs/Makefile b/fs/netfs/Makefile index 1eb86e34b5a9..8e6781e0b10b 100644 --- a/fs/netfs/Makefile +++ b/fs/netfs/Makefile @@ -11,7 +11,6 @@ netfs-y := \ main.o \ misc.o \ objects.o \ - output.o \ write_collect.o \ write_issue.o diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 621532dacef5..945e646cd2db 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -26,8 +26,6 @@ enum netfs_how_to_modify { NETFS_FLUSH_CONTENT, /* Flush incompatible content. */ }; -static void netfs_cleanup_buffered_write(struct netfs_io_request *wreq); - static void netfs_set_group(struct folio *folio, struct netfs_group *netfs_group) { void *priv = folio_get_private(folio); @@ -180,7 +178,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, }; struct netfs_io_request *wreq = NULL; struct netfs_folio *finfo; - struct folio *folio; + struct folio *folio, *writethrough = NULL; enum netfs_how_to_modify howto; enum netfs_folio_trace trace; unsigned int bdp_flags = (iocb->ki_flags & IOCB_SYNC) ? 0: BDP_ASYNC; @@ -210,7 +208,6 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, } if (!is_sync_kiocb(iocb)) wreq->iocb = iocb; - wreq->cleanup = netfs_cleanup_buffered_write; netfs_stat(&netfs_n_wh_writethrough); } else { netfs_stat(&netfs_n_wh_buffered_write); @@ -254,6 +251,15 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, offset = pos & (flen - 1); part = min_t(size_t, flen - offset, part); + /* Wait for writeback to complete. The writeback engine owns + * the info in folio->private and may change it until it + * removes the WB mark. + */ + if (folio_wait_writeback_killable(folio)) { + ret = written ? -EINTR : -ERESTARTSYS; + goto error_folio_unlock; + } + if (signal_pending(current)) { ret = written ? -EINTR : -ERESTARTSYS; goto error_folio_unlock; @@ -328,6 +334,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, maybe_trouble = true; iov_iter_revert(iter, copied); copied = 0; + folio_unlock(folio); goto retry; } netfs_set_group(folio, netfs_group); @@ -383,23 +390,16 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, if (likely(!wreq)) { folio_mark_dirty(folio); + folio_unlock(folio); } else { - if (folio_test_dirty(folio)) - /* Sigh. mmap. */ - folio_clear_dirty_for_io(folio); - /* We make multiple writes to the folio... */ - if (!folio_test_writeback(folio)) { - folio_start_writeback(folio); - if (wreq->iter.count == 0) - trace_netfs_folio(folio, netfs_folio_trace_wthru); - else - trace_netfs_folio(folio, netfs_folio_trace_wthru_plus); - } - netfs_advance_writethrough(wreq, copied, - offset + copied == flen); + if (pos > wreq->i_size) + wreq->i_size = pos; + netfs_advance_writethrough(wreq, &wbc, folio, copied, + offset + copied == flen, + &writethrough); + /* Folio unlocked */ } retry: - folio_unlock(folio); folio_put(folio); folio = NULL; @@ -408,7 +408,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, out: if (unlikely(wreq)) { - ret2 = netfs_end_writethrough(wreq, iocb); + ret2 = netfs_end_writethrough(wreq, &wbc, writethrough); wbc_detach_inode(&wbc); if (ret2 == -EIOCBQUEUED) return ret2; @@ -530,11 +530,13 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr sb_start_pagefault(inode->i_sb); - if (folio_wait_writeback_killable(folio)) + if (folio_lock_killable(folio) < 0) goto out; - if (folio_lock_killable(folio) < 0) + if (folio_wait_writeback_killable(folio)) { + ret = VM_FAULT_LOCKED; goto out; + } /* Can we see a streaming write here? */ if (WARN_ON(!folio_test_uptodate(folio))) { @@ -574,6 +576,7 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr } EXPORT_SYMBOL(netfs_page_mkwrite); +#if 0 // TODO: Remove /* * Kill all the pages in the given range */ @@ -1200,3 +1203,4 @@ int netfs_writepages(struct address_space *mapping, return ret; } EXPORT_SYMBOL(netfs_writepages); +#endif diff --git a/fs/netfs/direct_write.c b/fs/netfs/direct_write.c index 37c91188107b..330ba7cb3f10 100644 --- a/fs/netfs/direct_write.c +++ b/fs/netfs/direct_write.c @@ -34,6 +34,7 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov unsigned long long start = iocb->ki_pos; unsigned long long end = start + iov_iter_count(iter); ssize_t ret, n; + size_t len = iov_iter_count(iter); bool async = !is_sync_kiocb(iocb); _enter(""); @@ -46,13 +47,17 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov _debug("uw %llx-%llx", start, end); - wreq = netfs_alloc_request(iocb->ki_filp->f_mapping, iocb->ki_filp, - start, end - start, - iocb->ki_flags & IOCB_DIRECT ? - NETFS_DIO_WRITE : NETFS_UNBUFFERED_WRITE); + wreq = netfs_create_write_req(iocb->ki_filp->f_mapping, iocb->ki_filp, start, + iocb->ki_flags & IOCB_DIRECT ? + NETFS_DIO_WRITE : NETFS_UNBUFFERED_WRITE); if (IS_ERR(wreq)) return PTR_ERR(wreq); + wreq->io_streams[0].avail = true; + trace_netfs_write(wreq, (iocb->ki_flags & IOCB_DIRECT ? + netfs_write_trace_dio_write : + netfs_write_trace_unbuffered_write)); + { /* If this is an async op and we're not using a bounce buffer, * we have to save the source buffer as the iterator is only @@ -63,7 +68,7 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov * request. */ if (async || user_backed_iter(iter)) { - n = netfs_extract_user_iter(iter, wreq->len, &wreq->iter, 0); + n = netfs_extract_user_iter(iter, len, &wreq->iter, 0); if (n < 0) { ret = n; goto out; @@ -71,7 +76,6 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov wreq->direct_bv = (struct bio_vec *)wreq->iter.bvec; wreq->direct_bv_count = n; wreq->direct_bv_unpin = iov_iter_extract_will_pin(iter); - wreq->len = iov_iter_count(&wreq->iter); } else { wreq->iter = *iter; } @@ -79,6 +83,8 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov wreq->io_iter = wreq->iter; } + __set_bit(NETFS_RREQ_USE_IO_ITER, &wreq->flags); + /* Copy the data into the bounce buffer and encrypt it. */ // TODO @@ -87,10 +93,7 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov if (async) wreq->iocb = iocb; wreq->cleanup = netfs_cleanup_dio_write; - ret = netfs_begin_write(wreq, is_sync_kiocb(iocb), - iocb->ki_flags & IOCB_DIRECT ? - netfs_write_trace_dio_write : - netfs_write_trace_unbuffered_write); + ret = netfs_unbuffered_write(wreq, is_sync_kiocb(iocb), iov_iter_count(&wreq->io_iter)); if (ret < 0) { _debug("begin = %zd", ret); goto out; @@ -100,9 +103,8 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov trace_netfs_rreq(wreq, netfs_rreq_trace_wait_ip); wait_on_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS, TASK_UNINTERRUPTIBLE); - + smp_rmb(); /* Read error/transferred after RIP flag */ ret = wreq->error; - _debug("waited = %zd", ret); if (ret == 0) { ret = wreq->transferred; iocb->ki_pos += ret; diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h index 5d3f74a70fa7..95e281a8af78 100644 --- a/fs/netfs/internal.h +++ b/fs/netfs/internal.h @@ -92,15 +92,6 @@ static inline void netfs_see_request(struct netfs_io_request *rreq, trace_netfs_rreq_ref(rreq->debug_id, refcount_read(&rreq->ref), what); } -/* - * output.c - */ -int netfs_begin_write(struct netfs_io_request *wreq, bool may_wait, - enum netfs_write_trace what); -struct netfs_io_request *netfs_begin_writethrough(struct kiocb *iocb, size_t len); -int netfs_advance_writethrough(struct netfs_io_request *wreq, size_t copied, bool to_page_end); -int netfs_end_writethrough(struct netfs_io_request *wreq, struct kiocb *iocb); - /* * stats.c */ @@ -172,12 +163,12 @@ void netfs_reissue_write(struct netfs_io_stream *stream, int netfs_advance_write(struct netfs_io_request *wreq, struct netfs_io_stream *stream, loff_t start, size_t len, bool to_eof); -struct netfs_io_request *new_netfs_begin_writethrough(struct kiocb *iocb, size_t len); -int new_netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, - struct folio *folio, size_t copied, bool to_page_end, - struct folio **writethrough_cache); -int new_netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, - struct folio *writethrough_cache); +struct netfs_io_request *netfs_begin_writethrough(struct kiocb *iocb, size_t len); +int netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *folio, size_t copied, bool to_page_end, + struct folio **writethrough_cache); +int netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *writethrough_cache); int netfs_unbuffered_write(struct netfs_io_request *wreq, bool may_wait, size_t len); /* diff --git a/fs/netfs/write_collect.c b/fs/netfs/write_collect.c index 5e2ca8b25af0..bea939ab0830 100644 --- a/fs/netfs/write_collect.c +++ b/fs/netfs/write_collect.c @@ -714,7 +714,7 @@ void netfs_wake_write_collector(struct netfs_io_request *wreq, bool was_async) } /** - * new_netfs_write_subrequest_terminated - Note the termination of a write operation. + * netfs_write_subrequest_terminated - Note the termination of a write operation. * @_op: The I/O request that has terminated. * @transferred_or_error: The amount of data transferred or an error code. * @was_async: The termination was asynchronous @@ -736,8 +736,8 @@ void netfs_wake_write_collector(struct netfs_io_request *wreq, bool was_async) * Note that %_op is a void* so that the function can be passed to * kiocb::term_func without the need for a casting wrapper. */ -void new_netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, - bool was_async) +void netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, + bool was_async) { struct netfs_io_subrequest *subreq = _op; struct netfs_io_request *wreq = subreq->rreq; @@ -805,4 +805,4 @@ void new_netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_err netfs_put_subrequest(subreq, was_async, netfs_sreq_trace_put_terminated); } -EXPORT_SYMBOL(new_netfs_write_subrequest_terminated); +EXPORT_SYMBOL(netfs_write_subrequest_terminated); diff --git a/fs/netfs/write_issue.c b/fs/netfs/write_issue.c index e0fb472898f5..61e6208de235 100644 --- a/fs/netfs/write_issue.c +++ b/fs/netfs/write_issue.c @@ -485,8 +485,8 @@ static int netfs_write_folio(struct netfs_io_request *wreq, /* * Write some of the pending data back to the server */ -int new_netfs_writepages(struct address_space *mapping, - struct writeback_control *wbc) +int netfs_writepages(struct address_space *mapping, + struct writeback_control *wbc) { struct netfs_inode *ictx = netfs_inode(mapping->host); struct netfs_io_request *wreq = NULL; @@ -547,12 +547,12 @@ int new_netfs_writepages(struct address_space *mapping, _leave(" = %d", error); return error; } -EXPORT_SYMBOL(new_netfs_writepages); +EXPORT_SYMBOL(netfs_writepages); /* * Begin a write operation for writing through the pagecache. */ -struct netfs_io_request *new_netfs_begin_writethrough(struct kiocb *iocb, size_t len) +struct netfs_io_request *netfs_begin_writethrough(struct kiocb *iocb, size_t len) { struct netfs_io_request *wreq = NULL; struct netfs_inode *ictx = netfs_inode(file_inode(iocb->ki_filp)); @@ -575,9 +575,9 @@ struct netfs_io_request *new_netfs_begin_writethrough(struct kiocb *iocb, size_t * to the request. If we've added more than wsize then we need to create a new * subrequest. */ -int new_netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, - struct folio *folio, size_t copied, bool to_page_end, - struct folio **writethrough_cache) +int netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *folio, size_t copied, bool to_page_end, + struct folio **writethrough_cache) { _enter("R=%x ic=%zu ws=%u cp=%zu tp=%u", wreq->debug_id, wreq->iter.count, wreq->wsize, copied, to_page_end); @@ -607,8 +607,8 @@ int new_netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeba /* * End a write operation used when writing through the pagecache. */ -int new_netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, - struct folio *writethrough_cache) +int netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *writethrough_cache) { struct netfs_inode *ictx = netfs_inode(wreq->inode); int ret; diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 42dba05a428b..c2ba364041b0 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -303,8 +303,6 @@ struct netfs_request_ops { void (*update_i_size)(struct inode *inode, loff_t i_size); /* Write request handling */ - void (*create_write_requests)(struct netfs_io_request *wreq, - loff_t start, size_t len); void (*begin_writeback)(struct netfs_io_request *wreq); void (*prepare_write)(struct netfs_io_subrequest *subreq); void (*issue_write)(struct netfs_io_subrequest *subreq); @@ -409,8 +407,6 @@ int netfs_write_begin(struct netfs_inode *, struct file *, struct folio **, void **fsdata); int netfs_writepages(struct address_space *mapping, struct writeback_control *wbc); -int new_netfs_writepages(struct address_space *mapping, - struct writeback_control *wbc); bool netfs_dirty_folio(struct address_space *mapping, struct folio *folio); int netfs_unpin_writeback(struct inode *inode, struct writeback_control *wbc); void netfs_clear_inode_writeback(struct inode *inode, const void *aux); @@ -431,14 +427,9 @@ ssize_t netfs_extract_user_iter(struct iov_iter *orig, size_t orig_len, iov_iter_extraction_t extraction_flags); size_t netfs_limit_iter(const struct iov_iter *iter, size_t start_offset, size_t max_size, size_t max_segs); -struct netfs_io_subrequest *netfs_create_write_request( - struct netfs_io_request *wreq, enum netfs_io_source dest, - loff_t start, size_t len, work_func_t worker); void netfs_prepare_write_failed(struct netfs_io_subrequest *subreq); void netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, bool was_async); -void new_netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, - bool was_async); void netfs_queue_write_request(struct netfs_io_subrequest *subreq); int netfs_start_io_read(struct inode *inode);
Implement the helpers for the new write code in 9p. There's now an optional ->prepare_write() that allows the filesystem to set the parameters for the next write, such as maximum size and maximum segment count, and an ->issue_write() that is called to initiate an (asynchronous) write operation. Signed-off-by: David Howells <dhowells@redhat.com> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Jeff Layton <jlayton@kernel.org> cc: v9fs@lists.linux.dev cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/9p/vfs_addr.c | 48 ++++++++++++++++++++++++++++++++++++++++ include/net/9p/client.h | 2 ++ net/9p/Kconfig | 1 + net/9p/client.c | 49 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 5a943c122d83..07d03efdd594 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -26,6 +26,40 @@ #include "cache.h" #include "fid.h" +/* + * Writeback calls this when it finds a folio that needs uploading. This isn't + * called if writeback only has copy-to-cache to deal with. + */ +static void v9fs_begin_writeback(struct netfs_io_request *wreq) +{ + struct p9_fid *fid; + + fid = v9fs_fid_find_inode(wreq->inode, true, INVALID_UID, true); + if (!fid) { + WARN_ONCE(1, "folio expected an open fid inode->i_ino=%lx\n", + wreq->inode->i_ino); + return; + } + + wreq->wsize = fid->clnt->msize - P9_IOHDRSZ; + if (fid->iounit) + wreq->wsize = min(wreq->wsize, fid->iounit); + wreq->netfs_priv = fid; + wreq->io_streams[0].avail = true; +} + +/* + * Issue a subrequest to write to the server. + */ +static void v9fs_issue_write(struct netfs_io_subrequest *subreq) +{ + struct p9_fid *fid = subreq->rreq->netfs_priv; + int err, len; + + len = p9_client_write(fid, subreq->start, &subreq->io_iter, &err); + netfs_write_subrequest_terminated(subreq, len ?: err, false); +} + static void v9fs_upload_to_server(struct netfs_io_subrequest *subreq) { struct p9_fid *fid = subreq->rreq->netfs_priv; @@ -92,6 +126,14 @@ static int v9fs_init_request(struct netfs_io_request *rreq, struct file *file) rreq->origin == NETFS_UNBUFFERED_WRITE || rreq->origin == NETFS_DIO_WRITE); +#if 0 // TODO: Cut over + if (rreq->origin == NETFS_WRITEBACK) + return 0; /* We don't get the write handle until we find we + * have actually dirty data and not just + * copy-to-cache data. + */ +#endif + if (file) { fid = file->private_data; if (!fid) @@ -103,6 +145,10 @@ static int v9fs_init_request(struct netfs_io_request *rreq, struct file *file) goto no_fid; } + rreq->wsize = fid->clnt->msize - P9_IOHDRSZ; + if (fid->iounit) + rreq->wsize = min(rreq->wsize, fid->iounit); + /* we might need to read from a fid that was opened write-only * for read-modify-write of page cache, use the writeback fid * for that */ @@ -131,6 +177,8 @@ const struct netfs_request_ops v9fs_req_ops = { .init_request = v9fs_init_request, .free_request = v9fs_free_request, .issue_read = v9fs_issue_read, + .begin_writeback = v9fs_begin_writeback, + .issue_write = v9fs_issue_write, .create_write_requests = v9fs_create_write_requests, }; diff --git a/include/net/9p/client.h b/include/net/9p/client.h index 78ebcf782ce5..4f785098c67a 100644 --- a/include/net/9p/client.h +++ b/include/net/9p/client.h @@ -207,6 +207,8 @@ int p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err int p9_client_read_once(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err); int p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err); +struct netfs_io_subrequest; +void p9_client_write_subreq(struct netfs_io_subrequest *subreq); int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset); int p9dirent_read(struct p9_client *clnt, char *buf, int len, struct p9_dirent *dirent); diff --git a/net/9p/Kconfig b/net/9p/Kconfig index 00ebce9e5a65..bcdab9c23b40 100644 --- a/net/9p/Kconfig +++ b/net/9p/Kconfig @@ -5,6 +5,7 @@ menuconfig NET_9P tristate "Plan 9 Resource Sharing Support (9P2000)" + select NETFS_SUPPORT help If you say Y here, you will get experimental support for Plan 9 resource sharing via the 9P2000 protocol. diff --git a/net/9p/client.c b/net/9p/client.c index e265a0ca6bdd..844aca4fe4d8 100644 --- a/net/9p/client.c +++ b/net/9p/client.c @@ -18,6 +18,7 @@ #include <linux/sched/signal.h> #include <linux/uaccess.h> #include <linux/uio.h> +#include <linux/netfs.h> #include <net/9p/9p.h> #include <linux/parser.h> #include <linux/seq_file.h> @@ -1661,6 +1662,54 @@ p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err) } EXPORT_SYMBOL(p9_client_write); +void +p9_client_write_subreq(struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *wreq = subreq->rreq; + struct p9_fid *fid = wreq->netfs_priv; + struct p9_client *clnt = fid->clnt; + struct p9_req_t *req; + unsigned long long start = subreq->start + subreq->transferred; + size_t len = subreq->len - subreq->transferred; + int written, err; + + p9_debug(P9_DEBUG_9P, ">>> TWRITE fid %d offset %llu len %zd\n", + fid->fid, start, len); + + /* Don't bother zerocopy for small IO (< 1024) */ + if (clnt->trans_mod->zc_request && len > 1024) { + req = p9_client_zc_rpc(clnt, P9_TWRITE, NULL, &subreq->io_iter, + 0, wreq->len, P9_ZC_HDR_SZ, "dqd", + fid->fid, start, len); + } else { + req = p9_client_rpc(clnt, P9_TWRITE, "dqV", fid->fid, + start, len, &subreq->io_iter); + } + if (IS_ERR(req)) { + netfs_write_subrequest_terminated(subreq, PTR_ERR(req), false); + return; + } + + err = p9pdu_readf(&req->rc, clnt->proto_version, "d", &written); + if (err) { + trace_9p_protocol_dump(clnt, &req->rc); + p9_req_put(clnt, req); + netfs_write_subrequest_terminated(subreq, err, false); + return; + } + + if (written > len) { + pr_err("bogus RWRITE count (%d > %lu)\n", written, len); + written = len; + } + + p9_debug(P9_DEBUG_9P, "<<< RWRITE count %zd\n", len); + + p9_req_put(clnt, req); + netfs_write_subrequest_terminated(subreq, written, false); +} +EXPORT_SYMBOL(p9_client_write_subreq); + struct p9_wstat *p9_client_stat(struct p9_fid *fid) { int err;
Implement the helpers for the new write code in cachefiles. There's now an optional ->prepare_write() that allows the filesystem to set the parameters for the next write, such as maximum size and maximum segment count, and an ->issue_write() that is called to initiate an (asynchronous) write operation. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-erofs@lists.ozlabs.org cc: linux-fsdevel@vger.kernel.org --- fs/cachefiles/io.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c index 5ba5c7814fe4..437b24b0fd1c 100644 --- a/fs/cachefiles/io.c +++ b/fs/cachefiles/io.c @@ -622,6 +622,77 @@ static int cachefiles_prepare_write(struct netfs_cache_resources *cres, return ret; } +static void cachefiles_prepare_write_subreq(struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *wreq = subreq->rreq; + struct netfs_cache_resources *cres = &wreq->cache_resources; + + _enter("W=%x[%x] %llx", wreq->debug_id, subreq->debug_index, subreq->start); + + subreq->max_len = ULONG_MAX; + subreq->max_nr_segs = BIO_MAX_VECS; + + if (!cachefiles_cres_file(cres)) { + if (!fscache_wait_for_operation(cres, FSCACHE_WANT_WRITE)) + return netfs_prepare_write_failed(subreq); + if (!cachefiles_cres_file(cres)) + return netfs_prepare_write_failed(subreq); + } +} + +static void cachefiles_issue_write(struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *wreq = subreq->rreq; + struct netfs_cache_resources *cres = &wreq->cache_resources; + struct cachefiles_object *object = cachefiles_cres_object(cres); + struct cachefiles_cache *cache = object->volume->cache; + const struct cred *saved_cred; + size_t off, pre, post, len = subreq->len; + loff_t start = subreq->start; + int ret; + + _enter("W=%x[%x] %llx-%llx", + wreq->debug_id, subreq->debug_index, start, start + len - 1); + + /* We need to start on the cache granularity boundary */ + off = start & (CACHEFILES_DIO_BLOCK_SIZE - 1); + if (off) { + pre = CACHEFILES_DIO_BLOCK_SIZE - off; + if (pre >= len) { + netfs_write_subrequest_terminated(subreq, len, false); + return; + } + subreq->transferred += pre; + start += pre; + len -= pre; + iov_iter_advance(&subreq->io_iter, pre); + } + + /* We also need to end on the cache granularity boundary */ + post = len & (CACHEFILES_DIO_BLOCK_SIZE - 1); + if (post) { + len -= post; + if (len == 0) { + netfs_write_subrequest_terminated(subreq, post, false); + return; + } + iov_iter_truncate(&subreq->io_iter, len); + } + + cachefiles_begin_secure(cache, &saved_cred); + ret = __cachefiles_prepare_write(object, cachefiles_cres_file(cres), + &start, &len, len, true); + cachefiles_end_secure(cache, saved_cred); + if (ret < 0) { + netfs_write_subrequest_terminated(subreq, ret, false); + return; + } + + cachefiles_write(&subreq->rreq->cache_resources, + subreq->start, &subreq->io_iter, + netfs_write_subrequest_terminated, subreq); +} + /* * Clean up an operation. */ @@ -638,8 +709,10 @@ static const struct netfs_cache_ops cachefiles_netfs_cache_ops = { .end_operation = cachefiles_end_operation, .read = cachefiles_read, .write = cachefiles_write, + .issue_write = cachefiles_issue_write, .prepare_read = cachefiles_prepare_read, .prepare_write = cachefiles_prepare_write, + .prepare_write_subreq = cachefiles_prepare_write_subreq, .prepare_ondemand_read = cachefiles_prepare_ondemand_read, .query_occupancy = cachefiles_query_occupancy, };
Implement the helpers for the new write code in afs. There's now an optional ->prepare_write() that allows the filesystem to set the parameters for the next write, such as maximum size and maximum segment count, and an ->issue_write() that is called to initiate an (asynchronous) write operation. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/afs/file.c | 3 +++ fs/afs/internal.h | 3 +++ fs/afs/write.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/fs/afs/file.c b/fs/afs/file.c index dfd8f60f5e1f..db9ebae84fa2 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -400,6 +400,9 @@ const struct netfs_request_ops afs_req_ops = { .update_i_size = afs_update_i_size, .invalidate_cache = afs_netfs_invalidate_cache, .create_write_requests = afs_create_write_requests, + .begin_writeback = afs_begin_writeback, + .prepare_write = afs_prepare_write, + .issue_write = afs_issue_write, }; static void afs_add_open_mmap(struct afs_vnode *vnode) diff --git a/fs/afs/internal.h b/fs/afs/internal.h index b93aa026daa4..dcf0ae0323d3 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -1598,6 +1598,9 @@ extern int afs_check_volume_status(struct afs_volume *, struct afs_operation *); /* * write.c */ +void afs_prepare_write(struct netfs_io_subrequest *subreq); +void afs_issue_write(struct netfs_io_subrequest *subreq); +void afs_begin_writeback(struct netfs_io_request *wreq); extern int afs_writepages(struct address_space *, struct writeback_control *); extern int afs_fsync(struct file *, loff_t, loff_t, int); extern vm_fault_t afs_page_mkwrite(struct vm_fault *vmf); diff --git a/fs/afs/write.c b/fs/afs/write.c index 1bc26466eb72..89b073881cac 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -194,6 +194,52 @@ void afs_create_write_requests(struct netfs_io_request *wreq, loff_t start, size netfs_queue_write_request(subreq); } +/* + * Writeback calls this when it finds a folio that needs uploading. This isn't + * called if writeback only has copy-to-cache to deal with. + */ +void afs_begin_writeback(struct netfs_io_request *wreq) +{ + wreq->io_streams[0].avail = true; +} + +/* + * Prepare a subrequest to write to the server. This sets the max_len + * parameter. + */ +void afs_prepare_write(struct netfs_io_subrequest *subreq) +{ + //if (test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) + // subreq->max_len = 512 * 1024; + //else + subreq->max_len = 256 * 1024 * 1024; +} + +/* + * Issue a subrequest to write to the server. + */ +void afs_issue_write(struct netfs_io_subrequest *subreq) +{ + struct afs_vnode *vnode = AFS_FS_I(subreq->rreq->inode); + ssize_t ret; + + _enter("%x[%x],%zx", + subreq->rreq->debug_id, subreq->debug_index, subreq->io_iter.count); + +#if 0 // Error injection + if (subreq->debug_index == 3) + return netfs_write_subrequest_terminated(subreq, -ENOANO, false); + + if (!test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) { + set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); + return netfs_write_subrequest_terminated(subreq, -EAGAIN, false); + } +#endif + + ret = afs_store_data(vnode, &subreq->io_iter, subreq->start); + netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, false); +} + /* * write some of the pending data back to the server */
Implement the helpers for the new write code in 9p. There's now an optional ->prepare_write() that allows the filesystem to set the parameters for the next write, such as maximum size and maximum segment count, and an ->issue_write() that is called to initiate an (asynchronous) write operation. Signed-off-by: David Howells <dhowells@redhat.com> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Jeff Layton <jlayton@kernel.org> cc: v9fs@lists.linux.dev cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/9p/vfs_addr.c | 48 ++++++++++++++++++++++++++++++++++++++++ include/net/9p/client.h | 2 ++ net/9p/Kconfig | 1 + net/9p/client.c | 49 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 5a943c122d83..07d03efdd594 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -26,6 +26,40 @@ #include "cache.h" #include "fid.h" +/* + * Writeback calls this when it finds a folio that needs uploading. This isn't + * called if writeback only has copy-to-cache to deal with. + */ +static void v9fs_begin_writeback(struct netfs_io_request *wreq) +{ + struct p9_fid *fid; + + fid = v9fs_fid_find_inode(wreq->inode, true, INVALID_UID, true); + if (!fid) { + WARN_ONCE(1, "folio expected an open fid inode->i_ino=%lx\n", + wreq->inode->i_ino); + return; + } + + wreq->wsize = fid->clnt->msize - P9_IOHDRSZ; + if (fid->iounit) + wreq->wsize = min(wreq->wsize, fid->iounit); + wreq->netfs_priv = fid; + wreq->io_streams[0].avail = true; +} + +/* + * Issue a subrequest to write to the server. + */ +static void v9fs_issue_write(struct netfs_io_subrequest *subreq) +{ + struct p9_fid *fid = subreq->rreq->netfs_priv; + int err, len; + + len = p9_client_write(fid, subreq->start, &subreq->io_iter, &err); + netfs_write_subrequest_terminated(subreq, len ?: err, false); +} + static void v9fs_upload_to_server(struct netfs_io_subrequest *subreq) { struct p9_fid *fid = subreq->rreq->netfs_priv; @@ -92,6 +126,14 @@ static int v9fs_init_request(struct netfs_io_request *rreq, struct file *file) rreq->origin == NETFS_UNBUFFERED_WRITE || rreq->origin == NETFS_DIO_WRITE); +#if 0 // TODO: Cut over + if (rreq->origin == NETFS_WRITEBACK) + return 0; /* We don't get the write handle until we find we + * have actually dirty data and not just + * copy-to-cache data. + */ +#endif + if (file) { fid = file->private_data; if (!fid) @@ -103,6 +145,10 @@ static int v9fs_init_request(struct netfs_io_request *rreq, struct file *file) goto no_fid; } + rreq->wsize = fid->clnt->msize - P9_IOHDRSZ; + if (fid->iounit) + rreq->wsize = min(rreq->wsize, fid->iounit); + /* we might need to read from a fid that was opened write-only * for read-modify-write of page cache, use the writeback fid * for that */ @@ -131,6 +177,8 @@ const struct netfs_request_ops v9fs_req_ops = { .init_request = v9fs_init_request, .free_request = v9fs_free_request, .issue_read = v9fs_issue_read, + .begin_writeback = v9fs_begin_writeback, + .issue_write = v9fs_issue_write, .create_write_requests = v9fs_create_write_requests, }; diff --git a/include/net/9p/client.h b/include/net/9p/client.h index 78ebcf782ce5..4f785098c67a 100644 --- a/include/net/9p/client.h +++ b/include/net/9p/client.h @@ -207,6 +207,8 @@ int p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err int p9_client_read_once(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err); int p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err); +struct netfs_io_subrequest; +void p9_client_write_subreq(struct netfs_io_subrequest *subreq); int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset); int p9dirent_read(struct p9_client *clnt, char *buf, int len, struct p9_dirent *dirent); diff --git a/net/9p/Kconfig b/net/9p/Kconfig index 00ebce9e5a65..bcdab9c23b40 100644 --- a/net/9p/Kconfig +++ b/net/9p/Kconfig @@ -5,6 +5,7 @@ menuconfig NET_9P tristate "Plan 9 Resource Sharing Support (9P2000)" + select NETFS_SUPPORT help If you say Y here, you will get experimental support for Plan 9 resource sharing via the 9P2000 protocol. diff --git a/net/9p/client.c b/net/9p/client.c index e265a0ca6bdd..844aca4fe4d8 100644 --- a/net/9p/client.c +++ b/net/9p/client.c @@ -18,6 +18,7 @@ #include <linux/sched/signal.h> #include <linux/uaccess.h> #include <linux/uio.h> +#include <linux/netfs.h> #include <net/9p/9p.h> #include <linux/parser.h> #include <linux/seq_file.h> @@ -1661,6 +1662,54 @@ p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err) } EXPORT_SYMBOL(p9_client_write); +void +p9_client_write_subreq(struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *wreq = subreq->rreq; + struct p9_fid *fid = wreq->netfs_priv; + struct p9_client *clnt = fid->clnt; + struct p9_req_t *req; + unsigned long long start = subreq->start + subreq->transferred; + size_t len = subreq->len - subreq->transferred; + int written, err; + + p9_debug(P9_DEBUG_9P, ">>> TWRITE fid %d offset %llu len %zd\n", + fid->fid, start, len); + + /* Don't bother zerocopy for small IO (< 1024) */ + if (clnt->trans_mod->zc_request && len > 1024) { + req = p9_client_zc_rpc(clnt, P9_TWRITE, NULL, &subreq->io_iter, + 0, wreq->len, P9_ZC_HDR_SZ, "dqd", + fid->fid, start, len); + } else { + req = p9_client_rpc(clnt, P9_TWRITE, "dqV", fid->fid, + start, len, &subreq->io_iter); + } + if (IS_ERR(req)) { + netfs_write_subrequest_terminated(subreq, PTR_ERR(req), false); + return; + } + + err = p9pdu_readf(&req->rc, clnt->proto_version, "d", &written); + if (err) { + trace_9p_protocol_dump(clnt, &req->rc); + p9_req_put(clnt, req); + netfs_write_subrequest_terminated(subreq, err, false); + return; + } + + if (written > len) { + pr_err("bogus RWRITE count (%d > %lu)\n", written, len); + written = len; + } + + p9_debug(P9_DEBUG_9P, "<<< RWRITE count %zd\n", len); + + p9_req_put(clnt, req); + netfs_write_subrequest_terminated(subreq, written, false); +} +EXPORT_SYMBOL(p9_client_write_subreq); + struct p9_wstat *p9_client_stat(struct p9_fid *fid) { int err;
Implement the helpers for the new write code in afs. There's now an optional ->prepare_write() that allows the filesystem to set the parameters for the next write, such as maximum size and maximum segment count, and an ->issue_write() that is called to initiate an (asynchronous) write operation. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/afs/file.c | 3 +++ fs/afs/internal.h | 3 +++ fs/afs/write.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/fs/afs/file.c b/fs/afs/file.c index dfd8f60f5e1f..db9ebae84fa2 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -400,6 +400,9 @@ const struct netfs_request_ops afs_req_ops = { .update_i_size = afs_update_i_size, .invalidate_cache = afs_netfs_invalidate_cache, .create_write_requests = afs_create_write_requests, + .begin_writeback = afs_begin_writeback, + .prepare_write = afs_prepare_write, + .issue_write = afs_issue_write, }; static void afs_add_open_mmap(struct afs_vnode *vnode) diff --git a/fs/afs/internal.h b/fs/afs/internal.h index b93aa026daa4..dcf0ae0323d3 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -1598,6 +1598,9 @@ extern int afs_check_volume_status(struct afs_volume *, struct afs_operation *); /* * write.c */ +void afs_prepare_write(struct netfs_io_subrequest *subreq); +void afs_issue_write(struct netfs_io_subrequest *subreq); +void afs_begin_writeback(struct netfs_io_request *wreq); extern int afs_writepages(struct address_space *, struct writeback_control *); extern int afs_fsync(struct file *, loff_t, loff_t, int); extern vm_fault_t afs_page_mkwrite(struct vm_fault *vmf); diff --git a/fs/afs/write.c b/fs/afs/write.c index 1bc26466eb72..89b073881cac 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -194,6 +194,52 @@ void afs_create_write_requests(struct netfs_io_request *wreq, loff_t start, size netfs_queue_write_request(subreq); } +/* + * Writeback calls this when it finds a folio that needs uploading. This isn't + * called if writeback only has copy-to-cache to deal with. + */ +void afs_begin_writeback(struct netfs_io_request *wreq) +{ + wreq->io_streams[0].avail = true; +} + +/* + * Prepare a subrequest to write to the server. This sets the max_len + * parameter. + */ +void afs_prepare_write(struct netfs_io_subrequest *subreq) +{ + //if (test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) + // subreq->max_len = 512 * 1024; + //else + subreq->max_len = 256 * 1024 * 1024; +} + +/* + * Issue a subrequest to write to the server. + */ +void afs_issue_write(struct netfs_io_subrequest *subreq) +{ + struct afs_vnode *vnode = AFS_FS_I(subreq->rreq->inode); + ssize_t ret; + + _enter("%x[%x],%zx", + subreq->rreq->debug_id, subreq->debug_index, subreq->io_iter.count); + +#if 0 // Error injection + if (subreq->debug_index == 3) + return netfs_write_subrequest_terminated(subreq, -ENOANO, false); + + if (!test_bit(NETFS_SREQ_RETRYING, &subreq->flags)) { + set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); + return netfs_write_subrequest_terminated(subreq, -EAGAIN, false); + } +#endif + + ret = afs_store_data(vnode, &subreq->io_iter, subreq->start); + netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, false); +} + /* * write some of the pending data back to the server */
The current netfslib writeback implementation creates writeback requests of contiguous folio data and then separately tiles subrequests over the space twice, once for the server and once for the cache. This creates a few issues: (1) Every time there's a discontiguity or a change between writing to only one destination or writing to both, it must create a new request. This makes it harder to do vectored writes. (2) The folios don't have the writeback mark removed until the end of the request - and a request could be hundreds of megabytes. (3) In future, I want to support a larger cache granularity, which will require aggregation of some folios that contain unmodified data (which only need to go to the cache) and some which contain modifications (which need to be uploaded and stored to the cache) - but, currently, these are treated as discontiguous. There's also a move to get everyone to use writeback_iter() to extract writable folios from the pagecache. That said, currently writeback_iter() has some issues that make it less than ideal: (1) there's no way to cancel the iteration, even if you find a "temporary" error that means the current folio and all subsequent folios are going to fail; (2) there's no way to filter the folios being written back - something that will impact Ceph with it's ordered snap system; (3) and if you get a folio you can't immediately deal with (say you need to flush the preceding writes), you are left with a folio hanging in the locked state for the duration, when really we should unlock it and relock it later. In this new implementation, I use writeback_iter() to pump folios, progressively creating two parallel, but separate streams and cleaning up the finished folios as the subrequests complete. Either or both streams can contain gaps, and the subrequests in each stream can be of variable size, don't need to align with each other and don't need to align with the folios. Indeed, subrequests can cross folio boundaries, may cover several folios or a folio may be spanned by multiple folios, e.g.: +---+---+-----+-----+---+----------+ Folios: | | | | | | | +---+---+-----+-----+---+----------+ +------+------+ +----+----+ Upload: | | |.....| | | +------+------+ +----+----+ +------+------+------+------+------+ Cache: | | | | | | +------+------+------+------+------+ The progressive subrequest construction permits the algorithm to be preparing both the next upload to the server and the next write to the cache whilst the previous ones are already in progress. Throttling can be applied to control the rate of production of subrequests - and, in any case, we probably want to write them to the server in ascending order, particularly if the file will be extended. Content crypto can also be prepared at the same time as the subrequests and run asynchronously, with the prepped requests being stalled until the crypto catches up with them. This might also be useful for transport crypto, but that happens at a lower layer, so probably would be harder to pull off. The algorithm is split into three parts: (1) The issuer. This walks through the data, packaging it up, encrypting it and creating subrequests. The part of this that generates subrequests only deals with file positions and spans and so is usable for DIO/unbuffered writes as well as buffered writes. (2) The collector. This asynchronously collects completed subrequests, unlocks folios, frees crypto buffers and performs any retries. This runs in a work queue so that the issuer can return to the caller for writeback (so that the VM can have its kswapd thread back) or async writes. (3) The retryer. This pauses the issuer, waits for all outstanding subrequests to complete and then goes through the failed subrequests to reissue them. This may involve reprepping them (with cifs, the credits must be renegotiated, and a subrequest may need splitting), and doing RMW for content crypto if there's a conflicting change on the server. [!] Note that some of the functions are prefixed with "new_" to avoid clashes with existing functions. These will be renamed in a later patch that cuts over to the new algorithm. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/Makefile | 4 +- fs/netfs/buffered_write.c | 4 - fs/netfs/internal.h | 27 ++ fs/netfs/objects.c | 17 + fs/netfs/write_collect.c | 808 +++++++++++++++++++++++++++++++++++ fs/netfs/write_issue.c | 673 +++++++++++++++++++++++++++++ include/linux/netfs.h | 68 ++- include/trace/events/netfs.h | 232 +++++++++- 8 files changed, 1824 insertions(+), 9 deletions(-) create mode 100644 fs/netfs/write_collect.c create mode 100644 fs/netfs/write_issue.c diff --git a/fs/netfs/Makefile b/fs/netfs/Makefile index d4d1d799819e..1eb86e34b5a9 100644 --- a/fs/netfs/Makefile +++ b/fs/netfs/Makefile @@ -11,7 +11,9 @@ netfs-y := \ main.o \ misc.o \ objects.o \ - output.o + output.o \ + write_collect.o \ + write_issue.o netfs-$(CONFIG_NETFS_STATS) += stats.o diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 244d67a43972..621532dacef5 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -74,16 +74,12 @@ static enum netfs_how_to_modify netfs_how_to_modify(struct netfs_inode *ctx, if (file->f_mode & FMODE_READ) goto no_write_streaming; - if (test_bit(NETFS_ICTX_NO_WRITE_STREAMING, &ctx->flags)) - goto no_write_streaming; if (netfs_is_cache_enabled(ctx)) { /* We don't want to get a streaming write on a file that loses * caching service temporarily because the backing store got * culled. */ - if (!test_bit(NETFS_ICTX_NO_WRITE_STREAMING, &ctx->flags)) - set_bit(NETFS_ICTX_NO_WRITE_STREAMING, &ctx->flags); goto no_write_streaming; } diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h index 58289cc65e25..5d3f74a70fa7 100644 --- a/fs/netfs/internal.h +++ b/fs/netfs/internal.h @@ -153,6 +153,33 @@ static inline void netfs_stat_d(atomic_t *stat) #define netfs_stat_d(x) do {} while(0) #endif +/* + * write_collect.c + */ +int netfs_folio_written_back(struct folio *folio); +void netfs_write_collection_worker(struct work_struct *work); +void netfs_wake_write_collector(struct netfs_io_request *wreq, bool was_async); + +/* + * write_issue.c + */ +struct netfs_io_request *netfs_create_write_req(struct address_space *mapping, + struct file *file, + loff_t start, + enum netfs_io_origin origin); +void netfs_reissue_write(struct netfs_io_stream *stream, + struct netfs_io_subrequest *subreq); +int netfs_advance_write(struct netfs_io_request *wreq, + struct netfs_io_stream *stream, + loff_t start, size_t len, bool to_eof); +struct netfs_io_request *new_netfs_begin_writethrough(struct kiocb *iocb, size_t len); +int new_netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *folio, size_t copied, bool to_page_end, + struct folio **writethrough_cache); +int new_netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *writethrough_cache); +int netfs_unbuffered_write(struct netfs_io_request *wreq, bool may_wait, size_t len); + /* * Miscellaneous functions. */ diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c index 1a4e2ce735ce..c90d482b1650 100644 --- a/fs/netfs/objects.c +++ b/fs/netfs/objects.c @@ -47,6 +47,10 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping, rreq->inode = inode; rreq->i_size = i_size_read(inode); rreq->debug_id = atomic_inc_return(&debug_ids); + rreq->wsize = INT_MAX; + spin_lock_init(&rreq->lock); + INIT_LIST_HEAD(&rreq->io_streams[0].subrequests); + INIT_LIST_HEAD(&rreq->io_streams[1].subrequests); INIT_LIST_HEAD(&rreq->subrequests); INIT_WORK(&rreq->work, NULL); refcount_set(&rreq->ref, 1); @@ -85,6 +89,8 @@ void netfs_get_request(struct netfs_io_request *rreq, enum netfs_rreq_ref_trace void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async) { struct netfs_io_subrequest *subreq; + struct netfs_io_stream *stream; + int s; while (!list_empty(&rreq->subrequests)) { subreq = list_first_entry(&rreq->subrequests, @@ -93,6 +99,17 @@ void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async) netfs_put_subrequest(subreq, was_async, netfs_sreq_trace_put_clear); } + + for (s = 0; s < ARRAY_SIZE(rreq->io_streams); s++) { + stream = &rreq->io_streams[s]; + while (!list_empty(&stream->subrequests)) { + subreq = list_first_entry(&stream->subrequests, + struct netfs_io_subrequest, rreq_link); + list_del(&subreq->rreq_link); + netfs_put_subrequest(subreq, was_async, + netfs_sreq_trace_put_clear); + } + } } static void netfs_free_request_rcu(struct rcu_head *rcu) diff --git a/fs/netfs/write_collect.c b/fs/netfs/write_collect.c new file mode 100644 index 000000000000..5e2ca8b25af0 --- /dev/null +++ b/fs/netfs/write_collect.c @@ -0,0 +1,808 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Network filesystem write subrequest result collection, assessment + * and retrying. + * + * Copyright (C) 2024 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + */ + +#include <linux/export.h> +#include <linux/fs.h> +#include <linux/mm.h> +#include <linux/pagemap.h> +#include <linux/slab.h> +#include "internal.h" + +/* Notes made in the collector */ +#define HIT_PENDING 0x01 /* A front op was still pending */ +#define SOME_EMPTY 0x02 /* One of more streams are empty */ +#define ALL_EMPTY 0x04 /* All streams are empty */ +#define MAYBE_DISCONTIG 0x08 /* A front op may be discontiguous (rounded to PAGE_SIZE) */ +#define NEED_REASSESS 0x10 /* Need to loop round and reassess */ +#define REASSESS_DISCONTIG 0x20 /* Reassess discontiguity if contiguity advances */ +#define MADE_PROGRESS 0x40 /* Made progress cleaning up a stream or the folio set */ +#define BUFFERED 0x80 /* The pagecache needs cleaning up */ +#define NEED_RETRY 0x100 /* A front op requests retrying */ +#define SAW_FAILURE 0x200 /* One stream or hit a permanent failure */ + +/* + * Successful completion of write of a folio to the server and/or cache. Note + * that we are not allowed to lock the folio here on pain of deadlocking with + * truncate. + */ +int netfs_folio_written_back(struct folio *folio) +{ + enum netfs_folio_trace why = netfs_folio_trace_clear; + struct netfs_folio *finfo; + struct netfs_group *group = NULL; + int gcount = 0; + + if ((finfo = netfs_folio_info(folio))) { + /* Streaming writes cannot be redirtied whilst under writeback, + * so discard the streaming record. + */ + folio_detach_private(folio); + group = finfo->netfs_group; + gcount++; + kfree(finfo); + why = netfs_folio_trace_clear_s; + goto end_wb; + } + + if ((group = netfs_folio_group(folio))) { + if (group == NETFS_FOLIO_COPY_TO_CACHE) { + why = netfs_folio_trace_clear_cc; + if (group == NETFS_FOLIO_COPY_TO_CACHE) + folio_detach_private(folio); + else + why = netfs_folio_trace_redirtied; + goto end_wb; + } + + /* Need to detach the group pointer if the page didn't get + * redirtied. If it has been redirtied, then it must be within + * the same group. + */ + why = netfs_folio_trace_redirtied; + if (!folio_test_dirty(folio)) { + if (!folio_test_dirty(folio)) { + folio_detach_private(folio); + gcount++; + why = netfs_folio_trace_clear_g; + } + } + } + +end_wb: + trace_netfs_folio(folio, why); + folio_end_writeback(folio); + return gcount; +} + +/* + * Get hold of a folio we have under writeback. We don't want to get the + * refcount on it. + */ +static struct folio *netfs_writeback_lookup_folio(struct netfs_io_request *wreq, loff_t pos) +{ + XA_STATE(xas, &wreq->mapping->i_pages, pos / PAGE_SIZE); + struct folio *folio; + + rcu_read_lock(); + + for (;;) { + xas_reset(&xas); + folio = xas_load(&xas); + if (xas_retry(&xas, folio)) + continue; + + if (!folio || xa_is_value(folio)) + kdebug("R=%08x: folio %lx (%llx) not present", + wreq->debug_id, xas.xa_index, pos / PAGE_SIZE); + BUG_ON(!folio || xa_is_value(folio)); + + if (folio == xas_reload(&xas)) + break; + } + + rcu_read_unlock(); + + if (WARN_ONCE(!folio_test_writeback(folio), + "R=%08x: folio %lx is not under writeback\n", + wreq->debug_id, folio->index)) { + trace_netfs_folio(folio, netfs_folio_trace_not_under_wback); + } + return folio; +} + +/* + * Unlock any folios we've finished with. + */ +static void netfs_writeback_unlock_folios(struct netfs_io_request *wreq, + unsigned long long collected_to, + unsigned int *notes) +{ + for (;;) { + struct folio *folio; + struct netfs_folio *finfo; + unsigned long long fpos, fend; + size_t fsize, flen; + + folio = netfs_writeback_lookup_folio(wreq, wreq->cleaned_to); + + fpos = folio_pos(folio); + fsize = folio_size(folio); + finfo = netfs_folio_info(folio); + flen = finfo ? finfo->dirty_offset + finfo->dirty_len : fsize; + + fend = min_t(unsigned long long, fpos + flen, wreq->i_size); + + trace_netfs_collect_folio(wreq, folio, fend, collected_to); + + if (fpos + fsize > wreq->contiguity) { + trace_netfs_collect_contig(wreq, fpos + fsize, + netfs_contig_trace_unlock); + wreq->contiguity = fpos + fsize; + } + + /* Unlock any folio we've transferred all of. */ + if (collected_to < fend) + break; + + wreq->nr_group_rel += netfs_folio_written_back(folio); + wreq->cleaned_to = fpos + fsize; + *notes |= MADE_PROGRESS; + + if (fpos + fsize >= collected_to) + break; + } +} + +/* + * Perform retries on the streams that need it. + */ +static void netfs_retry_write_stream(struct netfs_io_request *wreq, + struct netfs_io_stream *stream) +{ + struct list_head *next; + + _enter("R=%x[%x:]", wreq->debug_id, stream->stream_nr); + + if (unlikely(stream->failed)) + return; + + /* If there's no renegotiation to do, just resend each failed subreq. */ + if (!stream->prepare_write) { + struct netfs_io_subrequest *subreq; + + list_for_each_entry(subreq, &stream->subrequests, rreq_link) { + if (test_bit(NETFS_SREQ_FAILED, &subreq->flags)) + break; + if (__test_and_clear_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags)) { + __set_bit(NETFS_SREQ_RETRYING, &subreq->flags); + netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit); + netfs_reissue_write(stream, subreq); + } + } + return; + } + + if (list_empty(&stream->subrequests)) + return; + next = stream->subrequests.next; + + do { + struct netfs_io_subrequest *subreq = NULL, *from, *to, *tmp; + unsigned long long start, len; + size_t part; + bool boundary = false; + + /* Go through the stream and find the next span of contiguous + * data that we then rejig (cifs, for example, needs the wsize + * renegotiating) and reissue. + */ + from = list_entry(next, struct netfs_io_subrequest, rreq_link); + to = from; + start = from->start + from->transferred; + len = from->len - from->transferred; + + if (test_bit(NETFS_SREQ_FAILED, &from->flags) || + !test_bit(NETFS_SREQ_NEED_RETRY, &from->flags)) + return; + + list_for_each_continue(next, &stream->subrequests) { + subreq = list_entry(next, struct netfs_io_subrequest, rreq_link); + if (subreq->start + subreq->transferred != start + len || + test_bit(NETFS_SREQ_BOUNDARY, &subreq->flags) || + !test_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags)) + break; + to = subreq; + len += to->len; + } + + /* Work through the sublist. */ + subreq = from; + list_for_each_entry_from(subreq, &stream->subrequests, rreq_link) { + if (!len) + break; + /* Renegotiate max_len (wsize) */ + trace_netfs_sreq(subreq, netfs_sreq_trace_retry); + __clear_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); + __set_bit(NETFS_SREQ_RETRYING, &subreq->flags); + stream->prepare_write(subreq); + + part = min(len, subreq->max_len); + subreq->len = part; + subreq->start = start; + subreq->transferred = 0; + len -= part; + start += part; + if (len && subreq == to && + __test_and_clear_bit(NETFS_SREQ_BOUNDARY, &to->flags)) + boundary = true; + + netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit); + netfs_reissue_write(stream, subreq); + if (subreq == to) + break; + } + + /* If we managed to use fewer subreqs, we can discard the + * excess; if we used the same number, then we're done. + */ + if (!len) { + if (subreq == to) + continue; + list_for_each_entry_safe_from(subreq, tmp, + &stream->subrequests, rreq_link) { + trace_netfs_sreq(subreq, netfs_sreq_trace_discard); + list_del(&subreq->rreq_link); + netfs_put_subrequest(subreq, false, netfs_sreq_trace_put_done); + if (subreq == to) + break; + } + continue; + } + + /* We ran out of subrequests, so we need to allocate some more + * and insert them after. + */ + do { + subreq = netfs_alloc_subrequest(wreq); + subreq->source = to->source; + subreq->start = start; + subreq->max_len = len; + subreq->max_nr_segs = INT_MAX; + subreq->debug_index = atomic_inc_return(&wreq->subreq_counter); + subreq->stream_nr = to->stream_nr; + __set_bit(NETFS_SREQ_RETRYING, &subreq->flags); + + trace_netfs_sreq_ref(wreq->debug_id, subreq->debug_index, + refcount_read(&subreq->ref), + netfs_sreq_trace_new); + netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit); + + list_add(&subreq->rreq_link, &to->rreq_link); + to = list_next_entry(to, rreq_link); + trace_netfs_sreq(subreq, netfs_sreq_trace_retry); + + switch (stream->source) { + case NETFS_UPLOAD_TO_SERVER: + netfs_stat(&netfs_n_wh_upload); + subreq->max_len = min(len, wreq->wsize); + break; + case NETFS_WRITE_TO_CACHE: + netfs_stat(&netfs_n_wh_write); + break; + default: + WARN_ON_ONCE(1); + } + + stream->prepare_write(subreq); + + part = min(len, subreq->max_len); + subreq->len = subreq->transferred + part; + len -= part; + start += part; + if (!len && boundary) { + __set_bit(NETFS_SREQ_BOUNDARY, &to->flags); + boundary = false; + } + + netfs_reissue_write(stream, subreq); + if (!len) + break; + + } while (len); + + } while (!list_is_head(next, &stream->subrequests)); +} + +/* + * Perform retries on the streams that need it. If we're doing content + * encryption and the server copy changed due to a third-party write, we may + * need to do an RMW cycle and also rewrite the data to the cache. + */ +static void netfs_retry_writes(struct netfs_io_request *wreq) +{ + struct netfs_io_subrequest *subreq; + struct netfs_io_stream *stream; + int s; + + /* Wait for all outstanding I/O to quiesce before performing retries as + * we may need to renegotiate the I/O sizes. + */ + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (!stream->active) + continue; + + list_for_each_entry(subreq, &stream->subrequests, rreq_link) { + wait_on_bit(&subreq->flags, NETFS_SREQ_IN_PROGRESS, + TASK_UNINTERRUPTIBLE); + } + } + + // TODO: Enc: Fetch changed partial pages + // TODO: Enc: Reencrypt content if needed. + // TODO: Enc: Wind back transferred point. + // TODO: Enc: Mark cache pages for retry. + + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->need_retry) { + stream->need_retry = false; + netfs_retry_write_stream(wreq, stream); + } + } +} + +/* + * Collect and assess the results of various write subrequests. We may need to + * retry some of the results - or even do an RMW cycle for content crypto. + * + * Note that we have a number of parallel, overlapping lists of subrequests, + * one to the server and one to the local cache for example, which may not be + * the same size or starting position and may not even correspond in boundary + * alignment. + */ +static void netfs_collect_write_results(struct netfs_io_request *wreq) +{ + struct netfs_io_subrequest *front, *remove; + struct netfs_io_stream *stream; + unsigned long long collected_to; + unsigned int notes; + int s; + + _enter("%llx-%llx", wreq->start, wreq->start + wreq->len); + trace_netfs_collect(wreq); + trace_netfs_rreq(wreq, netfs_rreq_trace_collect); + +reassess_streams: + smp_rmb(); + collected_to = ULLONG_MAX; + if (wreq->origin == NETFS_WRITEBACK) + notes = ALL_EMPTY | BUFFERED | MAYBE_DISCONTIG; + else if (wreq->origin == NETFS_WRITETHROUGH) + notes = ALL_EMPTY | BUFFERED; + else + notes = ALL_EMPTY; + + /* Remove completed subrequests from the front of the streams and + * advance the completion point on each stream. We stop when we hit + * something that's in progress. The issuer thread may be adding stuff + * to the tail whilst we're doing this. + * + * We must not, however, merge in discontiguities that span whole + * folios that aren't under writeback. This is made more complicated + * by the folios in the gap being of unpredictable sizes - if they even + * exist - but we don't want to look them up. + */ + for (s = 0; s < NR_IO_STREAMS; s++) { + loff_t rstart, rend; + + stream = &wreq->io_streams[s]; + /* Read active flag before list pointers */ + if (!smp_load_acquire(&stream->active)) + continue; + + front = stream->front; + while (front) { + trace_netfs_collect_sreq(wreq, front); + //_debug("sreq [%x] %llx %zx/%zx", + // front->debug_index, front->start, front->transferred, front->len); + + /* Stall if there may be a discontinuity. */ + rstart = round_down(front->start, PAGE_SIZE); + if (rstart > wreq->contiguity) { + if (wreq->contiguity > stream->collected_to) { + trace_netfs_collect_gap(wreq, stream, + wreq->contiguity, 'D'); + stream->collected_to = wreq->contiguity; + } + notes |= REASSESS_DISCONTIG; + break; + } + rend = round_up(front->start + front->len, PAGE_SIZE); + if (rend > wreq->contiguity) { + trace_netfs_collect_contig(wreq, rend, + netfs_contig_trace_collect); + wreq->contiguity = rend; + if (notes & REASSESS_DISCONTIG) + notes |= NEED_REASSESS; + } + notes &= ~MAYBE_DISCONTIG; + + /* Stall if the front is still undergoing I/O. */ + if (test_bit(NETFS_SREQ_IN_PROGRESS, &front->flags)) { + notes |= HIT_PENDING; + break; + } + smp_rmb(); /* Read counters after I-P flag. */ + + if (stream->failed) { + stream->collected_to = front->start + front->len; + notes |= MADE_PROGRESS | SAW_FAILURE; + goto cancel; + } + if (front->start + front->transferred > stream->collected_to) { + stream->collected_to = front->start + front->transferred; + stream->transferred = stream->collected_to - wreq->start; + notes |= MADE_PROGRESS; + } + if (test_bit(NETFS_SREQ_FAILED, &front->flags)) { + stream->failed = true; + stream->error = front->error; + if (stream->source == NETFS_UPLOAD_TO_SERVER) + mapping_set_error(wreq->mapping, front->error); + notes |= NEED_REASSESS | SAW_FAILURE; + break; + } + if (front->transferred < front->len) { + stream->need_retry = true; + notes |= NEED_RETRY | MADE_PROGRESS; + break; + } + + cancel: + /* Remove if completely consumed. */ + spin_lock(&wreq->lock); + + remove = front; + list_del_init(&front->rreq_link); + front = list_first_entry_or_null(&stream->subrequests, + struct netfs_io_subrequest, rreq_link); + stream->front = front; + if (!front) { + unsigned long long jump_to = atomic64_read(&wreq->issued_to); + + if (stream->collected_to < jump_to) { + trace_netfs_collect_gap(wreq, stream, jump_to, 'A'); + stream->collected_to = jump_to; + } + } + + spin_unlock(&wreq->lock); + netfs_put_subrequest(remove, false, + notes & SAW_FAILURE ? + netfs_sreq_trace_put_cancel : + netfs_sreq_trace_put_done); + } + + if (front) + notes &= ~ALL_EMPTY; + else + notes |= SOME_EMPTY; + + if (stream->collected_to < collected_to) + collected_to = stream->collected_to; + } + + if (collected_to != ULLONG_MAX && collected_to > wreq->collected_to) + wreq->collected_to = collected_to; + + /* If we have an empty stream, we need to jump it forward over any gap + * otherwise the collection point will never advance. + * + * Note that the issuer always adds to the stream with the lowest + * so-far submitted start, so if we see two consecutive subreqs in one + * stream with nothing between then in another stream, then the second + * stream has a gap that can be jumped. + */ + if (notes & SOME_EMPTY) { + unsigned long long jump_to = wreq->start + wreq->len; + + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->active && + stream->front && + stream->front->start < jump_to) + jump_to = stream->front->start; + } + + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->active && + !stream->front && + stream->collected_to < jump_to) { + trace_netfs_collect_gap(wreq, stream, jump_to, 'B'); + stream->collected_to = jump_to; + } + } + } + + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->active) + trace_netfs_collect_stream(wreq, stream); + } + + trace_netfs_collect_state(wreq, wreq->collected_to, notes); + + /* Unlock any folios that we have now finished with. */ + if (notes & BUFFERED) { + unsigned long long clean_to = min(wreq->collected_to, wreq->contiguity); + + if (wreq->cleaned_to < clean_to) + netfs_writeback_unlock_folios(wreq, clean_to, ¬es); + } else { + wreq->cleaned_to = wreq->collected_to; + } + + // TODO: Discard encryption buffers + + /* If all streams are discontiguous with the last folio we cleared, we + * may need to skip a set of folios. + */ + if ((notes & (MAYBE_DISCONTIG | ALL_EMPTY)) == MAYBE_DISCONTIG) { + unsigned long long jump_to = ULLONG_MAX; + + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->active && stream->front && + stream->front->start < jump_to) + jump_to = stream->front->start; + } + + trace_netfs_collect_contig(wreq, jump_to, netfs_contig_trace_jump); + wreq->contiguity = jump_to; + wreq->cleaned_to = jump_to; + wreq->collected_to = jump_to; + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->collected_to < jump_to) + stream->collected_to = jump_to; + } + //cond_resched(); + notes |= MADE_PROGRESS; + goto reassess_streams; + } + + if (notes & NEED_RETRY) + goto need_retry; + if ((notes & MADE_PROGRESS) && test_bit(NETFS_RREQ_PAUSE, &wreq->flags)) { + trace_netfs_rreq(wreq, netfs_rreq_trace_unpause); + clear_bit_unlock(NETFS_RREQ_PAUSE, &wreq->flags); + wake_up_bit(&wreq->flags, NETFS_RREQ_PAUSE); + } + + if (notes & NEED_REASSESS) { + //cond_resched(); + goto reassess_streams; + } + if (notes & MADE_PROGRESS) { + //cond_resched(); + goto reassess_streams; + } + +out: + netfs_put_group_many(wreq->group, wreq->nr_group_rel); + wreq->nr_group_rel = 0; + _leave(" = %x", notes); + return; + +need_retry: + /* Okay... We're going to have to retry one or both streams. Note + * that any partially completed op will have had any wholly transferred + * folios removed from it. + */ + _debug("retry"); + netfs_retry_writes(wreq); + goto out; +} + +/* + * Perform the collection of subrequests, folios and encryption buffers. + */ +void netfs_write_collection_worker(struct work_struct *work) +{ + struct netfs_io_request *wreq = container_of(work, struct netfs_io_request, work); + struct netfs_inode *ictx = netfs_inode(wreq->inode); + size_t transferred; + int s; + + _enter("R=%x", wreq->debug_id); + + netfs_see_request(wreq, netfs_rreq_trace_see_work); + if (!test_bit(NETFS_RREQ_IN_PROGRESS, &wreq->flags)) { + netfs_put_request(wreq, false, netfs_rreq_trace_put_work); + return; + } + + netfs_collect_write_results(wreq); + + /* We're done when the app thread has finished posting subreqs and all + * the queues in all the streams are empty. + */ + if (!test_bit(NETFS_RREQ_ALL_QUEUED, &wreq->flags)) { + netfs_put_request(wreq, false, netfs_rreq_trace_put_work); + return; + } + smp_rmb(); /* Read ALL_QUEUED before lists. */ + + transferred = LONG_MAX; + for (s = 0; s < NR_IO_STREAMS; s++) { + struct netfs_io_stream *stream = &wreq->io_streams[s]; + if (!stream->active) + continue; + if (!list_empty(&stream->subrequests)) { + netfs_put_request(wreq, false, netfs_rreq_trace_put_work); + return; + } + if (stream->transferred < transferred) + transferred = stream->transferred; + } + + /* Okay, declare that all I/O is complete. */ + wreq->transferred = transferred; + trace_netfs_rreq(wreq, netfs_rreq_trace_write_done); + + if (wreq->io_streams[1].active && + wreq->io_streams[1].failed) { + /* Cache write failure doesn't prevent writeback completion + * unless we're in disconnected mode. + */ + ictx->ops->invalidate_cache(wreq); + } + + if (wreq->cleanup) + wreq->cleanup(wreq); + + if (wreq->origin == NETFS_DIO_WRITE && + wreq->mapping->nrpages) { + /* mmap may have got underfoot and we may now have folios + * locally covering the region we just wrote. Attempt to + * discard the folios, but leave in place any modified locally. + * ->write_iter() is prevented from interfering by the DIO + * counter. + */ + pgoff_t first = wreq->start >> PAGE_SHIFT; + pgoff_t last = (wreq->start + wreq->transferred - 1) >> PAGE_SHIFT; + invalidate_inode_pages2_range(wreq->mapping, first, last); + } + + if (wreq->origin == NETFS_DIO_WRITE) + inode_dio_end(wreq->inode); + + _debug("finished"); + trace_netfs_rreq(wreq, netfs_rreq_trace_wake_ip); + clear_bit_unlock(NETFS_RREQ_IN_PROGRESS, &wreq->flags); + wake_up_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS); + + if (wreq->iocb) { + wreq->iocb->ki_pos += wreq->transferred; + if (wreq->iocb->ki_complete) + wreq->iocb->ki_complete( + wreq->iocb, wreq->error ? wreq->error : wreq->transferred); + wreq->iocb = VFS_PTR_POISON; + } + + netfs_clear_subrequests(wreq, false); + netfs_put_request(wreq, false, netfs_rreq_trace_put_work_complete); +} + +/* + * Wake the collection work item. + */ +void netfs_wake_write_collector(struct netfs_io_request *wreq, bool was_async) +{ + if (!work_pending(&wreq->work)) { + netfs_get_request(wreq, netfs_rreq_trace_get_work); + if (!queue_work(system_unbound_wq, &wreq->work)) + netfs_put_request(wreq, was_async, netfs_rreq_trace_put_work_nq); + } +} + +/** + * new_netfs_write_subrequest_terminated - Note the termination of a write operation. + * @_op: The I/O request that has terminated. + * @transferred_or_error: The amount of data transferred or an error code. + * @was_async: The termination was asynchronous + * + * This tells the library that a contributory write I/O operation has + * terminated, one way or another, and that it should collect the results. + * + * The caller indicates in @transferred_or_error the outcome of the operation, + * supplying a positive value to indicate the number of bytes transferred or a + * negative error code. The library will look after reissuing I/O operations + * as appropriate and writing downloaded data to the cache. + * + * If @was_async is true, the caller might be running in softirq or interrupt + * context and we can't sleep. + * + * When this is called, ownership of the subrequest is transferred back to the + * library, along with a ref. + * + * Note that %_op is a void* so that the function can be passed to + * kiocb::term_func without the need for a casting wrapper. + */ +void new_netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, + bool was_async) +{ + struct netfs_io_subrequest *subreq = _op; + struct netfs_io_request *wreq = subreq->rreq; + struct netfs_io_stream *stream = &wreq->io_streams[subreq->stream_nr]; + + _enter("%x[%x] %zd", wreq->debug_id, subreq->debug_index, transferred_or_error); + + switch (subreq->source) { + case NETFS_UPLOAD_TO_SERVER: + netfs_stat(&netfs_n_wh_upload_done); + break; + case NETFS_WRITE_TO_CACHE: + netfs_stat(&netfs_n_wh_write_done); + break; + case NETFS_INVALID_WRITE: + break; + default: + BUG(); + } + + if (IS_ERR_VALUE(transferred_or_error)) { + subreq->error = transferred_or_error; + if (subreq->error == -EAGAIN) + set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); + else + set_bit(NETFS_SREQ_FAILED, &subreq->flags); + trace_netfs_failure(wreq, subreq, transferred_or_error, netfs_fail_write); + + switch (subreq->source) { + case NETFS_WRITE_TO_CACHE: + netfs_stat(&netfs_n_wh_write_failed); + break; + case NETFS_UPLOAD_TO_SERVER: + netfs_stat(&netfs_n_wh_upload_failed); + break; + default: + break; + } + trace_netfs_rreq(wreq, netfs_rreq_trace_set_pause); + set_bit(NETFS_RREQ_PAUSE, &wreq->flags); + } else { + if (WARN(transferred_or_error > subreq->len - subreq->transferred, + "Subreq excess write: R=%x[%x] %zd > %zu - %zu", + wreq->debug_id, subreq->debug_index, + transferred_or_error, subreq->len, subreq->transferred)) + transferred_or_error = subreq->len - subreq->transferred; + + subreq->error = 0; + subreq->transferred += transferred_or_error; + + if (subreq->transferred < subreq->len) + set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); + } + + trace_netfs_sreq(subreq, netfs_sreq_trace_terminated); + + clear_bit_unlock(NETFS_SREQ_IN_PROGRESS, &subreq->flags); + wake_up_bit(&subreq->flags, NETFS_SREQ_IN_PROGRESS); + + /* If we are at the head of the queue, wake up the collector, + * transferring a ref to it if we were the ones to do so. + */ + if (list_is_first(&subreq->rreq_link, &stream->subrequests)) + netfs_wake_write_collector(wreq, was_async); + + netfs_put_subrequest(subreq, was_async, netfs_sreq_trace_put_terminated); +} +EXPORT_SYMBOL(new_netfs_write_subrequest_terminated); diff --git a/fs/netfs/write_issue.c b/fs/netfs/write_issue.c new file mode 100644 index 000000000000..e0fb472898f5 --- /dev/null +++ b/fs/netfs/write_issue.c @@ -0,0 +1,673 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Network filesystem high-level (buffered) writeback. + * + * Copyright (C) 2024 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * + * To support network filesystems with local caching, we manage a situation + * that can be envisioned like the following: + * + * +---+---+-----+-----+---+----------+ + * Folios: | | | | | | | + * +---+---+-----+-----+---+----------+ + * + * +------+------+ +----+----+ + * Upload: | | |.....| | | + * (Stream 0) +------+------+ +----+----+ + * + * +------+------+------+------+------+ + * Cache: | | | | | | + * (Stream 1) +------+------+------+------+------+ + * + * Where we have a sequence of folios of varying sizes that we need to overlay + * with multiple parallel streams of I/O requests, where the I/O requests in a + * stream may also be of various sizes (in cifs, for example, the sizes are + * negotiated with the server; in something like ceph, they may represent the + * sizes of storage objects). + * + * The sequence in each stream may contain gaps and noncontiguous subrequests + * may be glued together into single vectored write RPCs. + */ + +#include <linux/export.h> +#include <linux/fs.h> +#include <linux/mm.h> +#include <linux/pagemap.h> +#include "internal.h" + +/* + * Kill all dirty folios in the event of an unrecoverable error, starting with + * a locked folio we've already obtained from writeback_iter(). + */ +static void netfs_kill_dirty_pages(struct address_space *mapping, + struct writeback_control *wbc, + struct folio *folio) +{ + int error = 0; + + do { + enum netfs_folio_trace why = netfs_folio_trace_kill; + struct netfs_group *group = NULL; + struct netfs_folio *finfo = NULL; + void *priv; + + priv = folio_detach_private(folio); + if (priv) { + finfo = __netfs_folio_info(priv); + if (finfo) { + /* Kill folio from streaming write. */ + group = finfo->netfs_group; + why = netfs_folio_trace_kill_s; + } else { + group = priv; + if (group == NETFS_FOLIO_COPY_TO_CACHE) { + /* Kill copy-to-cache folio */ + why = netfs_folio_trace_kill_cc; + group = NULL; + } else { + /* Kill folio with group */ + why = netfs_folio_trace_kill_g; + } + } + } + + trace_netfs_folio(folio, why); + + folio_start_writeback(folio); + folio_unlock(folio); + folio_end_writeback(folio); + + netfs_put_group(group); + kfree(finfo); + + } while ((folio = writeback_iter(mapping, wbc, folio, &error))); +} + +/* + * Create a write request and set it up appropriately for the origin type. + */ +struct netfs_io_request *netfs_create_write_req(struct address_space *mapping, + struct file *file, + loff_t start, + enum netfs_io_origin origin) +{ + struct netfs_io_request *wreq; + struct netfs_inode *ictx; + + wreq = netfs_alloc_request(mapping, file, start, 0, origin); + if (IS_ERR(wreq)) + return wreq; + + _enter("R=%x", wreq->debug_id); + + ictx = netfs_inode(wreq->inode); + if (test_bit(NETFS_RREQ_WRITE_TO_CACHE, &wreq->flags)) + fscache_begin_write_operation(&wreq->cache_resources, netfs_i_cookie(ictx)); + + wreq->contiguity = wreq->start; + wreq->cleaned_to = wreq->start; + INIT_WORK(&wreq->work, netfs_write_collection_worker); + + wreq->io_streams[0].stream_nr = 0; + wreq->io_streams[0].source = NETFS_UPLOAD_TO_SERVER; + wreq->io_streams[0].prepare_write = ictx->ops->prepare_write; + wreq->io_streams[0].issue_write = ictx->ops->issue_write; + wreq->io_streams[0].collected_to = start; + wreq->io_streams[0].transferred = LONG_MAX; + + wreq->io_streams[1].stream_nr = 1; + wreq->io_streams[1].source = NETFS_WRITE_TO_CACHE; + wreq->io_streams[1].collected_to = start; + wreq->io_streams[1].transferred = LONG_MAX; + if (fscache_resources_valid(&wreq->cache_resources)) { + wreq->io_streams[1].avail = true; + wreq->io_streams[1].prepare_write = wreq->cache_resources.ops->prepare_write_subreq; + wreq->io_streams[1].issue_write = wreq->cache_resources.ops->issue_write; + } + + return wreq; +} + +/** + * netfs_prepare_write_failed - Note write preparation failed + * @subreq: The subrequest to mark + * + * Mark a subrequest to note that preparation for write failed. + */ +void netfs_prepare_write_failed(struct netfs_io_subrequest *subreq) +{ + __set_bit(NETFS_SREQ_FAILED, &subreq->flags); + trace_netfs_sreq(subreq, netfs_sreq_trace_prep_failed); +} +EXPORT_SYMBOL(netfs_prepare_write_failed); + +/* + * Prepare a write subrequest. We need to allocate a new subrequest + * if we don't have one. + */ +static void netfs_prepare_write(struct netfs_io_request *wreq, + struct netfs_io_stream *stream, + loff_t start) +{ + struct netfs_io_subrequest *subreq; + + subreq = netfs_alloc_subrequest(wreq); + subreq->source = stream->source; + subreq->start = start; + subreq->max_len = ULONG_MAX; + subreq->max_nr_segs = INT_MAX; + subreq->stream_nr = stream->stream_nr; + + _enter("R=%x[%x]", wreq->debug_id, subreq->debug_index); + + trace_netfs_sreq_ref(wreq->debug_id, subreq->debug_index, + refcount_read(&subreq->ref), + netfs_sreq_trace_new); + + trace_netfs_sreq(subreq, netfs_sreq_trace_prepare); + + switch (stream->source) { + case NETFS_UPLOAD_TO_SERVER: + netfs_stat(&netfs_n_wh_upload); + subreq->max_len = wreq->wsize; + break; + case NETFS_WRITE_TO_CACHE: + netfs_stat(&netfs_n_wh_write); + break; + default: + WARN_ON_ONCE(1); + break; + } + + if (stream->prepare_write) + stream->prepare_write(subreq); + + __set_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags); + + /* We add to the end of the list whilst the collector may be walking + * the list. The collector only goes nextwards and uses the lock to + * remove entries off of the front. + */ + spin_lock(&wreq->lock); + list_add_tail(&subreq->rreq_link, &stream->subrequests); + if (list_is_first(&subreq->rreq_link, &stream->subrequests)) { + stream->front = subreq; + if (!stream->active) { + stream->collected_to = stream->front->start; + /* Write list pointers before active flag */ + smp_store_release(&stream->active, true); + } + } + + spin_unlock(&wreq->lock); + + stream->construct = subreq; +} + +/* + * Set the I/O iterator for the filesystem/cache to use and dispatch the I/O + * operation. The operation may be asynchronous and should call + * netfs_write_subrequest_terminated() when complete. + */ +static void netfs_do_issue_write(struct netfs_io_stream *stream, + struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *wreq = subreq->rreq; + + _enter("R=%x[%x],%zx", wreq->debug_id, subreq->debug_index, subreq->len); + + if (test_bit(NETFS_SREQ_FAILED, &subreq->flags)) + return netfs_write_subrequest_terminated(subreq, subreq->error, false); + + // TODO: Use encrypted buffer + if (test_bit(NETFS_RREQ_USE_IO_ITER, &wreq->flags)) { + subreq->io_iter = wreq->io_iter; + iov_iter_advance(&subreq->io_iter, + subreq->start + subreq->transferred - wreq->start); + iov_iter_truncate(&subreq->io_iter, + subreq->len - subreq->transferred); + } else { + iov_iter_xarray(&subreq->io_iter, ITER_SOURCE, &wreq->mapping->i_pages, + subreq->start + subreq->transferred, + subreq->len - subreq->transferred); + } + + trace_netfs_sreq(subreq, netfs_sreq_trace_submit); + stream->issue_write(subreq); +} + +void netfs_reissue_write(struct netfs_io_stream *stream, + struct netfs_io_subrequest *subreq) +{ + __set_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags); + netfs_do_issue_write(stream, subreq); +} + +static void netfs_issue_write(struct netfs_io_request *wreq, + struct netfs_io_stream *stream) +{ + struct netfs_io_subrequest *subreq = stream->construct; + + if (!subreq) + return; + stream->construct = NULL; + + if (subreq->start + subreq->len > wreq->start + wreq->submitted) + wreq->len = wreq->submitted = subreq->start + subreq->len - wreq->start; + netfs_do_issue_write(stream, subreq); +} + +/* + * Add data to the write subrequest, dispatching each as we fill it up or if it + * is discontiguous with the previous. We only fill one part at a time so that + * we can avoid overrunning the credits obtained (cifs) and try to parallelise + * content-crypto preparation with network writes. + */ +int netfs_advance_write(struct netfs_io_request *wreq, + struct netfs_io_stream *stream, + loff_t start, size_t len, bool to_eof) +{ + struct netfs_io_subrequest *subreq = stream->construct; + size_t part; + + if (!stream->avail) { + _leave("no write"); + return len; + } + + _enter("R=%x[%x]", wreq->debug_id, subreq ? subreq->debug_index : 0); + + if (subreq && start != subreq->start + subreq->len) { + netfs_issue_write(wreq, stream); + subreq = NULL; + } + + if (!stream->construct) + netfs_prepare_write(wreq, stream, start); + subreq = stream->construct; + + part = min(subreq->max_len - subreq->len, len); + _debug("part %zx/%zx %zx/%zx", subreq->len, subreq->max_len, part, len); + subreq->len += part; + subreq->nr_segs++; + + if (subreq->len >= subreq->max_len || + subreq->nr_segs >= subreq->max_nr_segs || + to_eof) { + netfs_issue_write(wreq, stream); + subreq = NULL; + } + + return part; +} + +/* + * Write some of a pending folio data back to the server. + */ +static int netfs_write_folio(struct netfs_io_request *wreq, + struct writeback_control *wbc, + struct folio *folio) +{ + struct netfs_io_stream *upload = &wreq->io_streams[0]; + struct netfs_io_stream *cache = &wreq->io_streams[1]; + struct netfs_io_stream *stream; + struct netfs_group *fgroup; /* TODO: Use this with ceph */ + struct netfs_folio *finfo; + size_t fsize = folio_size(folio), flen = fsize, foff = 0; + loff_t fpos = folio_pos(folio); + bool to_eof = false, streamw = false; + bool debug = false; + + _enter(""); + + if (fpos >= wreq->i_size) { + /* mmap beyond eof. */ + _debug("beyond eof"); + folio_start_writeback(folio); + folio_unlock(folio); + wreq->nr_group_rel += netfs_folio_written_back(folio); + netfs_put_group_many(wreq->group, wreq->nr_group_rel); + wreq->nr_group_rel = 0; + return 0; + } + + fgroup = netfs_folio_group(folio); + finfo = netfs_folio_info(folio); + if (finfo) { + foff = finfo->dirty_offset; + flen = foff + finfo->dirty_len; + streamw = true; + } + + if (wreq->origin == NETFS_WRITETHROUGH) { + to_eof = false; + if (flen > wreq->i_size - fpos) + flen = wreq->i_size - fpos; + } else if (flen > wreq->i_size - fpos) { + flen = wreq->i_size - fpos; + if (!streamw) + folio_zero_segment(folio, flen, fsize); + to_eof = true; + } else if (flen == wreq->i_size - fpos) { + to_eof = true; + } + flen -= foff; + + _debug("folio %zx %zx %zx", foff, flen, fsize); + + /* Deal with discontinuities in the stream of dirty pages. These can + * arise from a number of sources: + * + * (1) Intervening non-dirty pages from random-access writes, multiple + * flushers writing back different parts simultaneously and manual + * syncing. + * + * (2) Partially-written pages from write-streaming. + * + * (3) Pages that belong to a different write-back group (eg. Ceph + * snapshots). + * + * (4) Actually-clean pages that were marked for write to the cache + * when they were read. Note that these appear as a special + * write-back group. + */ + if (fgroup == NETFS_FOLIO_COPY_TO_CACHE) { + netfs_issue_write(wreq, upload); + } else if (fgroup != wreq->group) { + /* We can't write this page to the server yet. */ + kdebug("wrong group"); + folio_redirty_for_writepage(wbc, folio); + folio_unlock(folio); + netfs_issue_write(wreq, upload); + netfs_issue_write(wreq, cache); + return 0; + } + + if (foff > 0) + netfs_issue_write(wreq, upload); + if (streamw) + netfs_issue_write(wreq, cache); + + /* Flip the page to the writeback state and unlock. If we're called + * from write-through, then the page has already been put into the wb + * state. + */ + if (wreq->origin == NETFS_WRITEBACK) + folio_start_writeback(folio); + folio_unlock(folio); + + if (fgroup == NETFS_FOLIO_COPY_TO_CACHE) { + if (!fscache_resources_valid(&wreq->cache_resources)) { + trace_netfs_folio(folio, netfs_folio_trace_cancel_copy); + netfs_issue_write(wreq, upload); + netfs_folio_written_back(folio); + return 0; + } + trace_netfs_folio(folio, netfs_folio_trace_store_copy); + } else if (!upload->construct) { + trace_netfs_folio(folio, netfs_folio_trace_store); + } else { + trace_netfs_folio(folio, netfs_folio_trace_store_plus); + } + + /* Move the submission point forward to allow for write-streaming data + * not starting at the front of the page. We don't do write-streaming + * with the cache as the cache requires DIO alignment. + * + * Also skip uploading for data that's been read and just needs copying + * to the cache. + */ + for (int s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + stream->submit_max_len = fsize; + stream->submit_off = foff; + stream->submit_len = flen; + if ((stream->source == NETFS_WRITE_TO_CACHE && streamw) || + (stream->source == NETFS_UPLOAD_TO_SERVER && + fgroup == NETFS_FOLIO_COPY_TO_CACHE)) { + stream->submit_off = UINT_MAX; + stream->submit_len = 0; + stream->submit_max_len = 0; + } + } + + /* Attach the folio to one or more subrequests. For a big folio, we + * could end up with thousands of subrequests if the wsize is small - + * but we might need to wait during the creation of subrequests for + * network resources (eg. SMB credits). + */ + for (;;) { + ssize_t part; + size_t lowest_off = ULONG_MAX; + int choose_s = -1; + + /* Always add to the lowest-submitted stream first. */ + for (int s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->submit_len > 0 && + stream->submit_off < lowest_off) { + lowest_off = stream->submit_off; + choose_s = s; + } + } + + if (choose_s < 0) + break; + stream = &wreq->io_streams[choose_s]; + + part = netfs_advance_write(wreq, stream, fpos + stream->submit_off, + stream->submit_len, to_eof); + atomic64_set(&wreq->issued_to, fpos + stream->submit_off); + stream->submit_off += part; + stream->submit_max_len -= part; + if (part > stream->submit_len) + stream->submit_len = 0; + else + stream->submit_len -= part; + if (part > 0) + debug = true; + } + + atomic64_set(&wreq->issued_to, fpos + fsize); + + if (!debug) + kdebug("R=%x: No submit", wreq->debug_id); + + if (flen < fsize) + for (int s = 0; s < NR_IO_STREAMS; s++) + netfs_issue_write(wreq, &wreq->io_streams[s]); + + _leave(" = 0"); + return 0; +} + +/* + * Write some of the pending data back to the server + */ +int new_netfs_writepages(struct address_space *mapping, + struct writeback_control *wbc) +{ + struct netfs_inode *ictx = netfs_inode(mapping->host); + struct netfs_io_request *wreq = NULL; + struct folio *folio; + int error = 0; + + if (wbc->sync_mode == WB_SYNC_ALL) + mutex_lock(&ictx->wb_lock); + else if (!mutex_trylock(&ictx->wb_lock)) + return 0; + + /* Need the first folio to be able to set up the op. */ + folio = writeback_iter(mapping, wbc, NULL, &error); + if (!folio) + goto out; + + wreq = netfs_create_write_req(mapping, NULL, folio_pos(folio), NETFS_WRITEBACK); + if (IS_ERR(wreq)) { + error = PTR_ERR(wreq); + goto couldnt_start; + } + + trace_netfs_write(wreq, netfs_write_trace_writeback); + netfs_stat(&netfs_n_wh_writepages); + + do { + _debug("wbiter %lx %llx", folio->index, wreq->start + wreq->submitted); + + /* It appears we don't have to handle cyclic writeback wrapping. */ + WARN_ON_ONCE(wreq && folio_pos(folio) < wreq->start + wreq->submitted); + + if (netfs_folio_group(folio) != NETFS_FOLIO_COPY_TO_CACHE && + unlikely(!test_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags))) { + set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); + wreq->netfs_ops->begin_writeback(wreq); + } + + error = netfs_write_folio(wreq, wbc, folio); + if (error < 0) + break; + } while ((folio = writeback_iter(mapping, wbc, folio, &error))); + + for (int s = 0; s < NR_IO_STREAMS; s++) + netfs_issue_write(wreq, &wreq->io_streams[s]); + smp_wmb(); /* Write lists before ALL_QUEUED. */ + set_bit(NETFS_RREQ_ALL_QUEUED, &wreq->flags); + + mutex_unlock(&ictx->wb_lock); + + netfs_put_request(wreq, false, netfs_rreq_trace_put_return); + _leave(" = %d", error); + return error; + +couldnt_start: + netfs_kill_dirty_pages(mapping, wbc, folio); +out: + mutex_unlock(&ictx->wb_lock); + _leave(" = %d", error); + return error; +} +EXPORT_SYMBOL(new_netfs_writepages); + +/* + * Begin a write operation for writing through the pagecache. + */ +struct netfs_io_request *new_netfs_begin_writethrough(struct kiocb *iocb, size_t len) +{ + struct netfs_io_request *wreq = NULL; + struct netfs_inode *ictx = netfs_inode(file_inode(iocb->ki_filp)); + + mutex_lock(&ictx->wb_lock); + + wreq = netfs_create_write_req(iocb->ki_filp->f_mapping, iocb->ki_filp, + iocb->ki_pos, NETFS_WRITETHROUGH); + if (IS_ERR(wreq)) + mutex_unlock(&ictx->wb_lock); + + wreq->io_streams[0].avail = true; + trace_netfs_write(wreq, netfs_write_trace_writethrough); + return wreq; +} + +/* + * Advance the state of the write operation used when writing through the + * pagecache. Data has been copied into the pagecache that we need to append + * to the request. If we've added more than wsize then we need to create a new + * subrequest. + */ +int new_netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *folio, size_t copied, bool to_page_end, + struct folio **writethrough_cache) +{ + _enter("R=%x ic=%zu ws=%u cp=%zu tp=%u", + wreq->debug_id, wreq->iter.count, wreq->wsize, copied, to_page_end); + + if (!*writethrough_cache) { + if (folio_test_dirty(folio)) + /* Sigh. mmap. */ + folio_clear_dirty_for_io(folio); + + /* We can make multiple writes to the folio... */ + folio_start_writeback(folio); + if (wreq->len == 0) + trace_netfs_folio(folio, netfs_folio_trace_wthru); + else + trace_netfs_folio(folio, netfs_folio_trace_wthru_plus); + *writethrough_cache = folio; + } + + wreq->len += copied; + if (!to_page_end) + return 0; + + *writethrough_cache = NULL; + return netfs_write_folio(wreq, wbc, folio); +} + +/* + * End a write operation used when writing through the pagecache. + */ +int new_netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *writethrough_cache) +{ + struct netfs_inode *ictx = netfs_inode(wreq->inode); + int ret; + + _enter("R=%x", wreq->debug_id); + + if (writethrough_cache) + netfs_write_folio(wreq, wbc, writethrough_cache); + + netfs_issue_write(wreq, &wreq->io_streams[0]); + netfs_issue_write(wreq, &wreq->io_streams[1]); + smp_wmb(); /* Write lists before ALL_QUEUED. */ + set_bit(NETFS_RREQ_ALL_QUEUED, &wreq->flags); + + mutex_unlock(&ictx->wb_lock); + + ret = wreq->error; + netfs_put_request(wreq, false, netfs_rreq_trace_put_return); + return ret; +} + +/* + * Write data to the server without going through the pagecache and without + * writing it to the local cache. + */ +int netfs_unbuffered_write(struct netfs_io_request *wreq, bool may_wait, size_t len) +{ + struct netfs_io_stream *upload = &wreq->io_streams[0]; + ssize_t part; + loff_t start = wreq->start; + int error = 0; + + _enter("%zx", len); + + if (wreq->origin == NETFS_DIO_WRITE) + inode_dio_begin(wreq->inode); + + while (len) { + // TODO: Prepare content encryption + + _debug("unbuffered %zx", len); + part = netfs_advance_write(wreq, upload, start, len, false); + start += part; + len -= part; + if (test_bit(NETFS_RREQ_PAUSE, &wreq->flags)) { + trace_netfs_rreq(wreq, netfs_rreq_trace_wait_pause); + wait_on_bit(&wreq->flags, NETFS_RREQ_PAUSE, TASK_UNINTERRUPTIBLE); + } + if (test_bit(NETFS_RREQ_FAILED, &wreq->flags)) + break; + } + + netfs_issue_write(wreq, upload); + + smp_wmb(); /* Write lists before ALL_QUEUED. */ + set_bit(NETFS_RREQ_ALL_QUEUED, &wreq->flags); + if (list_empty(&upload->subrequests)) + netfs_wake_write_collector(wreq, false); + + _leave(" = %d", error); + return error; +} diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 88269681d4fc..42dba05a428b 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -64,6 +64,7 @@ struct netfs_inode { #if IS_ENABLED(CONFIG_FSCACHE) struct fscache_cookie *cache; #endif + struct mutex wb_lock; /* Writeback serialisation */ loff_t remote_i_size; /* Size of the remote file */ loff_t zero_point; /* Size after which we assume there's no data * on the server */ @@ -71,7 +72,6 @@ struct netfs_inode { #define NETFS_ICTX_ODIRECT 0 /* The file has DIO in progress */ #define NETFS_ICTX_UNBUFFERED 1 /* I/O should not use the pagecache */ #define NETFS_ICTX_WRITETHROUGH 2 /* Write-through caching */ -#define NETFS_ICTX_NO_WRITE_STREAMING 3 /* Don't engage in write-streaming */ #define NETFS_ICTX_USE_PGPRIV2 31 /* [DEPRECATED] Use PG_private_2 to mark * write to cache on read */ }; @@ -126,6 +126,33 @@ static inline struct netfs_group *netfs_folio_group(struct folio *folio) return priv; } +/* + * Stream of I/O subrequests going to a particular destination, such as the + * server or the local cache. This is mainly intended for writing where we may + * have to write to multiple destinations concurrently. + */ +struct netfs_io_stream { + /* Submission tracking */ + struct netfs_io_subrequest *construct; /* Op being constructed */ + unsigned int submit_off; /* Folio offset we're submitting from */ + unsigned int submit_len; /* Amount of data left to submit */ + unsigned int submit_max_len; /* Amount I/O can be rounded up to */ + void (*prepare_write)(struct netfs_io_subrequest *subreq); + void (*issue_write)(struct netfs_io_subrequest *subreq); + /* Collection tracking */ + struct list_head subrequests; /* Contributory I/O operations */ + struct netfs_io_subrequest *front; /* Op being collected */ + unsigned long long collected_to; /* Position we've collected results to */ + size_t transferred; /* The amount transferred from this stream */ + enum netfs_io_source source; /* Where to read from/write to */ + unsigned short error; /* Aggregate error for the stream */ + unsigned char stream_nr; /* Index of stream in parent table */ + bool avail; /* T if stream is available */ + bool active; /* T if stream is active */ + bool need_retry; /* T if this stream needs retrying */ + bool failed; /* T if this stream failed */ +}; + /* * Resources required to do operations on a cache. */ @@ -150,13 +177,16 @@ struct netfs_io_subrequest { struct list_head rreq_link; /* Link in rreq->subrequests */ struct iov_iter io_iter; /* Iterator for this subrequest */ unsigned long long start; /* Where to start the I/O */ + size_t max_len; /* Maximum size of the I/O */ size_t len; /* Size of the I/O */ size_t transferred; /* Amount of data transferred */ refcount_t ref; short error; /* 0 or error that occurred */ unsigned short debug_index; /* Index in list (for debugging output) */ + unsigned int nr_segs; /* Number of segs in io_iter */ unsigned int max_nr_segs; /* 0 or max number of segments in an iterator */ enum netfs_io_source source; /* Where to read from/write to */ + unsigned char stream_nr; /* I/O stream this belongs to */ unsigned long flags; #define NETFS_SREQ_COPY_TO_CACHE 0 /* Set if should copy the data to the cache */ #define NETFS_SREQ_CLEAR_TAIL 1 /* Set if the rest of the read should be cleared */ @@ -164,6 +194,11 @@ struct netfs_io_subrequest { #define NETFS_SREQ_SEEK_DATA_READ 3 /* Set if ->read() should SEEK_DATA first */ #define NETFS_SREQ_NO_PROGRESS 4 /* Set if we didn't manage to read any data */ #define NETFS_SREQ_ONDEMAND 5 /* Set if it's from on-demand read mode */ +#define NETFS_SREQ_BOUNDARY 6 /* Set if ends on hard boundary (eg. ceph object) */ +#define NETFS_SREQ_IN_PROGRESS 8 /* Unlocked when the subrequest completes */ +#define NETFS_SREQ_NEED_RETRY 9 /* Set if the filesystem requests a retry */ +#define NETFS_SREQ_RETRYING 10 /* Set if we're retrying */ +#define NETFS_SREQ_FAILED 11 /* Set if the subreq failed unretryably */ }; enum netfs_io_origin { @@ -194,6 +229,9 @@ struct netfs_io_request { struct netfs_cache_resources cache_resources; struct list_head proc_link; /* Link in netfs_iorequests */ struct list_head subrequests; /* Contributory I/O operations */ + struct netfs_io_stream io_streams[2]; /* Streams of parallel I/O operations */ +#define NR_IO_STREAMS 2 //wreq->nr_io_streams + struct netfs_group *group; /* Writeback group being written back */ struct iov_iter iter; /* Unencrypted-side iterator */ struct iov_iter io_iter; /* I/O (Encrypted-side) iterator */ void *netfs_priv; /* Private data for the netfs */ @@ -203,6 +241,8 @@ struct netfs_io_request { unsigned int rsize; /* Maximum read size (0 for none) */ unsigned int wsize; /* Maximum write size (0 for none) */ atomic_t subreq_counter; /* Next subreq->debug_index */ + unsigned int nr_group_rel; /* Number of refs to release on ->group */ + spinlock_t lock; /* Lock for queuing subreqs */ atomic_t nr_outstanding; /* Number of ops in progress */ atomic_t nr_copy_ops; /* Number of copy-to-cache ops in progress */ size_t upper_len; /* Length can be extended to here */ @@ -214,6 +254,10 @@ struct netfs_io_request { bool direct_bv_unpin; /* T if direct_bv[] must be unpinned */ unsigned long long i_size; /* Size of the file */ unsigned long long start; /* Start position */ + atomic64_t issued_to; /* Write issuer folio cursor */ + unsigned long long contiguity; /* Tracking for gaps in the writeback sequence */ + unsigned long long collected_to; /* Point we've collected to */ + unsigned long long cleaned_to; /* Position we've cleaned folios to */ pgoff_t no_unlock_folio; /* Don't unlock this folio after read */ refcount_t ref; unsigned long flags; @@ -227,6 +271,9 @@ struct netfs_io_request { #define NETFS_RREQ_UPLOAD_TO_SERVER 8 /* Need to write to the server */ #define NETFS_RREQ_NONBLOCK 9 /* Don't block if possible (O_NONBLOCK) */ #define NETFS_RREQ_BLOCKED 10 /* We blocked */ +#define NETFS_RREQ_PAUSE 11 /* Pause subrequest generation */ +#define NETFS_RREQ_USE_IO_ITER 12 /* Use ->io_iter rather than ->i_pages */ +#define NETFS_RREQ_ALL_QUEUED 13 /* All subreqs are now queued */ #define NETFS_RREQ_USE_PGPRIV2 31 /* [DEPRECATED] Use PG_private_2 to mark * write to cache on read */ const struct netfs_request_ops *netfs_ops; @@ -258,6 +305,9 @@ struct netfs_request_ops { /* Write request handling */ void (*create_write_requests)(struct netfs_io_request *wreq, loff_t start, size_t len); + void (*begin_writeback)(struct netfs_io_request *wreq); + void (*prepare_write)(struct netfs_io_subrequest *subreq); + void (*issue_write)(struct netfs_io_subrequest *subreq); void (*invalidate_cache)(struct netfs_io_request *wreq); }; @@ -292,6 +342,9 @@ struct netfs_cache_ops { netfs_io_terminated_t term_func, void *term_func_priv); + /* Write data to the cache from a netfs subrequest. */ + void (*issue_write)(struct netfs_io_subrequest *subreq); + /* Expand readahead request */ void (*expand_readahead)(struct netfs_cache_resources *cres, unsigned long long *_start, @@ -304,6 +357,13 @@ struct netfs_cache_ops { enum netfs_io_source (*prepare_read)(struct netfs_io_subrequest *subreq, unsigned long long i_size); + /* Prepare a write subrequest, working out if we're allowed to do it + * and finding out the maximum amount of data to gather before + * attempting to submit. If we're not permitted to do it, the + * subrequest should be marked failed. + */ + void (*prepare_write_subreq)(struct netfs_io_subrequest *subreq); + /* Prepare a write operation, working out what part of the write we can * actually do. */ @@ -349,6 +409,8 @@ int netfs_write_begin(struct netfs_inode *, struct file *, struct folio **, void **fsdata); int netfs_writepages(struct address_space *mapping, struct writeback_control *wbc); +int new_netfs_writepages(struct address_space *mapping, + struct writeback_control *wbc); bool netfs_dirty_folio(struct address_space *mapping, struct folio *folio); int netfs_unpin_writeback(struct inode *inode, struct writeback_control *wbc); void netfs_clear_inode_writeback(struct inode *inode, const void *aux); @@ -372,8 +434,11 @@ size_t netfs_limit_iter(const struct iov_iter *iter, size_t start_offset, struct netfs_io_subrequest *netfs_create_write_request( struct netfs_io_request *wreq, enum netfs_io_source dest, loff_t start, size_t len, work_func_t worker); +void netfs_prepare_write_failed(struct netfs_io_subrequest *subreq); void netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, bool was_async); +void new_netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, + bool was_async); void netfs_queue_write_request(struct netfs_io_subrequest *subreq); int netfs_start_io_read(struct inode *inode); @@ -415,6 +480,7 @@ static inline void netfs_inode_init(struct netfs_inode *ctx, #if IS_ENABLED(CONFIG_FSCACHE) ctx->cache = NULL; #endif + mutex_init(&ctx->wb_lock); /* ->releasepage() drives zero_point */ if (use_zero_point) { ctx->zero_point = ctx->remote_i_size; diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index 7126d2ea459c..e7700172ae7e 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -44,14 +44,18 @@ #define netfs_rreq_traces \ EM(netfs_rreq_trace_assess, "ASSESS ") \ EM(netfs_rreq_trace_copy, "COPY ") \ + EM(netfs_rreq_trace_collect, "COLLECT") \ EM(netfs_rreq_trace_done, "DONE ") \ EM(netfs_rreq_trace_free, "FREE ") \ EM(netfs_rreq_trace_redirty, "REDIRTY") \ EM(netfs_rreq_trace_resubmit, "RESUBMT") \ + EM(netfs_rreq_trace_set_pause, "PAUSE ") \ EM(netfs_rreq_trace_unlock, "UNLOCK ") \ EM(netfs_rreq_trace_unmark, "UNMARK ") \ EM(netfs_rreq_trace_wait_ip, "WAIT-IP") \ + EM(netfs_rreq_trace_wait_pause, "WT-PAUS") \ EM(netfs_rreq_trace_wake_ip, "WAKE-IP") \ + EM(netfs_rreq_trace_unpause, "UNPAUSE") \ E_(netfs_rreq_trace_write_done, "WR-DONE") #define netfs_sreq_sources \ @@ -64,11 +68,15 @@ E_(NETFS_INVALID_WRITE, "INVL") #define netfs_sreq_traces \ + EM(netfs_sreq_trace_discard, "DSCRD") \ EM(netfs_sreq_trace_download_instead, "RDOWN") \ + EM(netfs_sreq_trace_fail, "FAIL ") \ EM(netfs_sreq_trace_free, "FREE ") \ EM(netfs_sreq_trace_limited, "LIMIT") \ EM(netfs_sreq_trace_prepare, "PREP ") \ + EM(netfs_sreq_trace_prep_failed, "PRPFL") \ EM(netfs_sreq_trace_resubmit_short, "SHORT") \ + EM(netfs_sreq_trace_retry, "RETRY") \ EM(netfs_sreq_trace_submit, "SUBMT") \ EM(netfs_sreq_trace_terminated, "TERM ") \ EM(netfs_sreq_trace_write, "WRITE") \ @@ -88,6 +96,7 @@ #define netfs_rreq_ref_traces \ EM(netfs_rreq_trace_get_for_outstanding,"GET OUTSTND") \ EM(netfs_rreq_trace_get_subreq, "GET SUBREQ ") \ + EM(netfs_rreq_trace_get_work, "GET WORK ") \ EM(netfs_rreq_trace_put_complete, "PUT COMPLT ") \ EM(netfs_rreq_trace_put_discard, "PUT DISCARD") \ EM(netfs_rreq_trace_put_failed, "PUT FAILED ") \ @@ -95,6 +104,8 @@ EM(netfs_rreq_trace_put_return, "PUT RETURN ") \ EM(netfs_rreq_trace_put_subreq, "PUT SUBREQ ") \ EM(netfs_rreq_trace_put_work, "PUT WORK ") \ + EM(netfs_rreq_trace_put_work_complete, "PUT WORK CP") \ + EM(netfs_rreq_trace_put_work_nq, "PUT WORK NQ") \ EM(netfs_rreq_trace_see_work, "SEE WORK ") \ E_(netfs_rreq_trace_new, "NEW ") @@ -103,11 +114,14 @@ EM(netfs_sreq_trace_get_resubmit, "GET RESUBMIT") \ EM(netfs_sreq_trace_get_short_read, "GET SHORTRD") \ EM(netfs_sreq_trace_new, "NEW ") \ + EM(netfs_sreq_trace_put_cancel, "PUT CANCEL ") \ EM(netfs_sreq_trace_put_clear, "PUT CLEAR ") \ EM(netfs_sreq_trace_put_discard, "PUT DISCARD") \ + EM(netfs_sreq_trace_put_done, "PUT DONE ") \ EM(netfs_sreq_trace_put_failed, "PUT FAILED ") \ EM(netfs_sreq_trace_put_merged, "PUT MERGED ") \ EM(netfs_sreq_trace_put_no_copy, "PUT NO COPY") \ + EM(netfs_sreq_trace_put_oom, "PUT OOM ") \ EM(netfs_sreq_trace_put_wip, "PUT WIP ") \ EM(netfs_sreq_trace_put_work, "PUT WORK ") \ E_(netfs_sreq_trace_put_terminated, "PUT TERM ") @@ -124,7 +138,9 @@ EM(netfs_streaming_filled_page, "mod-streamw-f") \ EM(netfs_streaming_cont_filled_page, "mod-streamw-f+") \ /* The rest are for writeback */ \ + EM(netfs_folio_trace_cancel_copy, "cancel-copy") \ EM(netfs_folio_trace_clear, "clear") \ + EM(netfs_folio_trace_clear_cc, "clear-cc") \ EM(netfs_folio_trace_clear_s, "clear-s") \ EM(netfs_folio_trace_clear_g, "clear-g") \ EM(netfs_folio_trace_copy, "copy") \ @@ -133,16 +149,26 @@ EM(netfs_folio_trace_end_copy, "end-copy") \ EM(netfs_folio_trace_filled_gaps, "filled-gaps") \ EM(netfs_folio_trace_kill, "kill") \ + EM(netfs_folio_trace_kill_cc, "kill-cc") \ + EM(netfs_folio_trace_kill_g, "kill-g") \ + EM(netfs_folio_trace_kill_s, "kill-s") \ EM(netfs_folio_trace_mkwrite, "mkwrite") \ EM(netfs_folio_trace_mkwrite_plus, "mkwrite+") \ + EM(netfs_folio_trace_not_under_wback, "!wback") \ EM(netfs_folio_trace_read_gaps, "read-gaps") \ EM(netfs_folio_trace_redirty, "redirty") \ EM(netfs_folio_trace_redirtied, "redirtied") \ EM(netfs_folio_trace_store, "store") \ + EM(netfs_folio_trace_store_copy, "store-copy") \ EM(netfs_folio_trace_store_plus, "store+") \ EM(netfs_folio_trace_wthru, "wthru") \ E_(netfs_folio_trace_wthru_plus, "wthru+") +#define netfs_collect_contig_traces \ + EM(netfs_contig_trace_collect, "Collect") \ + EM(netfs_contig_trace_jump, "-->JUMP-->") \ + E_(netfs_contig_trace_unlock, "Unlock") + #ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY #define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY @@ -159,6 +185,7 @@ enum netfs_failure { netfs_failures } __mode(byte); enum netfs_rreq_ref_trace { netfs_rreq_ref_traces } __mode(byte); enum netfs_sreq_ref_trace { netfs_sreq_ref_traces } __mode(byte); enum netfs_folio_trace { netfs_folio_traces } __mode(byte); +enum netfs_collect_contig_trace { netfs_collect_contig_traces } __mode(byte); #endif @@ -180,6 +207,7 @@ netfs_failures; netfs_rreq_ref_traces; netfs_sreq_ref_traces; netfs_folio_traces; +netfs_collect_contig_traces; /* * Now redefine the EM() and E_() macros to map the enums to the strings that @@ -413,16 +441,18 @@ TRACE_EVENT(netfs_write_iter, __field(unsigned long long, start ) __field(size_t, len ) __field(unsigned int, flags ) + __field(unsigned int, ino ) ), TP_fast_assign( __entry->start = iocb->ki_pos; __entry->len = iov_iter_count(from); + __entry->ino = iocb->ki_filp->f_inode->i_ino; __entry->flags = iocb->ki_flags; ), - TP_printk("WRITE-ITER s=%llx l=%zx f=%x", - __entry->start, __entry->len, __entry->flags) + TP_printk("WRITE-ITER i=%x s=%llx l=%zx f=%x", + __entry->ino, __entry->start, __entry->len, __entry->flags) ); TRACE_EVENT(netfs_write, @@ -434,6 +464,7 @@ TRACE_EVENT(netfs_write, TP_STRUCT__entry( __field(unsigned int, wreq ) __field(unsigned int, cookie ) + __field(unsigned int, ino ) __field(enum netfs_write_trace, what ) __field(unsigned long long, start ) __field(unsigned long long, len ) @@ -444,18 +475,213 @@ TRACE_EVENT(netfs_write, struct fscache_cookie *__cookie = netfs_i_cookie(__ctx); __entry->wreq = wreq->debug_id; __entry->cookie = __cookie ? __cookie->debug_id : 0; + __entry->ino = wreq->inode->i_ino; __entry->what = what; __entry->start = wreq->start; __entry->len = wreq->len; ), - TP_printk("R=%08x %s c=%08x by=%llx-%llx", + TP_printk("R=%08x %s c=%08x i=%x by=%llx-%llx", __entry->wreq, __print_symbolic(__entry->what, netfs_write_traces), __entry->cookie, + __entry->ino, __entry->start, __entry->start + __entry->len - 1) ); +TRACE_EVENT(netfs_collect, + TP_PROTO(const struct netfs_io_request *wreq), + + TP_ARGS(wreq), + + TP_STRUCT__entry( + __field(unsigned int, wreq ) + __field(unsigned int, len ) + __field(unsigned long long, transferred ) + __field(unsigned long long, start ) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->start = wreq->start; + __entry->len = wreq->len; + __entry->transferred = wreq->transferred; + ), + + TP_printk("R=%08x s=%llx-%llx", + __entry->wreq, + __entry->start + __entry->transferred, + __entry->start + __entry->len) + ); + +TRACE_EVENT(netfs_collect_contig, + TP_PROTO(const struct netfs_io_request *wreq, unsigned long long to, + enum netfs_collect_contig_trace type), + + TP_ARGS(wreq, to, type), + + TP_STRUCT__entry( + __field(unsigned int, wreq) + __field(enum netfs_collect_contig_trace, type) + __field(unsigned long long, contiguity) + __field(unsigned long long, to) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->type = type; + __entry->contiguity = wreq->contiguity; + __entry->to = to; + ), + + TP_printk("R=%08x %llx -> %llx %s", + __entry->wreq, + __entry->contiguity, + __entry->to, + __print_symbolic(__entry->type, netfs_collect_contig_traces)) + ); + +TRACE_EVENT(netfs_collect_sreq, + TP_PROTO(const struct netfs_io_request *wreq, + const struct netfs_io_subrequest *subreq), + + TP_ARGS(wreq, subreq), + + TP_STRUCT__entry( + __field(unsigned int, wreq ) + __field(unsigned int, subreq ) + __field(unsigned int, stream ) + __field(unsigned int, len ) + __field(unsigned int, transferred ) + __field(unsigned long long, start ) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->subreq = subreq->debug_index; + __entry->stream = subreq->stream_nr; + __entry->start = subreq->start; + __entry->len = subreq->len; + __entry->transferred = subreq->transferred; + ), + + TP_printk("R=%08x[%u:%02x] s=%llx t=%x/%x", + __entry->wreq, __entry->stream, __entry->subreq, + __entry->start, __entry->transferred, __entry->len) + ); + +TRACE_EVENT(netfs_collect_folio, + TP_PROTO(const struct netfs_io_request *wreq, + const struct folio *folio, + unsigned long long fend, + unsigned long long collected_to), + + TP_ARGS(wreq, folio, fend, collected_to), + + TP_STRUCT__entry( + __field(unsigned int, wreq ) + __field(unsigned long, index ) + __field(unsigned long long, fend ) + __field(unsigned long long, cleaned_to ) + __field(unsigned long long, collected_to ) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->index = folio->index; + __entry->fend = fend; + __entry->cleaned_to = wreq->cleaned_to; + __entry->collected_to = collected_to; + ), + + TP_printk("R=%08x ix=%05lx r=%llx-%llx t=%llx/%llx", + __entry->wreq, __entry->index, + (unsigned long long)__entry->index * PAGE_SIZE, __entry->fend, + __entry->cleaned_to, __entry->collected_to) + ); + +TRACE_EVENT(netfs_collect_state, + TP_PROTO(const struct netfs_io_request *wreq, + unsigned long long collected_to, + unsigned int notes), + + TP_ARGS(wreq, collected_to, notes), + + TP_STRUCT__entry( + __field(unsigned int, wreq ) + __field(unsigned int, notes ) + __field(unsigned long long, collected_to ) + __field(unsigned long long, cleaned_to ) + __field(unsigned long long, contiguity ) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->notes = notes; + __entry->collected_to = collected_to; + __entry->cleaned_to = wreq->cleaned_to; + __entry->contiguity = wreq->contiguity; + ), + + TP_printk("R=%08x cto=%llx fto=%llx ctg=%llx n=%x", + __entry->wreq, __entry->collected_to, + __entry->cleaned_to, __entry->contiguity, + __entry->notes) + ); + +TRACE_EVENT(netfs_collect_gap, + TP_PROTO(const struct netfs_io_request *wreq, + const struct netfs_io_stream *stream, + unsigned long long jump_to, char type), + + TP_ARGS(wreq, stream, jump_to, type), + + TP_STRUCT__entry( + __field(unsigned int, wreq) + __field(unsigned char, stream) + __field(unsigned char, type) + __field(unsigned long long, from) + __field(unsigned long long, to) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->stream = stream->stream_nr; + __entry->from = stream->collected_to; + __entry->to = jump_to; + __entry->type = type; + ), + + TP_printk("R=%08x[%x:] %llx->%llx %c", + __entry->wreq, __entry->stream, + __entry->from, __entry->to, __entry->type) + ); + +TRACE_EVENT(netfs_collect_stream, + TP_PROTO(const struct netfs_io_request *wreq, + const struct netfs_io_stream *stream), + + TP_ARGS(wreq, stream), + + TP_STRUCT__entry( + __field(unsigned int, wreq) + __field(unsigned char, stream) + __field(unsigned long long, collected_to) + __field(unsigned long long, front) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->stream = stream->stream_nr; + __entry->collected_to = stream->collected_to; + __entry->front = stream->front ? stream->front->start : UINT_MAX; + ), + + TP_printk("R=%08x[%x:] cto=%llx frn=%llx", + __entry->wreq, __entry->stream, + __entry->collected_to, __entry->front) + ); + #undef EM #undef E_ #endif /* _TRACE_NETFS_H */
Add some write-side stats to count buffered writes, buffered writethrough, and writepages calls. Whilst we're at it, clean up the naming on some of the existing stats counters and organise the output into two sets. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/buffered_read.c | 2 +- fs/netfs/buffered_write.c | 3 +++ fs/netfs/direct_write.c | 2 +- fs/netfs/internal.h | 7 +++++-- fs/netfs/stats.c | 17 ++++++++++++----- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c index 47603f08680e..a6bb03bea920 100644 --- a/fs/netfs/buffered_read.c +++ b/fs/netfs/buffered_read.c @@ -282,7 +282,7 @@ int netfs_read_folio(struct file *file, struct folio *folio) if (ret == -ENOMEM || ret == -EINTR || ret == -ERESTARTSYS) goto discard; - netfs_stat(&netfs_n_rh_readpage); + netfs_stat(&netfs_n_rh_read_folio); trace_netfs_read(rreq, rreq->start, rreq->len, netfs_read_trace_readpage); /* Set up the output buffer */ diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index db4ad158948b..244d67a43972 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -215,6 +215,9 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, if (!is_sync_kiocb(iocb)) wreq->iocb = iocb; wreq->cleanup = netfs_cleanup_buffered_write; + netfs_stat(&netfs_n_wh_writethrough); + } else { + netfs_stat(&netfs_n_wh_buffered_write); } do { diff --git a/fs/netfs/direct_write.c b/fs/netfs/direct_write.c index bee047e20f5d..37c91188107b 100644 --- a/fs/netfs/direct_write.c +++ b/fs/netfs/direct_write.c @@ -143,7 +143,7 @@ ssize_t netfs_unbuffered_write_iter(struct kiocb *iocb, struct iov_iter *from) return 0; trace_netfs_write_iter(iocb, from); - netfs_stat(&netfs_n_rh_dio_write); + netfs_stat(&netfs_n_wh_dio_write); ret = netfs_start_io_direct(inode); if (ret < 0) diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h index c67da478cd2b..58289cc65e25 100644 --- a/fs/netfs/internal.h +++ b/fs/netfs/internal.h @@ -106,9 +106,8 @@ int netfs_end_writethrough(struct netfs_io_request *wreq, struct kiocb *iocb); */ #ifdef CONFIG_NETFS_STATS extern atomic_t netfs_n_rh_dio_read; -extern atomic_t netfs_n_rh_dio_write; extern atomic_t netfs_n_rh_readahead; -extern atomic_t netfs_n_rh_readpage; +extern atomic_t netfs_n_rh_read_folio; extern atomic_t netfs_n_rh_rreq; extern atomic_t netfs_n_rh_sreq; extern atomic_t netfs_n_rh_download; @@ -125,6 +124,10 @@ extern atomic_t netfs_n_rh_write_begin; extern atomic_t netfs_n_rh_write_done; extern atomic_t netfs_n_rh_write_failed; extern atomic_t netfs_n_rh_write_zskip; +extern atomic_t netfs_n_wh_buffered_write; +extern atomic_t netfs_n_wh_writethrough; +extern atomic_t netfs_n_wh_dio_write; +extern atomic_t netfs_n_wh_writepages; extern atomic_t netfs_n_wh_wstream_conflict; extern atomic_t netfs_n_wh_upload; extern atomic_t netfs_n_wh_upload_done; diff --git a/fs/netfs/stats.c b/fs/netfs/stats.c index deeba9f9dcf5..0892768eea32 100644 --- a/fs/netfs/stats.c +++ b/fs/netfs/stats.c @@ -10,9 +10,8 @@ #include "internal.h" atomic_t netfs_n_rh_dio_read; -atomic_t netfs_n_rh_dio_write; atomic_t netfs_n_rh_readahead; -atomic_t netfs_n_rh_readpage; +atomic_t netfs_n_rh_read_folio; atomic_t netfs_n_rh_rreq; atomic_t netfs_n_rh_sreq; atomic_t netfs_n_rh_download; @@ -29,6 +28,10 @@ atomic_t netfs_n_rh_write_begin; atomic_t netfs_n_rh_write_done; atomic_t netfs_n_rh_write_failed; atomic_t netfs_n_rh_write_zskip; +atomic_t netfs_n_wh_buffered_write; +atomic_t netfs_n_wh_writethrough; +atomic_t netfs_n_wh_dio_write; +atomic_t netfs_n_wh_writepages; atomic_t netfs_n_wh_wstream_conflict; atomic_t netfs_n_wh_upload; atomic_t netfs_n_wh_upload_done; @@ -39,13 +42,17 @@ atomic_t netfs_n_wh_write_failed; int netfs_stats_show(struct seq_file *m, void *v) { - seq_printf(m, "Netfs : DR=%u DW=%u RA=%u RP=%u WB=%u WBZ=%u\n", + seq_printf(m, "Netfs : DR=%u RA=%u RF=%u WB=%u WBZ=%u\n", atomic_read(&netfs_n_rh_dio_read), - atomic_read(&netfs_n_rh_dio_write), atomic_read(&netfs_n_rh_readahead), - atomic_read(&netfs_n_rh_readpage), + atomic_read(&netfs_n_rh_read_folio), atomic_read(&netfs_n_rh_write_begin), atomic_read(&netfs_n_rh_write_zskip)); + seq_printf(m, "Netfs : BW=%u WT=%u DW=%u WP=%u\n", + atomic_read(&netfs_n_wh_buffered_write), + atomic_read(&netfs_n_wh_writethrough), + atomic_read(&netfs_n_wh_dio_write), + atomic_read(&netfs_n_wh_writepages)); seq_printf(m, "Netfs : ZR=%u sh=%u sk=%u\n", atomic_read(&netfs_n_rh_zero), atomic_read(&netfs_n_rh_short_read),
The current netfslib writeback implementation creates writeback requests of contiguous folio data and then separately tiles subrequests over the space twice, once for the server and once for the cache. This creates a few issues: (1) Every time there's a discontiguity or a change between writing to only one destination or writing to both, it must create a new request. This makes it harder to do vectored writes. (2) The folios don't have the writeback mark removed until the end of the request - and a request could be hundreds of megabytes. (3) In future, I want to support a larger cache granularity, which will require aggregation of some folios that contain unmodified data (which only need to go to the cache) and some which contain modifications (which need to be uploaded and stored to the cache) - but, currently, these are treated as discontiguous. There's also a move to get everyone to use writeback_iter() to extract writable folios from the pagecache. That said, currently writeback_iter() has some issues that make it less than ideal: (1) there's no way to cancel the iteration, even if you find a "temporary" error that means the current folio and all subsequent folios are going to fail; (2) there's no way to filter the folios being written back - something that will impact Ceph with it's ordered snap system; (3) and if you get a folio you can't immediately deal with (say you need to flush the preceding writes), you are left with a folio hanging in the locked state for the duration, when really we should unlock it and relock it later. In this new implementation, I use writeback_iter() to pump folios, progressively creating two parallel, but separate streams and cleaning up the finished folios as the subrequests complete. Either or both streams can contain gaps, and the subrequests in each stream can be of variable size, don't need to align with each other and don't need to align with the folios. Indeed, subrequests can cross folio boundaries, may cover several folios or a folio may be spanned by multiple folios, e.g.: +---+---+-----+-----+---+----------+ Folios: | | | | | | | +---+---+-----+-----+---+----------+ +------+------+ +----+----+ Upload: | | |.....| | | +------+------+ +----+----+ +------+------+------+------+------+ Cache: | | | | | | +------+------+------+------+------+ The progressive subrequest construction permits the algorithm to be preparing both the next upload to the server and the next write to the cache whilst the previous ones are already in progress. Throttling can be applied to control the rate of production of subrequests - and, in any case, we probably want to write them to the server in ascending order, particularly if the file will be extended. Content crypto can also be prepared at the same time as the subrequests and run asynchronously, with the prepped requests being stalled until the crypto catches up with them. This might also be useful for transport crypto, but that happens at a lower layer, so probably would be harder to pull off. The algorithm is split into three parts: (1) The issuer. This walks through the data, packaging it up, encrypting it and creating subrequests. The part of this that generates subrequests only deals with file positions and spans and so is usable for DIO/unbuffered writes as well as buffered writes. (2) The collector. This asynchronously collects completed subrequests, unlocks folios, frees crypto buffers and performs any retries. This runs in a work queue so that the issuer can return to the caller for writeback (so that the VM can have its kswapd thread back) or async writes. (3) The retryer. This pauses the issuer, waits for all outstanding subrequests to complete and then goes through the failed subrequests to reissue them. This may involve reprepping them (with cifs, the credits must be renegotiated, and a subrequest may need splitting), and doing RMW for content crypto if there's a conflicting change on the server. [!] Note that some of the functions are prefixed with "new_" to avoid clashes with existing functions. These will be renamed in a later patch that cuts over to the new algorithm. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/Makefile | 4 +- fs/netfs/buffered_write.c | 4 - fs/netfs/internal.h | 27 ++ fs/netfs/objects.c | 17 + fs/netfs/write_collect.c | 808 +++++++++++++++++++++++++++++++++++ fs/netfs/write_issue.c | 673 +++++++++++++++++++++++++++++ include/linux/netfs.h | 68 ++- include/trace/events/netfs.h | 232 +++++++++- 8 files changed, 1824 insertions(+), 9 deletions(-) create mode 100644 fs/netfs/write_collect.c create mode 100644 fs/netfs/write_issue.c diff --git a/fs/netfs/Makefile b/fs/netfs/Makefile index d4d1d799819e..1eb86e34b5a9 100644 --- a/fs/netfs/Makefile +++ b/fs/netfs/Makefile @@ -11,7 +11,9 @@ netfs-y := \ main.o \ misc.o \ objects.o \ - output.o + output.o \ + write_collect.o \ + write_issue.o netfs-$(CONFIG_NETFS_STATS) += stats.o diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 244d67a43972..621532dacef5 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -74,16 +74,12 @@ static enum netfs_how_to_modify netfs_how_to_modify(struct netfs_inode *ctx, if (file->f_mode & FMODE_READ) goto no_write_streaming; - if (test_bit(NETFS_ICTX_NO_WRITE_STREAMING, &ctx->flags)) - goto no_write_streaming; if (netfs_is_cache_enabled(ctx)) { /* We don't want to get a streaming write on a file that loses * caching service temporarily because the backing store got * culled. */ - if (!test_bit(NETFS_ICTX_NO_WRITE_STREAMING, &ctx->flags)) - set_bit(NETFS_ICTX_NO_WRITE_STREAMING, &ctx->flags); goto no_write_streaming; } diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h index 58289cc65e25..5d3f74a70fa7 100644 --- a/fs/netfs/internal.h +++ b/fs/netfs/internal.h @@ -153,6 +153,33 @@ static inline void netfs_stat_d(atomic_t *stat) #define netfs_stat_d(x) do {} while(0) #endif +/* + * write_collect.c + */ +int netfs_folio_written_back(struct folio *folio); +void netfs_write_collection_worker(struct work_struct *work); +void netfs_wake_write_collector(struct netfs_io_request *wreq, bool was_async); + +/* + * write_issue.c + */ +struct netfs_io_request *netfs_create_write_req(struct address_space *mapping, + struct file *file, + loff_t start, + enum netfs_io_origin origin); +void netfs_reissue_write(struct netfs_io_stream *stream, + struct netfs_io_subrequest *subreq); +int netfs_advance_write(struct netfs_io_request *wreq, + struct netfs_io_stream *stream, + loff_t start, size_t len, bool to_eof); +struct netfs_io_request *new_netfs_begin_writethrough(struct kiocb *iocb, size_t len); +int new_netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *folio, size_t copied, bool to_page_end, + struct folio **writethrough_cache); +int new_netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *writethrough_cache); +int netfs_unbuffered_write(struct netfs_io_request *wreq, bool may_wait, size_t len); + /* * Miscellaneous functions. */ diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c index 1a4e2ce735ce..c90d482b1650 100644 --- a/fs/netfs/objects.c +++ b/fs/netfs/objects.c @@ -47,6 +47,10 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping, rreq->inode = inode; rreq->i_size = i_size_read(inode); rreq->debug_id = atomic_inc_return(&debug_ids); + rreq->wsize = INT_MAX; + spin_lock_init(&rreq->lock); + INIT_LIST_HEAD(&rreq->io_streams[0].subrequests); + INIT_LIST_HEAD(&rreq->io_streams[1].subrequests); INIT_LIST_HEAD(&rreq->subrequests); INIT_WORK(&rreq->work, NULL); refcount_set(&rreq->ref, 1); @@ -85,6 +89,8 @@ void netfs_get_request(struct netfs_io_request *rreq, enum netfs_rreq_ref_trace void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async) { struct netfs_io_subrequest *subreq; + struct netfs_io_stream *stream; + int s; while (!list_empty(&rreq->subrequests)) { subreq = list_first_entry(&rreq->subrequests, @@ -93,6 +99,17 @@ void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async) netfs_put_subrequest(subreq, was_async, netfs_sreq_trace_put_clear); } + + for (s = 0; s < ARRAY_SIZE(rreq->io_streams); s++) { + stream = &rreq->io_streams[s]; + while (!list_empty(&stream->subrequests)) { + subreq = list_first_entry(&stream->subrequests, + struct netfs_io_subrequest, rreq_link); + list_del(&subreq->rreq_link); + netfs_put_subrequest(subreq, was_async, + netfs_sreq_trace_put_clear); + } + } } static void netfs_free_request_rcu(struct rcu_head *rcu) diff --git a/fs/netfs/write_collect.c b/fs/netfs/write_collect.c new file mode 100644 index 000000000000..5e2ca8b25af0 --- /dev/null +++ b/fs/netfs/write_collect.c @@ -0,0 +1,808 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Network filesystem write subrequest result collection, assessment + * and retrying. + * + * Copyright (C) 2024 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + */ + +#include <linux/export.h> +#include <linux/fs.h> +#include <linux/mm.h> +#include <linux/pagemap.h> +#include <linux/slab.h> +#include "internal.h" + +/* Notes made in the collector */ +#define HIT_PENDING 0x01 /* A front op was still pending */ +#define SOME_EMPTY 0x02 /* One of more streams are empty */ +#define ALL_EMPTY 0x04 /* All streams are empty */ +#define MAYBE_DISCONTIG 0x08 /* A front op may be discontiguous (rounded to PAGE_SIZE) */ +#define NEED_REASSESS 0x10 /* Need to loop round and reassess */ +#define REASSESS_DISCONTIG 0x20 /* Reassess discontiguity if contiguity advances */ +#define MADE_PROGRESS 0x40 /* Made progress cleaning up a stream or the folio set */ +#define BUFFERED 0x80 /* The pagecache needs cleaning up */ +#define NEED_RETRY 0x100 /* A front op requests retrying */ +#define SAW_FAILURE 0x200 /* One stream or hit a permanent failure */ + +/* + * Successful completion of write of a folio to the server and/or cache. Note + * that we are not allowed to lock the folio here on pain of deadlocking with + * truncate. + */ +int netfs_folio_written_back(struct folio *folio) +{ + enum netfs_folio_trace why = netfs_folio_trace_clear; + struct netfs_folio *finfo; + struct netfs_group *group = NULL; + int gcount = 0; + + if ((finfo = netfs_folio_info(folio))) { + /* Streaming writes cannot be redirtied whilst under writeback, + * so discard the streaming record. + */ + folio_detach_private(folio); + group = finfo->netfs_group; + gcount++; + kfree(finfo); + why = netfs_folio_trace_clear_s; + goto end_wb; + } + + if ((group = netfs_folio_group(folio))) { + if (group == NETFS_FOLIO_COPY_TO_CACHE) { + why = netfs_folio_trace_clear_cc; + if (group == NETFS_FOLIO_COPY_TO_CACHE) + folio_detach_private(folio); + else + why = netfs_folio_trace_redirtied; + goto end_wb; + } + + /* Need to detach the group pointer if the page didn't get + * redirtied. If it has been redirtied, then it must be within + * the same group. + */ + why = netfs_folio_trace_redirtied; + if (!folio_test_dirty(folio)) { + if (!folio_test_dirty(folio)) { + folio_detach_private(folio); + gcount++; + why = netfs_folio_trace_clear_g; + } + } + } + +end_wb: + trace_netfs_folio(folio, why); + folio_end_writeback(folio); + return gcount; +} + +/* + * Get hold of a folio we have under writeback. We don't want to get the + * refcount on it. + */ +static struct folio *netfs_writeback_lookup_folio(struct netfs_io_request *wreq, loff_t pos) +{ + XA_STATE(xas, &wreq->mapping->i_pages, pos / PAGE_SIZE); + struct folio *folio; + + rcu_read_lock(); + + for (;;) { + xas_reset(&xas); + folio = xas_load(&xas); + if (xas_retry(&xas, folio)) + continue; + + if (!folio || xa_is_value(folio)) + kdebug("R=%08x: folio %lx (%llx) not present", + wreq->debug_id, xas.xa_index, pos / PAGE_SIZE); + BUG_ON(!folio || xa_is_value(folio)); + + if (folio == xas_reload(&xas)) + break; + } + + rcu_read_unlock(); + + if (WARN_ONCE(!folio_test_writeback(folio), + "R=%08x: folio %lx is not under writeback\n", + wreq->debug_id, folio->index)) { + trace_netfs_folio(folio, netfs_folio_trace_not_under_wback); + } + return folio; +} + +/* + * Unlock any folios we've finished with. + */ +static void netfs_writeback_unlock_folios(struct netfs_io_request *wreq, + unsigned long long collected_to, + unsigned int *notes) +{ + for (;;) { + struct folio *folio; + struct netfs_folio *finfo; + unsigned long long fpos, fend; + size_t fsize, flen; + + folio = netfs_writeback_lookup_folio(wreq, wreq->cleaned_to); + + fpos = folio_pos(folio); + fsize = folio_size(folio); + finfo = netfs_folio_info(folio); + flen = finfo ? finfo->dirty_offset + finfo->dirty_len : fsize; + + fend = min_t(unsigned long long, fpos + flen, wreq->i_size); + + trace_netfs_collect_folio(wreq, folio, fend, collected_to); + + if (fpos + fsize > wreq->contiguity) { + trace_netfs_collect_contig(wreq, fpos + fsize, + netfs_contig_trace_unlock); + wreq->contiguity = fpos + fsize; + } + + /* Unlock any folio we've transferred all of. */ + if (collected_to < fend) + break; + + wreq->nr_group_rel += netfs_folio_written_back(folio); + wreq->cleaned_to = fpos + fsize; + *notes |= MADE_PROGRESS; + + if (fpos + fsize >= collected_to) + break; + } +} + +/* + * Perform retries on the streams that need it. + */ +static void netfs_retry_write_stream(struct netfs_io_request *wreq, + struct netfs_io_stream *stream) +{ + struct list_head *next; + + _enter("R=%x[%x:]", wreq->debug_id, stream->stream_nr); + + if (unlikely(stream->failed)) + return; + + /* If there's no renegotiation to do, just resend each failed subreq. */ + if (!stream->prepare_write) { + struct netfs_io_subrequest *subreq; + + list_for_each_entry(subreq, &stream->subrequests, rreq_link) { + if (test_bit(NETFS_SREQ_FAILED, &subreq->flags)) + break; + if (__test_and_clear_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags)) { + __set_bit(NETFS_SREQ_RETRYING, &subreq->flags); + netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit); + netfs_reissue_write(stream, subreq); + } + } + return; + } + + if (list_empty(&stream->subrequests)) + return; + next = stream->subrequests.next; + + do { + struct netfs_io_subrequest *subreq = NULL, *from, *to, *tmp; + unsigned long long start, len; + size_t part; + bool boundary = false; + + /* Go through the stream and find the next span of contiguous + * data that we then rejig (cifs, for example, needs the wsize + * renegotiating) and reissue. + */ + from = list_entry(next, struct netfs_io_subrequest, rreq_link); + to = from; + start = from->start + from->transferred; + len = from->len - from->transferred; + + if (test_bit(NETFS_SREQ_FAILED, &from->flags) || + !test_bit(NETFS_SREQ_NEED_RETRY, &from->flags)) + return; + + list_for_each_continue(next, &stream->subrequests) { + subreq = list_entry(next, struct netfs_io_subrequest, rreq_link); + if (subreq->start + subreq->transferred != start + len || + test_bit(NETFS_SREQ_BOUNDARY, &subreq->flags) || + !test_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags)) + break; + to = subreq; + len += to->len; + } + + /* Work through the sublist. */ + subreq = from; + list_for_each_entry_from(subreq, &stream->subrequests, rreq_link) { + if (!len) + break; + /* Renegotiate max_len (wsize) */ + trace_netfs_sreq(subreq, netfs_sreq_trace_retry); + __clear_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); + __set_bit(NETFS_SREQ_RETRYING, &subreq->flags); + stream->prepare_write(subreq); + + part = min(len, subreq->max_len); + subreq->len = part; + subreq->start = start; + subreq->transferred = 0; + len -= part; + start += part; + if (len && subreq == to && + __test_and_clear_bit(NETFS_SREQ_BOUNDARY, &to->flags)) + boundary = true; + + netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit); + netfs_reissue_write(stream, subreq); + if (subreq == to) + break; + } + + /* If we managed to use fewer subreqs, we can discard the + * excess; if we used the same number, then we're done. + */ + if (!len) { + if (subreq == to) + continue; + list_for_each_entry_safe_from(subreq, tmp, + &stream->subrequests, rreq_link) { + trace_netfs_sreq(subreq, netfs_sreq_trace_discard); + list_del(&subreq->rreq_link); + netfs_put_subrequest(subreq, false, netfs_sreq_trace_put_done); + if (subreq == to) + break; + } + continue; + } + + /* We ran out of subrequests, so we need to allocate some more + * and insert them after. + */ + do { + subreq = netfs_alloc_subrequest(wreq); + subreq->source = to->source; + subreq->start = start; + subreq->max_len = len; + subreq->max_nr_segs = INT_MAX; + subreq->debug_index = atomic_inc_return(&wreq->subreq_counter); + subreq->stream_nr = to->stream_nr; + __set_bit(NETFS_SREQ_RETRYING, &subreq->flags); + + trace_netfs_sreq_ref(wreq->debug_id, subreq->debug_index, + refcount_read(&subreq->ref), + netfs_sreq_trace_new); + netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit); + + list_add(&subreq->rreq_link, &to->rreq_link); + to = list_next_entry(to, rreq_link); + trace_netfs_sreq(subreq, netfs_sreq_trace_retry); + + switch (stream->source) { + case NETFS_UPLOAD_TO_SERVER: + netfs_stat(&netfs_n_wh_upload); + subreq->max_len = min(len, wreq->wsize); + break; + case NETFS_WRITE_TO_CACHE: + netfs_stat(&netfs_n_wh_write); + break; + default: + WARN_ON_ONCE(1); + } + + stream->prepare_write(subreq); + + part = min(len, subreq->max_len); + subreq->len = subreq->transferred + part; + len -= part; + start += part; + if (!len && boundary) { + __set_bit(NETFS_SREQ_BOUNDARY, &to->flags); + boundary = false; + } + + netfs_reissue_write(stream, subreq); + if (!len) + break; + + } while (len); + + } while (!list_is_head(next, &stream->subrequests)); +} + +/* + * Perform retries on the streams that need it. If we're doing content + * encryption and the server copy changed due to a third-party write, we may + * need to do an RMW cycle and also rewrite the data to the cache. + */ +static void netfs_retry_writes(struct netfs_io_request *wreq) +{ + struct netfs_io_subrequest *subreq; + struct netfs_io_stream *stream; + int s; + + /* Wait for all outstanding I/O to quiesce before performing retries as + * we may need to renegotiate the I/O sizes. + */ + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (!stream->active) + continue; + + list_for_each_entry(subreq, &stream->subrequests, rreq_link) { + wait_on_bit(&subreq->flags, NETFS_SREQ_IN_PROGRESS, + TASK_UNINTERRUPTIBLE); + } + } + + // TODO: Enc: Fetch changed partial pages + // TODO: Enc: Reencrypt content if needed. + // TODO: Enc: Wind back transferred point. + // TODO: Enc: Mark cache pages for retry. + + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->need_retry) { + stream->need_retry = false; + netfs_retry_write_stream(wreq, stream); + } + } +} + +/* + * Collect and assess the results of various write subrequests. We may need to + * retry some of the results - or even do an RMW cycle for content crypto. + * + * Note that we have a number of parallel, overlapping lists of subrequests, + * one to the server and one to the local cache for example, which may not be + * the same size or starting position and may not even correspond in boundary + * alignment. + */ +static void netfs_collect_write_results(struct netfs_io_request *wreq) +{ + struct netfs_io_subrequest *front, *remove; + struct netfs_io_stream *stream; + unsigned long long collected_to; + unsigned int notes; + int s; + + _enter("%llx-%llx", wreq->start, wreq->start + wreq->len); + trace_netfs_collect(wreq); + trace_netfs_rreq(wreq, netfs_rreq_trace_collect); + +reassess_streams: + smp_rmb(); + collected_to = ULLONG_MAX; + if (wreq->origin == NETFS_WRITEBACK) + notes = ALL_EMPTY | BUFFERED | MAYBE_DISCONTIG; + else if (wreq->origin == NETFS_WRITETHROUGH) + notes = ALL_EMPTY | BUFFERED; + else + notes = ALL_EMPTY; + + /* Remove completed subrequests from the front of the streams and + * advance the completion point on each stream. We stop when we hit + * something that's in progress. The issuer thread may be adding stuff + * to the tail whilst we're doing this. + * + * We must not, however, merge in discontiguities that span whole + * folios that aren't under writeback. This is made more complicated + * by the folios in the gap being of unpredictable sizes - if they even + * exist - but we don't want to look them up. + */ + for (s = 0; s < NR_IO_STREAMS; s++) { + loff_t rstart, rend; + + stream = &wreq->io_streams[s]; + /* Read active flag before list pointers */ + if (!smp_load_acquire(&stream->active)) + continue; + + front = stream->front; + while (front) { + trace_netfs_collect_sreq(wreq, front); + //_debug("sreq [%x] %llx %zx/%zx", + // front->debug_index, front->start, front->transferred, front->len); + + /* Stall if there may be a discontinuity. */ + rstart = round_down(front->start, PAGE_SIZE); + if (rstart > wreq->contiguity) { + if (wreq->contiguity > stream->collected_to) { + trace_netfs_collect_gap(wreq, stream, + wreq->contiguity, 'D'); + stream->collected_to = wreq->contiguity; + } + notes |= REASSESS_DISCONTIG; + break; + } + rend = round_up(front->start + front->len, PAGE_SIZE); + if (rend > wreq->contiguity) { + trace_netfs_collect_contig(wreq, rend, + netfs_contig_trace_collect); + wreq->contiguity = rend; + if (notes & REASSESS_DISCONTIG) + notes |= NEED_REASSESS; + } + notes &= ~MAYBE_DISCONTIG; + + /* Stall if the front is still undergoing I/O. */ + if (test_bit(NETFS_SREQ_IN_PROGRESS, &front->flags)) { + notes |= HIT_PENDING; + break; + } + smp_rmb(); /* Read counters after I-P flag. */ + + if (stream->failed) { + stream->collected_to = front->start + front->len; + notes |= MADE_PROGRESS | SAW_FAILURE; + goto cancel; + } + if (front->start + front->transferred > stream->collected_to) { + stream->collected_to = front->start + front->transferred; + stream->transferred = stream->collected_to - wreq->start; + notes |= MADE_PROGRESS; + } + if (test_bit(NETFS_SREQ_FAILED, &front->flags)) { + stream->failed = true; + stream->error = front->error; + if (stream->source == NETFS_UPLOAD_TO_SERVER) + mapping_set_error(wreq->mapping, front->error); + notes |= NEED_REASSESS | SAW_FAILURE; + break; + } + if (front->transferred < front->len) { + stream->need_retry = true; + notes |= NEED_RETRY | MADE_PROGRESS; + break; + } + + cancel: + /* Remove if completely consumed. */ + spin_lock(&wreq->lock); + + remove = front; + list_del_init(&front->rreq_link); + front = list_first_entry_or_null(&stream->subrequests, + struct netfs_io_subrequest, rreq_link); + stream->front = front; + if (!front) { + unsigned long long jump_to = atomic64_read(&wreq->issued_to); + + if (stream->collected_to < jump_to) { + trace_netfs_collect_gap(wreq, stream, jump_to, 'A'); + stream->collected_to = jump_to; + } + } + + spin_unlock(&wreq->lock); + netfs_put_subrequest(remove, false, + notes & SAW_FAILURE ? + netfs_sreq_trace_put_cancel : + netfs_sreq_trace_put_done); + } + + if (front) + notes &= ~ALL_EMPTY; + else + notes |= SOME_EMPTY; + + if (stream->collected_to < collected_to) + collected_to = stream->collected_to; + } + + if (collected_to != ULLONG_MAX && collected_to > wreq->collected_to) + wreq->collected_to = collected_to; + + /* If we have an empty stream, we need to jump it forward over any gap + * otherwise the collection point will never advance. + * + * Note that the issuer always adds to the stream with the lowest + * so-far submitted start, so if we see two consecutive subreqs in one + * stream with nothing between then in another stream, then the second + * stream has a gap that can be jumped. + */ + if (notes & SOME_EMPTY) { + unsigned long long jump_to = wreq->start + wreq->len; + + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->active && + stream->front && + stream->front->start < jump_to) + jump_to = stream->front->start; + } + + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->active && + !stream->front && + stream->collected_to < jump_to) { + trace_netfs_collect_gap(wreq, stream, jump_to, 'B'); + stream->collected_to = jump_to; + } + } + } + + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->active) + trace_netfs_collect_stream(wreq, stream); + } + + trace_netfs_collect_state(wreq, wreq->collected_to, notes); + + /* Unlock any folios that we have now finished with. */ + if (notes & BUFFERED) { + unsigned long long clean_to = min(wreq->collected_to, wreq->contiguity); + + if (wreq->cleaned_to < clean_to) + netfs_writeback_unlock_folios(wreq, clean_to, ¬es); + } else { + wreq->cleaned_to = wreq->collected_to; + } + + // TODO: Discard encryption buffers + + /* If all streams are discontiguous with the last folio we cleared, we + * may need to skip a set of folios. + */ + if ((notes & (MAYBE_DISCONTIG | ALL_EMPTY)) == MAYBE_DISCONTIG) { + unsigned long long jump_to = ULLONG_MAX; + + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->active && stream->front && + stream->front->start < jump_to) + jump_to = stream->front->start; + } + + trace_netfs_collect_contig(wreq, jump_to, netfs_contig_trace_jump); + wreq->contiguity = jump_to; + wreq->cleaned_to = jump_to; + wreq->collected_to = jump_to; + for (s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->collected_to < jump_to) + stream->collected_to = jump_to; + } + //cond_resched(); + notes |= MADE_PROGRESS; + goto reassess_streams; + } + + if (notes & NEED_RETRY) + goto need_retry; + if ((notes & MADE_PROGRESS) && test_bit(NETFS_RREQ_PAUSE, &wreq->flags)) { + trace_netfs_rreq(wreq, netfs_rreq_trace_unpause); + clear_bit_unlock(NETFS_RREQ_PAUSE, &wreq->flags); + wake_up_bit(&wreq->flags, NETFS_RREQ_PAUSE); + } + + if (notes & NEED_REASSESS) { + //cond_resched(); + goto reassess_streams; + } + if (notes & MADE_PROGRESS) { + //cond_resched(); + goto reassess_streams; + } + +out: + netfs_put_group_many(wreq->group, wreq->nr_group_rel); + wreq->nr_group_rel = 0; + _leave(" = %x", notes); + return; + +need_retry: + /* Okay... We're going to have to retry one or both streams. Note + * that any partially completed op will have had any wholly transferred + * folios removed from it. + */ + _debug("retry"); + netfs_retry_writes(wreq); + goto out; +} + +/* + * Perform the collection of subrequests, folios and encryption buffers. + */ +void netfs_write_collection_worker(struct work_struct *work) +{ + struct netfs_io_request *wreq = container_of(work, struct netfs_io_request, work); + struct netfs_inode *ictx = netfs_inode(wreq->inode); + size_t transferred; + int s; + + _enter("R=%x", wreq->debug_id); + + netfs_see_request(wreq, netfs_rreq_trace_see_work); + if (!test_bit(NETFS_RREQ_IN_PROGRESS, &wreq->flags)) { + netfs_put_request(wreq, false, netfs_rreq_trace_put_work); + return; + } + + netfs_collect_write_results(wreq); + + /* We're done when the app thread has finished posting subreqs and all + * the queues in all the streams are empty. + */ + if (!test_bit(NETFS_RREQ_ALL_QUEUED, &wreq->flags)) { + netfs_put_request(wreq, false, netfs_rreq_trace_put_work); + return; + } + smp_rmb(); /* Read ALL_QUEUED before lists. */ + + transferred = LONG_MAX; + for (s = 0; s < NR_IO_STREAMS; s++) { + struct netfs_io_stream *stream = &wreq->io_streams[s]; + if (!stream->active) + continue; + if (!list_empty(&stream->subrequests)) { + netfs_put_request(wreq, false, netfs_rreq_trace_put_work); + return; + } + if (stream->transferred < transferred) + transferred = stream->transferred; + } + + /* Okay, declare that all I/O is complete. */ + wreq->transferred = transferred; + trace_netfs_rreq(wreq, netfs_rreq_trace_write_done); + + if (wreq->io_streams[1].active && + wreq->io_streams[1].failed) { + /* Cache write failure doesn't prevent writeback completion + * unless we're in disconnected mode. + */ + ictx->ops->invalidate_cache(wreq); + } + + if (wreq->cleanup) + wreq->cleanup(wreq); + + if (wreq->origin == NETFS_DIO_WRITE && + wreq->mapping->nrpages) { + /* mmap may have got underfoot and we may now have folios + * locally covering the region we just wrote. Attempt to + * discard the folios, but leave in place any modified locally. + * ->write_iter() is prevented from interfering by the DIO + * counter. + */ + pgoff_t first = wreq->start >> PAGE_SHIFT; + pgoff_t last = (wreq->start + wreq->transferred - 1) >> PAGE_SHIFT; + invalidate_inode_pages2_range(wreq->mapping, first, last); + } + + if (wreq->origin == NETFS_DIO_WRITE) + inode_dio_end(wreq->inode); + + _debug("finished"); + trace_netfs_rreq(wreq, netfs_rreq_trace_wake_ip); + clear_bit_unlock(NETFS_RREQ_IN_PROGRESS, &wreq->flags); + wake_up_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS); + + if (wreq->iocb) { + wreq->iocb->ki_pos += wreq->transferred; + if (wreq->iocb->ki_complete) + wreq->iocb->ki_complete( + wreq->iocb, wreq->error ? wreq->error : wreq->transferred); + wreq->iocb = VFS_PTR_POISON; + } + + netfs_clear_subrequests(wreq, false); + netfs_put_request(wreq, false, netfs_rreq_trace_put_work_complete); +} + +/* + * Wake the collection work item. + */ +void netfs_wake_write_collector(struct netfs_io_request *wreq, bool was_async) +{ + if (!work_pending(&wreq->work)) { + netfs_get_request(wreq, netfs_rreq_trace_get_work); + if (!queue_work(system_unbound_wq, &wreq->work)) + netfs_put_request(wreq, was_async, netfs_rreq_trace_put_work_nq); + } +} + +/** + * new_netfs_write_subrequest_terminated - Note the termination of a write operation. + * @_op: The I/O request that has terminated. + * @transferred_or_error: The amount of data transferred or an error code. + * @was_async: The termination was asynchronous + * + * This tells the library that a contributory write I/O operation has + * terminated, one way or another, and that it should collect the results. + * + * The caller indicates in @transferred_or_error the outcome of the operation, + * supplying a positive value to indicate the number of bytes transferred or a + * negative error code. The library will look after reissuing I/O operations + * as appropriate and writing downloaded data to the cache. + * + * If @was_async is true, the caller might be running in softirq or interrupt + * context and we can't sleep. + * + * When this is called, ownership of the subrequest is transferred back to the + * library, along with a ref. + * + * Note that %_op is a void* so that the function can be passed to + * kiocb::term_func without the need for a casting wrapper. + */ +void new_netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, + bool was_async) +{ + struct netfs_io_subrequest *subreq = _op; + struct netfs_io_request *wreq = subreq->rreq; + struct netfs_io_stream *stream = &wreq->io_streams[subreq->stream_nr]; + + _enter("%x[%x] %zd", wreq->debug_id, subreq->debug_index, transferred_or_error); + + switch (subreq->source) { + case NETFS_UPLOAD_TO_SERVER: + netfs_stat(&netfs_n_wh_upload_done); + break; + case NETFS_WRITE_TO_CACHE: + netfs_stat(&netfs_n_wh_write_done); + break; + case NETFS_INVALID_WRITE: + break; + default: + BUG(); + } + + if (IS_ERR_VALUE(transferred_or_error)) { + subreq->error = transferred_or_error; + if (subreq->error == -EAGAIN) + set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); + else + set_bit(NETFS_SREQ_FAILED, &subreq->flags); + trace_netfs_failure(wreq, subreq, transferred_or_error, netfs_fail_write); + + switch (subreq->source) { + case NETFS_WRITE_TO_CACHE: + netfs_stat(&netfs_n_wh_write_failed); + break; + case NETFS_UPLOAD_TO_SERVER: + netfs_stat(&netfs_n_wh_upload_failed); + break; + default: + break; + } + trace_netfs_rreq(wreq, netfs_rreq_trace_set_pause); + set_bit(NETFS_RREQ_PAUSE, &wreq->flags); + } else { + if (WARN(transferred_or_error > subreq->len - subreq->transferred, + "Subreq excess write: R=%x[%x] %zd > %zu - %zu", + wreq->debug_id, subreq->debug_index, + transferred_or_error, subreq->len, subreq->transferred)) + transferred_or_error = subreq->len - subreq->transferred; + + subreq->error = 0; + subreq->transferred += transferred_or_error; + + if (subreq->transferred < subreq->len) + set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); + } + + trace_netfs_sreq(subreq, netfs_sreq_trace_terminated); + + clear_bit_unlock(NETFS_SREQ_IN_PROGRESS, &subreq->flags); + wake_up_bit(&subreq->flags, NETFS_SREQ_IN_PROGRESS); + + /* If we are at the head of the queue, wake up the collector, + * transferring a ref to it if we were the ones to do so. + */ + if (list_is_first(&subreq->rreq_link, &stream->subrequests)) + netfs_wake_write_collector(wreq, was_async); + + netfs_put_subrequest(subreq, was_async, netfs_sreq_trace_put_terminated); +} +EXPORT_SYMBOL(new_netfs_write_subrequest_terminated); diff --git a/fs/netfs/write_issue.c b/fs/netfs/write_issue.c new file mode 100644 index 000000000000..e0fb472898f5 --- /dev/null +++ b/fs/netfs/write_issue.c @@ -0,0 +1,673 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Network filesystem high-level (buffered) writeback. + * + * Copyright (C) 2024 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * + * To support network filesystems with local caching, we manage a situation + * that can be envisioned like the following: + * + * +---+---+-----+-----+---+----------+ + * Folios: | | | | | | | + * +---+---+-----+-----+---+----------+ + * + * +------+------+ +----+----+ + * Upload: | | |.....| | | + * (Stream 0) +------+------+ +----+----+ + * + * +------+------+------+------+------+ + * Cache: | | | | | | + * (Stream 1) +------+------+------+------+------+ + * + * Where we have a sequence of folios of varying sizes that we need to overlay + * with multiple parallel streams of I/O requests, where the I/O requests in a + * stream may also be of various sizes (in cifs, for example, the sizes are + * negotiated with the server; in something like ceph, they may represent the + * sizes of storage objects). + * + * The sequence in each stream may contain gaps and noncontiguous subrequests + * may be glued together into single vectored write RPCs. + */ + +#include <linux/export.h> +#include <linux/fs.h> +#include <linux/mm.h> +#include <linux/pagemap.h> +#include "internal.h" + +/* + * Kill all dirty folios in the event of an unrecoverable error, starting with + * a locked folio we've already obtained from writeback_iter(). + */ +static void netfs_kill_dirty_pages(struct address_space *mapping, + struct writeback_control *wbc, + struct folio *folio) +{ + int error = 0; + + do { + enum netfs_folio_trace why = netfs_folio_trace_kill; + struct netfs_group *group = NULL; + struct netfs_folio *finfo = NULL; + void *priv; + + priv = folio_detach_private(folio); + if (priv) { + finfo = __netfs_folio_info(priv); + if (finfo) { + /* Kill folio from streaming write. */ + group = finfo->netfs_group; + why = netfs_folio_trace_kill_s; + } else { + group = priv; + if (group == NETFS_FOLIO_COPY_TO_CACHE) { + /* Kill copy-to-cache folio */ + why = netfs_folio_trace_kill_cc; + group = NULL; + } else { + /* Kill folio with group */ + why = netfs_folio_trace_kill_g; + } + } + } + + trace_netfs_folio(folio, why); + + folio_start_writeback(folio); + folio_unlock(folio); + folio_end_writeback(folio); + + netfs_put_group(group); + kfree(finfo); + + } while ((folio = writeback_iter(mapping, wbc, folio, &error))); +} + +/* + * Create a write request and set it up appropriately for the origin type. + */ +struct netfs_io_request *netfs_create_write_req(struct address_space *mapping, + struct file *file, + loff_t start, + enum netfs_io_origin origin) +{ + struct netfs_io_request *wreq; + struct netfs_inode *ictx; + + wreq = netfs_alloc_request(mapping, file, start, 0, origin); + if (IS_ERR(wreq)) + return wreq; + + _enter("R=%x", wreq->debug_id); + + ictx = netfs_inode(wreq->inode); + if (test_bit(NETFS_RREQ_WRITE_TO_CACHE, &wreq->flags)) + fscache_begin_write_operation(&wreq->cache_resources, netfs_i_cookie(ictx)); + + wreq->contiguity = wreq->start; + wreq->cleaned_to = wreq->start; + INIT_WORK(&wreq->work, netfs_write_collection_worker); + + wreq->io_streams[0].stream_nr = 0; + wreq->io_streams[0].source = NETFS_UPLOAD_TO_SERVER; + wreq->io_streams[0].prepare_write = ictx->ops->prepare_write; + wreq->io_streams[0].issue_write = ictx->ops->issue_write; + wreq->io_streams[0].collected_to = start; + wreq->io_streams[0].transferred = LONG_MAX; + + wreq->io_streams[1].stream_nr = 1; + wreq->io_streams[1].source = NETFS_WRITE_TO_CACHE; + wreq->io_streams[1].collected_to = start; + wreq->io_streams[1].transferred = LONG_MAX; + if (fscache_resources_valid(&wreq->cache_resources)) { + wreq->io_streams[1].avail = true; + wreq->io_streams[1].prepare_write = wreq->cache_resources.ops->prepare_write_subreq; + wreq->io_streams[1].issue_write = wreq->cache_resources.ops->issue_write; + } + + return wreq; +} + +/** + * netfs_prepare_write_failed - Note write preparation failed + * @subreq: The subrequest to mark + * + * Mark a subrequest to note that preparation for write failed. + */ +void netfs_prepare_write_failed(struct netfs_io_subrequest *subreq) +{ + __set_bit(NETFS_SREQ_FAILED, &subreq->flags); + trace_netfs_sreq(subreq, netfs_sreq_trace_prep_failed); +} +EXPORT_SYMBOL(netfs_prepare_write_failed); + +/* + * Prepare a write subrequest. We need to allocate a new subrequest + * if we don't have one. + */ +static void netfs_prepare_write(struct netfs_io_request *wreq, + struct netfs_io_stream *stream, + loff_t start) +{ + struct netfs_io_subrequest *subreq; + + subreq = netfs_alloc_subrequest(wreq); + subreq->source = stream->source; + subreq->start = start; + subreq->max_len = ULONG_MAX; + subreq->max_nr_segs = INT_MAX; + subreq->stream_nr = stream->stream_nr; + + _enter("R=%x[%x]", wreq->debug_id, subreq->debug_index); + + trace_netfs_sreq_ref(wreq->debug_id, subreq->debug_index, + refcount_read(&subreq->ref), + netfs_sreq_trace_new); + + trace_netfs_sreq(subreq, netfs_sreq_trace_prepare); + + switch (stream->source) { + case NETFS_UPLOAD_TO_SERVER: + netfs_stat(&netfs_n_wh_upload); + subreq->max_len = wreq->wsize; + break; + case NETFS_WRITE_TO_CACHE: + netfs_stat(&netfs_n_wh_write); + break; + default: + WARN_ON_ONCE(1); + break; + } + + if (stream->prepare_write) + stream->prepare_write(subreq); + + __set_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags); + + /* We add to the end of the list whilst the collector may be walking + * the list. The collector only goes nextwards and uses the lock to + * remove entries off of the front. + */ + spin_lock(&wreq->lock); + list_add_tail(&subreq->rreq_link, &stream->subrequests); + if (list_is_first(&subreq->rreq_link, &stream->subrequests)) { + stream->front = subreq; + if (!stream->active) { + stream->collected_to = stream->front->start; + /* Write list pointers before active flag */ + smp_store_release(&stream->active, true); + } + } + + spin_unlock(&wreq->lock); + + stream->construct = subreq; +} + +/* + * Set the I/O iterator for the filesystem/cache to use and dispatch the I/O + * operation. The operation may be asynchronous and should call + * netfs_write_subrequest_terminated() when complete. + */ +static void netfs_do_issue_write(struct netfs_io_stream *stream, + struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *wreq = subreq->rreq; + + _enter("R=%x[%x],%zx", wreq->debug_id, subreq->debug_index, subreq->len); + + if (test_bit(NETFS_SREQ_FAILED, &subreq->flags)) + return netfs_write_subrequest_terminated(subreq, subreq->error, false); + + // TODO: Use encrypted buffer + if (test_bit(NETFS_RREQ_USE_IO_ITER, &wreq->flags)) { + subreq->io_iter = wreq->io_iter; + iov_iter_advance(&subreq->io_iter, + subreq->start + subreq->transferred - wreq->start); + iov_iter_truncate(&subreq->io_iter, + subreq->len - subreq->transferred); + } else { + iov_iter_xarray(&subreq->io_iter, ITER_SOURCE, &wreq->mapping->i_pages, + subreq->start + subreq->transferred, + subreq->len - subreq->transferred); + } + + trace_netfs_sreq(subreq, netfs_sreq_trace_submit); + stream->issue_write(subreq); +} + +void netfs_reissue_write(struct netfs_io_stream *stream, + struct netfs_io_subrequest *subreq) +{ + __set_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags); + netfs_do_issue_write(stream, subreq); +} + +static void netfs_issue_write(struct netfs_io_request *wreq, + struct netfs_io_stream *stream) +{ + struct netfs_io_subrequest *subreq = stream->construct; + + if (!subreq) + return; + stream->construct = NULL; + + if (subreq->start + subreq->len > wreq->start + wreq->submitted) + wreq->len = wreq->submitted = subreq->start + subreq->len - wreq->start; + netfs_do_issue_write(stream, subreq); +} + +/* + * Add data to the write subrequest, dispatching each as we fill it up or if it + * is discontiguous with the previous. We only fill one part at a time so that + * we can avoid overrunning the credits obtained (cifs) and try to parallelise + * content-crypto preparation with network writes. + */ +int netfs_advance_write(struct netfs_io_request *wreq, + struct netfs_io_stream *stream, + loff_t start, size_t len, bool to_eof) +{ + struct netfs_io_subrequest *subreq = stream->construct; + size_t part; + + if (!stream->avail) { + _leave("no write"); + return len; + } + + _enter("R=%x[%x]", wreq->debug_id, subreq ? subreq->debug_index : 0); + + if (subreq && start != subreq->start + subreq->len) { + netfs_issue_write(wreq, stream); + subreq = NULL; + } + + if (!stream->construct) + netfs_prepare_write(wreq, stream, start); + subreq = stream->construct; + + part = min(subreq->max_len - subreq->len, len); + _debug("part %zx/%zx %zx/%zx", subreq->len, subreq->max_len, part, len); + subreq->len += part; + subreq->nr_segs++; + + if (subreq->len >= subreq->max_len || + subreq->nr_segs >= subreq->max_nr_segs || + to_eof) { + netfs_issue_write(wreq, stream); + subreq = NULL; + } + + return part; +} + +/* + * Write some of a pending folio data back to the server. + */ +static int netfs_write_folio(struct netfs_io_request *wreq, + struct writeback_control *wbc, + struct folio *folio) +{ + struct netfs_io_stream *upload = &wreq->io_streams[0]; + struct netfs_io_stream *cache = &wreq->io_streams[1]; + struct netfs_io_stream *stream; + struct netfs_group *fgroup; /* TODO: Use this with ceph */ + struct netfs_folio *finfo; + size_t fsize = folio_size(folio), flen = fsize, foff = 0; + loff_t fpos = folio_pos(folio); + bool to_eof = false, streamw = false; + bool debug = false; + + _enter(""); + + if (fpos >= wreq->i_size) { + /* mmap beyond eof. */ + _debug("beyond eof"); + folio_start_writeback(folio); + folio_unlock(folio); + wreq->nr_group_rel += netfs_folio_written_back(folio); + netfs_put_group_many(wreq->group, wreq->nr_group_rel); + wreq->nr_group_rel = 0; + return 0; + } + + fgroup = netfs_folio_group(folio); + finfo = netfs_folio_info(folio); + if (finfo) { + foff = finfo->dirty_offset; + flen = foff + finfo->dirty_len; + streamw = true; + } + + if (wreq->origin == NETFS_WRITETHROUGH) { + to_eof = false; + if (flen > wreq->i_size - fpos) + flen = wreq->i_size - fpos; + } else if (flen > wreq->i_size - fpos) { + flen = wreq->i_size - fpos; + if (!streamw) + folio_zero_segment(folio, flen, fsize); + to_eof = true; + } else if (flen == wreq->i_size - fpos) { + to_eof = true; + } + flen -= foff; + + _debug("folio %zx %zx %zx", foff, flen, fsize); + + /* Deal with discontinuities in the stream of dirty pages. These can + * arise from a number of sources: + * + * (1) Intervening non-dirty pages from random-access writes, multiple + * flushers writing back different parts simultaneously and manual + * syncing. + * + * (2) Partially-written pages from write-streaming. + * + * (3) Pages that belong to a different write-back group (eg. Ceph + * snapshots). + * + * (4) Actually-clean pages that were marked for write to the cache + * when they were read. Note that these appear as a special + * write-back group. + */ + if (fgroup == NETFS_FOLIO_COPY_TO_CACHE) { + netfs_issue_write(wreq, upload); + } else if (fgroup != wreq->group) { + /* We can't write this page to the server yet. */ + kdebug("wrong group"); + folio_redirty_for_writepage(wbc, folio); + folio_unlock(folio); + netfs_issue_write(wreq, upload); + netfs_issue_write(wreq, cache); + return 0; + } + + if (foff > 0) + netfs_issue_write(wreq, upload); + if (streamw) + netfs_issue_write(wreq, cache); + + /* Flip the page to the writeback state and unlock. If we're called + * from write-through, then the page has already been put into the wb + * state. + */ + if (wreq->origin == NETFS_WRITEBACK) + folio_start_writeback(folio); + folio_unlock(folio); + + if (fgroup == NETFS_FOLIO_COPY_TO_CACHE) { + if (!fscache_resources_valid(&wreq->cache_resources)) { + trace_netfs_folio(folio, netfs_folio_trace_cancel_copy); + netfs_issue_write(wreq, upload); + netfs_folio_written_back(folio); + return 0; + } + trace_netfs_folio(folio, netfs_folio_trace_store_copy); + } else if (!upload->construct) { + trace_netfs_folio(folio, netfs_folio_trace_store); + } else { + trace_netfs_folio(folio, netfs_folio_trace_store_plus); + } + + /* Move the submission point forward to allow for write-streaming data + * not starting at the front of the page. We don't do write-streaming + * with the cache as the cache requires DIO alignment. + * + * Also skip uploading for data that's been read and just needs copying + * to the cache. + */ + for (int s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + stream->submit_max_len = fsize; + stream->submit_off = foff; + stream->submit_len = flen; + if ((stream->source == NETFS_WRITE_TO_CACHE && streamw) || + (stream->source == NETFS_UPLOAD_TO_SERVER && + fgroup == NETFS_FOLIO_COPY_TO_CACHE)) { + stream->submit_off = UINT_MAX; + stream->submit_len = 0; + stream->submit_max_len = 0; + } + } + + /* Attach the folio to one or more subrequests. For a big folio, we + * could end up with thousands of subrequests if the wsize is small - + * but we might need to wait during the creation of subrequests for + * network resources (eg. SMB credits). + */ + for (;;) { + ssize_t part; + size_t lowest_off = ULONG_MAX; + int choose_s = -1; + + /* Always add to the lowest-submitted stream first. */ + for (int s = 0; s < NR_IO_STREAMS; s++) { + stream = &wreq->io_streams[s]; + if (stream->submit_len > 0 && + stream->submit_off < lowest_off) { + lowest_off = stream->submit_off; + choose_s = s; + } + } + + if (choose_s < 0) + break; + stream = &wreq->io_streams[choose_s]; + + part = netfs_advance_write(wreq, stream, fpos + stream->submit_off, + stream->submit_len, to_eof); + atomic64_set(&wreq->issued_to, fpos + stream->submit_off); + stream->submit_off += part; + stream->submit_max_len -= part; + if (part > stream->submit_len) + stream->submit_len = 0; + else + stream->submit_len -= part; + if (part > 0) + debug = true; + } + + atomic64_set(&wreq->issued_to, fpos + fsize); + + if (!debug) + kdebug("R=%x: No submit", wreq->debug_id); + + if (flen < fsize) + for (int s = 0; s < NR_IO_STREAMS; s++) + netfs_issue_write(wreq, &wreq->io_streams[s]); + + _leave(" = 0"); + return 0; +} + +/* + * Write some of the pending data back to the server + */ +int new_netfs_writepages(struct address_space *mapping, + struct writeback_control *wbc) +{ + struct netfs_inode *ictx = netfs_inode(mapping->host); + struct netfs_io_request *wreq = NULL; + struct folio *folio; + int error = 0; + + if (wbc->sync_mode == WB_SYNC_ALL) + mutex_lock(&ictx->wb_lock); + else if (!mutex_trylock(&ictx->wb_lock)) + return 0; + + /* Need the first folio to be able to set up the op. */ + folio = writeback_iter(mapping, wbc, NULL, &error); + if (!folio) + goto out; + + wreq = netfs_create_write_req(mapping, NULL, folio_pos(folio), NETFS_WRITEBACK); + if (IS_ERR(wreq)) { + error = PTR_ERR(wreq); + goto couldnt_start; + } + + trace_netfs_write(wreq, netfs_write_trace_writeback); + netfs_stat(&netfs_n_wh_writepages); + + do { + _debug("wbiter %lx %llx", folio->index, wreq->start + wreq->submitted); + + /* It appears we don't have to handle cyclic writeback wrapping. */ + WARN_ON_ONCE(wreq && folio_pos(folio) < wreq->start + wreq->submitted); + + if (netfs_folio_group(folio) != NETFS_FOLIO_COPY_TO_CACHE && + unlikely(!test_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags))) { + set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); + wreq->netfs_ops->begin_writeback(wreq); + } + + error = netfs_write_folio(wreq, wbc, folio); + if (error < 0) + break; + } while ((folio = writeback_iter(mapping, wbc, folio, &error))); + + for (int s = 0; s < NR_IO_STREAMS; s++) + netfs_issue_write(wreq, &wreq->io_streams[s]); + smp_wmb(); /* Write lists before ALL_QUEUED. */ + set_bit(NETFS_RREQ_ALL_QUEUED, &wreq->flags); + + mutex_unlock(&ictx->wb_lock); + + netfs_put_request(wreq, false, netfs_rreq_trace_put_return); + _leave(" = %d", error); + return error; + +couldnt_start: + netfs_kill_dirty_pages(mapping, wbc, folio); +out: + mutex_unlock(&ictx->wb_lock); + _leave(" = %d", error); + return error; +} +EXPORT_SYMBOL(new_netfs_writepages); + +/* + * Begin a write operation for writing through the pagecache. + */ +struct netfs_io_request *new_netfs_begin_writethrough(struct kiocb *iocb, size_t len) +{ + struct netfs_io_request *wreq = NULL; + struct netfs_inode *ictx = netfs_inode(file_inode(iocb->ki_filp)); + + mutex_lock(&ictx->wb_lock); + + wreq = netfs_create_write_req(iocb->ki_filp->f_mapping, iocb->ki_filp, + iocb->ki_pos, NETFS_WRITETHROUGH); + if (IS_ERR(wreq)) + mutex_unlock(&ictx->wb_lock); + + wreq->io_streams[0].avail = true; + trace_netfs_write(wreq, netfs_write_trace_writethrough); + return wreq; +} + +/* + * Advance the state of the write operation used when writing through the + * pagecache. Data has been copied into the pagecache that we need to append + * to the request. If we've added more than wsize then we need to create a new + * subrequest. + */ +int new_netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *folio, size_t copied, bool to_page_end, + struct folio **writethrough_cache) +{ + _enter("R=%x ic=%zu ws=%u cp=%zu tp=%u", + wreq->debug_id, wreq->iter.count, wreq->wsize, copied, to_page_end); + + if (!*writethrough_cache) { + if (folio_test_dirty(folio)) + /* Sigh. mmap. */ + folio_clear_dirty_for_io(folio); + + /* We can make multiple writes to the folio... */ + folio_start_writeback(folio); + if (wreq->len == 0) + trace_netfs_folio(folio, netfs_folio_trace_wthru); + else + trace_netfs_folio(folio, netfs_folio_trace_wthru_plus); + *writethrough_cache = folio; + } + + wreq->len += copied; + if (!to_page_end) + return 0; + + *writethrough_cache = NULL; + return netfs_write_folio(wreq, wbc, folio); +} + +/* + * End a write operation used when writing through the pagecache. + */ +int new_netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, + struct folio *writethrough_cache) +{ + struct netfs_inode *ictx = netfs_inode(wreq->inode); + int ret; + + _enter("R=%x", wreq->debug_id); + + if (writethrough_cache) + netfs_write_folio(wreq, wbc, writethrough_cache); + + netfs_issue_write(wreq, &wreq->io_streams[0]); + netfs_issue_write(wreq, &wreq->io_streams[1]); + smp_wmb(); /* Write lists before ALL_QUEUED. */ + set_bit(NETFS_RREQ_ALL_QUEUED, &wreq->flags); + + mutex_unlock(&ictx->wb_lock); + + ret = wreq->error; + netfs_put_request(wreq, false, netfs_rreq_trace_put_return); + return ret; +} + +/* + * Write data to the server without going through the pagecache and without + * writing it to the local cache. + */ +int netfs_unbuffered_write(struct netfs_io_request *wreq, bool may_wait, size_t len) +{ + struct netfs_io_stream *upload = &wreq->io_streams[0]; + ssize_t part; + loff_t start = wreq->start; + int error = 0; + + _enter("%zx", len); + + if (wreq->origin == NETFS_DIO_WRITE) + inode_dio_begin(wreq->inode); + + while (len) { + // TODO: Prepare content encryption + + _debug("unbuffered %zx", len); + part = netfs_advance_write(wreq, upload, start, len, false); + start += part; + len -= part; + if (test_bit(NETFS_RREQ_PAUSE, &wreq->flags)) { + trace_netfs_rreq(wreq, netfs_rreq_trace_wait_pause); + wait_on_bit(&wreq->flags, NETFS_RREQ_PAUSE, TASK_UNINTERRUPTIBLE); + } + if (test_bit(NETFS_RREQ_FAILED, &wreq->flags)) + break; + } + + netfs_issue_write(wreq, upload); + + smp_wmb(); /* Write lists before ALL_QUEUED. */ + set_bit(NETFS_RREQ_ALL_QUEUED, &wreq->flags); + if (list_empty(&upload->subrequests)) + netfs_wake_write_collector(wreq, false); + + _leave(" = %d", error); + return error; +} diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 88269681d4fc..42dba05a428b 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -64,6 +64,7 @@ struct netfs_inode { #if IS_ENABLED(CONFIG_FSCACHE) struct fscache_cookie *cache; #endif + struct mutex wb_lock; /* Writeback serialisation */ loff_t remote_i_size; /* Size of the remote file */ loff_t zero_point; /* Size after which we assume there's no data * on the server */ @@ -71,7 +72,6 @@ struct netfs_inode { #define NETFS_ICTX_ODIRECT 0 /* The file has DIO in progress */ #define NETFS_ICTX_UNBUFFERED 1 /* I/O should not use the pagecache */ #define NETFS_ICTX_WRITETHROUGH 2 /* Write-through caching */ -#define NETFS_ICTX_NO_WRITE_STREAMING 3 /* Don't engage in write-streaming */ #define NETFS_ICTX_USE_PGPRIV2 31 /* [DEPRECATED] Use PG_private_2 to mark * write to cache on read */ }; @@ -126,6 +126,33 @@ static inline struct netfs_group *netfs_folio_group(struct folio *folio) return priv; } +/* + * Stream of I/O subrequests going to a particular destination, such as the + * server or the local cache. This is mainly intended for writing where we may + * have to write to multiple destinations concurrently. + */ +struct netfs_io_stream { + /* Submission tracking */ + struct netfs_io_subrequest *construct; /* Op being constructed */ + unsigned int submit_off; /* Folio offset we're submitting from */ + unsigned int submit_len; /* Amount of data left to submit */ + unsigned int submit_max_len; /* Amount I/O can be rounded up to */ + void (*prepare_write)(struct netfs_io_subrequest *subreq); + void (*issue_write)(struct netfs_io_subrequest *subreq); + /* Collection tracking */ + struct list_head subrequests; /* Contributory I/O operations */ + struct netfs_io_subrequest *front; /* Op being collected */ + unsigned long long collected_to; /* Position we've collected results to */ + size_t transferred; /* The amount transferred from this stream */ + enum netfs_io_source source; /* Where to read from/write to */ + unsigned short error; /* Aggregate error for the stream */ + unsigned char stream_nr; /* Index of stream in parent table */ + bool avail; /* T if stream is available */ + bool active; /* T if stream is active */ + bool need_retry; /* T if this stream needs retrying */ + bool failed; /* T if this stream failed */ +}; + /* * Resources required to do operations on a cache. */ @@ -150,13 +177,16 @@ struct netfs_io_subrequest { struct list_head rreq_link; /* Link in rreq->subrequests */ struct iov_iter io_iter; /* Iterator for this subrequest */ unsigned long long start; /* Where to start the I/O */ + size_t max_len; /* Maximum size of the I/O */ size_t len; /* Size of the I/O */ size_t transferred; /* Amount of data transferred */ refcount_t ref; short error; /* 0 or error that occurred */ unsigned short debug_index; /* Index in list (for debugging output) */ + unsigned int nr_segs; /* Number of segs in io_iter */ unsigned int max_nr_segs; /* 0 or max number of segments in an iterator */ enum netfs_io_source source; /* Where to read from/write to */ + unsigned char stream_nr; /* I/O stream this belongs to */ unsigned long flags; #define NETFS_SREQ_COPY_TO_CACHE 0 /* Set if should copy the data to the cache */ #define NETFS_SREQ_CLEAR_TAIL 1 /* Set if the rest of the read should be cleared */ @@ -164,6 +194,11 @@ struct netfs_io_subrequest { #define NETFS_SREQ_SEEK_DATA_READ 3 /* Set if ->read() should SEEK_DATA first */ #define NETFS_SREQ_NO_PROGRESS 4 /* Set if we didn't manage to read any data */ #define NETFS_SREQ_ONDEMAND 5 /* Set if it's from on-demand read mode */ +#define NETFS_SREQ_BOUNDARY 6 /* Set if ends on hard boundary (eg. ceph object) */ +#define NETFS_SREQ_IN_PROGRESS 8 /* Unlocked when the subrequest completes */ +#define NETFS_SREQ_NEED_RETRY 9 /* Set if the filesystem requests a retry */ +#define NETFS_SREQ_RETRYING 10 /* Set if we're retrying */ +#define NETFS_SREQ_FAILED 11 /* Set if the subreq failed unretryably */ }; enum netfs_io_origin { @@ -194,6 +229,9 @@ struct netfs_io_request { struct netfs_cache_resources cache_resources; struct list_head proc_link; /* Link in netfs_iorequests */ struct list_head subrequests; /* Contributory I/O operations */ + struct netfs_io_stream io_streams[2]; /* Streams of parallel I/O operations */ +#define NR_IO_STREAMS 2 //wreq->nr_io_streams + struct netfs_group *group; /* Writeback group being written back */ struct iov_iter iter; /* Unencrypted-side iterator */ struct iov_iter io_iter; /* I/O (Encrypted-side) iterator */ void *netfs_priv; /* Private data for the netfs */ @@ -203,6 +241,8 @@ struct netfs_io_request { unsigned int rsize; /* Maximum read size (0 for none) */ unsigned int wsize; /* Maximum write size (0 for none) */ atomic_t subreq_counter; /* Next subreq->debug_index */ + unsigned int nr_group_rel; /* Number of refs to release on ->group */ + spinlock_t lock; /* Lock for queuing subreqs */ atomic_t nr_outstanding; /* Number of ops in progress */ atomic_t nr_copy_ops; /* Number of copy-to-cache ops in progress */ size_t upper_len; /* Length can be extended to here */ @@ -214,6 +254,10 @@ struct netfs_io_request { bool direct_bv_unpin; /* T if direct_bv[] must be unpinned */ unsigned long long i_size; /* Size of the file */ unsigned long long start; /* Start position */ + atomic64_t issued_to; /* Write issuer folio cursor */ + unsigned long long contiguity; /* Tracking for gaps in the writeback sequence */ + unsigned long long collected_to; /* Point we've collected to */ + unsigned long long cleaned_to; /* Position we've cleaned folios to */ pgoff_t no_unlock_folio; /* Don't unlock this folio after read */ refcount_t ref; unsigned long flags; @@ -227,6 +271,9 @@ struct netfs_io_request { #define NETFS_RREQ_UPLOAD_TO_SERVER 8 /* Need to write to the server */ #define NETFS_RREQ_NONBLOCK 9 /* Don't block if possible (O_NONBLOCK) */ #define NETFS_RREQ_BLOCKED 10 /* We blocked */ +#define NETFS_RREQ_PAUSE 11 /* Pause subrequest generation */ +#define NETFS_RREQ_USE_IO_ITER 12 /* Use ->io_iter rather than ->i_pages */ +#define NETFS_RREQ_ALL_QUEUED 13 /* All subreqs are now queued */ #define NETFS_RREQ_USE_PGPRIV2 31 /* [DEPRECATED] Use PG_private_2 to mark * write to cache on read */ const struct netfs_request_ops *netfs_ops; @@ -258,6 +305,9 @@ struct netfs_request_ops { /* Write request handling */ void (*create_write_requests)(struct netfs_io_request *wreq, loff_t start, size_t len); + void (*begin_writeback)(struct netfs_io_request *wreq); + void (*prepare_write)(struct netfs_io_subrequest *subreq); + void (*issue_write)(struct netfs_io_subrequest *subreq); void (*invalidate_cache)(struct netfs_io_request *wreq); }; @@ -292,6 +342,9 @@ struct netfs_cache_ops { netfs_io_terminated_t term_func, void *term_func_priv); + /* Write data to the cache from a netfs subrequest. */ + void (*issue_write)(struct netfs_io_subrequest *subreq); + /* Expand readahead request */ void (*expand_readahead)(struct netfs_cache_resources *cres, unsigned long long *_start, @@ -304,6 +357,13 @@ struct netfs_cache_ops { enum netfs_io_source (*prepare_read)(struct netfs_io_subrequest *subreq, unsigned long long i_size); + /* Prepare a write subrequest, working out if we're allowed to do it + * and finding out the maximum amount of data to gather before + * attempting to submit. If we're not permitted to do it, the + * subrequest should be marked failed. + */ + void (*prepare_write_subreq)(struct netfs_io_subrequest *subreq); + /* Prepare a write operation, working out what part of the write we can * actually do. */ @@ -349,6 +409,8 @@ int netfs_write_begin(struct netfs_inode *, struct file *, struct folio **, void **fsdata); int netfs_writepages(struct address_space *mapping, struct writeback_control *wbc); +int new_netfs_writepages(struct address_space *mapping, + struct writeback_control *wbc); bool netfs_dirty_folio(struct address_space *mapping, struct folio *folio); int netfs_unpin_writeback(struct inode *inode, struct writeback_control *wbc); void netfs_clear_inode_writeback(struct inode *inode, const void *aux); @@ -372,8 +434,11 @@ size_t netfs_limit_iter(const struct iov_iter *iter, size_t start_offset, struct netfs_io_subrequest *netfs_create_write_request( struct netfs_io_request *wreq, enum netfs_io_source dest, loff_t start, size_t len, work_func_t worker); +void netfs_prepare_write_failed(struct netfs_io_subrequest *subreq); void netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, bool was_async); +void new_netfs_write_subrequest_terminated(void *_op, ssize_t transferred_or_error, + bool was_async); void netfs_queue_write_request(struct netfs_io_subrequest *subreq); int netfs_start_io_read(struct inode *inode); @@ -415,6 +480,7 @@ static inline void netfs_inode_init(struct netfs_inode *ctx, #if IS_ENABLED(CONFIG_FSCACHE) ctx->cache = NULL; #endif + mutex_init(&ctx->wb_lock); /* ->releasepage() drives zero_point */ if (use_zero_point) { ctx->zero_point = ctx->remote_i_size; diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index 7126d2ea459c..e7700172ae7e 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -44,14 +44,18 @@ #define netfs_rreq_traces \ EM(netfs_rreq_trace_assess, "ASSESS ") \ EM(netfs_rreq_trace_copy, "COPY ") \ + EM(netfs_rreq_trace_collect, "COLLECT") \ EM(netfs_rreq_trace_done, "DONE ") \ EM(netfs_rreq_trace_free, "FREE ") \ EM(netfs_rreq_trace_redirty, "REDIRTY") \ EM(netfs_rreq_trace_resubmit, "RESUBMT") \ + EM(netfs_rreq_trace_set_pause, "PAUSE ") \ EM(netfs_rreq_trace_unlock, "UNLOCK ") \ EM(netfs_rreq_trace_unmark, "UNMARK ") \ EM(netfs_rreq_trace_wait_ip, "WAIT-IP") \ + EM(netfs_rreq_trace_wait_pause, "WT-PAUS") \ EM(netfs_rreq_trace_wake_ip, "WAKE-IP") \ + EM(netfs_rreq_trace_unpause, "UNPAUSE") \ E_(netfs_rreq_trace_write_done, "WR-DONE") #define netfs_sreq_sources \ @@ -64,11 +68,15 @@ E_(NETFS_INVALID_WRITE, "INVL") #define netfs_sreq_traces \ + EM(netfs_sreq_trace_discard, "DSCRD") \ EM(netfs_sreq_trace_download_instead, "RDOWN") \ + EM(netfs_sreq_trace_fail, "FAIL ") \ EM(netfs_sreq_trace_free, "FREE ") \ EM(netfs_sreq_trace_limited, "LIMIT") \ EM(netfs_sreq_trace_prepare, "PREP ") \ + EM(netfs_sreq_trace_prep_failed, "PRPFL") \ EM(netfs_sreq_trace_resubmit_short, "SHORT") \ + EM(netfs_sreq_trace_retry, "RETRY") \ EM(netfs_sreq_trace_submit, "SUBMT") \ EM(netfs_sreq_trace_terminated, "TERM ") \ EM(netfs_sreq_trace_write, "WRITE") \ @@ -88,6 +96,7 @@ #define netfs_rreq_ref_traces \ EM(netfs_rreq_trace_get_for_outstanding,"GET OUTSTND") \ EM(netfs_rreq_trace_get_subreq, "GET SUBREQ ") \ + EM(netfs_rreq_trace_get_work, "GET WORK ") \ EM(netfs_rreq_trace_put_complete, "PUT COMPLT ") \ EM(netfs_rreq_trace_put_discard, "PUT DISCARD") \ EM(netfs_rreq_trace_put_failed, "PUT FAILED ") \ @@ -95,6 +104,8 @@ EM(netfs_rreq_trace_put_return, "PUT RETURN ") \ EM(netfs_rreq_trace_put_subreq, "PUT SUBREQ ") \ EM(netfs_rreq_trace_put_work, "PUT WORK ") \ + EM(netfs_rreq_trace_put_work_complete, "PUT WORK CP") \ + EM(netfs_rreq_trace_put_work_nq, "PUT WORK NQ") \ EM(netfs_rreq_trace_see_work, "SEE WORK ") \ E_(netfs_rreq_trace_new, "NEW ") @@ -103,11 +114,14 @@ EM(netfs_sreq_trace_get_resubmit, "GET RESUBMIT") \ EM(netfs_sreq_trace_get_short_read, "GET SHORTRD") \ EM(netfs_sreq_trace_new, "NEW ") \ + EM(netfs_sreq_trace_put_cancel, "PUT CANCEL ") \ EM(netfs_sreq_trace_put_clear, "PUT CLEAR ") \ EM(netfs_sreq_trace_put_discard, "PUT DISCARD") \ + EM(netfs_sreq_trace_put_done, "PUT DONE ") \ EM(netfs_sreq_trace_put_failed, "PUT FAILED ") \ EM(netfs_sreq_trace_put_merged, "PUT MERGED ") \ EM(netfs_sreq_trace_put_no_copy, "PUT NO COPY") \ + EM(netfs_sreq_trace_put_oom, "PUT OOM ") \ EM(netfs_sreq_trace_put_wip, "PUT WIP ") \ EM(netfs_sreq_trace_put_work, "PUT WORK ") \ E_(netfs_sreq_trace_put_terminated, "PUT TERM ") @@ -124,7 +138,9 @@ EM(netfs_streaming_filled_page, "mod-streamw-f") \ EM(netfs_streaming_cont_filled_page, "mod-streamw-f+") \ /* The rest are for writeback */ \ + EM(netfs_folio_trace_cancel_copy, "cancel-copy") \ EM(netfs_folio_trace_clear, "clear") \ + EM(netfs_folio_trace_clear_cc, "clear-cc") \ EM(netfs_folio_trace_clear_s, "clear-s") \ EM(netfs_folio_trace_clear_g, "clear-g") \ EM(netfs_folio_trace_copy, "copy") \ @@ -133,16 +149,26 @@ EM(netfs_folio_trace_end_copy, "end-copy") \ EM(netfs_folio_trace_filled_gaps, "filled-gaps") \ EM(netfs_folio_trace_kill, "kill") \ + EM(netfs_folio_trace_kill_cc, "kill-cc") \ + EM(netfs_folio_trace_kill_g, "kill-g") \ + EM(netfs_folio_trace_kill_s, "kill-s") \ EM(netfs_folio_trace_mkwrite, "mkwrite") \ EM(netfs_folio_trace_mkwrite_plus, "mkwrite+") \ + EM(netfs_folio_trace_not_under_wback, "!wback") \ EM(netfs_folio_trace_read_gaps, "read-gaps") \ EM(netfs_folio_trace_redirty, "redirty") \ EM(netfs_folio_trace_redirtied, "redirtied") \ EM(netfs_folio_trace_store, "store") \ + EM(netfs_folio_trace_store_copy, "store-copy") \ EM(netfs_folio_trace_store_plus, "store+") \ EM(netfs_folio_trace_wthru, "wthru") \ E_(netfs_folio_trace_wthru_plus, "wthru+") +#define netfs_collect_contig_traces \ + EM(netfs_contig_trace_collect, "Collect") \ + EM(netfs_contig_trace_jump, "-->JUMP-->") \ + E_(netfs_contig_trace_unlock, "Unlock") + #ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY #define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY @@ -159,6 +185,7 @@ enum netfs_failure { netfs_failures } __mode(byte); enum netfs_rreq_ref_trace { netfs_rreq_ref_traces } __mode(byte); enum netfs_sreq_ref_trace { netfs_sreq_ref_traces } __mode(byte); enum netfs_folio_trace { netfs_folio_traces } __mode(byte); +enum netfs_collect_contig_trace { netfs_collect_contig_traces } __mode(byte); #endif @@ -180,6 +207,7 @@ netfs_failures; netfs_rreq_ref_traces; netfs_sreq_ref_traces; netfs_folio_traces; +netfs_collect_contig_traces; /* * Now redefine the EM() and E_() macros to map the enums to the strings that @@ -413,16 +441,18 @@ TRACE_EVENT(netfs_write_iter, __field(unsigned long long, start ) __field(size_t, len ) __field(unsigned int, flags ) + __field(unsigned int, ino ) ), TP_fast_assign( __entry->start = iocb->ki_pos; __entry->len = iov_iter_count(from); + __entry->ino = iocb->ki_filp->f_inode->i_ino; __entry->flags = iocb->ki_flags; ), - TP_printk("WRITE-ITER s=%llx l=%zx f=%x", - __entry->start, __entry->len, __entry->flags) + TP_printk("WRITE-ITER i=%x s=%llx l=%zx f=%x", + __entry->ino, __entry->start, __entry->len, __entry->flags) ); TRACE_EVENT(netfs_write, @@ -434,6 +464,7 @@ TRACE_EVENT(netfs_write, TP_STRUCT__entry( __field(unsigned int, wreq ) __field(unsigned int, cookie ) + __field(unsigned int, ino ) __field(enum netfs_write_trace, what ) __field(unsigned long long, start ) __field(unsigned long long, len ) @@ -444,18 +475,213 @@ TRACE_EVENT(netfs_write, struct fscache_cookie *__cookie = netfs_i_cookie(__ctx); __entry->wreq = wreq->debug_id; __entry->cookie = __cookie ? __cookie->debug_id : 0; + __entry->ino = wreq->inode->i_ino; __entry->what = what; __entry->start = wreq->start; __entry->len = wreq->len; ), - TP_printk("R=%08x %s c=%08x by=%llx-%llx", + TP_printk("R=%08x %s c=%08x i=%x by=%llx-%llx", __entry->wreq, __print_symbolic(__entry->what, netfs_write_traces), __entry->cookie, + __entry->ino, __entry->start, __entry->start + __entry->len - 1) ); +TRACE_EVENT(netfs_collect, + TP_PROTO(const struct netfs_io_request *wreq), + + TP_ARGS(wreq), + + TP_STRUCT__entry( + __field(unsigned int, wreq ) + __field(unsigned int, len ) + __field(unsigned long long, transferred ) + __field(unsigned long long, start ) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->start = wreq->start; + __entry->len = wreq->len; + __entry->transferred = wreq->transferred; + ), + + TP_printk("R=%08x s=%llx-%llx", + __entry->wreq, + __entry->start + __entry->transferred, + __entry->start + __entry->len) + ); + +TRACE_EVENT(netfs_collect_contig, + TP_PROTO(const struct netfs_io_request *wreq, unsigned long long to, + enum netfs_collect_contig_trace type), + + TP_ARGS(wreq, to, type), + + TP_STRUCT__entry( + __field(unsigned int, wreq) + __field(enum netfs_collect_contig_trace, type) + __field(unsigned long long, contiguity) + __field(unsigned long long, to) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->type = type; + __entry->contiguity = wreq->contiguity; + __entry->to = to; + ), + + TP_printk("R=%08x %llx -> %llx %s", + __entry->wreq, + __entry->contiguity, + __entry->to, + __print_symbolic(__entry->type, netfs_collect_contig_traces)) + ); + +TRACE_EVENT(netfs_collect_sreq, + TP_PROTO(const struct netfs_io_request *wreq, + const struct netfs_io_subrequest *subreq), + + TP_ARGS(wreq, subreq), + + TP_STRUCT__entry( + __field(unsigned int, wreq ) + __field(unsigned int, subreq ) + __field(unsigned int, stream ) + __field(unsigned int, len ) + __field(unsigned int, transferred ) + __field(unsigned long long, start ) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->subreq = subreq->debug_index; + __entry->stream = subreq->stream_nr; + __entry->start = subreq->start; + __entry->len = subreq->len; + __entry->transferred = subreq->transferred; + ), + + TP_printk("R=%08x[%u:%02x] s=%llx t=%x/%x", + __entry->wreq, __entry->stream, __entry->subreq, + __entry->start, __entry->transferred, __entry->len) + ); + +TRACE_EVENT(netfs_collect_folio, + TP_PROTO(const struct netfs_io_request *wreq, + const struct folio *folio, + unsigned long long fend, + unsigned long long collected_to), + + TP_ARGS(wreq, folio, fend, collected_to), + + TP_STRUCT__entry( + __field(unsigned int, wreq ) + __field(unsigned long, index ) + __field(unsigned long long, fend ) + __field(unsigned long long, cleaned_to ) + __field(unsigned long long, collected_to ) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->index = folio->index; + __entry->fend = fend; + __entry->cleaned_to = wreq->cleaned_to; + __entry->collected_to = collected_to; + ), + + TP_printk("R=%08x ix=%05lx r=%llx-%llx t=%llx/%llx", + __entry->wreq, __entry->index, + (unsigned long long)__entry->index * PAGE_SIZE, __entry->fend, + __entry->cleaned_to, __entry->collected_to) + ); + +TRACE_EVENT(netfs_collect_state, + TP_PROTO(const struct netfs_io_request *wreq, + unsigned long long collected_to, + unsigned int notes), + + TP_ARGS(wreq, collected_to, notes), + + TP_STRUCT__entry( + __field(unsigned int, wreq ) + __field(unsigned int, notes ) + __field(unsigned long long, collected_to ) + __field(unsigned long long, cleaned_to ) + __field(unsigned long long, contiguity ) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->notes = notes; + __entry->collected_to = collected_to; + __entry->cleaned_to = wreq->cleaned_to; + __entry->contiguity = wreq->contiguity; + ), + + TP_printk("R=%08x cto=%llx fto=%llx ctg=%llx n=%x", + __entry->wreq, __entry->collected_to, + __entry->cleaned_to, __entry->contiguity, + __entry->notes) + ); + +TRACE_EVENT(netfs_collect_gap, + TP_PROTO(const struct netfs_io_request *wreq, + const struct netfs_io_stream *stream, + unsigned long long jump_to, char type), + + TP_ARGS(wreq, stream, jump_to, type), + + TP_STRUCT__entry( + __field(unsigned int, wreq) + __field(unsigned char, stream) + __field(unsigned char, type) + __field(unsigned long long, from) + __field(unsigned long long, to) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->stream = stream->stream_nr; + __entry->from = stream->collected_to; + __entry->to = jump_to; + __entry->type = type; + ), + + TP_printk("R=%08x[%x:] %llx->%llx %c", + __entry->wreq, __entry->stream, + __entry->from, __entry->to, __entry->type) + ); + +TRACE_EVENT(netfs_collect_stream, + TP_PROTO(const struct netfs_io_request *wreq, + const struct netfs_io_stream *stream), + + TP_ARGS(wreq, stream), + + TP_STRUCT__entry( + __field(unsigned int, wreq) + __field(unsigned char, stream) + __field(unsigned long long, collected_to) + __field(unsigned long long, front) + ), + + TP_fast_assign( + __entry->wreq = wreq->debug_id; + __entry->stream = stream->stream_nr; + __entry->collected_to = stream->collected_to; + __entry->front = stream->front ? stream->front->start : UINT_MAX; + ), + + TP_printk("R=%08x[%x:] cto=%llx frn=%llx", + __entry->wreq, __entry->stream, + __entry->collected_to, __entry->front) + ); + #undef EM #undef E_ #endif /* _TRACE_NETFS_H */
Fix the error return in netfs_perform_write() acting in writethrough-mode to return any cached error in the case that netfs_end_writethrough() returns 0. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/buffered_write.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 8e4a3fb287e3..db4ad158948b 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -188,7 +188,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, enum netfs_how_to_modify howto; enum netfs_folio_trace trace; unsigned int bdp_flags = (iocb->ki_flags & IOCB_SYNC) ? 0: BDP_ASYNC; - ssize_t written = 0, ret; + ssize_t written = 0, ret, ret2; loff_t i_size, pos = iocb->ki_pos, from, to; size_t max_chunk = PAGE_SIZE << MAX_PAGECACHE_ORDER; bool maybe_trouble = false; @@ -409,10 +409,12 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, out: if (unlikely(wreq)) { - ret = netfs_end_writethrough(wreq, iocb); + ret2 = netfs_end_writethrough(wreq, iocb); wbc_detach_inode(&wbc); - if (ret == -EIOCBQUEUED) - return ret; + if (ret2 == -EIOCBQUEUED) + return ret2; + if (ret == 0) + ret = ret2; } iocb->ki_pos += written;
Add some write-side stats to count buffered writes, buffered writethrough, and writepages calls. Whilst we're at it, clean up the naming on some of the existing stats counters and organise the output into two sets. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/buffered_read.c | 2 +- fs/netfs/buffered_write.c | 3 +++ fs/netfs/direct_write.c | 2 +- fs/netfs/internal.h | 7 +++++-- fs/netfs/stats.c | 17 ++++++++++++----- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c index 47603f08680e..a6bb03bea920 100644 --- a/fs/netfs/buffered_read.c +++ b/fs/netfs/buffered_read.c @@ -282,7 +282,7 @@ int netfs_read_folio(struct file *file, struct folio *folio) if (ret == -ENOMEM || ret == -EINTR || ret == -ERESTARTSYS) goto discard; - netfs_stat(&netfs_n_rh_readpage); + netfs_stat(&netfs_n_rh_read_folio); trace_netfs_read(rreq, rreq->start, rreq->len, netfs_read_trace_readpage); /* Set up the output buffer */ diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index db4ad158948b..244d67a43972 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -215,6 +215,9 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, if (!is_sync_kiocb(iocb)) wreq->iocb = iocb; wreq->cleanup = netfs_cleanup_buffered_write; + netfs_stat(&netfs_n_wh_writethrough); + } else { + netfs_stat(&netfs_n_wh_buffered_write); } do { diff --git a/fs/netfs/direct_write.c b/fs/netfs/direct_write.c index bee047e20f5d..37c91188107b 100644 --- a/fs/netfs/direct_write.c +++ b/fs/netfs/direct_write.c @@ -143,7 +143,7 @@ ssize_t netfs_unbuffered_write_iter(struct kiocb *iocb, struct iov_iter *from) return 0; trace_netfs_write_iter(iocb, from); - netfs_stat(&netfs_n_rh_dio_write); + netfs_stat(&netfs_n_wh_dio_write); ret = netfs_start_io_direct(inode); if (ret < 0) diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h index c67da478cd2b..58289cc65e25 100644 --- a/fs/netfs/internal.h +++ b/fs/netfs/internal.h @@ -106,9 +106,8 @@ int netfs_end_writethrough(struct netfs_io_request *wreq, struct kiocb *iocb); */ #ifdef CONFIG_NETFS_STATS extern atomic_t netfs_n_rh_dio_read; -extern atomic_t netfs_n_rh_dio_write; extern atomic_t netfs_n_rh_readahead; -extern atomic_t netfs_n_rh_readpage; +extern atomic_t netfs_n_rh_read_folio; extern atomic_t netfs_n_rh_rreq; extern atomic_t netfs_n_rh_sreq; extern atomic_t netfs_n_rh_download; @@ -125,6 +124,10 @@ extern atomic_t netfs_n_rh_write_begin; extern atomic_t netfs_n_rh_write_done; extern atomic_t netfs_n_rh_write_failed; extern atomic_t netfs_n_rh_write_zskip; +extern atomic_t netfs_n_wh_buffered_write; +extern atomic_t netfs_n_wh_writethrough; +extern atomic_t netfs_n_wh_dio_write; +extern atomic_t netfs_n_wh_writepages; extern atomic_t netfs_n_wh_wstream_conflict; extern atomic_t netfs_n_wh_upload; extern atomic_t netfs_n_wh_upload_done; diff --git a/fs/netfs/stats.c b/fs/netfs/stats.c index deeba9f9dcf5..0892768eea32 100644 --- a/fs/netfs/stats.c +++ b/fs/netfs/stats.c @@ -10,9 +10,8 @@ #include "internal.h" atomic_t netfs_n_rh_dio_read; -atomic_t netfs_n_rh_dio_write; atomic_t netfs_n_rh_readahead; -atomic_t netfs_n_rh_readpage; +atomic_t netfs_n_rh_read_folio; atomic_t netfs_n_rh_rreq; atomic_t netfs_n_rh_sreq; atomic_t netfs_n_rh_download; @@ -29,6 +28,10 @@ atomic_t netfs_n_rh_write_begin; atomic_t netfs_n_rh_write_done; atomic_t netfs_n_rh_write_failed; atomic_t netfs_n_rh_write_zskip; +atomic_t netfs_n_wh_buffered_write; +atomic_t netfs_n_wh_writethrough; +atomic_t netfs_n_wh_dio_write; +atomic_t netfs_n_wh_writepages; atomic_t netfs_n_wh_wstream_conflict; atomic_t netfs_n_wh_upload; atomic_t netfs_n_wh_upload_done; @@ -39,13 +42,17 @@ atomic_t netfs_n_wh_write_failed; int netfs_stats_show(struct seq_file *m, void *v) { - seq_printf(m, "Netfs : DR=%u DW=%u RA=%u RP=%u WB=%u WBZ=%u\n", + seq_printf(m, "Netfs : DR=%u RA=%u RF=%u WB=%u WBZ=%u\n", atomic_read(&netfs_n_rh_dio_read), - atomic_read(&netfs_n_rh_dio_write), atomic_read(&netfs_n_rh_readahead), - atomic_read(&netfs_n_rh_readpage), + atomic_read(&netfs_n_rh_read_folio), atomic_read(&netfs_n_rh_write_begin), atomic_read(&netfs_n_rh_write_zskip)); + seq_printf(m, "Netfs : BW=%u WT=%u DW=%u WP=%u\n", + atomic_read(&netfs_n_wh_buffered_write), + atomic_read(&netfs_n_wh_writethrough), + atomic_read(&netfs_n_wh_dio_write), + atomic_read(&netfs_n_wh_writepages)); seq_printf(m, "Netfs : ZR=%u sh=%u sk=%u\n", atomic_read(&netfs_n_rh_zero), atomic_read(&netfs_n_rh_short_read),
Switch to using unsigned long long rather than loff_t in netfslib to avoid problems with the sign flipping in the maths when we're dealing with the byte at position 0x7fffffffffffffff. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Ilya Dryomov <idryomov@gmail.com> cc: Xiubo Li <xiubli@redhat.com> cc: netfs@lists.linux.dev cc: ceph-devel@vger.kernel.org cc: linux-fsdevel@vger.kernel.org --- fs/cachefiles/io.c | 2 +- fs/ceph/addr.c | 2 +- fs/netfs/buffered_read.c | 4 +++- fs/netfs/buffered_write.c | 2 +- fs/netfs/io.c | 6 +++--- fs/netfs/main.c | 2 +- fs/netfs/output.c | 4 ++-- include/linux/netfs.h | 16 +++++++++------- include/trace/events/netfs.h | 6 +++--- 9 files changed, 24 insertions(+), 20 deletions(-) diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c index 1d685357e67f..5ba5c7814fe4 100644 --- a/fs/cachefiles/io.c +++ b/fs/cachefiles/io.c @@ -493,7 +493,7 @@ cachefiles_do_prepare_read(struct netfs_cache_resources *cres, * boundary as appropriate. */ static enum netfs_io_source cachefiles_prepare_read(struct netfs_io_subrequest *subreq, - loff_t i_size) + unsigned long long i_size) { return cachefiles_do_prepare_read(&subreq->rreq->cache_resources, subreq->start, &subreq->len, i_size, diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 2d0f13537c85..3bd58eaea231 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -193,7 +193,7 @@ static void ceph_netfs_expand_readahead(struct netfs_io_request *rreq) * block, but do not exceed the file size, unless the original * request already exceeds it. */ - new_end = min(round_up(end, lo->stripe_unit), rreq->i_size); + new_end = umin(round_up(end, lo->stripe_unit), rreq->i_size); if (new_end > end && new_end <= rreq->start + max_len) rreq->len = new_end - rreq->start; diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c index 1622cce535a3..47603f08680e 100644 --- a/fs/netfs/buffered_read.c +++ b/fs/netfs/buffered_read.c @@ -130,7 +130,9 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) } static void netfs_cache_expand_readahead(struct netfs_io_request *rreq, - loff_t *_start, size_t *_len, loff_t i_size) + unsigned long long *_start, + unsigned long long *_len, + unsigned long long i_size) { struct netfs_cache_resources *cres = &rreq->cache_resources; diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 624d8859c2fa..8e4a3fb287e3 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -663,7 +663,7 @@ static void netfs_pages_written_back(struct netfs_io_request *wreq) last = (wreq->start + wreq->len - 1) / PAGE_SIZE; xas_for_each(&xas, folio, last) { WARN(!folio_test_writeback(folio), - "bad %zx @%llx page %lx %lx\n", + "bad %llx @%llx page %lx %lx\n", wreq->len, wreq->start, folio->index, last); if ((finfo = netfs_folio_info(folio))) { diff --git a/fs/netfs/io.c b/fs/netfs/io.c index 8de581ac0cfb..6cfecfcd02e1 100644 --- a/fs/netfs/io.c +++ b/fs/netfs/io.c @@ -476,7 +476,7 @@ netfs_rreq_prepare_read(struct netfs_io_request *rreq, set: if (subreq->len > rreq->len) - pr_warn("R=%08x[%u] SREQ>RREQ %zx > %zx\n", + pr_warn("R=%08x[%u] SREQ>RREQ %zx > %llx\n", rreq->debug_id, subreq->debug_index, subreq->len, rreq->len); @@ -513,7 +513,7 @@ static bool netfs_rreq_submit_slice(struct netfs_io_request *rreq, subreq->start = rreq->start + rreq->submitted; subreq->len = io_iter->count; - _debug("slice %llx,%zx,%zx", subreq->start, subreq->len, rreq->submitted); + _debug("slice %llx,%zx,%llx", subreq->start, subreq->len, rreq->submitted); list_add_tail(&subreq->rreq_link, &rreq->subrequests); /* Call out to the cache to find out what it can do with the remaining @@ -588,7 +588,7 @@ int netfs_begin_read(struct netfs_io_request *rreq, bool sync) atomic_set(&rreq->nr_outstanding, 1); io_iter = rreq->io_iter; do { - _debug("submit %llx + %zx >= %llx", + _debug("submit %llx + %llx >= %llx", rreq->start, rreq->submitted, rreq->i_size); if (rreq->origin == NETFS_DIO_READ && rreq->start + rreq->submitted >= rreq->i_size) diff --git a/fs/netfs/main.c b/fs/netfs/main.c index 4805b9377364..5f0f438e5d21 100644 --- a/fs/netfs/main.c +++ b/fs/netfs/main.c @@ -62,7 +62,7 @@ static int netfs_requests_seq_show(struct seq_file *m, void *v) rreq = list_entry(v, struct netfs_io_request, proc_link); seq_printf(m, - "%08x %s %3d %2lx %4d %3d @%04llx %zx/%zx", + "%08x %s %3d %2lx %4d %3d @%04llx %llx/%llx", rreq->debug_id, netfs_origins[rreq->origin], refcount_read(&rreq->ref), diff --git a/fs/netfs/output.c b/fs/netfs/output.c index e586396d6b72..85374322f10f 100644 --- a/fs/netfs/output.c +++ b/fs/netfs/output.c @@ -439,7 +439,7 @@ static void netfs_submit_writethrough(struct netfs_io_request *wreq, bool final) */ int netfs_advance_writethrough(struct netfs_io_request *wreq, size_t copied, bool to_page_end) { - _enter("ic=%zu sb=%zu ws=%u cp=%zu tp=%u", + _enter("ic=%zu sb=%llu ws=%u cp=%zu tp=%u", wreq->iter.count, wreq->submitted, wreq->wsize, copied, to_page_end); wreq->iter.count += copied; @@ -457,7 +457,7 @@ int netfs_end_writethrough(struct netfs_io_request *wreq, struct kiocb *iocb) { int ret = -EIOCBQUEUED; - _enter("ic=%zu sb=%zu ws=%u", + _enter("ic=%zu sb=%llu ws=%u", wreq->iter.count, wreq->submitted, wreq->wsize); if (wreq->submitted < wreq->io_iter.count) diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 0b6c2c2d3c23..88269681d4fc 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -149,7 +149,7 @@ struct netfs_io_subrequest { struct work_struct work; struct list_head rreq_link; /* Link in rreq->subrequests */ struct iov_iter io_iter; /* Iterator for this subrequest */ - loff_t start; /* Where to start the I/O */ + unsigned long long start; /* Where to start the I/O */ size_t len; /* Size of the I/O */ size_t transferred; /* Amount of data transferred */ refcount_t ref; @@ -205,15 +205,15 @@ struct netfs_io_request { atomic_t subreq_counter; /* Next subreq->debug_index */ atomic_t nr_outstanding; /* Number of ops in progress */ atomic_t nr_copy_ops; /* Number of copy-to-cache ops in progress */ - size_t submitted; /* Amount submitted for I/O so far */ - size_t len; /* Length of the request */ size_t upper_len; /* Length can be extended to here */ + unsigned long long submitted; /* Amount submitted for I/O so far */ + unsigned long long len; /* Length of the request */ size_t transferred; /* Amount to be indicated as transferred */ short error; /* 0 or error that occurred */ enum netfs_io_origin origin; /* Origin of the request */ bool direct_bv_unpin; /* T if direct_bv[] must be unpinned */ - loff_t i_size; /* Size of the file */ - loff_t start; /* Start position */ + unsigned long long i_size; /* Size of the file */ + unsigned long long start; /* Start position */ pgoff_t no_unlock_folio; /* Don't unlock this folio after read */ refcount_t ref; unsigned long flags; @@ -294,13 +294,15 @@ struct netfs_cache_ops { /* Expand readahead request */ void (*expand_readahead)(struct netfs_cache_resources *cres, - loff_t *_start, size_t *_len, loff_t i_size); + unsigned long long *_start, + unsigned long long *_len, + unsigned long long i_size); /* Prepare a read operation, shortening it to a cached/uncached * boundary as appropriate. */ enum netfs_io_source (*prepare_read)(struct netfs_io_subrequest *subreq, - loff_t i_size); + unsigned long long i_size); /* Prepare a write operation, working out what part of the write we can * actually do. diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index 30769103638f..7126d2ea459c 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -280,7 +280,7 @@ TRACE_EVENT(netfs_sreq, __entry->start = sreq->start; ), - TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx/%zx e=%d", + TP_printk("R=%08x[%x] %s %s f=%02x s=%llx %zx/%zx e=%d", __entry->rreq, __entry->index, __print_symbolic(__entry->source, netfs_sreq_sources), __print_symbolic(__entry->what, netfs_sreq_traces), @@ -320,7 +320,7 @@ TRACE_EVENT(netfs_failure, __entry->start = sreq ? sreq->start : 0; ), - TP_printk("R=%08x[%d] %s f=%02x s=%llx %zx/%zx %s e=%d", + TP_printk("R=%08x[%x] %s f=%02x s=%llx %zx/%zx %s e=%d", __entry->rreq, __entry->index, __print_symbolic(__entry->source, netfs_sreq_sources), __entry->flags, @@ -436,7 +436,7 @@ TRACE_EVENT(netfs_write, __field(unsigned int, cookie ) __field(enum netfs_write_trace, what ) __field(unsigned long long, start ) - __field(size_t, len ) + __field(unsigned long long, len ) ), TP_fast_assign(
Fix the error return in netfs_perform_write() acting in writethrough-mode to return any cached error in the case that netfs_end_writethrough() returns 0. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/buffered_write.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 8e4a3fb287e3..db4ad158948b 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -188,7 +188,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, enum netfs_how_to_modify howto; enum netfs_folio_trace trace; unsigned int bdp_flags = (iocb->ki_flags & IOCB_SYNC) ? 0: BDP_ASYNC; - ssize_t written = 0, ret; + ssize_t written = 0, ret, ret2; loff_t i_size, pos = iocb->ki_pos, from, to; size_t max_chunk = PAGE_SIZE << MAX_PAGECACHE_ORDER; bool maybe_trouble = false; @@ -409,10 +409,12 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, out: if (unlikely(wreq)) { - ret = netfs_end_writethrough(wreq, iocb); + ret2 = netfs_end_writethrough(wreq, iocb); wbc_detach_inode(&wbc); - if (ret == -EIOCBQUEUED) - return ret; + if (ret2 == -EIOCBQUEUED) + return ret2; + if (ret == 0) + ret = ret2; } iocb->ki_pos += written;
Switch to using unsigned long long rather than loff_t in netfslib to avoid problems with the sign flipping in the maths when we're dealing with the byte at position 0x7fffffffffffffff. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Ilya Dryomov <idryomov@gmail.com> cc: Xiubo Li <xiubli@redhat.com> cc: netfs@lists.linux.dev cc: ceph-devel@vger.kernel.org cc: linux-fsdevel@vger.kernel.org --- fs/cachefiles/io.c | 2 +- fs/ceph/addr.c | 2 +- fs/netfs/buffered_read.c | 4 +++- fs/netfs/buffered_write.c | 2 +- fs/netfs/io.c | 6 +++--- fs/netfs/main.c | 2 +- fs/netfs/output.c | 4 ++-- include/linux/netfs.h | 16 +++++++++------- include/trace/events/netfs.h | 6 +++--- 9 files changed, 24 insertions(+), 20 deletions(-) diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c index 1d685357e67f..5ba5c7814fe4 100644 --- a/fs/cachefiles/io.c +++ b/fs/cachefiles/io.c @@ -493,7 +493,7 @@ cachefiles_do_prepare_read(struct netfs_cache_resources *cres, * boundary as appropriate. */ static enum netfs_io_source cachefiles_prepare_read(struct netfs_io_subrequest *subreq, - loff_t i_size) + unsigned long long i_size) { return cachefiles_do_prepare_read(&subreq->rreq->cache_resources, subreq->start, &subreq->len, i_size, diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 2d0f13537c85..3bd58eaea231 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -193,7 +193,7 @@ static void ceph_netfs_expand_readahead(struct netfs_io_request *rreq) * block, but do not exceed the file size, unless the original * request already exceeds it. */ - new_end = min(round_up(end, lo->stripe_unit), rreq->i_size); + new_end = umin(round_up(end, lo->stripe_unit), rreq->i_size); if (new_end > end && new_end <= rreq->start + max_len) rreq->len = new_end - rreq->start; diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c index 1622cce535a3..47603f08680e 100644 --- a/fs/netfs/buffered_read.c +++ b/fs/netfs/buffered_read.c @@ -130,7 +130,9 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) } static void netfs_cache_expand_readahead(struct netfs_io_request *rreq, - loff_t *_start, size_t *_len, loff_t i_size) + unsigned long long *_start, + unsigned long long *_len, + unsigned long long i_size) { struct netfs_cache_resources *cres = &rreq->cache_resources; diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 624d8859c2fa..8e4a3fb287e3 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -663,7 +663,7 @@ static void netfs_pages_written_back(struct netfs_io_request *wreq) last = (wreq->start + wreq->len - 1) / PAGE_SIZE; xas_for_each(&xas, folio, last) { WARN(!folio_test_writeback(folio), - "bad %zx @%llx page %lx %lx\n", + "bad %llx @%llx page %lx %lx\n", wreq->len, wreq->start, folio->index, last); if ((finfo = netfs_folio_info(folio))) { diff --git a/fs/netfs/io.c b/fs/netfs/io.c index 8de581ac0cfb..6cfecfcd02e1 100644 --- a/fs/netfs/io.c +++ b/fs/netfs/io.c @@ -476,7 +476,7 @@ netfs_rreq_prepare_read(struct netfs_io_request *rreq, set: if (subreq->len > rreq->len) - pr_warn("R=%08x[%u] SREQ>RREQ %zx > %zx\n", + pr_warn("R=%08x[%u] SREQ>RREQ %zx > %llx\n", rreq->debug_id, subreq->debug_index, subreq->len, rreq->len); @@ -513,7 +513,7 @@ static bool netfs_rreq_submit_slice(struct netfs_io_request *rreq, subreq->start = rreq->start + rreq->submitted; subreq->len = io_iter->count; - _debug("slice %llx,%zx,%zx", subreq->start, subreq->len, rreq->submitted); + _debug("slice %llx,%zx,%llx", subreq->start, subreq->len, rreq->submitted); list_add_tail(&subreq->rreq_link, &rreq->subrequests); /* Call out to the cache to find out what it can do with the remaining @@ -588,7 +588,7 @@ int netfs_begin_read(struct netfs_io_request *rreq, bool sync) atomic_set(&rreq->nr_outstanding, 1); io_iter = rreq->io_iter; do { - _debug("submit %llx + %zx >= %llx", + _debug("submit %llx + %llx >= %llx", rreq->start, rreq->submitted, rreq->i_size); if (rreq->origin == NETFS_DIO_READ && rreq->start + rreq->submitted >= rreq->i_size) diff --git a/fs/netfs/main.c b/fs/netfs/main.c index 4805b9377364..5f0f438e5d21 100644 --- a/fs/netfs/main.c +++ b/fs/netfs/main.c @@ -62,7 +62,7 @@ static int netfs_requests_seq_show(struct seq_file *m, void *v) rreq = list_entry(v, struct netfs_io_request, proc_link); seq_printf(m, - "%08x %s %3d %2lx %4d %3d @%04llx %zx/%zx", + "%08x %s %3d %2lx %4d %3d @%04llx %llx/%llx", rreq->debug_id, netfs_origins[rreq->origin], refcount_read(&rreq->ref), diff --git a/fs/netfs/output.c b/fs/netfs/output.c index e586396d6b72..85374322f10f 100644 --- a/fs/netfs/output.c +++ b/fs/netfs/output.c @@ -439,7 +439,7 @@ static void netfs_submit_writethrough(struct netfs_io_request *wreq, bool final) */ int netfs_advance_writethrough(struct netfs_io_request *wreq, size_t copied, bool to_page_end) { - _enter("ic=%zu sb=%zu ws=%u cp=%zu tp=%u", + _enter("ic=%zu sb=%llu ws=%u cp=%zu tp=%u", wreq->iter.count, wreq->submitted, wreq->wsize, copied, to_page_end); wreq->iter.count += copied; @@ -457,7 +457,7 @@ int netfs_end_writethrough(struct netfs_io_request *wreq, struct kiocb *iocb) { int ret = -EIOCBQUEUED; - _enter("ic=%zu sb=%zu ws=%u", + _enter("ic=%zu sb=%llu ws=%u", wreq->iter.count, wreq->submitted, wreq->wsize); if (wreq->submitted < wreq->io_iter.count) diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 0b6c2c2d3c23..88269681d4fc 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -149,7 +149,7 @@ struct netfs_io_subrequest { struct work_struct work; struct list_head rreq_link; /* Link in rreq->subrequests */ struct iov_iter io_iter; /* Iterator for this subrequest */ - loff_t start; /* Where to start the I/O */ + unsigned long long start; /* Where to start the I/O */ size_t len; /* Size of the I/O */ size_t transferred; /* Amount of data transferred */ refcount_t ref; @@ -205,15 +205,15 @@ struct netfs_io_request { atomic_t subreq_counter; /* Next subreq->debug_index */ atomic_t nr_outstanding; /* Number of ops in progress */ atomic_t nr_copy_ops; /* Number of copy-to-cache ops in progress */ - size_t submitted; /* Amount submitted for I/O so far */ - size_t len; /* Length of the request */ size_t upper_len; /* Length can be extended to here */ + unsigned long long submitted; /* Amount submitted for I/O so far */ + unsigned long long len; /* Length of the request */ size_t transferred; /* Amount to be indicated as transferred */ short error; /* 0 or error that occurred */ enum netfs_io_origin origin; /* Origin of the request */ bool direct_bv_unpin; /* T if direct_bv[] must be unpinned */ - loff_t i_size; /* Size of the file */ - loff_t start; /* Start position */ + unsigned long long i_size; /* Size of the file */ + unsigned long long start; /* Start position */ pgoff_t no_unlock_folio; /* Don't unlock this folio after read */ refcount_t ref; unsigned long flags; @@ -294,13 +294,15 @@ struct netfs_cache_ops { /* Expand readahead request */ void (*expand_readahead)(struct netfs_cache_resources *cres, - loff_t *_start, size_t *_len, loff_t i_size); + unsigned long long *_start, + unsigned long long *_len, + unsigned long long i_size); /* Prepare a read operation, shortening it to a cached/uncached * boundary as appropriate. */ enum netfs_io_source (*prepare_read)(struct netfs_io_subrequest *subreq, - loff_t i_size); + unsigned long long i_size); /* Prepare a write operation, working out what part of the write we can * actually do. diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index 30769103638f..7126d2ea459c 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -280,7 +280,7 @@ TRACE_EVENT(netfs_sreq, __entry->start = sreq->start; ), - TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx/%zx e=%d", + TP_printk("R=%08x[%x] %s %s f=%02x s=%llx %zx/%zx e=%d", __entry->rreq, __entry->index, __print_symbolic(__entry->source, netfs_sreq_sources), __print_symbolic(__entry->what, netfs_sreq_traces), @@ -320,7 +320,7 @@ TRACE_EVENT(netfs_failure, __entry->start = sreq ? sreq->start : 0; ), - TP_printk("R=%08x[%d] %s f=%02x s=%llx %zx/%zx %s e=%d", + TP_printk("R=%08x[%x] %s f=%02x s=%llx %zx/%zx %s e=%d", __entry->rreq, __entry->index, __print_symbolic(__entry->source, netfs_sreq_sources), __entry->flags, @@ -436,7 +436,7 @@ TRACE_EVENT(netfs_write, __field(unsigned int, cookie ) __field(enum netfs_write_trace, what ) __field(unsigned long long, start ) - __field(size_t, len ) + __field(unsigned long long, len ) ), TP_fast_assign(
Q1: Where are all the other parts of this series. I only got 1-3. A1: There are ~2700 subscribers to LKML. I want to get some feedback on the approach and naming etc. before spamming everyone with a 74 patch series. Q2: Can I get the other parts? A2: Sure. I posted them to patches@lists.linux.dev so you can get them with: $ b4 am 20240328090459.242500-tony.luck@intel.com or get from kernel.org with: $ git fetch git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git new_families Q3: When are CPUs using new families coming? A3: Soon-ish. We have some time to get the infrastructure right. Intel has been using family 6 almost exclusively for many years. As a result, Linux has built up infrastructure like X86_MATCH_INTEL_FAM6_MODEL() to make it easy for model specific code to use the #defines for each Intel CPU model. But the reign of family 6 is about to end. Intel will begin using non-zero values for the extended family field in CPUID(1).EAX. The minimal patch size approach to handle these would be to clone the FAM6 macros. But that will get messy as these prolifrate. This approach does not have an elegant solution if a switch() statement needs to choose between CPUs from different families. Dave Hansen suggested that a more general cleanup that provides CPU #defines that encode all of <vendor, family, model> would make existing code better, and provide infrastructure that makes it trivial to incorporate new families. Big picture view is that code like this: if (c->x86_vendor == X86_VENDOR_INTEL && c->x86 == 6 && c->x86_model == INTEL_FAM6_ICELAKE_X) can become: if (c->x86_vfm == INTEL_ICELAKE_X) which is: a) Simpler b) Faster c) More resilient (can't forget to check vendor & family along with model) d) Code style doesn't change for every new family. Note that "struct cpuinfo_x86" gains a new xf6_vfm field and the ICELAKE #define loses the "FAM6_" substring and will be initialized with a macro that does the bit shuffling to fit X86_VENDOR_INTEL and a family and model into a "u32": #define INTEL_ICELAKE_X IFM(6, 0x6A) /* Sunny Cove */ New CPUs in other families might look like: #define INTEL_DOUGLASCOVE IFM(42, 0x01) /* Adams Lake */ #define INTEL_SHELDONMONT IFM(73, 0x01) /* Cooper Forest */ Model specific "if" statements then follow the same pattern regardless of family: if (c->x86_vfm == INTEL_DOUGLASCOVE || c->x86_vfm == INTEL_SHELDONMONT) { } If needed these could even appear in the same switch statement: switch (c->x86_vfm) { case INTEL_ICELAKE_X: ... case INTEL_DOUGLASCOVE: ... case INTEL_SHELDONMONT: ... } The existing X86_MATCH_INTEL_FAM6_MODEL() can be replaced with a new X86_MATCH_VFM() macro. Update can happen in three phases: 1) Add infrastructure macros, new "x86_vfm" field, new CPU #defines 2) Treewide update from old to new (around 70 files at current count) 3) Delete the old INTEL_FAM6 and X86_MATCH_INTEL_FAM6 macros Tony Luck (74): x86/cpu/vfm: Add/initialize x86_vfm field to struct cpuinfo_x86 x86/cpu/vfm: Add new macros to work with (vendor/family/model) values x86/cpu/vfm: Update arch/x86/include/asm/intel-family.h x86/cpu/vfm: Update arch/x86/crypto/poly1305_glue.c x86/cpu/vfm: Update arch/x86/crypto/twofish_glue_3way.c x86/cpu/vfm: Update arch/x86/events/intel/cstate.c x86/cpu/vfm: Update arch/x86/events/intel/lbr.c x86/cpu/vfm: Update arch/x86/events/intel/pt.c x86/cpu/vfm: Update arch/x86/events/intel/uncore.c x86/cpu/vfm: Update arch/x86/events/intel/uncore_nhmex.c x86/cpu/vfm: Update arch/x86/events/intel/uncore_snbep.c x86/cpu/vfm: Update arch/x86/events/msr.c x86/cpu/vfm: Update arch/x86/events/rapl.c x86/cpu/vfm: Update arch/x86/kernel/apic/apic.c x86/cpu/vfm: Update arch/x86/kernel/cpu/aperfmperf.c x86/cpu/vfm: Update arch/x86/kernel/cpu/bugs.c x86/cpu/vfm: Update arch/x86/kernel/cpu/common.c x86/cpu/vfm: Update arch/x86/kernel/cpu/intel.c x86/cpu/vfm: Update arch/x86/kernel/cpu/intel_epb.c x86/cpu/vfm: Update arch/x86/kernel/cpu/match.c x86/cpu/vfm: Update arch/x86/kernel/cpu/mce/core.c x86/cpu/vfm: Update arch/x86/kernel/cpu/mce/intel.c x86/cpu/vfm: Update arch/x86/kernel/cpu/mce/severity.c x86/cpu/vfm: Update arch/x86/kernel/cpu/microcode/intel.c x86/cpu/vfm: Update arch/x86/kernel/cpu/resctrl/core.c x86/cpu/vfm: Update arch/x86/kernel/cpu/resctrl/pseudo_lock.c x86/cpu/vfm: Update arch/x86/kernel/smpboot.c x86/cpu/vfm: Update arch/x86/kernel/tsc.c x86/cpu/vfm: Update arch/x86/kernel/tsc_msr.c x86/cpu/vfm: Update arch/x86/kvm/pmu.c x86/cpu/vfm: Update arch/x86/kvm/vmx/vmx.c x86/cpu/vfm: Update arch/x86/mm/init.c x86/cpu/vfm: Update arch/x86/pci/intel_mid_pci.c x86/cpu/vfm: Update arch/x86/virt/vmx/tdx/tdx.c x86/cpu/vfm: Update drivers/acpi/acpi_lpss.c x86/cpu/vfm: Update drivers/acpi/x86/utils.c x86/cpu/vfm: Update tpm files x86/cpu/vfm: Update drivers/cpufreq/intel_pstate.c x86/cpu/vfm: Update drivers/cpufreq/speedstep-centrino.c x86/cpu/vfm: Update drivers/edac/i10nm_base.c x86/cpu/vfm: Update drivers/edac/pnd2_edac.c x86/cpu/vfm: Update drivers/edac/sb_edac.c x86/cpu/vfm: Update drivers/edac/skx_base.c x86/cpu/vfm: Update drivers/extcon/extcon-axp288.c x86/cpu/vfm: Update drivers/hwmon/peci/cputemp.c x86/cpu/vfm: Update drivers/idle/intel_idle.c x86/cpu/vfm: Update drivers/pci/pci-mid.c x86/cpu/vfm: Update drivers/peci/cpu.c x86/cpu/vfm: Update drivers/platform/x86/intel/ifs/core.c x86/cpu/vfm: Update drivers/platform/x86/intel_ips.c x86/cpu/vfm: Update drivers/platform/x86/intel/pmc/core.c x86/cpu/vfm: Update drivers/platform/x86/intel/pmc/pltdrv.c x86/cpu/vfm: Update drivers/platform/x86/intel_scu_wdt.c x86/cpu/vfm: Update drivers/platform/x86/intel/speed_select_if/isst_if_common.c x86/cpu/vfm: Update drivers/platform/x86/intel/speed_select_if/isst_if_mbox_msr.c x86/cpu/vfm: Update drivers/platform/x86/intel/telemetry/debugfs.c x86/cpu/vfm: Update drivers/platform/x86/intel/telemetry/pltdrv.c x86/cpu/vfm: Update drivers/platform/x86/intel/turbo_max_3.c x86/cpu/vfm: Update drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c x86/cpu/vfm: Update drivers/platform/x86/p2sb.c x86/cpu/vfm: Update drivers/powercap/intel_rapl_common.c x86/cpu/vfm: Update drivers/powercap/intel_rapl_msr.c x86/cpu/vfm: Update drivers/staging/media/atomisp/include/linux/atomisp_platform.h x86/cpu/vfm: Update intel_soc_dts_thermal.c x86/cpu/vfm: Update drivers/thermal/intel/intel_tcc_cooling.c x86/cpu/vfm: Update sound/soc/intel/avs/boards/es8336.c x86/cpu/vfm: Update arch/x86/events/intel/core.c x86/cpu/vfm: Update arch/x86/platform/intel-mid/intel-mid.c x86/cpu/vfm: Update arch/x86/platform/atom/punit_atom_debug.c x86/cpu/vfm: Update arch/x86/events/intel/core.c x86/cpu/vfm: Update tools/power/x86/turbostat/turbostat.c x86/cpu/vfm: Update arch/x86/boot/cpucheck.c x86/cpu/vfm: Delete X86_MATCH_INTEL_FAM6_MODEL[_STEPPING]() macros x86/cpu/vfm: Delete all the *_FAM6_ CPU #defines .../atomisp/include/linux/atomisp_platform.h | 26 +-- include/linux/peci-cpu.h | 1 + include/linux/platform_data/x86/soc.h | 12 +- arch/x86/include/asm/cpu_device_id.h | 103 +++++++-- arch/x86/include/asm/intel-family.h | 167 +++++++------- arch/x86/include/asm/processor.h | 12 +- drivers/char/tpm/tpm.h | 1 + drivers/char/tpm/tpm_tis_core.h | 2 +- arch/x86/boot/cpucheck.c | 2 +- arch/x86/crypto/poly1305_glue.c | 3 +- arch/x86/crypto/twofish_glue_3way.c | 10 +- arch/x86/events/intel/core.c | 212 +++++++++--------- arch/x86/events/intel/cstate.c | 144 ++++++------ arch/x86/events/intel/lbr.c | 3 +- arch/x86/events/intel/pt.c | 11 +- arch/x86/events/intel/uncore.c | 100 ++++----- arch/x86/events/intel/uncore_nhmex.c | 3 +- arch/x86/events/intel/uncore_snbep.c | 5 +- arch/x86/events/msr.c | 131 +++++------ arch/x86/events/rapl.c | 84 +++---- arch/x86/kernel/apic/apic.c | 38 ++-- arch/x86/kernel/cpu/aperfmperf.c | 17 +- arch/x86/kernel/cpu/bugs.c | 29 +-- arch/x86/kernel/cpu/common.c | 154 +++++++------ arch/x86/kernel/cpu/intel.c | 115 +++++----- arch/x86/kernel/cpu/intel_epb.c | 12 +- arch/x86/kernel/cpu/match.c | 5 +- arch/x86/kernel/cpu/mce/core.c | 5 +- arch/x86/kernel/cpu/mce/intel.c | 20 +- arch/x86/kernel/cpu/mce/severity.c | 9 +- arch/x86/kernel/cpu/microcode/intel.c | 4 +- arch/x86/kernel/cpu/resctrl/core.c | 9 +- arch/x86/kernel/cpu/resctrl/pseudo_lock.c | 21 +- arch/x86/kernel/smpboot.c | 6 +- arch/x86/kernel/tsc.c | 5 +- arch/x86/kernel/tsc_msr.c | 14 +- arch/x86/kvm/pmu.c | 8 +- arch/x86/kvm/vmx/vmx.c | 20 +- arch/x86/mm/init.c | 16 +- arch/x86/pci/intel_mid_pci.c | 4 +- arch/x86/platform/atom/punit_atom_debug.c | 11 +- arch/x86/platform/intel-mid/intel-mid.c | 7 +- arch/x86/virt/vmx/tdx/tdx.c | 7 +- drivers/acpi/acpi_lpss.c | 4 +- drivers/acpi/x86/utils.c | 42 ++-- drivers/cpufreq/intel_pstate.c | 90 ++++---- drivers/cpufreq/speedstep-centrino.c | 8 +- drivers/edac/i10nm_base.c | 20 +- drivers/edac/pnd2_edac.c | 4 +- drivers/edac/sb_edac.c | 14 +- drivers/edac/skx_base.c | 2 +- drivers/extcon/extcon-axp288.c | 2 +- drivers/hwmon/peci/cputemp.c | 7 +- drivers/idle/intel_idle.c | 116 +++++----- drivers/pci/pci-mid.c | 4 +- drivers/peci/cpu.c | 28 +-- drivers/platform/x86/intel/ifs/core.c | 15 +- drivers/platform/x86/intel/pmc/core.c | 46 ++-- drivers/platform/x86/intel/pmc/pltdrv.c | 16 +- .../intel/speed_select_if/isst_if_common.c | 4 +- .../intel/speed_select_if/isst_if_mbox_msr.c | 2 +- .../platform/x86/intel/telemetry/debugfs.c | 4 +- drivers/platform/x86/intel/telemetry/pltdrv.c | 4 +- drivers/platform/x86/intel/turbo_max_3.c | 4 +- .../intel/uncore-frequency/uncore-frequency.c | 56 ++--- drivers/platform/x86/intel_ips.c | 3 +- drivers/platform/x86/intel_scu_wdt.c | 2 +- drivers/platform/x86/p2sb.c | 2 +- drivers/powercap/intel_rapl_common.c | 118 +++++----- drivers/powercap/intel_rapl_msr.c | 16 +- drivers/thermal/intel/intel_soc_dts_thermal.c | 2 +- drivers/thermal/intel/intel_tcc_cooling.c | 30 +-- sound/soc/intel/avs/boards/es8336.c | 7 +- tools/power/x86/turbostat/turbostat.c | 161 +++++++------ 74 files changed, 1258 insertions(+), 1143 deletions(-) base-commit: 4cece764965020c22cff7665b18a012006359095 -- 2.44.0
Use mempools for allocating requests and subrequests in an effort to make sure that allocation always succeeds so that when performing writeback we can always make progress. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/netfs/internal.h | 2 ++ fs/netfs/main.c | 51 ++++++++++++++++++++++++++++++++----- fs/netfs/objects.c | 59 ++++++++++++++++++++++++++++--------------- include/linux/netfs.h | 5 ++-- 4 files changed, 89 insertions(+), 28 deletions(-) diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h index 156ab138e224..c67da478cd2b 100644 --- a/fs/netfs/internal.h +++ b/fs/netfs/internal.h @@ -37,6 +37,8 @@ int netfs_begin_read(struct netfs_io_request *rreq, bool sync); extern unsigned int netfs_debug; extern struct list_head netfs_io_requests; extern spinlock_t netfs_proc_lock; +extern mempool_t netfs_request_pool; +extern mempool_t netfs_subrequest_pool; #ifdef CONFIG_PROC_FS static inline void netfs_proc_add_rreq(struct netfs_io_request *rreq) diff --git a/fs/netfs/main.c b/fs/netfs/main.c index 844efbb2e7a2..4805b9377364 100644 --- a/fs/netfs/main.c +++ b/fs/netfs/main.c @@ -7,6 +7,7 @@ #include <linux/module.h> #include <linux/export.h> +#include <linux/mempool.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> #include "internal.h" @@ -23,6 +24,11 @@ unsigned netfs_debug; module_param_named(debug, netfs_debug, uint, S_IWUSR | S_IRUGO); MODULE_PARM_DESC(netfs_debug, "Netfs support debugging mask"); +static struct kmem_cache *netfs_request_slab; +static struct kmem_cache *netfs_subrequest_slab; +mempool_t netfs_request_pool; +mempool_t netfs_subrequest_pool; + #ifdef CONFIG_PROC_FS LIST_HEAD(netfs_io_requests); DEFINE_SPINLOCK(netfs_proc_lock); @@ -98,25 +104,54 @@ static int __init netfs_init(void) { int ret = -ENOMEM; + netfs_request_slab = kmem_cache_create("netfs_request", + sizeof(struct netfs_io_request), 0, + SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT, + NULL); + if (!netfs_request_slab) + goto error_req; + + if (mempool_init_slab_pool(&netfs_request_pool, 100, netfs_request_slab) < 0) + goto error_reqpool; + + netfs_subrequest_slab = kmem_cache_create("netfs_subrequest", + sizeof(struct netfs_io_subrequest), 0, + SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT, + NULL); + if (!netfs_subrequest_slab) + goto error_subreq; + + if (mempool_init_slab_pool(&netfs_subrequest_pool, 100, netfs_subrequest_slab) < 0) + goto error_subreqpool; + if (!proc_mkdir("fs/netfs", NULL)) - goto error; + goto error_proc; if (!proc_create_seq("fs/netfs/requests", S_IFREG | 0444, NULL, &netfs_requests_seq_ops)) - goto error_proc; + goto error_procfile; #ifdef CONFIG_FSCACHE_STATS if (!proc_create_single("fs/netfs/stats", S_IFREG | 0444, NULL, netfs_stats_show)) - goto error_proc; + goto error_procfile; #endif ret = fscache_init(); if (ret < 0) - goto error_proc; + goto error_fscache; return 0; -error_proc: +error_fscache: +error_procfile: remove_proc_entry("fs/netfs", NULL); -error: +error_proc: + mempool_exit(&netfs_subrequest_pool); +error_subreqpool: + kmem_cache_destroy(netfs_subrequest_slab); +error_subreq: + mempool_exit(&netfs_request_pool); +error_reqpool: + kmem_cache_destroy(netfs_request_slab); +error_req: return ret; } fs_initcall(netfs_init); @@ -125,5 +160,9 @@ static void __exit netfs_exit(void) { fscache_exit(); remove_proc_entry("fs/netfs", NULL); + mempool_exit(&netfs_subrequest_pool); + kmem_cache_destroy(netfs_subrequest_slab); + mempool_exit(&netfs_request_pool); + kmem_cache_destroy(netfs_request_slab); } module_exit(netfs_exit); diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c index 8acc03a64059..1a4e2ce735ce 100644 --- a/fs/netfs/objects.c +++ b/fs/netfs/objects.c @@ -6,6 +6,8 @@ */ #include <linux/slab.h> +#include <linux/mempool.h> +#include <linux/delay.h> #include "internal.h" /* @@ -20,17 +22,22 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping, struct inode *inode = file ? file_inode(file) : mapping->host; struct netfs_inode *ctx = netfs_inode(inode); struct netfs_io_request *rreq; + mempool_t *mempool = ctx->ops->request_pool ?: &netfs_request_pool; + struct kmem_cache *cache = mempool->pool_data; bool is_unbuffered = (origin == NETFS_UNBUFFERED_WRITE || origin == NETFS_DIO_READ || origin == NETFS_DIO_WRITE); bool cached = !is_unbuffered && netfs_is_cache_enabled(ctx); int ret; - rreq = kzalloc(ctx->ops->io_request_size ?: sizeof(struct netfs_io_request), - GFP_KERNEL); - if (!rreq) - return ERR_PTR(-ENOMEM); + for (;;) { + rreq = mempool_alloc(mempool, GFP_KERNEL); + if (rreq) + break; + msleep(10); + } + memset(rreq, 0, kmem_cache_size(cache)); rreq->start = start; rreq->len = len; rreq->upper_len = len; @@ -56,7 +63,7 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping, if (rreq->netfs_ops->init_request) { ret = rreq->netfs_ops->init_request(rreq, file); if (ret < 0) { - kfree(rreq); + mempool_free(rreq, rreq->netfs_ops->request_pool ?: &netfs_request_pool); return ERR_PTR(ret); } } @@ -88,6 +95,14 @@ void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async) } } +static void netfs_free_request_rcu(struct rcu_head *rcu) +{ + struct netfs_io_request *rreq = container_of(rcu, struct netfs_io_request, rcu); + + mempool_free(rreq, rreq->netfs_ops->request_pool ?: &netfs_request_pool); + netfs_stat_d(&netfs_n_rh_rreq); +} + static void netfs_free_request(struct work_struct *work) { struct netfs_io_request *rreq = @@ -110,8 +125,7 @@ static void netfs_free_request(struct work_struct *work) } kvfree(rreq->direct_bv); } - kfree_rcu(rreq, rcu); - netfs_stat_d(&netfs_n_rh_rreq); + call_rcu(&rreq->rcu, netfs_free_request_rcu); } void netfs_put_request(struct netfs_io_request *rreq, bool was_async, @@ -143,20 +157,25 @@ void netfs_put_request(struct netfs_io_request *rreq, bool was_async, struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq) { struct netfs_io_subrequest *subreq; - - subreq = kzalloc(rreq->netfs_ops->io_subrequest_size ?: - sizeof(struct netfs_io_subrequest), - GFP_KERNEL); - if (subreq) { - INIT_WORK(&subreq->work, NULL); - INIT_LIST_HEAD(&subreq->rreq_link); - refcount_set(&subreq->ref, 2); - subreq->rreq = rreq; - subreq->debug_index = atomic_inc_return(&rreq->subreq_counter); - netfs_get_request(rreq, netfs_rreq_trace_get_subreq); - netfs_stat(&netfs_n_rh_sreq); + mempool_t *mempool = rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool; + struct kmem_cache *cache = mempool->pool_data; + + for (;;) { + subreq = mempool_alloc(rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool, + GFP_KERNEL); + if (subreq) + break; + msleep(10); } + memset(subreq, 0, kmem_cache_size(cache)); + INIT_WORK(&subreq->work, NULL); + INIT_LIST_HEAD(&subreq->rreq_link); + refcount_set(&subreq->ref, 2); + subreq->rreq = rreq; + subreq->debug_index = atomic_inc_return(&rreq->subreq_counter); + netfs_get_request(rreq, netfs_rreq_trace_get_subreq); + netfs_stat(&netfs_n_rh_sreq); return subreq; } @@ -178,7 +197,7 @@ static void netfs_free_subrequest(struct netfs_io_subrequest *subreq, trace_netfs_sreq(subreq, netfs_sreq_trace_free); if (rreq->netfs_ops->free_subrequest) rreq->netfs_ops->free_subrequest(subreq); - kfree(subreq); + mempool_free(subreq, rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool); netfs_stat_d(&netfs_n_rh_sreq); netfs_put_request(rreq, was_async, netfs_rreq_trace_put_subreq); } diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 3af589dabd7f..0b6c2c2d3c23 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -20,6 +20,7 @@ #include <linux/uio.h> enum netfs_sreq_ref_trace; +typedef struct mempool_s mempool_t; /** * folio_start_private_2 - Start an fscache write on a folio. [DEPRECATED] @@ -236,8 +237,8 @@ struct netfs_io_request { * Operations the network filesystem can/must provide to the helpers. */ struct netfs_request_ops { - unsigned int io_request_size; /* Alloc size for netfs_io_request struct */ - unsigned int io_subrequest_size; /* Alloc size for netfs_io_subrequest struct */ + mempool_t *request_pool; + mempool_t *subrequest_pool; int (*init_request)(struct netfs_io_request *rreq, struct file *file); void (*free_request)(struct netfs_io_request *rreq); void (*free_subrequest)(struct netfs_io_subrequest *rreq);
Use mempools for allocating requests and subrequests in an effort to make sure that allocation always succeeds so that when performing writeback we can always make progress. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/netfs/internal.h | 2 ++ fs/netfs/main.c | 51 ++++++++++++++++++++++++++++++++----- fs/netfs/objects.c | 59 ++++++++++++++++++++++++++++--------------- include/linux/netfs.h | 5 ++-- 4 files changed, 89 insertions(+), 28 deletions(-) diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h index 156ab138e224..c67da478cd2b 100644 --- a/fs/netfs/internal.h +++ b/fs/netfs/internal.h @@ -37,6 +37,8 @@ int netfs_begin_read(struct netfs_io_request *rreq, bool sync); extern unsigned int netfs_debug; extern struct list_head netfs_io_requests; extern spinlock_t netfs_proc_lock; +extern mempool_t netfs_request_pool; +extern mempool_t netfs_subrequest_pool; #ifdef CONFIG_PROC_FS static inline void netfs_proc_add_rreq(struct netfs_io_request *rreq) diff --git a/fs/netfs/main.c b/fs/netfs/main.c index 844efbb2e7a2..4805b9377364 100644 --- a/fs/netfs/main.c +++ b/fs/netfs/main.c @@ -7,6 +7,7 @@ #include <linux/module.h> #include <linux/export.h> +#include <linux/mempool.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> #include "internal.h" @@ -23,6 +24,11 @@ unsigned netfs_debug; module_param_named(debug, netfs_debug, uint, S_IWUSR | S_IRUGO); MODULE_PARM_DESC(netfs_debug, "Netfs support debugging mask"); +static struct kmem_cache *netfs_request_slab; +static struct kmem_cache *netfs_subrequest_slab; +mempool_t netfs_request_pool; +mempool_t netfs_subrequest_pool; + #ifdef CONFIG_PROC_FS LIST_HEAD(netfs_io_requests); DEFINE_SPINLOCK(netfs_proc_lock); @@ -98,25 +104,54 @@ static int __init netfs_init(void) { int ret = -ENOMEM; + netfs_request_slab = kmem_cache_create("netfs_request", + sizeof(struct netfs_io_request), 0, + SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT, + NULL); + if (!netfs_request_slab) + goto error_req; + + if (mempool_init_slab_pool(&netfs_request_pool, 100, netfs_request_slab) < 0) + goto error_reqpool; + + netfs_subrequest_slab = kmem_cache_create("netfs_subrequest", + sizeof(struct netfs_io_subrequest), 0, + SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT, + NULL); + if (!netfs_subrequest_slab) + goto error_subreq; + + if (mempool_init_slab_pool(&netfs_subrequest_pool, 100, netfs_subrequest_slab) < 0) + goto error_subreqpool; + if (!proc_mkdir("fs/netfs", NULL)) - goto error; + goto error_proc; if (!proc_create_seq("fs/netfs/requests", S_IFREG | 0444, NULL, &netfs_requests_seq_ops)) - goto error_proc; + goto error_procfile; #ifdef CONFIG_FSCACHE_STATS if (!proc_create_single("fs/netfs/stats", S_IFREG | 0444, NULL, netfs_stats_show)) - goto error_proc; + goto error_procfile; #endif ret = fscache_init(); if (ret < 0) - goto error_proc; + goto error_fscache; return 0; -error_proc: +error_fscache: +error_procfile: remove_proc_entry("fs/netfs", NULL); -error: +error_proc: + mempool_exit(&netfs_subrequest_pool); +error_subreqpool: + kmem_cache_destroy(netfs_subrequest_slab); +error_subreq: + mempool_exit(&netfs_request_pool); +error_reqpool: + kmem_cache_destroy(netfs_request_slab); +error_req: return ret; } fs_initcall(netfs_init); @@ -125,5 +160,9 @@ static void __exit netfs_exit(void) { fscache_exit(); remove_proc_entry("fs/netfs", NULL); + mempool_exit(&netfs_subrequest_pool); + kmem_cache_destroy(netfs_subrequest_slab); + mempool_exit(&netfs_request_pool); + kmem_cache_destroy(netfs_request_slab); } module_exit(netfs_exit); diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c index 8acc03a64059..1a4e2ce735ce 100644 --- a/fs/netfs/objects.c +++ b/fs/netfs/objects.c @@ -6,6 +6,8 @@ */ #include <linux/slab.h> +#include <linux/mempool.h> +#include <linux/delay.h> #include "internal.h" /* @@ -20,17 +22,22 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping, struct inode *inode = file ? file_inode(file) : mapping->host; struct netfs_inode *ctx = netfs_inode(inode); struct netfs_io_request *rreq; + mempool_t *mempool = ctx->ops->request_pool ?: &netfs_request_pool; + struct kmem_cache *cache = mempool->pool_data; bool is_unbuffered = (origin == NETFS_UNBUFFERED_WRITE || origin == NETFS_DIO_READ || origin == NETFS_DIO_WRITE); bool cached = !is_unbuffered && netfs_is_cache_enabled(ctx); int ret; - rreq = kzalloc(ctx->ops->io_request_size ?: sizeof(struct netfs_io_request), - GFP_KERNEL); - if (!rreq) - return ERR_PTR(-ENOMEM); + for (;;) { + rreq = mempool_alloc(mempool, GFP_KERNEL); + if (rreq) + break; + msleep(10); + } + memset(rreq, 0, kmem_cache_size(cache)); rreq->start = start; rreq->len = len; rreq->upper_len = len; @@ -56,7 +63,7 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping, if (rreq->netfs_ops->init_request) { ret = rreq->netfs_ops->init_request(rreq, file); if (ret < 0) { - kfree(rreq); + mempool_free(rreq, rreq->netfs_ops->request_pool ?: &netfs_request_pool); return ERR_PTR(ret); } } @@ -88,6 +95,14 @@ void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async) } } +static void netfs_free_request_rcu(struct rcu_head *rcu) +{ + struct netfs_io_request *rreq = container_of(rcu, struct netfs_io_request, rcu); + + mempool_free(rreq, rreq->netfs_ops->request_pool ?: &netfs_request_pool); + netfs_stat_d(&netfs_n_rh_rreq); +} + static void netfs_free_request(struct work_struct *work) { struct netfs_io_request *rreq = @@ -110,8 +125,7 @@ static void netfs_free_request(struct work_struct *work) } kvfree(rreq->direct_bv); } - kfree_rcu(rreq, rcu); - netfs_stat_d(&netfs_n_rh_rreq); + call_rcu(&rreq->rcu, netfs_free_request_rcu); } void netfs_put_request(struct netfs_io_request *rreq, bool was_async, @@ -143,20 +157,25 @@ void netfs_put_request(struct netfs_io_request *rreq, bool was_async, struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq) { struct netfs_io_subrequest *subreq; - - subreq = kzalloc(rreq->netfs_ops->io_subrequest_size ?: - sizeof(struct netfs_io_subrequest), - GFP_KERNEL); - if (subreq) { - INIT_WORK(&subreq->work, NULL); - INIT_LIST_HEAD(&subreq->rreq_link); - refcount_set(&subreq->ref, 2); - subreq->rreq = rreq; - subreq->debug_index = atomic_inc_return(&rreq->subreq_counter); - netfs_get_request(rreq, netfs_rreq_trace_get_subreq); - netfs_stat(&netfs_n_rh_sreq); + mempool_t *mempool = rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool; + struct kmem_cache *cache = mempool->pool_data; + + for (;;) { + subreq = mempool_alloc(rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool, + GFP_KERNEL); + if (subreq) + break; + msleep(10); } + memset(subreq, 0, kmem_cache_size(cache)); + INIT_WORK(&subreq->work, NULL); + INIT_LIST_HEAD(&subreq->rreq_link); + refcount_set(&subreq->ref, 2); + subreq->rreq = rreq; + subreq->debug_index = atomic_inc_return(&rreq->subreq_counter); + netfs_get_request(rreq, netfs_rreq_trace_get_subreq); + netfs_stat(&netfs_n_rh_sreq); return subreq; } @@ -178,7 +197,7 @@ static void netfs_free_subrequest(struct netfs_io_subrequest *subreq, trace_netfs_sreq(subreq, netfs_sreq_trace_free); if (rreq->netfs_ops->free_subrequest) rreq->netfs_ops->free_subrequest(subreq); - kfree(subreq); + mempool_free(subreq, rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool); netfs_stat_d(&netfs_n_rh_sreq); netfs_put_request(rreq, was_async, netfs_rreq_trace_put_subreq); } diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 3af589dabd7f..0b6c2c2d3c23 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -20,6 +20,7 @@ #include <linux/uio.h> enum netfs_sreq_ref_trace; +typedef struct mempool_s mempool_t; /** * folio_start_private_2 - Start an fscache write on a folio. [DEPRECATED] @@ -236,8 +237,8 @@ struct netfs_io_request { * Operations the network filesystem can/must provide to the helpers. */ struct netfs_request_ops { - unsigned int io_request_size; /* Alloc size for netfs_io_request struct */ - unsigned int io_subrequest_size; /* Alloc size for netfs_io_subrequest struct */ + mempool_t *request_pool; + mempool_t *subrequest_pool; int (*init_request)(struct netfs_io_request *rreq, struct file *file); void (*free_request)(struct netfs_io_request *rreq); void (*free_subrequest)(struct netfs_io_subrequest *rreq);
Remove support for ->launder_folio() from netfslib and expect filesystems to use filemap_invalidate_inode() instead. netfs_launder_folio() can then be got rid of. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Steve French <sfrench@samba.org> cc: Matthew Wilcox <willy@infradead.org> cc: linux-mm@kvack.org cc: linux-fsdevel@vger.kernel.org cc: netfs@lists.linux.dev cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: ceph-devel@vger.kernel.org cc: linux-cifs@vger.kernel.org cc: devel@lists.orangefs.org --- fs/netfs/buffered_write.c | 74 ------------------------------------ fs/netfs/main.c | 1 - include/linux/netfs.h | 2 - include/trace/events/netfs.h | 3 -- 4 files changed, 80 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 576a68b7887e..624d8859c2fa 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -1199,77 +1199,3 @@ int netfs_writepages(struct address_space *mapping, return ret; } EXPORT_SYMBOL(netfs_writepages); - -/* - * Deal with the disposition of a laundered folio. - */ -static void netfs_cleanup_launder_folio(struct netfs_io_request *wreq) -{ - if (wreq->error) { - pr_notice("R=%08x Laundering error %d\n", wreq->debug_id, wreq->error); - mapping_set_error(wreq->mapping, wreq->error); - } -} - -/** - * netfs_launder_folio - Clean up a dirty folio that's being invalidated - * @folio: The folio to clean - * - * This is called to write back a folio that's being invalidated when an inode - * is getting torn down. Ideally, writepages would be used instead. - */ -int netfs_launder_folio(struct folio *folio) -{ - struct netfs_io_request *wreq; - struct address_space *mapping = folio->mapping; - struct netfs_folio *finfo = netfs_folio_info(folio); - struct netfs_group *group = netfs_folio_group(folio); - struct bio_vec bvec; - unsigned long long i_size = i_size_read(mapping->host); - unsigned long long start = folio_pos(folio); - size_t offset = 0, len; - int ret = 0; - - if (finfo) { - offset = finfo->dirty_offset; - start += offset; - len = finfo->dirty_len; - } else { - len = folio_size(folio); - } - len = min_t(unsigned long long, len, i_size - start); - - wreq = netfs_alloc_request(mapping, NULL, start, len, NETFS_LAUNDER_WRITE); - if (IS_ERR(wreq)) { - ret = PTR_ERR(wreq); - goto out; - } - - if (!folio_clear_dirty_for_io(folio)) - goto out_put; - - trace_netfs_folio(folio, netfs_folio_trace_launder); - - _debug("launder %llx-%llx", start, start + len - 1); - - /* Speculatively write to the cache. We have to fix this up later if - * the store fails. - */ - wreq->cleanup = netfs_cleanup_launder_folio; - - bvec_set_folio(&bvec, folio, len, offset); - iov_iter_bvec(&wreq->iter, ITER_SOURCE, &bvec, 1, len); - if (group != NETFS_FOLIO_COPY_TO_CACHE) - __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); - ret = netfs_begin_write(wreq, true, netfs_write_trace_launder); - -out_put: - folio_detach_private(folio); - netfs_put_group(group); - kfree(finfo); - netfs_put_request(wreq, false, netfs_rreq_trace_put_return); -out: - _leave(" = %d", ret); - return ret; -} -EXPORT_SYMBOL(netfs_launder_folio); diff --git a/fs/netfs/main.c b/fs/netfs/main.c index c5a73c9ed126..844efbb2e7a2 100644 --- a/fs/netfs/main.c +++ b/fs/netfs/main.c @@ -34,7 +34,6 @@ static const char *netfs_origins[nr__netfs_io_origin] = { [NETFS_COPY_TO_CACHE] = "CC", [NETFS_WRITEBACK] = "WB", [NETFS_WRITETHROUGH] = "WT", - [NETFS_LAUNDER_WRITE] = "LW", [NETFS_UNBUFFERED_WRITE] = "UW", [NETFS_DIO_READ] = "DR", [NETFS_DIO_WRITE] = "DW", diff --git a/include/linux/netfs.h b/include/linux/netfs.h index ddafc6ebff42..3af589dabd7f 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -172,7 +172,6 @@ enum netfs_io_origin { NETFS_COPY_TO_CACHE, /* This write is to copy a read to the cache */ NETFS_WRITEBACK, /* This write was triggered by writepages */ NETFS_WRITETHROUGH, /* This write was made by netfs_perform_write() */ - NETFS_LAUNDER_WRITE, /* This is triggered by ->launder_folio() */ NETFS_UNBUFFERED_WRITE, /* This is an unbuffered write */ NETFS_DIO_READ, /* This is a direct I/O read */ NETFS_DIO_WRITE, /* This is a direct I/O write */ @@ -352,7 +351,6 @@ int netfs_unpin_writeback(struct inode *inode, struct writeback_control *wbc); void netfs_clear_inode_writeback(struct inode *inode, const void *aux); void netfs_invalidate_folio(struct folio *folio, size_t offset, size_t length); bool netfs_release_folio(struct folio *folio, gfp_t gfp); -int netfs_launder_folio(struct folio *folio); /* VMA operations API. */ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_group); diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index e03fafb0c1e3..30769103638f 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -26,7 +26,6 @@ #define netfs_write_traces \ EM(netfs_write_trace_copy_to_cache, "COPY2CACH") \ EM(netfs_write_trace_dio_write, "DIO-WRITE") \ - EM(netfs_write_trace_launder, "LAUNDER ") \ EM(netfs_write_trace_unbuffered_write, "UNB-WRITE") \ EM(netfs_write_trace_writeback, "WRITEBACK") \ E_(netfs_write_trace_writethrough, "WRITETHRU") @@ -38,7 +37,6 @@ EM(NETFS_COPY_TO_CACHE, "CC") \ EM(NETFS_WRITEBACK, "WB") \ EM(NETFS_WRITETHROUGH, "WT") \ - EM(NETFS_LAUNDER_WRITE, "LW") \ EM(NETFS_UNBUFFERED_WRITE, "UW") \ EM(NETFS_DIO_READ, "DR") \ E_(NETFS_DIO_WRITE, "DW") @@ -135,7 +133,6 @@ EM(netfs_folio_trace_end_copy, "end-copy") \ EM(netfs_folio_trace_filled_gaps, "filled-gaps") \ EM(netfs_folio_trace_kill, "kill") \ - EM(netfs_folio_trace_launder, "launder") \ EM(netfs_folio_trace_mkwrite, "mkwrite") \ EM(netfs_folio_trace_mkwrite_plus, "mkwrite+") \ EM(netfs_folio_trace_read_gaps, "read-gaps") \
Use writepages-based flushing invalidation instead of invalidate_inode_pages2() and ->launder_folio(). This will allow ->launder_folio() to be removed eventually. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/afs/file.c | 1 - fs/afs/internal.h | 1 - fs/afs/validation.c | 4 ++-- fs/afs/write.c | 10 +++------- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/fs/afs/file.c b/fs/afs/file.c index ef2cc8f565d2..dfd8f60f5e1f 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -54,7 +54,6 @@ const struct address_space_operations afs_file_aops = { .read_folio = netfs_read_folio, .readahead = netfs_readahead, .dirty_folio = netfs_dirty_folio, - .launder_folio = netfs_launder_folio, .release_folio = netfs_release_folio, .invalidate_folio = netfs_invalidate_folio, .migrate_folio = filemap_migrate_folio, diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 6ce5a612937c..b93aa026daa4 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -916,7 +916,6 @@ struct afs_operation { loff_t pos; loff_t size; loff_t i_size; - bool laundering; /* Laundering page, PG_writeback not set */ } store; struct { struct iattr *attr; diff --git a/fs/afs/validation.c b/fs/afs/validation.c index 32a53fc8dfb2..1d8bbc46f734 100644 --- a/fs/afs/validation.c +++ b/fs/afs/validation.c @@ -365,9 +365,9 @@ static void afs_zap_data(struct afs_vnode *vnode) * written back in a regular file and completely discard the pages in a * directory or symlink */ if (S_ISREG(vnode->netfs.inode.i_mode)) - invalidate_remote_inode(&vnode->netfs.inode); + filemap_invalidate_inode(&vnode->netfs.inode, true); else - invalidate_inode_pages2(vnode->netfs.inode.i_mapping); + filemap_invalidate_inode(&vnode->netfs.inode, false); } /* diff --git a/fs/afs/write.c b/fs/afs/write.c index 74402d95a884..1bc26466eb72 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -75,8 +75,7 @@ static void afs_store_data_success(struct afs_operation *op) op->ctime = op->file[0].scb.status.mtime_client; afs_vnode_commit_status(op, &op->file[0]); if (!afs_op_error(op)) { - if (!op->store.laundering) - afs_pages_written_back(vnode, op->store.pos, op->store.size); + afs_pages_written_back(vnode, op->store.pos, op->store.size); afs_stat_v(vnode, n_stores); atomic_long_add(op->store.size, &afs_v2net(vnode)->n_store_bytes); } @@ -91,8 +90,7 @@ static const struct afs_operation_ops afs_store_data_operation = { /* * write to a file */ -static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t pos, - bool laundering) +static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t pos) { struct afs_operation *op; struct afs_wb_key *wbk = NULL; @@ -123,7 +121,6 @@ static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t op->file[0].modification = true; op->store.pos = pos; op->store.size = size; - op->store.laundering = laundering; op->flags |= AFS_OPERATION_UNINTR; op->ops = &afs_store_data_operation; @@ -168,8 +165,7 @@ static void afs_upload_to_server(struct netfs_io_subrequest *subreq) subreq->rreq->debug_id, subreq->debug_index, subreq->io_iter.count); trace_netfs_sreq(subreq, netfs_sreq_trace_submit); - ret = afs_store_data(vnode, &subreq->io_iter, subreq->start, - subreq->rreq->origin == NETFS_LAUNDER_WRITE); + ret = afs_store_data(vnode, &subreq->io_iter, subreq->start); netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, false); }
Remove support for ->launder_folio() from netfslib and expect filesystems to use filemap_invalidate_inode() instead. netfs_launder_folio() can then be got rid of. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Steve French <sfrench@samba.org> cc: Matthew Wilcox <willy@infradead.org> cc: linux-mm@kvack.org cc: linux-fsdevel@vger.kernel.org cc: netfs@lists.linux.dev cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: ceph-devel@vger.kernel.org cc: linux-cifs@vger.kernel.org cc: devel@lists.orangefs.org --- fs/netfs/buffered_write.c | 74 ------------------------------------ fs/netfs/main.c | 1 - include/linux/netfs.h | 2 - include/trace/events/netfs.h | 3 -- 4 files changed, 80 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 576a68b7887e..624d8859c2fa 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -1199,77 +1199,3 @@ int netfs_writepages(struct address_space *mapping, return ret; } EXPORT_SYMBOL(netfs_writepages); - -/* - * Deal with the disposition of a laundered folio. - */ -static void netfs_cleanup_launder_folio(struct netfs_io_request *wreq) -{ - if (wreq->error) { - pr_notice("R=%08x Laundering error %d\n", wreq->debug_id, wreq->error); - mapping_set_error(wreq->mapping, wreq->error); - } -} - -/** - * netfs_launder_folio - Clean up a dirty folio that's being invalidated - * @folio: The folio to clean - * - * This is called to write back a folio that's being invalidated when an inode - * is getting torn down. Ideally, writepages would be used instead. - */ -int netfs_launder_folio(struct folio *folio) -{ - struct netfs_io_request *wreq; - struct address_space *mapping = folio->mapping; - struct netfs_folio *finfo = netfs_folio_info(folio); - struct netfs_group *group = netfs_folio_group(folio); - struct bio_vec bvec; - unsigned long long i_size = i_size_read(mapping->host); - unsigned long long start = folio_pos(folio); - size_t offset = 0, len; - int ret = 0; - - if (finfo) { - offset = finfo->dirty_offset; - start += offset; - len = finfo->dirty_len; - } else { - len = folio_size(folio); - } - len = min_t(unsigned long long, len, i_size - start); - - wreq = netfs_alloc_request(mapping, NULL, start, len, NETFS_LAUNDER_WRITE); - if (IS_ERR(wreq)) { - ret = PTR_ERR(wreq); - goto out; - } - - if (!folio_clear_dirty_for_io(folio)) - goto out_put; - - trace_netfs_folio(folio, netfs_folio_trace_launder); - - _debug("launder %llx-%llx", start, start + len - 1); - - /* Speculatively write to the cache. We have to fix this up later if - * the store fails. - */ - wreq->cleanup = netfs_cleanup_launder_folio; - - bvec_set_folio(&bvec, folio, len, offset); - iov_iter_bvec(&wreq->iter, ITER_SOURCE, &bvec, 1, len); - if (group != NETFS_FOLIO_COPY_TO_CACHE) - __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); - ret = netfs_begin_write(wreq, true, netfs_write_trace_launder); - -out_put: - folio_detach_private(folio); - netfs_put_group(group); - kfree(finfo); - netfs_put_request(wreq, false, netfs_rreq_trace_put_return); -out: - _leave(" = %d", ret); - return ret; -} -EXPORT_SYMBOL(netfs_launder_folio); diff --git a/fs/netfs/main.c b/fs/netfs/main.c index c5a73c9ed126..844efbb2e7a2 100644 --- a/fs/netfs/main.c +++ b/fs/netfs/main.c @@ -34,7 +34,6 @@ static const char *netfs_origins[nr__netfs_io_origin] = { [NETFS_COPY_TO_CACHE] = "CC", [NETFS_WRITEBACK] = "WB", [NETFS_WRITETHROUGH] = "WT", - [NETFS_LAUNDER_WRITE] = "LW", [NETFS_UNBUFFERED_WRITE] = "UW", [NETFS_DIO_READ] = "DR", [NETFS_DIO_WRITE] = "DW", diff --git a/include/linux/netfs.h b/include/linux/netfs.h index ddafc6ebff42..3af589dabd7f 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -172,7 +172,6 @@ enum netfs_io_origin { NETFS_COPY_TO_CACHE, /* This write is to copy a read to the cache */ NETFS_WRITEBACK, /* This write was triggered by writepages */ NETFS_WRITETHROUGH, /* This write was made by netfs_perform_write() */ - NETFS_LAUNDER_WRITE, /* This is triggered by ->launder_folio() */ NETFS_UNBUFFERED_WRITE, /* This is an unbuffered write */ NETFS_DIO_READ, /* This is a direct I/O read */ NETFS_DIO_WRITE, /* This is a direct I/O write */ @@ -352,7 +351,6 @@ int netfs_unpin_writeback(struct inode *inode, struct writeback_control *wbc); void netfs_clear_inode_writeback(struct inode *inode, const void *aux); void netfs_invalidate_folio(struct folio *folio, size_t offset, size_t length); bool netfs_release_folio(struct folio *folio, gfp_t gfp); -int netfs_launder_folio(struct folio *folio); /* VMA operations API. */ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_group); diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index e03fafb0c1e3..30769103638f 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -26,7 +26,6 @@ #define netfs_write_traces \ EM(netfs_write_trace_copy_to_cache, "COPY2CACH") \ EM(netfs_write_trace_dio_write, "DIO-WRITE") \ - EM(netfs_write_trace_launder, "LAUNDER ") \ EM(netfs_write_trace_unbuffered_write, "UNB-WRITE") \ EM(netfs_write_trace_writeback, "WRITEBACK") \ E_(netfs_write_trace_writethrough, "WRITETHRU") @@ -38,7 +37,6 @@ EM(NETFS_COPY_TO_CACHE, "CC") \ EM(NETFS_WRITEBACK, "WB") \ EM(NETFS_WRITETHROUGH, "WT") \ - EM(NETFS_LAUNDER_WRITE, "LW") \ EM(NETFS_UNBUFFERED_WRITE, "UW") \ EM(NETFS_DIO_READ, "DR") \ E_(NETFS_DIO_WRITE, "DW") @@ -135,7 +133,6 @@ EM(netfs_folio_trace_end_copy, "end-copy") \ EM(netfs_folio_trace_filled_gaps, "filled-gaps") \ EM(netfs_folio_trace_kill, "kill") \ - EM(netfs_folio_trace_launder, "launder") \ EM(netfs_folio_trace_mkwrite, "mkwrite") \ EM(netfs_folio_trace_mkwrite_plus, "mkwrite+") \ EM(netfs_folio_trace_read_gaps, "read-gaps") \
Use writepages-based flushing invalidation instead of invalidate_inode_pages2() and ->launder_folio(). This will allow ->launder_folio() to be removed eventually. Signed-off-by: David Howells <dhowells@redhat.com> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Jeff Layton <jlayton@kernel.org> cc: v9fs@lists.linux.dev cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/9p/vfs_addr.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 047855033d32..5a943c122d83 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -89,7 +89,6 @@ static int v9fs_init_request(struct netfs_io_request *rreq, struct file *file) bool writing = (rreq->origin == NETFS_READ_FOR_WRITE || rreq->origin == NETFS_WRITEBACK || rreq->origin == NETFS_WRITETHROUGH || - rreq->origin == NETFS_LAUNDER_WRITE || rreq->origin == NETFS_UNBUFFERED_WRITE || rreq->origin == NETFS_DIO_WRITE); @@ -141,7 +140,6 @@ const struct address_space_operations v9fs_addr_operations = { .dirty_folio = netfs_dirty_folio, .release_folio = netfs_release_folio, .invalidate_folio = netfs_invalidate_folio, - .launder_folio = netfs_launder_folio, .direct_IO = noop_direct_IO, .writepages = netfs_writepages, };
Use writepages-based flushing invalidation instead of invalidate_inode_pages2() and ->launder_folio(). This will allow ->launder_folio() to be removed eventually. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/afs/file.c | 1 - fs/afs/internal.h | 1 - fs/afs/validation.c | 4 ++-- fs/afs/write.c | 10 +++------- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/fs/afs/file.c b/fs/afs/file.c index ef2cc8f565d2..dfd8f60f5e1f 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -54,7 +54,6 @@ const struct address_space_operations afs_file_aops = { .read_folio = netfs_read_folio, .readahead = netfs_readahead, .dirty_folio = netfs_dirty_folio, - .launder_folio = netfs_launder_folio, .release_folio = netfs_release_folio, .invalidate_folio = netfs_invalidate_folio, .migrate_folio = filemap_migrate_folio, diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 6ce5a612937c..b93aa026daa4 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -916,7 +916,6 @@ struct afs_operation { loff_t pos; loff_t size; loff_t i_size; - bool laundering; /* Laundering page, PG_writeback not set */ } store; struct { struct iattr *attr; diff --git a/fs/afs/validation.c b/fs/afs/validation.c index 32a53fc8dfb2..1d8bbc46f734 100644 --- a/fs/afs/validation.c +++ b/fs/afs/validation.c @@ -365,9 +365,9 @@ static void afs_zap_data(struct afs_vnode *vnode) * written back in a regular file and completely discard the pages in a * directory or symlink */ if (S_ISREG(vnode->netfs.inode.i_mode)) - invalidate_remote_inode(&vnode->netfs.inode); + filemap_invalidate_inode(&vnode->netfs.inode, true); else - invalidate_inode_pages2(vnode->netfs.inode.i_mapping); + filemap_invalidate_inode(&vnode->netfs.inode, false); } /* diff --git a/fs/afs/write.c b/fs/afs/write.c index 74402d95a884..1bc26466eb72 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -75,8 +75,7 @@ static void afs_store_data_success(struct afs_operation *op) op->ctime = op->file[0].scb.status.mtime_client; afs_vnode_commit_status(op, &op->file[0]); if (!afs_op_error(op)) { - if (!op->store.laundering) - afs_pages_written_back(vnode, op->store.pos, op->store.size); + afs_pages_written_back(vnode, op->store.pos, op->store.size); afs_stat_v(vnode, n_stores); atomic_long_add(op->store.size, &afs_v2net(vnode)->n_store_bytes); } @@ -91,8 +90,7 @@ static const struct afs_operation_ops afs_store_data_operation = { /* * write to a file */ -static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t pos, - bool laundering) +static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t pos) { struct afs_operation *op; struct afs_wb_key *wbk = NULL; @@ -123,7 +121,6 @@ static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t op->file[0].modification = true; op->store.pos = pos; op->store.size = size; - op->store.laundering = laundering; op->flags |= AFS_OPERATION_UNINTR; op->ops = &afs_store_data_operation; @@ -168,8 +165,7 @@ static void afs_upload_to_server(struct netfs_io_subrequest *subreq) subreq->rreq->debug_id, subreq->debug_index, subreq->io_iter.count); trace_netfs_sreq(subreq, netfs_sreq_trace_submit); - ret = afs_store_data(vnode, &subreq->io_iter, subreq->start, - subreq->rreq->origin == NETFS_LAUNDER_WRITE); + ret = afs_store_data(vnode, &subreq->io_iter, subreq->start); netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, false); }
Use writepages-based flushing invalidation instead of invalidate_inode_pages2() and ->launder_folio(). This will allow ->launder_folio() to be removed eventually. Signed-off-by: David Howells <dhowells@redhat.com> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Jeff Layton <jlayton@kernel.org> cc: v9fs@lists.linux.dev cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/9p/vfs_addr.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 047855033d32..5a943c122d83 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -89,7 +89,6 @@ static int v9fs_init_request(struct netfs_io_request *rreq, struct file *file) bool writing = (rreq->origin == NETFS_READ_FOR_WRITE || rreq->origin == NETFS_WRITEBACK || rreq->origin == NETFS_WRITETHROUGH || - rreq->origin == NETFS_LAUNDER_WRITE || rreq->origin == NETFS_UNBUFFERED_WRITE || rreq->origin == NETFS_DIO_WRITE); @@ -141,7 +140,6 @@ const struct address_space_operations v9fs_addr_operations = { .dirty_folio = netfs_dirty_folio, .release_folio = netfs_release_folio, .invalidate_folio = netfs_invalidate_folio, - .launder_folio = netfs_launder_folio, .direct_IO = noop_direct_IO, .writepages = netfs_writepages, };
Use writepages-based flushing invalidation instead of invalidate_inode_pages2() and ->launder_folio(). This will allow ->launder_folio() to be removed eventually. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/smb/client/cifsfs.h | 1 - fs/smb/client/file.c | 122 ----------------------------------------- fs/smb/client/inode.c | 25 ++------- 3 files changed, 5 insertions(+), 143 deletions(-) diff --git a/fs/smb/client/cifsfs.h b/fs/smb/client/cifsfs.h index ca55d01117c8..1ab7e5998c58 100644 --- a/fs/smb/client/cifsfs.h +++ b/fs/smb/client/cifsfs.h @@ -69,7 +69,6 @@ extern int cifs_revalidate_file_attr(struct file *filp); extern int cifs_revalidate_dentry_attr(struct dentry *); extern int cifs_revalidate_file(struct file *filp); extern int cifs_revalidate_dentry(struct dentry *); -extern int cifs_invalidate_mapping(struct inode *inode); extern int cifs_revalidate_mapping(struct inode *inode); extern int cifs_zap_mapping(struct inode *inode); extern int cifs_getattr(struct mnt_idmap *, const struct path *, diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 59da572d3384..f92d4d42e87e 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2576,64 +2576,6 @@ struct cifs_writedata *cifs_writedata_alloc(work_func_t complete) return wdata; } -static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to) -{ - struct address_space *mapping = page->mapping; - loff_t offset = (loff_t)page->index << PAGE_SHIFT; - char *write_data; - int rc = -EFAULT; - int bytes_written = 0; - struct inode *inode; - struct cifsFileInfo *open_file; - - if (!mapping || !mapping->host) - return -EFAULT; - - inode = page->mapping->host; - - offset += (loff_t)from; - write_data = kmap(page); - write_data += from; - - if ((to > PAGE_SIZE) || (from > to)) { - kunmap(page); - return -EIO; - } - - /* racing with truncate? */ - if (offset > mapping->host->i_size) { - kunmap(page); - return 0; /* don't care */ - } - - /* check to make sure that we are not extending the file */ - if (mapping->host->i_size - offset < (loff_t)to) - to = (unsigned)(mapping->host->i_size - offset); - - rc = cifs_get_writable_file(CIFS_I(mapping->host), FIND_WR_ANY, - &open_file); - if (!rc) { - bytes_written = cifs_write(open_file, open_file->pid, - write_data, to - from, &offset); - cifsFileInfo_put(open_file); - /* Does mm or vfs already set times? */ - simple_inode_init_ts(inode); - if ((bytes_written > 0) && (offset)) - rc = 0; - else if (bytes_written < 0) - rc = bytes_written; - else - rc = -EFAULT; - } else { - cifs_dbg(FYI, "No writable handle for write page rc=%d\n", rc); - if (!is_retryable_error(rc)) - rc = -EIO; - } - - kunmap(page); - return rc; -} - /* * Extend the region to be written back to include subsequent contiguously * dirty pages if possible, but don't sleep while doing so. @@ -3047,47 +2989,6 @@ static int cifs_writepages(struct address_space *mapping, return ret; } -static int -cifs_writepage_locked(struct page *page, struct writeback_control *wbc) -{ - int rc; - unsigned int xid; - - xid = get_xid(); -/* BB add check for wbc flags */ - get_page(page); - if (!PageUptodate(page)) - cifs_dbg(FYI, "ppw - page not up to date\n"); - - /* - * Set the "writeback" flag, and clear "dirty" in the radix tree. - * - * A writepage() implementation always needs to do either this, - * or re-dirty the page with "redirty_page_for_writepage()" in - * the case of a failure. - * - * Just unlocking the page will cause the radix tree tag-bits - * to fail to update with the state of the page correctly. - */ - set_page_writeback(page); -retry_write: - rc = cifs_partialpagewrite(page, 0, PAGE_SIZE); - if (is_retryable_error(rc)) { - if (wbc->sync_mode == WB_SYNC_ALL && rc == -EAGAIN) - goto retry_write; - redirty_page_for_writepage(wbc, page); - } else if (rc != 0) { - SetPageError(page); - mapping_set_error(page->mapping, rc); - } else { - SetPageUptodate(page); - } - end_page_writeback(page); - put_page(page); - free_xid(xid); - return rc; -} - static int cifs_write_end(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, unsigned copied, struct page *page, void *fsdata) @@ -4913,27 +4814,6 @@ static void cifs_invalidate_folio(struct folio *folio, size_t offset, folio_wait_private_2(folio); /* [DEPRECATED] */ } -static int cifs_launder_folio(struct folio *folio) -{ - int rc = 0; - loff_t range_start = folio_pos(folio); - loff_t range_end = range_start + folio_size(folio); - struct writeback_control wbc = { - .sync_mode = WB_SYNC_ALL, - .nr_to_write = 0, - .range_start = range_start, - .range_end = range_end, - }; - - cifs_dbg(FYI, "Launder page: %lu\n", folio->index); - - if (folio_clear_dirty_for_io(folio)) - rc = cifs_writepage_locked(&folio->page, &wbc); - - folio_wait_private_2(folio); /* [DEPRECATED] */ - return rc; -} - void cifs_oplock_break(struct work_struct *work) { struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo, @@ -5112,7 +4992,6 @@ const struct address_space_operations cifs_addr_ops = { .release_folio = cifs_release_folio, .direct_IO = cifs_direct_io, .invalidate_folio = cifs_invalidate_folio, - .launder_folio = cifs_launder_folio, .migrate_folio = filemap_migrate_folio, /* * TODO: investigate and if useful we could add an is_dirty_writeback @@ -5135,6 +5014,5 @@ const struct address_space_operations cifs_addr_ops_smallbuf = { .dirty_folio = netfs_dirty_folio, .release_folio = cifs_release_folio, .invalidate_folio = cifs_invalidate_folio, - .launder_folio = cifs_launder_folio, .migrate_folio = filemap_migrate_folio, }; diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index 91b07ef9e25c..468ea2312a1a 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -2430,24 +2430,6 @@ cifs_dentry_needs_reval(struct dentry *dentry) return false; } -/* - * Zap the cache. Called when invalid_mapping flag is set. - */ -int -cifs_invalidate_mapping(struct inode *inode) -{ - int rc = 0; - - if (inode->i_mapping && inode->i_mapping->nrpages != 0) { - rc = invalidate_inode_pages2(inode->i_mapping); - if (rc) - cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n", - __func__, inode, rc); - } - - return rc; -} - /** * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks * @@ -2484,9 +2466,12 @@ cifs_revalidate_mapping(struct inode *inode) if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE) goto skip_invalidate; - rc = cifs_invalidate_mapping(inode); - if (rc) + rc = filemap_invalidate_inode(inode, true); + if (rc) { + cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n", + __func__, inode, rc); set_bit(CIFS_INO_INVALID_MAPPING, flags); + } } skip_invalidate:
Implement a replacement for launder_folio. The key feature of invalidate_inode_pages2() is that it locks each folio individually, unmaps it to prevent mmap'd accesses interfering and calls the ->launder_folio() address_space op to flush it. This has problems: firstly, each folio is written individually as one or more small writes; secondly, adjacent folios cannot be added so easily into the laundry; thirdly, it's yet another op to implement. Instead, use the invalidate lock to cause anyone wanting to add a folio to the inode to wait, then unmap all the folios if we have mmaps, then, conditionally, use ->writepages() to flush any dirty data back and then discard all pages. The invalidate lock prevents ->read_iter(), ->write_iter() and faulting through mmap all from adding pages for the duration. Signed-off-by: David Howells <dhowells@redhat.com> cc: Matthew Wilcox <willy@infradead.org> cc: Miklos Szeredi <miklos@szeredi.hu> cc: Trond Myklebust <trond.myklebust@hammerspace.com> cc: Christoph Hellwig <hch@lst.de> cc: Andrew Morton <akpm@linux-foundation.org> cc: Alexander Viro <viro@zeniv.linux.org.uk> cc: Christian Brauner <brauner@kernel.org> cc: Jeff Layton <jlayton@kernel.org> cc: linux-mm@kvack.org cc: linux-fsdevel@vger.kernel.org cc: netfs@lists.linux.dev cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: ceph-devel@vger.kernel.org cc: linux-cifs@vger.kernel.org cc: linux-nfs@vger.kernel.org cc: devel@lists.orangefs.org --- include/linux/pagemap.h | 1 + mm/filemap.c | 46 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 2df35e65557d..4eb3d4177a53 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -40,6 +40,7 @@ int filemap_fdatawait_keep_errors(struct address_space *mapping); int filemap_fdatawait_range(struct address_space *, loff_t lstart, loff_t lend); int filemap_fdatawait_range_keep_errors(struct address_space *mapping, loff_t start_byte, loff_t end_byte); +int filemap_invalidate_inode(struct inode *inode, bool flush); static inline int filemap_fdatawait(struct address_space *mapping) { diff --git a/mm/filemap.c b/mm/filemap.c index 25983f0f96e3..087f685107a5 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -4134,6 +4134,52 @@ bool filemap_release_folio(struct folio *folio, gfp_t gfp) } EXPORT_SYMBOL(filemap_release_folio); +/** + * filemap_invalidate_inode - Invalidate/forcibly write back an inode's pagecache + * @inode: The inode to flush + * @flush: Set to write back rather than simply invalidate. + * + * Invalidate all the folios on an inode, possibly writing them back first. + * Whilst the operation is undertaken, the invalidate lock is held to prevent + * new folios from being installed. + */ +int filemap_invalidate_inode(struct inode *inode, bool flush) +{ + struct address_space *mapping = inode->i_mapping; + + if (!mapping || !mapping->nrpages) + goto out; + + /* Prevent new folios from being added to the inode. */ + filemap_invalidate_lock(mapping); + + if (!mapping->nrpages) + goto unlock; + + unmap_mapping_pages(mapping, 0, ULONG_MAX, false); + + /* Write back the data if we're asked to. */ + if (flush) { + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL, + .nr_to_write = LONG_MAX, + .range_start = 0, + .range_end = LLONG_MAX, + }; + + filemap_fdatawrite_wbc(mapping, &wbc); + } + + /* Wait for writeback to complete on all folios and discard. */ + truncate_inode_pages_range(mapping, 0, LLONG_MAX); + +unlock: + filemap_invalidate_unlock(mapping); +out: + return filemap_check_errors(mapping); +} +EXPORT_SYMBOL(filemap_invalidate_inode); + #ifdef CONFIG_CACHESTAT_SYSCALL /** * filemap_cachestat() - compute the page cache statistics of a mapping
Use writepages-based flushing invalidation instead of invalidate_inode_pages2() and ->launder_folio(). This will allow ->launder_folio() to be removed eventually. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/smb/client/cifsfs.h | 1 - fs/smb/client/file.c | 122 ----------------------------------------- fs/smb/client/inode.c | 25 ++------- 3 files changed, 5 insertions(+), 143 deletions(-) diff --git a/fs/smb/client/cifsfs.h b/fs/smb/client/cifsfs.h index ca55d01117c8..1ab7e5998c58 100644 --- a/fs/smb/client/cifsfs.h +++ b/fs/smb/client/cifsfs.h @@ -69,7 +69,6 @@ extern int cifs_revalidate_file_attr(struct file *filp); extern int cifs_revalidate_dentry_attr(struct dentry *); extern int cifs_revalidate_file(struct file *filp); extern int cifs_revalidate_dentry(struct dentry *); -extern int cifs_invalidate_mapping(struct inode *inode); extern int cifs_revalidate_mapping(struct inode *inode); extern int cifs_zap_mapping(struct inode *inode); extern int cifs_getattr(struct mnt_idmap *, const struct path *, diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 59da572d3384..f92d4d42e87e 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2576,64 +2576,6 @@ struct cifs_writedata *cifs_writedata_alloc(work_func_t complete) return wdata; } -static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to) -{ - struct address_space *mapping = page->mapping; - loff_t offset = (loff_t)page->index << PAGE_SHIFT; - char *write_data; - int rc = -EFAULT; - int bytes_written = 0; - struct inode *inode; - struct cifsFileInfo *open_file; - - if (!mapping || !mapping->host) - return -EFAULT; - - inode = page->mapping->host; - - offset += (loff_t)from; - write_data = kmap(page); - write_data += from; - - if ((to > PAGE_SIZE) || (from > to)) { - kunmap(page); - return -EIO; - } - - /* racing with truncate? */ - if (offset > mapping->host->i_size) { - kunmap(page); - return 0; /* don't care */ - } - - /* check to make sure that we are not extending the file */ - if (mapping->host->i_size - offset < (loff_t)to) - to = (unsigned)(mapping->host->i_size - offset); - - rc = cifs_get_writable_file(CIFS_I(mapping->host), FIND_WR_ANY, - &open_file); - if (!rc) { - bytes_written = cifs_write(open_file, open_file->pid, - write_data, to - from, &offset); - cifsFileInfo_put(open_file); - /* Does mm or vfs already set times? */ - simple_inode_init_ts(inode); - if ((bytes_written > 0) && (offset)) - rc = 0; - else if (bytes_written < 0) - rc = bytes_written; - else - rc = -EFAULT; - } else { - cifs_dbg(FYI, "No writable handle for write page rc=%d\n", rc); - if (!is_retryable_error(rc)) - rc = -EIO; - } - - kunmap(page); - return rc; -} - /* * Extend the region to be written back to include subsequent contiguously * dirty pages if possible, but don't sleep while doing so. @@ -3047,47 +2989,6 @@ static int cifs_writepages(struct address_space *mapping, return ret; } -static int -cifs_writepage_locked(struct page *page, struct writeback_control *wbc) -{ - int rc; - unsigned int xid; - - xid = get_xid(); -/* BB add check for wbc flags */ - get_page(page); - if (!PageUptodate(page)) - cifs_dbg(FYI, "ppw - page not up to date\n"); - - /* - * Set the "writeback" flag, and clear "dirty" in the radix tree. - * - * A writepage() implementation always needs to do either this, - * or re-dirty the page with "redirty_page_for_writepage()" in - * the case of a failure. - * - * Just unlocking the page will cause the radix tree tag-bits - * to fail to update with the state of the page correctly. - */ - set_page_writeback(page); -retry_write: - rc = cifs_partialpagewrite(page, 0, PAGE_SIZE); - if (is_retryable_error(rc)) { - if (wbc->sync_mode == WB_SYNC_ALL && rc == -EAGAIN) - goto retry_write; - redirty_page_for_writepage(wbc, page); - } else if (rc != 0) { - SetPageError(page); - mapping_set_error(page->mapping, rc); - } else { - SetPageUptodate(page); - } - end_page_writeback(page); - put_page(page); - free_xid(xid); - return rc; -} - static int cifs_write_end(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, unsigned copied, struct page *page, void *fsdata) @@ -4913,27 +4814,6 @@ static void cifs_invalidate_folio(struct folio *folio, size_t offset, folio_wait_private_2(folio); /* [DEPRECATED] */ } -static int cifs_launder_folio(struct folio *folio) -{ - int rc = 0; - loff_t range_start = folio_pos(folio); - loff_t range_end = range_start + folio_size(folio); - struct writeback_control wbc = { - .sync_mode = WB_SYNC_ALL, - .nr_to_write = 0, - .range_start = range_start, - .range_end = range_end, - }; - - cifs_dbg(FYI, "Launder page: %lu\n", folio->index); - - if (folio_clear_dirty_for_io(folio)) - rc = cifs_writepage_locked(&folio->page, &wbc); - - folio_wait_private_2(folio); /* [DEPRECATED] */ - return rc; -} - void cifs_oplock_break(struct work_struct *work) { struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo, @@ -5112,7 +4992,6 @@ const struct address_space_operations cifs_addr_ops = { .release_folio = cifs_release_folio, .direct_IO = cifs_direct_io, .invalidate_folio = cifs_invalidate_folio, - .launder_folio = cifs_launder_folio, .migrate_folio = filemap_migrate_folio, /* * TODO: investigate and if useful we could add an is_dirty_writeback @@ -5135,6 +5014,5 @@ const struct address_space_operations cifs_addr_ops_smallbuf = { .dirty_folio = netfs_dirty_folio, .release_folio = cifs_release_folio, .invalidate_folio = cifs_invalidate_folio, - .launder_folio = cifs_launder_folio, .migrate_folio = filemap_migrate_folio, }; diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index 91b07ef9e25c..468ea2312a1a 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -2430,24 +2430,6 @@ cifs_dentry_needs_reval(struct dentry *dentry) return false; } -/* - * Zap the cache. Called when invalid_mapping flag is set. - */ -int -cifs_invalidate_mapping(struct inode *inode) -{ - int rc = 0; - - if (inode->i_mapping && inode->i_mapping->nrpages != 0) { - rc = invalidate_inode_pages2(inode->i_mapping); - if (rc) - cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n", - __func__, inode, rc); - } - - return rc; -} - /** * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks * @@ -2484,9 +2466,12 @@ cifs_revalidate_mapping(struct inode *inode) if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE) goto skip_invalidate; - rc = cifs_invalidate_mapping(inode); - if (rc) + rc = filemap_invalidate_inode(inode, true); + if (rc) { + cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n", + __func__, inode, rc); set_bit(CIFS_INO_INVALID_MAPPING, flags); + } } skip_invalidate:
Use the subreq_counter in netfs_io_request to allocate subrequest debug_index values in read ops as well as write ops. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/io.c | 7 ++----- fs/netfs/objects.c | 1 + fs/netfs/output.c | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/fs/netfs/io.c b/fs/netfs/io.c index 2641238aae82..8de581ac0cfb 100644 --- a/fs/netfs/io.c +++ b/fs/netfs/io.c @@ -501,8 +501,7 @@ netfs_rreq_prepare_read(struct netfs_io_request *rreq, * Slice off a piece of a read request and submit an I/O request for it. */ static bool netfs_rreq_submit_slice(struct netfs_io_request *rreq, - struct iov_iter *io_iter, - unsigned int *_debug_index) + struct iov_iter *io_iter) { struct netfs_io_subrequest *subreq; enum netfs_io_source source; @@ -511,7 +510,6 @@ static bool netfs_rreq_submit_slice(struct netfs_io_request *rreq, if (!subreq) return false; - subreq->debug_index = (*_debug_index)++; subreq->start = rreq->start + rreq->submitted; subreq->len = io_iter->count; @@ -565,7 +563,6 @@ static bool netfs_rreq_submit_slice(struct netfs_io_request *rreq, int netfs_begin_read(struct netfs_io_request *rreq, bool sync) { struct iov_iter io_iter; - unsigned int debug_index = 0; int ret; _enter("R=%x %llx-%llx", @@ -596,7 +593,7 @@ int netfs_begin_read(struct netfs_io_request *rreq, bool sync) if (rreq->origin == NETFS_DIO_READ && rreq->start + rreq->submitted >= rreq->i_size) break; - if (!netfs_rreq_submit_slice(rreq, &io_iter, &debug_index)) + if (!netfs_rreq_submit_slice(rreq, &io_iter)) break; if (test_bit(NETFS_RREQ_BLOCKED, &rreq->flags) && test_bit(NETFS_RREQ_NONBLOCK, &rreq->flags)) diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c index 72b52f070270..8acc03a64059 100644 --- a/fs/netfs/objects.c +++ b/fs/netfs/objects.c @@ -152,6 +152,7 @@ struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq INIT_LIST_HEAD(&subreq->rreq_link); refcount_set(&subreq->ref, 2); subreq->rreq = rreq; + subreq->debug_index = atomic_inc_return(&rreq->subreq_counter); netfs_get_request(rreq, netfs_rreq_trace_get_subreq); netfs_stat(&netfs_n_rh_sreq); } diff --git a/fs/netfs/output.c b/fs/netfs/output.c index fbdbb4f78234..e586396d6b72 100644 --- a/fs/netfs/output.c +++ b/fs/netfs/output.c @@ -37,7 +37,6 @@ struct netfs_io_subrequest *netfs_create_write_request(struct netfs_io_request * subreq->source = dest; subreq->start = start; subreq->len = len; - subreq->debug_index = atomic_inc_return(&wreq->subreq_counter); switch (subreq->source) { case NETFS_UPLOAD_TO_SERVER:
Implement a replacement for launder_folio. The key feature of invalidate_inode_pages2() is that it locks each folio individually, unmaps it to prevent mmap'd accesses interfering and calls the ->launder_folio() address_space op to flush it. This has problems: firstly, each folio is written individually as one or more small writes; secondly, adjacent folios cannot be added so easily into the laundry; thirdly, it's yet another op to implement. Instead, use the invalidate lock to cause anyone wanting to add a folio to the inode to wait, then unmap all the folios if we have mmaps, then, conditionally, use ->writepages() to flush any dirty data back and then discard all pages. The invalidate lock prevents ->read_iter(), ->write_iter() and faulting through mmap all from adding pages for the duration. Signed-off-by: David Howells <dhowells@redhat.com> cc: Matthew Wilcox <willy@infradead.org> cc: Miklos Szeredi <miklos@szeredi.hu> cc: Trond Myklebust <trond.myklebust@hammerspace.com> cc: Christoph Hellwig <hch@lst.de> cc: Andrew Morton <akpm@linux-foundation.org> cc: Alexander Viro <viro@zeniv.linux.org.uk> cc: Christian Brauner <brauner@kernel.org> cc: Jeff Layton <jlayton@kernel.org> cc: linux-mm@kvack.org cc: linux-fsdevel@vger.kernel.org cc: netfs@lists.linux.dev cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: ceph-devel@vger.kernel.org cc: linux-cifs@vger.kernel.org cc: linux-nfs@vger.kernel.org cc: devel@lists.orangefs.org --- include/linux/pagemap.h | 1 + mm/filemap.c | 46 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 2df35e65557d..4eb3d4177a53 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -40,6 +40,7 @@ int filemap_fdatawait_keep_errors(struct address_space *mapping); int filemap_fdatawait_range(struct address_space *, loff_t lstart, loff_t lend); int filemap_fdatawait_range_keep_errors(struct address_space *mapping, loff_t start_byte, loff_t end_byte); +int filemap_invalidate_inode(struct inode *inode, bool flush); static inline int filemap_fdatawait(struct address_space *mapping) { diff --git a/mm/filemap.c b/mm/filemap.c index 25983f0f96e3..087f685107a5 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -4134,6 +4134,52 @@ bool filemap_release_folio(struct folio *folio, gfp_t gfp) } EXPORT_SYMBOL(filemap_release_folio); +/** + * filemap_invalidate_inode - Invalidate/forcibly write back an inode's pagecache + * @inode: The inode to flush + * @flush: Set to write back rather than simply invalidate. + * + * Invalidate all the folios on an inode, possibly writing them back first. + * Whilst the operation is undertaken, the invalidate lock is held to prevent + * new folios from being installed. + */ +int filemap_invalidate_inode(struct inode *inode, bool flush) +{ + struct address_space *mapping = inode->i_mapping; + + if (!mapping || !mapping->nrpages) + goto out; + + /* Prevent new folios from being added to the inode. */ + filemap_invalidate_lock(mapping); + + if (!mapping->nrpages) + goto unlock; + + unmap_mapping_pages(mapping, 0, ULONG_MAX, false); + + /* Write back the data if we're asked to. */ + if (flush) { + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL, + .nr_to_write = LONG_MAX, + .range_start = 0, + .range_end = LLONG_MAX, + }; + + filemap_fdatawrite_wbc(mapping, &wbc); + } + + /* Wait for writeback to complete on all folios and discard. */ + truncate_inode_pages_range(mapping, 0, LLONG_MAX); + +unlock: + filemap_invalidate_unlock(mapping); +out: + return filemap_check_errors(mapping); +} +EXPORT_SYMBOL(filemap_invalidate_inode); + #ifdef CONFIG_CACHESTAT_SYSCALL /** * filemap_cachestat() - compute the page cache statistics of a mapping
Make the netfs_io_request::subreq_counter, used to generate values for netfs_io_subrequest::debug_index, into an atomic_t so that it can be called from the retry thread at the same time as the app thread issuing writes. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/output.c | 2 +- include/linux/netfs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/netfs/output.c b/fs/netfs/output.c index 625eb68f3e5a..fbdbb4f78234 100644 --- a/fs/netfs/output.c +++ b/fs/netfs/output.c @@ -37,7 +37,7 @@ struct netfs_io_subrequest *netfs_create_write_request(struct netfs_io_request * subreq->source = dest; subreq->start = start; subreq->len = len; - subreq->debug_index = wreq->subreq_counter++; + subreq->debug_index = atomic_inc_return(&wreq->subreq_counter); switch (subreq->source) { case NETFS_UPLOAD_TO_SERVER: diff --git a/include/linux/netfs.h b/include/linux/netfs.h index f36a6d8163d1..ddafc6ebff42 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -202,7 +202,7 @@ struct netfs_io_request { unsigned int debug_id; unsigned int rsize; /* Maximum read size (0 for none) */ unsigned int wsize; /* Maximum write size (0 for none) */ - unsigned int subreq_counter; /* Next subreq->debug_index */ + atomic_t subreq_counter; /* Next subreq->debug_index */ atomic_t nr_outstanding; /* Number of ops in progress */ atomic_t nr_copy_ops; /* Number of copy-to-cache ops in progress */ size_t submitted; /* Amount submitted for I/O so far */
Use the subreq_counter in netfs_io_request to allocate subrequest debug_index values in read ops as well as write ops. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/io.c | 7 ++----- fs/netfs/objects.c | 1 + fs/netfs/output.c | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/fs/netfs/io.c b/fs/netfs/io.c index 2641238aae82..8de581ac0cfb 100644 --- a/fs/netfs/io.c +++ b/fs/netfs/io.c @@ -501,8 +501,7 @@ netfs_rreq_prepare_read(struct netfs_io_request *rreq, * Slice off a piece of a read request and submit an I/O request for it. */ static bool netfs_rreq_submit_slice(struct netfs_io_request *rreq, - struct iov_iter *io_iter, - unsigned int *_debug_index) + struct iov_iter *io_iter) { struct netfs_io_subrequest *subreq; enum netfs_io_source source; @@ -511,7 +510,6 @@ static bool netfs_rreq_submit_slice(struct netfs_io_request *rreq, if (!subreq) return false; - subreq->debug_index = (*_debug_index)++; subreq->start = rreq->start + rreq->submitted; subreq->len = io_iter->count; @@ -565,7 +563,6 @@ static bool netfs_rreq_submit_slice(struct netfs_io_request *rreq, int netfs_begin_read(struct netfs_io_request *rreq, bool sync) { struct iov_iter io_iter; - unsigned int debug_index = 0; int ret; _enter("R=%x %llx-%llx", @@ -596,7 +593,7 @@ int netfs_begin_read(struct netfs_io_request *rreq, bool sync) if (rreq->origin == NETFS_DIO_READ && rreq->start + rreq->submitted >= rreq->i_size) break; - if (!netfs_rreq_submit_slice(rreq, &io_iter, &debug_index)) + if (!netfs_rreq_submit_slice(rreq, &io_iter)) break; if (test_bit(NETFS_RREQ_BLOCKED, &rreq->flags) && test_bit(NETFS_RREQ_NONBLOCK, &rreq->flags)) diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c index 72b52f070270..8acc03a64059 100644 --- a/fs/netfs/objects.c +++ b/fs/netfs/objects.c @@ -152,6 +152,7 @@ struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq INIT_LIST_HEAD(&subreq->rreq_link); refcount_set(&subreq->ref, 2); subreq->rreq = rreq; + subreq->debug_index = atomic_inc_return(&rreq->subreq_counter); netfs_get_request(rreq, netfs_rreq_trace_get_subreq); netfs_stat(&netfs_n_rh_sreq); } diff --git a/fs/netfs/output.c b/fs/netfs/output.c index fbdbb4f78234..e586396d6b72 100644 --- a/fs/netfs/output.c +++ b/fs/netfs/output.c @@ -37,7 +37,6 @@ struct netfs_io_subrequest *netfs_create_write_request(struct netfs_io_request * subreq->source = dest; subreq->start = start; subreq->len = len; - subreq->debug_index = atomic_inc_return(&wreq->subreq_counter); switch (subreq->source) { case NETFS_UPLOAD_TO_SERVER:
Make the netfs_io_request::subreq_counter, used to generate values for netfs_io_subrequest::debug_index, into an atomic_t so that it can be called from the retry thread at the same time as the app thread issuing writes. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/netfs/output.c | 2 +- include/linux/netfs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/netfs/output.c b/fs/netfs/output.c index 625eb68f3e5a..fbdbb4f78234 100644 --- a/fs/netfs/output.c +++ b/fs/netfs/output.c @@ -37,7 +37,7 @@ struct netfs_io_subrequest *netfs_create_write_request(struct netfs_io_request * subreq->source = dest; subreq->start = start; subreq->len = len; - subreq->debug_index = wreq->subreq_counter++; + subreq->debug_index = atomic_inc_return(&wreq->subreq_counter); switch (subreq->source) { case NETFS_UPLOAD_TO_SERVER: diff --git a/include/linux/netfs.h b/include/linux/netfs.h index f36a6d8163d1..ddafc6ebff42 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -202,7 +202,7 @@ struct netfs_io_request { unsigned int debug_id; unsigned int rsize; /* Maximum read size (0 for none) */ unsigned int wsize; /* Maximum write size (0 for none) */ - unsigned int subreq_counter; /* Next subreq->debug_index */ + atomic_t subreq_counter; /* Next subreq->debug_index */ atomic_t nr_outstanding; /* Number of ops in progress */ atomic_t nr_copy_ops; /* Number of copy-to-cache ops in progress */ size_t submitted; /* Amount submitted for I/O so far */
Remove the PG_fscache alias for PG_private_2 and use the latter directly. Use of this flag for marking pages undergoing writing to the cache should be considered deprecated and the folios should be marked dirty instead and the write done in ->writepages(). Note that PG_private_2 itself should be considered deprecated and up for future removal by the MM folks too. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Matthew Wilcox (Oracle) <willy@infradead.org> cc: Ilya Dryomov <idryomov@gmail.com> cc: Xiubo Li <xiubli@redhat.com> cc: Steve French <sfrench@samba.org> cc: Paulo Alcantara <pc@manguebit.com> cc: Ronnie Sahlberg <ronniesahlberg@gmail.com> cc: Shyam Prasad N <sprasad@microsoft.com> cc: Tom Talpey <tom@talpey.com> cc: Bharath SM <bharathsm@microsoft.com> cc: Trond Myklebust <trond.myklebust@hammerspace.com> cc: Anna Schumaker <anna@kernel.org> cc: netfs@lists.linux.dev cc: ceph-devel@vger.kernel.org cc: linux-cifs@vger.kernel.org cc: linux-nfs@vger.kernel.org cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/ceph/addr.c | 11 +++--- fs/netfs/buffered_read.c | 4 +- fs/netfs/fscache_io.c | 2 +- fs/netfs/io.c | 2 +- fs/nfs/file.c | 8 ++-- fs/nfs/fscache.h | 4 +- fs/nfs/write.c | 4 +- fs/smb/client/file.c | 16 ++++---- include/linux/netfs.h | 80 ++-------------------------------------- mm/filemap.c | 6 +-- 10 files changed, 33 insertions(+), 104 deletions(-) diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 57cbae134b37..75690f969ebc 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -500,7 +500,7 @@ const struct netfs_request_ops ceph_netfs_ops = { #ifdef CONFIG_CEPH_FSCACHE static void ceph_set_page_fscache(struct page *page) { - set_page_fscache(page); + folio_start_private_2(page_folio(page)); /* [DEPRECATED] */ } static void ceph_fscache_write_terminated(void *priv, ssize_t error, bool was_async) @@ -798,7 +798,7 @@ static int ceph_writepage(struct page *page, struct writeback_control *wbc) ceph_inode_to_fs_client(inode)->write_congested) return AOP_WRITEPAGE_ACTIVATE; - wait_on_page_fscache(page); + folio_wait_private_2(page_folio(page)); /* [DEPRECATED] */ err = writepage_nounlock(page, wbc); if (err == -ERESTARTSYS) { @@ -1073,7 +1073,8 @@ static int ceph_writepages_start(struct address_space *mapping, unlock_page(page); break; } - if (PageWriteback(page) || PageFsCache(page)) { + if (PageWriteback(page) || + PagePrivate2(page) /* [DEPRECATED] */) { if (wbc->sync_mode == WB_SYNC_NONE) { doutc(cl, "%p under writeback\n", page); unlock_page(page); @@ -1081,7 +1082,7 @@ static int ceph_writepages_start(struct address_space *mapping, } doutc(cl, "waiting on writeback %p\n", page); wait_on_page_writeback(page); - wait_on_page_fscache(page); + folio_wait_private_2(page_folio(page)); /* [DEPRECATED] */ } if (!clear_page_dirty_for_io(page)) { @@ -1511,7 +1512,7 @@ static int ceph_write_begin(struct file *file, struct address_space *mapping, if (r < 0) return r; - folio_wait_fscache(folio); + folio_wait_private_2(folio); /* [DEPRECATED] */ WARN_ON_ONCE(!folio_test_locked(folio)); *pagep = &folio->page; return 0; diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c index 6d49319c82c6..b3fd6e1fa322 100644 --- a/fs/netfs/buffered_read.c +++ b/fs/netfs/buffered_read.c @@ -70,7 +70,7 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) if (!folio_started && test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags)) { trace_netfs_folio(folio, netfs_folio_trace_copy_to_cache); - folio_start_fscache(folio); + folio_start_private_2(folio); folio_started = true; } } else { @@ -506,7 +506,7 @@ int netfs_write_begin(struct netfs_inode *ctx, have_folio: if (test_bit(NETFS_ICTX_USE_PGPRIV2, &ctx->flags)) { - ret = folio_wait_fscache_killable(folio); + ret = folio_wait_private_2_killable(folio); if (ret < 0) goto error; } diff --git a/fs/netfs/fscache_io.c b/fs/netfs/fscache_io.c index 5028f2ae30da..38637e5c9b57 100644 --- a/fs/netfs/fscache_io.c +++ b/fs/netfs/fscache_io.c @@ -183,7 +183,7 @@ void __fscache_clear_page_bits(struct address_space *mapping, rcu_read_lock(); xas_for_each(&xas, page, last) { - end_page_fscache(page); + folio_end_private_2(page_folio(page)); } rcu_read_unlock(); } diff --git a/fs/netfs/io.c b/fs/netfs/io.c index b3b9827a9709..60a19f96e0ce 100644 --- a/fs/netfs/io.c +++ b/fs/netfs/io.c @@ -129,7 +129,7 @@ static void netfs_rreq_unmark_after_write(struct netfs_io_request *rreq, continue; unlocked = folio_next_index(folio) - 1; trace_netfs_folio(folio, netfs_folio_trace_end_copy); - folio_end_fscache(folio); + folio_end_private_2(folio); have_unlocked = true; } } diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 407c6e15afe2..6bd127e6683d 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -433,7 +433,7 @@ static void nfs_invalidate_folio(struct folio *folio, size_t offset, return; /* Cancel any unstarted writes on this page */ nfs_wb_folio_cancel(inode, folio); - folio_wait_fscache(folio); + folio_wait_private_2(folio); /* [DEPRECATED] */ trace_nfs_invalidate_folio(inode, folio); } @@ -500,7 +500,7 @@ static int nfs_launder_folio(struct folio *folio) dfprintk(PAGECACHE, "NFS: launder_folio(%ld, %llu)\n", inode->i_ino, folio_pos(folio)); - folio_wait_fscache(folio); + folio_wait_private_2(folio); /* [DEPRECATED] */ ret = nfs_wb_folio(inode, folio); trace_nfs_launder_folio_done(inode, folio, ret); return ret; @@ -593,8 +593,8 @@ static vm_fault_t nfs_vm_page_mkwrite(struct vm_fault *vmf) sb_start_pagefault(inode->i_sb); /* make sure the cache has finished storing the page */ - if (folio_test_fscache(folio) && - folio_wait_fscache_killable(folio) < 0) { + if (folio_test_private_2(folio) && /* [DEPRECATED] */ + folio_wait_private_2_killable(folio) < 0) { ret = VM_FAULT_RETRY; goto out; } diff --git a/fs/nfs/fscache.h b/fs/nfs/fscache.h index 814363d1d7c7..fbed0027996f 100644 --- a/fs/nfs/fscache.h +++ b/fs/nfs/fscache.h @@ -103,10 +103,10 @@ extern int nfs_netfs_read_folio(struct file *file, struct folio *folio); static inline bool nfs_fscache_release_folio(struct folio *folio, gfp_t gfp) { - if (folio_test_fscache(folio)) { + if (folio_test_private_2(folio)) { /* [DEPRECATED] */ if (current_is_kswapd() || !(gfp & __GFP_FS)) return false; - folio_wait_fscache(folio); + folio_wait_private_2(folio); } fscache_note_page_release(netfs_i_cookie(netfs_inode(folio->mapping->host))); return true; diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 5de85d725fb9..2329cbb0e446 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -2120,10 +2120,10 @@ int nfs_migrate_folio(struct address_space *mapping, struct folio *dst, if (folio_test_private(src)) return -EBUSY; - if (folio_test_fscache(src)) { + if (folio_test_private_2(src)) { /* [DEPRECATED] */ if (mode == MIGRATE_ASYNC) return -EBUSY; - folio_wait_fscache(src); + folio_wait_private_2(src); } return migrate_folio(mapping, dst, src, mode); diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 16aadce492b2..59da572d3384 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2953,12 +2953,12 @@ static ssize_t cifs_writepages_begin(struct address_space *mapping, } if (folio_test_writeback(folio) || - folio_test_fscache(folio)) { + folio_test_private_2(folio)) { /* [DEPRECATED] */ folio_unlock(folio); if (wbc->sync_mode != WB_SYNC_NONE) { folio_wait_writeback(folio); #ifdef CONFIG_CIFS_FSCACHE - folio_wait_fscache(folio); + folio_wait_private_2(folio); #endif goto lock_again; } @@ -4431,8 +4431,8 @@ static vm_fault_t cifs_page_mkwrite(struct vm_fault *vmf) * be modified. We then assume the entire folio will need writing back. */ #ifdef CONFIG_CIFS_FSCACHE - if (folio_test_fscache(folio) && - folio_wait_fscache_killable(folio) < 0) + if (folio_test_private_2(folio) && /* [DEPRECATED] */ + folio_wait_private_2_killable(folio) < 0) return VM_FAULT_RETRY; #endif @@ -4898,10 +4898,10 @@ static bool cifs_release_folio(struct folio *folio, gfp_t gfp) { if (folio_test_private(folio)) return 0; - if (folio_test_fscache(folio)) { + if (folio_test_private_2(folio)) { /* [DEPRECATED] */ if (current_is_kswapd() || !(gfp & __GFP_FS)) return false; - folio_wait_fscache(folio); + folio_wait_private_2(folio); } fscache_note_page_release(cifs_inode_cookie(folio->mapping->host)); return true; @@ -4910,7 +4910,7 @@ static bool cifs_release_folio(struct folio *folio, gfp_t gfp) static void cifs_invalidate_folio(struct folio *folio, size_t offset, size_t length) { - folio_wait_fscache(folio); + folio_wait_private_2(folio); /* [DEPRECATED] */ } static int cifs_launder_folio(struct folio *folio) @@ -4930,7 +4930,7 @@ static int cifs_launder_folio(struct folio *folio) if (folio_clear_dirty_for_io(folio)) rc = cifs_writepage_locked(&folio->page, &wbc); - folio_wait_fscache(folio); + folio_wait_private_2(folio); /* [DEPRECATED] */ return rc; } diff --git a/include/linux/netfs.h b/include/linux/netfs.h index f5e9c5f84a0c..f36a6d8163d1 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -21,94 +21,22 @@ enum netfs_sreq_ref_trace; -/* - * Overload PG_private_2 to give us PG_fscache - this is used to indicate that - * a page is currently backed by a local disk cache - */ -#define folio_test_fscache(folio) folio_test_private_2(folio) -#define PageFsCache(page) PagePrivate2((page)) -#define SetPageFsCache(page) SetPagePrivate2((page)) -#define ClearPageFsCache(page) ClearPagePrivate2((page)) -#define TestSetPageFsCache(page) TestSetPagePrivate2((page)) -#define TestClearPageFsCache(page) TestClearPagePrivate2((page)) - /** - * folio_start_fscache - Start an fscache write on a folio. + * folio_start_private_2 - Start an fscache write on a folio. [DEPRECATED] * @folio: The folio. * * Call this function before writing a folio to a local cache. Starting a * second write before the first one finishes is not allowed. + * + * Note that this should no longer be used. */ -static inline void folio_start_fscache(struct folio *folio) +static inline void folio_start_private_2(struct folio *folio) { VM_BUG_ON_FOLIO(folio_test_private_2(folio), folio); folio_get(folio); folio_set_private_2(folio); } -/** - * folio_end_fscache - End an fscache write on a folio. - * @folio: The folio. - * - * Call this function after the folio has been written to the local cache. - * This will wake any sleepers waiting on this folio. - */ -static inline void folio_end_fscache(struct folio *folio) -{ - folio_end_private_2(folio); -} - -/** - * folio_wait_fscache - Wait for an fscache write on this folio to end. - * @folio: The folio. - * - * If this folio is currently being written to a local cache, wait for - * the write to finish. Another write may start after this one finishes, - * unless the caller holds the folio lock. - */ -static inline void folio_wait_fscache(struct folio *folio) -{ - folio_wait_private_2(folio); -} - -/** - * folio_wait_fscache_killable - Wait for an fscache write on this folio to end. - * @folio: The folio. - * - * If this folio is currently being written to a local cache, wait - * for the write to finish or for a fatal signal to be received. - * Another write may start after this one finishes, unless the caller - * holds the folio lock. - * - * Return: - * - 0 if successful. - * - -EINTR if a fatal signal was encountered. - */ -static inline int folio_wait_fscache_killable(struct folio *folio) -{ - return folio_wait_private_2_killable(folio); -} - -static inline void set_page_fscache(struct page *page) -{ - folio_start_fscache(page_folio(page)); -} - -static inline void end_page_fscache(struct page *page) -{ - folio_end_private_2(page_folio(page)); -} - -static inline void wait_on_page_fscache(struct page *page) -{ - folio_wait_private_2(page_folio(page)); -} - -static inline int wait_on_page_fscache_killable(struct page *page) -{ - return folio_wait_private_2_killable(page_folio(page)); -} - /* Marks used on xarray-based buffers */ #define NETFS_BUF_PUT_MARK XA_MARK_0 /* - Page needs putting */ #define NETFS_BUF_PAGECACHE_MARK XA_MARK_1 /* - Page needs wb/dirty flag wrangling */ diff --git a/mm/filemap.c b/mm/filemap.c index 7437b2bd75c1..25983f0f96e3 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1540,7 +1540,7 @@ EXPORT_SYMBOL(folio_end_private_2); * folio_wait_private_2 - Wait for PG_private_2 to be cleared on a folio. * @folio: The folio to wait on. * - * Wait for PG_private_2 (aka PG_fscache) to be cleared on a folio. + * Wait for PG_private_2 to be cleared on a folio. */ void folio_wait_private_2(struct folio *folio) { @@ -1553,8 +1553,8 @@ EXPORT_SYMBOL(folio_wait_private_2); * folio_wait_private_2_killable - Wait for PG_private_2 to be cleared on a folio. * @folio: The folio to wait on. * - * Wait for PG_private_2 (aka PG_fscache) to be cleared on a folio or until a - * fatal signal is received by the calling task. + * Wait for PG_private_2 to be cleared on a folio or until a fatal signal is + * received by the calling task. * * Return: * - 0 if successful.
Remove the PG_fscache alias for PG_private_2 and use the latter directly. Use of this flag for marking pages undergoing writing to the cache should be considered deprecated and the folios should be marked dirty instead and the write done in ->writepages(). Note that PG_private_2 itself should be considered deprecated and up for future removal by the MM folks too. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Matthew Wilcox (Oracle) <willy@infradead.org> cc: Ilya Dryomov <idryomov@gmail.com> cc: Xiubo Li <xiubli@redhat.com> cc: Steve French <sfrench@samba.org> cc: Paulo Alcantara <pc@manguebit.com> cc: Ronnie Sahlberg <ronniesahlberg@gmail.com> cc: Shyam Prasad N <sprasad@microsoft.com> cc: Tom Talpey <tom@talpey.com> cc: Bharath SM <bharathsm@microsoft.com> cc: Trond Myklebust <trond.myklebust@hammerspace.com> cc: Anna Schumaker <anna@kernel.org> cc: netfs@lists.linux.dev cc: ceph-devel@vger.kernel.org cc: linux-cifs@vger.kernel.org cc: linux-nfs@vger.kernel.org cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/ceph/addr.c | 11 +++--- fs/netfs/buffered_read.c | 4 +- fs/netfs/fscache_io.c | 2 +- fs/netfs/io.c | 2 +- fs/nfs/file.c | 8 ++-- fs/nfs/fscache.h | 4 +- fs/nfs/write.c | 4 +- fs/smb/client/file.c | 16 ++++---- include/linux/netfs.h | 80 ++-------------------------------------- mm/filemap.c | 6 +-- 10 files changed, 33 insertions(+), 104 deletions(-) diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 57cbae134b37..75690f969ebc 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -500,7 +500,7 @@ const struct netfs_request_ops ceph_netfs_ops = { #ifdef CONFIG_CEPH_FSCACHE static void ceph_set_page_fscache(struct page *page) { - set_page_fscache(page); + folio_start_private_2(page_folio(page)); /* [DEPRECATED] */ } static void ceph_fscache_write_terminated(void *priv, ssize_t error, bool was_async) @@ -798,7 +798,7 @@ static int ceph_writepage(struct page *page, struct writeback_control *wbc) ceph_inode_to_fs_client(inode)->write_congested) return AOP_WRITEPAGE_ACTIVATE; - wait_on_page_fscache(page); + folio_wait_private_2(page_folio(page)); /* [DEPRECATED] */ err = writepage_nounlock(page, wbc); if (err == -ERESTARTSYS) { @@ -1073,7 +1073,8 @@ static int ceph_writepages_start(struct address_space *mapping, unlock_page(page); break; } - if (PageWriteback(page) || PageFsCache(page)) { + if (PageWriteback(page) || + PagePrivate2(page) /* [DEPRECATED] */) { if (wbc->sync_mode == WB_SYNC_NONE) { doutc(cl, "%p under writeback\n", page); unlock_page(page); @@ -1081,7 +1082,7 @@ static int ceph_writepages_start(struct address_space *mapping, } doutc(cl, "waiting on writeback %p\n", page); wait_on_page_writeback(page); - wait_on_page_fscache(page); + folio_wait_private_2(page_folio(page)); /* [DEPRECATED] */ } if (!clear_page_dirty_for_io(page)) { @@ -1511,7 +1512,7 @@ static int ceph_write_begin(struct file *file, struct address_space *mapping, if (r < 0) return r; - folio_wait_fscache(folio); + folio_wait_private_2(folio); /* [DEPRECATED] */ WARN_ON_ONCE(!folio_test_locked(folio)); *pagep = &folio->page; return 0; diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c index 6d49319c82c6..b3fd6e1fa322 100644 --- a/fs/netfs/buffered_read.c +++ b/fs/netfs/buffered_read.c @@ -70,7 +70,7 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) if (!folio_started && test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags)) { trace_netfs_folio(folio, netfs_folio_trace_copy_to_cache); - folio_start_fscache(folio); + folio_start_private_2(folio); folio_started = true; } } else { @@ -506,7 +506,7 @@ int netfs_write_begin(struct netfs_inode *ctx, have_folio: if (test_bit(NETFS_ICTX_USE_PGPRIV2, &ctx->flags)) { - ret = folio_wait_fscache_killable(folio); + ret = folio_wait_private_2_killable(folio); if (ret < 0) goto error; } diff --git a/fs/netfs/fscache_io.c b/fs/netfs/fscache_io.c index 5028f2ae30da..38637e5c9b57 100644 --- a/fs/netfs/fscache_io.c +++ b/fs/netfs/fscache_io.c @@ -183,7 +183,7 @@ void __fscache_clear_page_bits(struct address_space *mapping, rcu_read_lock(); xas_for_each(&xas, page, last) { - end_page_fscache(page); + folio_end_private_2(page_folio(page)); } rcu_read_unlock(); } diff --git a/fs/netfs/io.c b/fs/netfs/io.c index b3b9827a9709..60a19f96e0ce 100644 --- a/fs/netfs/io.c +++ b/fs/netfs/io.c @@ -129,7 +129,7 @@ static void netfs_rreq_unmark_after_write(struct netfs_io_request *rreq, continue; unlocked = folio_next_index(folio) - 1; trace_netfs_folio(folio, netfs_folio_trace_end_copy); - folio_end_fscache(folio); + folio_end_private_2(folio); have_unlocked = true; } } diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 407c6e15afe2..6bd127e6683d 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -433,7 +433,7 @@ static void nfs_invalidate_folio(struct folio *folio, size_t offset, return; /* Cancel any unstarted writes on this page */ nfs_wb_folio_cancel(inode, folio); - folio_wait_fscache(folio); + folio_wait_private_2(folio); /* [DEPRECATED] */ trace_nfs_invalidate_folio(inode, folio); } @@ -500,7 +500,7 @@ static int nfs_launder_folio(struct folio *folio) dfprintk(PAGECACHE, "NFS: launder_folio(%ld, %llu)\n", inode->i_ino, folio_pos(folio)); - folio_wait_fscache(folio); + folio_wait_private_2(folio); /* [DEPRECATED] */ ret = nfs_wb_folio(inode, folio); trace_nfs_launder_folio_done(inode, folio, ret); return ret; @@ -593,8 +593,8 @@ static vm_fault_t nfs_vm_page_mkwrite(struct vm_fault *vmf) sb_start_pagefault(inode->i_sb); /* make sure the cache has finished storing the page */ - if (folio_test_fscache(folio) && - folio_wait_fscache_killable(folio) < 0) { + if (folio_test_private_2(folio) && /* [DEPRECATED] */ + folio_wait_private_2_killable(folio) < 0) { ret = VM_FAULT_RETRY; goto out; } diff --git a/fs/nfs/fscache.h b/fs/nfs/fscache.h index 814363d1d7c7..fbed0027996f 100644 --- a/fs/nfs/fscache.h +++ b/fs/nfs/fscache.h @@ -103,10 +103,10 @@ extern int nfs_netfs_read_folio(struct file *file, struct folio *folio); static inline bool nfs_fscache_release_folio(struct folio *folio, gfp_t gfp) { - if (folio_test_fscache(folio)) { + if (folio_test_private_2(folio)) { /* [DEPRECATED] */ if (current_is_kswapd() || !(gfp & __GFP_FS)) return false; - folio_wait_fscache(folio); + folio_wait_private_2(folio); } fscache_note_page_release(netfs_i_cookie(netfs_inode(folio->mapping->host))); return true; diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 5de85d725fb9..2329cbb0e446 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -2120,10 +2120,10 @@ int nfs_migrate_folio(struct address_space *mapping, struct folio *dst, if (folio_test_private(src)) return -EBUSY; - if (folio_test_fscache(src)) { + if (folio_test_private_2(src)) { /* [DEPRECATED] */ if (mode == MIGRATE_ASYNC) return -EBUSY; - folio_wait_fscache(src); + folio_wait_private_2(src); } return migrate_folio(mapping, dst, src, mode); diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 16aadce492b2..59da572d3384 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2953,12 +2953,12 @@ static ssize_t cifs_writepages_begin(struct address_space *mapping, } if (folio_test_writeback(folio) || - folio_test_fscache(folio)) { + folio_test_private_2(folio)) { /* [DEPRECATED] */ folio_unlock(folio); if (wbc->sync_mode != WB_SYNC_NONE) { folio_wait_writeback(folio); #ifdef CONFIG_CIFS_FSCACHE - folio_wait_fscache(folio); + folio_wait_private_2(folio); #endif goto lock_again; } @@ -4431,8 +4431,8 @@ static vm_fault_t cifs_page_mkwrite(struct vm_fault *vmf) * be modified. We then assume the entire folio will need writing back. */ #ifdef CONFIG_CIFS_FSCACHE - if (folio_test_fscache(folio) && - folio_wait_fscache_killable(folio) < 0) + if (folio_test_private_2(folio) && /* [DEPRECATED] */ + folio_wait_private_2_killable(folio) < 0) return VM_FAULT_RETRY; #endif @@ -4898,10 +4898,10 @@ static bool cifs_release_folio(struct folio *folio, gfp_t gfp) { if (folio_test_private(folio)) return 0; - if (folio_test_fscache(folio)) { + if (folio_test_private_2(folio)) { /* [DEPRECATED] */ if (current_is_kswapd() || !(gfp & __GFP_FS)) return false; - folio_wait_fscache(folio); + folio_wait_private_2(folio); } fscache_note_page_release(cifs_inode_cookie(folio->mapping->host)); return true; @@ -4910,7 +4910,7 @@ static bool cifs_release_folio(struct folio *folio, gfp_t gfp) static void cifs_invalidate_folio(struct folio *folio, size_t offset, size_t length) { - folio_wait_fscache(folio); + folio_wait_private_2(folio); /* [DEPRECATED] */ } static int cifs_launder_folio(struct folio *folio) @@ -4930,7 +4930,7 @@ static int cifs_launder_folio(struct folio *folio) if (folio_clear_dirty_for_io(folio)) rc = cifs_writepage_locked(&folio->page, &wbc); - folio_wait_fscache(folio); + folio_wait_private_2(folio); /* [DEPRECATED] */ return rc; } diff --git a/include/linux/netfs.h b/include/linux/netfs.h index f5e9c5f84a0c..f36a6d8163d1 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -21,94 +21,22 @@ enum netfs_sreq_ref_trace; -/* - * Overload PG_private_2 to give us PG_fscache - this is used to indicate that - * a page is currently backed by a local disk cache - */ -#define folio_test_fscache(folio) folio_test_private_2(folio) -#define PageFsCache(page) PagePrivate2((page)) -#define SetPageFsCache(page) SetPagePrivate2((page)) -#define ClearPageFsCache(page) ClearPagePrivate2((page)) -#define TestSetPageFsCache(page) TestSetPagePrivate2((page)) -#define TestClearPageFsCache(page) TestClearPagePrivate2((page)) - /** - * folio_start_fscache - Start an fscache write on a folio. + * folio_start_private_2 - Start an fscache write on a folio. [DEPRECATED] * @folio: The folio. * * Call this function before writing a folio to a local cache. Starting a * second write before the first one finishes is not allowed. + * + * Note that this should no longer be used. */ -static inline void folio_start_fscache(struct folio *folio) +static inline void folio_start_private_2(struct folio *folio) { VM_BUG_ON_FOLIO(folio_test_private_2(folio), folio); folio_get(folio); folio_set_private_2(folio); } -/** - * folio_end_fscache - End an fscache write on a folio. - * @folio: The folio. - * - * Call this function after the folio has been written to the local cache. - * This will wake any sleepers waiting on this folio. - */ -static inline void folio_end_fscache(struct folio *folio) -{ - folio_end_private_2(folio); -} - -/** - * folio_wait_fscache - Wait for an fscache write on this folio to end. - * @folio: The folio. - * - * If this folio is currently being written to a local cache, wait for - * the write to finish. Another write may start after this one finishes, - * unless the caller holds the folio lock. - */ -static inline void folio_wait_fscache(struct folio *folio) -{ - folio_wait_private_2(folio); -} - -/** - * folio_wait_fscache_killable - Wait for an fscache write on this folio to end. - * @folio: The folio. - * - * If this folio is currently being written to a local cache, wait - * for the write to finish or for a fatal signal to be received. - * Another write may start after this one finishes, unless the caller - * holds the folio lock. - * - * Return: - * - 0 if successful. - * - -EINTR if a fatal signal was encountered. - */ -static inline int folio_wait_fscache_killable(struct folio *folio) -{ - return folio_wait_private_2_killable(folio); -} - -static inline void set_page_fscache(struct page *page) -{ - folio_start_fscache(page_folio(page)); -} - -static inline void end_page_fscache(struct page *page) -{ - folio_end_private_2(page_folio(page)); -} - -static inline void wait_on_page_fscache(struct page *page) -{ - folio_wait_private_2(page_folio(page)); -} - -static inline int wait_on_page_fscache_killable(struct page *page) -{ - return folio_wait_private_2_killable(page_folio(page)); -} - /* Marks used on xarray-based buffers */ #define NETFS_BUF_PUT_MARK XA_MARK_0 /* - Page needs putting */ #define NETFS_BUF_PAGECACHE_MARK XA_MARK_1 /* - Page needs wb/dirty flag wrangling */ diff --git a/mm/filemap.c b/mm/filemap.c index 7437b2bd75c1..25983f0f96e3 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1540,7 +1540,7 @@ EXPORT_SYMBOL(folio_end_private_2); * folio_wait_private_2 - Wait for PG_private_2 to be cleared on a folio. * @folio: The folio to wait on. * - * Wait for PG_private_2 (aka PG_fscache) to be cleared on a folio. + * Wait for PG_private_2 to be cleared on a folio. */ void folio_wait_private_2(struct folio *folio) { @@ -1553,8 +1553,8 @@ EXPORT_SYMBOL(folio_wait_private_2); * folio_wait_private_2_killable - Wait for PG_private_2 to be cleared on a folio. * @folio: The folio to wait on. * - * Wait for PG_private_2 (aka PG_fscache) to be cleared on a folio or until a - * fatal signal is received by the calling task. + * Wait for PG_private_2 to be cleared on a folio or until a fatal signal is + * received by the calling task. * * Return: * - 0 if successful.
When dirty data is being written to the cache, setting/waiting on/clearing the fscache flag is always done in tandem with setting/waiting on/clearing the writeback flag. The netfslib buffered write routines wait on and set both flags and the write request cleanup clears both flags, so the fscache flag is almost superfluous. The reason it isn't superfluous is because the fscache flag is also used to indicate that data just read from the server is being written to the cache. The flag is used to prevent a race involving overlapping direct-I/O writes to the cache. Change this to indicate that a page is in need of being copied to the cache by placing a magic value in folio->private and marking the folios dirty. Then when the writeback code sees a folio marked in this way, it only writes it to the cache and not to the server. If a folio that has this magic value set is modified, the value is just replaced and the folio will then be uplodaded too. With this, PG_fscache is no longer required by the netfslib core, 9p and afs. Ceph and nfs, however, still need to use the old PG_fscache-based tracking. To deal with this, a flag, NETFS_ICTX_USE_PGPRIV2, now has to be set on the flags in the netfs_inode struct for those filesystems. This reenables the use of PG_fscache in that inode. 9p and afs use the netfslib write helpers so get switched over; cifs, for the moment, does page-by-page manual access to the cache, so doesn't use PG_fscache and is unaffected. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Matthew Wilcox (Oracle) <willy@infradead.org> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Ilya Dryomov <idryomov@gmail.com> cc: Xiubo Li <xiubli@redhat.com> cc: Steve French <sfrench@samba.org> cc: Paulo Alcantara <pc@manguebit.com> cc: Ronnie Sahlberg <ronniesahlberg@gmail.com> cc: Shyam Prasad N <sprasad@microsoft.com> cc: Tom Talpey <tom@talpey.com> cc: Bharath SM <bharathsm@microsoft.com> cc: Trond Myklebust <trond.myklebust@hammerspace.com> cc: Anna Schumaker <anna@kernel.org> cc: netfs@lists.linux.dev cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: ceph-devel@vger.kernel.org cc: linux-cifs@vger.kernel.org cc: linux-nfs@vger.kernel.org cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/ceph/addr.c | 2 +- fs/ceph/inode.c | 2 + fs/netfs/buffered_read.c | 36 ++++++++++---- fs/netfs/buffered_write.c | 93 +++++++++++++++++------------------- fs/netfs/fscache_io.c | 12 +++-- fs/netfs/internal.h | 10 ++-- fs/netfs/io.c | 18 +++---- fs/netfs/main.c | 1 + fs/netfs/misc.c | 10 +--- fs/netfs/objects.c | 6 ++- fs/nfs/fscache.h | 2 + include/linux/fscache.h | 22 +++++---- include/linux/netfs.h | 20 ++++++-- include/trace/events/netfs.h | 6 ++- 14 files changed, 143 insertions(+), 97 deletions(-) diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 1340d77124ae..57cbae134b37 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -517,7 +517,7 @@ static void ceph_fscache_write_to_cache(struct inode *inode, u64 off, u64 len, b struct fscache_cookie *cookie = ceph_fscache_cookie(ci); fscache_write_to_cache(cookie, inode->i_mapping, off, len, i_size_read(inode), - ceph_fscache_write_terminated, inode, caching); + ceph_fscache_write_terminated, inode, true, caching); } #else static inline void ceph_set_page_fscache(struct page *page) diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 7b2e77517f23..99561fddcb38 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -577,6 +577,8 @@ struct inode *ceph_alloc_inode(struct super_block *sb) /* Set parameters for the netfs library */ netfs_inode_init(&ci->netfs, &ceph_netfs_ops, false); + /* [DEPRECATED] Use PG_private_2 to mark folio being written to the cache. */ + __set_bit(NETFS_ICTX_USE_PGPRIV2, &ci->netfs.flags); spin_lock_init(&ci->i_ceph_lock); diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c index 3298c29b5548..6d49319c82c6 100644 --- a/fs/netfs/buffered_read.c +++ b/fs/netfs/buffered_read.c @@ -10,8 +10,11 @@ #include "internal.h" /* - * Unlock the folios in a read operation. We need to set PG_fscache on any + * Unlock the folios in a read operation. We need to set PG_writeback on any * folios we're going to write back before we unlock them. + * + * Note that if the deprecated NETFS_RREQ_USE_PGPRIV2 is set then we use + * PG_private_2 and do a direct write to the cache from here instead. */ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) { @@ -48,14 +51,14 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) xas_for_each(&xas, folio, last_page) { loff_t pg_end; bool pg_failed = false; - bool folio_started; + bool wback_to_cache = false; + bool folio_started = false; if (xas_retry(&xas, folio)) continue; pg_end = folio_pos(folio) + folio_size(folio) - 1; - folio_started = false; for (;;) { loff_t sreq_end; @@ -63,10 +66,16 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) pg_failed = true; break; } - if (!folio_started && test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags)) { - trace_netfs_folio(folio, netfs_folio_trace_copy_to_cache); - folio_start_fscache(folio); - folio_started = true; + if (test_bit(NETFS_RREQ_USE_PGPRIV2, &rreq->flags)) { + if (!folio_started && test_bit(NETFS_SREQ_COPY_TO_CACHE, + &subreq->flags)) { + trace_netfs_folio(folio, netfs_folio_trace_copy_to_cache); + folio_start_fscache(folio); + folio_started = true; + } + } else { + wback_to_cache |= + test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags); } pg_failed |= subreq_failed; sreq_end = subreq->start + subreq->len - 1; @@ -98,6 +107,11 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) kfree(finfo); } folio_mark_uptodate(folio); + if (wback_to_cache && !WARN_ON_ONCE(folio_get_private(folio) != NULL)) { + trace_netfs_folio(folio, netfs_folio_trace_copy_to_cache); + folio_attach_private(folio, NETFS_FOLIO_COPY_TO_CACHE); + filemap_dirty_folio(folio->mapping, folio); + } } if (!test_bit(NETFS_RREQ_DONT_UNLOCK_FOLIOS, &rreq->flags)) { @@ -491,9 +505,11 @@ int netfs_write_begin(struct netfs_inode *ctx, netfs_put_request(rreq, false, netfs_rreq_trace_put_return); have_folio: - ret = folio_wait_fscache_killable(folio); - if (ret < 0) - goto error; + if (test_bit(NETFS_ICTX_USE_PGPRIV2, &ctx->flags)) { + ret = folio_wait_fscache_killable(folio); + if (ret < 0) + goto error; + } have_folio_no_wait: *_folio = folio; _leave(" = 0"); diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index c194655a6dcf..576a68b7887e 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -30,21 +30,13 @@ static void netfs_cleanup_buffered_write(struct netfs_io_request *wreq); static void netfs_set_group(struct folio *folio, struct netfs_group *netfs_group) { - if (netfs_group && !folio_get_private(folio)) - folio_attach_private(folio, netfs_get_group(netfs_group)); -} + void *priv = folio_get_private(folio); -#if IS_ENABLED(CONFIG_FSCACHE) -static void netfs_folio_start_fscache(bool caching, struct folio *folio) -{ - if (caching) - folio_start_fscache(folio); -} -#else -static void netfs_folio_start_fscache(bool caching, struct folio *folio) -{ + if (netfs_group && (!priv || priv == NETFS_FOLIO_COPY_TO_CACHE)) + folio_attach_private(folio, netfs_get_group(netfs_group)); + else if (!netfs_group && priv == NETFS_FOLIO_COPY_TO_CACHE) + folio_detach_private(folio); } -#endif /* * Decide how we should modify a folio. We might be attempting to do @@ -63,11 +55,12 @@ static enum netfs_how_to_modify netfs_how_to_modify(struct netfs_inode *ctx, bool maybe_trouble) { struct netfs_folio *finfo = netfs_folio_info(folio); + struct netfs_group *group = netfs_folio_group(folio); loff_t pos = folio_file_pos(folio); _enter(""); - if (netfs_folio_group(folio) != netfs_group) + if (group != netfs_group && group != NETFS_FOLIO_COPY_TO_CACHE) return NETFS_FLUSH_CONTENT; if (folio_test_uptodate(folio)) @@ -397,9 +390,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, folio_clear_dirty_for_io(folio); /* We make multiple writes to the folio... */ if (!folio_test_writeback(folio)) { - folio_wait_fscache(folio); folio_start_writeback(folio); - folio_start_fscache(folio); if (wreq->iter.count == 0) trace_netfs_folio(folio, netfs_folio_trace_wthru); else @@ -527,6 +518,7 @@ EXPORT_SYMBOL(netfs_file_write_iter); */ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_group) { + struct netfs_group *group; struct folio *folio = page_folio(vmf->page); struct file *file = vmf->vma->vm_file; struct inode *inode = file_inode(file); @@ -549,7 +541,8 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr goto out; } - if (netfs_folio_group(folio) != netfs_group) { + group = netfs_folio_group(folio); + if (group != netfs_group && group != NETFS_FOLIO_COPY_TO_CACHE) { folio_unlock(folio); err = filemap_fdatawait_range(inode->i_mapping, folio_pos(folio), @@ -605,8 +598,6 @@ static void netfs_kill_pages(struct address_space *mapping, trace_netfs_folio(folio, netfs_folio_trace_kill); folio_clear_uptodate(folio); - if (folio_test_fscache(folio)) - folio_end_fscache(folio); folio_end_writeback(folio); folio_lock(folio); generic_error_remove_folio(mapping, folio); @@ -642,8 +633,6 @@ static void netfs_redirty_pages(struct address_space *mapping, next = folio_next_index(folio); trace_netfs_folio(folio, netfs_folio_trace_redirty); filemap_dirty_folio(mapping, folio); - if (folio_test_fscache(folio)) - folio_end_fscache(folio); folio_end_writeback(folio); folio_put(folio); } while (index = next, index <= last); @@ -699,7 +688,11 @@ static void netfs_pages_written_back(struct netfs_io_request *wreq) if (!folio_test_dirty(folio)) { folio_detach_private(folio); gcount++; - trace_netfs_folio(folio, netfs_folio_trace_clear_g); + if (group == NETFS_FOLIO_COPY_TO_CACHE) + trace_netfs_folio(folio, + netfs_folio_trace_end_copy); + else + trace_netfs_folio(folio, netfs_folio_trace_clear_g); } else { trace_netfs_folio(folio, netfs_folio_trace_redirtied); } @@ -723,8 +716,6 @@ static void netfs_pages_written_back(struct netfs_io_request *wreq) trace_netfs_folio(folio, netfs_folio_trace_clear); } end_wb: - if (folio_test_fscache(folio)) - folio_end_fscache(folio); xas_advance(&xas, folio_next_index(folio) - 1); folio_end_writeback(folio); } @@ -794,7 +785,6 @@ static void netfs_extend_writeback(struct address_space *mapping, long *_count, loff_t start, loff_t max_len, - bool caching, size_t *_len, size_t *_top) { @@ -845,8 +835,7 @@ static void netfs_extend_writeback(struct address_space *mapping, break; } if (!folio_test_dirty(folio) || - folio_test_writeback(folio) || - folio_test_fscache(folio)) { + folio_test_writeback(folio)) { folio_unlock(folio); folio_put(folio); xas_reset(xas); @@ -859,7 +848,8 @@ static void netfs_extend_writeback(struct address_space *mapping, if ((const struct netfs_group *)priv != group) { stop = true; finfo = netfs_folio_info(folio); - if (finfo->netfs_group != group || + if (!finfo || + finfo->netfs_group != group || finfo->dirty_offset > 0) { folio_unlock(folio); folio_put(folio); @@ -893,12 +883,14 @@ static void netfs_extend_writeback(struct address_space *mapping, for (i = 0; i < folio_batch_count(&fbatch); i++) { folio = fbatch.folios[i]; - trace_netfs_folio(folio, netfs_folio_trace_store_plus); + if (group == NETFS_FOLIO_COPY_TO_CACHE) + trace_netfs_folio(folio, netfs_folio_trace_copy_plus); + else + trace_netfs_folio(folio, netfs_folio_trace_store_plus); if (!folio_clear_dirty_for_io(folio)) BUG(); folio_start_writeback(folio); - netfs_folio_start_fscache(caching, folio); folio_unlock(folio); } @@ -924,14 +916,14 @@ static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, struct netfs_inode *ctx = netfs_inode(mapping->host); unsigned long long i_size = i_size_read(&ctx->inode); size_t len, max_len; - bool caching = netfs_is_cache_enabled(ctx); long count = wbc->nr_to_write; int ret; - _enter(",%lx,%llx-%llx,%u", folio->index, start, end, caching); + _enter(",%lx,%llx-%llx", folio->index, start, end); wreq = netfs_alloc_request(mapping, NULL, start, folio_size(folio), - NETFS_WRITEBACK); + group == NETFS_FOLIO_COPY_TO_CACHE ? + NETFS_COPY_TO_CACHE : NETFS_WRITEBACK); if (IS_ERR(wreq)) { folio_unlock(folio); return PTR_ERR(wreq); @@ -940,7 +932,6 @@ static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, if (!folio_clear_dirty_for_io(folio)) BUG(); folio_start_writeback(folio); - netfs_folio_start_fscache(caching, folio); count -= folio_nr_pages(folio); @@ -949,7 +940,10 @@ static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, * immediately lockable, is not dirty or is missing, or we reach the * end of the range. */ - trace_netfs_folio(folio, netfs_folio_trace_store); + if (group == NETFS_FOLIO_COPY_TO_CACHE) + trace_netfs_folio(folio, netfs_folio_trace_copy); + else + trace_netfs_folio(folio, netfs_folio_trace_store); len = wreq->len; finfo = netfs_folio_info(folio); @@ -972,7 +966,7 @@ static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, if (len < max_len) netfs_extend_writeback(mapping, group, xas, &count, start, - max_len, caching, &len, &wreq->upper_len); + max_len, &len, &wreq->upper_len); } cant_expand: @@ -996,15 +990,18 @@ static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, iov_iter_xarray(&wreq->iter, ITER_SOURCE, &mapping->i_pages, start, wreq->upper_len); - __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); - ret = netfs_begin_write(wreq, true, netfs_write_trace_writeback); + if (group != NETFS_FOLIO_COPY_TO_CACHE) { + __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); + ret = netfs_begin_write(wreq, true, netfs_write_trace_writeback); + } else { + ret = netfs_begin_write(wreq, true, netfs_write_trace_copy_to_cache); + } if (ret == 0 || ret == -EIOCBQUEUED) wbc->nr_to_write -= len / PAGE_SIZE; } else { _debug("write discard %zx @%llx [%llx]", len, start, i_size); /* The dirty region was entirely beyond the EOF. */ - fscache_clear_page_bits(mapping, start, len, caching); netfs_pages_written_back(wreq); ret = 0; } @@ -1057,9 +1054,11 @@ static ssize_t netfs_writepages_begin(struct address_space *mapping, /* Skip any dirty folio that's not in the group of interest. */ priv = folio_get_private(folio); - if ((const struct netfs_group *)priv != group) { - finfo = netfs_folio_info(folio); - if (finfo->netfs_group != group) { + if ((const struct netfs_group *)priv == NETFS_FOLIO_COPY_TO_CACHE) { + group = NETFS_FOLIO_COPY_TO_CACHE; + } else if ((const struct netfs_group *)priv != group) { + finfo = __netfs_folio_info(priv); + if (!finfo || finfo->netfs_group != group) { folio_put(folio); continue; } @@ -1098,14 +1097,10 @@ static ssize_t netfs_writepages_begin(struct address_space *mapping, goto search_again; } - if (folio_test_writeback(folio) || - folio_test_fscache(folio)) { + if (folio_test_writeback(folio)) { folio_unlock(folio); if (wbc->sync_mode != WB_SYNC_NONE) { folio_wait_writeback(folio); -#ifdef CONFIG_FSCACHE - folio_wait_fscache(folio); -#endif goto lock_again; } @@ -1264,7 +1259,8 @@ int netfs_launder_folio(struct folio *folio) bvec_set_folio(&bvec, folio, len, offset); iov_iter_bvec(&wreq->iter, ITER_SOURCE, &bvec, 1, len); - __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); + if (group != NETFS_FOLIO_COPY_TO_CACHE) + __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); ret = netfs_begin_write(wreq, true, netfs_write_trace_launder); out_put: @@ -1273,7 +1269,6 @@ int netfs_launder_folio(struct folio *folio) kfree(finfo); netfs_put_request(wreq, false, netfs_rreq_trace_put_return); out: - folio_wait_fscache(folio); _leave(" = %d", ret); return ret; } diff --git a/fs/netfs/fscache_io.c b/fs/netfs/fscache_io.c index 43a651ed8264..5028f2ae30da 100644 --- a/fs/netfs/fscache_io.c +++ b/fs/netfs/fscache_io.c @@ -166,6 +166,7 @@ struct fscache_write_request { loff_t start; size_t len; bool set_bits; + bool using_pgpriv2; netfs_io_terminated_t term_func; void *term_func_priv; }; @@ -197,8 +198,9 @@ static void fscache_wreq_done(void *priv, ssize_t transferred_or_error, { struct fscache_write_request *wreq = priv; - fscache_clear_page_bits(wreq->mapping, wreq->start, wreq->len, - wreq->set_bits); + if (wreq->using_pgpriv2) + fscache_clear_page_bits(wreq->mapping, wreq->start, wreq->len, + wreq->set_bits); if (wreq->term_func) wreq->term_func(wreq->term_func_priv, transferred_or_error, @@ -212,7 +214,7 @@ void __fscache_write_to_cache(struct fscache_cookie *cookie, loff_t start, size_t len, loff_t i_size, netfs_io_terminated_t term_func, void *term_func_priv, - bool cond) + bool using_pgpriv2, bool cond) { struct fscache_write_request *wreq; struct netfs_cache_resources *cres; @@ -230,6 +232,7 @@ void __fscache_write_to_cache(struct fscache_cookie *cookie, wreq->mapping = mapping; wreq->start = start; wreq->len = len; + wreq->using_pgpriv2 = using_pgpriv2; wreq->set_bits = cond; wreq->term_func = term_func; wreq->term_func_priv = term_func_priv; @@ -257,7 +260,8 @@ void __fscache_write_to_cache(struct fscache_cookie *cookie, abandon_free: kfree(wreq); abandon: - fscache_clear_page_bits(mapping, start, len, cond); + if (using_pgpriv2) + fscache_clear_page_bits(mapping, start, len, cond); if (term_func) term_func(term_func_priv, ret, false); } diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h index ec7045d24400..156ab138e224 100644 --- a/fs/netfs/internal.h +++ b/fs/netfs/internal.h @@ -168,7 +168,7 @@ static inline bool netfs_is_cache_enabled(struct netfs_inode *ctx) */ static inline struct netfs_group *netfs_get_group(struct netfs_group *netfs_group) { - if (netfs_group) + if (netfs_group && netfs_group != NETFS_FOLIO_COPY_TO_CACHE) refcount_inc(&netfs_group->ref); return netfs_group; } @@ -178,7 +178,9 @@ static inline struct netfs_group *netfs_get_group(struct netfs_group *netfs_grou */ static inline void netfs_put_group(struct netfs_group *netfs_group) { - if (netfs_group && refcount_dec_and_test(&netfs_group->ref)) + if (netfs_group && + netfs_group != NETFS_FOLIO_COPY_TO_CACHE && + refcount_dec_and_test(&netfs_group->ref)) netfs_group->free(netfs_group); } @@ -187,7 +189,9 @@ static inline void netfs_put_group(struct netfs_group *netfs_group) */ static inline void netfs_put_group_many(struct netfs_group *netfs_group, int nr) { - if (netfs_group && refcount_sub_and_test(nr, &netfs_group->ref)) + if (netfs_group && + netfs_group != NETFS_FOLIO_COPY_TO_CACHE && + refcount_sub_and_test(nr, &netfs_group->ref)) netfs_group->free(netfs_group); } diff --git a/fs/netfs/io.c b/fs/netfs/io.c index 4261ad6c55b6..b3b9827a9709 100644 --- a/fs/netfs/io.c +++ b/fs/netfs/io.c @@ -99,8 +99,9 @@ static void netfs_rreq_completed(struct netfs_io_request *rreq, bool was_async) } /* - * Deal with the completion of writing the data to the cache. We have to clear - * the PG_fscache bits on the folios involved and release the caller's ref. + * [DEPRECATED] Deal with the completion of writing the data to the cache. We + * have to clear the PG_fscache bits on the folios involved and release the + * caller's ref. * * May be called in softirq mode and we inherit a ref from the caller. */ @@ -138,7 +139,7 @@ static void netfs_rreq_unmark_after_write(struct netfs_io_request *rreq, } static void netfs_rreq_copy_terminated(void *priv, ssize_t transferred_or_error, - bool was_async) + bool was_async) /* [DEPRECATED] */ { struct netfs_io_subrequest *subreq = priv; struct netfs_io_request *rreq = subreq->rreq; @@ -161,8 +162,8 @@ static void netfs_rreq_copy_terminated(void *priv, ssize_t transferred_or_error, } /* - * Perform any outstanding writes to the cache. We inherit a ref from the - * caller. + * [DEPRECATED] Perform any outstanding writes to the cache. We inherit a ref + * from the caller. */ static void netfs_rreq_do_write_to_cache(struct netfs_io_request *rreq) { @@ -222,7 +223,7 @@ static void netfs_rreq_do_write_to_cache(struct netfs_io_request *rreq) netfs_rreq_unmark_after_write(rreq, false); } -static void netfs_rreq_write_to_cache_work(struct work_struct *work) +static void netfs_rreq_write_to_cache_work(struct work_struct *work) /* [DEPRECATED] */ { struct netfs_io_request *rreq = container_of(work, struct netfs_io_request, work); @@ -230,7 +231,7 @@ static void netfs_rreq_write_to_cache_work(struct work_struct *work) netfs_rreq_do_write_to_cache(rreq); } -static void netfs_rreq_write_to_cache(struct netfs_io_request *rreq) +static void netfs_rreq_write_to_cache(struct netfs_io_request *rreq) /* [DEPRECATED] */ { rreq->work.func = netfs_rreq_write_to_cache_work; if (!queue_work(system_unbound_wq, &rreq->work)) @@ -409,7 +410,8 @@ static void netfs_rreq_assess(struct netfs_io_request *rreq, bool was_async) clear_bit_unlock(NETFS_RREQ_IN_PROGRESS, &rreq->flags); wake_up_bit(&rreq->flags, NETFS_RREQ_IN_PROGRESS); - if (test_bit(NETFS_RREQ_COPY_TO_CACHE, &rreq->flags)) + if (test_bit(NETFS_RREQ_COPY_TO_CACHE, &rreq->flags) && + test_bit(NETFS_RREQ_USE_PGPRIV2, &rreq->flags)) return netfs_rreq_write_to_cache(rreq); netfs_rreq_completed(rreq, was_async); diff --git a/fs/netfs/main.c b/fs/netfs/main.c index 5e77618a7940..c5a73c9ed126 100644 --- a/fs/netfs/main.c +++ b/fs/netfs/main.c @@ -31,6 +31,7 @@ static const char *netfs_origins[nr__netfs_io_origin] = { [NETFS_READAHEAD] = "RA", [NETFS_READPAGE] = "RP", [NETFS_READ_FOR_WRITE] = "RW", + [NETFS_COPY_TO_CACHE] = "CC", [NETFS_WRITEBACK] = "WB", [NETFS_WRITETHROUGH] = "WT", [NETFS_LAUNDER_WRITE] = "LW", diff --git a/fs/netfs/misc.c b/fs/netfs/misc.c index 90051ced8e2a..bc1fc54fb724 100644 --- a/fs/netfs/misc.c +++ b/fs/netfs/misc.c @@ -177,13 +177,11 @@ EXPORT_SYMBOL(netfs_clear_inode_writeback); */ void netfs_invalidate_folio(struct folio *folio, size_t offset, size_t length) { - struct netfs_folio *finfo = NULL; + struct netfs_folio *finfo; size_t flen = folio_size(folio); _enter("{%lx},%zx,%zx", folio->index, offset, length); - folio_wait_fscache(folio); - if (!folio_test_private(folio)) return; @@ -248,12 +246,6 @@ bool netfs_release_folio(struct folio *folio, gfp_t gfp) if (folio_test_private(folio)) return false; - if (folio_test_fscache(folio)) { - if (current_is_kswapd() || !(gfp & __GFP_FS)) - return false; - folio_wait_fscache(folio); - } - fscache_note_page_release(netfs_i_cookie(ctx)); return true; } diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c index 610ceb5bd86c..72b52f070270 100644 --- a/fs/netfs/objects.c +++ b/fs/netfs/objects.c @@ -45,8 +45,12 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping, refcount_set(&rreq->ref, 1); __set_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags); - if (cached) + if (cached) { __set_bit(NETFS_RREQ_WRITE_TO_CACHE, &rreq->flags); + if (test_bit(NETFS_ICTX_USE_PGPRIV2, &ctx->flags)) + /* Filesystem uses deprecated PG_private_2 marking. */ + __set_bit(NETFS_RREQ_USE_PGPRIV2, &rreq->flags); + } if (file && file->f_flags & O_NONBLOCK) __set_bit(NETFS_RREQ_NONBLOCK, &rreq->flags); if (rreq->netfs_ops->init_request) { diff --git a/fs/nfs/fscache.h b/fs/nfs/fscache.h index e3cb4923316b..814363d1d7c7 100644 --- a/fs/nfs/fscache.h +++ b/fs/nfs/fscache.h @@ -81,6 +81,8 @@ static inline void nfs_netfs_put(struct nfs_netfs_io_data *netfs) static inline void nfs_netfs_inode_init(struct nfs_inode *nfsi) { netfs_inode_init(&nfsi->netfs, &nfs_netfs_ops, false); + /* [DEPRECATED] Use PG_private_2 to mark folio being written to the cache. */ + __set_bit(NETFS_ICTX_USE_PGPRIV2, &nfsi->netfs.flags); } extern void nfs_netfs_initiate_read(struct nfs_pgio_header *hdr); extern void nfs_netfs_read_completion(struct nfs_pgio_header *hdr); diff --git a/include/linux/fscache.h b/include/linux/fscache.h index 6e8562cbcc43..9de27643607f 100644 --- a/include/linux/fscache.h +++ b/include/linux/fscache.h @@ -172,9 +172,12 @@ extern void __fscache_invalidate(struct fscache_cookie *, const void *, loff_t, extern int __fscache_begin_read_operation(struct netfs_cache_resources *, struct fscache_cookie *); extern int __fscache_begin_write_operation(struct netfs_cache_resources *, struct fscache_cookie *); -extern void __fscache_write_to_cache(struct fscache_cookie *, struct address_space *, - loff_t, size_t, loff_t, netfs_io_terminated_t, void *, - bool); +void __fscache_write_to_cache(struct fscache_cookie *cookie, + struct address_space *mapping, + loff_t start, size_t len, loff_t i_size, + netfs_io_terminated_t term_func, + void *term_func_priv, + bool using_pgpriv2, bool cond); extern void __fscache_clear_page_bits(struct address_space *, loff_t, size_t); /** @@ -597,7 +600,8 @@ static inline void fscache_clear_page_bits(struct address_space *mapping, * @i_size: The new size of the inode * @term_func: The function to call upon completion * @term_func_priv: The private data for @term_func - * @caching: If PG_fscache has been set + * @using_pgpriv2: If we're using PG_private_2 to mark in-progress write + * @caching: If we actually want to do the caching * * Helper function for a netfs to write dirty data from an inode into the cache * object that's backing it. @@ -608,19 +612,21 @@ static inline void fscache_clear_page_bits(struct address_space *mapping, * marked with PG_fscache. * * If given, @term_func will be called upon completion and supplied with - * @term_func_priv. Note that the PG_fscache flags will have been cleared by - * this point, so the netfs must retain its own pin on the mapping. + * @term_func_priv. Note that if @using_pgpriv2 is set, the PG_private_2 flags + * will have been cleared by this point, so the netfs must retain its own pin + * on the mapping. */ static inline void fscache_write_to_cache(struct fscache_cookie *cookie, struct address_space *mapping, loff_t start, size_t len, loff_t i_size, netfs_io_terminated_t term_func, void *term_func_priv, - bool caching) + bool using_pgpriv2, bool caching) { if (caching) __fscache_write_to_cache(cookie, mapping, start, len, i_size, - term_func, term_func_priv, caching); + term_func, term_func_priv, + using_pgpriv2, caching); else if (term_func) term_func(term_func_priv, -ENOBUFS, false); diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 100cbb261269..f5e9c5f84a0c 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -143,6 +143,8 @@ struct netfs_inode { #define NETFS_ICTX_UNBUFFERED 1 /* I/O should not use the pagecache */ #define NETFS_ICTX_WRITETHROUGH 2 /* Write-through caching */ #define NETFS_ICTX_NO_WRITE_STREAMING 3 /* Don't engage in write-streaming */ +#define NETFS_ICTX_USE_PGPRIV2 31 /* [DEPRECATED] Use PG_private_2 to mark + * write to cache on read */ }; /* @@ -165,16 +167,25 @@ struct netfs_folio { unsigned int dirty_len; /* Write-streaming dirty data length */ }; #define NETFS_FOLIO_INFO 0x1UL /* OR'd with folio->private. */ +#define NETFS_FOLIO_COPY_TO_CACHE ((struct netfs_group *)0x356UL) /* Write to the cache only */ -static inline struct netfs_folio *netfs_folio_info(struct folio *folio) +static inline bool netfs_is_folio_info(const void *priv) { - void *priv = folio_get_private(folio); + return (unsigned long)priv & NETFS_FOLIO_INFO; +} - if ((unsigned long)priv & NETFS_FOLIO_INFO) +static inline struct netfs_folio *__netfs_folio_info(const void *priv) +{ + if (netfs_is_folio_info(priv)) return (struct netfs_folio *)((unsigned long)priv & ~NETFS_FOLIO_INFO); return NULL; } +static inline struct netfs_folio *netfs_folio_info(struct folio *folio) +{ + return __netfs_folio_info(folio_get_private(folio)); +} + static inline struct netfs_group *netfs_folio_group(struct folio *folio) { struct netfs_folio *finfo; @@ -230,6 +241,7 @@ enum netfs_io_origin { NETFS_READAHEAD, /* This read was triggered by readahead */ NETFS_READPAGE, /* This read is a synchronous read */ NETFS_READ_FOR_WRITE, /* This read is to prepare a write */ + NETFS_COPY_TO_CACHE, /* This write is to copy a read to the cache */ NETFS_WRITEBACK, /* This write was triggered by writepages */ NETFS_WRITETHROUGH, /* This write was made by netfs_perform_write() */ NETFS_LAUNDER_WRITE, /* This is triggered by ->launder_folio() */ @@ -287,6 +299,8 @@ struct netfs_io_request { #define NETFS_RREQ_UPLOAD_TO_SERVER 8 /* Need to write to the server */ #define NETFS_RREQ_NONBLOCK 9 /* Don't block if possible (O_NONBLOCK) */ #define NETFS_RREQ_BLOCKED 10 /* We blocked */ +#define NETFS_RREQ_USE_PGPRIV2 31 /* [DEPRECATED] Use PG_private_2 to mark + * write to cache on read */ const struct netfs_request_ops *netfs_ops; void (*cleanup)(struct netfs_io_request *req); }; diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index 447a8c21cf57..e03fafb0c1e3 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -24,6 +24,7 @@ E_(netfs_read_trace_write_begin, "WRITEBEGN") #define netfs_write_traces \ + EM(netfs_write_trace_copy_to_cache, "COPY2CACH") \ EM(netfs_write_trace_dio_write, "DIO-WRITE") \ EM(netfs_write_trace_launder, "LAUNDER ") \ EM(netfs_write_trace_unbuffered_write, "UNB-WRITE") \ @@ -34,6 +35,7 @@ EM(NETFS_READAHEAD, "RA") \ EM(NETFS_READPAGE, "RP") \ EM(NETFS_READ_FOR_WRITE, "RW") \ + EM(NETFS_COPY_TO_CACHE, "CC") \ EM(NETFS_WRITEBACK, "WB") \ EM(NETFS_WRITETHROUGH, "WT") \ EM(NETFS_LAUNDER_WRITE, "LW") \ @@ -127,7 +129,9 @@ EM(netfs_folio_trace_clear, "clear") \ EM(netfs_folio_trace_clear_s, "clear-s") \ EM(netfs_folio_trace_clear_g, "clear-g") \ - EM(netfs_folio_trace_copy_to_cache, "copy") \ + EM(netfs_folio_trace_copy, "copy") \ + EM(netfs_folio_trace_copy_plus, "copy+") \ + EM(netfs_folio_trace_copy_to_cache, "mark-copy") \ EM(netfs_folio_trace_end_copy, "end-copy") \ EM(netfs_folio_trace_filled_gaps, "filled-gaps") \ EM(netfs_folio_trace_kill, "kill") \
When dirty data is being written to the cache, setting/waiting on/clearing the fscache flag is always done in tandem with setting/waiting on/clearing the writeback flag. The netfslib buffered write routines wait on and set both flags and the write request cleanup clears both flags, so the fscache flag is almost superfluous. The reason it isn't superfluous is because the fscache flag is also used to indicate that data just read from the server is being written to the cache. The flag is used to prevent a race involving overlapping direct-I/O writes to the cache. Change this to indicate that a page is in need of being copied to the cache by placing a magic value in folio->private and marking the folios dirty. Then when the writeback code sees a folio marked in this way, it only writes it to the cache and not to the server. If a folio that has this magic value set is modified, the value is just replaced and the folio will then be uplodaded too. With this, PG_fscache is no longer required by the netfslib core, 9p and afs. Ceph and nfs, however, still need to use the old PG_fscache-based tracking. To deal with this, a flag, NETFS_ICTX_USE_PGPRIV2, now has to be set on the flags in the netfs_inode struct for those filesystems. This reenables the use of PG_fscache in that inode. 9p and afs use the netfslib write helpers so get switched over; cifs, for the moment, does page-by-page manual access to the cache, so doesn't use PG_fscache and is unaffected. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Matthew Wilcox (Oracle) <willy@infradead.org> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Ilya Dryomov <idryomov@gmail.com> cc: Xiubo Li <xiubli@redhat.com> cc: Steve French <sfrench@samba.org> cc: Paulo Alcantara <pc@manguebit.com> cc: Ronnie Sahlberg <ronniesahlberg@gmail.com> cc: Shyam Prasad N <sprasad@microsoft.com> cc: Tom Talpey <tom@talpey.com> cc: Bharath SM <bharathsm@microsoft.com> cc: Trond Myklebust <trond.myklebust@hammerspace.com> cc: Anna Schumaker <anna@kernel.org> cc: netfs@lists.linux.dev cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: ceph-devel@vger.kernel.org cc: linux-cifs@vger.kernel.org cc: linux-nfs@vger.kernel.org cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/ceph/addr.c | 2 +- fs/ceph/inode.c | 2 + fs/netfs/buffered_read.c | 36 ++++++++++---- fs/netfs/buffered_write.c | 93 +++++++++++++++++------------------- fs/netfs/fscache_io.c | 12 +++-- fs/netfs/internal.h | 10 ++-- fs/netfs/io.c | 18 +++---- fs/netfs/main.c | 1 + fs/netfs/misc.c | 10 +--- fs/netfs/objects.c | 6 ++- fs/nfs/fscache.h | 2 + include/linux/fscache.h | 22 +++++---- include/linux/netfs.h | 20 ++++++-- include/trace/events/netfs.h | 6 ++- 14 files changed, 143 insertions(+), 97 deletions(-) diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 1340d77124ae..57cbae134b37 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -517,7 +517,7 @@ static void ceph_fscache_write_to_cache(struct inode *inode, u64 off, u64 len, b struct fscache_cookie *cookie = ceph_fscache_cookie(ci); fscache_write_to_cache(cookie, inode->i_mapping, off, len, i_size_read(inode), - ceph_fscache_write_terminated, inode, caching); + ceph_fscache_write_terminated, inode, true, caching); } #else static inline void ceph_set_page_fscache(struct page *page) diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 7b2e77517f23..99561fddcb38 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -577,6 +577,8 @@ struct inode *ceph_alloc_inode(struct super_block *sb) /* Set parameters for the netfs library */ netfs_inode_init(&ci->netfs, &ceph_netfs_ops, false); + /* [DEPRECATED] Use PG_private_2 to mark folio being written to the cache. */ + __set_bit(NETFS_ICTX_USE_PGPRIV2, &ci->netfs.flags); spin_lock_init(&ci->i_ceph_lock); diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c index 3298c29b5548..6d49319c82c6 100644 --- a/fs/netfs/buffered_read.c +++ b/fs/netfs/buffered_read.c @@ -10,8 +10,11 @@ #include "internal.h" /* - * Unlock the folios in a read operation. We need to set PG_fscache on any + * Unlock the folios in a read operation. We need to set PG_writeback on any * folios we're going to write back before we unlock them. + * + * Note that if the deprecated NETFS_RREQ_USE_PGPRIV2 is set then we use + * PG_private_2 and do a direct write to the cache from here instead. */ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) { @@ -48,14 +51,14 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) xas_for_each(&xas, folio, last_page) { loff_t pg_end; bool pg_failed = false; - bool folio_started; + bool wback_to_cache = false; + bool folio_started = false; if (xas_retry(&xas, folio)) continue; pg_end = folio_pos(folio) + folio_size(folio) - 1; - folio_started = false; for (;;) { loff_t sreq_end; @@ -63,10 +66,16 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) pg_failed = true; break; } - if (!folio_started && test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags)) { - trace_netfs_folio(folio, netfs_folio_trace_copy_to_cache); - folio_start_fscache(folio); - folio_started = true; + if (test_bit(NETFS_RREQ_USE_PGPRIV2, &rreq->flags)) { + if (!folio_started && test_bit(NETFS_SREQ_COPY_TO_CACHE, + &subreq->flags)) { + trace_netfs_folio(folio, netfs_folio_trace_copy_to_cache); + folio_start_fscache(folio); + folio_started = true; + } + } else { + wback_to_cache |= + test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags); } pg_failed |= subreq_failed; sreq_end = subreq->start + subreq->len - 1; @@ -98,6 +107,11 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq) kfree(finfo); } folio_mark_uptodate(folio); + if (wback_to_cache && !WARN_ON_ONCE(folio_get_private(folio) != NULL)) { + trace_netfs_folio(folio, netfs_folio_trace_copy_to_cache); + folio_attach_private(folio, NETFS_FOLIO_COPY_TO_CACHE); + filemap_dirty_folio(folio->mapping, folio); + } } if (!test_bit(NETFS_RREQ_DONT_UNLOCK_FOLIOS, &rreq->flags)) { @@ -491,9 +505,11 @@ int netfs_write_begin(struct netfs_inode *ctx, netfs_put_request(rreq, false, netfs_rreq_trace_put_return); have_folio: - ret = folio_wait_fscache_killable(folio); - if (ret < 0) - goto error; + if (test_bit(NETFS_ICTX_USE_PGPRIV2, &ctx->flags)) { + ret = folio_wait_fscache_killable(folio); + if (ret < 0) + goto error; + } have_folio_no_wait: *_folio = folio; _leave(" = 0"); diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index c194655a6dcf..576a68b7887e 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -30,21 +30,13 @@ static void netfs_cleanup_buffered_write(struct netfs_io_request *wreq); static void netfs_set_group(struct folio *folio, struct netfs_group *netfs_group) { - if (netfs_group && !folio_get_private(folio)) - folio_attach_private(folio, netfs_get_group(netfs_group)); -} + void *priv = folio_get_private(folio); -#if IS_ENABLED(CONFIG_FSCACHE) -static void netfs_folio_start_fscache(bool caching, struct folio *folio) -{ - if (caching) - folio_start_fscache(folio); -} -#else -static void netfs_folio_start_fscache(bool caching, struct folio *folio) -{ + if (netfs_group && (!priv || priv == NETFS_FOLIO_COPY_TO_CACHE)) + folio_attach_private(folio, netfs_get_group(netfs_group)); + else if (!netfs_group && priv == NETFS_FOLIO_COPY_TO_CACHE) + folio_detach_private(folio); } -#endif /* * Decide how we should modify a folio. We might be attempting to do @@ -63,11 +55,12 @@ static enum netfs_how_to_modify netfs_how_to_modify(struct netfs_inode *ctx, bool maybe_trouble) { struct netfs_folio *finfo = netfs_folio_info(folio); + struct netfs_group *group = netfs_folio_group(folio); loff_t pos = folio_file_pos(folio); _enter(""); - if (netfs_folio_group(folio) != netfs_group) + if (group != netfs_group && group != NETFS_FOLIO_COPY_TO_CACHE) return NETFS_FLUSH_CONTENT; if (folio_test_uptodate(folio)) @@ -397,9 +390,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, folio_clear_dirty_for_io(folio); /* We make multiple writes to the folio... */ if (!folio_test_writeback(folio)) { - folio_wait_fscache(folio); folio_start_writeback(folio); - folio_start_fscache(folio); if (wreq->iter.count == 0) trace_netfs_folio(folio, netfs_folio_trace_wthru); else @@ -527,6 +518,7 @@ EXPORT_SYMBOL(netfs_file_write_iter); */ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_group) { + struct netfs_group *group; struct folio *folio = page_folio(vmf->page); struct file *file = vmf->vma->vm_file; struct inode *inode = file_inode(file); @@ -549,7 +541,8 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr goto out; } - if (netfs_folio_group(folio) != netfs_group) { + group = netfs_folio_group(folio); + if (group != netfs_group && group != NETFS_FOLIO_COPY_TO_CACHE) { folio_unlock(folio); err = filemap_fdatawait_range(inode->i_mapping, folio_pos(folio), @@ -605,8 +598,6 @@ static void netfs_kill_pages(struct address_space *mapping, trace_netfs_folio(folio, netfs_folio_trace_kill); folio_clear_uptodate(folio); - if (folio_test_fscache(folio)) - folio_end_fscache(folio); folio_end_writeback(folio); folio_lock(folio); generic_error_remove_folio(mapping, folio); @@ -642,8 +633,6 @@ static void netfs_redirty_pages(struct address_space *mapping, next = folio_next_index(folio); trace_netfs_folio(folio, netfs_folio_trace_redirty); filemap_dirty_folio(mapping, folio); - if (folio_test_fscache(folio)) - folio_end_fscache(folio); folio_end_writeback(folio); folio_put(folio); } while (index = next, index <= last); @@ -699,7 +688,11 @@ static void netfs_pages_written_back(struct netfs_io_request *wreq) if (!folio_test_dirty(folio)) { folio_detach_private(folio); gcount++; - trace_netfs_folio(folio, netfs_folio_trace_clear_g); + if (group == NETFS_FOLIO_COPY_TO_CACHE) + trace_netfs_folio(folio, + netfs_folio_trace_end_copy); + else + trace_netfs_folio(folio, netfs_folio_trace_clear_g); } else { trace_netfs_folio(folio, netfs_folio_trace_redirtied); } @@ -723,8 +716,6 @@ static void netfs_pages_written_back(struct netfs_io_request *wreq) trace_netfs_folio(folio, netfs_folio_trace_clear); } end_wb: - if (folio_test_fscache(folio)) - folio_end_fscache(folio); xas_advance(&xas, folio_next_index(folio) - 1); folio_end_writeback(folio); } @@ -794,7 +785,6 @@ static void netfs_extend_writeback(struct address_space *mapping, long *_count, loff_t start, loff_t max_len, - bool caching, size_t *_len, size_t *_top) { @@ -845,8 +835,7 @@ static void netfs_extend_writeback(struct address_space *mapping, break; } if (!folio_test_dirty(folio) || - folio_test_writeback(folio) || - folio_test_fscache(folio)) { + folio_test_writeback(folio)) { folio_unlock(folio); folio_put(folio); xas_reset(xas); @@ -859,7 +848,8 @@ static void netfs_extend_writeback(struct address_space *mapping, if ((const struct netfs_group *)priv != group) { stop = true; finfo = netfs_folio_info(folio); - if (finfo->netfs_group != group || + if (!finfo || + finfo->netfs_group != group || finfo->dirty_offset > 0) { folio_unlock(folio); folio_put(folio); @@ -893,12 +883,14 @@ static void netfs_extend_writeback(struct address_space *mapping, for (i = 0; i < folio_batch_count(&fbatch); i++) { folio = fbatch.folios[i]; - trace_netfs_folio(folio, netfs_folio_trace_store_plus); + if (group == NETFS_FOLIO_COPY_TO_CACHE) + trace_netfs_folio(folio, netfs_folio_trace_copy_plus); + else + trace_netfs_folio(folio, netfs_folio_trace_store_plus); if (!folio_clear_dirty_for_io(folio)) BUG(); folio_start_writeback(folio); - netfs_folio_start_fscache(caching, folio); folio_unlock(folio); } @@ -924,14 +916,14 @@ static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, struct netfs_inode *ctx = netfs_inode(mapping->host); unsigned long long i_size = i_size_read(&ctx->inode); size_t len, max_len; - bool caching = netfs_is_cache_enabled(ctx); long count = wbc->nr_to_write; int ret; - _enter(",%lx,%llx-%llx,%u", folio->index, start, end, caching); + _enter(",%lx,%llx-%llx", folio->index, start, end); wreq = netfs_alloc_request(mapping, NULL, start, folio_size(folio), - NETFS_WRITEBACK); + group == NETFS_FOLIO_COPY_TO_CACHE ? + NETFS_COPY_TO_CACHE : NETFS_WRITEBACK); if (IS_ERR(wreq)) { folio_unlock(folio); return PTR_ERR(wreq); @@ -940,7 +932,6 @@ static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, if (!folio_clear_dirty_for_io(folio)) BUG(); folio_start_writeback(folio); - netfs_folio_start_fscache(caching, folio); count -= folio_nr_pages(folio); @@ -949,7 +940,10 @@ static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, * immediately lockable, is not dirty or is missing, or we reach the * end of the range. */ - trace_netfs_folio(folio, netfs_folio_trace_store); + if (group == NETFS_FOLIO_COPY_TO_CACHE) + trace_netfs_folio(folio, netfs_folio_trace_copy); + else + trace_netfs_folio(folio, netfs_folio_trace_store); len = wreq->len; finfo = netfs_folio_info(folio); @@ -972,7 +966,7 @@ static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, if (len < max_len) netfs_extend_writeback(mapping, group, xas, &count, start, - max_len, caching, &len, &wreq->upper_len); + max_len, &len, &wreq->upper_len); } cant_expand: @@ -996,15 +990,18 @@ static ssize_t netfs_write_back_from_locked_folio(struct address_space *mapping, iov_iter_xarray(&wreq->iter, ITER_SOURCE, &mapping->i_pages, start, wreq->upper_len); - __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); - ret = netfs_begin_write(wreq, true, netfs_write_trace_writeback); + if (group != NETFS_FOLIO_COPY_TO_CACHE) { + __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); + ret = netfs_begin_write(wreq, true, netfs_write_trace_writeback); + } else { + ret = netfs_begin_write(wreq, true, netfs_write_trace_copy_to_cache); + } if (ret == 0 || ret == -EIOCBQUEUED) wbc->nr_to_write -= len / PAGE_SIZE; } else { _debug("write discard %zx @%llx [%llx]", len, start, i_size); /* The dirty region was entirely beyond the EOF. */ - fscache_clear_page_bits(mapping, start, len, caching); netfs_pages_written_back(wreq); ret = 0; } @@ -1057,9 +1054,11 @@ static ssize_t netfs_writepages_begin(struct address_space *mapping, /* Skip any dirty folio that's not in the group of interest. */ priv = folio_get_private(folio); - if ((const struct netfs_group *)priv != group) { - finfo = netfs_folio_info(folio); - if (finfo->netfs_group != group) { + if ((const struct netfs_group *)priv == NETFS_FOLIO_COPY_TO_CACHE) { + group = NETFS_FOLIO_COPY_TO_CACHE; + } else if ((const struct netfs_group *)priv != group) { + finfo = __netfs_folio_info(priv); + if (!finfo || finfo->netfs_group != group) { folio_put(folio); continue; } @@ -1098,14 +1097,10 @@ static ssize_t netfs_writepages_begin(struct address_space *mapping, goto search_again; } - if (folio_test_writeback(folio) || - folio_test_fscache(folio)) { + if (folio_test_writeback(folio)) { folio_unlock(folio); if (wbc->sync_mode != WB_SYNC_NONE) { folio_wait_writeback(folio); -#ifdef CONFIG_FSCACHE - folio_wait_fscache(folio); -#endif goto lock_again; } @@ -1264,7 +1259,8 @@ int netfs_launder_folio(struct folio *folio) bvec_set_folio(&bvec, folio, len, offset); iov_iter_bvec(&wreq->iter, ITER_SOURCE, &bvec, 1, len); - __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); + if (group != NETFS_FOLIO_COPY_TO_CACHE) + __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); ret = netfs_begin_write(wreq, true, netfs_write_trace_launder); out_put: @@ -1273,7 +1269,6 @@ int netfs_launder_folio(struct folio *folio) kfree(finfo); netfs_put_request(wreq, false, netfs_rreq_trace_put_return); out: - folio_wait_fscache(folio); _leave(" = %d", ret); return ret; } diff --git a/fs/netfs/fscache_io.c b/fs/netfs/fscache_io.c index 43a651ed8264..5028f2ae30da 100644 --- a/fs/netfs/fscache_io.c +++ b/fs/netfs/fscache_io.c @@ -166,6 +166,7 @@ struct fscache_write_request { loff_t start; size_t len; bool set_bits; + bool using_pgpriv2; netfs_io_terminated_t term_func; void *term_func_priv; }; @@ -197,8 +198,9 @@ static void fscache_wreq_done(void *priv, ssize_t transferred_or_error, { struct fscache_write_request *wreq = priv; - fscache_clear_page_bits(wreq->mapping, wreq->start, wreq->len, - wreq->set_bits); + if (wreq->using_pgpriv2) + fscache_clear_page_bits(wreq->mapping, wreq->start, wreq->len, + wreq->set_bits); if (wreq->term_func) wreq->term_func(wreq->term_func_priv, transferred_or_error, @@ -212,7 +214,7 @@ void __fscache_write_to_cache(struct fscache_cookie *cookie, loff_t start, size_t len, loff_t i_size, netfs_io_terminated_t term_func, void *term_func_priv, - bool cond) + bool using_pgpriv2, bool cond) { struct fscache_write_request *wreq; struct netfs_cache_resources *cres; @@ -230,6 +232,7 @@ void __fscache_write_to_cache(struct fscache_cookie *cookie, wreq->mapping = mapping; wreq->start = start; wreq->len = len; + wreq->using_pgpriv2 = using_pgpriv2; wreq->set_bits = cond; wreq->term_func = term_func; wreq->term_func_priv = term_func_priv; @@ -257,7 +260,8 @@ void __fscache_write_to_cache(struct fscache_cookie *cookie, abandon_free: kfree(wreq); abandon: - fscache_clear_page_bits(mapping, start, len, cond); + if (using_pgpriv2) + fscache_clear_page_bits(mapping, start, len, cond); if (term_func) term_func(term_func_priv, ret, false); } diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h index ec7045d24400..156ab138e224 100644 --- a/fs/netfs/internal.h +++ b/fs/netfs/internal.h @@ -168,7 +168,7 @@ static inline bool netfs_is_cache_enabled(struct netfs_inode *ctx) */ static inline struct netfs_group *netfs_get_group(struct netfs_group *netfs_group) { - if (netfs_group) + if (netfs_group && netfs_group != NETFS_FOLIO_COPY_TO_CACHE) refcount_inc(&netfs_group->ref); return netfs_group; } @@ -178,7 +178,9 @@ static inline struct netfs_group *netfs_get_group(struct netfs_group *netfs_grou */ static inline void netfs_put_group(struct netfs_group *netfs_group) { - if (netfs_group && refcount_dec_and_test(&netfs_group->ref)) + if (netfs_group && + netfs_group != NETFS_FOLIO_COPY_TO_CACHE && + refcount_dec_and_test(&netfs_group->ref)) netfs_group->free(netfs_group); } @@ -187,7 +189,9 @@ static inline void netfs_put_group(struct netfs_group *netfs_group) */ static inline void netfs_put_group_many(struct netfs_group *netfs_group, int nr) { - if (netfs_group && refcount_sub_and_test(nr, &netfs_group->ref)) + if (netfs_group && + netfs_group != NETFS_FOLIO_COPY_TO_CACHE && + refcount_sub_and_test(nr, &netfs_group->ref)) netfs_group->free(netfs_group); } diff --git a/fs/netfs/io.c b/fs/netfs/io.c index 4261ad6c55b6..b3b9827a9709 100644 --- a/fs/netfs/io.c +++ b/fs/netfs/io.c @@ -99,8 +99,9 @@ static void netfs_rreq_completed(struct netfs_io_request *rreq, bool was_async) } /* - * Deal with the completion of writing the data to the cache. We have to clear - * the PG_fscache bits on the folios involved and release the caller's ref. + * [DEPRECATED] Deal with the completion of writing the data to the cache. We + * have to clear the PG_fscache bits on the folios involved and release the + * caller's ref. * * May be called in softirq mode and we inherit a ref from the caller. */ @@ -138,7 +139,7 @@ static void netfs_rreq_unmark_after_write(struct netfs_io_request *rreq, } static void netfs_rreq_copy_terminated(void *priv, ssize_t transferred_or_error, - bool was_async) + bool was_async) /* [DEPRECATED] */ { struct netfs_io_subrequest *subreq = priv; struct netfs_io_request *rreq = subreq->rreq; @@ -161,8 +162,8 @@ static void netfs_rreq_copy_terminated(void *priv, ssize_t transferred_or_error, } /* - * Perform any outstanding writes to the cache. We inherit a ref from the - * caller. + * [DEPRECATED] Perform any outstanding writes to the cache. We inherit a ref + * from the caller. */ static void netfs_rreq_do_write_to_cache(struct netfs_io_request *rreq) { @@ -222,7 +223,7 @@ static void netfs_rreq_do_write_to_cache(struct netfs_io_request *rreq) netfs_rreq_unmark_after_write(rreq, false); } -static void netfs_rreq_write_to_cache_work(struct work_struct *work) +static void netfs_rreq_write_to_cache_work(struct work_struct *work) /* [DEPRECATED] */ { struct netfs_io_request *rreq = container_of(work, struct netfs_io_request, work); @@ -230,7 +231,7 @@ static void netfs_rreq_write_to_cache_work(struct work_struct *work) netfs_rreq_do_write_to_cache(rreq); } -static void netfs_rreq_write_to_cache(struct netfs_io_request *rreq) +static void netfs_rreq_write_to_cache(struct netfs_io_request *rreq) /* [DEPRECATED] */ { rreq->work.func = netfs_rreq_write_to_cache_work; if (!queue_work(system_unbound_wq, &rreq->work)) @@ -409,7 +410,8 @@ static void netfs_rreq_assess(struct netfs_io_request *rreq, bool was_async) clear_bit_unlock(NETFS_RREQ_IN_PROGRESS, &rreq->flags); wake_up_bit(&rreq->flags, NETFS_RREQ_IN_PROGRESS); - if (test_bit(NETFS_RREQ_COPY_TO_CACHE, &rreq->flags)) + if (test_bit(NETFS_RREQ_COPY_TO_CACHE, &rreq->flags) && + test_bit(NETFS_RREQ_USE_PGPRIV2, &rreq->flags)) return netfs_rreq_write_to_cache(rreq); netfs_rreq_completed(rreq, was_async); diff --git a/fs/netfs/main.c b/fs/netfs/main.c index 5e77618a7940..c5a73c9ed126 100644 --- a/fs/netfs/main.c +++ b/fs/netfs/main.c @@ -31,6 +31,7 @@ static const char *netfs_origins[nr__netfs_io_origin] = { [NETFS_READAHEAD] = "RA", [NETFS_READPAGE] = "RP", [NETFS_READ_FOR_WRITE] = "RW", + [NETFS_COPY_TO_CACHE] = "CC", [NETFS_WRITEBACK] = "WB", [NETFS_WRITETHROUGH] = "WT", [NETFS_LAUNDER_WRITE] = "LW", diff --git a/fs/netfs/misc.c b/fs/netfs/misc.c index 90051ced8e2a..bc1fc54fb724 100644 --- a/fs/netfs/misc.c +++ b/fs/netfs/misc.c @@ -177,13 +177,11 @@ EXPORT_SYMBOL(netfs_clear_inode_writeback); */ void netfs_invalidate_folio(struct folio *folio, size_t offset, size_t length) { - struct netfs_folio *finfo = NULL; + struct netfs_folio *finfo; size_t flen = folio_size(folio); _enter("{%lx},%zx,%zx", folio->index, offset, length); - folio_wait_fscache(folio); - if (!folio_test_private(folio)) return; @@ -248,12 +246,6 @@ bool netfs_release_folio(struct folio *folio, gfp_t gfp) if (folio_test_private(folio)) return false; - if (folio_test_fscache(folio)) { - if (current_is_kswapd() || !(gfp & __GFP_FS)) - return false; - folio_wait_fscache(folio); - } - fscache_note_page_release(netfs_i_cookie(ctx)); return true; } diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c index 610ceb5bd86c..72b52f070270 100644 --- a/fs/netfs/objects.c +++ b/fs/netfs/objects.c @@ -45,8 +45,12 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping, refcount_set(&rreq->ref, 1); __set_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags); - if (cached) + if (cached) { __set_bit(NETFS_RREQ_WRITE_TO_CACHE, &rreq->flags); + if (test_bit(NETFS_ICTX_USE_PGPRIV2, &ctx->flags)) + /* Filesystem uses deprecated PG_private_2 marking. */ + __set_bit(NETFS_RREQ_USE_PGPRIV2, &rreq->flags); + } if (file && file->f_flags & O_NONBLOCK) __set_bit(NETFS_RREQ_NONBLOCK, &rreq->flags); if (rreq->netfs_ops->init_request) { diff --git a/fs/nfs/fscache.h b/fs/nfs/fscache.h index e3cb4923316b..814363d1d7c7 100644 --- a/fs/nfs/fscache.h +++ b/fs/nfs/fscache.h @@ -81,6 +81,8 @@ static inline void nfs_netfs_put(struct nfs_netfs_io_data *netfs) static inline void nfs_netfs_inode_init(struct nfs_inode *nfsi) { netfs_inode_init(&nfsi->netfs, &nfs_netfs_ops, false); + /* [DEPRECATED] Use PG_private_2 to mark folio being written to the cache. */ + __set_bit(NETFS_ICTX_USE_PGPRIV2, &nfsi->netfs.flags); } extern void nfs_netfs_initiate_read(struct nfs_pgio_header *hdr); extern void nfs_netfs_read_completion(struct nfs_pgio_header *hdr); diff --git a/include/linux/fscache.h b/include/linux/fscache.h index 6e8562cbcc43..9de27643607f 100644 --- a/include/linux/fscache.h +++ b/include/linux/fscache.h @@ -172,9 +172,12 @@ extern void __fscache_invalidate(struct fscache_cookie *, const void *, loff_t, extern int __fscache_begin_read_operation(struct netfs_cache_resources *, struct fscache_cookie *); extern int __fscache_begin_write_operation(struct netfs_cache_resources *, struct fscache_cookie *); -extern void __fscache_write_to_cache(struct fscache_cookie *, struct address_space *, - loff_t, size_t, loff_t, netfs_io_terminated_t, void *, - bool); +void __fscache_write_to_cache(struct fscache_cookie *cookie, + struct address_space *mapping, + loff_t start, size_t len, loff_t i_size, + netfs_io_terminated_t term_func, + void *term_func_priv, + bool using_pgpriv2, bool cond); extern void __fscache_clear_page_bits(struct address_space *, loff_t, size_t); /** @@ -597,7 +600,8 @@ static inline void fscache_clear_page_bits(struct address_space *mapping, * @i_size: The new size of the inode * @term_func: The function to call upon completion * @term_func_priv: The private data for @term_func - * @caching: If PG_fscache has been set + * @using_pgpriv2: If we're using PG_private_2 to mark in-progress write + * @caching: If we actually want to do the caching * * Helper function for a netfs to write dirty data from an inode into the cache * object that's backing it. @@ -608,19 +612,21 @@ static inline void fscache_clear_page_bits(struct address_space *mapping, * marked with PG_fscache. * * If given, @term_func will be called upon completion and supplied with - * @term_func_priv. Note that the PG_fscache flags will have been cleared by - * this point, so the netfs must retain its own pin on the mapping. + * @term_func_priv. Note that if @using_pgpriv2 is set, the PG_private_2 flags + * will have been cleared by this point, so the netfs must retain its own pin + * on the mapping. */ static inline void fscache_write_to_cache(struct fscache_cookie *cookie, struct address_space *mapping, loff_t start, size_t len, loff_t i_size, netfs_io_terminated_t term_func, void *term_func_priv, - bool caching) + bool using_pgpriv2, bool caching) { if (caching) __fscache_write_to_cache(cookie, mapping, start, len, i_size, - term_func, term_func_priv, caching); + term_func, term_func_priv, + using_pgpriv2, caching); else if (term_func) term_func(term_func_priv, -ENOBUFS, false); diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 100cbb261269..f5e9c5f84a0c 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -143,6 +143,8 @@ struct netfs_inode { #define NETFS_ICTX_UNBUFFERED 1 /* I/O should not use the pagecache */ #define NETFS_ICTX_WRITETHROUGH 2 /* Write-through caching */ #define NETFS_ICTX_NO_WRITE_STREAMING 3 /* Don't engage in write-streaming */ +#define NETFS_ICTX_USE_PGPRIV2 31 /* [DEPRECATED] Use PG_private_2 to mark + * write to cache on read */ }; /* @@ -165,16 +167,25 @@ struct netfs_folio { unsigned int dirty_len; /* Write-streaming dirty data length */ }; #define NETFS_FOLIO_INFO 0x1UL /* OR'd with folio->private. */ +#define NETFS_FOLIO_COPY_TO_CACHE ((struct netfs_group *)0x356UL) /* Write to the cache only */ -static inline struct netfs_folio *netfs_folio_info(struct folio *folio) +static inline bool netfs_is_folio_info(const void *priv) { - void *priv = folio_get_private(folio); + return (unsigned long)priv & NETFS_FOLIO_INFO; +} - if ((unsigned long)priv & NETFS_FOLIO_INFO) +static inline struct netfs_folio *__netfs_folio_info(const void *priv) +{ + if (netfs_is_folio_info(priv)) return (struct netfs_folio *)((unsigned long)priv & ~NETFS_FOLIO_INFO); return NULL; } +static inline struct netfs_folio *netfs_folio_info(struct folio *folio) +{ + return __netfs_folio_info(folio_get_private(folio)); +} + static inline struct netfs_group *netfs_folio_group(struct folio *folio) { struct netfs_folio *finfo; @@ -230,6 +241,7 @@ enum netfs_io_origin { NETFS_READAHEAD, /* This read was triggered by readahead */ NETFS_READPAGE, /* This read is a synchronous read */ NETFS_READ_FOR_WRITE, /* This read is to prepare a write */ + NETFS_COPY_TO_CACHE, /* This write is to copy a read to the cache */ NETFS_WRITEBACK, /* This write was triggered by writepages */ NETFS_WRITETHROUGH, /* This write was made by netfs_perform_write() */ NETFS_LAUNDER_WRITE, /* This is triggered by ->launder_folio() */ @@ -287,6 +299,8 @@ struct netfs_io_request { #define NETFS_RREQ_UPLOAD_TO_SERVER 8 /* Need to write to the server */ #define NETFS_RREQ_NONBLOCK 9 /* Don't block if possible (O_NONBLOCK) */ #define NETFS_RREQ_BLOCKED 10 /* We blocked */ +#define NETFS_RREQ_USE_PGPRIV2 31 /* [DEPRECATED] Use PG_private_2 to mark + * write to cache on read */ const struct netfs_request_ops *netfs_ops; void (*cleanup)(struct netfs_io_request *req); }; diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index 447a8c21cf57..e03fafb0c1e3 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -24,6 +24,7 @@ E_(netfs_read_trace_write_begin, "WRITEBEGN") #define netfs_write_traces \ + EM(netfs_write_trace_copy_to_cache, "COPY2CACH") \ EM(netfs_write_trace_dio_write, "DIO-WRITE") \ EM(netfs_write_trace_launder, "LAUNDER ") \ EM(netfs_write_trace_unbuffered_write, "UNB-WRITE") \ @@ -34,6 +35,7 @@ EM(NETFS_READAHEAD, "RA") \ EM(NETFS_READPAGE, "RP") \ EM(NETFS_READ_FOR_WRITE, "RW") \ + EM(NETFS_COPY_TO_CACHE, "CC") \ EM(NETFS_WRITEBACK, "WB") \ EM(NETFS_WRITETHROUGH, "WT") \ EM(NETFS_LAUNDER_WRITE, "LW") \ @@ -127,7 +129,9 @@ EM(netfs_folio_trace_clear, "clear") \ EM(netfs_folio_trace_clear_s, "clear-s") \ EM(netfs_folio_trace_clear_g, "clear-g") \ - EM(netfs_folio_trace_copy_to_cache, "copy") \ + EM(netfs_folio_trace_copy, "copy") \ + EM(netfs_folio_trace_copy_plus, "copy+") \ + EM(netfs_folio_trace_copy_to_cache, "mark-copy") \ EM(netfs_folio_trace_end_copy, "end-copy") \ EM(netfs_folio_trace_filled_gaps, "filled-gaps") \ EM(netfs_folio_trace_kill, "kill") \
Update i_blocks when i_size is updated when we finish making a write to the pagecache to reflect the amount of space we think will be consumed. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/netfs/buffered_write.c | 45 +++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 9a0d32e4b422..c194655a6dcf 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -130,6 +130,37 @@ static struct folio *netfs_grab_folio_for_write(struct address_space *mapping, mapping_gfp_mask(mapping)); } +/* + * Update i_size and estimate the update to i_blocks to reflect the additional + * data written into the pagecache until we can find out from the server what + * the values actually are. + */ +static void netfs_update_i_size(struct netfs_inode *ctx, struct inode *inode, + loff_t i_size, loff_t pos, size_t copied) +{ + blkcnt_t add; + size_t gap; + + if (ctx->ops->update_i_size) { + ctx->ops->update_i_size(inode, pos); + return; + } + + i_size_write(inode, pos); +#if IS_ENABLED(CONFIG_FSCACHE) + fscache_update_cookie(ctx->cache, NULL, &pos); +#endif + + gap = SECTOR_SIZE - (i_size & (SECTOR_SIZE - 1)); + if (copied > gap) { + add = DIV_ROUND_UP(copied - gap, SECTOR_SIZE); + + inode->i_blocks = min_t(blkcnt_t, + DIV_ROUND_UP(pos, SECTOR_SIZE), + inode->i_blocks + add); + } +} + /** * netfs_perform_write - Copy data into the pagecache. * @iocb: The operation parameters @@ -352,18 +383,10 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, trace_netfs_folio(folio, trace); /* Update the inode size if we moved the EOF marker */ - i_size = i_size_read(inode); pos += copied; - if (pos > i_size) { - if (ctx->ops->update_i_size) { - ctx->ops->update_i_size(inode, pos); - } else { - i_size_write(inode, pos); -#if IS_ENABLED(CONFIG_FSCACHE) - fscache_update_cookie(ctx->cache, NULL, &pos); -#endif - } - } + i_size = i_size_read(inode); + if (pos > i_size) + netfs_update_i_size(ctx, inode, i_size, pos, copied); written += copied; if (likely(!wreq)) {
Update i_blocks when i_size is updated when we finish making a write to the pagecache to reflect the amount of space we think will be consumed. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/netfs/buffered_write.c | 45 +++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 9a0d32e4b422..c194655a6dcf 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -130,6 +130,37 @@ static struct folio *netfs_grab_folio_for_write(struct address_space *mapping, mapping_gfp_mask(mapping)); } +/* + * Update i_size and estimate the update to i_blocks to reflect the additional + * data written into the pagecache until we can find out from the server what + * the values actually are. + */ +static void netfs_update_i_size(struct netfs_inode *ctx, struct inode *inode, + loff_t i_size, loff_t pos, size_t copied) +{ + blkcnt_t add; + size_t gap; + + if (ctx->ops->update_i_size) { + ctx->ops->update_i_size(inode, pos); + return; + } + + i_size_write(inode, pos); +#if IS_ENABLED(CONFIG_FSCACHE) + fscache_update_cookie(ctx->cache, NULL, &pos); +#endif + + gap = SECTOR_SIZE - (i_size & (SECTOR_SIZE - 1)); + if (copied > gap) { + add = DIV_ROUND_UP(copied - gap, SECTOR_SIZE); + + inode->i_blocks = min_t(blkcnt_t, + DIV_ROUND_UP(pos, SECTOR_SIZE), + inode->i_blocks + add); + } +} + /** * netfs_perform_write - Copy data into the pagecache. * @iocb: The operation parameters @@ -352,18 +383,10 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter, trace_netfs_folio(folio, trace); /* Update the inode size if we moved the EOF marker */ - i_size = i_size_read(inode); pos += copied; - if (pos > i_size) { - if (ctx->ops->update_i_size) { - ctx->ops->update_i_size(inode, pos); - } else { - i_size_write(inode, pos); -#if IS_ENABLED(CONFIG_FSCACHE) - fscache_update_cookie(ctx->cache, NULL, &pos); -#endif - } - } + i_size = i_size_read(inode); + if (pos > i_size) + netfs_update_i_size(ctx, inode, i_size, pos, copied); written += copied; if (likely(!wreq)) {
Remove the kdoc for the removed 'req' member of the 9p_conn struct. Remove a pair of set-but-not-used v9ses variables. Signed-off-by: David Howells <dhowells@redhat.com> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: v9fs@lists.linux.dev --- fs/9p/vfs_inode_dotl.c | 4 ---- net/9p/trans_fd.c | 1 - 2 files changed, 5 deletions(-) diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index ef9db3e03506..7af27ba1c25d 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -297,7 +297,6 @@ static int v9fs_vfs_mkdir_dotl(struct mnt_idmap *idmap, umode_t omode) { int err; - struct v9fs_session_info *v9ses; struct p9_fid *fid = NULL, *dfid = NULL; kgid_t gid; const unsigned char *name; @@ -307,7 +306,6 @@ static int v9fs_vfs_mkdir_dotl(struct mnt_idmap *idmap, struct posix_acl *dacl = NULL, *pacl = NULL; p9_debug(P9_DEBUG_VFS, "name %pd\n", dentry); - v9ses = v9fs_inode2v9ses(dir); omode |= S_IFDIR; if (dir->i_mode & S_ISGID) @@ -739,7 +737,6 @@ v9fs_vfs_mknod_dotl(struct mnt_idmap *idmap, struct inode *dir, kgid_t gid; const unsigned char *name; umode_t mode; - struct v9fs_session_info *v9ses; struct p9_fid *fid = NULL, *dfid = NULL; struct inode *inode; struct p9_qid qid; @@ -749,7 +746,6 @@ v9fs_vfs_mknod_dotl(struct mnt_idmap *idmap, struct inode *dir, dir->i_ino, dentry, omode, MAJOR(rdev), MINOR(rdev)); - v9ses = v9fs_inode2v9ses(dir); dfid = v9fs_parent_fid(dentry); if (IS_ERR(dfid)) { err = PTR_ERR(dfid); diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index 1a3948b8c493..196060dc6138 100644 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c @@ -95,7 +95,6 @@ struct p9_poll_wait { * @unsent_req_list: accounting for requests that haven't been sent * @rreq: read request * @wreq: write request - * @req: current request being processed (if any) * @tmp_buf: temporary buffer to read in header * @rc: temporary fcall for reading current frame * @wpos: write position for current frame
fscache emits a lot of duplicate cookie warnings with cifs because the index key for the fscache cookies does not include everything that the cifs_find_inode() function does. The latter is used with iget5_locked() to distinguish between inodes in the local inode cache. Fix this by adding the creation time and file type to the fscache cookie key. Additionally, add a couple of comments to note that if one is changed the other must be also. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/smb/client/fscache.c | 16 +++++++++++++++- fs/smb/client/inode.c | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/fscache.c b/fs/smb/client/fscache.c index c4a3cb736881..340efce8f052 100644 --- a/fs/smb/client/fscache.c +++ b/fs/smb/client/fscache.c @@ -12,6 +12,16 @@ #include "cifs_fs_sb.h" #include "cifsproto.h" +/* + * Key for fscache inode. [!] Contents must match comparisons in cifs_find_inode(). + */ +struct cifs_fscache_inode_key { + + __le64 uniqueid; /* server inode number */ + __le64 createtime; /* creation time on server */ + u8 type; /* S_IFMT file type */ +} __packed; + static void cifs_fscache_fill_volume_coherency( struct cifs_tcon *tcon, struct cifs_fscache_volume_coherency_data *cd) @@ -97,15 +107,19 @@ void cifs_fscache_release_super_cookie(struct cifs_tcon *tcon) void cifs_fscache_get_inode_cookie(struct inode *inode) { struct cifs_fscache_inode_coherency_data cd; + struct cifs_fscache_inode_key key; struct cifsInodeInfo *cifsi = CIFS_I(inode); struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); + key.uniqueid = cpu_to_le64(cifsi->uniqueid); + key.createtime = cpu_to_le64(cifsi->createtime); + key.type = (inode->i_mode & S_IFMT) >> 12; cifs_fscache_fill_coherency(&cifsi->netfs.inode, &cd); cifsi->netfs.cache = fscache_acquire_cookie(tcon->fscache, 0, - &cifsi->uniqueid, sizeof(cifsi->uniqueid), + &key, sizeof(key), &cd, sizeof(cd), i_size_read(&cifsi->netfs.inode)); if (cifsi->netfs.cache) diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index d28ab0af6049..91b07ef9e25c 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -1351,6 +1351,8 @@ cifs_find_inode(struct inode *inode, void *opaque) { struct cifs_fattr *fattr = opaque; + /* [!] The compared values must be the same in struct cifs_fscache_inode_key. */ + /* don't match inode with different uniqueid */ if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid) return 0;
Remove the kdoc for the removed 'req' member of the 9p_conn struct. Remove a pair of set-but-not-used v9ses variables. Signed-off-by: David Howells <dhowells@redhat.com> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: v9fs@lists.linux.dev --- fs/9p/vfs_inode_dotl.c | 4 ---- net/9p/trans_fd.c | 1 - 2 files changed, 5 deletions(-) diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index ef9db3e03506..7af27ba1c25d 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -297,7 +297,6 @@ static int v9fs_vfs_mkdir_dotl(struct mnt_idmap *idmap, umode_t omode) { int err; - struct v9fs_session_info *v9ses; struct p9_fid *fid = NULL, *dfid = NULL; kgid_t gid; const unsigned char *name; @@ -307,7 +306,6 @@ static int v9fs_vfs_mkdir_dotl(struct mnt_idmap *idmap, struct posix_acl *dacl = NULL, *pacl = NULL; p9_debug(P9_DEBUG_VFS, "name %pd\n", dentry); - v9ses = v9fs_inode2v9ses(dir); omode |= S_IFDIR; if (dir->i_mode & S_ISGID) @@ -739,7 +737,6 @@ v9fs_vfs_mknod_dotl(struct mnt_idmap *idmap, struct inode *dir, kgid_t gid; const unsigned char *name; umode_t mode; - struct v9fs_session_info *v9ses; struct p9_fid *fid = NULL, *dfid = NULL; struct inode *inode; struct p9_qid qid; @@ -749,7 +746,6 @@ v9fs_vfs_mknod_dotl(struct mnt_idmap *idmap, struct inode *dir, dir->i_ino, dentry, omode, MAJOR(rdev), MINOR(rdev)); - v9ses = v9fs_inode2v9ses(dir); dfid = v9fs_parent_fid(dentry); if (IS_ERR(dfid)) { err = PTR_ERR(dfid); diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index 1a3948b8c493..196060dc6138 100644 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c @@ -95,7 +95,6 @@ struct p9_poll_wait { * @unsent_req_list: accounting for requests that haven't been sent * @rreq: read request * @wreq: write request - * @req: current request being processed (if any) * @tmp_buf: temporary buffer to read in header * @rc: temporary fcall for reading current frame * @wpos: write position for current frame
fscache emits a lot of duplicate cookie warnings with cifs because the index key for the fscache cookies does not include everything that the cifs_find_inode() function does. The latter is used with iget5_locked() to distinguish between inodes in the local inode cache. Fix this by adding the creation time and file type to the fscache cookie key. Additionally, add a couple of comments to note that if one is changed the other must be also. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/smb/client/fscache.c | 16 +++++++++++++++- fs/smb/client/inode.c | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/fscache.c b/fs/smb/client/fscache.c index c4a3cb736881..340efce8f052 100644 --- a/fs/smb/client/fscache.c +++ b/fs/smb/client/fscache.c @@ -12,6 +12,16 @@ #include "cifs_fs_sb.h" #include "cifsproto.h" +/* + * Key for fscache inode. [!] Contents must match comparisons in cifs_find_inode(). + */ +struct cifs_fscache_inode_key { + + __le64 uniqueid; /* server inode number */ + __le64 createtime; /* creation time on server */ + u8 type; /* S_IFMT file type */ +} __packed; + static void cifs_fscache_fill_volume_coherency( struct cifs_tcon *tcon, struct cifs_fscache_volume_coherency_data *cd) @@ -97,15 +107,19 @@ void cifs_fscache_release_super_cookie(struct cifs_tcon *tcon) void cifs_fscache_get_inode_cookie(struct inode *inode) { struct cifs_fscache_inode_coherency_data cd; + struct cifs_fscache_inode_key key; struct cifsInodeInfo *cifsi = CIFS_I(inode); struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); + key.uniqueid = cpu_to_le64(cifsi->uniqueid); + key.createtime = cpu_to_le64(cifsi->createtime); + key.type = (inode->i_mode & S_IFMT) >> 12; cifs_fscache_fill_coherency(&cifsi->netfs.inode, &cd); cifsi->netfs.cache = fscache_acquire_cookie(tcon->fscache, 0, - &cifsi->uniqueid, sizeof(cifsi->uniqueid), + &key, sizeof(key), &cd, sizeof(cd), i_size_read(&cifsi->netfs.inode)); if (cifsi->netfs.cache) diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index d28ab0af6049..91b07ef9e25c 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -1351,6 +1351,8 @@ cifs_find_inode(struct inode *inode, void *opaque) { struct cifs_fattr *fattr = opaque; + /* [!] The compared values must be the same in struct cifs_fscache_inode_key. */ + /* don't match inode with different uniqueid */ if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid) return 0;
Q1: Where are all the other parts of this series. I only got 1-3. A1: There are ~2700 subscribers to LKML. I want to get some feedback on the approach and naming etc. before spamming everyone with a 74 patch series. Q2: Can I get the other parts? A2: Sure. I posted them to patches@lists.linux.dev so you can get them with: $ b4 am 20240328090459.242500-tony.luck@intel.com or get from kernel.org with: $ git fetch git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git new_families Q3: When are CPUs using new families coming? A3: Soon-ish. We have some time to get the infrastructure right. Intel has been using family 6 almost exclusively for many years. As a result, Linux has built up infrastructure like X86_MATCH_INTEL_FAM6_MODEL() to make it easy for model specific code to use the #defines for each Intel CPU model. But the reign of family 6 is about to end. Intel will begin using non-zero values for the extended family field in CPUID(1).EAX. The minimal patch size approach to handle these would be to clone the FAM6 macros. But that will get messy as these prolifrate. This approach does not have an elegant solution if a switch() statement needs to choose between CPUs from different families. Dave Hansen suggested that a more general cleanup that provides CPU #defines that encode all of <vendor, family, model> would make existing code better, and provide infrastructure that makes it trivial to incorporate new families. Big picture view is that code like this: if (c->x86_vendor == X86_VENDOR_INTEL && c->x86 == 6 && c->x86_model == INTEL_FAM6_ICELAKE_X) can become: if (c->x86_vfm == INTEL_ICELAKE_X) which is: a) Simpler b) Faster c) More resilient (can't forget to check vendor & family along with model) d) Code style doesn't change for every new family. Note that "struct cpuinfo_x86" gains a new xf6_vfm field and the ICELAKE #define loses the "FAM6_" substring and will be initialized with a macro that does the bit shuffling to fit X86_VENDOR_INTEL and a family and model into a "u32": #define INTEL_ICELAKE_X IFM(6, 0x6A) /* Sunny Cove */ New CPUs in other families might look like: #define INTEL_DOUGLASCOVE IFM(42, 0x01) /* Adams Lake */ #define INTEL_SHELDONMONT IFM(73, 0x01) /* Cooper Forest */ Model specific "if" statements then follow the same pattern regardless of family: if (c->x86_vfm == INTEL_DOUGLASCOVE || c->x86_vfm == INTEL_SHELDONMONT) { } If needed these could even appear in the same switch statement: switch (c->x86_vfm) { case INTEL_ICELAKE_X: ... case INTEL_DOUGLASCOVE: ... case INTEL_SHELDONMONT: ... } The existing X86_MATCH_INTEL_FAM6_MODEL() can be replaced with a new X86_MATCH_VFM() macro. Update can happen in three phases: 1) Add infrastructure macros, new "x86_vfm" field, new CPU #defines 2) Treewide update from old to new (around 70 files at current count) 3) Delete the old INTEL_FAM6 and X86_MATCH_INTEL_FAM6 macros Tony Luck (74): x86/cpu/vfm: Add/initialize x86_vfm field to struct cpuinfo_x86 x86/cpu/vfm: Add new macros to work with (vendor/family/model) values x86/cpu/vfm: Update arch/x86/include/asm/intel-family.h x86/cpu/vfm: Update arch/x86/crypto/poly1305_glue.c x86/cpu/vfm: Update arch/x86/crypto/twofish_glue_3way.c x86/cpu/vfm: Update arch/x86/events/intel/cstate.c x86/cpu/vfm: Update arch/x86/events/intel/lbr.c x86/cpu/vfm: Update arch/x86/events/intel/pt.c x86/cpu/vfm: Update arch/x86/events/intel/uncore.c x86/cpu/vfm: Update arch/x86/events/intel/uncore_nhmex.c x86/cpu/vfm: Update arch/x86/events/intel/uncore_snbep.c x86/cpu/vfm: Update arch/x86/events/msr.c x86/cpu/vfm: Update arch/x86/events/rapl.c x86/cpu/vfm: Update arch/x86/kernel/apic/apic.c x86/cpu/vfm: Update arch/x86/kernel/cpu/aperfmperf.c x86/cpu/vfm: Update arch/x86/kernel/cpu/bugs.c x86/cpu/vfm: Update arch/x86/kernel/cpu/common.c x86/cpu/vfm: Update arch/x86/kernel/cpu/intel.c x86/cpu/vfm: Update arch/x86/kernel/cpu/intel_epb.c x86/cpu/vfm: Update arch/x86/kernel/cpu/match.c x86/cpu/vfm: Update arch/x86/kernel/cpu/mce/core.c x86/cpu/vfm: Update arch/x86/kernel/cpu/mce/intel.c x86/cpu/vfm: Update arch/x86/kernel/cpu/mce/severity.c x86/cpu/vfm: Update arch/x86/kernel/cpu/microcode/intel.c x86/cpu/vfm: Update arch/x86/kernel/cpu/resctrl/core.c x86/cpu/vfm: Update arch/x86/kernel/cpu/resctrl/pseudo_lock.c x86/cpu/vfm: Update arch/x86/kernel/smpboot.c x86/cpu/vfm: Update arch/x86/kernel/tsc.c x86/cpu/vfm: Update arch/x86/kernel/tsc_msr.c x86/cpu/vfm: Update arch/x86/kvm/pmu.c x86/cpu/vfm: Update arch/x86/kvm/vmx/vmx.c x86/cpu/vfm: Update arch/x86/mm/init.c x86/cpu/vfm: Update arch/x86/pci/intel_mid_pci.c x86/cpu/vfm: Update arch/x86/virt/vmx/tdx/tdx.c x86/cpu/vfm: Update drivers/acpi/acpi_lpss.c x86/cpu/vfm: Update drivers/acpi/x86/utils.c x86/cpu/vfm: Update tpm files x86/cpu/vfm: Update drivers/cpufreq/intel_pstate.c x86/cpu/vfm: Update drivers/cpufreq/speedstep-centrino.c x86/cpu/vfm: Update drivers/edac/i10nm_base.c x86/cpu/vfm: Update drivers/edac/pnd2_edac.c x86/cpu/vfm: Update drivers/edac/sb_edac.c x86/cpu/vfm: Update drivers/edac/skx_base.c x86/cpu/vfm: Update drivers/extcon/extcon-axp288.c x86/cpu/vfm: Update drivers/hwmon/peci/cputemp.c x86/cpu/vfm: Update drivers/idle/intel_idle.c x86/cpu/vfm: Update drivers/pci/pci-mid.c x86/cpu/vfm: Update drivers/peci/cpu.c x86/cpu/vfm: Update drivers/platform/x86/intel/ifs/core.c x86/cpu/vfm: Update drivers/platform/x86/intel_ips.c x86/cpu/vfm: Update drivers/platform/x86/intel/pmc/core.c x86/cpu/vfm: Update drivers/platform/x86/intel/pmc/pltdrv.c x86/cpu/vfm: Update drivers/platform/x86/intel_scu_wdt.c x86/cpu/vfm: Update drivers/platform/x86/intel/speed_select_if/isst_if_common.c x86/cpu/vfm: Update drivers/platform/x86/intel/speed_select_if/isst_if_mbox_msr.c x86/cpu/vfm: Update drivers/platform/x86/intel/telemetry/debugfs.c x86/cpu/vfm: Update drivers/platform/x86/intel/telemetry/pltdrv.c x86/cpu/vfm: Update drivers/platform/x86/intel/turbo_max_3.c x86/cpu/vfm: Update drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c x86/cpu/vfm: Update drivers/platform/x86/p2sb.c x86/cpu/vfm: Update drivers/powercap/intel_rapl_common.c x86/cpu/vfm: Update drivers/powercap/intel_rapl_msr.c x86/cpu/vfm: Update drivers/staging/media/atomisp/include/linux/atomisp_platform.h x86/cpu/vfm: Update intel_soc_dts_thermal.c x86/cpu/vfm: Update drivers/thermal/intel/intel_tcc_cooling.c x86/cpu/vfm: Update sound/soc/intel/avs/boards/es8336.c x86/cpu/vfm: Update arch/x86/events/intel/core.c x86/cpu/vfm: Update arch/x86/platform/intel-mid/intel-mid.c x86/cpu/vfm: Update arch/x86/platform/atom/punit_atom_debug.c x86/cpu/vfm: Update arch/x86/events/intel/core.c x86/cpu/vfm: Update tools/power/x86/turbostat/turbostat.c x86/cpu/vfm: Update arch/x86/boot/cpucheck.c x86/cpu/vfm: Delete X86_MATCH_INTEL_FAM6_MODEL[_STEPPING]() macros x86/cpu/vfm: Delete all the *_FAM6_ CPU #defines .../atomisp/include/linux/atomisp_platform.h | 26 +-- include/linux/peci-cpu.h | 1 + include/linux/platform_data/x86/soc.h | 12 +- arch/x86/include/asm/cpu_device_id.h | 103 +++++++-- arch/x86/include/asm/intel-family.h | 167 +++++++------- arch/x86/include/asm/processor.h | 12 +- drivers/char/tpm/tpm.h | 1 + drivers/char/tpm/tpm_tis_core.h | 2 +- arch/x86/boot/cpucheck.c | 2 +- arch/x86/crypto/poly1305_glue.c | 3 +- arch/x86/crypto/twofish_glue_3way.c | 10 +- arch/x86/events/intel/core.c | 212 +++++++++--------- arch/x86/events/intel/cstate.c | 144 ++++++------ arch/x86/events/intel/lbr.c | 3 +- arch/x86/events/intel/pt.c | 11 +- arch/x86/events/intel/uncore.c | 100 ++++----- arch/x86/events/intel/uncore_nhmex.c | 3 +- arch/x86/events/intel/uncore_snbep.c | 5 +- arch/x86/events/msr.c | 131 +++++------ arch/x86/events/rapl.c | 84 +++---- arch/x86/kernel/apic/apic.c | 38 ++-- arch/x86/kernel/cpu/aperfmperf.c | 17 +- arch/x86/kernel/cpu/bugs.c | 29 +-- arch/x86/kernel/cpu/common.c | 154 +++++++------ arch/x86/kernel/cpu/intel.c | 115 +++++----- arch/x86/kernel/cpu/intel_epb.c | 12 +- arch/x86/kernel/cpu/match.c | 5 +- arch/x86/kernel/cpu/mce/core.c | 5 +- arch/x86/kernel/cpu/mce/intel.c | 20 +- arch/x86/kernel/cpu/mce/severity.c | 9 +- arch/x86/kernel/cpu/microcode/intel.c | 4 +- arch/x86/kernel/cpu/resctrl/core.c | 9 +- arch/x86/kernel/cpu/resctrl/pseudo_lock.c | 21 +- arch/x86/kernel/smpboot.c | 6 +- arch/x86/kernel/tsc.c | 5 +- arch/x86/kernel/tsc_msr.c | 14 +- arch/x86/kvm/pmu.c | 8 +- arch/x86/kvm/vmx/vmx.c | 20 +- arch/x86/mm/init.c | 16 +- arch/x86/pci/intel_mid_pci.c | 4 +- arch/x86/platform/atom/punit_atom_debug.c | 11 +- arch/x86/platform/intel-mid/intel-mid.c | 7 +- arch/x86/virt/vmx/tdx/tdx.c | 7 +- drivers/acpi/acpi_lpss.c | 4 +- drivers/acpi/x86/utils.c | 42 ++-- drivers/cpufreq/intel_pstate.c | 90 ++++---- drivers/cpufreq/speedstep-centrino.c | 8 +- drivers/edac/i10nm_base.c | 20 +- drivers/edac/pnd2_edac.c | 4 +- drivers/edac/sb_edac.c | 14 +- drivers/edac/skx_base.c | 2 +- drivers/extcon/extcon-axp288.c | 2 +- drivers/hwmon/peci/cputemp.c | 7 +- drivers/idle/intel_idle.c | 116 +++++----- drivers/pci/pci-mid.c | 4 +- drivers/peci/cpu.c | 28 +-- drivers/platform/x86/intel/ifs/core.c | 15 +- drivers/platform/x86/intel/pmc/core.c | 46 ++-- drivers/platform/x86/intel/pmc/pltdrv.c | 16 +- .../intel/speed_select_if/isst_if_common.c | 4 +- .../intel/speed_select_if/isst_if_mbox_msr.c | 2 +- .../platform/x86/intel/telemetry/debugfs.c | 4 +- drivers/platform/x86/intel/telemetry/pltdrv.c | 4 +- drivers/platform/x86/intel/turbo_max_3.c | 4 +- .../intel/uncore-frequency/uncore-frequency.c | 56 ++--- drivers/platform/x86/intel_ips.c | 3 +- drivers/platform/x86/intel_scu_wdt.c | 2 +- drivers/platform/x86/p2sb.c | 2 +- drivers/powercap/intel_rapl_common.c | 118 +++++----- drivers/powercap/intel_rapl_msr.c | 16 +- drivers/thermal/intel/intel_soc_dts_thermal.c | 2 +- drivers/thermal/intel/intel_tcc_cooling.c | 30 +-- sound/soc/intel/avs/boards/es8336.c | 7 +- tools/power/x86/turbostat/turbostat.c | 161 +++++++------ 74 files changed, 1258 insertions(+), 1143 deletions(-) base-commit: 4cece764965020c22cff7665b18a012006359095 -- 2.44.0
From: Arnd Bergmann <arnd@arndb.de> The warning option was introduced a few years ago but left disabled by default. All of the actual bugs that this has found have been fixed in the meantime, and this series should address the remaining false-positives, as tested on arm/arm64/x86 randconfigs as well as allmodconfig builds for all architectures supported by clang. Please apply the patches individually to subsystem maintainer trees. Arnd Arnd Bergmann (9): dm integrity: fix out-of-range warning libceph: avoid clang out-of-range warning rbd: avoid out-of-range warning kcov: avoid clang out-of-range warning ipv4: tcp_output: avoid warning about NET_ADD_STATS nilfs2: fix out-of-range warning infiniband: uverbs: avoid out-of-range warnings mlx5: stop warning for 64KB pages kbuild: enable tautological-constant-out-of-range-compare drivers/block/rbd.c | 2 +- drivers/infiniband/core/uverbs_ioctl.c | 4 ++-- drivers/md/dm-integrity.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c | 6 ++++-- fs/ceph/snap.c | 2 +- fs/nilfs2/ioctl.c | 2 +- kernel/kcov.c | 3 ++- net/ceph/osdmap.c | 4 ++-- net/ipv4/tcp_output.c | 2 +- scripts/Makefile.extrawarn | 1 - 10 files changed, 15 insertions(+), 13 deletions(-) -- 2.39.2 Cc: Ilya Dryomov <idryomov@gmail.com> Cc: Dongsheng Yang <dongsheng.yang@easystack.cn> Cc: Jens Axboe <axboe@kernel.dk> Cc: Jason Gunthorpe <jgg@ziepe.ca> Cc: Leon Romanovsky <leon@kernel.org> Cc: Alasdair Kergon <agk@redhat.com> Cc: Mike Snitzer <snitzer@kernel.org> Cc: Mikulas Patocka <mpatocka@redhat.com> Cc: dm-devel@lists.linux.dev Cc: Saeed Mahameed <saeedm@nvidia.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: Eric Dumazet <edumazet@google.com> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Paolo Abeni <pabeni@redhat.com> Cc: Xiubo Li <xiubli@redhat.com> Cc: Jeff Layton <jlayton@kernel.org> Cc: Ryusuke Konishi <konishi.ryusuke@gmail.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Andrey Konovalov <andreyknvl@gmail.com> Cc: David Ahern <dsahern@kernel.org> Cc: Masahiro Yamada <masahiroy@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nicolas Schier <nicolas@fjasle.eu> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Bill Wendling <morbo@google.com> Cc: Justin Stitt <justinstitt@google.com> Cc: Kees Cook <keescook@chromium.org> Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Tariq Toukan <tariqt@nvidia.com> Cc: ceph-devel@vger.kernel.org Cc: linux-block@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-rdma@vger.kernel.org Cc: netdev@vger.kernel.org Cc: linux-nilfs@vger.kernel.org Cc: kasan-dev@googlegroups.com Cc: linux-kbuild@vger.kernel.org Cc: llvm@lists.linux.dev
From: Arnd Bergmann <arnd@arndb.de> We are close to being able to turn on -Wstringop-truncation unconditionally instead of only at the 'make W=1' level, these ten warnings are all that I saw in randconfig testing across compiler versions on arm, arm64 and x86. The final patch is only there for reference at the moment, I hope we can merge the other ones through the subsystem trees first, as there are no dependencies between them. Arnd Arnd Bergmann (11): staging: vc04_services: changen strncpy() to strscpy_pad() scsi: devinfo: rework scsi_strcpy_devinfo() staging: replace weird strncpy() with memcpy() orangefs: convert strncpy() to strscpy() test_hexdump: avoid string truncation warning acpi: avoid warning for truncated string copy block/partitions/ldm: convert strncpy() to strscpy() blktrace: convert strncpy() to strscpy_pad() staging: rtl8723bs: convert strncpy to strscpy staging: greybus: change strncpy() to strscpy() kbuild: enable -Wstringop-truncation globally block/partitions/ldm.c | 6 ++-- drivers/acpi/acpica/tbfind.c | 19 +++++------ drivers/scsi/scsi_devinfo.c | 30 +++++++++++------ drivers/staging/greybus/fw-management.c | 4 +-- .../staging/rtl8723bs/os_dep/ioctl_cfg80211.c | 5 ++- drivers/staging/rts5208/rtsx_scsi.c | 2 +- .../vc04_services/vchiq-mmal/mmal-vchiq.c | 4 +-- fs/orangefs/dcache.c | 4 +-- fs/orangefs/namei.c | 33 +++++++++---------- fs/orangefs/super.c | 16 ++++----- kernel/trace/blktrace.c | 3 +- lib/test_hexdump.c | 2 +- scripts/Makefile.extrawarn | 1 - 13 files changed, 64 insertions(+), 65 deletions(-) -- 2.39.2 Cc: "Richard Russon Cc: Jens Axboe <axboe@kernel.dk> Cc: Robert Moore <robert.moore@intel.com> Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> Cc: Len Brown <lenb@kernel.org> Cc: "James E.J. Bottomley" <jejb@linux.ibm.com> Cc: "Martin K. Petersen" <martin.petersen@oracle.com> Cc: Viresh Kumar <vireshk@kernel.org> Cc: Johan Hovold <johan@kernel.org> Cc: Alex Elder <elder@kernel.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Florian Fainelli <florian.fainelli@broadcom.com> Cc: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com> Cc: Mike Marshall <hubcap@omnibond.com> Cc: Martin Brandenburg <martin@omnibond.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Masahiro Yamada <masahiroy@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nicolas Schier <nicolas@fjasle.eu> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Kees Cook <keescook@chromium.org> Cc: Alexey Starikovskiy <astarikovskiy@suse.de> Cc: linux-ntfs-dev@lists.sourceforge.net Cc: linux-block@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-acpi@vger.kernel.org Cc: acpica-devel@lists.linux.dev Cc: linux-scsi@vger.kernel.org Cc: greybus-dev@lists.linaro.org Cc: linux-staging@lists.linux.dev Cc: linux-rpi-kernel@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org Cc: devel@lists.orangefs.org Cc: linux-trace-kernel@vger.kernel.org Cc: linux-kbuild@vger.kernel.org _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Arnd Bergmann <arnd@arndb.de> We are close to being able to turn on -Wstringop-truncation unconditionally instead of only at the 'make W=1' level, these ten warnings are all that I saw in randconfig testing across compiler versions on arm, arm64 and x86. The final patch is only there for reference at the moment, I hope we can merge the other ones through the subsystem trees first, as there are no dependencies between them. Arnd Arnd Bergmann (11): staging: vc04_services: changen strncpy() to strscpy_pad() scsi: devinfo: rework scsi_strcpy_devinfo() staging: replace weird strncpy() with memcpy() orangefs: convert strncpy() to strscpy() test_hexdump: avoid string truncation warning acpi: avoid warning for truncated string copy block/partitions/ldm: convert strncpy() to strscpy() blktrace: convert strncpy() to strscpy_pad() staging: rtl8723bs: convert strncpy to strscpy staging: greybus: change strncpy() to strscpy() kbuild: enable -Wstringop-truncation globally block/partitions/ldm.c | 6 ++-- drivers/acpi/acpica/tbfind.c | 19 +++++------ drivers/scsi/scsi_devinfo.c | 30 +++++++++++------ drivers/staging/greybus/fw-management.c | 4 +-- .../staging/rtl8723bs/os_dep/ioctl_cfg80211.c | 5 ++- drivers/staging/rts5208/rtsx_scsi.c | 2 +- .../vc04_services/vchiq-mmal/mmal-vchiq.c | 4 +-- fs/orangefs/dcache.c | 4 +-- fs/orangefs/namei.c | 33 +++++++++---------- fs/orangefs/super.c | 16 ++++----- kernel/trace/blktrace.c | 3 +- lib/test_hexdump.c | 2 +- scripts/Makefile.extrawarn | 1 - 13 files changed, 64 insertions(+), 65 deletions(-) -- 2.39.2 Cc: "Richard Russon Cc: Jens Axboe <axboe@kernel.dk> Cc: Robert Moore <robert.moore@intel.com> Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> Cc: Len Brown <lenb@kernel.org> Cc: "James E.J. Bottomley" <jejb@linux.ibm.com> Cc: "Martin K. Petersen" <martin.petersen@oracle.com> Cc: Viresh Kumar <vireshk@kernel.org> Cc: Johan Hovold <johan@kernel.org> Cc: Alex Elder <elder@kernel.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Florian Fainelli <florian.fainelli@broadcom.com> Cc: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com> Cc: Mike Marshall <hubcap@omnibond.com> Cc: Martin Brandenburg <martin@omnibond.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Masahiro Yamada <masahiroy@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nicolas Schier <nicolas@fjasle.eu> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Kees Cook <keescook@chromium.org> Cc: Alexey Starikovskiy <astarikovskiy@suse.de> Cc: linux-ntfs-dev@lists.sourceforge.net Cc: linux-block@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-acpi@vger.kernel.org Cc: acpica-devel@lists.linux.dev Cc: linux-scsi@vger.kernel.org Cc: greybus-dev@lists.linaro.org Cc: linux-staging@lists.linux.dev Cc: linux-rpi-kernel@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org Cc: devel@lists.orangefs.org Cc: linux-trace-kernel@vger.kernel.org Cc: linux-kbuild@vger.kernel.org
> From: Heng Qi <hengqi@linux.alibaba.com> > Sent: Wednesday, March 27, 2024 11:57 PM > To: Dan Jurgens <danielj@nvidia.com>; netdev@vger.kernel.org > Cc: mst@redhat.com; jasowang@redhat.com; xuanzhuo@linux.alibaba.com; > virtualization@lists.linux.dev; davem@davemloft.net; > edumazet@google.com; kuba@kernel.org; pabeni@redhat.com; Jiri Pirko > <jiri@nvidia.com> > Subject: Re: [PATCH net-next v2 4/6] virtio_net: Do DIM update for specified > queue only > > > > 在 2024/3/28 下午12:47, Daniel Jurgens 写道: > > Since we no longer have to hold the RTNL lock here just do updates for > > the specified queue. > > > > Signed-off-by: Daniel Jurgens <danielj@nvidia.com> > > --- > > drivers/net/virtio_net.c | 38 ++++++++++++++------------------------ > > 1 file changed, 14 insertions(+), 24 deletions(-) > > > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index > > b9298544b1b5..9c4bfb1eb15c 100644 > > --- a/drivers/net/virtio_net.c > > +++ b/drivers/net/virtio_net.c > > @@ -3596,36 +3596,26 @@ static void virtnet_rx_dim_work(struct > work_struct *work) > > struct virtnet_info *vi = rq->vq->vdev->priv; > > struct net_device *dev = vi->dev; > > struct dim_cq_moder update_moder; > > - int i, qnum, err; > > + int qnum, err; > > > > if (!rtnl_trylock()) > > return; > > > > - /* Each rxq's work is queued by "net_dim()->schedule_work()" > > - * in response to NAPI traffic changes. Note that dim->profile_ix > > - * for each rxq is updated prior to the queuing action. > > - * So we only need to traverse and update profiles for all rxqs > > - * in the work which is holding rtnl_lock. > > - */ > > - for (i = 0; i < vi->curr_queue_pairs; i++) { > > - rq = &vi->rq[i]; > > - dim = &rq->dim; > > - qnum = rq - vi->rq; > > + qnum = rq - vi->rq; > > > > - if (!rq->dim_enabled) > > - continue; > > + if (!rq->dim_enabled) > > + continue; > > ? > > continue what? > Sorry, messed this up when I was testing the patches and put the fix for the continue in the lock patch. > For the lock code, please pass the test. It's important. I did some bench testing. I'll do more and send a new set early next week. > > Regards, > Heng > > > > > - update_moder = net_dim_get_rx_moderation(dim->mode, > dim->profile_ix); > > - if (update_moder.usec != rq->intr_coal.max_usecs || > > - update_moder.pkts != rq->intr_coal.max_packets) { > > - err = virtnet_send_rx_ctrl_coal_vq_cmd(vi, qnum, > > - > update_moder.usec, > > - > update_moder.pkts); > > - if (err) > > - pr_debug("%s: Failed to send dim > parameters on rxq%d\n", > > - dev->name, qnum); > > - dim->state = DIM_START_MEASURE; > > - } > > + update_moder = net_dim_get_rx_moderation(dim->mode, dim- > >profile_ix); > > + if (update_moder.usec != rq->intr_coal.max_usecs || > > + update_moder.pkts != rq->intr_coal.max_packets) { > > + err = virtnet_send_rx_ctrl_coal_vq_cmd(vi, qnum, > > + update_moder.usec, > > + update_moder.pkts); > > + if (err) > > + pr_debug("%s: Failed to send dim parameters on > rxq%d\n", > > + dev->name, qnum); > > + dim->state = DIM_START_MEASURE; > > } > > > > rtnl_unlock();
---------- Forwarded message ---------- Date: Thu, 28 Mar 2024 06:22:46 +0800 From: kernel test robot <lkp@intel.com> To: oe-kbuild@lists.linux.dev Cc: lkp@intel.com, Julia Lawall <julia.lawall@inria.fr> Subject: [agd5f:drm-next 57/194] drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:400:42-43: WARNING opportunity for min() BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: Revalla Hari Krishna <harikrishna.revalla@amd.com> CC: Alex Deucher <alexander.deucher@amd.com> CC: Martin Leung <martin.leung@amd.com> tree: https://gitlab.freedesktop.org/agd5f/linux.git drm-next head: d7f1487643552f18d1855474eba54a8ff3655935 commit: 88867807564e28409d8220419da7559364109a2a [57/194] drm/amd/display: Refactor DPP into a component directory :::::: branch date: 16 hours ago :::::: commit date: 7 days ago config: x86_64-randconfig-102-20240326 (https://download.01.org/0day-ci/archive/20240328/202403280621.G7aFGUDp-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403280621.G7aFGUDp-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:400:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:402:46-47: WARNING opportunity for min() -- >> drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c:269:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c:271:46-47: WARNING opportunity for min() -- >> drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c:43:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c:45:46-47: WARNING opportunity for min() vim +400 drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 390 dd93752b648309 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-10-10 391 void dpp1_dscl_calc_lb_num_partitions( 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 392 const struct scaler_data *scl_data, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 393 enum lb_memory_config lb_config, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 394 int *num_part_y, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 395 int *num_part_c) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 396 { 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 397 int lb_memory_size, lb_memory_size_c, lb_memory_size_a, num_partitions_a, 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 398 lb_bpc, memory_line_size_y, memory_line_size_c, memory_line_size_a; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 399 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 @400 int line_size = scl_data->viewport.width < scl_data->recout.width ? 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 401 scl_data->viewport.width : scl_data->recout.width; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 402 int line_size_c = scl_data->viewport_c.width < scl_data->recout.width ? 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 403 scl_data->viewport_c.width : scl_data->recout.width; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 404 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 405 if (line_size == 0) 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 406 line_size = 1; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 407 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 408 if (line_size_c == 0) 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 409 line_size_c = 1; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 410 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 411 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 412 lb_bpc = dpp1_dscl_get_lb_depth_bpc(scl_data->lb_params.depth); 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 413 memory_line_size_y = (line_size * lb_bpc + 71) / 72; /* +71 to ceil */ 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 414 memory_line_size_c = (line_size_c * lb_bpc + 71) / 72; /* +71 to ceil */ 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 415 memory_line_size_a = (line_size + 5) / 6; /* +5 to ceil */ 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 416 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 417 if (lb_config == LB_MEMORY_CONFIG_1) { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 418 lb_memory_size = 816; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 419 lb_memory_size_c = 816; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 420 lb_memory_size_a = 984; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 421 } else if (lb_config == LB_MEMORY_CONFIG_2) { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 422 lb_memory_size = 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 423 lb_memory_size_c = 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 424 lb_memory_size_a = 1312; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 425 } else if (lb_config == LB_MEMORY_CONFIG_3) { 734a092b1fe407 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Eric Bernstein 2017-09-29 426 /* 420 mode: using 3rd mem from Y, Cr and Cb */ 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 427 lb_memory_size = 816 + 1088 + 848 + 848 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 428 lb_memory_size_c = 816 + 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 429 lb_memory_size_a = 984 + 1312 + 456; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 430 } else { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 431 lb_memory_size = 816 + 1088 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 432 lb_memory_size_c = 816 + 1088 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 433 lb_memory_size_a = 984 + 1312 + 456; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 434 } 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 435 *num_part_y = lb_memory_size / memory_line_size_y; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 436 *num_part_c = lb_memory_size_c / memory_line_size_c; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 437 num_partitions_a = lb_memory_size_a / memory_line_size_a; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 438 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 439 if (scl_data->lb_params.alpha_en 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 440 && (num_partitions_a < *num_part_y)) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 441 *num_part_y = num_partitions_a; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 442 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 443 if (*num_part_y > 64) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 444 *num_part_y = 64; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 445 if (*num_part_c > 64) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 446 *num_part_c = 64; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 447 :::::: The code at line 400 was first introduced by commit :::::: 5e9a81b2c465557adbaeef7231834e3ab40e4102 drm/amd/display: separate scl functions out from dcn10_dpp :::::: TO: Yue Hin Lau <Yuehin.Lau@amd.com> :::::: CC: Alex Deucher <alexander.deucher@amd.com> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
:::::: :::::: Manual check reason: "low confidence bisect report" :::::: BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: Mark Brown <broonie@kernel.org> tree: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/ci.git kselftest-clone3-set-tid head: 6ed9d474840a027cb6b1c5c16fbce9ed626c9dc8 commit: 6ed9d474840a027cb6b1c5c16fbce9ed626c9dc8 [2/2] kselftest/clone3: Make test names for set_tid test stable :::::: branch date: 3 days ago :::::: commit date: 3 days ago compiler: gcc-12 (Ubuntu 12.3.0-9ubuntu2) 12.3.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240328/202403280640.wfzWalmq-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/r/202403280640.wfzWalmq-lkp@intel.com/ All warnings (new ones prefixed by >>): In file included from clone3_set_tid.c:23: clone3_set_tid.c: In function 'test_clone3_set_tid': >> clone3_set_tid.c:136:43: warning: format '%d' expects argument of type 'int', but argument 3 has type 'size_t' {aka 'long unsigned int'} [-Wformat=] 136 | ksft_test_result(ret == expected, "%s with %d TIDs and flags 0x%x\n", | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | desc, set_tid_size, flags); | ~~~~~~~~~~~~ | | | size_t {aka long unsigned int} ../kselftest.h:210:39: note: in definition of macro 'ksft_test_result' 210 | ksft_test_result_pass(fmt, ##__VA_ARGS__);\ | ^~~ clone3_set_tid.c:136:53: note: format string is defined here 136 | ksft_test_result(ret == expected, "%s with %d TIDs and flags 0x%x\n", | ~^ | | | int | %ld >> clone3_set_tid.c:136:43: warning: format '%d' expects argument of type 'int', but argument 3 has type 'size_t' {aka 'long unsigned int'} [-Wformat=] 136 | ksft_test_result(ret == expected, "%s with %d TIDs and flags 0x%x\n", | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | desc, set_tid_size, flags); | ~~~~~~~~~~~~ | | | size_t {aka long unsigned int} ../kselftest.h:212:39: note: in definition of macro 'ksft_test_result' 212 | ksft_test_result_fail(fmt, ##__VA_ARGS__);\ | ^~~ clone3_set_tid.c:136:53: note: format string is defined here 136 | ksft_test_result(ret == expected, "%s with %d TIDs and flags 0x%x\n", | ~^ | | | int | %ld vim +136 tools/testing/selftests/clone3/clone3_set_tid.c 41585bbeeef940 Adrian Reber 2019-11-15 116 6ed9d474840a02 Mark Brown 2023-11-14 117 static void test_clone3_set_tid(const char *desc, 6ed9d474840a02 Mark Brown 2023-11-14 118 pid_t *set_tid, 41585bbeeef940 Adrian Reber 2019-11-15 119 size_t set_tid_size, 41585bbeeef940 Adrian Reber 2019-11-15 120 int flags, 41585bbeeef940 Adrian Reber 2019-11-15 121 int expected, 41585bbeeef940 Adrian Reber 2019-11-15 122 int expected_pid, 41585bbeeef940 Adrian Reber 2019-11-15 123 bool wait_for_it) 41585bbeeef940 Adrian Reber 2019-11-15 124 { 41585bbeeef940 Adrian Reber 2019-11-15 125 int ret; 41585bbeeef940 Adrian Reber 2019-11-15 126 41585bbeeef940 Adrian Reber 2019-11-15 127 ksft_print_msg( 41585bbeeef940 Adrian Reber 2019-11-15 128 "[%d] Trying clone3() with CLONE_SET_TID to %d and 0x%x\n", 41585bbeeef940 Adrian Reber 2019-11-15 129 getpid(), set_tid[0], flags); 41585bbeeef940 Adrian Reber 2019-11-15 130 ret = call_clone3_set_tid(set_tid, set_tid_size, flags, expected_pid, 41585bbeeef940 Adrian Reber 2019-11-15 131 wait_for_it); 41585bbeeef940 Adrian Reber 2019-11-15 132 ksft_print_msg( 41585bbeeef940 Adrian Reber 2019-11-15 133 "[%d] clone3() with CLONE_SET_TID %d says: %d - expected %d\n", 41585bbeeef940 Adrian Reber 2019-11-15 134 getpid(), set_tid[0], ret, expected); 6ed9d474840a02 Mark Brown 2023-11-14 135 6ed9d474840a02 Mark Brown 2023-11-14 @136 ksft_test_result(ret == expected, "%s with %d TIDs and flags 0x%x\n", 6ed9d474840a02 Mark Brown 2023-11-14 137 desc, set_tid_size, flags); 41585bbeeef940 Adrian Reber 2019-11-15 138 } 6ed9d474840a02 Mark Brown 2023-11-14 139 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: Revalla Hari Krishna <harikrishna.revalla@amd.com> CC: Alex Deucher <alexander.deucher@amd.com> CC: Martin Leung <martin.leung@amd.com> tree: https://gitlab.freedesktop.org/agd5f/linux.git drm-next head: d7f1487643552f18d1855474eba54a8ff3655935 commit: 88867807564e28409d8220419da7559364109a2a [57/194] drm/amd/display: Refactor DPP into a component directory :::::: branch date: 16 hours ago :::::: commit date: 7 days ago config: x86_64-randconfig-102-20240326 (https://download.01.org/0day-ci/archive/20240328/202403280621.G7aFGUDp-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403280621.G7aFGUDp-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:400:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:402:46-47: WARNING opportunity for min() -- >> drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c:269:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c:271:46-47: WARNING opportunity for min() -- >> drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c:43:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c:45:46-47: WARNING opportunity for min() vim +400 drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 390 dd93752b648309 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-10-10 391 void dpp1_dscl_calc_lb_num_partitions( 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 392 const struct scaler_data *scl_data, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 393 enum lb_memory_config lb_config, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 394 int *num_part_y, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 395 int *num_part_c) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 396 { 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 397 int lb_memory_size, lb_memory_size_c, lb_memory_size_a, num_partitions_a, 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 398 lb_bpc, memory_line_size_y, memory_line_size_c, memory_line_size_a; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 399 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 @400 int line_size = scl_data->viewport.width < scl_data->recout.width ? 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 401 scl_data->viewport.width : scl_data->recout.width; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 402 int line_size_c = scl_data->viewport_c.width < scl_data->recout.width ? 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 403 scl_data->viewport_c.width : scl_data->recout.width; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 404 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 405 if (line_size == 0) 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 406 line_size = 1; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 407 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 408 if (line_size_c == 0) 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 409 line_size_c = 1; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 410 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 411 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 412 lb_bpc = dpp1_dscl_get_lb_depth_bpc(scl_data->lb_params.depth); 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 413 memory_line_size_y = (line_size * lb_bpc + 71) / 72; /* +71 to ceil */ 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 414 memory_line_size_c = (line_size_c * lb_bpc + 71) / 72; /* +71 to ceil */ 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 415 memory_line_size_a = (line_size + 5) / 6; /* +5 to ceil */ 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 416 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 417 if (lb_config == LB_MEMORY_CONFIG_1) { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 418 lb_memory_size = 816; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 419 lb_memory_size_c = 816; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 420 lb_memory_size_a = 984; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 421 } else if (lb_config == LB_MEMORY_CONFIG_2) { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 422 lb_memory_size = 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 423 lb_memory_size_c = 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 424 lb_memory_size_a = 1312; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 425 } else if (lb_config == LB_MEMORY_CONFIG_3) { 734a092b1fe407 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Eric Bernstein 2017-09-29 426 /* 420 mode: using 3rd mem from Y, Cr and Cb */ 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 427 lb_memory_size = 816 + 1088 + 848 + 848 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 428 lb_memory_size_c = 816 + 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 429 lb_memory_size_a = 984 + 1312 + 456; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 430 } else { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 431 lb_memory_size = 816 + 1088 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 432 lb_memory_size_c = 816 + 1088 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 433 lb_memory_size_a = 984 + 1312 + 456; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 434 } 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 435 *num_part_y = lb_memory_size / memory_line_size_y; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 436 *num_part_c = lb_memory_size_c / memory_line_size_c; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 437 num_partitions_a = lb_memory_size_a / memory_line_size_a; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 438 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 439 if (scl_data->lb_params.alpha_en 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 440 && (num_partitions_a < *num_part_y)) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 441 *num_part_y = num_partitions_a; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 442 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 443 if (*num_part_y > 64) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 444 *num_part_y = 64; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 445 if (*num_part_c > 64) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 446 *num_part_c = 64; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 447 :::::: The code at line 400 was first introduced by commit :::::: 5e9a81b2c465557adbaeef7231834e3ab40e4102 drm/amd/display: separate scl functions out from dcn10_dpp :::::: TO: Yue Hin Lau <Yuehin.Lau@amd.com> :::::: CC: Alex Deucher <alexander.deucher@amd.com> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: linux-kernel@vger.kernel.org TO: Thomas Gleixner <tglx@linutronix.de> CC: "Borislav Petkov (AMD)" <bp@alien8.de> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 962490525cffee6270422206c9d5bdb12d472c2b commit: c90399fbd74a0713d5972a6d931e4a9918621e88 x86/cpu: Ensure that CPU info updates are propagated on UP date: 4 days ago :::::: branch date: 5 hours ago :::::: commit date: 4 days ago config: x86_64-randconfig-102-20240327 (https://download.01.org/0day-ci/archive/20240328/202403280539.R5tAQ3TJ-lkp@intel.com/config) compiler: gcc-12 (Ubuntu 12.3.0-9ubuntu2) 12.3.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403280539.R5tAQ3TJ-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> arch/x86/kernel/smpboot.c:1040:6-7: ERROR: iterator variable bound on line 1039 cannot be NULL vim +1040 arch/x86/kernel/smpboot.c 8aef135c73436fa Glauber de Oliveira Costa 2008-03-19 1033 ce2612b6706b4d0 Boris Ostrovsky 2021-11-02 1034 void __init smp_prepare_cpus_common(void) 8aef135c73436fa Glauber de Oliveira Costa 2008-03-19 1035 { 7ad728f98162cb1 Rusty Russell 2009-03-13 1036 unsigned int i; 7ad728f98162cb1 Rusty Russell 2009-03-13 1037 c90399fbd74a071 Thomas Gleixner 2024-03-22 1038 /* Mark all except the boot CPU as hotpluggable */ c90399fbd74a071 Thomas Gleixner 2024-03-22 @1039 for_each_possible_cpu(i) { c90399fbd74a071 Thomas Gleixner 2024-03-22 @1040 if (i) c90399fbd74a071 Thomas Gleixner 2024-03-22 1041 per_cpu(cpu_info.cpu_index, i) = nr_cpu_ids; c90399fbd74a071 Thomas Gleixner 2024-03-22 1042 } bd22a2f1982fa3e Tejun Heo 2011-01-23 1043 7ad728f98162cb1 Rusty Russell 2009-03-13 1044 for_each_possible_cpu(i) { 79f5599772ac2f1 Li Zefan 2009-06-15 1045 zalloc_cpumask_var(&per_cpu(cpu_sibling_map, i), GFP_KERNEL); 79f5599772ac2f1 Li Zefan 2009-06-15 1046 zalloc_cpumask_var(&per_cpu(cpu_core_map, i), GFP_KERNEL); 2e4c54dac7b360c Len Brown 2019-05-13 1047 zalloc_cpumask_var(&per_cpu(cpu_die_map, i), GFP_KERNEL); b3d7336db553d31 Yinghai Lu 2011-01-21 1048 zalloc_cpumask_var(&per_cpu(cpu_llc_shared_map, i), GFP_KERNEL); 66558b730f2533c Tim Chen 2021-09-24 1049 zalloc_cpumask_var(&per_cpu(cpu_l2c_shared_map, i), GFP_KERNEL); 7ad728f98162cb1 Rusty Russell 2009-03-13 1050 } 8f37961cf22304f Tim Chen 2016-09-21 1051 8aef135c73436fa Glauber de Oliveira Costa 2008-03-19 1052 set_cpu_sibling_map(0); ce2612b6706b4d0 Boris Ostrovsky 2021-11-02 1053 } ce2612b6706b4d0 Boris Ostrovsky 2021-11-02 1054 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Remove the kdoc for the removed 'req' member of the 9p_conn struct. Remove a pair of set-but-not-used v9ses variables. Signed-off-by: David Howells <dhowells@redhat.com> cc: Eric Van Hensbergen <ericvh@kernel.org> cc: Latchesar Ionkov <lucho@ionkov.net> cc: Dominique Martinet <asmadeus@codewreck.org> cc: Christian Schoenebeck <linux_oss@crudebyte.com> cc: v9fs@lists.linux.dev --- fs/9p/vfs_inode_dotl.c | 4 ---- net/9p/trans_fd.c | 1 - 2 files changed, 5 deletions(-) diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index ef9db3e03506..7af27ba1c25d 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -297,7 +297,6 @@ static int v9fs_vfs_mkdir_dotl(struct mnt_idmap *idmap, umode_t omode) { int err; - struct v9fs_session_info *v9ses; struct p9_fid *fid = NULL, *dfid = NULL; kgid_t gid; const unsigned char *name; @@ -307,7 +306,6 @@ static int v9fs_vfs_mkdir_dotl(struct mnt_idmap *idmap, struct posix_acl *dacl = NULL, *pacl = NULL; p9_debug(P9_DEBUG_VFS, "name %pd\n", dentry); - v9ses = v9fs_inode2v9ses(dir); omode |= S_IFDIR; if (dir->i_mode & S_ISGID) @@ -739,7 +737,6 @@ v9fs_vfs_mknod_dotl(struct mnt_idmap *idmap, struct inode *dir, kgid_t gid; const unsigned char *name; umode_t mode; - struct v9fs_session_info *v9ses; struct p9_fid *fid = NULL, *dfid = NULL; struct inode *inode; struct p9_qid qid; @@ -749,7 +746,6 @@ v9fs_vfs_mknod_dotl(struct mnt_idmap *idmap, struct inode *dir, dir->i_ino, dentry, omode, MAJOR(rdev), MINOR(rdev)); - v9ses = v9fs_inode2v9ses(dir); dfid = v9fs_parent_fid(dentry); if (IS_ERR(dfid)) { err = PTR_ERR(dfid); diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index 1a3948b8c493..196060dc6138 100644 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c @@ -95,7 +95,6 @@ struct p9_poll_wait { * @unsent_req_list: accounting for requests that haven't been sent * @rreq: read request * @wreq: write request - * @req: current request being processed (if any) * @tmp_buf: temporary buffer to read in header * @rc: temporary fcall for reading current frame * @wpos: write position for current frame
Linus, please merge this batch of hotfixes, thanks. The following changes since commit 4cece764965020c22cff7665b18a012006359095: Linux 6.9-rc1 (2024-03-24 14:10:05 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm tags/mm-hotfixes-stable-2024-03-27-11-25 for you to fetch changes up to 32fbe5246582af4f611ccccee33fd6e559087252: crash: use macro to add crashk_res into iomem early for specific arch (2024-03-26 11:14:12 -0700) ---------------------------------------------------------------- 21 hotfixes. 11 are cc:stable and the remainder address post-6.8 issues or aren't considered suitable for backporting. zswap figures prominently in the post-6.8 issues - folloup against the large amount of changes we have just made to that code. Apart from that, all over the map. ---------------------------------------------------------------- Baoquan He (1): crash: use macro to add crashk_res into iomem early for specific arch Barry Song (1): mm: zswap: fix kernel BUG in sg_init_one Carlos Maiolino (1): tmpfs: fix race on handling dquot rbtree Cong Liu (1): tools/Makefile: remove cgroup target Edward Liaw (2): selftests/mm: sigbus-wp test requires UFFD_FEATURE_WP_HUGETLBFS_SHMEM selftests/mm: fix ARM related issue with fork after pthread_create Johannes Weiner (3): mm: cachestat: fix two shmem bugs mm: zswap: fix writeback shinker GFP_NOIO/GFP_NOFS recursion mm: zswap: fix data loss on SWP_SYNCHRONOUS_IO devices John Sperbeck (1): init: open /initrd.image with O_LARGEFILE Kuan-Wei Chiu (1): MAINTAINERS: remove incorrect M: tag for dm-devel@lists.linux.dev Leonard Crestez (1): mailmap: update entry for Leonard Crestez Lokesh Gidra (1): userfaultfd: fix deadlock warning when locking src and dst VMAs Matthew Wilcox (Oracle) (1): mm: increase folio batch size Muhammad Usama Anjum (1): selftests: mm: restore settings from only parent process Nathan Chancellor (1): hexagon: vmlinux.lds.S: handle attributes section Oscar Salvador (1): mm,page_owner: fix recursion Peter Xu (1): mm/memory: fix missing pte marker for !page on pte zaps Vitaly Chikunov (1): selftests/mm: Fix build with _FORTIFY_SOURCE Zev Weiss (2): prctl: generalize PR_SET_MDWE support check to be per-arch ARM: prctl: reject PR_SET_MDWE on pre-ARMv6 .mailmap | 3 +- MAINTAINERS | 1 - arch/arm/include/asm/mman.h | 14 +++++++ arch/hexagon/kernel/vmlinux.lds.S | 1 + arch/parisc/include/asm/mman.h | 14 +++++++ arch/x86/include/asm/crash_reserve.h | 2 + include/linux/mman.h | 8 ++++ include/linux/pagevec.h | 4 +- init/initramfs.c | 2 +- kernel/crash_reserve.c | 7 ++++ kernel/sys.c | 7 +++- mm/filemap.c | 16 ++++++++ mm/memory.c | 4 +- mm/page_owner.c | 33 ++++++++++++----- mm/shmem_quota.c | 10 +++-- mm/userfaultfd.c | 3 +- mm/zswap.c | 45 ++++++++++++++++++++--- tools/Makefile | 13 +++---- tools/testing/selftests/mm/gup_test.c | 2 +- tools/testing/selftests/mm/protection_keys.c | 6 ++- tools/testing/selftests/mm/soft-dirty.c | 2 +- tools/testing/selftests/mm/split_huge_page_test.c | 2 +- tools/testing/selftests/mm/uffd-common.c | 3 ++ tools/testing/selftests/mm/uffd-common.h | 2 + tools/testing/selftests/mm/uffd-unit-tests.c | 13 ++++++- 25 files changed, 177 insertions(+), 40 deletions(-) create mode 100644 arch/arm/include/asm/mman.h create mode 100644 arch/parisc/include/asm/mman.h
mm, netfs: Provide a means of invalidation without using launder_folio Implement a replacement for launder_folio. The key feature of invalidate_inode_pages2() is that it locks each folio individually, unmaps it to prevent mmap'd accesses interfering and calls the ->launder_folio() address_space op to flush it. This has problems: firstly, each folio is written individually as one or more small writes; secondly, adjacent folios cannot be added so easily into the laundry; thirdly, it's yet another op to implement. Instead, use the invalidate lock to cause anyone wanting to add a folio to the inode to wait, then unmap all the folios if we have mmaps, then, conditionally, use ->writepages() to flush any dirty data back and then discard all pages. The invalidate lock prevents ->read_iter(), ->write_iter() and faulting through mmap all from adding pages for the duration. Signed-off-by: David Howells <dhowells@redhat.com> cc: Matthew Wilcox <willy@infradead.org> cc: Miklos Szeredi <miklos@szeredi.hu> cc: Trond Myklebust <trond.myklebust@hammerspace.com> cc: Christoph Hellwig <hch@lst.de> cc: Andrew Morton <akpm@linux-foundation.org> cc: Alexander Viro <viro@zeniv.linux.org.uk> cc: Christian Brauner <brauner@kernel.org> cc: Jeff Layton <jlayton@kernel.org> cc: linux-mm@kvack.org cc: linux-fsdevel@vger.kernel.org cc: netfs@lists.linux.dev cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: ceph-devel@vger.kernel.org cc: linux-cifs@vger.kernel.org cc: linux-nfs@vger.kernel.org cc: devel@lists.orangefs.org --- include/linux/pagemap.h | 1 + mm/filemap.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 2df35e65557d..4eb3d4177a53 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -40,6 +40,7 @@ int filemap_fdatawait_keep_errors(struct address_space *mapping); int filemap_fdatawait_range(struct address_space *, loff_t lstart, loff_t lend); int filemap_fdatawait_range_keep_errors(struct address_space *mapping, loff_t start_byte, loff_t end_byte); +int filemap_invalidate_inode(struct inode *inode, bool flush); static inline int filemap_fdatawait(struct address_space *mapping) { diff --git a/mm/filemap.c b/mm/filemap.c index 25983f0f96e3..98f439bedb44 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -4134,6 +4134,54 @@ bool filemap_release_folio(struct folio *folio, gfp_t gfp) } EXPORT_SYMBOL(filemap_release_folio); +/** + * filemap_invalidate_inode - Invalidate/forcibly write back an inode's pagecache + * @inode: The inode to flush + * @flush: Set to write back rather than simply invalidate. + * + * Invalidate all the folios on an inode, possibly writing them back first. + * Whilst the operation is undertaken, the invalidate lock is held to prevent + * new folios from being installed. + */ +int filemap_invalidate_inode(struct inode *inode, bool flush) +{ + struct address_space *mapping = inode->i_mapping; + + if (!mapping || !mapping->nrpages) + goto out; + + /* Prevent new folios from being added to the inode. */ + filemap_invalidate_lock(mapping); + + if (!mapping->nrpages) + goto unlock; + + /* Assume there are probably PTEs only if there are mmaps. */ + if (unlikely(!RB_EMPTY_ROOT(&mapping->i_mmap.rb_root))) + unmap_mapping_pages(mapping, 0, ULONG_MAX, false); + + /* Write back the data if we're asked to. */ + if (flush) { + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL, + .nr_to_write = LONG_MAX, + .range_start = 0, + .range_end = LLONG_MAX, + }; + + filemap_fdatawrite_wbc(mapping, &wbc); + } + + /* Wait for writeback to complete on all folios and discard. */ + truncate_inode_pages_range(mapping, 0, LLONG_MAX); + +unlock: + filemap_invalidate_unlock(mapping); +out: + return filemap_check_errors(mapping); +} +EXPORT_SYMBOL(filemap_invalidate_inode); + #ifdef CONFIG_CACHESTAT_SYSCALL /** * filemap_cachestat() - compute the page cache statistics of a mapping
Hi, >-----Original Message----- >From: Arnd Bergmann <arnd@arndb.de> >Sent: Wednesday, March 27, 2024 9:05 PM >To: Subbaraya Sundeep Bhatta <sbhatta@marvell.com>; Arnd Bergmann ><arnd@kernel.org>; llvm@lists.linux.dev; Ariel Elior <aelior@marvell.com>; >Manish Chopra <manishc@marvell.com> >Cc: David S . Miller <davem@davemloft.net>; Eric Dumazet ><edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo Abeni ><pabeni@redhat.com>; Nathan Chancellor <nathan@kernel.org>; Nick >Desaulniers <ndesaulniers@google.com>; Bill Wendling <morbo@google.com>; >Justin Stitt <justinstitt@google.com>; Simon Horman <horms@kernel.org>; >Konstantin Khorenko <khorenko@virtuozzo.com>; Sudarsana Reddy Kalluru ><sudarsana.kalluru@cavium.com>; Netdev <netdev@vger.kernel.org>; linux- >kernel@vger.kernel.org >Subject: Re: [EXTERNAL] [PATCH 3/9] qed: avoid truncating work queue length > >On Wed, Mar 27, 2024, at 15:04, Subbaraya Sundeep Bhatta wrote: > >>>- snprintf(name, NAME_SIZE, "slowpath-%02x:%02x.%02x", >>>- cdev->pdev->bus->number, >>>- PCI_SLOT(cdev->pdev->devfn), hwfn->abs_pf_id); >>>+ hwfn->slowpath_wq = alloc_workqueue("slowpath- >>>%02x:%02x.%02x", >>>+ 0, 0, cdev->pdev->bus->number, >>>+ PCI_SLOT(cdev->pdev->devfn), >>>+ hwfn->abs_pf_id); >> >> Confused. This should be alloc_workqueue("slowpath-%02x:%02x.%02x", >> cdev->pdev->bus->number, PCI_SLOT(cdev->pdev->devfn), hwfn->abs_pf_id, >> 0, 0); >> Right? > >I still think my version is the right one here, see the >prototype: > >__printf(1, 4) struct workqueue_struct * >alloc_workqueue(const char *fmt, unsigned int flags, int max_active, ...); > >so the first argument in the format, while the printf arguments >start after the flags and max_active arguments that are still both >set to zero. > My bad. Got it Thanks, Sundeep > Arnd
added to cifs-2.6.git (also added Fixes tag) pending testing
On Wed, Mar 27, 2024 at 10:00 AM David Howells <dhowells@redhat.com> wrote:
>
> fscache emits a lot of duplicate cookie warnings with cifs because the
> index key for the fscache cookies does not include everything that the
> cifs_find_inode() function does. The latter is used with iget5_locked() to
> distinguish between inodes in the local inode cache.
>
> Fix this by adding the creation time and file type to the fscache cookie
> key.
>
> Additionally, add a couple of comments to note that if one is changed the
> other must be also.
>
> Signed-off-by: David Howells <dhowells@redhat.com>
> cc: Steve French <sfrench@samba.org>
> cc: Shyam Prasad N <nspmangalore@gmail.com>
> cc: Rohith Surabattula <rohiths.msft@gmail.com>
> cc: Jeff Layton <jlayton@kernel.org>
> cc: linux-cifs@vger.kernel.org
> cc: netfs@lists.linux.dev
> cc: linux-fsdevel@vger.kernel.org
> ---
> fs/smb/client/fscache.c | 16 +++++++++++++++-
> fs/smb/client/inode.c | 2 ++
> 2 files changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/fs/smb/client/fscache.c b/fs/smb/client/fscache.c
> index c4a3cb736881..340efce8f052 100644
> --- a/fs/smb/client/fscache.c
> +++ b/fs/smb/client/fscache.c
> @@ -12,6 +12,16 @@
> #include "cifs_fs_sb.h"
> #include "cifsproto.h"
>
> +/*
> + * Key for fscache inode. [!] Contents must match comparisons in cifs_find_inode().
> + */
> +struct cifs_fscache_inode_key {
> +
> + __le64 uniqueid; /* server inode number */
> + __le64 createtime; /* creation time on server */
> + u8 type; /* S_IFMT file type */
> +} __packed;
> +
> static void cifs_fscache_fill_volume_coherency(
> struct cifs_tcon *tcon,
> struct cifs_fscache_volume_coherency_data *cd)
> @@ -97,15 +107,19 @@ void cifs_fscache_release_super_cookie(struct cifs_tcon *tcon)
> void cifs_fscache_get_inode_cookie(struct inode *inode)
> {
> struct cifs_fscache_inode_coherency_data cd;
> + struct cifs_fscache_inode_key key;
> struct cifsInodeInfo *cifsi = CIFS_I(inode);
> struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
> struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
>
> + key.uniqueid = cpu_to_le64(cifsi->uniqueid);
> + key.createtime = cpu_to_le64(cifsi->createtime);
> + key.type = (inode->i_mode & S_IFMT) >> 12;
> cifs_fscache_fill_coherency(&cifsi->netfs.inode, &cd);
>
> cifsi->netfs.cache =
> fscache_acquire_cookie(tcon->fscache, 0,
> - &cifsi->uniqueid, sizeof(cifsi->uniqueid),
> + &key, sizeof(key),
> &cd, sizeof(cd),
> i_size_read(&cifsi->netfs.inode));
> if (cifsi->netfs.cache)
> diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c
> index d28ab0af6049..91b07ef9e25c 100644
> --- a/fs/smb/client/inode.c
> +++ b/fs/smb/client/inode.c
> @@ -1351,6 +1351,8 @@ cifs_find_inode(struct inode *inode, void *opaque)
> {
> struct cifs_fattr *fattr = opaque;
>
> + /* [!] The compared values must be the same in struct cifs_fscache_inode_key. */
> +
> /* don't match inode with different uniqueid */
> if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
> return 0;
>
>
--
Thanks,
Steve
On Wed, 2024-03-27 at 15:04 +0000, David Howells wrote:
> Implement a replacement for launder_folio[1]. The key feature of
> invalidate_inode_pages2() is that it locks each folio individually,
> unmaps
> it to prevent mmap'd accesses interfering and calls the -
> >launder_folio()
> address_space op to flush it. This has problems: firstly, each folio
> is
> written individually as one or more small writes; secondly, adjacent
> folios
> cannot be added so easily into the laundry; thirdly, it's yet another
> op to
> implement.
>
> Here's a bit of a hacked together solution which should probably be
> moved
> to mm/:
>
> Use the mmap lock to cause future faulting to wait, then unmap all
> the
> folios if we have mmaps, then, conditionally, use ->writepages() to
> flush
> any dirty data back and then discard all pages. The caller needs to
> hold a
> lock to prevent ->write_iter() getting underfoot.
>
> Note that this does not prevent ->read_iter() from accessing the file
> whilst we do this since that may operate without locking.
>
> We also have the writeback_control available and so have the
> opportunity to
> set a flag in it to tell the filesystem that we're doing an
> invalidation.
>
> Signed-off-by: David Howells <dhowells@redhat.com>
> cc: Matthew Wilcox <willy@infradead.org>
> cc: Miklos Szeredi <miklos@szeredi.hu>
> cc: Trond Myklebust <trond.myklebust@hammerspace.com>
> cc: Christoph Hellwig <hch@lst.de>
> cc: Andrew Morton <akpm@linux-foundation.org>
> cc: Alexander Viro <viro@zeniv.linux.org.uk>
> cc: Christian Brauner <brauner@kernel.org>
> cc: Jeff Layton <jlayton@kernel.org>
> cc: linux-mm@kvack.org
> cc: linux-fsdevel@vger.kernel.org
> cc: netfs@lists.linux.dev
> cc: v9fs@lists.linux.dev
> cc: linux-afs@lists.infradead.org
> cc: ceph-devel@vger.kernel.org
> cc: linux-cifs@vger.kernel.org
> cc: linux-nfs@vger.kernel.org
> cc: devel@lists.orangefs.org
> Link:
> https://lore.kernel.org/r/1668172.1709764777@warthog.procyon.org.uk/
> [1]
> ---
> fs/netfs/misc.c | 56
> ++++++++++++++++++++++++++++++++++++++++++++++++++
> include/linux/netfs.h | 3 ++
> mm/memory.c | 3 +-
> 3 files changed, 61 insertions(+), 1 deletion(-)
>
> diff --git a/fs/netfs/misc.c b/fs/netfs/misc.c
> index bc1fc54fb724..774ce825fbec 100644
> --- a/fs/netfs/misc.c
> +++ b/fs/netfs/misc.c
> @@ -250,3 +250,59 @@ bool netfs_release_folio(struct folio *folio,
> gfp_t gfp)
> return true;
> }
> EXPORT_SYMBOL(netfs_release_folio);
> +
> +extern void unmap_mapping_range_tree(struct rb_root_cached *root,
> + pgoff_t first_index,
> + pgoff_t last_index,
> + struct zap_details *details);
> +
> +/**
> + * netfs_invalidate_inode - Invalidate/forcibly write back an
> inode's pagecache
> + * @inode: The inode to flush
> + * @flush: Set to write back rather than simply invalidate.
> + *
> + * Invalidate all the folios on an inode, possibly writing them back
> first.
> + * Whilst the operation is undertaken, the mmap lock is held to
> prevent
> + * ->fault() from reinstalling the folios. The caller must hold a
> lock on the
> + * inode sufficient to prevent ->write_iter() from dirtying more
> folios.
> + */
> +int netfs_invalidate_inode(struct inode *inode, bool flush)
> +{
> + struct address_space *mapping = inode->i_mapping;
> +
> + if (!mapping || !mapping->nrpages)
> + goto out;
> +
> + /* Prevent folios from being faulted in. */
> + i_mmap_lock_write(mapping);
> +
> + if (!mapping->nrpages)
> + goto unlock;
> +
> + /* Assume there are probably PTEs only if there are mmaps.
> */
> + if (unlikely(!RB_EMPTY_ROOT(&mapping->i_mmap.rb_root))) {
> + struct zap_details details = { };
> +
> + unmap_mapping_range_tree(&mapping->i_mmap, 0,
> LLONG_MAX, &details);
> + }
> +
> + /* Write back the data if we're asked to. */
> + if (flush) {
> + struct writeback_control wbc = {
> + .sync_mode = WB_SYNC_ALL,
> + .nr_to_write = LONG_MAX,
> + .range_start = 0,
> + .range_end = LLONG_MAX,
> + };
> +
> + filemap_fdatawrite_wbc(mapping, &wbc);
> + }
> +
> + /* Wait for writeback to complete on all folios and discard.
> */
> + truncate_inode_pages_range(mapping, 0, LLONG_MAX);
> +
> +unlock:
> + i_mmap_unlock_write(mapping);
> +out:
> + return filemap_check_errors(mapping);
> +}
> diff --git a/include/linux/netfs.h b/include/linux/netfs.h
> index 298552f5122c..40dc34ee291d 100644
> --- a/include/linux/netfs.h
> +++ b/include/linux/netfs.h
> @@ -400,6 +400,9 @@ ssize_t netfs_buffered_write_iter_locked(struct
> kiocb *iocb, struct iov_iter *fr
> ssize_t netfs_unbuffered_write_iter(struct kiocb *iocb, struct
> iov_iter *from);
> ssize_t netfs_file_write_iter(struct kiocb *iocb, struct iov_iter
> *from);
>
> +/* High-level invalidation API */
> +int netfs_invalidate_inode(struct inode *inode, bool flush);
> +
> /* Address operations API */
> struct readahead_control;
> void netfs_readahead(struct readahead_control *);
> diff --git a/mm/memory.c b/mm/memory.c
> index f2bc6dd15eb8..106f32c7d7fb 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
> @@ -3665,7 +3665,7 @@ static void unmap_mapping_range_vma(struct
> vm_area_struct *vma,
> zap_page_range_single(vma, start_addr, end_addr -
> start_addr, details);
> }
>
> -static inline void unmap_mapping_range_tree(struct rb_root_cached
> *root,
> +inline void unmap_mapping_range_tree(struct rb_root_cached *root,
> pgoff_t first_index,
> pgoff_t last_index,
> struct zap_details
> *details)
> @@ -3685,6 +3685,7 @@ static inline void
> unmap_mapping_range_tree(struct rb_root_cached *root,
> details);
> }
> }
> +EXPORT_SYMBOL_GPL(unmap_mapping_range_tree);
>
> /**
> * unmap_mapping_folio() - Unmap single folio from processes.
>
This is hardly a drop-in replacement for launder_page. The whole point
of using invalidate_inode_pages2() was that it only requires taking the
page locks, allowing us to use it in contexts such as
nfs_release_file().
The above use of truncate_inode_pages_range() will require any caller
to grab several locks in order to prevent data loss through races with
write system calls.
--
Trond Myklebust
Linux NFS client maintainer, Hammerspace
trond.myklebust@hammerspace.com
This is a note to let you know that I've just added the patch titled misc: lis3lv02d_i2c: Fix regulators getting en-/dis-abled twice on suspend/resume to the 6.7-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: misc-lis3lv02d_i2c-fix-regulators-getting-en-dis-abled-twice-on-suspend-resume.patch and it can be found in the queue-6.7 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@vger.kernel.org> know about it. From ac3e0384073b2408d6cb0d972fee9fcc3776053d Mon Sep 17 00:00:00 2001 From: Hans de Goede <hdegoede@redhat.com> Date: Tue, 20 Feb 2024 20:00:35 +0100 Subject: misc: lis3lv02d_i2c: Fix regulators getting en-/dis-abled twice on suspend/resume From: Hans de Goede <hdegoede@redhat.com> commit ac3e0384073b2408d6cb0d972fee9fcc3776053d upstream. When not configured for wakeup lis3lv02d_i2c_suspend() will call lis3lv02d_poweroff() even if the device has already been turned off by the runtime-suspend handler and if configured for wakeup and the device is runtime-suspended at this point then it is not turned back on to serve as a wakeup source. Before commit b1b9f7a49440 ("misc: lis3lv02d_i2c: Add missing setting of the reg_ctrl callback"), lis3lv02d_poweroff() failed to disable the regulators which as a side effect made calling poweroff() twice ok. Now that poweroff() correctly disables the regulators, doing this twice triggers a WARN() in the regulator core: unbalanced disables for regulator-dummy WARNING: CPU: 1 PID: 92 at drivers/regulator/core.c:2999 _regulator_disable ... Fix lis3lv02d_i2c_suspend() to not call poweroff() a second time if already runtime-suspended and add a poweron() call when necessary to make wakeup work. lis3lv02d_i2c_resume() has similar issues, with an added weirness that it always powers on the device if it is runtime suspended, after which the first runtime-resume will call poweron() again, causing the enabled count for the regulator to increase by 1 every suspend/resume. These unbalanced regulator_enable() calls cause the regulator to never be turned off and trigger the following WARN() on driver unbind: WARNING: CPU: 1 PID: 1724 at drivers/regulator/core.c:2396 _regulator_put Fix this by making lis3lv02d_i2c_resume() mirror the new suspend(). Fixes: b1b9f7a49440 ("misc: lis3lv02d_i2c: Add missing setting of the reg_ctrl callback") Reported-by: Paul Menzel <pmenzel@molgen.mpg.de> Closes: https://lore.kernel.org/regressions/5fc6da74-af0a-4aac-b4d5-a000b39a63a5@molgen.mpg.de/ Cc: stable@vger.kernel.org Cc: regressions@lists.linux.dev Signed-off-by: Hans de Goede <hdegoede@redhat.com> Tested-by: Paul Menzel <pmenzel@molgen.mpg.de> # Dell XPS 15 7590 Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de> Link: https://lore.kernel.org/r/20240220190035.53402-1-hdegoede@redhat.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- drivers/misc/lis3lv02d/lis3lv02d_i2c.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) --- a/drivers/misc/lis3lv02d/lis3lv02d_i2c.c +++ b/drivers/misc/lis3lv02d/lis3lv02d_i2c.c @@ -198,8 +198,14 @@ static int lis3lv02d_i2c_suspend(struct struct i2c_client *client = to_i2c_client(dev); struct lis3lv02d *lis3 = i2c_get_clientdata(client); - if (!lis3->pdata || !lis3->pdata->wakeup_flags) + /* Turn on for wakeup if turned off by runtime suspend */ + if (lis3->pdata && lis3->pdata->wakeup_flags) { + if (pm_runtime_suspended(dev)) + lis3lv02d_poweron(lis3); + /* For non wakeup turn off if not already turned off by runtime suspend */ + } else if (!pm_runtime_suspended(dev)) lis3lv02d_poweroff(lis3); + return 0; } @@ -208,13 +214,12 @@ static int lis3lv02d_i2c_resume(struct d struct i2c_client *client = to_i2c_client(dev); struct lis3lv02d *lis3 = i2c_get_clientdata(client); - /* - * pm_runtime documentation says that devices should always - * be powered on at resume. Pm_runtime turns them off after system - * wide resume is complete. - */ - if (!lis3->pdata || !lis3->pdata->wakeup_flags || - pm_runtime_suspended(dev)) + /* Turn back off if turned on for wakeup and runtime suspended*/ + if (lis3->pdata && lis3->pdata->wakeup_flags) { + if (pm_runtime_suspended(dev)) + lis3lv02d_poweroff(lis3); + /* For non wakeup turn back on if not runtime suspended */ + } else if (!pm_runtime_suspended(dev)) lis3lv02d_poweron(lis3); return 0; Patches currently in stable-queue which might be from hdegoede@redhat.com are queue-6.7/ahci-asm1064-asm1166-don-t-limit-reported-ports.patch queue-6.7/misc-lis3lv02d_i2c-fix-regulators-getting-en-dis-abled-twice-on-suspend-resume.patch
This is a note to let you know that I've just added the patch titled misc: lis3lv02d_i2c: Fix regulators getting en-/dis-abled twice on suspend/resume to the 6.6-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: misc-lis3lv02d_i2c-fix-regulators-getting-en-dis-abled-twice-on-suspend-resume.patch and it can be found in the queue-6.6 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@vger.kernel.org> know about it. From ac3e0384073b2408d6cb0d972fee9fcc3776053d Mon Sep 17 00:00:00 2001 From: Hans de Goede <hdegoede@redhat.com> Date: Tue, 20 Feb 2024 20:00:35 +0100 Subject: misc: lis3lv02d_i2c: Fix regulators getting en-/dis-abled twice on suspend/resume From: Hans de Goede <hdegoede@redhat.com> commit ac3e0384073b2408d6cb0d972fee9fcc3776053d upstream. When not configured for wakeup lis3lv02d_i2c_suspend() will call lis3lv02d_poweroff() even if the device has already been turned off by the runtime-suspend handler and if configured for wakeup and the device is runtime-suspended at this point then it is not turned back on to serve as a wakeup source. Before commit b1b9f7a49440 ("misc: lis3lv02d_i2c: Add missing setting of the reg_ctrl callback"), lis3lv02d_poweroff() failed to disable the regulators which as a side effect made calling poweroff() twice ok. Now that poweroff() correctly disables the regulators, doing this twice triggers a WARN() in the regulator core: unbalanced disables for regulator-dummy WARNING: CPU: 1 PID: 92 at drivers/regulator/core.c:2999 _regulator_disable ... Fix lis3lv02d_i2c_suspend() to not call poweroff() a second time if already runtime-suspended and add a poweron() call when necessary to make wakeup work. lis3lv02d_i2c_resume() has similar issues, with an added weirness that it always powers on the device if it is runtime suspended, after which the first runtime-resume will call poweron() again, causing the enabled count for the regulator to increase by 1 every suspend/resume. These unbalanced regulator_enable() calls cause the regulator to never be turned off and trigger the following WARN() on driver unbind: WARNING: CPU: 1 PID: 1724 at drivers/regulator/core.c:2396 _regulator_put Fix this by making lis3lv02d_i2c_resume() mirror the new suspend(). Fixes: b1b9f7a49440 ("misc: lis3lv02d_i2c: Add missing setting of the reg_ctrl callback") Reported-by: Paul Menzel <pmenzel@molgen.mpg.de> Closes: https://lore.kernel.org/regressions/5fc6da74-af0a-4aac-b4d5-a000b39a63a5@molgen.mpg.de/ Cc: stable@vger.kernel.org Cc: regressions@lists.linux.dev Signed-off-by: Hans de Goede <hdegoede@redhat.com> Tested-by: Paul Menzel <pmenzel@molgen.mpg.de> # Dell XPS 15 7590 Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de> Link: https://lore.kernel.org/r/20240220190035.53402-1-hdegoede@redhat.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- drivers/misc/lis3lv02d/lis3lv02d_i2c.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) --- a/drivers/misc/lis3lv02d/lis3lv02d_i2c.c +++ b/drivers/misc/lis3lv02d/lis3lv02d_i2c.c @@ -198,8 +198,14 @@ static int lis3lv02d_i2c_suspend(struct struct i2c_client *client = to_i2c_client(dev); struct lis3lv02d *lis3 = i2c_get_clientdata(client); - if (!lis3->pdata || !lis3->pdata->wakeup_flags) + /* Turn on for wakeup if turned off by runtime suspend */ + if (lis3->pdata && lis3->pdata->wakeup_flags) { + if (pm_runtime_suspended(dev)) + lis3lv02d_poweron(lis3); + /* For non wakeup turn off if not already turned off by runtime suspend */ + } else if (!pm_runtime_suspended(dev)) lis3lv02d_poweroff(lis3); + return 0; } @@ -208,13 +214,12 @@ static int lis3lv02d_i2c_resume(struct d struct i2c_client *client = to_i2c_client(dev); struct lis3lv02d *lis3 = i2c_get_clientdata(client); - /* - * pm_runtime documentation says that devices should always - * be powered on at resume. Pm_runtime turns them off after system - * wide resume is complete. - */ - if (!lis3->pdata || !lis3->pdata->wakeup_flags || - pm_runtime_suspended(dev)) + /* Turn back off if turned on for wakeup and runtime suspended*/ + if (lis3->pdata && lis3->pdata->wakeup_flags) { + if (pm_runtime_suspended(dev)) + lis3lv02d_poweroff(lis3); + /* For non wakeup turn back on if not runtime suspended */ + } else if (!pm_runtime_suspended(dev)) lis3lv02d_poweron(lis3); return 0; Patches currently in stable-queue which might be from hdegoede@redhat.com are queue-6.6/ahci-asm1064-asm1166-don-t-limit-reported-ports.patch queue-6.6/misc-lis3lv02d_i2c-fix-regulators-getting-en-dis-abled-twice-on-suspend-resume.patch
This is a note to let you know that I've just added the patch titled misc: lis3lv02d_i2c: Fix regulators getting en-/dis-abled twice on suspend/resume to the 6.1-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: misc-lis3lv02d_i2c-fix-regulators-getting-en-dis-abled-twice-on-suspend-resume.patch and it can be found in the queue-6.1 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@vger.kernel.org> know about it. From ac3e0384073b2408d6cb0d972fee9fcc3776053d Mon Sep 17 00:00:00 2001 From: Hans de Goede <hdegoede@redhat.com> Date: Tue, 20 Feb 2024 20:00:35 +0100 Subject: misc: lis3lv02d_i2c: Fix regulators getting en-/dis-abled twice on suspend/resume From: Hans de Goede <hdegoede@redhat.com> commit ac3e0384073b2408d6cb0d972fee9fcc3776053d upstream. When not configured for wakeup lis3lv02d_i2c_suspend() will call lis3lv02d_poweroff() even if the device has already been turned off by the runtime-suspend handler and if configured for wakeup and the device is runtime-suspended at this point then it is not turned back on to serve as a wakeup source. Before commit b1b9f7a49440 ("misc: lis3lv02d_i2c: Add missing setting of the reg_ctrl callback"), lis3lv02d_poweroff() failed to disable the regulators which as a side effect made calling poweroff() twice ok. Now that poweroff() correctly disables the regulators, doing this twice triggers a WARN() in the regulator core: unbalanced disables for regulator-dummy WARNING: CPU: 1 PID: 92 at drivers/regulator/core.c:2999 _regulator_disable ... Fix lis3lv02d_i2c_suspend() to not call poweroff() a second time if already runtime-suspended and add a poweron() call when necessary to make wakeup work. lis3lv02d_i2c_resume() has similar issues, with an added weirness that it always powers on the device if it is runtime suspended, after which the first runtime-resume will call poweron() again, causing the enabled count for the regulator to increase by 1 every suspend/resume. These unbalanced regulator_enable() calls cause the regulator to never be turned off and trigger the following WARN() on driver unbind: WARNING: CPU: 1 PID: 1724 at drivers/regulator/core.c:2396 _regulator_put Fix this by making lis3lv02d_i2c_resume() mirror the new suspend(). Fixes: b1b9f7a49440 ("misc: lis3lv02d_i2c: Add missing setting of the reg_ctrl callback") Reported-by: Paul Menzel <pmenzel@molgen.mpg.de> Closes: https://lore.kernel.org/regressions/5fc6da74-af0a-4aac-b4d5-a000b39a63a5@molgen.mpg.de/ Cc: stable@vger.kernel.org Cc: regressions@lists.linux.dev Signed-off-by: Hans de Goede <hdegoede@redhat.com> Tested-by: Paul Menzel <pmenzel@molgen.mpg.de> # Dell XPS 15 7590 Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de> Link: https://lore.kernel.org/r/20240220190035.53402-1-hdegoede@redhat.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- drivers/misc/lis3lv02d/lis3lv02d_i2c.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) --- a/drivers/misc/lis3lv02d/lis3lv02d_i2c.c +++ b/drivers/misc/lis3lv02d/lis3lv02d_i2c.c @@ -199,8 +199,14 @@ static int lis3lv02d_i2c_suspend(struct struct i2c_client *client = to_i2c_client(dev); struct lis3lv02d *lis3 = i2c_get_clientdata(client); - if (!lis3->pdata || !lis3->pdata->wakeup_flags) + /* Turn on for wakeup if turned off by runtime suspend */ + if (lis3->pdata && lis3->pdata->wakeup_flags) { + if (pm_runtime_suspended(dev)) + lis3lv02d_poweron(lis3); + /* For non wakeup turn off if not already turned off by runtime suspend */ + } else if (!pm_runtime_suspended(dev)) lis3lv02d_poweroff(lis3); + return 0; } @@ -209,13 +215,12 @@ static int lis3lv02d_i2c_resume(struct d struct i2c_client *client = to_i2c_client(dev); struct lis3lv02d *lis3 = i2c_get_clientdata(client); - /* - * pm_runtime documentation says that devices should always - * be powered on at resume. Pm_runtime turns them off after system - * wide resume is complete. - */ - if (!lis3->pdata || !lis3->pdata->wakeup_flags || - pm_runtime_suspended(dev)) + /* Turn back off if turned on for wakeup and runtime suspended*/ + if (lis3->pdata && lis3->pdata->wakeup_flags) { + if (pm_runtime_suspended(dev)) + lis3lv02d_poweroff(lis3); + /* For non wakeup turn back on if not runtime suspended */ + } else if (!pm_runtime_suspended(dev)) lis3lv02d_poweron(lis3); return 0; Patches currently in stable-queue which might be from hdegoede@redhat.com are queue-6.1/platform-x86-p2sb-on-goldmont-only-cache-p2sb-and-spi-devfn-bar.patch queue-6.1/ahci-asm1064-asm1166-don-t-limit-reported-ports.patch queue-6.1/misc-lis3lv02d_i2c-fix-regulators-getting-en-dis-abled-twice-on-suspend-resume.patch
Implement a replacement for launder_folio[1]. The key feature of invalidate_inode_pages2() is that it locks each folio individually, unmaps it to prevent mmap'd accesses interfering and calls the ->launder_folio() address_space op to flush it. This has problems: firstly, each folio is written individually as one or more small writes; secondly, adjacent folios cannot be added so easily into the laundry; thirdly, it's yet another op to implement. Here's a bit of a hacked together solution which should probably be moved to mm/: Use the mmap lock to cause future faulting to wait, then unmap all the folios if we have mmaps, then, conditionally, use ->writepages() to flush any dirty data back and then discard all pages. The caller needs to hold a lock to prevent ->write_iter() getting underfoot. Note that this does not prevent ->read_iter() from accessing the file whilst we do this since that may operate without locking. We also have the writeback_control available and so have the opportunity to set a flag in it to tell the filesystem that we're doing an invalidation. Signed-off-by: David Howells <dhowells@redhat.com> cc: Matthew Wilcox <willy@infradead.org> cc: Miklos Szeredi <miklos@szeredi.hu> cc: Trond Myklebust <trond.myklebust@hammerspace.com> cc: Christoph Hellwig <hch@lst.de> cc: Andrew Morton <akpm@linux-foundation.org> cc: Alexander Viro <viro@zeniv.linux.org.uk> cc: Christian Brauner <brauner@kernel.org> cc: Jeff Layton <jlayton@kernel.org> cc: linux-mm@kvack.org cc: linux-fsdevel@vger.kernel.org cc: netfs@lists.linux.dev cc: v9fs@lists.linux.dev cc: linux-afs@lists.infradead.org cc: ceph-devel@vger.kernel.org cc: linux-cifs@vger.kernel.org cc: linux-nfs@vger.kernel.org cc: devel@lists.orangefs.org Link: https://lore.kernel.org/r/1668172.1709764777@warthog.procyon.org.uk/ [1] --- fs/netfs/misc.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/netfs.h | 3 ++ mm/memory.c | 3 +- 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/fs/netfs/misc.c b/fs/netfs/misc.c index bc1fc54fb724..774ce825fbec 100644 --- a/fs/netfs/misc.c +++ b/fs/netfs/misc.c @@ -250,3 +250,59 @@ bool netfs_release_folio(struct folio *folio, gfp_t gfp) return true; } EXPORT_SYMBOL(netfs_release_folio); + +extern void unmap_mapping_range_tree(struct rb_root_cached *root, + pgoff_t first_index, + pgoff_t last_index, + struct zap_details *details); + +/** + * netfs_invalidate_inode - Invalidate/forcibly write back an inode's pagecache + * @inode: The inode to flush + * @flush: Set to write back rather than simply invalidate. + * + * Invalidate all the folios on an inode, possibly writing them back first. + * Whilst the operation is undertaken, the mmap lock is held to prevent + * ->fault() from reinstalling the folios. The caller must hold a lock on the + * inode sufficient to prevent ->write_iter() from dirtying more folios. + */ +int netfs_invalidate_inode(struct inode *inode, bool flush) +{ + struct address_space *mapping = inode->i_mapping; + + if (!mapping || !mapping->nrpages) + goto out; + + /* Prevent folios from being faulted in. */ + i_mmap_lock_write(mapping); + + if (!mapping->nrpages) + goto unlock; + + /* Assume there are probably PTEs only if there are mmaps. */ + if (unlikely(!RB_EMPTY_ROOT(&mapping->i_mmap.rb_root))) { + struct zap_details details = { }; + + unmap_mapping_range_tree(&mapping->i_mmap, 0, LLONG_MAX, &details); + } + + /* Write back the data if we're asked to. */ + if (flush) { + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL, + .nr_to_write = LONG_MAX, + .range_start = 0, + .range_end = LLONG_MAX, + }; + + filemap_fdatawrite_wbc(mapping, &wbc); + } + + /* Wait for writeback to complete on all folios and discard. */ + truncate_inode_pages_range(mapping, 0, LLONG_MAX); + +unlock: + i_mmap_unlock_write(mapping); +out: + return filemap_check_errors(mapping); +} diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 298552f5122c..40dc34ee291d 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -400,6 +400,9 @@ ssize_t netfs_buffered_write_iter_locked(struct kiocb *iocb, struct iov_iter *fr ssize_t netfs_unbuffered_write_iter(struct kiocb *iocb, struct iov_iter *from); ssize_t netfs_file_write_iter(struct kiocb *iocb, struct iov_iter *from); +/* High-level invalidation API */ +int netfs_invalidate_inode(struct inode *inode, bool flush); + /* Address operations API */ struct readahead_control; void netfs_readahead(struct readahead_control *); diff --git a/mm/memory.c b/mm/memory.c index f2bc6dd15eb8..106f32c7d7fb 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3665,7 +3665,7 @@ static void unmap_mapping_range_vma(struct vm_area_struct *vma, zap_page_range_single(vma, start_addr, end_addr - start_addr, details); } -static inline void unmap_mapping_range_tree(struct rb_root_cached *root, +inline void unmap_mapping_range_tree(struct rb_root_cached *root, pgoff_t first_index, pgoff_t last_index, struct zap_details *details) @@ -3685,6 +3685,7 @@ static inline void unmap_mapping_range_tree(struct rb_root_cached *root, details); } } +EXPORT_SYMBOL_GPL(unmap_mapping_range_tree); /** * unmap_mapping_folio() - Unmap single folio from processes.
fscache emits a lot of duplicate cookie warnings with cifs because the index key for the fscache cookies does not include everything that the cifs_find_inode() function does. The latter is used with iget5_locked() to distinguish between inodes in the local inode cache. Fix this by adding the creation time and file type to the fscache cookie key. Additionally, add a couple of comments to note that if one is changed the other must be also. Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Shyam Prasad N <nspmangalore@gmail.com> cc: Rohith Surabattula <rohiths.msft@gmail.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/smb/client/fscache.c | 16 +++++++++++++++- fs/smb/client/inode.c | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/fscache.c b/fs/smb/client/fscache.c index c4a3cb736881..340efce8f052 100644 --- a/fs/smb/client/fscache.c +++ b/fs/smb/client/fscache.c @@ -12,6 +12,16 @@ #include "cifs_fs_sb.h" #include "cifsproto.h" +/* + * Key for fscache inode. [!] Contents must match comparisons in cifs_find_inode(). + */ +struct cifs_fscache_inode_key { + + __le64 uniqueid; /* server inode number */ + __le64 createtime; /* creation time on server */ + u8 type; /* S_IFMT file type */ +} __packed; + static void cifs_fscache_fill_volume_coherency( struct cifs_tcon *tcon, struct cifs_fscache_volume_coherency_data *cd) @@ -97,15 +107,19 @@ void cifs_fscache_release_super_cookie(struct cifs_tcon *tcon) void cifs_fscache_get_inode_cookie(struct inode *inode) { struct cifs_fscache_inode_coherency_data cd; + struct cifs_fscache_inode_key key; struct cifsInodeInfo *cifsi = CIFS_I(inode); struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); + key.uniqueid = cpu_to_le64(cifsi->uniqueid); + key.createtime = cpu_to_le64(cifsi->createtime); + key.type = (inode->i_mode & S_IFMT) >> 12; cifs_fscache_fill_coherency(&cifsi->netfs.inode, &cd); cifsi->netfs.cache = fscache_acquire_cookie(tcon->fscache, 0, - &cifsi->uniqueid, sizeof(cifsi->uniqueid), + &key, sizeof(key), &cd, sizeof(cd), i_size_read(&cifsi->netfs.inode)); if (cifsi->netfs.cache) diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index d28ab0af6049..91b07ef9e25c 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -1351,6 +1351,8 @@ cifs_find_inode(struct inode *inode, void *opaque) { struct cifs_fattr *fattr = opaque; + /* [!] The compared values must be the same in struct cifs_fscache_inode_key. */ + /* don't match inode with different uniqueid */ if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid) return 0;
Hi, >-----Original Message----- >From: Arnd Bergmann <arnd@kernel.org> >Sent: Wednesday, March 27, 2024 4:08 AM >To: llvm@lists.linux.dev; Saeed Mahameed <saeedm@nvidia.com>; Leon >Romanovsky <leon@kernel.org> >Cc: Arnd Bergmann <arnd@arndb.de>; David S. Miller <davem@davemloft.net>; >Eric Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo >Abeni <pabeni@redhat.com>; Nathan Chancellor <nathan@kernel.org>; Nick >Desaulniers <ndesaulniers@google.com>; Bill Wendling <morbo@google.com>; >Justin Stitt <justinstitt@google.com>; Vlad Buslov <vladbu@nvidia.com>; Roi >Dayan <roid@nvidia.com>; Maor Dickman <maord@nvidia.com>; Gal Pressman ><gal@nvidia.com>; netdev@vger.kernel.org; linux-rdma@vger.kernel.org; linux- >kernel@vger.kernel.org >Subject: [PATCH 4/9] mlx5: avoid truncating error message > >From: Arnd Bergmann <arnd@arndb.de> > >clang warns that one error message is too long for its destination buffer: > >drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c:1876:4: error: 'snprintf' >will always be truncated; specified size is 80, but format string expands to at least >94 [-Werror,-Wformat-truncation-non-kprintf] > >Reword it to be a bit shorter so it always fits. > >Fixes: 70f0302b3f20 ("net/mlx5: Bridge, implement mdb offload") >Signed-off-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Subbaraya Sundeep <sbhatta@marvell.com> Thanks, Sundeep >--- > drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > >diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c >b/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c >index 1b9bc32efd6f..c5ea1d1d2b03 100644 >--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c >+++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c >@@ -1874,7 +1874,7 @@ int mlx5_esw_bridge_port_mdb_add(struct net_device >*dev, u16 vport_num, u16 esw_ > "Failed to lookup bridge port vlan metadata to >create MDB (MAC=%pM,vid=%u,vport=%u)\n", > addr, vid, vport_num); > NL_SET_ERR_MSG_FMT_MOD(extack, >- "Failed to lookup bridge port vlan >metadata to create MDB (MAC=%pM,vid=%u,vport=%u)\n", >+ "Failed to lookup vlan metadata for >MDB (MAC=%pM,vid=%u,vport=%u)\n", > addr, vid, vport_num); > return -EINVAL; > } >-- >2.39.2 >
Hi, >-----Original Message----- >From: Arnd Bergmann <arnd@kernel.org> >Sent: Wednesday, March 27, 2024 4:08 AM >To: llvm@lists.linux.dev; Ariel Elior <aelior@marvell.com>; Manish Chopra ><manishc@marvell.com> >Cc: Arnd Bergmann <arnd@arndb.de>; David S. Miller <davem@davemloft.net>; >Eric Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo >Abeni <pabeni@redhat.com>; Nathan Chancellor <nathan@kernel.org>; Nick >Desaulniers <ndesaulniers@google.com>; Bill Wendling <morbo@google.com>; >Justin Stitt <justinstitt@google.com>; Simon Horman <horms@kernel.org>; >Konstantin Khorenko <khorenko@virtuozzo.com>; Sudarsana Reddy Kalluru ><sudarsana.kalluru@cavium.com>; netdev@vger.kernel.org; linux- >kernel@vger.kernel.org >Subject: [PATCH 3/9] qed: avoid truncating work queue length > >From: Arnd Bergmann <arnd@arndb.de> > >clang complains that the temporary string for the name passed into >alloc_workqueue() is too short for its contents: > >drivers/net/ethernet/qlogic/qed/qed_main.c:1218:3: error: 'snprintf' will always >be truncated; specified size is 16, but format string expands to at least 18 [- >Werror,-Wformat-truncation] > >There is no need for a temporary buffer, and the actual name of a workqueue >is 32 bytes (WQ_NAME_LEN), so just use the interface as intended to avoid >the truncation. > >Fixes: 59ccf86fe69a ("qed: Add driver infrastucture for handling mfw requests.") >Signed-off-by: Arnd Bergmann <arnd@arndb.de> >--- > drivers/net/ethernet/qlogic/qed/qed_main.c | 9 ++++----- > 1 file changed, 4 insertions(+), 5 deletions(-) > >diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c >b/drivers/net/ethernet/qlogic/qed/qed_main.c >index c278f8893042..8159b4c315b5 100644 >--- a/drivers/net/ethernet/qlogic/qed/qed_main.c >+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c >@@ -1206,7 +1206,6 @@ static void qed_slowpath_task(struct work_struct >*work) > static int qed_slowpath_wq_start(struct qed_dev *cdev) > { > struct qed_hwfn *hwfn; >- char name[NAME_SIZE]; > int i; > > if (IS_VF(cdev)) >@@ -1215,11 +1214,11 @@ static int qed_slowpath_wq_start(struct qed_dev >*cdev) > for_each_hwfn(cdev, i) { > hwfn = &cdev->hwfns[i]; > >- snprintf(name, NAME_SIZE, "slowpath-%02x:%02x.%02x", >- cdev->pdev->bus->number, >- PCI_SLOT(cdev->pdev->devfn), hwfn->abs_pf_id); >+ hwfn->slowpath_wq = alloc_workqueue("slowpath- >%02x:%02x.%02x", >+ 0, 0, cdev->pdev->bus->number, >+ PCI_SLOT(cdev->pdev->devfn), >+ hwfn->abs_pf_id); Confused. This should be alloc_workqueue("slowpath-%02x:%02x.%02x", cdev->pdev->bus->number, PCI_SLOT(cdev->pdev->devfn), hwfn->abs_pf_id, 0, 0); Right? Thanks, Sundeep > >- hwfn->slowpath_wq = alloc_workqueue(name, 0, 0); > if (!hwfn->slowpath_wq) { > DP_NOTICE(hwfn, "Cannot create slowpath >workqueue\n"); > return -ENOMEM; >-- >2.39.2 >
Some cleanups around function names, comments and the config option of "GUP-fast" -- GUP without "lock" safety belts on. With this cleanup it's easy to judge which functions are GUP-fast specific. We now consistently call it "GUP-fast", avoiding mixing it with "fast GUP", "lockless", or simply "gup" (which I always considered confusing in the ode). So the magic now happens in functions that contain "gup_fast", whereby gup_fast() is the entry point into that magic. Comments consistently reference either "GUP-fast" or "gup_fast()". Based on mm-unstable from today. I won't CC arch maintainers, but only arch mailing lists, to reduce noise. Tested on x86_64, cross compiled on a bunch of archs, whereby some of them don't properly even compile on mm-unstable anymore in my usual setup (alpha, arc, parisc64, sh) ... maybe the cross compilers are outdated, but there are no new ones around. Hm. Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Mike Rapoport (IBM) <rppt@kernel.org> Cc: Jason Gunthorpe <jgg@nvidia.com> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Peter Xu <peterx@redhat.com> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Cc: loongarch@lists.linux.dev Cc: linux-mips@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org Cc: linux-s390@vger.kernel.org Cc: linux-sh@vger.kernel.org Cc: linux-mm@kvack.org Cc: linux-perf-users@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org Cc: x86@kernel.org David Hildenbrand (3): mm/gup: consistently name GUP-fast functions mm/treewide: rename CONFIG_HAVE_FAST_GUP to CONFIG_HAVE_GUP_FAST mm: use "GUP-fast" instead "fast GUP" in remaining comments arch/arm/Kconfig | 2 +- arch/arm64/Kconfig | 2 +- arch/loongarch/Kconfig | 2 +- arch/mips/Kconfig | 2 +- arch/powerpc/Kconfig | 2 +- arch/s390/Kconfig | 2 +- arch/sh/Kconfig | 2 +- arch/x86/Kconfig | 2 +- include/linux/rmap.h | 8 +- kernel/events/core.c | 4 +- mm/Kconfig | 2 +- mm/filemap.c | 2 +- mm/gup.c | 170 +++++++++++++++++++++-------------------- mm/internal.h | 2 +- mm/khugepaged.c | 2 +- 15 files changed, 105 insertions(+), 101 deletions(-) -- 2.43.2
Some cleanups around function names, comments and the config option of "GUP-fast" -- GUP without "lock" safety belts on. With this cleanup it's easy to judge which functions are GUP-fast specific. We now consistently call it "GUP-fast", avoiding mixing it with "fast GUP", "lockless", or simply "gup" (which I always considered confusing in the ode). So the magic now happens in functions that contain "gup_fast", whereby gup_fast() is the entry point into that magic. Comments consistently reference either "GUP-fast" or "gup_fast()". Based on mm-unstable from today. I won't CC arch maintainers, but only arch mailing lists, to reduce noise. Tested on x86_64, cross compiled on a bunch of archs, whereby some of them don't properly even compile on mm-unstable anymore in my usual setup (alpha, arc, parisc64, sh) ... maybe the cross compilers are outdated, but there are no new ones around. Hm. Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Mike Rapoport (IBM) <rppt@kernel.org> Cc: Jason Gunthorpe <jgg@nvidia.com> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Peter Xu <peterx@redhat.com> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Cc: loongarch@lists.linux.dev Cc: linux-mips@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org Cc: linux-s390@vger.kernel.org Cc: linux-sh@vger.kernel.org Cc: linux-mm@kvack.org Cc: linux-perf-users@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org Cc: x86@kernel.org David Hildenbrand (3): mm/gup: consistently name GUP-fast functions mm/treewide: rename CONFIG_HAVE_FAST_GUP to CONFIG_HAVE_GUP_FAST mm: use "GUP-fast" instead "fast GUP" in remaining comments arch/arm/Kconfig | 2 +- arch/arm64/Kconfig | 2 +- arch/loongarch/Kconfig | 2 +- arch/mips/Kconfig | 2 +- arch/powerpc/Kconfig | 2 +- arch/s390/Kconfig | 2 +- arch/sh/Kconfig | 2 +- arch/x86/Kconfig | 2 +- include/linux/rmap.h | 8 +- kernel/events/core.c | 4 +- mm/Kconfig | 2 +- mm/filemap.c | 2 +- mm/gup.c | 170 +++++++++++++++++++++-------------------- mm/internal.h | 2 +- mm/khugepaged.c | 2 +- 15 files changed, 105 insertions(+), 101 deletions(-) -- 2.43.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Some cleanups around function names, comments and the config option of "GUP-fast" -- GUP without "lock" safety belts on. With this cleanup it's easy to judge which functions are GUP-fast specific. We now consistently call it "GUP-fast", avoiding mixing it with "fast GUP", "lockless", or simply "gup" (which I always considered confusing in the ode). So the magic now happens in functions that contain "gup_fast", whereby gup_fast() is the entry point into that magic. Comments consistently reference either "GUP-fast" or "gup_fast()". Based on mm-unstable from today. I won't CC arch maintainers, but only arch mailing lists, to reduce noise. Tested on x86_64, cross compiled on a bunch of archs, whereby some of them don't properly even compile on mm-unstable anymore in my usual setup (alpha, arc, parisc64, sh) ... maybe the cross compilers are outdated, but there are no new ones around. Hm. Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Mike Rapoport (IBM) <rppt@kernel.org> Cc: Jason Gunthorpe <jgg@nvidia.com> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Peter Xu <peterx@redhat.com> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Cc: loongarch@lists.linux.dev Cc: linux-mips@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org Cc: linux-s390@vger.kernel.org Cc: linux-sh@vger.kernel.org Cc: linux-mm@kvack.org Cc: linux-perf-users@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org Cc: x86@kernel.org David Hildenbrand (3): mm/gup: consistently name GUP-fast functions mm/treewide: rename CONFIG_HAVE_FAST_GUP to CONFIG_HAVE_GUP_FAST mm: use "GUP-fast" instead "fast GUP" in remaining comments arch/arm/Kconfig | 2 +- arch/arm64/Kconfig | 2 +- arch/loongarch/Kconfig | 2 +- arch/mips/Kconfig | 2 +- arch/powerpc/Kconfig | 2 +- arch/s390/Kconfig | 2 +- arch/sh/Kconfig | 2 +- arch/x86/Kconfig | 2 +- include/linux/rmap.h | 8 +- kernel/events/core.c | 4 +- mm/Kconfig | 2 +- mm/filemap.c | 2 +- mm/gup.c | 170 +++++++++++++++++++++-------------------- mm/internal.h | 2 +- mm/khugepaged.c | 2 +- 15 files changed, 105 insertions(+), 101 deletions(-) -- 2.43.2
在 2024/3/27 上午10:10, Heng Qi 写道: > > > 在 2024/3/26 下午11:18, Dan Jurgens 写道: >>> From: Heng Qi <hengqi@linux.alibaba.com> >>> Sent: Tuesday, March 26, 2024 3:55 AM >>> To: Dan Jurgens <danielj@nvidia.com>; netdev@vger.kernel.org >>> Cc: mst@redhat.com; jasowang@redhat.com; xuanzhuo@linux.alibaba.com; >>> virtualization@lists.linux.dev; davem@davemloft.net; >>> edumazet@google.com; kuba@kernel.org; pabeni@redhat.com; Jiri Pirko >>> <jiri@nvidia.com> >>> Subject: Re: [PATCH net-next 4/4] virtio_net: Remove rtnl lock >>> protection of >>> command buffers >>> >>> >>> >>> 在 2024/3/26 上午5:49, Daniel Jurgens 写道: >>>> The rtnl lock is no longer needed to protect the control buffer and >>>> command VQ. >>>> >>>> Signed-off-by: Daniel Jurgens <danielj@nvidia.com> >>>> Reviewed-by: Jiri Pirko <jiri@nvidia.com> >>>> --- >>>> drivers/net/virtio_net.c | 27 +++++---------------------- >>>> 1 file changed, 5 insertions(+), 22 deletions(-) >>>> >>>> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index >>>> 41f8dc16ff38..d09ea20b16be 100644 >>>> --- a/drivers/net/virtio_net.c >>>> +++ b/drivers/net/virtio_net.c >>>> @@ -2639,14 +2639,12 @@ static void virtnet_stats(struct net_device >>>> *dev, >>>> >>>> static void virtnet_ack_link_announce(struct virtnet_info *vi) >>>> { >>>> - rtnl_lock(); >>>> if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_ANNOUNCE, >>>> VIRTIO_NET_CTRL_ANNOUNCE_ACK, >>> NULL)) >>>> dev_warn(&vi->dev->dev, "Failed to ack link announce.\n"); >>>> - rtnl_unlock(); >>>> } >>>> >>>> -static int _virtnet_set_queues(struct virtnet_info *vi, u16 >>>> queue_pairs) >>>> +static int virtnet_set_queues(struct virtnet_info *vi, u16 >>>> +queue_pairs) >>>> { >>>> struct virtio_net_ctrl_mq *mq __free(kfree) = NULL; >>>> struct scatterlist sg; >>>> @@ -2677,16 +2675,6 @@ static int _virtnet_set_queues(struct >>> virtnet_info *vi, u16 queue_pairs) >>>> return 0; >>>> } >>>> >>>> -static int virtnet_set_queues(struct virtnet_info *vi, u16 >>>> queue_pairs) -{ >>>> - int err; >>>> - >>>> - rtnl_lock(); >>>> - err = _virtnet_set_queues(vi, queue_pairs); >>>> - rtnl_unlock(); >>>> - return err; >>>> -} >>>> - >>>> static int virtnet_close(struct net_device *dev) >>>> { >>>> struct virtnet_info *vi = netdev_priv(dev); @@ -3268,7 >>>> +3256,7 @@ >>>> static int virtnet_set_channels(struct net_device *dev, >>>> return -EINVAL; >>>> >>>> cpus_read_lock(); >>>> - err = _virtnet_set_queues(vi, queue_pairs); >>>> + err = virtnet_set_queues(vi, queue_pairs); >>>> if (err) { >>>> cpus_read_unlock(); >>>> goto err; >>>> @@ -3558,14 +3546,11 @@ static void virtnet_rx_dim_work(struct >>> work_struct *work) >>>> struct dim_cq_moder update_moder; >>>> int i, qnum, err; >>>> >>>> - if (!rtnl_trylock()) >>>> - return; >>>> - >>> Does this guarantee that the synchronization is completely correct? >>> >>> The purpose of this patch set is to add a separate lock for ctrlq >>> rather than >>> reusing the RTNL lock. >>> But for dim workers, it not only involves the use of ctrlq, but also >>> involves >>> reading shared variables in interfaces such as .set_coalesce, >>> .get_coalesce, >>> etc. >> It looks like there is a risk of a dirty read in the get (usecs >> updated, but not max_packets). > > Also dim_enabled. > > And later I need to asynchronousize the dim cmds, which means that > different dim workers will operate a shared linked list. > > So we need a lock. After removing the loop, maybe READ_ONCE/WRITE_ONCE will be enough? > >> In the set it will return -EINVAL if trying to adjust the settings >> aside from DIM enabled. I can add a lock for this if you think it's >> needed, but it doesn't seem like a major problem for debug info. > > Not just for debug info, but future extensions as well. > > These desynchronizations can introduce more trouble in the future. > > Regards, > Heng > >> >> >>> In addition, assuming there are 10 queues, each queue is scheduled >>> with its >>> own dim worker at the same time, then these 10 workers may issue >>> parameters to rxq0 10 times in parallel, just because the RTNL lock is >>> removed here. >>> >>> Therefore, when the RTNL lock is removed, a 'for loop' is no longer >>> needed in >>> virtnet_rx_dim_work, and the dim worker of each queue only >>> configures its >>> own parameters. >>> >> Good point. I'll add a new patch to remove the for loop. >> >>> Alternatively, please keep RTNL lock here. >>> >>> Regards, >>> Heng >>> >>>> /* Each rxq's work is queued by "net_dim()->schedule_work()" >>>> * in response to NAPI traffic changes. Note that >>>> dim->profile_ix >>>> * for each rxq is updated prior to the queuing action. >>>> * So we only need to traverse and update profiles for all rxqs >>>> - * in the work which is holding rtnl_lock. >>>> + * in the work. >>>> */ >>>> for (i = 0; i < vi->curr_queue_pairs; i++) { >>>> rq = &vi->rq[i]; >>>> @@ -3587,8 +3572,6 @@ static void virtnet_rx_dim_work(struct >>> work_struct *work) >>>> dim->state = DIM_START_MEASURE; >>>> } >>>> } >>>> - >>>> - rtnl_unlock(); >>>> } >>>> >>>> static int virtnet_coal_params_supported(struct ethtool_coalesce >>>> *ec) @@ -4036,7 +4019,7 @@ static int virtnet_xdp_set(struct >>>> net_device >>> *dev, struct bpf_prog *prog, >>>> synchronize_net(); >>>> } >>>> >>>> - err = _virtnet_set_queues(vi, curr_qp + xdp_qp); >>>> + err = virtnet_set_queues(vi, curr_qp + xdp_qp); >>>> if (err) >>>> goto err; >>>> netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp); @@ - >>> 4852,7 >>>> +4835,7 @@ static int virtnet_probe(struct virtio_device *vdev) >>>> >>>> virtio_device_ready(vdev); >>>> >>>> - _virtnet_set_queues(vi, vi->curr_queue_pairs); >>>> + virtnet_set_queues(vi, vi->curr_queue_pairs); >>>> >>>> /* a random MAC address has been assigned, notify the device. >>>> * We don't fail probe if VIRTIO_NET_F_CTRL_MAC_ADDR is not >>> there >
Hi Tim, Thanks a lot for the release of fuego new version with Debian base distribution (bullseye) and Jenkins (2.414.1) support. Regarding, distributing the load across server, I experimented and able to achieve it with the current fuego version itself. While setting up the node I choose, 'Launch agent via execution of command on the controller' as the 'Launch method'. And in the 'Launch command' I used, 'sshpass' command to connect to the Agent ('slave.jar') on a remote machine. It is working fine, but still I would like to try the new version of fuego for user authentication, security features etc. I will try it and let you know. Thanks a lot once again. Note: I have already tested the 'Launch agents via SSH' on plain jenkins (recent version) as well and it is working fine. Regards, Dhinakar K. -----Original Message----- From: Bird, Tim [mailto:Tim.Bird@sony.com] Sent: Wednesday, March 27, 2024 2:24 AM To: dhinakar.k <dhinakar.k@samsung.com>; fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org Subject: RE: RE[4]: Distribute continuous integration (build) to servers outside docker container Dhinakar, I have committed some changes to the 'next' branch in the fuego and fuego-core repositories for a more recent version of the Debian base distribution (bullseye) and Jenkins (2.414.1) I'm still testing and fixing issues, but many tests seem to work OK. You can download this branch, using the following command: $ git clone -b next https://protect2.fireeye.com/v1/url?k=c205cdb3-a38ed885-c20446fc-74fe485cbff1-8f8985f51348034b&q=1&e=fd58435e-b89c-487a-8038-2c5394d50a38&u=https%3A%2F%2Fbitbucket.org%2Ffuegotest%2Ffuego.git You can follow the instructions on the following pages, to perform installation of Fuego with this repository: https://protect2.fireeye.com/v1/url?k=e17a6512-80f17024-e17bee5d-74fe485cbff1-44d3ec083952750c&q=1&e=fd58435e-b89c-487a-8038-2c5394d50a38&u=https%3A%2F%2Ffuego.readthedocs.io%2Fen%2Flatest%2FQuickstart_Guide.html%23download-build-start-and-access https://protect2.fireeye.com/v1/url?k=14f10b08-757a1e3e-14f08047-74fe485cbff1-059e997d701ba98c&q=1&e=fd58435e-b89c-487a-8038-2c5394d50a38&u=https%3A%2F%2Ffuego.readthedocs.io%2Fen%2Flatest%2FInstalling_Fuego.html%23downloading-a-different-branch You will probably want to use a non-default docker image and container name. See the following link for instructions: https://protect2.fireeye.com/v1/url?k=73a03639-122b230f-73a1bd76-74fe485cbff1-9f3005d17b0dba86&q=1&e=fd58435e-b89c-487a-8038-2c5394d50a38&u=https%3A%2F%2Ffuego.readthedocs.io%2Fen%2Flatest%2FInstalling_Fuego.html%23using-an-different-container-name In order to utilize distributed builds, I believe you will want agents that direct jobs from a primary Jenkins instance, to parallel Jenkins instances running on other machines. I haven't don’t this myself, but I believe you will want to look at how Jenkins uses ssh credentials, and uses "remoting" agents to execute things on other machines. By default, Jenkins (as configured by Fuego), uses a node for each Fuego board, with an agent (slave.jar) that is sent the job information by the Jenkins host, and ends up calling the command for the job definition (which calls 'ftc run-test ...'). This chain all runs inside the docker container, on a single host machine. However, I believe you can configure a node so that the job information is sent to a slave.jar running on a different machine. This could either be to a machine running jenkins, or just running 'slave.jar' (or possibly 'agent.jar'), to execute the command for the job definition on that machine. All this is just speculation, since I haven't done this myself. Good luck. Let me know how it goes. -- Tim > -----Original Message----- > From: dhinakar.k <dhinakar.k@samsung.com> Hi Tim, > > Thanks a lot for being kind enough to spend your precious time to analyze my storage issues. > My eyes were on '/var/lib/jenkins/workspace' when I copy pasted it to you. > I will look into it and resolve those issues. Thanks a lot once again. > > I will surely try the 'next' branch whenever it is available to check 'user authentication, security, and job distribution' features. > Thanks a have a nice weekend. > > Regards, > Dhinakar K. > > -----Original Message----- > From: Bird, Tim [mailto:Tim.Bird@sony.com] > Sent: Saturday, March 23, 2024 3:58 AM > To: dhinakar.k <dhinakar.k@samsung.com>; fuego+owner@lists.linux.dev; > fuego@lists.linuxfoundation.org > Subject: RE: RE[3]: Distribute continuous integration (build) to > servers outside docker container > > Dhinakar, > > OK - here's a summary of your object counts and storage issues: > /var/lib/jenkins - 32G > .../userContent - 1.8G > .../jobs - 11G > .../workspace - 19G > > /fuego-rw - 13G > ../buildzone - ~6G > ../buildzone/X86-SSH-Test.default.Functional.kernel_build-x86-64 - 1.8G > ../buildzone/Functional.LTP-x86_64 - 2.4G > > 6 nodes, 135 jobs, 78 runs > > docker image: 2.41G? > (or is it 173 GB?) > > This is confusing. Your latest fuego docker container is 2.41G, but > you have /var/lib/jenkins that is about 32G (and that should all be in your container image). > > It looks like the builds for the kernel and for LTP are taking the most space. > > I have no idea why your /var/lib/jenkins/jobs directory would be so big (11G) Maybe do: > $ du -sh /var/lib/jenkins/jobs/* | sort -sh and see which jobs have a lot of info. > > Also, I don't know what's going on with your /var/lib/jenkins/workspace (19G) I don't even have that directory on my system. > > My stats look quite different: > I have 13 nodes, 387 jobs and 1129 runs in my most active Fuego container, my /var/lib/Jenkins is only 204M. > > My /fuego-rw/buildzone is 64G, due to lots of instances of LTP (and something very funky about one Interbench build): > 1.2G ren1.latest-smoke.Functional.LTP-poky-aarch64 > 1.7G Functional.kselftest-x86_64 > 1.7G rpi3-2.default.Functional.kernel_build-aarch64 > 1.9G Functional.LTP_one_at_a_time-debian-armhf > 2.0G Functional.raspi_kinstall-debian-armhf > 2.3G bbb.latest-smoke.Functional.LTP-debian-armhf > 2.4G Functional.LTP-x86_64 > 2.4G Functional.LTP_one_at_a_time-x86_64 > 2.5G Functional.LTP-poky-aarch64 > 2.5G Functional.LTP_one_at_a_time-aarch64 > 2.5G Functional.LTP_one_at_a_time-poky-aarch64 > 3.0G min1.latest-smoke.Functional.LTP-x86_64 > 3.0G min1.latest.Functional.LTP-x86_64 > 3.2G rpi3-2.latest-smoke.Functional.LTP-aarch64 > 32G Benchmark.Interbench-x86_64 > > There might be stuff in /var/lib/jenkins/workspace you could get rid of. > > I have a lot more runs on my system, but very many of those have very > short run.json files, as they are for tests with small results. I > believe the largest run.json and consolelog.txt files are for LTP. If you have a lot of those, maybe you can archive old ones to reduce disk usage and improve performance. > > In any event, is there any particular operation which is taking a long > time to complete, due to the docker size (or fuego directory) being too big or taking too much space? > > Finally, I'm still working on the new docker container (with more > recent versions of Debian and Jenkins). I've already fixed a few bugs > that I found, but there are a lot of old Fuego packages that don't compile with newer toolchains. There are workarounds for this, but it will take a while to implement. > > My plan is to publish my working branch for this work on bitbucket, as a 'next' branch, even though not all problems are resolved. > You could then build a container using that (if you want to), and > check if the new version of Jenkins has the features you need for user authentication, security, and job distribution. > > I can give you some install steps for using a 'next' branch, if you are interested in trying that. > > Sorry this has taken so long. > -- Tim > > > > > -----Original Message----- > > From: dhinakar.k <dhinakar.k@samsung.com> Hi Tim, > > > > Thanks for your prompt response. > > Please find the details you requested below. > > > > # du -sh /fuego-rw/logs/* | sort -h > > 4.0K /fuego-rw/logs/README > > 8.0K /fuego-rw/logs/logruns > > 56K /fuego-rw/logs/Benchmark.gtkperf > > 60K /fuego-rw/logs/Functional.glib > > 96K /fuego-rw/logs/Benchmark.GLMark > > 228K /fuego-rw/logs/theme > > 284K /fuego-rw/logs/Benchmark.dbench4 > > 284K /fuego-rw/logs/Benchmark.himeno > > 284K /fuego-rw/logs/Benchmark.iperf > > 284K /fuego-rw/logs/Benchmark.x11perf > > 288K /fuego-rw/logs/Benchmark.linpack > > 288K /fuego-rw/logs/Functional.aiostress > > 288K /fuego-rw/logs/Functional.bc > > 288K /fuego-rw/logs/Functional.crashme > > 288K /fuego-rw/logs/Functional.fontconfig > > 288K /fuego-rw/logs/Functional.hello_world > > 288K /fuego-rw/logs/Functional.stress > > 288K /fuego-rw/logs/Functional.synctest > > 288K /fuego-rw/logs/Functional.zlib > > 292K /fuego-rw/logs/Benchmark.Stream > > 292K /fuego-rw/logs/Benchmark.netperf > > 292K /fuego-rw/logs/Benchmark.tiobench > > 296K /fuego-rw/logs/Functional.ipv6connect > > 304K /fuego-rw/logs/Benchmark.nbench_byte > > 304K /fuego-rw/logs/Benchmark.netpipe > > 312K /fuego-rw/logs/Benchmark.fio > > 312K /fuego-rw/logs/Functional.scrashme > > 316K /fuego-rw/logs/Benchmark.Java > > 344K /fuego-rw/logs/Functional.bzip2 > > 352K /fuego-rw/logs/Benchmark.IOzone > > 352K /fuego-rw/logs/Functional.jpeg > > 356K /fuego-rw/logs/Benchmark.OpenSSL > > 372K /fuego-rw/logs/Functional.netperf > > 396K /fuego-rw/logs/Functional.expat > > 400K /fuego-rw/logs/Benchmark.lmbench2 > > 404K /fuego-rw/logs/Functional.kernel_build > > 424K /fuego-rw/logs/Functional.rmaptest > > 524K /fuego-rw/logs/image > > 536K /fuego-rw/logs/Benchmark.Interbench > > 552K /fuego-rw/logs/Benchmark.ebizzy > > 552K /fuego-rw/logs/Benchmark.signaltest > > 556K /fuego-rw/logs/Functional.pi_tests > > 588K /fuego-rw/logs/Benchmark.Whetstone > > 740K /fuego-rw/logs/Functional.ft2demos > > 808K /fuego-rw/logs/Benchmark.Dhrystone > > 1.1M /fuego-rw/logs/Benchmark.cyclictest > > 1.1M /fuego-rw/logs/Benchmark.ffsb > > 1.2M /fuego-rw/logs/Benchmark.bonnie > > 1.6M /fuego-rw/logs/Benchmark.hackbench > > 2.1M /fuego-rw/logs/Functional.OpenSSL > > 7.5M /fuego-rw/logs/Extract > > 11M /fuego-rw/logs/Functional.linus_stress > > 12M /fuego-rw/logs/Functional.LTP > > > > # ftc list-nodes | wc -l > > 6 > > > > Jenkins nodes in this system: > > ARM64-SSH-Test > > ARM64-Serial-Test > > SAPIENT-MAIN-Server-Node > > X86-SSH-Test > > X86-Serial-Test > > > > # ftc list-jobs | wc -l > > 135 > > > > # ftc list-runs | wc -l > > 78 > > > > Regards, > > Dhinakar K. > > > > -----Original Message----- > > From: Bird, Tim [mailto:Tim.Bird@sony.com] > > Sent: Saturday, March 16, 2024 12:12 AM > > To: dhinakar.k <dhinakar.k@samsung.com>; > > fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org > > Subject: RE: RE[3]: Distribute continuous integration (build) to > > servers outside docker container > > > > Dhinkar, > > > > Can you send me the info for these as well: > > > > # du -sh /fuego-rw/logs/* | sort -h > > > > > > # ftc list-nodes | wc -l > > > > > > # ftc list-jobs | wc -l > > > > > > # ftc list-runs | wc -l > > > > > > -- Tim > > > > > -----Original Message----- > > > From: dhinakar.k <dhinakar.k@samsung.com> > > > Sent: Friday, March 15, 2024 9:38 AM > > > To: Bird, Tim <Tim.Bird@sony.com>; fuego+owner@lists.linux.dev; > > > fuego@lists.linuxfoundation.org > > > Subject: RE[3]: Distribute continuous integration (build) to > > > servers outside docker container > > > > > > Hi Tim, Thanks a lot for your response. Please find below the > > > details that you requested. # du -sh /var/lib/Jenkins 32G > > > /var/lib/Jenkins # du -sh > > > /var/lib/jenkins/* | sort -h 0 /var/lib/jenkins/secret. key. > > > not-so-secret 4. 0K /var/lib/jenkins/com. cloudbees. hudson. plugins. > > > folder. config. AbstractFolderConfiguration. xml > > > ZjQcmQRYFpfptBannerStart Caution : This email originated from outside of Sony. > > > Do not click links or open any attachments unless you recognize the sender and know the content is safe. Please report phishing if unsure. > > > > > > ZjQcmQRYFpfptBannerEnd > > > Hi Tim, > > > > > > Thanks a lot for your response. > > > Please find below the details that you requested. > > > > > > # du -sh /var/lib/Jenkins > > > 32G /var/lib/Jenkins > > > > > > # du -sh /var/lib/jenkins/* | sort -h > > > 0 /var/lib/jenkins/secret.key.not-so-secret > > > 4.0K /var/lib/jenkins/com.cloudbees.hudson.plugins.folder.config.AbstractFolderConfiguration.xml > > > 4.0K /var/lib/jenkins/com.mtvi.plateng.hudson.ldap.LdapMailAddressResolver.xml > > > 4.0K /var/lib/jenkins/com.orctom.jenkins.plugin.buildtimestamp.BuildTimestampWrapper.xml > > > 4.0K /var/lib/jenkins/credentials.xml > > > 4.0K /var/lib/jenkins/hudson.maven.MavenModuleSet.xml > > > 4.0K /var/lib/jenkins/hudson.model.UpdateCenter.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.emailext.ExtendedEmailPublisher.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.git.GitSCM.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.git.GitTool.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.sidebar_link.SidebarLinkPlugin.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.sonar.SonarGlobalConfiguration.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.timestamper.TimestamperConfig.xml > > > 4.0K /var/lib/jenkins/hudson.tasks.Mailer.xml > > > 4.0K /var/lib/jenkins/hudson.tasks.Shell.xml > > > 4.0K /var/lib/jenkins/hudson.triggers.SCMTrigger.xml > > > 4.0K /var/lib/jenkins/identity.key.enc > > > 4.0K /var/lib/jenkins/io.jenkins.plugins.junit.storage.JunitTestResultStorageConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.fingerprints.GlobalFingerprintConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion > > > 4.0K /var/lib/jenkins/jenkins.install.UpgradeWizard.state > > > 4.0K /var/lib/jenkins/jenkins.model.ArtifactManagerConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.model.GlobalBuildDiscarderConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.model.JenkinsLocationConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.plugins.msginject.MsgInjectConfig.xml > > > 4.0K /var/lib/jenkins/jenkins.security.ResourceDomainConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.security.apitoken.ApiTokenPropertyConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.telemetry.Correlator.xml > > > 4.0K /var/lib/jenkins/net.plavcak.jenkins.plugins.scmskip.SCMSkipBuildWrapper.xml > > > 4.0K /var/lib/jenkins/net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.xml > > > 4.0K /var/lib/jenkins/nodeMonitors.xml > > > 4.0K /var/lib/jenkins/org.codefirst.SimpleThemeDecorator.xml > > > 4.0K /var/lib/jenkins/org.jenkinsCi.plugins.projectDescriptionSetter.DescriptionSetterWrapper.xml > > > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.ansible_tower.AnsibleTower.xml > > > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.corsfilter.AccessControlsFilter.xml > > > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.lucene.search.config.SearchBackendConfiguration.xml > > > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.workflow.flow.GlobalDefaultFlowDurabilityLevel.xml > > > 4.0K /var/lib/jenkins/org.quality.gates.jenkins.plugin.GlobalConfig.xml > > > 4.0K /var/lib/jenkins/queue.xml > > > 4.0K /var/lib/jenkins/queue.xml.bak > > > 4.0K /var/lib/jenkins/scriptApproval.xml > > > 4.0K /var/lib/jenkins/secret.key > > > 4.0K /var/lib/jenkins/sidebar-link.xml > > > 12K /var/lib/jenkins/gerrit-trigger.xml > > > 16K /var/lib/jenkins/hudson.plugins.ansicolor.AnsiColorBuildWrapper.xml > > > 20K /var/lib/jenkins/config.xml > > > 44K /var/lib/jenkins/nodes > > > 72K /var/lib/jenkins/secrets > > > 356K /var/lib/jenkins/users > > > 1.7M /var/lib/jenkins/logs > > > 1.8M /var/lib/jenkins/luceneIndex > > > 3.6M /var/lib/jenkins/updates > > > 3.9M /var/lib/jenkins/plugins_backup > > > 316M /var/lib/jenkins/plugins > > > 316M /var/lib/jenkins/plugins_not_working > > > 372M /var/lib/jenkins/plugins_old_2ndFeb2024 > > > 376M /var/lib/jenkins/plugins_working_2ndFeb2024 > > > 1.8G /var/lib/jenkins/userContent > > > 11G /var/lib/jenkins/jobs > > > 19G /var/lib/jenkins/workspace > > > > > > # du -sh /fuego-rw > > > 13G /fuego-rw > > > > > > # du -sh /fuego-rw/buildzone/* | sort -h # du -sh /fuego-rw/logs/* > > > | sort -h # ftc list-nodes | wc -l # ftc list-jobs | wc -l # ftc > > > list-runs | wc - > l > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Dhrystone-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.GLMark-aarch64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.GLMark-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.IOzone-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Interbench-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Java-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.OpenSSL-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Stream-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Whetstone-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.bonnie-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.cyclictest-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.dbench4-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.ebizzy-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.ffsb-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.fio-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.gtkperf-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.hackbench-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.himeno-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.iperf-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.linpack-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.lmbench2-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.nbench_byte-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.netperf-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.netpipe-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.signaltest-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.tiobench-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.x11perf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Dhrystone-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.GLMark-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.IOzone-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Interbench-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Java-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.OpenSSL-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Stream-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Whetstone-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.bonnie-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.cyclictest-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.dbench4-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.ebizzy-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.ffsb-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.fio-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.gtkperf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.hackbench-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.himeno-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.iperf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.linpack-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.lmbench2-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.nbench_byte-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.netperf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.netpipe-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.signaltest-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.tiobench-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.x11perf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.LTP-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.OpenSSL-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.aiostress-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.bc-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.bzip2-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.crashme-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.expat-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.fontconfig-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.ft2demos-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.glib-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.hello_world-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.ipv6connect-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.jpeg-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.linus_stress-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.netperf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.pi_tests-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.rmaptest-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.scrashme-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.stress-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.synctest-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.zlib-x86_64 > > > 4.0K /fuego-rw/buildzone/README > > > 12K /fuego-rw/buildzone/Functional.bc-x86_64 > > > 32K /fuego-rw/buildzone/Functional.hello_world-x86_64 > > > 32K /fuego-rw/buildzone/Functional.linus_stress-x86_64 > > > 32K /fuego-rw/buildzone/Functional.synctest-x86_64 > > > 36K /fuego-rw/buildzone/Functional.rmaptest-x86_64 > > > 48K /fuego-rw/buildzone/Benchmark.himeno-x86_64 > > > 48K /fuego-rw/buildzone/Benchmark.linpack-x86_64 > > > 48K /fuego-rw/buildzone/Functional.ipv6connect-x86_64 > > > 60K /fuego-rw/buildzone/Benchmark.Stream-x86_64 > > > 76K /fuego-rw/buildzone/Benchmark.Whetstone-x86_64 > > > 76K /fuego-rw/buildzone/Benchmark.ebizzy-x86_64 > > > 84K /fuego-rw/buildzone/Functional.aiostress-x86_64 > > > 168K /fuego-rw/buildzone/Benchmark.Dhrystone-x86_64 > > > 240K /fuego-rw/buildzone/Benchmark.tiobench-x86_64 > > > 244K /fuego-rw/buildzone/Functional.crashme-x86_64 > > > 488K /fuego-rw/buildzone/Benchmark.Interbench-x86_64 > > > 576K /fuego-rw/buildzone/Functional.scrashme-x86_64 > > > 760K /fuego-rw/buildzone/Benchmark.hackbench-x86_64 > > > 816K /fuego-rw/buildzone/Benchmark.signaltest-x86_64 > > > 868K /fuego-rw/buildzone/Functional.pi_tests-x86_64 > > > 900K /fuego-rw/buildzone/Benchmark.netpipe-x86_64 > > > 904K /fuego-rw/buildzone/Benchmark.cyclictest-x86_64 > > > 1004K /fuego-rw/buildzone/Functional.stress-x86_64 > > > 1.3M /fuego-rw/buildzone/Benchmark.ffsb-x86_64 > > > 1.6M /fuego-rw/buildzone/Benchmark.GLMark-aarch64 > > > 1.6M /fuego-rw/buildzone/Benchmark.GLMark-x86_64 > > > 1.7M /fuego-rw/buildzone/Benchmark.nbench_byte-x86_64 > > > 2.1M /fuego-rw/buildzone/Benchmark.iperf-x86_64 > > > 2.3M /fuego-rw/buildzone/Benchmark.gtkperf-x86_64 > > > 2.4M /fuego-rw/buildzone/Benchmark.bonnie-x86_64 > > > 2.5M /fuego-rw/buildzone/Benchmark.x11perf-x86_64 > > > 2.9M /fuego-rw/buildzone/Functional.bzip2-x86_64 > > > 3.0M /fuego-rw/buildzone/Functional.zlib-x86_64 > > > 3.1M /fuego-rw/buildzone/Benchmark.IOzone-x86_64 > > > 3.5M /fuego-rw/buildzone/Functional.jpeg-x86_64 > > > 5.2M /fuego-rw/buildzone/Benchmark.lmbench2-x86_64 > > > 6.1M /fuego-rw/buildzone/Benchmark.netperf-x86_64 > > > 6.1M /fuego-rw/buildzone/Functional.netperf-x86_64 > > > 7.0M /fuego-rw/buildzone/Functional.fontconfig-x86_64 > > > 9.1M /fuego-rw/buildzone/Benchmark.fio-x86_64 > > > 29M /fuego-rw/buildzone/Functional.expat-x86_64 > > > 33M /fuego-rw/buildzone/Benchmark.dbench4-x86_64 > > > 34M /fuego-rw/buildzone/Functional.ft2demos-x86_64 > > > 49M /fuego-rw/buildzone/Functional.glib-x86_64 > > > 74M /fuego-rw/buildzone/Benchmark.OpenSSL-x86_64 > > > 74M /fuego-rw/buildzone/Functional.OpenSSL-x86_64 > > > 160M /fuego-rw/buildzone/Benchmark.Java-x86_64 > > > 1.8G /fuego-rw/buildzone/X86-SSH-Test.default.Functional.kernel_build-x86_64 > > > 2.4G /fuego-rw/buildzone/Functional.LTP-x86_64 > > > > > > Outside the container, can you run: > > > $ docker image ls > > > nxo-container-backup-2ndsep2021 latest b6a3d16508e8 2 years ago 173GB > > > fuego-base-image-20thaug2019-container latest b2cf22891ac6 4 years ago 2.41GB > > > fuegocontainerbackup-4thmar2019 latest 04112c383476 5 years ago 3.34GB > > > fuego-piper-image-22ndnov2021 latest 0121b1c342e6 6 years ago 10.7GB > > > fuego-xyz-image-22ndnov2021 latest 0bf6b942db70 6 years ago 5.8GB > > > fuego-dart-image-22ndnov2021 latest 1d2c6a99dc0a 6 years ago 1.66GB > > > fuego-pavv-image-22ndnov2021 latest ba71ede1e872 6 years ago 4.63GB > > > fuego-gpu-image-22ndnov2021 latest 42718d86dd09 6 years ago 3.41GB > > > > > > Regarding below request, I just want to lock the Jenkins user > > > interface/ dashboard, so that none can see all the jobs, results, > > > logs and other details without logging in. So to start with even > > > one user with > > login credentials will help. > > > But I don't know how Jenkins credentials relate to user accounts. > > > I haven't ever set up Jenkins to handle multiple user accounts. > > > Indeed, in my current 2.414.1 Jenkins setup I can see an option to > > > list "People" (which I presume is registered user accounts), but I > > > can find no way > > to create or manage new user accounts. > > > > > > Thanks a lot for all other details, they were very helpful. > > > > > > Regards, > > > Dhinakar K. > > > > > > -----Original Message----- > > > From: Bird, Tim [mailto:Tim.Bird@sony.com] > > > Sent: Wednesday, March 13, 2024 5:47 AM > > > To: dhinakar.k <dhinakar.k@samsung.com>; > > > fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org > > > Subject: RE: HTML message rejected: Re: Distribute continuous > > > integration (build) to servers outside docker container > > > > > > Hey Dhinakar, > > > > > > Sorry to not respond sooner. There was a lot to process in your > > > email, and some of it I don't have answers for, but I'll try to give some status and feedback where I can. > > > > > > > -----Original Message----- > > > > From: dhinakar.k <dhinakar.k@samsung.com> Hi Tim, > > > > > > > > I had sent a reply to your response on 3rd Feb.2024, not sure if it had reached you. > > > > I am posting the same message below again. > > > > > > > > Thanks a lot for your prompt reply. > > > > Iam looking forward to try the updated docker container with an > > > > upgraded distribution base from Debian stretch to Debian > > > > bullseye, and from a Jenkins version of 2.249.3 to 2.414.1. > > > > Please let me > > > whenever it is available. > > > > > > OK - Will do. I haven't been able to allocate time for testing > > > and fixing it, so I didn't want to push it to the master branch. > > > If I pushed something to a testing branch, would you be able to > > > download from > > there and test it? > > > > > > One issue that came up is that some of the toolchains for some of > > > my old boards/distros are not supported (ie don't work) in Debian bullseye, and so I was looking for solutions for that. > > > > > > > We are migrating to another server, so Iam looking for best > > > > options to transfer all the content to the new server. Since the > > > > docker container size is huge I want to trim it down by removing unwanted old logs. > > > > > > It would be good to know where the container size is coming from. > > > Is it in the Fuego build directories, the Fuego run directories > > > (where Fuego logs and run artifacts are stored), or in the Jenkins > > > build directories (where Jenkins logs and artifacts are)? The > > > materials under /fuego-rw should be on the host system, and not > > > inside the container > > itself (since these are volume mounts). But I don't know how this > > space is accounted to the container (if any). It shouldn't be in any container image. > > > > > > The materials under /var/lib/jenkins are inside the container image. > > > > > > Can you run the following commands, inside your container, and send the results: > > > > > > # du -sh /var/lib/jenkins > > > # du -sh /var/lib/jenkins/* | sort -h # du -sh /fuego-rw # du -sh > > > /fuego-rw/buildzone/* | sort -h # du -sh /fuego-rw/logs/* | sort > > > -h # ftc list-nodes | wc -l # ftc list-jobs | wc -l # ftc > > > list-runs | wc -l > > > > > > Outside the container, can you run: > > > $ docker image ls > > > (and remove any lines not related to fuego images) > > > > > > But I don't know how Jenkins credentials relate to user accounts. > > > I haven't ever set up Jenkins to handle multiple user accounts. > > > Indeed, in my current 2.414.1 Jenkins setup I can see an option to > > > list "People" (which I presume is registered user accounts), but I > > > can find no way > > to create or manage new user accounts. > > > > > > > Also, I am worried about server crash and hard disk crash due to so many read/write cycles (that happens during continuous integration). > > > > Hence looking for the best way to back up the container and also > > > > to distribute the load & read/write cycles to another server > > > > (via an ssh agent). I tried with plain Jenkins via ssh > > > > credentials plugin, it seems feasible. Hence if fuego upgrades > > > > to debian bullseye it would be really > > > helpful. > > > OK - I'll keep plugging away at this. > > > > > > > > > > > Also, would like to know, when login credentials support will be > > > > available in fuego? Because as a security measure we are > > > > supposed to have login credentials for each user. Will be > > > > available after debian > > > upgrade? > > > > > > I believe you are referring to Jenkins credentials? It appears > > > that Jenkins supports credentials in version 2.414, which is the > > > new version of Jenkins in the new docker container (with the > > > Debian upgrade). So > > I believe the answer is yes. > > > > > > But I don't know how Jenkins credentials relate to user accounts. > > > I haven't ever set up Jenkins to handle multiple user accounts. > > > Indeed, in my current 2.414.1 Jenkins setup I can see an option to > > > list "People" (which I presume is registered user accounts), but I > > > can find no way > > to create or manage new user accounts. > > > > > > > With respect to removing the logs I will figure out the best way > > > > as I see so many options but not sure if that will reduce the > > > > container size directly or need to run some container commands > > > > to trim it down. I > > > will explore that as well and email my observations in this forum. > > > > > > I have considered adding an "rm-run" sub-command to ftc, which would allow you to remove old runs. > > > However, I'd like to see if it's the run data that is causing the size problem that you are seeing. > > > > > > If you want to archive the data for an individual run, then you > > > can use 'ftc package-run' and move the resulting package to some > > > long-term storage device (before, ostensibly, removing that run > > > from the > > > system.) > > > > > > I hope this is helpful. > > > -- Tim > > > > > > > > > > > > > > > > > Regards, > > > > Dhinakar K. > > > > > > > > -----Original Message----- > > > > From: Bird, Tim [mailto:Tim.Bird@sony.com] > > > > Sent: Saturday, February 3, 2024 3:44 AM > > > > To: dhinakar k <dhinakar.k@gmail.com>; > > > > fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org > > > > Subject: RE: HTML message rejected: Re: Distribute continuous > > > > integration (build) to servers outside docker container > > > > > > > > Dhinakar, See my answers inline below.. > > > > > > > > > -----Original Message----- > > > > > From: dhinakar k <dhinakar.k@gmail.com> Dear Fuego users, > > > > > > > > > > I have a requirement, so I thought of checking with the > > > > > community if it was feasible and if so what is the best or > > > > > most efficient way to implement it. > > > > > We have fuego setup in a server and all our continuous > > > > > integration jobs (for multiple code bases) are setup in it. > > > > > But the issue is there are too many builds happening, which > > > > > puts pressure on the hard disk (so many read/writes) and also > > > > > increases the docker container size (because of build logs). > > > > > > > > > > Hence I would like to know if we can distribute the load to > > > > > another server, for e.g. job will be created on our main > > > > > server but build will happen on the agent on another server. > > > > > The idea is to move out all cpu, memory, storage intensive > > > > > activity to agents (other > > > > > servers) on the network. The resultant logs can also be stored > > > > > on those servers (outside docker container) so that docker > > > > > size won't be growing rapidly. > > > > > > > > > > I tried creating a new node and setup an agent (connect via > > > > > ssh) but facing issues in installing the 'SSH Build Agents' > > > > > plugin because of compatibility issues (jenkins version needs to be upgraded). > > > > > > > > > > If anyone already tried and has a solution for this issue please let me know. > > > > > > > > Unfortunately, I have not tried this, so I'm not familiar with how Jenkins supports distributed jobs. > > > > > > > > But I have a few ideas to share. > > > > > > > > First, I'm working now on an update to the docker container, > > > > from a distribution base of Debian stretch to Debian bullseye, > > > > and from a Jenkins version of 2.249.3 to 2.414.1 (thanks to a > > > > patch provided by Fuego user Yoichi Tachibana). I have applied > > > > the patches, but found > > > some issues with the build instructions for some packages working > > > in Debian bullseye. So I have not committed the changes to > > > > the Fuego master branch yet. I hope to be able to do this soon. > > > > > > > > This might help with the issue of not being able to use the ssh agent plugin for Jenkins. > > > > > > > > Second, it may be possible to do some kind of proxy job > > > > submission thing, by creating proxy jobs on the main Jenkins > > > > server, but having the jobs actually executed ("built", in > > > > Jenkins > > > > terminology) on secondary > > > servers. > > > > > > > > There are a number of ways of supporting remote execution, and > > > > how you implement it will determine where the CPU cycles and > > > > memory usage is during the job, and where the logs end up living > > > > (and taking up > > > > space.) > > > > > > > > If you are using 'ttc' as your transport layer, recent versions > > > > of ttc have support for remote boards via ssh (configured in ttc.conf). But that would leave logs on the master server. > > > > > > > > There are multiple ways to configure Fuego on the secondary > > > > servers > > > > - for example using Docker containers or installing Fuego natively. > > > > In any event, it may be possible to set up proxy jobs on the > > > > main server that > > > call 'ftc' on the secondary > > > > servers, to run the jobs of interest. Depending on how this was structured > > > > you may end up with build artifacts and logs on the secondary > > > > system, and only Jenkins artifacts and logs on the main system (which should save space). > > > > > > > > It might be good to get a more detailed description of your Jenkins setup to be able to understand the options available. > > > > > > > > > > > > > > Also, what is the best way to backup the container after > > > > > trimming it down (remove unwanted files/logs etc. and reduce it's size)? > > > > > > > > I'm not sure how to backup a container in Docker. There's the 'docker container commit' > > > > command, but I haven't used that. > > > > > > > > In general, to trim down you data usage you will want to perform a few operations. > > > > Inside Jenkins, you can delete individual builds. You can > > > > likely automate this (not have to do it manually through the > > > > UI), by using the remote API. That should work for the material > > > > that is inside the container. Lots of data, however, including > > > > the build artifacts and the > > > logs are natively on the host, and are only present in the container through bind mounts. > > > > > > > > This means you can remove this data directly using file operations (e.g. rm) on the host. > > > > There are a few nuances to this, however, as some of the build directories are referenced via symlinks. > > > > > > > > 'ftc' currently supports removing jobs and nodes. I don't > > > > recall off the top of my head if this includes removing all the > > > > builds for a job or > > not. > > > > But in any case, it sounds like you only want to remove some of the builds/runs, not the jobs themselves. > > > > We could possibly support 'ftc rm-run', which could remove specific runs. 'ftc query-runs' > > > > could be used to generate a list of runs (e.g. that were created before a certain date). > > > > > > > > Please provide a few more details, and maybe we can talk through and/or develop some solutions that will help meet your needs. > > > > > > > > -- Tim > > > > > > > > > > > > > > On Thu, Feb 1, 2024 at 11:52 PM <fuego+owner@lists.linux.dev> wrote: > > > > > > > > > > > > Greetings! > > > > > > > > > > > > This is the mlmmj program managing the > > > > > > <fuego@lists.linux.dev> mailing list. > > > > > > > > > > > > Your message to <fuego@lists.linux.dev> was not delivered to > > > > > > the list because it contained a HTML part. Only text/plain > > > > > > messages are allowed on this list. > > > > > > > > > > > > Please configure your mail client to only send plain text mail. > > > > > > > > > > > > For your reference, the rejected message follows below. > > > > > > > > > > > > > > > > > > > > > > > > ---------- Forwarded message ---------- > > > > > > From: dhinakar k <dhinakar.k@gmail.com> > > > > > > To: fuego+help@lists.linux.dev, > > > > > > fuego@lists.linuxfoundation.org, "Bird, Timothy" > > > > > > <Tim.Bird@sony.com> > > > > > > Cc: > > > > > > Bcc: > > > > > > Date: Thu, 1 Feb 2024 23:51:30 +0530 > > > > > > Subject: Re: Distribute continuous integration (build) to > > > > > > servers outside docker container Dear Fuego users, > > > > > > > > > > > > I have a requirement, so I thought of checking with the > > > > > > community if it was feasible and if so what is the best or > > > > > > most efficient way to > > > > > implement it. > > > > > > We have fuego setup in a server and all our continuous > > > > > > integration jobs (for multiple code bases) are setup in it. > > > > > > But the issue is there are > > > > > too many builds happening, which puts pressure on the hard > > > > > disk (so many read/writes) and also increases the docker container size (because of build logs). > > > > > > > > > > > > Hence I would like to know if we can distribute the load to > > > > > > another server, for e.g. job will be created on our main > > > > > > server but build will > > > > > happen on the agent on another server. The idea is to move out > > > > > all cpu, memory, storage intensive activity to agents (other > > > > > servers) on the network. The resultant logs can also be stored > > > > > on those servers > > > > (outside docker container) so that docker size won't be growing rapidly. > > > > > > > > > > > > I tried creating a new node and setup an agent (connect via > > > > > > ssh) but facing issues in installing the 'SSH Build Agents' > > > > > > plugin because of > > > > > compatibility issues (jenkins version needs to be upgraded). > > > > > > > > > > > > If anyone already tried and has a solution for this issue please let me know. > > > > > > > > > > > > Also, what is the best way to backup the container after trimming it down (remove unwanted files/logs etc. and reduce it's size)? > > > > > > > > > > > > Regards, > > > > > > Dhinakar K. > > > > > > Samsung India, Bengaluru. > > > > > > > > > > > > On Thu, Feb 1, 2024 at 10:30 PM dhinakar k <dhinakar.k@gmail.com> wrote: > > > > > >> > > > > > >> Dear Fuego users, > > > > > >> > > > > > >> I have a requirement, so I thought of checking with the > > > > > >> community if it was feasible and if so what is the best or > > > > > >> most efficient way to > > > > > implement it. > > > > > >> We have fuego setup in a server and all our continuous > > > > > >> integration jobs (for multiple code bases) are setup in it. > > > > > >> But the issue is there are > > > > > too many builds happening, which puts pressure on the hard > > > > > disk (so many read/writes) and also increases the docker container size (because of build logs). > > > > > >> > > > > > >> Hence I would like to know if we can distribute the load to > > > > > >> another server, for e.g. job will be created on our main > > > > > >> server but build will > > > > > happen on the agent on another server. The idea is to move out > > > > > all cpu, memory, storage intensive activity to agents (other > > > > > servers) on the network. The resultant logs can also be stored > > > > > on those servers > > > > (outside docker container) so that docker size won't be growing rapidly. > > > > > >> > > > > > >> I tried creating a new node and setup an agent (connect via > > > > > >> ssh) but facing issues in installing the 'SSH Build Agents' > > > > > >> plugin because of > > > > > compatibility issues (jenkins version needs to be upgraded). > > > > > >> > > > > > >> If anyone already tried and has a solution for this issue please let me know. > > > > > >> > > > > > >> Also, what is the best way to backup the container after trimming it down (remove unwanted files/logs etc. and reduce it's size)? > > > > > >> > > > > > >> Regards, > > > > > >> Dhinakar K. > > > > > >> Samsung India, Bengaluru. > > > > > > > > > > > > > > > > > > > > > > > >
Rick Edgecombe wrote: > The mm_struct contains a function pointer *get_unmapped_area(), which > is set to either arch_get_unmapped_area() or > arch_get_unmapped_area_topdown() during the initialization of the mm. > > Since the function pointer only ever points to two functions that are named > the same across all arch's, a function pointer is not really required. In > addition future changes will want to add versions of the functions that > take additional arguments. So to save a pointers worth of bytes in > mm_struct, and prevent adding additional function pointers to mm_struct in > future changes, remove it and keep the information about which > get_unmapped_area() to use in a flag. > > Add the new flag to MMF_INIT_MASK so it doesn't get clobbered on fork by > mmf_init_flags(). Most MM flags get clobbered on fork. In the pre-existing > behavior mm->get_unmapped_area() would get copied to the new mm in > dup_mm(), so not clobbering the flag preserves the existing behavior > around inheriting the topdown-ness. > > Introduce a helper, mm_get_unmapped_area(), to easily convert code that > refers to the old function pointer to instead select and call either > arch_get_unmapped_area() or arch_get_unmapped_area_topdown() based on the > flag. Then drop the mm->get_unmapped_area() function pointer. Leave the > get_unmapped_area() pointer in struct file_operations alone. The main > purpose of this change is to reorganize in preparation for future changes, > but it also converts the calls of mm->get_unmapped_area() from indirect > branches into a direct ones. > > The stress-ng bigheap benchmark calls realloc a lot, which calls through > get_unmapped_area() in the kernel. On x86, the change yielded a ~1% > improvement there on a retpoline config. > > In testing a few x86 configs, removing the pointer unfortunately didn't > result in any actual size reductions in the compiled layout of mm_struct. > But depending on compiler or arch alignment requirements, the change could > shrink the size of mm_struct. > > Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com> > Acked-by: Dave Hansen <dave.hansen@linux.intel.com> > Acked-by: Liam R. Howlett <Liam.Howlett@oracle.com> > Reviewed-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> > Cc: linux-s390@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Cc: sparclinux@vger.kernel.org > Cc: linux-sgx@vger.kernel.org > Cc: nvdimm@lists.linux.dev > Cc: linux-cxl@vger.kernel.org > Cc: linux-mm@kvack.org > Cc: linux-fsdevel@vger.kernel.org > Cc: io-uring@vger.kernel.org > Cc: bpf@vger.kernel.org > --- > v4: > - Split out pde_get_unmapped_area() refactor into separate patch > (Christophe Leroy) > > v3: > - Fix comment that still referred to mm->get_unmapped_area() > - Resolve trivial rebase conflicts with "mm: thp_get_unmapped_area must > honour topdown preference" > - Spelling fix in log > > v2: > - Fix comment on MMF_TOPDOWN (Kirill, rppt) > - Move MMF_TOPDOWN to actually unused bit > - Add MMF_TOPDOWN to MMF_INIT_MASK so it doesn't get clobbered on fork, > and result in the children using the search up path. > - New lower performance results after above bug fix > - Add Reviews and Acks > --- > arch/s390/mm/hugetlbpage.c | 2 +- > arch/s390/mm/mmap.c | 4 ++-- > arch/sparc/kernel/sys_sparc_64.c | 15 ++++++--------- > arch/sparc/mm/hugetlbpage.c | 2 +- > arch/x86/kernel/cpu/sgx/driver.c | 2 +- > arch/x86/mm/hugetlbpage.c | 2 +- > arch/x86/mm/mmap.c | 4 ++-- > drivers/char/mem.c | 2 +- > drivers/dax/device.c | 6 +++--- > fs/hugetlbfs/inode.c | 4 ++-- > fs/proc/inode.c | 3 ++- > fs/ramfs/file-mmu.c | 2 +- > include/linux/mm_types.h | 6 +----- > include/linux/sched/coredump.h | 5 ++++- > include/linux/sched/mm.h | 5 +++++ > io_uring/io_uring.c | 2 +- > kernel/bpf/arena.c | 2 +- > kernel/bpf/syscall.c | 2 +- > mm/debug.c | 6 ------ > mm/huge_memory.c | 9 ++++----- > mm/mmap.c | 21 ++++++++++++++++++--- > mm/shmem.c | 11 +++++------ > mm/util.c | 6 +++--- > 23 files changed, 66 insertions(+), 57 deletions(-) > > diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c > index c2e8242bd15d..219d906fe830 100644 > --- a/arch/s390/mm/hugetlbpage.c > +++ b/arch/s390/mm/hugetlbpage.c > @@ -328,7 +328,7 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, > goto check_asce_limit; > } > > - if (mm->get_unmapped_area == arch_get_unmapped_area) > + if (!test_bit(MMF_TOPDOWN, &mm->flags)) > addr = hugetlb_get_unmapped_area_bottomup(file, addr, len, > pgoff, flags); > else > diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c > index b14fc0887654..6b2e4436ad4a 100644 > --- a/arch/s390/mm/mmap.c > +++ b/arch/s390/mm/mmap.c > @@ -185,10 +185,10 @@ void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) > */ > if (mmap_is_legacy(rlim_stack)) { > mm->mmap_base = mmap_base_legacy(random_factor); > - mm->get_unmapped_area = arch_get_unmapped_area; > + clear_bit(MMF_TOPDOWN, &mm->flags); > } else { > mm->mmap_base = mmap_base(random_factor, rlim_stack); > - mm->get_unmapped_area = arch_get_unmapped_area_topdown; > + set_bit(MMF_TOPDOWN, &mm->flags); > } > } > > diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c > index 1e9a9e016237..1dbf7211666e 100644 > --- a/arch/sparc/kernel/sys_sparc_64.c > +++ b/arch/sparc/kernel/sys_sparc_64.c > @@ -218,14 +218,10 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, > unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, unsigned long len, unsigned long pgoff, unsigned long flags) > { > unsigned long align_goal, addr = -ENOMEM; > - unsigned long (*get_area)(struct file *, unsigned long, > - unsigned long, unsigned long, unsigned long); > - > - get_area = current->mm->get_unmapped_area; > > if (flags & MAP_FIXED) { > /* Ok, don't mess with it. */ > - return get_area(NULL, orig_addr, len, pgoff, flags); > + return mm_get_unmapped_area(current->mm, NULL, orig_addr, len, pgoff, flags); > } > flags &= ~MAP_SHARED; > > @@ -238,7 +234,8 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u > align_goal = (64UL * 1024); > > do { > - addr = get_area(NULL, orig_addr, len + (align_goal - PAGE_SIZE), pgoff, flags); > + addr = mm_get_unmapped_area(current->mm, NULL, orig_addr, > + len + (align_goal - PAGE_SIZE), pgoff, flags); > if (!(addr & ~PAGE_MASK)) { > addr = (addr + (align_goal - 1UL)) & ~(align_goal - 1UL); > break; > @@ -256,7 +253,7 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u > * be obtained. > */ > if (addr & ~PAGE_MASK) > - addr = get_area(NULL, orig_addr, len, pgoff, flags); > + addr = mm_get_unmapped_area(current->mm, NULL, orig_addr, len, pgoff, flags); > > return addr; > } > @@ -292,7 +289,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) > gap == RLIM_INFINITY || > sysctl_legacy_va_layout) { > mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; > - mm->get_unmapped_area = arch_get_unmapped_area; > + clear_bit(MMF_TOPDOWN, &mm->flags); > } else { > /* We know it's 32-bit */ > unsigned long task_size = STACK_TOP32; > @@ -303,7 +300,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) > gap = (task_size / 6 * 5); > > mm->mmap_base = PAGE_ALIGN(task_size - gap - random_factor); > - mm->get_unmapped_area = arch_get_unmapped_area_topdown; > + set_bit(MMF_TOPDOWN, &mm->flags); > } > } > > diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c > index b432500c13a5..38a1bef47efb 100644 > --- a/arch/sparc/mm/hugetlbpage.c > +++ b/arch/sparc/mm/hugetlbpage.c > @@ -123,7 +123,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, > (!vma || addr + len <= vm_start_gap(vma))) > return addr; > } > - if (mm->get_unmapped_area == arch_get_unmapped_area) > + if (!test_bit(MMF_TOPDOWN, &mm->flags)) > return hugetlb_get_unmapped_area_bottomup(file, addr, len, > pgoff, flags); > else > diff --git a/arch/x86/kernel/cpu/sgx/driver.c b/arch/x86/kernel/cpu/sgx/driver.c > index 262f5fb18d74..22b65a5f5ec6 100644 > --- a/arch/x86/kernel/cpu/sgx/driver.c > +++ b/arch/x86/kernel/cpu/sgx/driver.c > @@ -113,7 +113,7 @@ static unsigned long sgx_get_unmapped_area(struct file *file, > if (flags & MAP_FIXED) > return addr; > > - return current->mm->get_unmapped_area(file, addr, len, pgoff, flags); > + return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags); > } > > #ifdef CONFIG_COMPAT > diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c > index 5804bbae4f01..6d77c0039617 100644 > --- a/arch/x86/mm/hugetlbpage.c > +++ b/arch/x86/mm/hugetlbpage.c > @@ -141,7 +141,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, > } > > get_unmapped_area: > - if (mm->get_unmapped_area == arch_get_unmapped_area) > + if (!test_bit(MMF_TOPDOWN, &mm->flags)) > return hugetlb_get_unmapped_area_bottomup(file, addr, len, > pgoff, flags); > else > diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c > index c90c20904a60..a2cabb1c81e1 100644 > --- a/arch/x86/mm/mmap.c > +++ b/arch/x86/mm/mmap.c > @@ -129,9 +129,9 @@ static void arch_pick_mmap_base(unsigned long *base, unsigned long *legacy_base, > void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) > { > if (mmap_is_legacy()) > - mm->get_unmapped_area = arch_get_unmapped_area; > + clear_bit(MMF_TOPDOWN, &mm->flags); > else > - mm->get_unmapped_area = arch_get_unmapped_area_topdown; > + set_bit(MMF_TOPDOWN, &mm->flags); > > arch_pick_mmap_base(&mm->mmap_base, &mm->mmap_legacy_base, > arch_rnd(mmap64_rnd_bits), task_size_64bit(0), > diff --git a/drivers/char/mem.c b/drivers/char/mem.c > index 3c6670cf905f..9b80e622ae80 100644 > --- a/drivers/char/mem.c > +++ b/drivers/char/mem.c > @@ -544,7 +544,7 @@ static unsigned long get_unmapped_area_zero(struct file *file, > } > > /* Otherwise flags & MAP_PRIVATE: with no shmem object beneath it */ > - return current->mm->get_unmapped_area(file, addr, len, pgoff, flags); > + return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags); > #else > return -ENOSYS; > #endif > diff --git a/drivers/dax/device.c b/drivers/dax/device.c > index 93ebedc5ec8c..47c126d37b59 100644 > --- a/drivers/dax/device.c > +++ b/drivers/dax/device.c > @@ -329,14 +329,14 @@ static unsigned long dax_get_unmapped_area(struct file *filp, > if ((off + len_align) < off) > goto out; > > - addr_align = current->mm->get_unmapped_area(filp, addr, len_align, > - pgoff, flags); > + addr_align = mm_get_unmapped_area(current->mm, filp, addr, len_align, > + pgoff, flags); > if (!IS_ERR_VALUE(addr_align)) { > addr_align += (off - addr_align) & (align - 1); > return addr_align; > } > out: > - return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); > + return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags); > } > > static const struct address_space_operations dev_dax_aops = { > diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c > index 6502c7e776d1..3dee18bf47ed 100644 > --- a/fs/hugetlbfs/inode.c > +++ b/fs/hugetlbfs/inode.c > @@ -249,11 +249,11 @@ generic_hugetlb_get_unmapped_area(struct file *file, unsigned long addr, > } > > /* > - * Use mm->get_unmapped_area value as a hint to use topdown routine. > + * Use MMF_TOPDOWN flag as a hint to use topdown routine. > * If architectures have special needs, they should define their own > * version of hugetlb_get_unmapped_area. > */ > - if (mm->get_unmapped_area == arch_get_unmapped_area_topdown) > + if (test_bit(MMF_TOPDOWN, &mm->flags)) > return hugetlb_get_unmapped_area_topdown(file, addr, len, > pgoff, flags); > return hugetlb_get_unmapped_area_bottomup(file, addr, len, > diff --git a/fs/proc/inode.c b/fs/proc/inode.c > index 75396a24fd8c..d19434e2a58e 100644 > --- a/fs/proc/inode.c > +++ b/fs/proc/inode.c > @@ -455,8 +455,9 @@ pde_get_unmapped_area(struct proc_dir_entry *pde, struct file *file, unsigned lo > return pde->proc_ops->proc_get_unmapped_area(file, orig_addr, len, pgoff, flags); > > #ifdef CONFIG_MMU > - return current->mm->get_unmapped_area(file, orig_addr, len, pgoff, flags); > + return mm_get_unmapped_area(current->mm, file, orig_addr, len, pgoff, flags); > #endif > + > return orig_addr; > } > > diff --git a/fs/ramfs/file-mmu.c b/fs/ramfs/file-mmu.c > index c7a1aa3c882b..b45c7edc3225 100644 > --- a/fs/ramfs/file-mmu.c > +++ b/fs/ramfs/file-mmu.c > @@ -35,7 +35,7 @@ static unsigned long ramfs_mmu_get_unmapped_area(struct file *file, > unsigned long addr, unsigned long len, unsigned long pgoff, > unsigned long flags) > { > - return current->mm->get_unmapped_area(file, addr, len, pgoff, flags); > + return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags); > } > > const struct file_operations ramfs_file_operations = { > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h > index 5240bd7bca33..9313e43123d4 100644 > --- a/include/linux/mm_types.h > +++ b/include/linux/mm_types.h > @@ -777,11 +777,7 @@ struct mm_struct { > } ____cacheline_aligned_in_smp; > > struct maple_tree mm_mt; > -#ifdef CONFIG_MMU > - unsigned long (*get_unmapped_area) (struct file *filp, > - unsigned long addr, unsigned long len, > - unsigned long pgoff, unsigned long flags); > -#endif > + > unsigned long mmap_base; /* base of mmap area */ > unsigned long mmap_legacy_base; /* base of mmap area in bottom-up allocations */ > #ifdef CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES > diff --git a/include/linux/sched/coredump.h b/include/linux/sched/coredump.h > index 02f5090ffea2..e62ff805cfc9 100644 > --- a/include/linux/sched/coredump.h > +++ b/include/linux/sched/coredump.h > @@ -92,9 +92,12 @@ static inline int get_dumpable(struct mm_struct *mm) > #define MMF_VM_MERGE_ANY 30 > #define MMF_VM_MERGE_ANY_MASK (1 << MMF_VM_MERGE_ANY) > > +#define MMF_TOPDOWN 31 /* mm searches top down by default */ > +#define MMF_TOPDOWN_MASK (1 << MMF_TOPDOWN) > + > #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\ > MMF_DISABLE_THP_MASK | MMF_HAS_MDWE_MASK |\ > - MMF_VM_MERGE_ANY_MASK) > + MMF_VM_MERGE_ANY_MASK | MMF_TOPDOWN_MASK) > > static inline unsigned long mmf_init_flags(unsigned long flags) > { > diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h > index b6543f9d78d6..ed1caa26c8be 100644 > --- a/include/linux/sched/mm.h > +++ b/include/linux/sched/mm.h > @@ -8,6 +8,7 @@ > #include <linux/mm_types.h> > #include <linux/gfp.h> > #include <linux/sync_core.h> > +#include <linux/sched/coredump.h> > > /* > * Routines for handling mm_structs > @@ -186,6 +187,10 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr, > unsigned long len, unsigned long pgoff, > unsigned long flags); > > +unsigned long mm_get_unmapped_area(struct mm_struct *mm, struct file *filp, > + unsigned long addr, unsigned long len, > + unsigned long pgoff, unsigned long flags); > + > unsigned long > generic_get_unmapped_area(struct file *filp, unsigned long addr, > unsigned long len, unsigned long pgoff, > diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c > index 5d4b448fdc50..405bab0a560c 100644 > --- a/io_uring/io_uring.c > +++ b/io_uring/io_uring.c > @@ -3520,7 +3520,7 @@ static unsigned long io_uring_mmu_get_unmapped_area(struct file *filp, > #else > addr = 0UL; > #endif > - return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); > + return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags); > } > > #else /* !CONFIG_MMU */ > diff --git a/kernel/bpf/arena.c b/kernel/bpf/arena.c > index 86571e760dd6..74d566dcd2cb 100644 > --- a/kernel/bpf/arena.c > +++ b/kernel/bpf/arena.c > @@ -314,7 +314,7 @@ static unsigned long arena_get_unmapped_area(struct file *filp, unsigned long ad > return -EINVAL; > } > > - ret = current->mm->get_unmapped_area(filp, addr, len * 2, 0, flags); > + ret = mm_get_unmapped_area(current->mm, filp, addr, len * 2, 0, flags); > if (IS_ERR_VALUE(ret)) > return ret; > if ((ret >> 32) == ((ret + len - 1) >> 32)) > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > index ae2ff73bde7e..dead5e1977d8 100644 > --- a/kernel/bpf/syscall.c > +++ b/kernel/bpf/syscall.c > @@ -980,7 +980,7 @@ static unsigned long bpf_get_unmapped_area(struct file *filp, unsigned long addr > if (map->ops->map_get_unmapped_area) > return map->ops->map_get_unmapped_area(filp, addr, len, pgoff, flags); > #ifdef CONFIG_MMU > - return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); > + return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags); > #else > return addr; > #endif > diff --git a/mm/debug.c b/mm/debug.c > index c1c1a6a484e4..37a17f77df9f 100644 > --- a/mm/debug.c > +++ b/mm/debug.c > @@ -180,9 +180,6 @@ EXPORT_SYMBOL(dump_vma); > void dump_mm(const struct mm_struct *mm) > { > pr_emerg("mm %px task_size %lu\n" > -#ifdef CONFIG_MMU > - "get_unmapped_area %px\n" > -#endif > "mmap_base %lu mmap_legacy_base %lu\n" > "pgd %px mm_users %d mm_count %d pgtables_bytes %lu map_count %d\n" > "hiwater_rss %lx hiwater_vm %lx total_vm %lx locked_vm %lx\n" > @@ -208,9 +205,6 @@ void dump_mm(const struct mm_struct *mm) > "def_flags: %#lx(%pGv)\n", > > mm, mm->task_size, > -#ifdef CONFIG_MMU > - mm->get_unmapped_area, > -#endif > mm->mmap_base, mm->mmap_legacy_base, > mm->pgd, atomic_read(&mm->mm_users), > atomic_read(&mm->mm_count), > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 9859aa4f7553..cede9ccb84dc 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -824,8 +824,8 @@ static unsigned long __thp_get_unmapped_area(struct file *filp, > if (len_pad < len || (off + len_pad) < off) > return 0; > > - ret = current->mm->get_unmapped_area(filp, addr, len_pad, > - off >> PAGE_SHIFT, flags); > + ret = mm_get_unmapped_area(current->mm, filp, addr, len_pad, > + off >> PAGE_SHIFT, flags); > > /* > * The failure might be due to length padding. The caller will retry > @@ -843,8 +843,7 @@ static unsigned long __thp_get_unmapped_area(struct file *filp, > > off_sub = (off - ret) & (size - 1); > > - if (current->mm->get_unmapped_area == arch_get_unmapped_area_topdown && > - !off_sub) > + if (test_bit(MMF_TOPDOWN, ¤t->mm->flags) && !off_sub) > return ret + size; > > ret += off_sub; > @@ -861,7 +860,7 @@ unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, > if (ret) > return ret; > > - return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); > + return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags); > } > EXPORT_SYMBOL_GPL(thp_get_unmapped_area); > > diff --git a/mm/mmap.c b/mm/mmap.c > index 6dbda99a47da..224e9ce1e2fd 100644 > --- a/mm/mmap.c > +++ b/mm/mmap.c > @@ -1813,7 +1813,8 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, > unsigned long pgoff, unsigned long flags) > { > unsigned long (*get_area)(struct file *, unsigned long, > - unsigned long, unsigned long, unsigned long); > + unsigned long, unsigned long, unsigned long) > + = NULL; > > unsigned long error = arch_mmap_check(addr, len, flags); > if (error) > @@ -1823,7 +1824,6 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, > if (len > TASK_SIZE) > return -ENOMEM; > > - get_area = current->mm->get_unmapped_area; > if (file) { > if (file->f_op->get_unmapped_area) > get_area = file->f_op->get_unmapped_area; > @@ -1842,7 +1842,11 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, > if (!file) > pgoff = 0; > > - addr = get_area(file, addr, len, pgoff, flags); > + if (get_area) > + addr = get_area(file, addr, len, pgoff, flags); > + else > + addr = mm_get_unmapped_area(current->mm, file, addr, len, > + pgoff, flags); > if (IS_ERR_VALUE(addr)) > return addr; > > @@ -1857,6 +1861,17 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, > > EXPORT_SYMBOL(get_unmapped_area); > > +unsigned long > +mm_get_unmapped_area(struct mm_struct *mm, struct file *file, > + unsigned long addr, unsigned long len, > + unsigned long pgoff, unsigned long flags) > +{ Seems like a small waste to have all call sites now need to push an additional @mm argument onto the stack just to figure out what function to call. > + if (test_bit(MMF_TOPDOWN, &mm->flags)) > + return arch_get_unmapped_area_topdown(file, addr, len, pgoff, flags); > + return arch_get_unmapped_area(file, addr, len, pgoff, flags); This seems small enough to be amenable to a static inline, but that would require exporting the arch calls which might be painful. Would it not be possible to drop the @mm argument and just reference current->mm internal to this function? Just call this funcion current_get_unmapped_area()? Otherwise looks like a useful change to me.
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: Linux Memory Management List <linux-mm@kvack.org> TO: Revalla Hari Krishna <harikrishna.revalla@amd.com> CC: Alex Deucher <alexander.deucher@amd.com> CC: Martin Leung <martin.leung@amd.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: 26074e1be23143b2388cacb36166766c235feb7c commit: 88867807564e28409d8220419da7559364109a2a [836/2169] drm/amd/display: Refactor DPP into a component directory :::::: branch date: 2 hours ago :::::: commit date: 7 days ago config: x86_64-randconfig-102-20240326 (https://download.01.org/0day-ci/archive/20240327/202403271352.aDiLK5LE-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403271352.aDiLK5LE-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:400:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:402:46-47: WARNING opportunity for min() -- >> drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c:269:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c:271:46-47: WARNING opportunity for min() -- >> drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c:43:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c:45:46-47: WARNING opportunity for min() vim +400 drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 390 dd93752b648309 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-10-10 391 void dpp1_dscl_calc_lb_num_partitions( 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 392 const struct scaler_data *scl_data, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 393 enum lb_memory_config lb_config, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 394 int *num_part_y, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 395 int *num_part_c) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 396 { 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 397 int lb_memory_size, lb_memory_size_c, lb_memory_size_a, num_partitions_a, 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 398 lb_bpc, memory_line_size_y, memory_line_size_c, memory_line_size_a; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 399 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 @400 int line_size = scl_data->viewport.width < scl_data->recout.width ? 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 401 scl_data->viewport.width : scl_data->recout.width; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 402 int line_size_c = scl_data->viewport_c.width < scl_data->recout.width ? 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 403 scl_data->viewport_c.width : scl_data->recout.width; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 404 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 405 if (line_size == 0) 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 406 line_size = 1; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 407 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 408 if (line_size_c == 0) 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 409 line_size_c = 1; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 410 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 411 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 412 lb_bpc = dpp1_dscl_get_lb_depth_bpc(scl_data->lb_params.depth); 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 413 memory_line_size_y = (line_size * lb_bpc + 71) / 72; /* +71 to ceil */ 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 414 memory_line_size_c = (line_size_c * lb_bpc + 71) / 72; /* +71 to ceil */ 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 415 memory_line_size_a = (line_size + 5) / 6; /* +5 to ceil */ 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 416 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 417 if (lb_config == LB_MEMORY_CONFIG_1) { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 418 lb_memory_size = 816; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 419 lb_memory_size_c = 816; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 420 lb_memory_size_a = 984; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 421 } else if (lb_config == LB_MEMORY_CONFIG_2) { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 422 lb_memory_size = 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 423 lb_memory_size_c = 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 424 lb_memory_size_a = 1312; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 425 } else if (lb_config == LB_MEMORY_CONFIG_3) { 734a092b1fe407 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Eric Bernstein 2017-09-29 426 /* 420 mode: using 3rd mem from Y, Cr and Cb */ 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 427 lb_memory_size = 816 + 1088 + 848 + 848 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 428 lb_memory_size_c = 816 + 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 429 lb_memory_size_a = 984 + 1312 + 456; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 430 } else { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 431 lb_memory_size = 816 + 1088 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 432 lb_memory_size_c = 816 + 1088 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 433 lb_memory_size_a = 984 + 1312 + 456; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 434 } 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 435 *num_part_y = lb_memory_size / memory_line_size_y; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 436 *num_part_c = lb_memory_size_c / memory_line_size_c; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 437 num_partitions_a = lb_memory_size_a / memory_line_size_a; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 438 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 439 if (scl_data->lb_params.alpha_en 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 440 && (num_partitions_a < *num_part_y)) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 441 *num_part_y = num_partitions_a; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 442 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 443 if (*num_part_y > 64) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 444 *num_part_y = 64; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 445 if (*num_part_c > 64) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 446 *num_part_c = 64; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 447 :::::: The code at line 400 was first introduced by commit :::::: 5e9a81b2c465557adbaeef7231834e3ab40e4102 drm/amd/display: separate scl functions out from dcn10_dpp :::::: TO: Yue Hin Lau <Yuehin.Lau@amd.com> :::::: CC: Alex Deucher <alexander.deucher@amd.com> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: linux-kernel@vger.kernel.org TO: "Paul E. McKenney" <paulmck@kernel.org> tree: https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git 50ways.2024.03.26a head: 097f5787a886cf5dbe7a2c374e5937fd4d5744ab commit: 097f5787a886cf5dbe7a2c374e5937fd4d5744ab [59/59] rcu: Test code for "50 ways to hang your kernel" :::::: branch date: 13 hours ago :::::: commit date: 13 hours ago config: i386-randconfig-141-20240327 (https://download.01.org/0day-ci/archive/20240327/202403271124.K0Oicb6g-lkp@intel.com/config) compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403271124.K0Oicb6g-lkp@intel.com/ smatch warnings: kernel/rcu/tree.c:2242 rcu_gp_kthread() warn: sleeping in atomic context vim +2242 kernel/rcu/tree.c 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2221 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2222 /* 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2223 * Body of kthread that handles grace periods. 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2224 */ 0854a05c9fa554 kernel/rcu/tree.c Paul E. McKenney 2018-07-03 2225 static int __noreturn rcu_gp_kthread(void *unused) 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2226 { 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2227 static DECLARE_WORK(deadlock_work, deadlock_work_fn); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2228 5871968d531f39 kernel/rcu/tree.c Paul E. McKenney 2015-02-24 2229 rcu_bind_gp_kthread(); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2230 if (whichverse == 2 || whichverse == 3 || whichverse == 4) { 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2231 spin_lock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2232 spin_unlock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2233 } 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2234 if (whichverse == 1 || whichverse == 1001) { 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2235 spin_lock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2236 spin_lock(&spinlock_b); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2237 spin_unlock(&spinlock_b); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2238 spin_unlock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2239 } 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2240 if (whichverse == 2) { 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2241 spin_lock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 @2242 schedule(); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2243 spin_unlock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2244 } 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2245 if (whichverse == 1001) { 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2246 spin_lock(&spinlock_b); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2247 spin_lock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2248 spin_unlock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2249 spin_unlock(&spinlock_b); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2250 } 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2251 if (whichverse == 1002) { 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2252 raw_spin_lock(&raw_spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2253 spin_lock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2254 spin_unlock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2255 raw_spin_unlock(&raw_spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2256 } 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2257 if (whichverse == 1003) { 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2258 preempt_disable(); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2259 spin_lock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2260 spin_unlock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2261 preempt_enable(); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2262 spin_lock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2263 spin_unlock(&spinlock_a); 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2264 } 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2265 if (whichverse == 2001) 097f5787a886cf kernel/rcu/tree.c Paul E. McKenney 2024-03-26 2266 queue_work(system_unbound_wq, &deadlock_work); 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2267 for (;;) { 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2268 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2269 /* Handle grace-period start. */ 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2270 for (;;) { 0f11ad323dd3d3 kernel/rcu/tree.c Paul E. McKenney 2020-02-10 2271 trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, 63c4db78e80407 kernel/rcutree.c Paul E. McKenney 2013-08-09 2272 TPS("reqwait")); 683954e55c9814 kernel/rcu/tree.c Neeraj Upadhyay 2020-11-16 2273 WRITE_ONCE(rcu_state.gp_state, RCU_GP_WAIT_GPS); 9cbc5b97029bff kernel/rcu/tree.c Paul E. McKenney 2018-07-05 2274 swait_event_idle_exclusive(rcu_state.gp_wq, 9cbc5b97029bff kernel/rcu/tree.c Paul E. McKenney 2018-07-05 2275 READ_ONCE(rcu_state.gp_flags) & 4cdfc175c25c89 kernel/rcutree.c Paul E. McKenney 2012-06-22 2276 RCU_GP_FLAG_INIT); 55b2dcf5870004 kernel/rcu/tree.c Paul E. McKenney 2020-04-01 2277 rcu_gp_torture_wait(); 683954e55c9814 kernel/rcu/tree.c Neeraj Upadhyay 2020-11-16 2278 WRITE_ONCE(rcu_state.gp_state, RCU_GP_DONE_GPS); 78e4bc34e5d966 kernel/rcu/tree.c Paul E. McKenney 2013-09-24 2279 /* Locking provides needed memory barrier. */ 0854a05c9fa554 kernel/rcu/tree.c Paul E. McKenney 2018-07-03 2280 if (rcu_gp_init()) 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2281 break; cee43939893337 kernel/rcu/tree.c Paul E. McKenney 2018-03-02 2282 cond_resched_tasks_rcu_qs(); 9cbc5b97029bff kernel/rcu/tree.c Paul E. McKenney 2018-07-05 2283 WRITE_ONCE(rcu_state.gp_activity, jiffies); 73a860cd58a1eb kernel/rcu/tree.c Paul E. McKenney 2014-08-14 2284 WARN_ON(signal_pending(current)); 0f11ad323dd3d3 kernel/rcu/tree.c Paul E. McKenney 2020-02-10 2285 trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, 63c4db78e80407 kernel/rcutree.c Paul E. McKenney 2013-08-09 2286 TPS("reqwaitsig")); 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2287 } 7fdefc10e1d730 kernel/rcutree.c Paul E. McKenney 2012-06-22 2288 4cdfc175c25c89 kernel/rcutree.c Paul E. McKenney 2012-06-22 2289 /* Handle quiescent-state forcing. */ c3854a055bc834 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 2290 rcu_gp_fqs_loop(); 4cdfc175c25c89 kernel/rcutree.c Paul E. McKenney 2012-06-22 2291 4cdfc175c25c89 kernel/rcutree.c Paul E. McKenney 2012-06-22 2292 /* Handle grace-period end. */ 683954e55c9814 kernel/rcu/tree.c Neeraj Upadhyay 2020-11-16 2293 WRITE_ONCE(rcu_state.gp_state, RCU_GP_CLEANUP); 0854a05c9fa554 kernel/rcu/tree.c Paul E. McKenney 2018-07-03 2294 rcu_gp_cleanup(); 683954e55c9814 kernel/rcu/tree.c Neeraj Upadhyay 2020-11-16 2295 WRITE_ONCE(rcu_state.gp_state, RCU_GP_CLEANED); 4cdfc175c25c89 kernel/rcutree.c Paul E. McKenney 2012-06-22 2296 } b3dbec76e5334f kernel/rcutree.c Paul E. McKenney 2012-06-18 2297 } b3dbec76e5334f kernel/rcutree.c Paul E. McKenney 2012-06-18 2298 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
在 2024/3/26 下午11:18, Dan Jurgens 写道: >> From: Heng Qi <hengqi@linux.alibaba.com> >> Sent: Tuesday, March 26, 2024 3:55 AM >> To: Dan Jurgens <danielj@nvidia.com>; netdev@vger.kernel.org >> Cc: mst@redhat.com; jasowang@redhat.com; xuanzhuo@linux.alibaba.com; >> virtualization@lists.linux.dev; davem@davemloft.net; >> edumazet@google.com; kuba@kernel.org; pabeni@redhat.com; Jiri Pirko >> <jiri@nvidia.com> >> Subject: Re: [PATCH net-next 4/4] virtio_net: Remove rtnl lock protection of >> command buffers >> >> >> >> 在 2024/3/26 上午5:49, Daniel Jurgens 写道: >>> The rtnl lock is no longer needed to protect the control buffer and >>> command VQ. >>> >>> Signed-off-by: Daniel Jurgens <danielj@nvidia.com> >>> Reviewed-by: Jiri Pirko <jiri@nvidia.com> >>> --- >>> drivers/net/virtio_net.c | 27 +++++---------------------- >>> 1 file changed, 5 insertions(+), 22 deletions(-) >>> >>> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index >>> 41f8dc16ff38..d09ea20b16be 100644 >>> --- a/drivers/net/virtio_net.c >>> +++ b/drivers/net/virtio_net.c >>> @@ -2639,14 +2639,12 @@ static void virtnet_stats(struct net_device >>> *dev, >>> >>> static void virtnet_ack_link_announce(struct virtnet_info *vi) >>> { >>> - rtnl_lock(); >>> if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_ANNOUNCE, >>> VIRTIO_NET_CTRL_ANNOUNCE_ACK, >> NULL)) >>> dev_warn(&vi->dev->dev, "Failed to ack link announce.\n"); >>> - rtnl_unlock(); >>> } >>> >>> -static int _virtnet_set_queues(struct virtnet_info *vi, u16 >>> queue_pairs) >>> +static int virtnet_set_queues(struct virtnet_info *vi, u16 >>> +queue_pairs) >>> { >>> struct virtio_net_ctrl_mq *mq __free(kfree) = NULL; >>> struct scatterlist sg; >>> @@ -2677,16 +2675,6 @@ static int _virtnet_set_queues(struct >> virtnet_info *vi, u16 queue_pairs) >>> return 0; >>> } >>> >>> -static int virtnet_set_queues(struct virtnet_info *vi, u16 >>> queue_pairs) -{ >>> - int err; >>> - >>> - rtnl_lock(); >>> - err = _virtnet_set_queues(vi, queue_pairs); >>> - rtnl_unlock(); >>> - return err; >>> -} >>> - >>> static int virtnet_close(struct net_device *dev) >>> { >>> struct virtnet_info *vi = netdev_priv(dev); @@ -3268,7 +3256,7 @@ >>> static int virtnet_set_channels(struct net_device *dev, >>> return -EINVAL; >>> >>> cpus_read_lock(); >>> - err = _virtnet_set_queues(vi, queue_pairs); >>> + err = virtnet_set_queues(vi, queue_pairs); >>> if (err) { >>> cpus_read_unlock(); >>> goto err; >>> @@ -3558,14 +3546,11 @@ static void virtnet_rx_dim_work(struct >> work_struct *work) >>> struct dim_cq_moder update_moder; >>> int i, qnum, err; >>> >>> - if (!rtnl_trylock()) >>> - return; >>> - >> Does this guarantee that the synchronization is completely correct? >> >> The purpose of this patch set is to add a separate lock for ctrlq rather than >> reusing the RTNL lock. >> But for dim workers, it not only involves the use of ctrlq, but also involves >> reading shared variables in interfaces such as .set_coalesce, .get_coalesce, >> etc. > It looks like there is a risk of a dirty read in the get (usecs updated, but not max_packets). Also dim_enabled. And later I need to asynchronousize the dim cmds, which means that different dim workers will operate a shared linked list. So we need a lock. > In the set it will return -EINVAL if trying to adjust the settings aside from DIM enabled. I can add a lock for this if you think it's needed, but it doesn't seem like a major problem for debug info. Not just for debug info, but future extensions as well. These desynchronizations can introduce more trouble in the future. Regards, Heng > > >> In addition, assuming there are 10 queues, each queue is scheduled with its >> own dim worker at the same time, then these 10 workers may issue >> parameters to rxq0 10 times in parallel, just because the RTNL lock is >> removed here. >> >> Therefore, when the RTNL lock is removed, a 'for loop' is no longer needed in >> virtnet_rx_dim_work, and the dim worker of each queue only configures its >> own parameters. >> > Good point. I'll add a new patch to remove the for loop. > >> Alternatively, please keep RTNL lock here. >> >> Regards, >> Heng >> >>> /* Each rxq's work is queued by "net_dim()->schedule_work()" >>> * in response to NAPI traffic changes. Note that dim->profile_ix >>> * for each rxq is updated prior to the queuing action. >>> * So we only need to traverse and update profiles for all rxqs >>> - * in the work which is holding rtnl_lock. >>> + * in the work. >>> */ >>> for (i = 0; i < vi->curr_queue_pairs; i++) { >>> rq = &vi->rq[i]; >>> @@ -3587,8 +3572,6 @@ static void virtnet_rx_dim_work(struct >> work_struct *work) >>> dim->state = DIM_START_MEASURE; >>> } >>> } >>> - >>> - rtnl_unlock(); >>> } >>> >>> static int virtnet_coal_params_supported(struct ethtool_coalesce >>> *ec) @@ -4036,7 +4019,7 @@ static int virtnet_xdp_set(struct net_device >> *dev, struct bpf_prog *prog, >>> synchronize_net(); >>> } >>> >>> - err = _virtnet_set_queues(vi, curr_qp + xdp_qp); >>> + err = virtnet_set_queues(vi, curr_qp + xdp_qp); >>> if (err) >>> goto err; >>> netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp); @@ - >> 4852,7 >>> +4835,7 @@ static int virtnet_probe(struct virtio_device *vdev) >>> >>> virtio_device_ready(vdev); >>> >>> - _virtnet_set_queues(vi, vi->curr_queue_pairs); >>> + virtnet_set_queues(vi, vi->curr_queue_pairs); >>> >>> /* a random MAC address has been assigned, notify the device. >>> * We don't fail probe if VIRTIO_NET_F_CTRL_MAC_ADDR is not >> there
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev In-Reply-To: <20240325233905.09e8c19d4207.I203795c6b809819c98532e5d6186c700a6c1c760@changeid> References: <20240325233905.09e8c19d4207.I203795c6b809819c98532e5d6186c700a6c1c760@changeid> TO: Johannes Berg <johannes@sipsolutions.net> TO: netdev@vger.kernel.org CC: Johannes Berg <johannes.berg@intel.com> Hi Johannes, kernel test robot noticed the following build warnings: [auto build test WARNING on net/main] [also build test WARNING on net-next/main linus/master v6.9-rc1 next-20240326] [cannot apply to horms-ipvs/master] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Johannes-Berg/rtnetlink-add-guard-for-RTNL/20240326-064044 base: net/main patch link: https://lore.kernel.org/r/20240325233905.09e8c19d4207.I203795c6b809819c98532e5d6186c700a6c1c760%40changeid patch subject: [PATCH 3/3] net: core: use guard/__free in core dev code :::::: branch date: 27 hours ago :::::: commit date: 27 hours ago config: m68k-randconfig-r071-20240326 (https://download.01.org/0day-ci/archive/20240327/202403270904.XeGQ4kVC-lkp@intel.com/config) compiler: m68k-linux-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403270904.XeGQ4kVC-lkp@intel.com/ smatch warnings: net/core/dev.c:9577 bpf_xdp_link_attach() error: uninitialized symbol 'err'. net/core/dev.c:9578 bpf_xdp_link_attach() error: uninitialized symbol 'link'. vim +/err +9577 net/core/dev.c aa8d3a716b59db Andrii Nakryiko 2020-07-21 9541 aa8d3a716b59db Andrii Nakryiko 2020-07-21 9542 int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog) aa8d3a716b59db Andrii Nakryiko 2020-07-21 9543 { 0b17071af397a0 Johannes Berg 2024-03-25 9544 /* link itself doesn't hold dev's refcnt to not complicate shutdown */ 0b17071af397a0 Johannes Berg 2024-03-25 9545 struct net_device *dev __free(dev_put) = NULL; aa8d3a716b59db Andrii Nakryiko 2020-07-21 9546 struct net *net = current->nsproxy->net_ns; aa8d3a716b59db Andrii Nakryiko 2020-07-21 9547 struct bpf_link_primer link_primer; bf4ea1d0b2cb22 Leon Hwang 2023-08-01 9548 struct netlink_ext_ack extack = {}; aa8d3a716b59db Andrii Nakryiko 2020-07-21 9549 struct bpf_xdp_link *link; 0b17071af397a0 Johannes Berg 2024-03-25 9550 int err; aa8d3a716b59db Andrii Nakryiko 2020-07-21 9551 0b17071af397a0 Johannes Berg 2024-03-25 9552 scoped_guard(rtnl) { 0b17071af397a0 Johannes Berg 2024-03-25 9553 dev = dev_get_by_index(net, 0b17071af397a0 Johannes Berg 2024-03-25 9554 attr->link_create.target_ifindex); 0b17071af397a0 Johannes Berg 2024-03-25 9555 if (!dev) aa8d3a716b59db Andrii Nakryiko 2020-07-21 9556 return -EINVAL; aa8d3a716b59db Andrii Nakryiko 2020-07-21 9557 aa8d3a716b59db Andrii Nakryiko 2020-07-21 9558 link = kzalloc(sizeof(*link), GFP_USER); 0b17071af397a0 Johannes Berg 2024-03-25 9559 if (!link) 0b17071af397a0 Johannes Berg 2024-03-25 9560 return -ENOMEM; 0b17071af397a0 Johannes Berg 2024-03-25 9561 0b17071af397a0 Johannes Berg 2024-03-25 9562 bpf_link_init(&link->link, BPF_LINK_TYPE_XDP, 0b17071af397a0 Johannes Berg 2024-03-25 9563 &bpf_xdp_link_lops, prog); aa8d3a716b59db Andrii Nakryiko 2020-07-21 9564 aa8d3a716b59db Andrii Nakryiko 2020-07-21 9565 link->dev = dev; aa8d3a716b59db Andrii Nakryiko 2020-07-21 9566 link->flags = attr->link_create.flags; aa8d3a716b59db Andrii Nakryiko 2020-07-21 9567 aa8d3a716b59db Andrii Nakryiko 2020-07-21 9568 err = bpf_link_prime(&link->link, &link_primer); aa8d3a716b59db Andrii Nakryiko 2020-07-21 9569 if (err) { aa8d3a716b59db Andrii Nakryiko 2020-07-21 9570 kfree(link); 0b17071af397a0 Johannes Berg 2024-03-25 9571 return err; aa8d3a716b59db Andrii Nakryiko 2020-07-21 9572 } aa8d3a716b59db Andrii Nakryiko 2020-07-21 9573 bf4ea1d0b2cb22 Leon Hwang 2023-08-01 9574 err = dev_xdp_attach_link(dev, &extack, link); 0b17071af397a0 Johannes Berg 2024-03-25 9575 } aa8d3a716b59db Andrii Nakryiko 2020-07-21 9576 aa8d3a716b59db Andrii Nakryiko 2020-07-21 @9577 if (err) { 5acc7d3e8d3428 Xuan Zhuo 2021-07-10 @9578 link->dev = NULL; aa8d3a716b59db Andrii Nakryiko 2020-07-21 9579 bpf_link_cleanup(&link_primer); bf4ea1d0b2cb22 Leon Hwang 2023-08-01 9580 trace_bpf_xdp_link_attach_failed(extack._msg); 0b17071af397a0 Johannes Berg 2024-03-25 9581 return err; aa8d3a716b59db Andrii Nakryiko 2020-07-21 9582 } aa8d3a716b59db Andrii Nakryiko 2020-07-21 9583 0b17071af397a0 Johannes Berg 2024-03-25 9584 return bpf_link_settle(&link_primer); aa8d3a716b59db Andrii Nakryiko 2020-07-21 9585 } aa8d3a716b59db Andrii Nakryiko 2020-07-21 9586 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
From: Arnd Bergmann <arnd@arndb.de> With randconfig build testing, I found only eight files that produce warnings with clang when -Wformat-truncation is enabled. This means we can just turn it on by default rather than only enabling it for "make W=1". Unfortunately, gcc produces a lot more warnings when the option is enabled, so it's not yet possible to turn it on both both compilers. I hope that the patches can get picked up by platform maintainers directly, so the final patch can go in later on. Arnd Arnd Bergmann (9): fbdev: shmobile: fix snprintf truncation enetc: avoid truncating error message qed: avoid truncating work queue length mlx5: avoid truncating error message surface3_power: avoid format string truncation warning Input: IMS: fix printf string overflow scsi: mylex: fix sysfs buffer lengths ALSA: aoa: avoid false-positive format truncation warning kbuild: enable -Wformat-truncation on clang drivers/input/misc/ims-pcu.c | 4 ++-- drivers/net/ethernet/freescale/enetc/enetc.c | 2 +- .../ethernet/mellanox/mlx5/core/esw/bridge.c | 2 +- drivers/net/ethernet/qlogic/qed/qed_main.c | 9 ++++--- drivers/platform/surface/surface3_power.c | 2 +- drivers/scsi/myrb.c | 20 ++++++++-------- drivers/scsi/myrs.c | 24 +++++++++---------- drivers/video/fbdev/sh_mobile_lcdcfb.c | 2 +- scripts/Makefile.extrawarn | 2 ++ sound/aoa/soundbus/i2sbus/core.c | 2 +- 10 files changed, 35 insertions(+), 34 deletions(-) -- 2.39.2 Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Cc: Claudiu Manoil <claudiu.manoil@nxp.com> Cc: Vladimir Oltean <vladimir.oltean@nxp.com> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Saeed Mahameed <saeedm@nvidia.com> Cc: Leon Romanovsky <leon@kernel.org> Cc: Ariel Elior <aelior@marvell.com> Cc: Manish Chopra <manishc@marvell.com> Cc: Hans de Goede <hdegoede@redhat.com> Cc: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com> Cc: Maximilian Luz <luzmaximilian@gmail.com> Cc: Hannes Reinecke <hare@kernel.org> Cc: "Martin K. Petersen" <martin.petersen@oracle.com> Cc: Helge Deller <deller@gmx.de> Cc: Masahiro Yamada <masahiroy@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nicolas Schier <nicolas@fjasle.eu> Cc: Johannes Berg <johannes@sipsolutions.net> Cc: Jaroslav Kysela <perex@perex.cz> Cc: Takashi Iwai <tiwai@suse.com> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Bill Wendling <morbo@google.com> Cc: Justin Stitt <justinstitt@google.com> Cc: linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org Cc: linux-rdma@vger.kernel.org Cc: platform-driver-x86@vger.kernel.org Cc: linux-scsi@vger.kernel.org Cc: linux-fbdev@vger.kernel.org Cc: dri-devel@lists.freedesktop.org Cc: linux-kbuild@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org Cc: alsa-devel@alsa-project.org Cc: linux-sound@vger.kernel.org Cc: llvm@lists.linux.dev
From: Arnd Bergmann <arnd@arndb.de> With randconfig build testing, I found only eight files that produce warnings with clang when -Wformat-truncation is enabled. This means we can just turn it on by default rather than only enabling it for "make W=1". Unfortunately, gcc produces a lot more warnings when the option is enabled, so it's not yet possible to turn it on both both compilers. I hope that the patches can get picked up by platform maintainers directly, so the final patch can go in later on. Arnd Arnd Bergmann (9): fbdev: shmobile: fix snprintf truncation enetc: avoid truncating error message qed: avoid truncating work queue length mlx5: avoid truncating error message surface3_power: avoid format string truncation warning Input: IMS: fix printf string overflow scsi: mylex: fix sysfs buffer lengths ALSA: aoa: avoid false-positive format truncation warning kbuild: enable -Wformat-truncation on clang drivers/input/misc/ims-pcu.c | 4 ++-- drivers/net/ethernet/freescale/enetc/enetc.c | 2 +- .../ethernet/mellanox/mlx5/core/esw/bridge.c | 2 +- drivers/net/ethernet/qlogic/qed/qed_main.c | 9 ++++--- drivers/platform/surface/surface3_power.c | 2 +- drivers/scsi/myrb.c | 20 ++++++++-------- drivers/scsi/myrs.c | 24 +++++++++---------- drivers/video/fbdev/sh_mobile_lcdcfb.c | 2 +- scripts/Makefile.extrawarn | 2 ++ sound/aoa/soundbus/i2sbus/core.c | 2 +- 10 files changed, 35 insertions(+), 34 deletions(-) -- 2.39.2 Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Cc: Claudiu Manoil <claudiu.manoil@nxp.com> Cc: Vladimir Oltean <vladimir.oltean@nxp.com> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Saeed Mahameed <saeedm@nvidia.com> Cc: Leon Romanovsky <leon@kernel.org> Cc: Ariel Elior <aelior@marvell.com> Cc: Manish Chopra <manishc@marvell.com> Cc: Hans de Goede <hdegoede@redhat.com> Cc: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com> Cc: Maximilian Luz <luzmaximilian@gmail.com> Cc: Hannes Reinecke <hare@kernel.org> Cc: "Martin K. Petersen" <martin.petersen@oracle.com> Cc: Helge Deller <deller@gmx.de> Cc: Masahiro Yamada <masahiroy@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nicolas Schier <nicolas@fjasle.eu> Cc: Johannes Berg <johannes@sipsolutions.net> Cc: Jaroslav Kysela <perex@perex.cz> Cc: Takashi Iwai <tiwai@suse.com> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Bill Wendling <morbo@google.com> Cc: Justin Stitt <justinstitt@google.com> Cc: linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org Cc: linux-rdma@vger.kernel.org Cc: platform-driver-x86@vger.kernel.org Cc: linux-scsi@vger.kernel.org Cc: linux-fbdev@vger.kernel.org Cc: dri-devel@lists.freedesktop.org Cc: linux-kbuild@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org Cc: alsa-devel@alsa-project.org Cc: linux-sound@vger.kernel.org Cc: llvm@lists.linux.dev
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: jasperwang@tencent.com TO: kaixuxia@tencent.com TO: frankjpliu@tencent.com TO: kasong@tencent.com TO: sagazchen@tencent.com TO: kernelxing@tencent.com TO: aurelianliu@tencent.com TO: jason.zeng@intel.com TO: wu.zheng@intel.com TO: yingbao.jia@intel.com TO: pei.p.jia@intel.com tree: https://gitee.com/OpenCloudOS/OpenCloudOS-Kernel.git next head: 52ae166cfe3d5af2e826d4bc7f68dd3f4b1bf410 commit: 8dbc23037c4680d1ddda68ae70ad6cd2975e6f91 [4551/4624] Add support Zhaoxin GPIO pinctrl :::::: branch date: 21 hours ago :::::: commit date: 2 weeks ago config: x86_64-randconfig-102-20240327 (https://download.01.org/0day-ci/archive/20240327/202403270629.YTbah9F0-lkp@intel.com/config) compiler: gcc-12 (Ubuntu 12.3.0-9ubuntu2) 12.3.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403270629.YTbah9F0-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> drivers/pinctrl/zhaoxin/pinctrl-zhaoxin.c:398:2-4: WARNING: possible condition with no effect (if == else) vim +398 drivers/pinctrl/zhaoxin/pinctrl-zhaoxin.c 8dbc23037c4680 leoliu-oc 2024-02-05 359 8dbc23037c4680 leoliu-oc 2024-02-05 360 static void zhaoxin_gpio_irq_mask_unmask(struct irq_data *d, bool mask) 8dbc23037c4680 leoliu-oc 2024-02-05 361 { 8dbc23037c4680 leoliu-oc 2024-02-05 362 struct gpio_chip *gc = irq_data_get_irq_chip_data(d); 8dbc23037c4680 leoliu-oc 2024-02-05 363 struct zhaoxin_pinctrl *pctrl = gpiochip_get_data(gc); 8dbc23037c4680 leoliu-oc 2024-02-05 364 const struct reg_calibrate *int_cal; 8dbc23037c4680 leoliu-oc 2024-02-05 365 const struct reg_calibrate *mod_sel_cal; 8dbc23037c4680 leoliu-oc 2024-02-05 366 int gpio = irqd_to_hwirq(d); 8dbc23037c4680 leoliu-oc 2024-02-05 367 int i, j; 8dbc23037c4680 leoliu-oc 2024-02-05 368 int offset = 0; 8dbc23037c4680 leoliu-oc 2024-02-05 369 int base_offset = 0; 8dbc23037c4680 leoliu-oc 2024-02-05 370 const struct reg_cal_array *reg_off, *mod; 8dbc23037c4680 leoliu-oc 2024-02-05 371 int bit_off = 0; 8dbc23037c4680 leoliu-oc 2024-02-05 372 u16 value; 8dbc23037c4680 leoliu-oc 2024-02-05 373 u16 value1; 8dbc23037c4680 leoliu-oc 2024-02-05 374 8dbc23037c4680 leoliu-oc 2024-02-05 375 int_cal = pctrl->pin_topologys->int_cal; 8dbc23037c4680 leoliu-oc 2024-02-05 376 mod_sel_cal = pctrl->pin_topologys->mod_sel_cal; 8dbc23037c4680 leoliu-oc 2024-02-05 377 8dbc23037c4680 leoliu-oc 2024-02-05 378 if (gpio >= 0) { 8dbc23037c4680 leoliu-oc 2024-02-05 379 for (i = 0; i < int_cal->size; i++) 8dbc23037c4680 leoliu-oc 2024-02-05 380 if (gpio == int_cal->cal_array[i]) 8dbc23037c4680 leoliu-oc 2024-02-05 381 break; 8dbc23037c4680 leoliu-oc 2024-02-05 382 for (j = 0; j < int_cal->reg_cal_size; j++) { 8dbc23037c4680 leoliu-oc 2024-02-05 383 if (offset > i) 8dbc23037c4680 leoliu-oc 2024-02-05 384 break; 8dbc23037c4680 leoliu-oc 2024-02-05 385 offset += int_cal->reg[j].size; 8dbc23037c4680 leoliu-oc 2024-02-05 386 } 8dbc23037c4680 leoliu-oc 2024-02-05 387 reg_off = &(int_cal->reg[j-1]); 8dbc23037c4680 leoliu-oc 2024-02-05 388 mod = &(mod_sel_cal->reg[j-1]); 8dbc23037c4680 leoliu-oc 2024-02-05 389 bit_off = i-(offset-reg_off->size); 8dbc23037c4680 leoliu-oc 2024-02-05 390 base_offset = reg_off->pmio_offset; 8dbc23037c4680 leoliu-oc 2024-02-05 391 value = inw(pctrl->pmio_base+reg_off->pmio_offset); 8dbc23037c4680 leoliu-oc 2024-02-05 392 if (mask) 8dbc23037c4680 leoliu-oc 2024-02-05 393 value &= (~(1<<bit_off)); 8dbc23037c4680 leoliu-oc 2024-02-05 394 else 8dbc23037c4680 leoliu-oc 2024-02-05 395 value |= (1<<bit_off); 8dbc23037c4680 leoliu-oc 2024-02-05 396 8dbc23037c4680 leoliu-oc 2024-02-05 397 outw(value, pctrl->pmio_base+reg_off->pmio_offset); 8dbc23037c4680 leoliu-oc 2024-02-05 @398 if (mask) { 8dbc23037c4680 leoliu-oc 2024-02-05 399 value1 = readw(pctrl->pm_pmio_base+mod->pmio_offset); 8dbc23037c4680 leoliu-oc 2024-02-05 400 value1 |= (1<<bit_off); 8dbc23037c4680 leoliu-oc 2024-02-05 401 writew(value1, pctrl->pm_pmio_base+mod->pmio_offset); 8dbc23037c4680 leoliu-oc 2024-02-05 402 } else { 8dbc23037c4680 leoliu-oc 2024-02-05 403 value1 = readw(pctrl->pm_pmio_base+mod->pmio_offset); 8dbc23037c4680 leoliu-oc 2024-02-05 404 value1 |= (1<<bit_off); 8dbc23037c4680 leoliu-oc 2024-02-05 405 writew(value1, pctrl->pm_pmio_base+mod->pmio_offset); 8dbc23037c4680 leoliu-oc 2024-02-05 406 } 8dbc23037c4680 leoliu-oc 2024-02-05 407 } 8dbc23037c4680 leoliu-oc 2024-02-05 408 } 8dbc23037c4680 leoliu-oc 2024-02-05 409 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Dhinakar, I have committed some changes to the 'next' branch in the fuego and fuego-core repositories for a more recent version of the Debian base distribution (bullseye) and Jenkins (2.414.1) I'm still testing and fixing issues, but many tests seem to work OK. You can download this branch, using the following command: $ git clone -b next https://bitbucket.org/fuegotest/fuego.git You can follow the instructions on the following pages, to perform installation of Fuego with this repository: https://fuego.readthedocs.io/en/latest/Quickstart_Guide.html#download-build-start-and-access https://fuego.readthedocs.io/en/latest/Installing_Fuego.html#downloading-a-different-branch You will probably want to use a non-default docker image and container name. See the following link for instructions: https://fuego.readthedocs.io/en/latest/Installing_Fuego.html#using-an-different-container-name In order to utilize distributed builds, I believe you will want agents that direct jobs from a primary Jenkins instance, to parallel Jenkins instances running on other machines. I haven't don’t this myself, but I believe you will want to look at how Jenkins uses ssh credentials, and uses "remoting" agents to execute things on other machines. By default, Jenkins (as configured by Fuego), uses a node for each Fuego board, with an agent (slave.jar) that is sent the job information by the Jenkins host, and ends up calling the command for the job definition (which calls 'ftc run-test ...'). This chain all runs inside the docker container, on a single host machine. However, I believe you can configure a node so that the job information is sent to a slave.jar running on a different machine. This could either be to a machine running jenkins, or just running 'slave.jar' (or possibly 'agent.jar'), to execute the command for the job definition on that machine. All this is just speculation, since I haven't done this myself. Good luck. Let me know how it goes. -- Tim > -----Original Message----- > From: dhinakar.k <dhinakar.k@samsung.com> > Hi Tim, > > Thanks a lot for being kind enough to spend your precious time to analyze my storage issues. > My eyes were on '/var/lib/jenkins/workspace' when I copy pasted it to you. > I will look into it and resolve those issues. Thanks a lot once again. > > I will surely try the 'next' branch whenever it is available to check 'user authentication, security, and job distribution' features. > Thanks a have a nice weekend. > > Regards, > Dhinakar K. > > -----Original Message----- > From: Bird, Tim [mailto:Tim.Bird@sony.com] > Sent: Saturday, March 23, 2024 3:58 AM > To: dhinakar.k <dhinakar.k@samsung.com>; fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org > Subject: RE: RE[3]: Distribute continuous integration (build) to servers outside docker container > > Dhinakar, > > OK - here's a summary of your object counts and storage issues: > /var/lib/jenkins - 32G > .../userContent - 1.8G > .../jobs - 11G > .../workspace - 19G > > /fuego-rw - 13G > ../buildzone - ~6G > ../buildzone/X86-SSH-Test.default.Functional.kernel_build-x86-64 - 1.8G > ../buildzone/Functional.LTP-x86_64 - 2.4G > > 6 nodes, 135 jobs, 78 runs > > docker image: 2.41G? > (or is it 173 GB?) > > This is confusing. Your latest fuego docker container is 2.41G, but you have /var/lib/jenkins that is about 32G (and that should all be in your > container image). > > It looks like the builds for the kernel and for LTP are taking the most space. > > I have no idea why your /var/lib/jenkins/jobs directory would be so big (11G) Maybe do: > $ du -sh /var/lib/jenkins/jobs/* | sort -sh and see which jobs have a lot of info. > > Also, I don't know what's going on with your /var/lib/jenkins/workspace (19G) I don't even have that directory on my system. > > My stats look quite different: > I have 13 nodes, 387 jobs and 1129 runs in my most active Fuego container, my /var/lib/Jenkins is only 204M. > > My /fuego-rw/buildzone is 64G, due to lots of instances of LTP (and something very funky about one Interbench build): > 1.2G ren1.latest-smoke.Functional.LTP-poky-aarch64 > 1.7G Functional.kselftest-x86_64 > 1.7G rpi3-2.default.Functional.kernel_build-aarch64 > 1.9G Functional.LTP_one_at_a_time-debian-armhf > 2.0G Functional.raspi_kinstall-debian-armhf > 2.3G bbb.latest-smoke.Functional.LTP-debian-armhf > 2.4G Functional.LTP-x86_64 > 2.4G Functional.LTP_one_at_a_time-x86_64 > 2.5G Functional.LTP-poky-aarch64 > 2.5G Functional.LTP_one_at_a_time-aarch64 > 2.5G Functional.LTP_one_at_a_time-poky-aarch64 > 3.0G min1.latest-smoke.Functional.LTP-x86_64 > 3.0G min1.latest.Functional.LTP-x86_64 > 3.2G rpi3-2.latest-smoke.Functional.LTP-aarch64 > 32G Benchmark.Interbench-x86_64 > > There might be stuff in /var/lib/jenkins/workspace you could get rid of. > > I have a lot more runs on my system, but very many of those have very short run.json files, as they are for tests with small results. I believe > the largest run.json and consolelog.txt files are for LTP. If you have a lot of those, maybe you can archive old ones to reduce disk usage and > improve performance. > > In any event, is there any particular operation which is taking a long time to complete, due to the docker size (or fuego directory) being too big > or taking too much space? > > Finally, I'm still working on the new docker container (with more recent versions of Debian and Jenkins). I've already fixed a few bugs that I > found, but there are a lot of old Fuego packages that don't compile with newer toolchains. There are workarounds for this, but it will take a > while to implement. > > My plan is to publish my working branch for this work on bitbucket, as a 'next' branch, even though not all problems are resolved. > You could then build a container using that (if you want to), and check if the new version of Jenkins has the features you need for user > authentication, security, and job distribution. > > I can give you some install steps for using a 'next' branch, if you are interested in trying that. > > Sorry this has taken so long. > -- Tim > > > > > -----Original Message----- > > From: dhinakar.k <dhinakar.k@samsung.com> Hi Tim, > > > > Thanks for your prompt response. > > Please find the details you requested below. > > > > # du -sh /fuego-rw/logs/* | sort -h > > 4.0K /fuego-rw/logs/README > > 8.0K /fuego-rw/logs/logruns > > 56K /fuego-rw/logs/Benchmark.gtkperf > > 60K /fuego-rw/logs/Functional.glib > > 96K /fuego-rw/logs/Benchmark.GLMark > > 228K /fuego-rw/logs/theme > > 284K /fuego-rw/logs/Benchmark.dbench4 > > 284K /fuego-rw/logs/Benchmark.himeno > > 284K /fuego-rw/logs/Benchmark.iperf > > 284K /fuego-rw/logs/Benchmark.x11perf > > 288K /fuego-rw/logs/Benchmark.linpack > > 288K /fuego-rw/logs/Functional.aiostress > > 288K /fuego-rw/logs/Functional.bc > > 288K /fuego-rw/logs/Functional.crashme > > 288K /fuego-rw/logs/Functional.fontconfig > > 288K /fuego-rw/logs/Functional.hello_world > > 288K /fuego-rw/logs/Functional.stress > > 288K /fuego-rw/logs/Functional.synctest > > 288K /fuego-rw/logs/Functional.zlib > > 292K /fuego-rw/logs/Benchmark.Stream > > 292K /fuego-rw/logs/Benchmark.netperf > > 292K /fuego-rw/logs/Benchmark.tiobench > > 296K /fuego-rw/logs/Functional.ipv6connect > > 304K /fuego-rw/logs/Benchmark.nbench_byte > > 304K /fuego-rw/logs/Benchmark.netpipe > > 312K /fuego-rw/logs/Benchmark.fio > > 312K /fuego-rw/logs/Functional.scrashme > > 316K /fuego-rw/logs/Benchmark.Java > > 344K /fuego-rw/logs/Functional.bzip2 > > 352K /fuego-rw/logs/Benchmark.IOzone > > 352K /fuego-rw/logs/Functional.jpeg > > 356K /fuego-rw/logs/Benchmark.OpenSSL > > 372K /fuego-rw/logs/Functional.netperf > > 396K /fuego-rw/logs/Functional.expat > > 400K /fuego-rw/logs/Benchmark.lmbench2 > > 404K /fuego-rw/logs/Functional.kernel_build > > 424K /fuego-rw/logs/Functional.rmaptest > > 524K /fuego-rw/logs/image > > 536K /fuego-rw/logs/Benchmark.Interbench > > 552K /fuego-rw/logs/Benchmark.ebizzy > > 552K /fuego-rw/logs/Benchmark.signaltest > > 556K /fuego-rw/logs/Functional.pi_tests > > 588K /fuego-rw/logs/Benchmark.Whetstone > > 740K /fuego-rw/logs/Functional.ft2demos > > 808K /fuego-rw/logs/Benchmark.Dhrystone > > 1.1M /fuego-rw/logs/Benchmark.cyclictest > > 1.1M /fuego-rw/logs/Benchmark.ffsb > > 1.2M /fuego-rw/logs/Benchmark.bonnie > > 1.6M /fuego-rw/logs/Benchmark.hackbench > > 2.1M /fuego-rw/logs/Functional.OpenSSL > > 7.5M /fuego-rw/logs/Extract > > 11M /fuego-rw/logs/Functional.linus_stress > > 12M /fuego-rw/logs/Functional.LTP > > > > # ftc list-nodes | wc -l > > 6 > > > > Jenkins nodes in this system: > > ARM64-SSH-Test > > ARM64-Serial-Test > > SAPIENT-MAIN-Server-Node > > X86-SSH-Test > > X86-Serial-Test > > > > # ftc list-jobs | wc -l > > 135 > > > > # ftc list-runs | wc -l > > 78 > > > > Regards, > > Dhinakar K. > > > > -----Original Message----- > > From: Bird, Tim [mailto:Tim.Bird@sony.com] > > Sent: Saturday, March 16, 2024 12:12 AM > > To: dhinakar.k <dhinakar.k@samsung.com>; fuego+owner@lists.linux.dev; > > fuego@lists.linuxfoundation.org > > Subject: RE: RE[3]: Distribute continuous integration (build) to > > servers outside docker container > > > > Dhinkar, > > > > Can you send me the info for these as well: > > > > # du -sh /fuego-rw/logs/* | sort -h > > > > > > # ftc list-nodes | wc -l > > > > > > # ftc list-jobs | wc -l > > > > > > # ftc list-runs | wc -l > > > > > > -- Tim > > > > > -----Original Message----- > > > From: dhinakar.k <dhinakar.k@samsung.com> > > > Sent: Friday, March 15, 2024 9:38 AM > > > To: Bird, Tim <Tim.Bird@sony.com>; fuego+owner@lists.linux.dev; > > > fuego@lists.linuxfoundation.org > > > Subject: RE[3]: Distribute continuous integration (build) to servers > > > outside docker container > > > > > > Hi Tim, Thanks a lot for your response. Please find below the > > > details that you requested. # du -sh /var/lib/Jenkins 32G > > > /var/lib/Jenkins # du -sh > > > /var/lib/jenkins/* | sort -h 0 /var/lib/jenkins/secret. key. > > > not-so-secret 4. 0K /var/lib/jenkins/com. cloudbees. hudson. plugins. > > > folder. config. AbstractFolderConfiguration. xml > > > ZjQcmQRYFpfptBannerStart Caution : This email originated from outside of Sony. > > > Do not click links or open any attachments unless you recognize the sender and know the content is safe. Please report phishing if unsure. > > > > > > ZjQcmQRYFpfptBannerEnd > > > Hi Tim, > > > > > > Thanks a lot for your response. > > > Please find below the details that you requested. > > > > > > # du -sh /var/lib/Jenkins > > > 32G /var/lib/Jenkins > > > > > > # du -sh /var/lib/jenkins/* | sort -h > > > 0 /var/lib/jenkins/secret.key.not-so-secret > > > 4.0K /var/lib/jenkins/com.cloudbees.hudson.plugins.folder.config.AbstractFolderConfiguration.xml > > > 4.0K /var/lib/jenkins/com.mtvi.plateng.hudson.ldap.LdapMailAddressResolver.xml > > > 4.0K /var/lib/jenkins/com.orctom.jenkins.plugin.buildtimestamp.BuildTimestampWrapper.xml > > > 4.0K /var/lib/jenkins/credentials.xml > > > 4.0K /var/lib/jenkins/hudson.maven.MavenModuleSet.xml > > > 4.0K /var/lib/jenkins/hudson.model.UpdateCenter.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.emailext.ExtendedEmailPublisher.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.git.GitSCM.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.git.GitTool.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.sidebar_link.SidebarLinkPlugin.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.sonar.SonarGlobalConfiguration.xml > > > 4.0K /var/lib/jenkins/hudson.plugins.timestamper.TimestamperConfig.xml > > > 4.0K /var/lib/jenkins/hudson.tasks.Mailer.xml > > > 4.0K /var/lib/jenkins/hudson.tasks.Shell.xml > > > 4.0K /var/lib/jenkins/hudson.triggers.SCMTrigger.xml > > > 4.0K /var/lib/jenkins/identity.key.enc > > > 4.0K /var/lib/jenkins/io.jenkins.plugins.junit.storage.JunitTestResultStorageConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.fingerprints.GlobalFingerprintConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion > > > 4.0K /var/lib/jenkins/jenkins.install.UpgradeWizard.state > > > 4.0K /var/lib/jenkins/jenkins.model.ArtifactManagerConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.model.GlobalBuildDiscarderConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.model.JenkinsLocationConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.plugins.msginject.MsgInjectConfig.xml > > > 4.0K /var/lib/jenkins/jenkins.security.ResourceDomainConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.security.apitoken.ApiTokenPropertyConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml > > > 4.0K /var/lib/jenkins/jenkins.telemetry.Correlator.xml > > > 4.0K /var/lib/jenkins/net.plavcak.jenkins.plugins.scmskip.SCMSkipBuildWrapper.xml > > > 4.0K /var/lib/jenkins/net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.xml > > > 4.0K /var/lib/jenkins/nodeMonitors.xml > > > 4.0K /var/lib/jenkins/org.codefirst.SimpleThemeDecorator.xml > > > 4.0K /var/lib/jenkins/org.jenkinsCi.plugins.projectDescriptionSetter.DescriptionSetterWrapper.xml > > > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.ansible_tower.AnsibleTower.xml > > > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.corsfilter.AccessControlsFilter.xml > > > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.lucene.search.config.SearchBackendConfiguration.xml > > > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.workflow.flow.GlobalDefaultFlowDurabilityLevel.xml > > > 4.0K /var/lib/jenkins/org.quality.gates.jenkins.plugin.GlobalConfig.xml > > > 4.0K /var/lib/jenkins/queue.xml > > > 4.0K /var/lib/jenkins/queue.xml.bak > > > 4.0K /var/lib/jenkins/scriptApproval.xml > > > 4.0K /var/lib/jenkins/secret.key > > > 4.0K /var/lib/jenkins/sidebar-link.xml > > > 12K /var/lib/jenkins/gerrit-trigger.xml > > > 16K /var/lib/jenkins/hudson.plugins.ansicolor.AnsiColorBuildWrapper.xml > > > 20K /var/lib/jenkins/config.xml > > > 44K /var/lib/jenkins/nodes > > > 72K /var/lib/jenkins/secrets > > > 356K /var/lib/jenkins/users > > > 1.7M /var/lib/jenkins/logs > > > 1.8M /var/lib/jenkins/luceneIndex > > > 3.6M /var/lib/jenkins/updates > > > 3.9M /var/lib/jenkins/plugins_backup > > > 316M /var/lib/jenkins/plugins > > > 316M /var/lib/jenkins/plugins_not_working > > > 372M /var/lib/jenkins/plugins_old_2ndFeb2024 > > > 376M /var/lib/jenkins/plugins_working_2ndFeb2024 > > > 1.8G /var/lib/jenkins/userContent > > > 11G /var/lib/jenkins/jobs > > > 19G /var/lib/jenkins/workspace > > > > > > # du -sh /fuego-rw > > > 13G /fuego-rw > > > > > > # du -sh /fuego-rw/buildzone/* | sort -h # du -sh /fuego-rw/logs/* | sort -h # ftc list-nodes | wc -l # ftc list-jobs | wc -l # ftc list-runs | wc - > l > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Dhrystone-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.GLMark-aarch64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.GLMark-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.IOzone-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Interbench-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Java-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.OpenSSL-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Stream-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Whetstone-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.bonnie-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.cyclictest-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.dbench4-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.ebizzy-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.ffsb-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.fio-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.gtkperf-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.hackbench-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.himeno-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.iperf-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.linpack-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.lmbench2-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.nbench_byte-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.netperf-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.netpipe-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.signaltest-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.tiobench-x86_64 > > > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.x11perf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Dhrystone-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.GLMark-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.IOzone-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Interbench-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Java-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.OpenSSL-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Stream-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Whetstone-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.bonnie-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.cyclictest-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.dbench4-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.ebizzy-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.ffsb-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.fio-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.gtkperf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.hackbench-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.himeno-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.iperf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.linpack-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.lmbench2-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.nbench_byte-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.netperf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.netpipe-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.signaltest-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.tiobench-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.x11perf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.LTP-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.OpenSSL-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.aiostress-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.bc-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.bzip2-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.crashme-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.expat-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.fontconfig-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.ft2demos-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.glib-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.hello_world-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.ipv6connect-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.jpeg-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.linus_stress-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.netperf-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.pi_tests-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.rmaptest-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.scrashme-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.stress-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.synctest-x86_64 > > > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.zlib-x86_64 > > > 4.0K /fuego-rw/buildzone/README > > > 12K /fuego-rw/buildzone/Functional.bc-x86_64 > > > 32K /fuego-rw/buildzone/Functional.hello_world-x86_64 > > > 32K /fuego-rw/buildzone/Functional.linus_stress-x86_64 > > > 32K /fuego-rw/buildzone/Functional.synctest-x86_64 > > > 36K /fuego-rw/buildzone/Functional.rmaptest-x86_64 > > > 48K /fuego-rw/buildzone/Benchmark.himeno-x86_64 > > > 48K /fuego-rw/buildzone/Benchmark.linpack-x86_64 > > > 48K /fuego-rw/buildzone/Functional.ipv6connect-x86_64 > > > 60K /fuego-rw/buildzone/Benchmark.Stream-x86_64 > > > 76K /fuego-rw/buildzone/Benchmark.Whetstone-x86_64 > > > 76K /fuego-rw/buildzone/Benchmark.ebizzy-x86_64 > > > 84K /fuego-rw/buildzone/Functional.aiostress-x86_64 > > > 168K /fuego-rw/buildzone/Benchmark.Dhrystone-x86_64 > > > 240K /fuego-rw/buildzone/Benchmark.tiobench-x86_64 > > > 244K /fuego-rw/buildzone/Functional.crashme-x86_64 > > > 488K /fuego-rw/buildzone/Benchmark.Interbench-x86_64 > > > 576K /fuego-rw/buildzone/Functional.scrashme-x86_64 > > > 760K /fuego-rw/buildzone/Benchmark.hackbench-x86_64 > > > 816K /fuego-rw/buildzone/Benchmark.signaltest-x86_64 > > > 868K /fuego-rw/buildzone/Functional.pi_tests-x86_64 > > > 900K /fuego-rw/buildzone/Benchmark.netpipe-x86_64 > > > 904K /fuego-rw/buildzone/Benchmark.cyclictest-x86_64 > > > 1004K /fuego-rw/buildzone/Functional.stress-x86_64 > > > 1.3M /fuego-rw/buildzone/Benchmark.ffsb-x86_64 > > > 1.6M /fuego-rw/buildzone/Benchmark.GLMark-aarch64 > > > 1.6M /fuego-rw/buildzone/Benchmark.GLMark-x86_64 > > > 1.7M /fuego-rw/buildzone/Benchmark.nbench_byte-x86_64 > > > 2.1M /fuego-rw/buildzone/Benchmark.iperf-x86_64 > > > 2.3M /fuego-rw/buildzone/Benchmark.gtkperf-x86_64 > > > 2.4M /fuego-rw/buildzone/Benchmark.bonnie-x86_64 > > > 2.5M /fuego-rw/buildzone/Benchmark.x11perf-x86_64 > > > 2.9M /fuego-rw/buildzone/Functional.bzip2-x86_64 > > > 3.0M /fuego-rw/buildzone/Functional.zlib-x86_64 > > > 3.1M /fuego-rw/buildzone/Benchmark.IOzone-x86_64 > > > 3.5M /fuego-rw/buildzone/Functional.jpeg-x86_64 > > > 5.2M /fuego-rw/buildzone/Benchmark.lmbench2-x86_64 > > > 6.1M /fuego-rw/buildzone/Benchmark.netperf-x86_64 > > > 6.1M /fuego-rw/buildzone/Functional.netperf-x86_64 > > > 7.0M /fuego-rw/buildzone/Functional.fontconfig-x86_64 > > > 9.1M /fuego-rw/buildzone/Benchmark.fio-x86_64 > > > 29M /fuego-rw/buildzone/Functional.expat-x86_64 > > > 33M /fuego-rw/buildzone/Benchmark.dbench4-x86_64 > > > 34M /fuego-rw/buildzone/Functional.ft2demos-x86_64 > > > 49M /fuego-rw/buildzone/Functional.glib-x86_64 > > > 74M /fuego-rw/buildzone/Benchmark.OpenSSL-x86_64 > > > 74M /fuego-rw/buildzone/Functional.OpenSSL-x86_64 > > > 160M /fuego-rw/buildzone/Benchmark.Java-x86_64 > > > 1.8G /fuego-rw/buildzone/X86-SSH-Test.default.Functional.kernel_build-x86_64 > > > 2.4G /fuego-rw/buildzone/Functional.LTP-x86_64 > > > > > > Outside the container, can you run: > > > $ docker image ls > > > nxo-container-backup-2ndsep2021 latest b6a3d16508e8 2 years ago 173GB > > > fuego-base-image-20thaug2019-container latest b2cf22891ac6 4 years ago 2.41GB > > > fuegocontainerbackup-4thmar2019 latest 04112c383476 5 years ago 3.34GB > > > fuego-piper-image-22ndnov2021 latest 0121b1c342e6 6 years ago 10.7GB > > > fuego-xyz-image-22ndnov2021 latest 0bf6b942db70 6 years ago 5.8GB > > > fuego-dart-image-22ndnov2021 latest 1d2c6a99dc0a 6 years ago 1.66GB > > > fuego-pavv-image-22ndnov2021 latest ba71ede1e872 6 years ago 4.63GB > > > fuego-gpu-image-22ndnov2021 latest 42718d86dd09 6 years ago 3.41GB > > > > > > Regarding below request, I just want to lock the Jenkins user > > > interface/ dashboard, so that none can see all the jobs, results, > > > logs and other details without logging in. So to start with even one > > > user with > > login credentials will help. > > > But I don't know how Jenkins credentials relate to user accounts. I > > > haven't ever set up Jenkins to handle multiple user accounts. > > > Indeed, in my current 2.414.1 Jenkins setup I can see an option to > > > list "People" (which I presume is registered user accounts), but I > > > can find no way > > to create or manage new user accounts. > > > > > > Thanks a lot for all other details, they were very helpful. > > > > > > Regards, > > > Dhinakar K. > > > > > > -----Original Message----- > > > From: Bird, Tim [mailto:Tim.Bird@sony.com] > > > Sent: Wednesday, March 13, 2024 5:47 AM > > > To: dhinakar.k <dhinakar.k@samsung.com>; > > > fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org > > > Subject: RE: HTML message rejected: Re: Distribute continuous > > > integration (build) to servers outside docker container > > > > > > Hey Dhinakar, > > > > > > Sorry to not respond sooner. There was a lot to process in your > > > email, and some of it I don't have answers for, but I'll try to give some status and feedback where I can. > > > > > > > -----Original Message----- > > > > From: dhinakar.k <dhinakar.k@samsung.com> Hi Tim, > > > > > > > > I had sent a reply to your response on 3rd Feb.2024, not sure if it had reached you. > > > > I am posting the same message below again. > > > > > > > > Thanks a lot for your prompt reply. > > > > Iam looking forward to try the updated docker container with an > > > > upgraded distribution base from Debian stretch to Debian bullseye, > > > > and from a Jenkins version of 2.249.3 to 2.414.1. Please let me > > > whenever it is available. > > > > > > OK - Will do. I haven't been able to allocate time for testing and > > > fixing it, so I didn't want to push it to the master branch. If I > > > pushed something to a testing branch, would you be able to download > > > from > > there and test it? > > > > > > One issue that came up is that some of the toolchains for some of my > > > old boards/distros are not supported (ie don't work) in Debian bullseye, and so I was looking for solutions for that. > > > > > > > We are migrating to another server, so Iam looking for best > > > > options to transfer all the content to the new server. Since the > > > > docker container size is huge I want to trim it down by removing unwanted old logs. > > > > > > It would be good to know where the container size is coming from. > > > Is it in the Fuego build directories, the Fuego run directories > > > (where Fuego logs and run artifacts are stored), or in the Jenkins > > > build directories (where Jenkins logs and artifacts are)? The > > > materials under /fuego-rw should be on the host system, and not > > > inside the container > > itself (since these are volume mounts). But I don't know how this > > space is accounted to the container (if any). It shouldn't be in any container image. > > > > > > The materials under /var/lib/jenkins are inside the container image. > > > > > > Can you run the following commands, inside your container, and send the results: > > > > > > # du -sh /var/lib/jenkins > > > # du -sh /var/lib/jenkins/* | sort -h # du -sh /fuego-rw # du -sh > > > /fuego-rw/buildzone/* | sort -h # du -sh /fuego-rw/logs/* | sort -h > > > # ftc list-nodes | wc -l # ftc list-jobs | wc -l # ftc list-runs | > > > wc -l > > > > > > Outside the container, can you run: > > > $ docker image ls > > > (and remove any lines not related to fuego images) > > > > > > But I don't know how Jenkins credentials relate to user accounts. I > > > haven't ever set up Jenkins to handle multiple user accounts. > > > Indeed, in my current 2.414.1 Jenkins setup I can see an option to > > > list "People" (which I presume is registered user accounts), but I > > > can find no way > > to create or manage new user accounts. > > > > > > > Also, I am worried about server crash and hard disk crash due to so many read/write cycles (that happens during continuous integration). > > > > Hence looking for the best way to back up the container and also > > > > to distribute the load & read/write cycles to another server (via > > > > an ssh agent). I tried with plain Jenkins via ssh credentials > > > > plugin, it seems feasible. Hence if fuego upgrades to debian > > > > bullseye it would be really > > > helpful. > > > OK - I'll keep plugging away at this. > > > > > > > > > > > Also, would like to know, when login credentials support will be > > > > available in fuego? Because as a security measure we are supposed > > > > to have login credentials for each user. Will be available after > > > > debian > > > upgrade? > > > > > > I believe you are referring to Jenkins credentials? It appears that > > > Jenkins supports credentials in version 2.414, which is the new > > > version of Jenkins in the new docker container (with the Debian > > > upgrade). So > > I believe the answer is yes. > > > > > > But I don't know how Jenkins credentials relate to user accounts. I > > > haven't ever set up Jenkins to handle multiple user accounts. > > > Indeed, in my current 2.414.1 Jenkins setup I can see an option to > > > list "People" (which I presume is registered user accounts), but I > > > can find no way > > to create or manage new user accounts. > > > > > > > With respect to removing the logs I will figure out the best way > > > > as I see so many options but not sure if that will reduce the > > > > container size directly or need to run some container commands to > > > > trim it down. I > > > will explore that as well and email my observations in this forum. > > > > > > I have considered adding an "rm-run" sub-command to ftc, which would allow you to remove old runs. > > > However, I'd like to see if it's the run data that is causing the size problem that you are seeing. > > > > > > If you want to archive the data for an individual run, then you can > > > use 'ftc package-run' and move the resulting package to some > > > long-term storage device (before, ostensibly, removing that run from > > > the > > > system.) > > > > > > I hope this is helpful. > > > -- Tim > > > > > > > > > > > > > > > > > Regards, > > > > Dhinakar K. > > > > > > > > -----Original Message----- > > > > From: Bird, Tim [mailto:Tim.Bird@sony.com] > > > > Sent: Saturday, February 3, 2024 3:44 AM > > > > To: dhinakar k <dhinakar.k@gmail.com>; > > > > fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org > > > > Subject: RE: HTML message rejected: Re: Distribute continuous > > > > integration (build) to servers outside docker container > > > > > > > > Dhinakar, See my answers inline below.. > > > > > > > > > -----Original Message----- > > > > > From: dhinakar k <dhinakar.k@gmail.com> Dear Fuego users, > > > > > > > > > > I have a requirement, so I thought of checking with the > > > > > community if it was feasible and if so what is the best or most > > > > > efficient way to implement it. > > > > > We have fuego setup in a server and all our continuous > > > > > integration jobs (for multiple code bases) are setup in it. But > > > > > the issue is there are too many builds happening, which puts > > > > > pressure on the hard disk (so many read/writes) and also > > > > > increases the docker container size (because of build logs). > > > > > > > > > > Hence I would like to know if we can distribute the load to > > > > > another server, for e.g. job will be created on our main server > > > > > but build will happen on the agent on another server. The idea > > > > > is to move out all cpu, memory, storage intensive activity to > > > > > agents (other > > > > > servers) on the network. The resultant logs can also be stored > > > > > on those servers (outside docker container) so that docker size > > > > > won't be growing rapidly. > > > > > > > > > > I tried creating a new node and setup an agent (connect via ssh) > > > > > but facing issues in installing the 'SSH Build Agents' plugin > > > > > because of compatibility issues (jenkins version needs to be upgraded). > > > > > > > > > > If anyone already tried and has a solution for this issue please let me know. > > > > > > > > Unfortunately, I have not tried this, so I'm not familiar with how Jenkins supports distributed jobs. > > > > > > > > But I have a few ideas to share. > > > > > > > > First, I'm working now on an update to the docker container, from > > > > a distribution base of Debian stretch to Debian bullseye, and from > > > > a Jenkins version of 2.249.3 to 2.414.1 (thanks to a patch > > > > provided by Fuego user Yoichi Tachibana). I have applied the > > > > patches, but found > > > some issues with the build instructions for some packages working in > > > Debian bullseye. So I have not committed the changes to > > > > the Fuego master branch yet. I hope to be able to do this soon. > > > > > > > > This might help with the issue of not being able to use the ssh agent plugin for Jenkins. > > > > > > > > Second, it may be possible to do some kind of proxy job submission > > > > thing, by creating proxy jobs on the main Jenkins server, but > > > > having the jobs actually executed ("built", in Jenkins > > > > terminology) on secondary > > > servers. > > > > > > > > There are a number of ways of supporting remote execution, and how > > > > you implement it will determine where the CPU cycles and memory > > > > usage is during the job, and where the logs end up living (and > > > > taking up > > > > space.) > > > > > > > > If you are using 'ttc' as your transport layer, recent versions of > > > > ttc have support for remote boards via ssh (configured in ttc.conf). But that would leave logs on the master server. > > > > > > > > There are multiple ways to configure Fuego on the secondary > > > > servers > > > > - for example using Docker containers or installing Fuego natively. > > > > In any event, it may be possible to set up proxy jobs on the main > > > > server that > > > call 'ftc' on the secondary > > > > servers, to run the jobs of interest. Depending on how this was structured > > > > you may end up with build artifacts and logs on the secondary > > > > system, and only Jenkins artifacts and logs on the main system (which should save space). > > > > > > > > It might be good to get a more detailed description of your Jenkins setup to be able to understand the options available. > > > > > > > > > > > > > > Also, what is the best way to backup the container after > > > > > trimming it down (remove unwanted files/logs etc. and reduce it's size)? > > > > > > > > I'm not sure how to backup a container in Docker. There's the 'docker container commit' > > > > command, but I haven't used that. > > > > > > > > In general, to trim down you data usage you will want to perform a few operations. > > > > Inside Jenkins, you can delete individual builds. You can likely > > > > automate this (not have to do it manually through the UI), by > > > > using the remote API. That should work for the material that is > > > > inside the container. Lots of data, however, including the build > > > > artifacts and the > > > logs are natively on the host, and are only present in the container through bind mounts. > > > > > > > > This means you can remove this data directly using file operations (e.g. rm) on the host. > > > > There are a few nuances to this, however, as some of the build directories are referenced via symlinks. > > > > > > > > 'ftc' currently supports removing jobs and nodes. I don't recall > > > > off the top of my head if this includes removing all the builds > > > > for a job or > > not. > > > > But in any case, it sounds like you only want to remove some of the builds/runs, not the jobs themselves. > > > > We could possibly support 'ftc rm-run', which could remove specific runs. 'ftc query-runs' > > > > could be used to generate a list of runs (e.g. that were created before a certain date). > > > > > > > > Please provide a few more details, and maybe we can talk through and/or develop some solutions that will help meet your needs. > > > > > > > > -- Tim > > > > > > > > > > > > > > On Thu, Feb 1, 2024 at 11:52 PM <fuego+owner@lists.linux.dev> wrote: > > > > > > > > > > > > Greetings! > > > > > > > > > > > > This is the mlmmj program managing the <fuego@lists.linux.dev> > > > > > > mailing list. > > > > > > > > > > > > Your message to <fuego@lists.linux.dev> was not delivered to > > > > > > the list because it contained a HTML part. Only text/plain > > > > > > messages are allowed on this list. > > > > > > > > > > > > Please configure your mail client to only send plain text mail. > > > > > > > > > > > > For your reference, the rejected message follows below. > > > > > > > > > > > > > > > > > > > > > > > > ---------- Forwarded message ---------- > > > > > > From: dhinakar k <dhinakar.k@gmail.com> > > > > > > To: fuego+help@lists.linux.dev, > > > > > > fuego@lists.linuxfoundation.org, "Bird, Timothy" > > > > > > <Tim.Bird@sony.com> > > > > > > Cc: > > > > > > Bcc: > > > > > > Date: Thu, 1 Feb 2024 23:51:30 +0530 > > > > > > Subject: Re: Distribute continuous integration (build) to > > > > > > servers outside docker container Dear Fuego users, > > > > > > > > > > > > I have a requirement, so I thought of checking with the > > > > > > community if it was feasible and if so what is the best or > > > > > > most efficient way to > > > > > implement it. > > > > > > We have fuego setup in a server and all our continuous > > > > > > integration jobs (for multiple code bases) are setup in it. > > > > > > But the issue is there are > > > > > too many builds happening, which puts pressure on the hard disk > > > > > (so many read/writes) and also increases the docker container size (because of build logs). > > > > > > > > > > > > Hence I would like to know if we can distribute the load to > > > > > > another server, for e.g. job will be created on our main > > > > > > server but build will > > > > > happen on the agent on another server. The idea is to move out > > > > > all cpu, memory, storage intensive activity to agents (other > > > > > servers) on the network. The resultant logs can also be stored > > > > > on those servers > > > > (outside docker container) so that docker size won't be growing rapidly. > > > > > > > > > > > > I tried creating a new node and setup an agent (connect via > > > > > > ssh) but facing issues in installing the 'SSH Build Agents' > > > > > > plugin because of > > > > > compatibility issues (jenkins version needs to be upgraded). > > > > > > > > > > > > If anyone already tried and has a solution for this issue please let me know. > > > > > > > > > > > > Also, what is the best way to backup the container after trimming it down (remove unwanted files/logs etc. and reduce it's size)? > > > > > > > > > > > > Regards, > > > > > > Dhinakar K. > > > > > > Samsung India, Bengaluru. > > > > > > > > > > > > On Thu, Feb 1, 2024 at 10:30 PM dhinakar k <dhinakar.k@gmail.com> wrote: > > > > > >> > > > > > >> Dear Fuego users, > > > > > >> > > > > > >> I have a requirement, so I thought of checking with the > > > > > >> community if it was feasible and if so what is the best or > > > > > >> most efficient way to > > > > > implement it. > > > > > >> We have fuego setup in a server and all our continuous > > > > > >> integration jobs (for multiple code bases) are setup in it. > > > > > >> But the issue is there are > > > > > too many builds happening, which puts pressure on the hard disk > > > > > (so many read/writes) and also increases the docker container size (because of build logs). > > > > > >> > > > > > >> Hence I would like to know if we can distribute the load to > > > > > >> another server, for e.g. job will be created on our main > > > > > >> server but build will > > > > > happen on the agent on another server. The idea is to move out > > > > > all cpu, memory, storage intensive activity to agents (other > > > > > servers) on the network. The resultant logs can also be stored > > > > > on those servers > > > > (outside docker container) so that docker size won't be growing rapidly. > > > > > >> > > > > > >> I tried creating a new node and setup an agent (connect via > > > > > >> ssh) but facing issues in installing the 'SSH Build Agents' > > > > > >> plugin because of > > > > > compatibility issues (jenkins version needs to be upgraded). > > > > > >> > > > > > >> If anyone already tried and has a solution for this issue please let me know. > > > > > >> > > > > > >> Also, what is the best way to backup the container after trimming it down (remove unwanted files/logs etc. and reduce it's size)? > > > > > >> > > > > > >> Regards, > > > > > >> Dhinakar K. > > > > > >> Samsung India, Bengaluru. > > > > > > > > > > > > > > > > > > > > > > > >
The quilt patch titled Subject: MAINTAINERS: remove incorrect M: tag for dm-devel@lists.linux.dev has been removed from the -mm tree. Its filename was maintainers-remove-incorrect-m-tag-for-dm-devel-listslinuxdev.patch This patch was dropped because it was merged into the mm-hotfixes-stable branch of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm ------------------------------------------------------ From: Kuan-Wei Chiu <visitorckw@gmail.com> Subject: MAINTAINERS: remove incorrect M: tag for dm-devel@lists.linux.dev Date: Wed, 20 Mar 2024 02:18:42 +0800 The dm-devel@lists.linux.dev mailing list should only be listed under the L: (List) tag in the MAINTAINERS file. However, it was incorrectly listed under both L: and M: (Maintainers) tags, which is not accurate. Remove the M: tag for dm-devel@lists.linux.dev in the MAINTAINERS file to reflect the correct categorization. Link: https://lkml.kernel.org/r/20240319181842.249547-1-visitorckw@gmail.com Signed-off-by: Kuan-Wei Chiu <visitorckw@gmail.com> Cc: Ching-Chun (Jim) Huang <jserv@ccns.ncku.edu.tw> Cc: Matthew Sakai <msakai@redhat.com> Cc: Michael Sclafani <dm-devel@lists.linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> --- MAINTAINERS | 1 - 1 file changed, 1 deletion(-) --- a/MAINTAINERS~maintainers-remove-incorrect-m-tag-for-dm-devel-listslinuxdev +++ a/MAINTAINERS @@ -6173,7 +6173,6 @@ F: include/uapi/linux/dm-*.h DEVICE-MAPPER VDO TARGET M: Matthew Sakai <msakai@redhat.com> -M: dm-devel@lists.linux.dev L: dm-devel@lists.linux.dev S: Maintained F: Documentation/admin-guide/device-mapper/vdo*.rst _ Patches currently in -mm which might be from visitorckw@gmail.com are
> From: Heng Qi <hengqi@linux.alibaba.com> > Sent: Tuesday, March 26, 2024 3:55 AM > To: Dan Jurgens <danielj@nvidia.com>; netdev@vger.kernel.org > Cc: mst@redhat.com; jasowang@redhat.com; xuanzhuo@linux.alibaba.com; > virtualization@lists.linux.dev; davem@davemloft.net; > edumazet@google.com; kuba@kernel.org; pabeni@redhat.com; Jiri Pirko > <jiri@nvidia.com> > Subject: Re: [PATCH net-next 4/4] virtio_net: Remove rtnl lock protection of > command buffers > > > > 在 2024/3/26 上午5:49, Daniel Jurgens 写道: > > The rtnl lock is no longer needed to protect the control buffer and > > command VQ. > > > > Signed-off-by: Daniel Jurgens <danielj@nvidia.com> > > Reviewed-by: Jiri Pirko <jiri@nvidia.com> > > --- > > drivers/net/virtio_net.c | 27 +++++---------------------- > > 1 file changed, 5 insertions(+), 22 deletions(-) > > > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index > > 41f8dc16ff38..d09ea20b16be 100644 > > --- a/drivers/net/virtio_net.c > > +++ b/drivers/net/virtio_net.c > > @@ -2639,14 +2639,12 @@ static void virtnet_stats(struct net_device > > *dev, > > > > static void virtnet_ack_link_announce(struct virtnet_info *vi) > > { > > - rtnl_lock(); > > if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_ANNOUNCE, > > VIRTIO_NET_CTRL_ANNOUNCE_ACK, > NULL)) > > dev_warn(&vi->dev->dev, "Failed to ack link announce.\n"); > > - rtnl_unlock(); > > } > > > > -static int _virtnet_set_queues(struct virtnet_info *vi, u16 > > queue_pairs) > > +static int virtnet_set_queues(struct virtnet_info *vi, u16 > > +queue_pairs) > > { > > struct virtio_net_ctrl_mq *mq __free(kfree) = NULL; > > struct scatterlist sg; > > @@ -2677,16 +2675,6 @@ static int _virtnet_set_queues(struct > virtnet_info *vi, u16 queue_pairs) > > return 0; > > } > > > > -static int virtnet_set_queues(struct virtnet_info *vi, u16 > > queue_pairs) -{ > > - int err; > > - > > - rtnl_lock(); > > - err = _virtnet_set_queues(vi, queue_pairs); > > - rtnl_unlock(); > > - return err; > > -} > > - > > static int virtnet_close(struct net_device *dev) > > { > > struct virtnet_info *vi = netdev_priv(dev); @@ -3268,7 +3256,7 @@ > > static int virtnet_set_channels(struct net_device *dev, > > return -EINVAL; > > > > cpus_read_lock(); > > - err = _virtnet_set_queues(vi, queue_pairs); > > + err = virtnet_set_queues(vi, queue_pairs); > > if (err) { > > cpus_read_unlock(); > > goto err; > > @@ -3558,14 +3546,11 @@ static void virtnet_rx_dim_work(struct > work_struct *work) > > struct dim_cq_moder update_moder; > > int i, qnum, err; > > > > - if (!rtnl_trylock()) > > - return; > > - > > Does this guarantee that the synchronization is completely correct? > > The purpose of this patch set is to add a separate lock for ctrlq rather than > reusing the RTNL lock. > But for dim workers, it not only involves the use of ctrlq, but also involves > reading shared variables in interfaces such as .set_coalesce, .get_coalesce, > etc. It looks like there is a risk of a dirty read in the get (usecs updated, but not max_packets). In the set it will return -EINVAL if trying to adjust the settings aside from DIM enabled. I can add a lock for this if you think it's needed, but it doesn't seem like a major problem for debug info. > > In addition, assuming there are 10 queues, each queue is scheduled with its > own dim worker at the same time, then these 10 workers may issue > parameters to rxq0 10 times in parallel, just because the RTNL lock is > removed here. > > Therefore, when the RTNL lock is removed, a 'for loop' is no longer needed in > virtnet_rx_dim_work, and the dim worker of each queue only configures its > own parameters. > Good point. I'll add a new patch to remove the for loop. > Alternatively, please keep RTNL lock here. > > Regards, > Heng > > > /* Each rxq's work is queued by "net_dim()->schedule_work()" > > * in response to NAPI traffic changes. Note that dim->profile_ix > > * for each rxq is updated prior to the queuing action. > > * So we only need to traverse and update profiles for all rxqs > > - * in the work which is holding rtnl_lock. > > + * in the work. > > */ > > for (i = 0; i < vi->curr_queue_pairs; i++) { > > rq = &vi->rq[i]; > > @@ -3587,8 +3572,6 @@ static void virtnet_rx_dim_work(struct > work_struct *work) > > dim->state = DIM_START_MEASURE; > > } > > } > > - > > - rtnl_unlock(); > > } > > > > static int virtnet_coal_params_supported(struct ethtool_coalesce > > *ec) @@ -4036,7 +4019,7 @@ static int virtnet_xdp_set(struct net_device > *dev, struct bpf_prog *prog, > > synchronize_net(); > > } > > > > - err = _virtnet_set_queues(vi, curr_qp + xdp_qp); > > + err = virtnet_set_queues(vi, curr_qp + xdp_qp); > > if (err) > > goto err; > > netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp); @@ - > 4852,7 > > +4835,7 @@ static int virtnet_probe(struct virtio_device *vdev) > > > > virtio_device_ready(vdev); > > > > - _virtnet_set_queues(vi, vi->curr_queue_pairs); > > + virtnet_set_queues(vi, vi->curr_queue_pairs); > > > > /* a random MAC address has been assigned, notify the device. > > * We don't fail probe if VIRTIO_NET_F_CTRL_MAC_ADDR is not > there
From: Arnd Bergmann <arnd@arndb.de> This is a follow-up on a couple of patch series I sent in the past, enabling -Wextra (aside from stuff that is explicitly disabled), -Wcast-function-pointer-strict and -Wrestrict. I have tested these on 'defconfig' and 'allmodconfig' builds across all architectures, as well as many 'randconfig' builds on x86, arm and arm64. It would be nice to have all the Makefile.extrawarn changes in v6.10, hopefully with the driver fixes going in before that through the respective subsystem trees. Arnd Arnd Bergmann (12): kbuild: make -Woverride-init warnings more consistent [v3] parport: mfc3: avoid empty-body warning kbuild: turn on -Wextra by default kbuild: remove redundant extra warning flags firmware: dmi-id: add a release callback function nouveau: fix function cast warning cxlflash: fix function pointer cast warnings x86: math-emu: fix function cast warnings kbuild: enable -Wcast-function-type-strict unconditionally sata: sx4: fix pdc20621_get_from_dimm() on 64-bit [v4] kallsyms: rework symbol lookup return codes kbuild: turn on -Wrestrict by default arch/x86/math-emu/fpu_etc.c | 9 +++-- arch/x86/math-emu/fpu_trig.c | 6 ++-- arch/x86/math-emu/reg_constant.c | 7 +++- drivers/ata/sata_sx4.c | 6 ++-- drivers/firmware/dmi-id.c | 7 +++- .../gpu/drm/amd/display/dc/dce110/Makefile | 2 +- .../gpu/drm/amd/display/dc/dce112/Makefile | 2 +- .../gpu/drm/amd/display/dc/dce120/Makefile | 2 +- drivers/gpu/drm/amd/display/dc/dce60/Makefile | 2 +- drivers/gpu/drm/amd/display/dc/dce80/Makefile | 2 +- drivers/gpu/drm/i915/Makefile | 6 ++-- .../drm/nouveau/nvkm/subdev/bios/shadowof.c | 7 +++- drivers/gpu/drm/xe/Makefile | 4 +-- drivers/net/ethernet/renesas/sh_eth.c | 2 +- drivers/parport/parport_mfc3.c | 3 +- drivers/pinctrl/aspeed/Makefile | 2 +- drivers/scsi/cxlflash/lunmgt.c | 4 +-- drivers/scsi/cxlflash/main.c | 14 ++++---- drivers/scsi/cxlflash/superpipe.c | 34 +++++++++---------- drivers/scsi/cxlflash/superpipe.h | 11 +++--- drivers/scsi/cxlflash/vlun.c | 7 ++-- fs/proc/Makefile | 2 +- include/linux/filter.h | 14 ++++---- include/linux/ftrace.h | 6 ++-- include/linux/module.h | 14 ++++---- kernel/bpf/Makefile | 2 +- kernel/bpf/core.c | 7 ++-- kernel/kallsyms.c | 23 +++++++------ kernel/module/kallsyms.c | 26 +++++++------- kernel/trace/ftrace.c | 13 +++---- mm/Makefile | 3 +- scripts/Makefile.extrawarn | 33 ++++-------------- 32 files changed, 134 insertions(+), 148 deletions(-) -- 2.39.2 Cc: Bill Metzenthen <billm@melbpc.org.au> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: x86@kernel.org Cc: Damien Le Moal <dlemoal@kernel.org> Cc: Jean Delvare <jdelvare@suse.com> Cc: Harry Wentland <harry.wentland@amd.com> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Sergey Shtylyov <s.shtylyov@omp.ru> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Sudip Mukherjee <sudipm.mukherjee@gmail.com> Cc: Andrew Jeffery <andrew@codeconstruct.com.au> Cc: "Manoj N. Kumar" <manoj@linux.ibm.com> Cc: "Martin K. Petersen" <martin.petersen@oracle.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Luis Chamberlain <mcgrof@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Masahiro Yamada <masahiroy@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nicolas Schier <nicolas@fjasle.eu> Cc: Greg Kroah-Hartman <gregkh@suse.de> Cc: linux-kernel@vger.kernel.org Cc: linux-ide@vger.kernel.org Cc: amd-gfx@lists.freedesktop.org Cc: dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org Cc: nouveau@lists.freedesktop.org Cc: intel-xe@lists.freedesktop.org Cc: netdev@vger.kernel.org Cc: linux-renesas-soc@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-scsi@vger.kernel.org Cc: bpf@vger.kernel.org Cc: linux-trace-kernel@vger.kernel.org Cc: linux-modules@vger.kernel.org Cc: linux-mm@kvack.org Cc: linux-kbuild@vger.kernel.org Cc: llvm@lists.linux.dev _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Arnd Bergmann <arnd@arndb.de> This is a follow-up on a couple of patch series I sent in the past, enabling -Wextra (aside from stuff that is explicitly disabled), -Wcast-function-pointer-strict and -Wrestrict. I have tested these on 'defconfig' and 'allmodconfig' builds across all architectures, as well as many 'randconfig' builds on x86, arm and arm64. It would be nice to have all the Makefile.extrawarn changes in v6.10, hopefully with the driver fixes going in before that through the respective subsystem trees. Arnd Arnd Bergmann (12): kbuild: make -Woverride-init warnings more consistent [v3] parport: mfc3: avoid empty-body warning kbuild: turn on -Wextra by default kbuild: remove redundant extra warning flags firmware: dmi-id: add a release callback function nouveau: fix function cast warning cxlflash: fix function pointer cast warnings x86: math-emu: fix function cast warnings kbuild: enable -Wcast-function-type-strict unconditionally sata: sx4: fix pdc20621_get_from_dimm() on 64-bit [v4] kallsyms: rework symbol lookup return codes kbuild: turn on -Wrestrict by default arch/x86/math-emu/fpu_etc.c | 9 +++-- arch/x86/math-emu/fpu_trig.c | 6 ++-- arch/x86/math-emu/reg_constant.c | 7 +++- drivers/ata/sata_sx4.c | 6 ++-- drivers/firmware/dmi-id.c | 7 +++- .../gpu/drm/amd/display/dc/dce110/Makefile | 2 +- .../gpu/drm/amd/display/dc/dce112/Makefile | 2 +- .../gpu/drm/amd/display/dc/dce120/Makefile | 2 +- drivers/gpu/drm/amd/display/dc/dce60/Makefile | 2 +- drivers/gpu/drm/amd/display/dc/dce80/Makefile | 2 +- drivers/gpu/drm/i915/Makefile | 6 ++-- .../drm/nouveau/nvkm/subdev/bios/shadowof.c | 7 +++- drivers/gpu/drm/xe/Makefile | 4 +-- drivers/net/ethernet/renesas/sh_eth.c | 2 +- drivers/parport/parport_mfc3.c | 3 +- drivers/pinctrl/aspeed/Makefile | 2 +- drivers/scsi/cxlflash/lunmgt.c | 4 +-- drivers/scsi/cxlflash/main.c | 14 ++++---- drivers/scsi/cxlflash/superpipe.c | 34 +++++++++---------- drivers/scsi/cxlflash/superpipe.h | 11 +++--- drivers/scsi/cxlflash/vlun.c | 7 ++-- fs/proc/Makefile | 2 +- include/linux/filter.h | 14 ++++---- include/linux/ftrace.h | 6 ++-- include/linux/module.h | 14 ++++---- kernel/bpf/Makefile | 2 +- kernel/bpf/core.c | 7 ++-- kernel/kallsyms.c | 23 +++++++------ kernel/module/kallsyms.c | 26 +++++++------- kernel/trace/ftrace.c | 13 +++---- mm/Makefile | 3 +- scripts/Makefile.extrawarn | 33 ++++-------------- 32 files changed, 134 insertions(+), 148 deletions(-) -- 2.39.2 Cc: Bill Metzenthen <billm@melbpc.org.au> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: x86@kernel.org Cc: Damien Le Moal <dlemoal@kernel.org> Cc: Jean Delvare <jdelvare@suse.com> Cc: Harry Wentland <harry.wentland@amd.com> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Sergey Shtylyov <s.shtylyov@omp.ru> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Sudip Mukherjee <sudipm.mukherjee@gmail.com> Cc: Andrew Jeffery <andrew@codeconstruct.com.au> Cc: "Manoj N. Kumar" <manoj@linux.ibm.com> Cc: "Martin K. Petersen" <martin.petersen@oracle.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Luis Chamberlain <mcgrof@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Masahiro Yamada <masahiroy@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nicolas Schier <nicolas@fjasle.eu> Cc: Greg Kroah-Hartman <gregkh@suse.de> Cc: linux-kernel@vger.kernel.org Cc: linux-ide@vger.kernel.org Cc: amd-gfx@lists.freedesktop.org Cc: dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org Cc: nouveau@lists.freedesktop.org Cc: intel-xe@lists.freedesktop.org Cc: netdev@vger.kernel.org Cc: linux-renesas-soc@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-scsi@vger.kernel.org Cc: bpf@vger.kernel.org Cc: linux-trace-kernel@vger.kernel.org Cc: linux-modules@vger.kernel.org Cc: linux-mm@kvack.org Cc: linux-kbuild@vger.kernel.org Cc: llvm@lists.linux.dev
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: Linux Memory Management List <linux-mm@kvack.org> TO: Revalla Hari Krishna <harikrishna.revalla@amd.com> CC: Alex Deucher <alexander.deucher@amd.com> CC: Martin Leung <martin.leung@amd.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: 084c8e315db34b59d38d06e684b1a0dd07d30287 commit: 88867807564e28409d8220419da7559364109a2a [877/1756] drm/amd/display: Refactor DPP into a component directory :::::: branch date: 9 hours ago :::::: commit date: 6 days ago config: x86_64-randconfig-102-20240326 (https://download.01.org/0day-ci/archive/20240326/202403262220.Yr3uI0dQ-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403262220.Yr3uI0dQ-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:400:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c:402:46-47: WARNING opportunity for min() -- >> drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c:269:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c:271:46-47: WARNING opportunity for min() -- >> drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c:43:42-43: WARNING opportunity for min() drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c:45:46-47: WARNING opportunity for min() vim +400 drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 390 dd93752b648309 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-10-10 391 void dpp1_dscl_calc_lb_num_partitions( 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 392 const struct scaler_data *scl_data, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 393 enum lb_memory_config lb_config, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 394 int *num_part_y, 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 395 int *num_part_c) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 396 { 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 397 int lb_memory_size, lb_memory_size_c, lb_memory_size_a, num_partitions_a, 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 398 lb_bpc, memory_line_size_y, memory_line_size_c, memory_line_size_a; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 399 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 @400 int line_size = scl_data->viewport.width < scl_data->recout.width ? 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 401 scl_data->viewport.width : scl_data->recout.width; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 402 int line_size_c = scl_data->viewport_c.width < scl_data->recout.width ? 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 403 scl_data->viewport_c.width : scl_data->recout.width; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 404 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 405 if (line_size == 0) 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 406 line_size = 1; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 407 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 408 if (line_size_c == 0) 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 409 line_size_c = 1; 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 410 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 411 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 412 lb_bpc = dpp1_dscl_get_lb_depth_bpc(scl_data->lb_params.depth); 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 413 memory_line_size_y = (line_size * lb_bpc + 71) / 72; /* +71 to ceil */ 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 414 memory_line_size_c = (line_size_c * lb_bpc + 71) / 72; /* +71 to ceil */ 59979bf8be1784 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Murton Liu 2019-02-15 415 memory_line_size_a = (line_size + 5) / 6; /* +5 to ceil */ 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 416 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 417 if (lb_config == LB_MEMORY_CONFIG_1) { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 418 lb_memory_size = 816; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 419 lb_memory_size_c = 816; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 420 lb_memory_size_a = 984; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 421 } else if (lb_config == LB_MEMORY_CONFIG_2) { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 422 lb_memory_size = 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 423 lb_memory_size_c = 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 424 lb_memory_size_a = 1312; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 425 } else if (lb_config == LB_MEMORY_CONFIG_3) { 734a092b1fe407 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Eric Bernstein 2017-09-29 426 /* 420 mode: using 3rd mem from Y, Cr and Cb */ 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 427 lb_memory_size = 816 + 1088 + 848 + 848 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 428 lb_memory_size_c = 816 + 1088; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 429 lb_memory_size_a = 984 + 1312 + 456; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 430 } else { 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 431 lb_memory_size = 816 + 1088 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 432 lb_memory_size_c = 816 + 1088 + 848; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 433 lb_memory_size_a = 984 + 1312 + 456; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 434 } 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 435 *num_part_y = lb_memory_size / memory_line_size_y; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 436 *num_part_c = lb_memory_size_c / memory_line_size_c; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 437 num_partitions_a = lb_memory_size_a / memory_line_size_a; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 438 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 439 if (scl_data->lb_params.alpha_en 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 440 && (num_partitions_a < *num_part_y)) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 441 *num_part_y = num_partitions_a; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 442 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 443 if (*num_part_y > 64) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 444 *num_part_y = 64; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 445 if (*num_part_c > 64) 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 446 *num_part_c = 64; 5e9a81b2c46555 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c Yue Hin Lau 2017-08-15 447 :::::: The code at line 400 was first introduced by commit :::::: 5e9a81b2c465557adbaeef7231834e3ab40e4102 drm/amd/display: separate scl functions out from dcn10_dpp :::::: TO: Yue Hin Lau <Yuehin.Lau@amd.com> :::::: CC: Alex Deucher <alexander.deucher@amd.com> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev In-Reply-To: <20240325044452.3125418-9-dlemoal@kernel.org> References: <20240325044452.3125418-9-dlemoal@kernel.org> TO: Damien Le Moal <dlemoal@kernel.org> TO: linux-block@vger.kernel.org TO: Jens Axboe <axboe@kernel.dk> TO: linux-scsi@vger.kernel.org TO: "Martin K . Petersen" <martin.petersen@oracle.com> TO: dm-devel@lists.linux.dev TO: Mike Snitzer <snitzer@redhat.com> CC: Christoph Hellwig <hch@lst.de> Hi Damien, kernel test robot noticed the following build warnings: [auto build test WARNING on axboe-block/for-next] [also build test WARNING on device-mapper-dm/for-next mkp-scsi/for-next linus/master v6.9-rc1 next-20240326] [cannot apply to jejb-scsi/for-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Damien-Le-Moal/block-Restore-sector-of-flush-requests/20240325-205923 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next patch link: https://lore.kernel.org/r/20240325044452.3125418-9-dlemoal%40kernel.org patch subject: [PATCH v2 08/28] block: Use a mempool to allocate zone write plugs :::::: branch date: 25 hours ago :::::: commit date: 25 hours ago config: x86_64-randconfig-102-20240326 (https://download.01.org/0day-ci/archive/20240326/202403262119.L0zcZoEd-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403262119.L0zcZoEd-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> block/blk-zoned.c:574:5-24: WARNING: atomic_dec_and_test variation before object free at line 578. vim +574 block/blk-zoned.c 189624acbcfc512 Damien Le Moal 2024-03-25 570 9678de3a47d5681 Damien Le Moal 2024-03-25 571 static inline void disk_put_zone_wplug(struct gendisk *disk, 9678de3a47d5681 Damien Le Moal 2024-03-25 572 struct blk_zone_wplug *zwplug) 189624acbcfc512 Damien Le Moal 2024-03-25 573 { 189624acbcfc512 Damien Le Moal 2024-03-25 @574 if (atomic_dec_and_test(&zwplug->ref)) { 189624acbcfc512 Damien Le Moal 2024-03-25 575 WARN_ON_ONCE(!bio_list_empty(&zwplug->bio_list)); 189624acbcfc512 Damien Le Moal 2024-03-25 576 WARN_ON_ONCE(!list_empty(&zwplug->err)); 189624acbcfc512 Damien Le Moal 2024-03-25 577 9678de3a47d5681 Damien Le Moal 2024-03-25 @578 mempool_free(zwplug, disk->zone_wplugs_pool); 189624acbcfc512 Damien Le Moal 2024-03-25 579 } 189624acbcfc512 Damien Le Moal 2024-03-25 580 } 189624acbcfc512 Damien Le Moal 2024-03-25 581 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: Yi Liu <yi.l.liu@intel.com> TO: Kevin Tian <kevin.tian@intel.com> tree: https://github.com/yiliu1765/iommufd.git wip/iommufd_pasid-20240325 head: 7bb9cc1c3a745ec3330323eebdf73f9a9e87376e commit: d14d15b07135ca14f5008f865b371fc7a1aef36d [14/26] iommufd: Support attach/replace hwpt per pasid :::::: branch date: 24 hours ago :::::: commit date: 27 hours ago config: i386-randconfig-141-20240326 (https://download.01.org/0day-ci/archive/20240326/202403262020.otycu3fa-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403262020.otycu3fa-lkp@intel.com/ smatch warnings: drivers/iommu/iommufd/pasid.c:37 iommufd_device_pasid_do_attach() warn: passing zero to 'ERR_PTR' drivers/iommu/iommufd/pasid.c:74 iommufd_device_pasid_do_replace() warn: passing zero to 'ERR_PTR' vim +/ERR_PTR +37 drivers/iommu/iommufd/pasid.c d14d15b07135ca Yi Liu 2024-03-18 9 d14d15b07135ca Yi Liu 2024-03-18 10 struct iommufd_hw_pagetable * d14d15b07135ca Yi Liu 2024-03-18 11 iommufd_device_pasid_do_attach(struct iommufd_device *idev, u32 pasid, d14d15b07135ca Yi Liu 2024-03-18 12 struct iommufd_hw_pagetable *hwpt) d14d15b07135ca Yi Liu 2024-03-18 13 { d14d15b07135ca Yi Liu 2024-03-18 14 void *curr; d14d15b07135ca Yi Liu 2024-03-18 15 int rc; d14d15b07135ca Yi Liu 2024-03-18 16 d14d15b07135ca Yi Liu 2024-03-18 17 refcount_inc(&hwpt->obj.users); d14d15b07135ca Yi Liu 2024-03-18 18 curr = xa_cmpxchg(&idev->pasid_hwpts, pasid, NULL, hwpt, GFP_KERNEL); d14d15b07135ca Yi Liu 2024-03-18 19 if (curr) { d14d15b07135ca Yi Liu 2024-03-18 20 if (curr == hwpt) d14d15b07135ca Yi Liu 2024-03-18 21 rc = 0; d14d15b07135ca Yi Liu 2024-03-18 22 else d14d15b07135ca Yi Liu 2024-03-18 23 rc = xa_err(curr) ? : -EBUSY; d14d15b07135ca Yi Liu 2024-03-18 24 goto err_put_hwpt; d14d15b07135ca Yi Liu 2024-03-18 25 } d14d15b07135ca Yi Liu 2024-03-18 26 d14d15b07135ca Yi Liu 2024-03-18 27 rc = iommu_attach_device_pasid(hwpt->domain, idev->dev, pasid); d14d15b07135ca Yi Liu 2024-03-18 28 if (rc) { d14d15b07135ca Yi Liu 2024-03-18 29 xa_erase(&idev->pasid_hwpts, pasid); d14d15b07135ca Yi Liu 2024-03-18 30 goto err_put_hwpt; d14d15b07135ca Yi Liu 2024-03-18 31 } d14d15b07135ca Yi Liu 2024-03-18 32 d14d15b07135ca Yi Liu 2024-03-18 33 return NULL; d14d15b07135ca Yi Liu 2024-03-18 34 d14d15b07135ca Yi Liu 2024-03-18 35 err_put_hwpt: d14d15b07135ca Yi Liu 2024-03-18 36 refcount_dec(&hwpt->obj.users); d14d15b07135ca Yi Liu 2024-03-18 @37 return ERR_PTR(rc); d14d15b07135ca Yi Liu 2024-03-18 38 } d14d15b07135ca Yi Liu 2024-03-18 39 d14d15b07135ca Yi Liu 2024-03-18 40 struct iommufd_hw_pagetable * d14d15b07135ca Yi Liu 2024-03-18 41 iommufd_device_pasid_do_replace(struct iommufd_device *idev, u32 pasid, d14d15b07135ca Yi Liu 2024-03-18 42 struct iommufd_hw_pagetable *hwpt) d14d15b07135ca Yi Liu 2024-03-18 43 { d14d15b07135ca Yi Liu 2024-03-18 44 void *curr; d14d15b07135ca Yi Liu 2024-03-18 45 int rc; d14d15b07135ca Yi Liu 2024-03-18 46 d14d15b07135ca Yi Liu 2024-03-18 47 refcount_inc(&hwpt->obj.users); d14d15b07135ca Yi Liu 2024-03-18 48 curr = xa_store(&idev->pasid_hwpts, pasid, hwpt, GFP_KERNEL); d14d15b07135ca Yi Liu 2024-03-18 49 rc = xa_err(curr); d14d15b07135ca Yi Liu 2024-03-18 50 if (rc) d14d15b07135ca Yi Liu 2024-03-18 51 goto out_put_hwpt; d14d15b07135ca Yi Liu 2024-03-18 52 d14d15b07135ca Yi Liu 2024-03-18 53 if (!curr) { d14d15b07135ca Yi Liu 2024-03-18 54 xa_erase(&idev->pasid_hwpts, pasid); d14d15b07135ca Yi Liu 2024-03-18 55 rc = -EINVAL; d14d15b07135ca Yi Liu 2024-03-18 56 goto out_put_hwpt; d14d15b07135ca Yi Liu 2024-03-18 57 } d14d15b07135ca Yi Liu 2024-03-18 58 d14d15b07135ca Yi Liu 2024-03-18 59 if (curr == hwpt) d14d15b07135ca Yi Liu 2024-03-18 60 goto out_put_hwpt; d14d15b07135ca Yi Liu 2024-03-18 61 d14d15b07135ca Yi Liu 2024-03-18 62 rc = iommu_replace_device_pasid(hwpt->domain, idev->dev, pasid); d14d15b07135ca Yi Liu 2024-03-18 63 if (rc) { d14d15b07135ca Yi Liu 2024-03-18 64 WARN_ON(xa_err(xa_store(&idev->pasid_hwpts, pasid, d14d15b07135ca Yi Liu 2024-03-18 65 curr, GFP_KERNEL))); d14d15b07135ca Yi Liu 2024-03-18 66 goto out_put_hwpt; d14d15b07135ca Yi Liu 2024-03-18 67 } d14d15b07135ca Yi Liu 2024-03-18 68 d14d15b07135ca Yi Liu 2024-03-18 69 /* Caller must destroy old_hwpt */ d14d15b07135ca Yi Liu 2024-03-18 70 return curr; d14d15b07135ca Yi Liu 2024-03-18 71 d14d15b07135ca Yi Liu 2024-03-18 72 out_put_hwpt: d14d15b07135ca Yi Liu 2024-03-18 73 refcount_dec(&hwpt->obj.users); d14d15b07135ca Yi Liu 2024-03-18 @74 return ERR_PTR(rc); d14d15b07135ca Yi Liu 2024-03-18 75 } d14d15b07135ca Yi Liu 2024-03-18 76 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
[-- Attachment #1: Type: text/plain, Size: 550 bytes --] Dear Borislav, Am 26.03.24 um 13:49 schrieb Borislav Petkov: > On Tue, Mar 26, 2024 at 01:40:57PM +0100, Paul Menzel wrote: >> On a Dell XPS 13 9360/0596KF, BIOS 2.21.0 06/02/2022, Linux 6.9-rc1+ built >> with >> >> CONFIG_KCSAN=y > > Are you saying that with KCSAN=n, it doesn't happen? Indeed. Please find the messages from the journal attached. > From the splat lt looks like it complains when loading that cryptd > module. But that thing looks like a normal module to me so it should > be fine actually. > > Hmm. Kind regards, Paul [-- Attachment #2: linux-6.9-rc1+-without-kcsan--messages.txt --] [-- Type: text/plain, Size: 111872 bytes --] [ 0.000000] abreu kernel: Linux version 6.9.0-rc1+ (build@bohemianrhapsody.molgen.mpg.de) (gcc (Debian 13.2.0-19) 13.2.0, GNU ld (GNU Binutils for Debian) 2.42) #76 SMP PREEMPT_DYNAMIC Tue Mar 26 08:52:29 CET 2024 [ 0.000000] abreu kernel: Command line: BOOT_IMAGE=/vmlinuz-6.9.0-rc1+ root=UUID=32e29882-d94d-4a92-9ee4-4d03002bfa29 ro quiet pci=noaer mem_sleep_default=deep log_buf_len=8M cryptomgr.notests [ 0.000000] abreu kernel: BIOS-provided physical RAM map: [ 0.000000] abreu kernel: BIOS-e820: [mem 0x0000000000000000-0x0000000000057fff] usable [ 0.000000] abreu kernel: BIOS-e820: [mem 0x0000000000058000-0x0000000000058fff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x0000000000059000-0x000000000009dfff] usable [ 0.000000] abreu kernel: BIOS-e820: [mem 0x000000000009e000-0x00000000000fffff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000556aafff] usable [ 0.000000] abreu kernel: BIOS-e820: [mem 0x00000000556ab000-0x00000000556abfff] ACPI NVS [ 0.000000] abreu kernel: BIOS-e820: [mem 0x00000000556ac000-0x00000000556acfff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x00000000556ad000-0x0000000064df3fff] usable [ 0.000000] abreu kernel: BIOS-e820: [mem 0x0000000064df4000-0x000000006517ffff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x0000000065180000-0x00000000651c3fff] ACPI data [ 0.000000] abreu kernel: BIOS-e820: [mem 0x00000000651c4000-0x000000006f871fff] ACPI NVS [ 0.000000] abreu kernel: BIOS-e820: [mem 0x000000006f872000-0x000000006fffefff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x000000006ffff000-0x000000006fffffff] usable [ 0.000000] abreu kernel: BIOS-e820: [mem 0x0000000070000000-0x0000000077ffffff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x0000000078000000-0x00000000785fffff] usable [ 0.000000] abreu kernel: BIOS-e820: [mem 0x0000000078600000-0x000000007c7fffff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x00000000fe000000-0x00000000fe010fff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved [ 0.000000] abreu kernel: BIOS-e820: [mem 0x0000000100000000-0x00000004817fffff] usable [ 0.000000] abreu kernel: NX (Execute Disable) protection: active [ 0.000000] abreu kernel: APIC: Static calls initialized [ 0.000000] abreu kernel: e820: update [mem 0x513ed018-0x513fd057] usable ==> usable [ 0.000000] abreu kernel: extended physical RAM map: [ 0.000000] abreu kernel: reserve setup_data: [mem 0x0000000000000000-0x0000000000057fff] usable [ 0.000000] abreu kernel: reserve setup_data: [mem 0x0000000000058000-0x0000000000058fff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x0000000000059000-0x000000000009dfff] usable [ 0.000000] abreu kernel: reserve setup_data: [mem 0x000000000009e000-0x00000000000fffff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x0000000000100000-0x00000000513ed017] usable [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000513ed018-0x00000000513fd057] usable [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000513fd058-0x00000000556aafff] usable [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000556ab000-0x00000000556abfff] ACPI NVS [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000556ac000-0x00000000556acfff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000556ad000-0x0000000064df3fff] usable [ 0.000000] abreu kernel: reserve setup_data: [mem 0x0000000064df4000-0x000000006517ffff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x0000000065180000-0x00000000651c3fff] ACPI data [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000651c4000-0x000000006f871fff] ACPI NVS [ 0.000000] abreu kernel: reserve setup_data: [mem 0x000000006f872000-0x000000006fffefff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x000000006ffff000-0x000000006fffffff] usable [ 0.000000] abreu kernel: reserve setup_data: [mem 0x0000000070000000-0x0000000077ffffff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x0000000078000000-0x00000000785fffff] usable [ 0.000000] abreu kernel: reserve setup_data: [mem 0x0000000078600000-0x000000007c7fffff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000e0000000-0x00000000efffffff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000fe000000-0x00000000fe010fff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000fec00000-0x00000000fec00fff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000fee00000-0x00000000fee00fff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x00000000ff000000-0x00000000ffffffff] reserved [ 0.000000] abreu kernel: reserve setup_data: [mem 0x0000000100000000-0x00000004817fffff] usable [ 0.000000] abreu kernel: efi: EFI v2.4 by American Megatrends [ 0.000000] abreu kernel: efi: ACPI=0x6518d000 ACPI 2.0=0x6518d000 SMBIOS=0xf0000 SMBIOS 3.0=0xf0020 TPMFinalLog=0x6f812000 ESRT=0x6fc86698 MEMATTR=0x62679298 INITRD=0x5577da98 TPMEventLog=0x5577e018 [ 0.000000] abreu kernel: efi: Remove mem34: MMIO range=[0xe0000000-0xefffffff] (256MB) from e820 map [ 0.000000] abreu kernel: e820: remove [mem 0xe0000000-0xefffffff] reserved [ 0.000000] abreu kernel: efi: Not removing mem35: MMIO range=[0xfe000000-0xfe010fff] (68KB) from e820 map [ 0.000000] abreu kernel: efi: Not removing mem36: MMIO range=[0xfec00000-0xfec00fff] (4KB) from e820 map [ 0.000000] abreu kernel: efi: Not removing mem37: MMIO range=[0xfee00000-0xfee00fff] (4KB) from e820 map [ 0.000000] abreu kernel: efi: Remove mem38: MMIO range=[0xff000000-0xffffffff] (16MB) from e820 map [ 0.000000] abreu kernel: e820: remove [mem 0xff000000-0xffffffff] reserved [ 0.000000] abreu kernel: SMBIOS 3.0.0 present. [ 0.000000] abreu kernel: DMI: Dell Inc. XPS 13 9360/0596KF, BIOS 2.21.0 06/02/2022 [ 0.000000] abreu kernel: tsc: Detected 2900.000 MHz processor [ 0.000000] abreu kernel: tsc: Detected 2899.886 MHz TSC [ 0.000660] abreu kernel: e820: update [mem 0x00000000-0x00000fff] usable ==> reserved [ 0.000663] abreu kernel: e820: remove [mem 0x000a0000-0x000fffff] usable [ 0.000670] abreu kernel: last_pfn = 0x481800 max_arch_pfn = 0x400000000 [ 0.000674] abreu kernel: MTRR map: 4 entries (3 fixed + 1 variable; max 23), built from 10 variable MTRRs [ 0.000676] abreu kernel: x86/PAT: Configuration [0-7]: WB WC UC- UC WB WP UC- WT [ 0.000985] abreu kernel: last_pfn = 0x78600 max_arch_pfn = 0x400000000 [ 0.007511] abreu kernel: esrt: Reserving ESRT space from 0x000000006fc86698 to 0x000000006fc866d0. [ 0.007517] abreu kernel: Using GB pages for direct mapping [ 0.013787] abreu kernel: printk: log_buf_len: 8388608 bytes [ 0.013788] abreu kernel: printk: early log buf free: 125416(95%) [ 0.013789] abreu kernel: Secure boot disabled [ 0.013789] abreu kernel: RAMDISK: [mem 0x513fe000-0x52718fff] [ 0.013793] abreu kernel: ACPI: Early table checksum verification disabled [ 0.013796] abreu kernel: ACPI: RSDP 0x000000006518D000 000024 (v02 DELL ) [ 0.013800] abreu kernel: ACPI: XSDT 0x000000006518D0C8 00010C (v01 DELL CBX3 01072009 AMI 00010013) [ 0.013805] abreu kernel: ACPI: FACP 0x00000000651B2A48 00010C (v05 DELL CBX3 01072009 AMI 00010013) [ 0.013810] abreu kernel: ACPI: DSDT 0x000000006518D260 0257E7 (v02 DELL CBX3 01072009 INTL 20160422) [ 0.013813] abreu kernel: ACPI: FACS 0x000000006F86F180 000040 [ 0.013816] abreu kernel: ACPI: APIC 0x00000000651B2B58 000084 (v03 DELL CBX3 01072009 AMI 00010013) [ 0.013818] abreu kernel: ACPI: FPDT 0x00000000651B2BE0 000044 (v01 DELL CBX3 01072009 AMI 00010013) [ 0.013821] abreu kernel: ACPI: FIDT 0x00000000651B2C28 0000AC (v01 DELL CBX3 01072009 AMI 00010013) [ 0.013824] abreu kernel: ACPI: MCFG 0x00000000651B2CD8 00003C (v01 DELL CBX3 01072009 MSFT 00000097) [ 0.013827] abreu kernel: ACPI: HPET 0x00000000651B2D18 000038 (v01 DELL CBX3 01072009 AMI. 0005000B) [ 0.013830] abreu kernel: ACPI: SSDT 0x00000000651B2D50 000359 (v01 SataRe SataTabl 00001000 INTL 20160422) [ 0.013833] abreu kernel: ACPI: BOOT 0x00000000651B30B0 000028 (v01 DELL CBX3 01072009 AMI 00010013) [ 0.013835] abreu kernel: ACPI: SSDT 0x00000000651B30D8 0012CF (v02 SaSsdt SaSsdt 00003000 INTL 20160422) [ 0.013838] abreu kernel: ACPI: HPET 0x00000000651B43A8 000038 (v01 INTEL KBL-ULT 00000001 MSFT 0000005F) [ 0.013841] abreu kernel: ACPI: SSDT 0x00000000651B43E0 000D84 (v02 INTEL xh_rvp07 00000000 INTL 20160422) [ 0.013843] abreu kernel: ACPI: UEFI 0x00000000651B5168 000042 (v01 00000000 00000000) [ 0.013846] abreu kernel: ACPI: SSDT 0x00000000651B51B0 000EDE (v02 CpuRef CpuSsdt 00003000 INTL 20160422) [ 0.013849] abreu kernel: ACPI: LPIT 0x00000000651B6090 000094 (v01 INTEL KBL-ULT 00000000 MSFT 0000005F) [ 0.013851] abreu kernel: ACPI: WSMT 0x00000000651B6128 000028 (v01 DELL CBX3 00000000 MSFT 0000005F) [ 0.013854] abreu kernel: ACPI: SSDT 0x00000000651B6150 000161 (v02 INTEL HdaDsp 00000000 INTL 20160422) [ 0.013857] abreu kernel: ACPI: SSDT 0x00000000651B62B8 00029F (v02 INTEL sensrhub 00000000 INTL 20160422) [ 0.013859] abreu kernel: ACPI: SSDT 0x00000000651B6558 003002 (v02 INTEL PtidDevc 00001000 INTL 20160422) [ 0.013862] abreu kernel: ACPI: SSDT 0x00000000651B9560 0000DB (v02 INTEL TbtTypeC 00000000 INTL 20160422) [ 0.013865] abreu kernel: ACPI: DBGP 0x00000000651B9640 000034 (v01 INTEL 00000002 MSFT 0000005F) [ 0.013867] abreu kernel: ACPI: DBG2 0x00000000651B9678 000054 (v00 INTEL 00000002 MSFT 0000005F) [ 0.013870] abreu kernel: ACPI: SSDT 0x00000000651B96D0 0007DD (v02 INTEL UsbCTabl 00001000 INTL 20160422) [ 0.013873] abreu kernel: ACPI: SSDT 0x00000000651B9EB0 0084F1 (v02 DptfTa DptfTabl 00001000 INTL 20160422) [ 0.013875] abreu kernel: ACPI: SLIC 0x00000000651C23A8 000176 (v03 DELL CBX3 01072009 MSFT 00010013) [ 0.013878] abreu kernel: ACPI: NHLT 0x00000000651C2520 00002D (v00 INTEL EDK2 00000002 01000013) [ 0.013880] abreu kernel: ACPI: BGRT 0x00000000651C2550 000038 (v00 01072009 AMI 00010013) [ 0.013883] abreu kernel: ACPI: TPM2 0x00000000651C2588 000034 (v03 Tpm2Tabl 00000001 AMI 00000000) [ 0.013886] abreu kernel: ACPI: ASF! 0x00000000651C25C0 0000A0 (v32 INTEL HCG 00000001 TFSM 000F4240) [ 0.013889] abreu kernel: ACPI: DMAR 0x00000000651C2660 0000F0 (v01 INTEL KBL 00000001 INTL 00000001) [ 0.013891] abreu kernel: ACPI: Reserving FACP table memory at [mem 0x651b2a48-0x651b2b53] [ 0.013892] abreu kernel: ACPI: Reserving DSDT table memory at [mem 0x6518d260-0x651b2a46] [ 0.013893] abreu kernel: ACPI: Reserving FACS table memory at [mem 0x6f86f180-0x6f86f1bf] [ 0.013893] abreu kernel: ACPI: Reserving APIC table memory at [mem 0x651b2b58-0x651b2bdb] [ 0.013894] abreu kernel: ACPI: Reserving FPDT table memory at [mem 0x651b2be0-0x651b2c23] [ 0.013895] abreu kernel: ACPI: Reserving FIDT table memory at [mem 0x651b2c28-0x651b2cd3] [ 0.013896] abreu kernel: ACPI: Reserving MCFG table memory at [mem 0x651b2cd8-0x651b2d13] [ 0.013896] abreu kernel: ACPI: Reserving HPET table memory at [mem 0x651b2d18-0x651b2d4f] [ 0.013897] abreu kernel: ACPI: Reserving SSDT table memory at [mem 0x651b2d50-0x651b30a8] [ 0.013898] abreu kernel: ACPI: Reserving BOOT table memory at [mem 0x651b30b0-0x651b30d7] [ 0.013898] abreu kernel: ACPI: Reserving SSDT table memory at [mem 0x651b30d8-0x651b43a6] [ 0.013899] abreu kernel: ACPI: Reserving HPET table memory at [mem 0x651b43a8-0x651b43df] [ 0.013900] abreu kernel: ACPI: Reserving SSDT table memory at [mem 0x651b43e0-0x651b5163] [ 0.013901] abreu kernel: ACPI: Reserving UEFI table memory at [mem 0x651b5168-0x651b51a9] [ 0.013901] abreu kernel: ACPI: Reserving SSDT table memory at [mem 0x651b51b0-0x651b608d] [ 0.013902] abreu kernel: ACPI: Reserving LPIT table memory at [mem 0x651b6090-0x651b6123] [ 0.013903] abreu kernel: ACPI: Reserving WSMT table memory at [mem 0x651b6128-0x651b614f] [ 0.013904] abreu kernel: ACPI: Reserving SSDT table memory at [mem 0x651b6150-0x651b62b0] [ 0.013904] abreu kernel: ACPI: Reserving SSDT table memory at [mem 0x651b62b8-0x651b6556] [ 0.013905] abreu kernel: ACPI: Reserving SSDT table memory at [mem 0x651b6558-0x651b9559] [ 0.013906] abreu kernel: ACPI: Reserving SSDT table memory at [mem 0x651b9560-0x651b963a] [ 0.013906] abreu kernel: ACPI: Reserving DBGP table memory at [mem 0x651b9640-0x651b9673] [ 0.013907] abreu kernel: ACPI: Reserving DBG2 table memory at [mem 0x651b9678-0x651b96cb] [ 0.013908] abreu kernel: ACPI: Reserving SSDT table memory at [mem 0x651b96d0-0x651b9eac] [ 0.013909] abreu kernel: ACPI: Reserving SSDT table memory at [mem 0x651b9eb0-0x651c23a0] [ 0.013909] abreu kernel: ACPI: Reserving SLIC table memory at [mem 0x651c23a8-0x651c251d] [ 0.013910] abreu kernel: ACPI: Reserving NHLT table memory at [mem 0x651c2520-0x651c254c] [ 0.013911] abreu kernel: ACPI: Reserving BGRT table memory at [mem 0x651c2550-0x651c2587] [ 0.013911] abreu kernel: ACPI: Reserving TPM2 table memory at [mem 0x651c2588-0x651c25bb] [ 0.013912] abreu kernel: ACPI: Reserving ASF! table memory at [mem 0x651c25c0-0x651c265f] [ 0.013913] abreu kernel: ACPI: Reserving DMAR table memory at [mem 0x651c2660-0x651c274f] [ 0.014040] abreu kernel: No NUMA configuration found [ 0.014041] abreu kernel: Faking a node at [mem 0x0000000000000000-0x00000004817fffff] [ 0.014049] abreu kernel: NODE_DATA(0) allocated [mem 0x47f3d5000-0x47f3fffff] [ 0.014232] abreu kernel: Zone ranges: [ 0.014233] abreu kernel: DMA [mem 0x0000000000001000-0x0000000000ffffff] [ 0.014234] abreu kernel: DMA32 [mem 0x0000000001000000-0x00000000ffffffff] [ 0.014236] abreu kernel: Normal [mem 0x0000000100000000-0x00000004817fffff] [ 0.014237] abreu kernel: Device empty [ 0.014238] abreu kernel: Movable zone start for each node [ 0.014240] abreu kernel: Early memory node ranges [ 0.014240] abreu kernel: node 0: [mem 0x0000000000001000-0x0000000000057fff] [ 0.014242] abreu kernel: node 0: [mem 0x0000000000059000-0x000000000009dfff] [ 0.014243] abreu kernel: node 0: [mem 0x0000000000100000-0x00000000556aafff] [ 0.014244] abreu kernel: node 0: [mem 0x00000000556ad000-0x0000000064df3fff] [ 0.014244] abreu kernel: node 0: [mem 0x000000006ffff000-0x000000006fffffff] [ 0.014245] abreu kernel: node 0: [mem 0x0000000078000000-0x00000000785fffff] [ 0.014246] abreu kernel: node 0: [mem 0x0000000100000000-0x00000004817fffff] [ 0.014248] abreu kernel: Initmem setup node 0 [mem 0x0000000000001000-0x00000004817fffff] [ 0.014252] abreu kernel: On node 0, zone DMA: 1 pages in unavailable ranges [ 0.014253] abreu kernel: On node 0, zone DMA: 1 pages in unavailable ranges [ 0.014275] abreu kernel: On node 0, zone DMA: 98 pages in unavailable ranges [ 0.016619] abreu kernel: On node 0, zone DMA32: 2 pages in unavailable ranges [ 0.017058] abreu kernel: On node 0, zone DMA32: 45579 pages in unavailable ranges [ 0.017582] abreu kernel: On node 0, zone Normal: 31232 pages in unavailable ranges [ 0.017832] abreu kernel: On node 0, zone Normal: 26624 pages in unavailable ranges [ 0.017840] abreu kernel: Reserving Intel graphics memory at [mem 0x7a800000-0x7c7fffff] [ 0.018021] abreu kernel: ACPI: PM-Timer IO Port: 0x1808 [ 0.018027] abreu kernel: ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1]) [ 0.018029] abreu kernel: ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1]) [ 0.018029] abreu kernel: ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1]) [ 0.018030] abreu kernel: ACPI: LAPIC_NMI (acpi_id[0x04] high edge lint[0x1]) [ 0.018056] abreu kernel: IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-119 [ 0.018059] abreu kernel: ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) [ 0.018061] abreu kernel: ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level) [ 0.018064] abreu kernel: ACPI: Using ACPI (MADT) for SMP configuration information [ 0.018065] abreu kernel: ACPI: HPET id: 0x8086a701 base: 0xfed00000 [ 0.018072] abreu kernel: e820: update [mem 0x62260000-0x623ecfff] usable ==> reserved [ 0.018081] abreu kernel: TSC deadline timer available [ 0.018085] abreu kernel: CPU topo: Max. logical packages: 1 [ 0.018086] abreu kernel: CPU topo: Max. logical dies: 1 [ 0.018087] abreu kernel: CPU topo: Max. dies per package: 1 [ 0.018090] abreu kernel: CPU topo: Max. threads per core: 2 [ 0.018091] abreu kernel: CPU topo: Num. cores per package: 2 [ 0.018092] abreu kernel: CPU topo: Num. threads per package: 4 [ 0.018092] abreu kernel: CPU topo: Allowing 4 present CPUs plus 0 hotplug CPUs [ 0.018111] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x00000000-0x00000fff] [ 0.018113] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x00058000-0x00058fff] [ 0.018114] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x0009e000-0x000fffff] [ 0.018116] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x513ed000-0x513edfff] [ 0.018117] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x513fd000-0x513fdfff] [ 0.018119] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x556ab000-0x556abfff] [ 0.018120] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x556ac000-0x556acfff] [ 0.018121] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x62260000-0x623ecfff] [ 0.018123] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x64df4000-0x6517ffff] [ 0.018123] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x65180000-0x651c3fff] [ 0.018124] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x651c4000-0x6f871fff] [ 0.018125] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x6f872000-0x6fffefff] [ 0.018126] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x70000000-0x77ffffff] [ 0.018128] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x78600000-0x7c7fffff] [ 0.018128] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0x7c800000-0xfdffffff] [ 0.018129] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0xfe000000-0xfe010fff] [ 0.018130] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0xfe011000-0xfebfffff] [ 0.018130] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0xfec00000-0xfec00fff] [ 0.018131] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0xfec01000-0xfedfffff] [ 0.018131] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0xfee00000-0xfee00fff] [ 0.018132] abreu kernel: PM: hibernation: Registered nosave memory: [mem 0xfee01000-0xffffffff] [ 0.018133] abreu kernel: [mem 0x7c800000-0xfdffffff] available for PCI devices [ 0.018134] abreu kernel: Booting paravirtualized kernel on bare hardware [ 0.018136] abreu kernel: clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645519600211568 ns [ 0.022771] abreu kernel: setup_percpu: NR_CPUS:8192 nr_cpumask_bits:4 nr_cpu_ids:4 nr_node_ids:1 [ 0.023054] abreu kernel: percpu: Embedded 65 pages/cpu s229376 r8192 d28672 u524288 [ 0.023060] abreu kernel: pcpu-alloc: s229376 r8192 d28672 u524288 alloc=1*2097152 [ 0.023062] abreu kernel: pcpu-alloc: [0] 0 1 2 3 [ 0.023088] abreu kernel: Kernel command line: BOOT_IMAGE=/vmlinuz-6.9.0-rc1+ root=UUID=32e29882-d94d-4a92-9ee4-4d03002bfa29 ro quiet pci=noaer mem_sleep_default=deep log_buf_len=8M cryptomgr.notests [ 0.023155] abreu kernel: Unknown kernel command line parameters "BOOT_IMAGE=/vmlinuz-6.9.0-rc1+", will be passed to user space. [ 0.023188] abreu kernel: random: crng init done [ 0.024676] abreu kernel: Dentry cache hash table entries: 2097152 (order: 12, 16777216 bytes, linear) [ 0.025420] abreu kernel: Inode-cache hash table entries: 1048576 (order: 11, 8388608 bytes, linear) [ 0.025484] abreu kernel: Fallback order for Node 0: 0 [ 0.025487] abreu kernel: Built 1 zonelists, mobility grouping on. Total pages: 4026691 [ 0.025488] abreu kernel: Policy zone: Normal [ 0.025493] abreu kernel: mem auto-init: stack:all(zero), heap alloc:on, heap free:off [ 0.025500] abreu kernel: software IO TLB: area num 4. [ 0.043872] abreu kernel: Memory: 1657176K/16363068K available (16384K kernel code, 2386K rwdata, 6036K rodata, 4036K init, 7588K bss, 498764K reserved, 0K cma-reserved) [ 0.044076] abreu kernel: SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1 [ 0.044077] abreu kernel: kmemleak: Kernel memory leak detector disabled [ 0.044093] abreu kernel: Kernel/User page tables isolation: enabled [ 0.044119] abreu kernel: ftrace: allocating 43327 entries in 170 pages [ 0.051281] abreu kernel: ftrace: allocated 170 pages with 4 groups [ 0.051886] abreu kernel: Dynamic Preempt: voluntary [ 0.051925] abreu kernel: rcu: Preemptible hierarchical RCU implementation. [ 0.051926] abreu kernel: rcu: RCU restricting CPUs from NR_CPUS=8192 to nr_cpu_ids=4. [ 0.051927] abreu kernel: Trampoline variant of Tasks RCU enabled. [ 0.051927] abreu kernel: Rude variant of Tasks RCU enabled. [ 0.051928] abreu kernel: Tracing variant of Tasks RCU enabled. [ 0.051928] abreu kernel: rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies. [ 0.051929] abreu kernel: rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4 [ 0.051935] abreu kernel: RCU Tasks: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1. [ 0.051936] abreu kernel: RCU Tasks Rude: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1. [ 0.051937] abreu kernel: RCU Tasks Trace: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1. [ 0.054432] abreu kernel: NR_IRQS: 524544, nr_irqs: 1024, preallocated irqs: 16 [ 0.054639] abreu kernel: rcu: srcu_init: Setting srcu_struct sizes based on contention. [ 0.054800] abreu kernel: Console: colour dummy device 80x25 [ 0.054802] abreu kernel: printk: legacy console [tty0] enabled [ 0.054836] abreu kernel: ACPI: Core revision 20230628 [ 0.054980] abreu kernel: hpet: HPET dysfunctional in PC10. Force disabled. [ 0.054981] abreu kernel: APIC: Switch to symmetric I/O mode setup [ 0.054983] abreu kernel: DMAR: Host address width 39 [ 0.054984] abreu kernel: DMAR: DRHD base: 0x000000fed90000 flags: 0x0 [ 0.054990] abreu kernel: DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 19e2ff0505e [ 0.054992] abreu kernel: DMAR: DRHD base: 0x000000fed91000 flags: 0x1 [ 0.054996] abreu kernel: DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da [ 0.054998] abreu kernel: DMAR: RMRR base: 0x00000064ec2000 end: 0x00000064ee1fff [ 0.054999] abreu kernel: DMAR: RMRR base: 0x0000007a000000 end: 0x0000007c7fffff [ 0.055000] abreu kernel: DMAR: ANDD device: 1 name: \_SB.PCI0.I2C0 [ 0.055001] abreu kernel: DMAR: ANDD device: 2 name: \_SB.PCI0.I2C1 [ 0.055003] abreu kernel: DMAR-IR: IOAPIC id 2 under DRHD base 0xfed91000 IOMMU 1 [ 0.055004] abreu kernel: DMAR-IR: HPET id 0 under DRHD base 0xfed91000 [ 0.055005] abreu kernel: DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. [ 0.056624] abreu kernel: DMAR-IR: Enabled IRQ remapping in x2apic mode [ 0.056625] abreu kernel: x2apic enabled [ 0.056682] abreu kernel: APIC: Switched APIC routing to: cluster x2apic [ 0.060598] abreu kernel: clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x29ccd767b87, max_idle_ns: 440795223720 ns [ 0.060604] abreu kernel: Calibrating delay loop (skipped), value calculated using timer frequency.. 5799.77 BogoMIPS (lpj=11599544) [ 0.060634] abreu kernel: CPU0: Thermal monitoring enabled (TM1) [ 0.060668] abreu kernel: Last level iTLB entries: 4KB 64, 2MB 8, 4MB 8 [ 0.060669] abreu kernel: Last level dTLB entries: 4KB 64, 2MB 0, 4MB 0, 1GB 4 [ 0.060673] abreu kernel: process: using mwait in idle threads [ 0.060675] abreu kernel: Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization [ 0.060677] abreu kernel: Spectre V2 : Mitigation: IBRS [ 0.060677] abreu kernel: Spectre V2 : Spectre v2 / SpectreRSB mitigation: Filling RSB on context switch [ 0.060678] abreu kernel: Spectre V2 : Spectre v2 / SpectreRSB : Filling RSB on VMEXIT [ 0.060679] abreu kernel: RETBleed: Mitigation: IBRS [ 0.060680] abreu kernel: Spectre V2 : mitigation: Enabling conditional Indirect Branch Prediction Barrier [ 0.060681] abreu kernel: Spectre V2 : User space: Mitigation: STIBP via prctl [ 0.060683] abreu kernel: Speculative Store Bypass: Mitigation: Speculative Store Bypass disabled via prctl [ 0.060694] abreu kernel: MDS: Mitigation: Clear CPU buffers [ 0.060695] abreu kernel: MMIO Stale Data: Mitigation: Clear CPU buffers [ 0.060701] abreu kernel: SRBDS: Mitigation: Microcode [ 0.060706] abreu kernel: GDS: Mitigation: Microcode [ 0.060712] abreu kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' [ 0.060714] abreu kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' [ 0.060715] abreu kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' [ 0.060716] abreu kernel: x86/fpu: Supporting XSAVE feature 0x008: 'MPX bounds registers' [ 0.060717] abreu kernel: x86/fpu: Supporting XSAVE feature 0x010: 'MPX CSR' [ 0.060718] abreu kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256 [ 0.060720] abreu kernel: x86/fpu: xstate_offset[3]: 832, xstate_sizes[3]: 64 [ 0.060721] abreu kernel: x86/fpu: xstate_offset[4]: 896, xstate_sizes[4]: 64 [ 0.060723] abreu kernel: x86/fpu: Enabled xstate features 0x1f, context size is 960 bytes, using 'compacted' format. [ 0.064601] abreu kernel: Freeing SMP alternatives memory: 36K [ 0.064601] abreu kernel: pid_max: default: 32768 minimum: 301 [ 0.064601] abreu kernel: LSM: initializing lsm=capability,landlock,apparmor,tomoyo,bpf,ima,evm [ 0.064601] abreu kernel: landlock: Up and running. [ 0.064601] abreu kernel: AppArmor: AppArmor initialized [ 0.064601] abreu kernel: TOMOYO Linux initialized [ 0.064601] abreu kernel: LSM support for eBPF active [ 0.064601] abreu kernel: Mount-cache hash table entries: 32768 (order: 6, 262144 bytes, linear) [ 0.064601] abreu kernel: Mountpoint-cache hash table entries: 32768 (order: 6, 262144 bytes, linear) [ 0.064601] abreu kernel: smpboot: CPU0: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz (family: 0x6, model: 0x8e, stepping: 0x9) [ 0.064601] abreu kernel: Performance Events: PEBS fmt3+, Skylake events, 32-deep LBR, full-width counters, Intel PMU driver. [ 0.064601] abreu kernel: ... version: 4 [ 0.064601] abreu kernel: ... bit width: 48 [ 0.064601] abreu kernel: ... generic registers: 4 [ 0.064601] abreu kernel: ... value mask: 0000ffffffffffff [ 0.064601] abreu kernel: ... max period: 00007fffffffffff [ 0.064601] abreu kernel: ... fixed-purpose events: 3 [ 0.064601] abreu kernel: ... event mask: 000000070000000f [ 0.064601] abreu kernel: signal: max sigframe size: 2032 [ 0.064601] abreu kernel: Estimated ratio of average max frequency by base frequency (times 1024): 1235 [ 0.064601] abreu kernel: rcu: Hierarchical SRCU implementation. [ 0.064601] abreu kernel: rcu: Max phase no-delay instances is 1000. [ 0.064601] abreu kernel: NMI watchdog: Enabled. Permanently consumes one hw-PMU counter. [ 0.064601] abreu kernel: smp: Bringing up secondary CPUs ... [ 0.064601] abreu kernel: smpboot: x86: Booting SMP configuration: [ 0.064601] abreu kernel: .... node #0, CPUs: #1 #2 #3 [ 0.064601] abreu kernel: MDS CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html for more details. [ 0.064601] abreu kernel: MMIO Stale Data CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/processor_mmio_stale_data.html for more details. [ 0.064601] abreu kernel: smp: Brought up 1 node, 4 CPUs [ 0.064601] abreu kernel: smpboot: Total of 4 processors activated (23199.08 BogoMIPS) [ 0.084753] abreu kernel: node 0 deferred pages initialised in 20ms [ 0.085516] abreu kernel: devtmpfs: initialized [ 0.085516] abreu kernel: x86/mm: Memory block size: 128MB [ 0.085993] abreu kernel: ACPI: PM: Registering ACPI NVS region [mem 0x556ab000-0x556abfff] (4096 bytes) [ 0.085993] abreu kernel: ACPI: PM: Registering ACPI NVS region [mem 0x651c4000-0x6f871fff] (174776320 bytes) [ 0.090340] abreu kernel: clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns [ 0.090347] abreu kernel: futex hash table entries: 1024 (order: 4, 65536 bytes, linear) [ 0.090400] abreu kernel: pinctrl core: initialized pinctrl subsystem [ 0.090916] abreu kernel: NET: Registered PF_NETLINK/PF_ROUTE protocol family [ 0.091148] abreu kernel: DMA: preallocated 2048 KiB GFP_KERNEL pool for atomic allocations [ 0.091264] abreu kernel: DMA: preallocated 2048 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations [ 0.091377] abreu kernel: DMA: preallocated 2048 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations [ 0.091394] abreu kernel: audit: initializing netlink subsys (disabled) [ 0.091410] abreu kernel: audit: type=2000 audit(1711443213.028:1): state=initialized audit_enabled=0 res=1 [ 0.091410] abreu kernel: thermal_sys: Registered thermal governor 'fair_share' [ 0.091410] abreu kernel: thermal_sys: Registered thermal governor 'bang_bang' [ 0.091410] abreu kernel: thermal_sys: Registered thermal governor 'step_wise' [ 0.091410] abreu kernel: thermal_sys: Registered thermal governor 'user_space' [ 0.091410] abreu kernel: thermal_sys: Registered thermal governor 'power_allocator' [ 0.091410] abreu kernel: cpuidle: using governor ladder [ 0.091410] abreu kernel: cpuidle: using governor menu [ 0.091410] abreu kernel: Simple Boot Flag at 0x47 set to 0x80 [ 0.091410] abreu kernel: ACPI FADT declares the system doesn't support PCIe ASPM, so disable it [ 0.091410] abreu kernel: acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5 [ 0.091410] abreu kernel: PCI: ECAM [mem 0xe0000000-0xefffffff] (base 0xe0000000) for domain 0000 [bus 00-ff] [ 0.091410] abreu kernel: PCI: not using ECAM ([mem 0xe0000000-0xefffffff] not reserved) [ 0.091410] abreu kernel: PCI: Using configuration type 1 for base access [ 0.091410] abreu kernel: kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible. [ 0.091410] abreu kernel: HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages [ 0.091410] abreu kernel: HugeTLB: 16380 KiB vmemmap can be freed for a 1.00 GiB page [ 0.091410] abreu kernel: HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages [ 0.091410] abreu kernel: HugeTLB: 28 KiB vmemmap can be freed for a 2.00 MiB page [ 0.091410] abreu kernel: Demotion targets for Node 0: null [ 0.091410] abreu kernel: ACPI: Added _OSI(Module Device) [ 0.091410] abreu kernel: ACPI: Added _OSI(Processor Device) [ 0.091410] abreu kernel: ACPI: Added _OSI(3.0 _SCP Extensions) [ 0.091410] abreu kernel: ACPI: Added _OSI(Processor Aggregator Device) [ 0.132129] abreu kernel: ACPI: 11 ACPI AML tables successfully acquired and loaded [ 0.141879] abreu kernel: ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored [ 0.147104] abreu kernel: ACPI: Dynamic OEM Table Load: [ 0.147104] abreu kernel: ACPI: SSDT 0xFFFF92EA010E9800 0003FF (v02 PmRef Cpu0Cst 00003001 INTL 20160422) [ 0.149410] abreu kernel: ACPI: Dynamic OEM Table Load: [ 0.149415] abreu kernel: ACPI: SSDT 0xFFFF92EA00DA0800 0006F6 (v02 PmRef Cpu0Ist 00003000 INTL 20160422) [ 0.151546] abreu kernel: ACPI: Dynamic OEM Table Load: [ 0.151551] abreu kernel: ACPI: SSDT 0xFFFF92EA00DA5000 00065C (v02 PmRef ApIst 00003000 INTL 20160422) [ 0.153223] abreu kernel: ACPI: Dynamic OEM Table Load: [ 0.153227] abreu kernel: ACPI: SSDT 0xFFFF92EA01129C00 00018A (v02 PmRef ApCst 00003000 INTL 20160422) [ 0.156309] abreu kernel: ACPI: _OSC evaluated successfully for all CPUs [ 0.156501] abreu kernel: ACPI: EC: EC started [ 0.156502] abreu kernel: ACPI: EC: interrupt blocked [ 0.161683] abreu kernel: ACPI: EC: EC_CMD/EC_SC=0x934, EC_DATA=0x930 [ 0.161687] abreu kernel: ACPI: \_SB_.PCI0.LPCB.ECDV: Boot DSDT EC used to handle transactions [ 0.161689] abreu kernel: ACPI: Interpreter enabled [ 0.161726] abreu kernel: ACPI: PM: (supports S0 S3 S4 S5) [ 0.161727] abreu kernel: ACPI: Using IOAPIC for interrupt routing [ 0.161762] abreu kernel: PCI: ECAM [mem 0xe0000000-0xefffffff] (base 0xe0000000) for domain 0000 [bus 00-ff] [ 0.162715] abreu kernel: PCI: ECAM [mem 0xe0000000-0xefffffff] reserved as ACPI motherboard resource [ 0.162725] abreu kernel: PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug [ 0.162726] abreu kernel: PCI: Using E820 reservations for host bridge windows [ 0.163398] abreu kernel: ACPI: Enabled 8 GPEs in block 00 to 7F [ 0.164675] abreu kernel: ACPI: \_SB_.PCI0.RP09.PXSX.WRST: New power resource [ 0.165005] abreu kernel: ACPI: \_SB_.PCI0.RP10.PXSX.WRST: New power resource [ 0.165336] abreu kernel: ACPI: \_SB_.PCI0.RP11.PXSX.WRST: New power resource [ 0.165662] abreu kernel: ACPI: \_SB_.PCI0.RP12.PXSX.WRST: New power resource [ 0.165992] abreu kernel: ACPI: \_SB_.PCI0.RP13.PXSX.WRST: New power resource [ 0.166321] abreu kernel: ACPI: \_SB_.PCI0.RP01.PXSX.WRST: New power resource [ 0.167167] abreu kernel: ACPI: \_SB_.PCI0.RP02.PXSX.WRST: New power resource [ 0.167496] abreu kernel: ACPI: \_SB_.PCI0.RP03.PXSX.WRST: New power resource [ 0.167829] abreu kernel: ACPI: \_SB_.PCI0.RP04.PXSX.WRST: New power resource [ 0.168155] abreu kernel: ACPI: \_SB_.PCI0.RP05.PXSX.WRST: New power resource [ 0.168483] abreu kernel: ACPI: \_SB_.PCI0.RP06.PXSX.WRST: New power resource [ 0.168601] abreu kernel: ACPI: \_SB_.PCI0.RP07.PXSX.WRST: New power resource [ 0.168601] abreu kernel: ACPI: \_SB_.PCI0.RP08.PXSX.WRST: New power resource [ 0.168601] abreu kernel: ACPI: \_SB_.PCI0.RP17.PXSX.WRST: New power resource [ 0.168601] abreu kernel: ACPI: \_SB_.PCI0.RP18.PXSX.WRST: New power resource [ 0.168601] abreu kernel: ACPI: \_SB_.PCI0.RP19.PXSX.WRST: New power resource [ 0.168601] abreu kernel: ACPI: \_SB_.PCI0.RP20.PXSX.WRST: New power resource [ 0.168601] abreu kernel: ACPI: \_SB_.PCI0.RP14.PXSX.WRST: New power resource [ 0.168601] abreu kernel: ACPI: \_SB_.PCI0.RP15.PXSX.WRST: New power resource [ 0.168601] abreu kernel: ACPI: \_SB_.PCI0.RP16.PXSX.WRST: New power resource [ 0.200335] abreu kernel: ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-fe]) [ 0.200342] abreu kernel: acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI HPX-Type3] [ 0.200548] abreu kernel: acpi PNP0A08:00: _OSC: platform does not support [PCIeHotplug SHPCHotplug PME] [ 0.200939] abreu kernel: acpi PNP0A08:00: _OSC: OS now controls [PCIeCapability LTR] [ 0.200941] abreu kernel: acpi PNP0A08:00: FADT indicates ASPM is unsupported, using BIOS configuration [ 0.201915] abreu kernel: PCI host bridge to bus 0000:00 [ 0.201917] abreu kernel: pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window] [ 0.201919] abreu kernel: pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window] [ 0.201922] abreu kernel: pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000dffff window] [ 0.201923] abreu kernel: pci_bus 0000:00: root bus resource [mem 0x7c800000-0xdfffffff window] [ 0.201925] abreu kernel: pci_bus 0000:00: root bus resource [mem 0xfd000000-0xfe7fffff window] [ 0.201926] abreu kernel: pci_bus 0000:00: root bus resource [bus 00-fe] [ 0.201944] abreu kernel: pci 0000:00:00.0: [8086:5904] type 00 class 0x060000 conventional PCI endpoint [ 0.202016] abreu kernel: pci 0000:00:02.0: [8086:5916] type 00 class 0x030000 PCIe Root Complex Integrated Endpoint [ 0.202023] abreu kernel: pci 0000:00:02.0: BAR 0 [mem 0xdb000000-0xdbffffff 64bit] [ 0.202028] abreu kernel: pci 0000:00:02.0: BAR 2 [mem 0x90000000-0x9fffffff 64bit pref] [ 0.202032] abreu kernel: pci 0000:00:02.0: BAR 4 [io 0xf000-0xf03f] [ 0.202046] abreu kernel: pci 0000:00:02.0: Video device with shadowed ROM at [mem 0x000c0000-0x000dffff] [ 0.202207] abreu kernel: pci 0000:00:04.0: [8086:1903] type 00 class 0x118000 conventional PCI endpoint [ 0.202215] abreu kernel: pci 0000:00:04.0: BAR 0 [mem 0xdc320000-0xdc327fff 64bit] [ 0.202499] abreu kernel: pci 0000:00:14.0: [8086:9d2f] type 00 class 0x0c0330 conventional PCI endpoint [ 0.202515] abreu kernel: pci 0000:00:14.0: BAR 0 [mem 0xdc310000-0xdc31ffff 64bit] [ 0.202575] abreu kernel: pci 0000:00:14.0: PME# supported from D3hot D3cold [ 0.203136] abreu kernel: pci 0000:00:14.2: [8086:9d31] type 00 class 0x118000 conventional PCI endpoint [ 0.203151] abreu kernel: pci 0000:00:14.2: BAR 0 [mem 0xdc334000-0xdc334fff 64bit] [ 0.203290] abreu kernel: pci 0000:00:15.0: [8086:9d60] type 00 class 0x118000 conventional PCI endpoint [ 0.203345] abreu kernel: pci 0000:00:15.0: BAR 0 [mem 0xdc333000-0xdc333fff 64bit] [ 0.203724] abreu kernel: pci 0000:00:15.1: [8086:9d61] type 00 class 0x118000 conventional PCI endpoint [ 0.203754] abreu kernel: pci 0000:00:15.1: BAR 0 [mem 0xdc332000-0xdc332fff 64bit] [ 0.204112] abreu kernel: pci 0000:00:16.0: [8086:9d3a] type 00 class 0x078000 conventional PCI endpoint [ 0.204125] abreu kernel: pci 0000:00:16.0: BAR 0 [mem 0xdc331000-0xdc331fff 64bit] [ 0.204170] abreu kernel: pci 0000:00:16.0: PME# supported from D3hot [ 0.204508] abreu kernel: pci 0000:00:1c.0: [8086:9d10] type 01 class 0x060400 PCIe Root Port [ 0.204525] abreu kernel: pci 0000:00:1c.0: PCI bridge to [bus 01-39] [ 0.204530] abreu kernel: pci 0000:00:1c.0: bridge window [mem 0xc4000000-0xda0fffff] [ 0.204537] abreu kernel: pci 0000:00:1c.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 0.204581] abreu kernel: pci 0000:00:1c.0: PME# supported from D0 D3hot D3cold [ 0.205096] abreu kernel: pci 0000:00:1c.4: [8086:9d14] type 01 class 0x060400 PCIe Root Port [ 0.205117] abreu kernel: pci 0000:00:1c.4: PCI bridge to [bus 3a] [ 0.205122] abreu kernel: pci 0000:00:1c.4: bridge window [mem 0xdc000000-0xdc1fffff] [ 0.205180] abreu kernel: pci 0000:00:1c.4: PME# supported from D0 D3hot D3cold [ 0.205695] abreu kernel: pci 0000:00:1d.0: [8086:9d18] type 01 class 0x060400 PCIe Root Port [ 0.205714] abreu kernel: pci 0000:00:1d.0: PCI bridge to [bus 3b] [ 0.205718] abreu kernel: pci 0000:00:1d.0: bridge window [mem 0xdc200000-0xdc2fffff] [ 0.205767] abreu kernel: pci 0000:00:1d.0: PME# supported from D0 D3hot D3cold [ 0.206294] abreu kernel: pci 0000:00:1f.0: [8086:9d58] type 00 class 0x060100 conventional PCI endpoint [ 0.206611] abreu kernel: pci 0000:00:1f.2: [8086:9d21] type 00 class 0x058000 conventional PCI endpoint [ 0.206623] abreu kernel: pci 0000:00:1f.2: BAR 0 [mem 0xdc32c000-0xdc32ffff] [ 0.206863] abreu kernel: pci 0000:00:1f.3: [8086:9d71] type 00 class 0x040380 conventional PCI endpoint [ 0.206881] abreu kernel: pci 0000:00:1f.3: BAR 0 [mem 0xdc328000-0xdc32bfff 64bit] [ 0.206905] abreu kernel: pci 0000:00:1f.3: BAR 4 [mem 0xdc300000-0xdc30ffff 64bit] [ 0.206948] abreu kernel: pci 0000:00:1f.3: PME# supported from D3hot D3cold [ 0.207573] abreu kernel: pci 0000:00:1f.4: [8086:9d23] type 00 class 0x0c0500 conventional PCI endpoint [ 0.207631] abreu kernel: pci 0000:00:1f.4: BAR 0 [mem 0xdc330000-0xdc3300ff 64bit] [ 0.207702] abreu kernel: pci 0000:00:1f.4: BAR 4 [io 0xf040-0xf05f] [ 0.208039] abreu kernel: pci 0000:00:1c.0: PCI bridge to [bus 01-39] [ 0.208375] abreu kernel: pci 0000:3a:00.0: [168c:003e] type 00 class 0x028000 PCIe Endpoint [ 0.208593] abreu kernel: pci 0000:3a:00.0: BAR 0 [mem 0xdc000000-0xdc1fffff 64bit] [ 0.209803] abreu kernel: pci 0000:3a:00.0: PME# supported from D0 D3hot D3cold [ 0.211530] abreu kernel: pci 0000:00:1c.4: PCI bridge to [bus 3a] [ 0.211621] abreu kernel: pci 0000:3b:00.0: [1c5c:1284] type 00 class 0x010802 PCIe Endpoint [ 0.211639] abreu kernel: pci 0000:3b:00.0: BAR 0 [mem 0xdc200000-0xdc203fff 64bit] [ 0.211755] abreu kernel: pci 0000:3b:00.0: PME# supported from D0 D1 D3hot [ 0.212138] abreu kernel: pci 0000:00:1d.0: PCI bridge to [bus 3b] [ 0.215274] abreu kernel: ACPI: PCI: Interrupt link LNKA configured for IRQ 11 [ 0.215274] abreu kernel: ACPI: PCI: Interrupt link LNKB configured for IRQ 10 [ 0.215274] abreu kernel: ACPI: PCI: Interrupt link LNKC configured for IRQ 11 [ 0.215274] abreu kernel: ACPI: PCI: Interrupt link LNKD configured for IRQ 11 [ 0.215274] abreu kernel: ACPI: PCI: Interrupt link LNKE configured for IRQ 11 [ 0.215274] abreu kernel: ACPI: PCI: Interrupt link LNKF configured for IRQ 11 [ 0.215274] abreu kernel: ACPI: PCI: Interrupt link LNKG configured for IRQ 11 [ 0.215274] abreu kernel: ACPI: PCI: Interrupt link LNKH configured for IRQ 11 [ 0.229453] abreu kernel: ACPI: EC: interrupt unblocked [ 0.229454] abreu kernel: ACPI: EC: event unblocked [ 0.229459] abreu kernel: ACPI: EC: EC_CMD/EC_SC=0x934, EC_DATA=0x930 [ 0.229461] abreu kernel: ACPI: EC: GPE=0x14 [ 0.229462] abreu kernel: ACPI: \_SB_.PCI0.LPCB.ECDV: Boot DSDT EC initialization complete [ 0.229464] abreu kernel: ACPI: \_SB_.PCI0.LPCB.ECDV: EC: Used to handle transactions and events [ 0.229551] abreu kernel: iommu: Default domain type: Translated [ 0.229551] abreu kernel: iommu: DMA domain TLB invalidation policy: lazy mode [ 0.229551] abreu kernel: pps_core: LinuxPPS API ver. 1 registered [ 0.229551] abreu kernel: pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it> [ 0.229551] abreu kernel: PTP clock support registered [ 0.229551] abreu kernel: EDAC MC: Ver: 3.0.0 [ 0.229551] abreu kernel: efivars: Registered efivars operations [ 0.229551] abreu kernel: NetLabel: Initializing [ 0.229551] abreu kernel: NetLabel: domain hash size = 128 [ 0.229551] abreu kernel: NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO [ 0.229551] abreu kernel: NetLabel: unlabeled traffic allowed by default [ 0.229551] abreu kernel: PCI: Using ACPI for IRQ routing [ 0.255377] abreu kernel: PCI: pci_cache_line_size set to 64 bytes [ 0.255753] abreu kernel: e820: reserve RAM buffer [mem 0x00058000-0x0005ffff] [ 0.255755] abreu kernel: e820: reserve RAM buffer [mem 0x0009e000-0x0009ffff] [ 0.255756] abreu kernel: e820: reserve RAM buffer [mem 0x513ed018-0x53ffffff] [ 0.255757] abreu kernel: e820: reserve RAM buffer [mem 0x556ab000-0x57ffffff] [ 0.255758] abreu kernel: e820: reserve RAM buffer [mem 0x62260000-0x63ffffff] [ 0.255759] abreu kernel: e820: reserve RAM buffer [mem 0x64df4000-0x67ffffff] [ 0.255760] abreu kernel: e820: reserve RAM buffer [mem 0x78600000-0x7bffffff] [ 0.255761] abreu kernel: e820: reserve RAM buffer [mem 0x481800000-0x483ffffff] [ 0.255798] abreu kernel: pci 0000:00:02.0: vgaarb: setting as boot VGA device [ 0.255798] abreu kernel: pci 0000:00:02.0: vgaarb: bridge control possible [ 0.255798] abreu kernel: pci 0000:00:02.0: vgaarb: VGA device added: decodes=io+mem,owns=io+mem,locks=none [ 0.255798] abreu kernel: vgaarb: loaded [ 0.255798] abreu kernel: clocksource: Switched to clocksource tsc-early [ 0.255798] abreu kernel: VFS: Disk quotas dquot_6.6.0 [ 0.255798] abreu kernel: VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes) [ 0.255798] abreu kernel: AppArmor: AppArmor Filesystem Enabled [ 0.255798] abreu kernel: pnp: PnP ACPI init [ 0.255798] abreu kernel: system 00:00: [io 0x0680-0x069f] has been reserved [ 0.255798] abreu kernel: system 00:00: [io 0xffff] has been reserved [ 0.255798] abreu kernel: system 00:00: [io 0xffff] has been reserved [ 0.255798] abreu kernel: system 00:00: [io 0xffff] has been reserved [ 0.255798] abreu kernel: system 00:00: [io 0x1800-0x18fe] has been reserved [ 0.255798] abreu kernel: system 00:00: [io 0x164e-0x164f] has been reserved [ 0.255798] abreu kernel: system 00:02: [io 0x1854-0x1857] has been reserved [ 0.255798] abreu kernel: system 00:05: [mem 0xfed10000-0xfed17fff] has been reserved [ 0.255798] abreu kernel: system 00:05: [mem 0xfed18000-0xfed18fff] has been reserved [ 0.255798] abreu kernel: system 00:05: [mem 0xfed19000-0xfed19fff] has been reserved [ 0.255798] abreu kernel: system 00:05: [mem 0xe0000000-0xefffffff] has been reserved [ 0.255798] abreu kernel: system 00:05: [mem 0xfed20000-0xfed3ffff] has been reserved [ 0.255798] abreu kernel: system 00:05: [mem 0xfed90000-0xfed93fff] could not be reserved [ 0.255798] abreu kernel: system 00:05: [mem 0xfed45000-0xfed8ffff] has been reserved [ 0.255798] abreu kernel: system 00:05: [mem 0xff000000-0xffffffff] has been reserved [ 0.255798] abreu kernel: system 00:05: [mem 0xfee00000-0xfeefffff] could not be reserved [ 0.255798] abreu kernel: system 00:05: [mem 0xdffe0000-0xdfffffff] has been reserved [ 0.255798] abreu kernel: system 00:06: [mem 0xfd000000-0xfdabffff] has been reserved [ 0.255798] abreu kernel: system 00:06: [mem 0xfdad0000-0xfdadffff] has been reserved [ 0.255798] abreu kernel: system 00:06: [mem 0xfdb00000-0xfdffffff] has been reserved [ 0.255798] abreu kernel: system 00:06: [mem 0xfe000000-0xfe01ffff] could not be reserved [ 0.255798] abreu kernel: system 00:06: [mem 0xfe036000-0xfe03bfff] has been reserved [ 0.255798] abreu kernel: system 00:06: [mem 0xfe03d000-0xfe3fffff] has been reserved [ 0.255798] abreu kernel: system 00:06: [mem 0xfe410000-0xfe7fffff] has been reserved [ 0.255798] abreu kernel: system 00:07: [io 0xff00-0xfffe] has been reserved [ 0.255798] abreu kernel: system 00:08: [mem 0xfe029000-0xfe029fff] has been reserved [ 0.255798] abreu kernel: system 00:08: [mem 0xfe028000-0xfe028fff] has been reserved [ 0.259313] abreu kernel: pnp: PnP ACPI: found 9 devices [ 0.265101] abreu kernel: clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns [ 0.265145] abreu kernel: pci 0000:00:1f.1: [8086:9d20] type 00 class 0x058000 conventional PCI endpoint [ 0.265204] abreu kernel: pci 0000:00:1f.1: BAR 0 [mem 0xfd000000-0xfdffffff 64bit] [ 0.265483] abreu kernel: NET: Registered PF_INET protocol family [ 0.265605] abreu kernel: IP idents hash table entries: 262144 (order: 9, 2097152 bytes, linear) [ 0.267888] abreu kernel: tcp_listen_portaddr_hash hash table entries: 8192 (order: 5, 131072 bytes, linear) [ 0.267912] abreu kernel: Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.267961] abreu kernel: TCP established hash table entries: 131072 (order: 8, 1048576 bytes, linear) [ 0.268131] abreu kernel: TCP bind hash table entries: 65536 (order: 9, 2097152 bytes, linear) [ 0.268327] abreu kernel: TCP: Hash tables configured (established 131072 bind 65536) [ 0.268400] abreu kernel: MPTCP token hash table entries: 16384 (order: 6, 393216 bytes, linear) [ 0.268442] abreu kernel: UDP hash table entries: 8192 (order: 6, 262144 bytes, linear) [ 0.268473] abreu kernel: UDP-Lite hash table entries: 8192 (order: 6, 262144 bytes, linear) [ 0.268522] abreu kernel: NET: Registered PF_UNIX/PF_LOCAL protocol family [ 0.268527] abreu kernel: NET: Registered PF_XDP protocol family [ 0.268544] abreu kernel: pci 0000:00:1c.0: bridge window [io 0x1000-0x0fff] to [bus 01-39] add_size 1000 [ 0.268554] abreu kernel: pci 0000:00:1c.0: bridge window [io 0x2000-0x2fff]: assigned [ 0.268557] abreu kernel: pci 0000:00:1c.0: PCI bridge to [bus 01-39] [ 0.268560] abreu kernel: pci 0000:00:1c.0: bridge window [io 0x2000-0x2fff] [ 0.268563] abreu kernel: pci 0000:00:1c.0: bridge window [mem 0xc4000000-0xda0fffff] [ 0.268566] abreu kernel: pci 0000:00:1c.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 0.268570] abreu kernel: pci 0000:00:1c.4: PCI bridge to [bus 3a] [ 0.268573] abreu kernel: pci 0000:00:1c.4: bridge window [mem 0xdc000000-0xdc1fffff] [ 0.268579] abreu kernel: pci 0000:00:1d.0: PCI bridge to [bus 3b] [ 0.268582] abreu kernel: pci 0000:00:1d.0: bridge window [mem 0xdc200000-0xdc2fffff] [ 0.268587] abreu kernel: pci_bus 0000:00: resource 4 [io 0x0000-0x0cf7 window] [ 0.268589] abreu kernel: pci_bus 0000:00: resource 5 [io 0x0d00-0xffff window] [ 0.268590] abreu kernel: pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000dffff window] [ 0.268592] abreu kernel: pci_bus 0000:00: resource 7 [mem 0x7c800000-0xdfffffff window] [ 0.268593] abreu kernel: pci_bus 0000:00: resource 8 [mem 0xfd000000-0xfe7fffff window] [ 0.268595] abreu kernel: pci_bus 0000:01: resource 0 [io 0x2000-0x2fff] [ 0.268596] abreu kernel: pci_bus 0000:01: resource 1 [mem 0xc4000000-0xda0fffff] [ 0.268597] abreu kernel: pci_bus 0000:01: resource 2 [mem 0xa0000000-0xc1ffffff 64bit pref] [ 0.268599] abreu kernel: pci_bus 0000:3a: resource 1 [mem 0xdc000000-0xdc1fffff] [ 0.268600] abreu kernel: pci_bus 0000:3b: resource 1 [mem 0xdc200000-0xdc2fffff] [ 0.269243] abreu kernel: PCI: CLS 0 bytes, default 64 [ 0.269256] abreu kernel: DMAR: ACPI device "device:79" under DMAR at fed91000 as 00:15.0 [ 0.269260] abreu kernel: DMAR: ACPI device "device:7a" under DMAR at fed91000 as 00:15.1 [ 0.269268] abreu kernel: PCI-DMA: Using software bounce buffering for IO (SWIOTLB) [ 0.269269] abreu kernel: software IO TLB: mapped [mem 0x000000005e260000-0x0000000062260000] (64MB) [ 0.269308] abreu kernel: Unpacking initramfs... [ 0.269334] abreu kernel: sgx: EPC section 0x70200000-0x75f7ffff [ 0.270732] abreu kernel: Initialise system trusted keyrings [ 0.270755] abreu kernel: Key type blacklist registered [ 0.270858] abreu kernel: workingset: timestamp_bits=36 max_order=22 bucket_order=0 [ 0.270895] abreu kernel: zbud: loaded [ 0.271109] abreu kernel: fuse: init (API version 7.40) [ 0.271402] abreu kernel: integrity: Platform Keyring initialized [ 0.271408] abreu kernel: integrity: Machine keyring initialized [ 0.271413] abreu kernel: Key type asymmetric registered [ 0.271416] abreu kernel: Asymmetric key parser 'x509' registered [ 0.298618] abreu kernel: Freeing initrd memory: 19564K [ 0.302068] abreu kernel: alg: self-tests disabled [ 0.302130] abreu kernel: Block layer SCSI generic (bsg) driver version 0.4 loaded (major 247) [ 0.302157] abreu kernel: io scheduler mq-deadline registered [ 0.303215] abreu kernel: shpchp: Standard Hot Plug PCI Controller Driver version: 0.4 [ 0.305345] abreu kernel: thermal LNXTHERM:00: registered as thermal_zone0 [ 0.305348] abreu kernel: ACPI: thermal: Thermal Zone [THM] (25 C) [ 0.305470] abreu kernel: Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled [ 0.305958] abreu kernel: hpet_acpi_add: no address or irqs in _CRS [ 0.318012] abreu kernel: tpm_tis MSFT0101:00: 2.0 TPM (device-id 0xFE, rev-id 4) [ 0.357958] abreu kernel: i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12 [ 0.359493] abreu kernel: i8042: Warning: Keylock active [ 0.361765] abreu kernel: serio: i8042 KBD port at 0x60,0x64 irq 1 [ 0.361770] abreu kernel: serio: i8042 AUX port at 0x60,0x64 irq 12 [ 0.361879] abreu kernel: mousedev: PS/2 mouse device common for all mice [ 0.361894] abreu kernel: rtc_cmos 00:01: RTC can wake from S4 [ 0.362669] abreu kernel: rtc_cmos 00:01: registered as rtc0 [ 0.362833] abreu kernel: rtc_cmos 00:01: setting system clock to 2024-03-26T08:53:34 UTC (1711443214) [ 0.362898] abreu kernel: rtc_cmos 00:01: alarms up to one month, y3k, 242 bytes nvram [ 0.362999] abreu kernel: intel_pstate: Intel P-state driver initializing [ 0.363171] abreu kernel: intel_pstate: HWP enabled [ 0.363215] abreu kernel: ledtrig-cpu: registered to indicate activity on CPUs [ 0.363504] abreu kernel: efifb: probing for efifb [ 0.363516] abreu kernel: efifb: framebuffer at 0x90000000, using 22500k, total 22500k [ 0.363517] abreu kernel: efifb: mode is 3200x1800x32, linelength=12800, pages=1 [ 0.363519] abreu kernel: efifb: scrolling: redraw [ 0.363519] abreu kernel: efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0 [ 0.363528] abreu kernel: input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input0 [ 0.363598] abreu kernel: Console: switching to colour frame buffer device 200x56 [ 0.367389] abreu kernel: fb0: EFI VGA frame buffer device [ 0.367556] abreu kernel: NET: Registered PF_INET6 protocol family [ 0.371341] abreu kernel: Segment Routing with IPv6 [ 0.371355] abreu kernel: In-situ OAM (IOAM) with IPv6 [ 0.371379] abreu kernel: mip6: Mobile IPv6 [ 0.371382] abreu kernel: NET: Registered PF_PACKET protocol family [ 0.371414] abreu kernel: mpls_gso: MPLS GSO support [ 0.371673] abreu kernel: ENERGY_PERF_BIAS: Set to 'normal', was 'performance' [ 0.371749] abreu kernel: microcode: Current revision: 0x000000f4 [ 0.371751] abreu kernel: microcode: Updated early from: 0x000000f0 [ 0.371904] abreu kernel: IPI shorthand broadcast: enabled [ 0.372959] abreu kernel: sched_clock: Marking stable (366039906, 5835193)->(406345056, -34469957) [ 0.373088] abreu kernel: Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level [ 0.373199] abreu kernel: registered taskstats version 1 [ 0.373226] abreu kernel: Loading compiled-in X.509 certificates [ 0.374763] abreu kernel: Key type .fscrypt registered [ 0.374764] abreu kernel: Key type fscrypt-provisioning registered [ 0.379970] abreu kernel: cryptd: max_cpu_qlen set to 1000 [ 0.381006] abreu kernel: AVX2 version of gcm_enc/dec engaged. [ 0.381043] abreu kernel: AES CTR mode by8 optimization enabled [ 0.392855] abreu kernel: Key type encrypted registered [ 0.392861] abreu kernel: AppArmor: AppArmor sha256 policy hashing enabled [ 0.393122] abreu kernel: integrity: Loading X.509 certificate: UEFI:db [ 0.393145] abreu kernel: integrity: Loaded X.509 cert 'Dell Inc. UEFI DB: 5ddb772dc880660055ba0bc131886bb630a639e7' [ 0.393147] abreu kernel: integrity: Loading X.509 certificate: UEFI:db [ 0.393164] abreu kernel: integrity: Loaded X.509 cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4' [ 0.393165] abreu kernel: integrity: Loading X.509 certificate: UEFI:db [ 0.393183] abreu kernel: integrity: Loaded X.509 cert 'Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53' [ 0.393508] abreu kernel: ima: Allocated hash algorithm: sha256 [ 0.432875] abreu kernel: ima: No architecture policies found [ 0.432906] abreu kernel: evm: Initialising EVM extended attributes: [ 0.432908] abreu kernel: evm: security.selinux [ 0.432910] abreu kernel: evm: security.SMACK64 (disabled) [ 0.432911] abreu kernel: evm: security.SMACK64EXEC (disabled) [ 0.432913] abreu kernel: evm: security.SMACK64TRANSMUTE (disabled) [ 0.432914] abreu kernel: evm: security.SMACK64MMAP (disabled) [ 0.432916] abreu kernel: evm: security.apparmor [ 0.432918] abreu kernel: evm: security.ima [ 0.432919] abreu kernel: evm: security.capability [ 0.432920] abreu kernel: evm: HMAC attrs: 0x1 [ 0.434098] abreu kernel: RAS: Correctable Errors collector initialized. [ 0.434150] abreu kernel: clk: Disabling unused clocks [ 0.435750] abreu kernel: Freeing unused decrypted memory: 2036K [ 0.436500] abreu kernel: Freeing unused kernel image (initmem) memory: 4036K [ 0.436613] abreu kernel: Write protecting the kernel read-only data: 22528k [ 0.437047] abreu kernel: Freeing unused kernel image (rodata/data gap) memory: 108K [ 0.503936] abreu kernel: x86/mm: Checked W+X mappings: passed, no W+X pages found. [ 0.503938] abreu kernel: x86/mm: Checking user space page tables [ 0.546634] abreu kernel: x86/mm: Checked W+X mappings: passed, no W+X pages found. [ 0.546639] abreu kernel: Run /init as init process [ 0.546645] abreu kernel: with arguments: [ 0.546648] abreu kernel: /init [ 0.546649] abreu kernel: with environment: [ 0.546650] abreu kernel: HOME=/ [ 0.546651] abreu kernel: TERM=linux [ 0.546652] abreu kernel: BOOT_IMAGE=/vmlinuz-6.9.0-rc1+ [ 0.676978] abreu kernel: hid: raw HID events driver (C) Jiri Kosina [ 0.684183] abreu kernel: intel-lpss 0000:00:15.0: enabling device (0000 -> 0002) [ 0.684440] abreu kernel: idma64 idma64.0: Found Intel integrated DMA 64-bit [ 0.701144] abreu kernel: intel-lpss 0000:00:15.1: enabling device (0000 -> 0002) [ 0.701452] abreu kernel: idma64 idma64.1: Found Intel integrated DMA 64-bit [ 0.710810] abreu kernel: ACPI: bus type drm_connector registered [ 0.719588] abreu kernel: ACPI: bus type USB registered [ 0.719619] abreu kernel: usbcore: registered new interface driver usbfs [ 0.719629] abreu kernel: usbcore: registered new interface driver hub [ 0.719645] abreu kernel: usbcore: registered new device driver usb [ 0.719769] abreu kernel: i801_smbus 0000:00:1f.4: SPD Write Disable is set [ 0.719796] abreu kernel: i801_smbus 0000:00:1f.4: SMBus using PCI interrupt [ 0.872828] abreu kernel: input: DLL075B:01 06CB:76AF Mouse as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input2 [ 0.873677] abreu kernel: input: DLL075B:01 06CB:76AF Touchpad as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input3 [ 0.873828] abreu kernel: hid-generic 0018:06CB:76AF.0001: input,hidraw0: I2C HID v1.00 Mouse [DLL075B:01 06CB:76AF] on i2c-DLL075B:01 [ 0.881537] abreu kernel: xhci_hcd 0000:00:14.0: xHCI Host Controller [ 0.881558] abreu kernel: xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 1 [ 0.882642] abreu kernel: xhci_hcd 0000:00:14.0: hcc params 0x200077c1 hci version 0x100 quirks 0x0000000081109810 [ 0.883264] abreu kernel: xhci_hcd 0000:00:14.0: xHCI Host Controller [ 0.883270] abreu kernel: xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 2 [ 0.883274] abreu kernel: xhci_hcd 0000:00:14.0: Host supports USB 3.0 SuperSpeed [ 0.883323] abreu kernel: usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.09 [ 0.883327] abreu kernel: usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 0.883329] abreu kernel: usb usb1: Product: xHCI Host Controller [ 0.883331] abreu kernel: usb usb1: Manufacturer: Linux 6.9.0-rc1+ xhci-hcd [ 0.883333] abreu kernel: usb usb1: SerialNumber: 0000:00:14.0 [ 0.883545] abreu kernel: hub 1-0:1.0: USB hub found [ 0.883573] abreu kernel: hub 1-0:1.0: 12 ports detected [ 0.886540] abreu kernel: usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.09 [ 0.886546] abreu kernel: usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 0.886548] abreu kernel: usb usb2: Product: xHCI Host Controller [ 0.886550] abreu kernel: usb usb2: Manufacturer: Linux 6.9.0-rc1+ xhci-hcd [ 0.886552] abreu kernel: usb usb2: SerialNumber: 0000:00:14.0 [ 0.886705] abreu kernel: hub 2-0:1.0: USB hub found [ 0.886718] abreu kernel: hub 2-0:1.0: 6 ports detected [ 0.893237] abreu kernel: nvme nvme0: pci function 0000:3b:00.0 [ 0.909878] abreu kernel: nvme nvme0: 4/0/0 default/read/poll queues [ 0.915789] abreu kernel: nvme0n1: p1 p2 p3 p4 [ 1.001261] abreu kernel: device-mapper: core: CONFIG_IMA_DISABLE_HTABLE is disabled. Duplicate IMA measurements will not be recorded in the IMA log. [ 1.001311] abreu kernel: device-mapper: uevent: version 1.0.3 [ 1.001446] abreu kernel: device-mapper: ioctl: 4.48.0-ioctl (2023-03-01) initialised: dm-devel@lists.linux.dev [ 1.146061] abreu kernel: usb 1-3: new full-speed USB device number 2 using xhci_hcd [ 1.274039] abreu kernel: tsc: Refined TSC clocksource calibration: 2904.008 MHz [ 1.274069] abreu kernel: clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x29dc0d988f1, max_idle_ns: 440795328788 ns [ 1.274125] abreu kernel: clocksource: Switched to clocksource tsc [ 1.296635] abreu kernel: usb 1-3: New USB device found, idVendor=0cf3, idProduct=e300, bcdDevice= 0.01 [ 1.296652] abreu kernel: usb 1-3: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 1.426059] abreu kernel: usb 1-4: new full-speed USB device number 3 using xhci_hcd [ 1.577329] abreu kernel: usb 1-4: New USB device found, idVendor=04f3, idProduct=2234, bcdDevice=11.11 [ 1.577346] abreu kernel: usb 1-4: New USB device strings: Mfr=4, Product=14, SerialNumber=0 [ 1.577354] abreu kernel: usb 1-4: Product: Touchscreen [ 1.577360] abreu kernel: usb 1-4: Manufacturer: ELAN [ 1.595162] abreu kernel: input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input5 [ 1.595459] abreu kernel: input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input6 [ 1.595547] abreu kernel: input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input7 [ 1.595988] abreu kernel: hid-generic 0003:04F3:2234.0002: input,hiddev0,hidraw1: USB HID v1.10 Device [ELAN Touchscreen] on usb-0000:00:14.0-4/input0 [ 1.596100] abreu kernel: usbcore: registered new interface driver usbhid [ 1.596106] abreu kernel: usbhid: USB HID core driver [ 1.706060] abreu kernel: usb 1-5: new high-speed USB device number 4 using xhci_hcd [ 1.915439] abreu kernel: usb 1-5: New USB device found, idVendor=0c45, idProduct=670c, bcdDevice=56.26 [ 1.915459] abreu kernel: usb 1-5: New USB device strings: Mfr=2, Product=1, SerialNumber=0 [ 1.915467] abreu kernel: usb 1-5: Product: Integrated_Webcam_HD [ 1.915474] abreu kernel: usb 1-5: Manufacturer: CN09GTFMLOG008C8B7FWA01 [ 9.705755] abreu kernel: PM: Image not found (code -22) [ 9.864530] abreu kernel: EXT4-fs (dm-0): mounted filesystem 32e29882-d94d-4a92-9ee4-4d03002bfa29 ro with ordered data mode. Quota mode: none. [ 9.889355] abreu kernel: Not activating Mandatory Access Control as /sbin/tomoyo-init does not exist. [ 10.005205] abreu systemd[1]: Inserted module 'autofs4' [ 10.042613] abreu systemd[1]: systemd 255.4-1+b1 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified) [ 10.042645] abreu systemd[1]: Detected architecture x86-64. [ 10.044149] abreu systemd[1]: Hostname set to <abreu>. [ 10.257007] abreu systemd[1]: Queued start job for default target graphical.target. [ 10.291157] abreu systemd[1]: Created slice system-getty.slice - Slice /system/getty. [ 10.291538] abreu systemd[1]: Created slice system-modprobe.slice - Slice /system/modprobe. [ 10.291867] abreu systemd[1]: Created slice system-systemd\x2dcryptsetup.slice - Encrypted Volume Units Service Slice. [ 10.292198] abreu systemd[1]: Created slice system-systemd\x2dfsck.slice - Slice /system/systemd-fsck. [ 10.292442] abreu systemd[1]: Created slice user.slice - User and Session Slice. [ 10.292526] abreu systemd[1]: Started systemd-ask-password-console.path - Dispatch Password Requests to Console Directory Watch. [ 10.292583] abreu systemd[1]: Started systemd-ask-password-wall.path - Forward Password Requests to Wall Directory Watch. [ 10.292781] abreu systemd[1]: Set up automount proc-sys-fs-binfmt_misc.automount - Arbitrary Executable File Formats File System Automount Point. [ 10.292808] abreu systemd[1]: Expecting device dev-disk-by\x2ddiskseq-1\x2dpart4.device - /dev/disk/by-diskseq/1-part4... [ 10.292815] abreu systemd[1]: Expecting device dev-disk-by\x2duuid-2d23fd4c\x2d5d03\x2d4e1a\x2d8a42\x2d0e859d1f00d8.device - /dev/disk/by-uuid/2d23fd4c-5d03-4e1a-8a42-0e859d1f00d8... [ 10.292821] abreu systemd[1]: Expecting device dev-disk-by\x2duuid-61be8f50\x2d69c5\x2d49a5\x2dbcad\x2d3f4521e9c7b5.device - /dev/disk/by-uuid/61be8f50-69c5-49a5-bcad-3f4521e9c7b5... [ 10.292827] abreu systemd[1]: Expecting device dev-disk-by\x2duuid-96BD\x2d5653.device - /dev/disk/by-uuid/96BD-5653... [ 10.292848] abreu systemd[1]: Reached target integritysetup.target - Local Integrity Protected Volumes. [ 10.292871] abreu systemd[1]: Reached target nss-user-lookup.target - User and Group Name Lookups. [ 10.292880] abreu systemd[1]: Reached target paths.target - Path Units. [ 10.292897] abreu systemd[1]: Reached target remote-fs.target - Remote File Systems. [ 10.292906] abreu systemd[1]: Reached target slices.target - Slice Units. [ 10.292933] abreu systemd[1]: Reached target veritysetup.target - Local Verity Protected Volumes. [ 10.294332] abreu systemd[1]: Listening on systemd-coredump.socket - Process Core Dump Socket. [ 10.294440] abreu systemd[1]: Listening on systemd-fsckd.socket - fsck to fsckd communication Socket. [ 10.294509] abreu systemd[1]: Listening on systemd-initctl.socket - initctl Compatibility Named Pipe. [ 10.294655] abreu systemd[1]: Listening on systemd-journald-dev-log.socket - Journal Socket (/dev/log). [ 10.294802] abreu systemd[1]: Listening on systemd-journald.socket - Journal Socket. [ 10.294849] abreu systemd[1]: systemd-pcrextend.socket - TPM2 PCR Extension (Varlink) was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 10.295152] abreu systemd[1]: Listening on systemd-udevd-control.socket - udev Control Socket. [ 10.295265] abreu systemd[1]: Listening on systemd-udevd-kernel.socket - udev Kernel Socket. [ 10.296505] abreu systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System... [ 10.297512] abreu systemd[1]: Mounting dev-mqueue.mount - POSIX Message Queue File System... [ 10.298807] abreu systemd[1]: Mounting sys-kernel-debug.mount - Kernel Debug File System... [ 10.303144] abreu systemd[1]: Mounting sys-kernel-tracing.mount - Kernel Trace File System... [ 10.306052] abreu systemd[1]: Starting kmod-static-nodes.service - Create List of Static Device Nodes... [ 10.308296] abreu systemd[1]: Starting modprobe@configfs.service - Load Kernel Module configfs... [ 10.313393] abreu systemd[1]: Starting modprobe@dm_mod.service - Load Kernel Module dm_mod... [ 10.316346] abreu systemd[1]: Starting modprobe@drm.service - Load Kernel Module drm... [ 10.320474] abreu systemd[1]: Starting modprobe@efi_pstore.service - Load Kernel Module efi_pstore... [ 10.326138] abreu systemd[1]: Starting modprobe@fuse.service - Load Kernel Module fuse... [ 10.329855] abreu systemd[1]: Starting modprobe@loop.service - Load Kernel Module loop... [ 10.330027] abreu systemd[1]: systemd-fsck-root.service - File System Check on Root Device was skipped because of an unmet condition check (ConditionPathExists=!/run/initramfs/fsck-root). [ 10.338107] abreu kernel: pstore: Using crash dump compression: deflate [ 10.350364] abreu kernel: pstore: Registered efi_pstore as persistent store backend [ 10.354234] abreu systemd[1]: Starting systemd-journald.service - Journal Service... [ 10.370983] abreu systemd[1]: Starting systemd-modules-load.service - Load Kernel Modules... [ 10.371139] abreu systemd[1]: systemd-pcrmachine.service - TPM2 PCR Machine ID Measurement was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 10.389309] abreu systemd[1]: Starting systemd-remount-fs.service - Remount Root and Kernel File Systems... [ 10.389768] abreu systemd[1]: systemd-tpm2-setup-early.service - TPM2 SRK Setup (Early) was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 10.403429] abreu systemd[1]: Starting systemd-udev-trigger.service - Coldplug All udev Devices... [ 10.433803] abreu systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System. [ 10.439459] abreu systemd[1]: Mounted dev-mqueue.mount - POSIX Message Queue File System. [ 10.440548] abreu systemd[1]: Mounted sys-kernel-debug.mount - Kernel Debug File System. [ 10.441588] abreu systemd[1]: Mounted sys-kernel-tracing.mount - Kernel Trace File System. [ 10.444117] abreu systemd[1]: Finished kmod-static-nodes.service - Create List of Static Device Nodes. [ 10.447933] abreu systemd[1]: modprobe@configfs.service: Deactivated successfully. [ 10.448670] abreu systemd[1]: Finished modprobe@configfs.service - Load Kernel Module configfs. [ 10.451966] abreu systemd[1]: modprobe@dm_mod.service: Deactivated successfully. [ 10.453619] abreu kernel: loop: module loaded [ 10.454559] abreu systemd[1]: Finished modprobe@dm_mod.service - Load Kernel Module dm_mod. [ 10.455612] abreu systemd[1]: modprobe@drm.service: Deactivated successfully. [ 10.456172] abreu systemd[1]: Finished modprobe@drm.service - Load Kernel Module drm. [ 10.457501] abreu systemd[1]: modprobe@efi_pstore.service: Deactivated successfully. [ 10.458087] abreu systemd[1]: Finished modprobe@efi_pstore.service - Load Kernel Module efi_pstore. [ 10.459096] abreu systemd[1]: modprobe@fuse.service: Deactivated successfully. [ 10.459703] abreu systemd[1]: Finished modprobe@fuse.service - Load Kernel Module fuse. [ 10.460719] abreu systemd[1]: modprobe@loop.service: Deactivated successfully. [ 10.461261] abreu systemd[1]: Finished modprobe@loop.service - Load Kernel Module loop. [ 10.465053] abreu systemd[1]: Mounting sys-fs-fuse-connections.mount - FUSE Control File System... [ 10.478577] abreu systemd[1]: Mounting sys-kernel-config.mount - Kernel Configuration File System... [ 10.478689] abreu systemd[1]: systemd-repart.service - Repartition Root Disk was skipped because no trigger condition checks were met. [ 10.483120] abreu kernel: lp: driver loaded but no devices found [ 10.483367] abreu systemd[1]: Starting systemd-tmpfiles-setup-dev-early.service - Create Static Device Nodes in /dev gracefully... [ 10.487408] abreu systemd-journald[395]: Collecting audit messages is disabled. [ 10.491943] abreu kernel: ppdev: user-space parallel port driver [ 10.497331] abreu systemd[1]: Mounted sys-kernel-config.mount - Kernel Configuration File System. [ 10.498202] abreu systemd[1]: Mounted sys-fs-fuse-connections.mount - FUSE Control File System. [ 10.511830] abreu systemd[1]: Finished systemd-modules-load.service - Load Kernel Modules. [ 10.514156] abreu systemd[1]: Starting systemd-sysctl.service - Apply Kernel Variables... [ 10.514342] abreu kernel: EXT4-fs (dm-0): re-mounted 32e29882-d94d-4a92-9ee4-4d03002bfa29 r/w. Quota mode: none. [ 10.516028] abreu systemd[1]: Finished systemd-remount-fs.service - Remount Root and Kernel File Systems. [ 10.517204] abreu systemd[1]: systemd-hwdb-update.service - Rebuild Hardware Database was skipped because of an unmet condition check (ConditionNeedsUpdate=/etc). [ 10.517290] abreu systemd[1]: systemd-pstore.service - Platform Persistent Storage Archival was skipped because of an unmet condition check (ConditionDirectoryNotEmpty=/sys/fs/pstore). [ 10.522066] abreu systemd[1]: Starting systemd-random-seed.service - Load/Save OS Random Seed... [ 10.522109] abreu systemd[1]: systemd-tpm2-setup.service - TPM2 SRK Setup was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 10.532704] abreu systemd[1]: Finished systemd-tmpfiles-setup-dev-early.service - Create Static Device Nodes in /dev gracefully. [ 10.532918] abreu systemd[1]: systemd-sysusers.service - Create System Users was skipped because no trigger condition checks were met. [ 10.536494] abreu systemd[1]: Starting systemd-tmpfiles-setup-dev.service - Create Static Device Nodes in /dev... [ 10.540545] abreu systemd[1]: Finished systemd-sysctl.service - Apply Kernel Variables. [ 10.541355] abreu systemd[1]: Started systemd-journald.service - Journal Service. [ 10.560130] abreu systemd-journald[395]: Received client request to flush runtime journal. [ 10.572552] abreu systemd-journald[395]: /var/log/journal/16ae67b9dca94ecebbc8ec78ab24e074/system.journal: Journal file uses a different sequence number ID, rotating. [ 10.572562] abreu systemd-journald[395]: Rotating system journal. [ 10.728736] abreu kernel: input: Lid Switch as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00/input/input9 [ 10.744531] abreu kernel: ACPI: AC: AC Adapter [AC] (off-line) [ 10.795461] abreu kernel: mei_me 0000:00:16.0: enabling device (0000 -> 0002) [ 10.799471] abreu kernel: wmi_bus wmi_bus-PNP0C14:01: [Firmware Bug]: WQBC data block query control method not found [ 10.804280] abreu kernel: Consider using thermal netlink events interface [ 10.807648] abreu kernel: input: Intel HID events as /devices/platform/INT33D5:00/input/input10 [ 10.813953] abreu kernel: ACPI: button: Lid Switch [LID0] [ 10.815739] abreu kernel: input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input11 [ 10.817653] abreu kernel: input: DLL075B:01 06CB:76AF Mouse as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input12 [ 10.818048] abreu kernel: intel-hid INT33D5:00: platform supports 5 button array [ 10.819042] abreu kernel: ACPI: button: Power Button [PBTN] [ 10.819096] abreu kernel: input: Sleep Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input16 [ 10.819831] abreu kernel: input: Intel Virtual Buttons as /devices/pci0000:00/0000:00:1f.0/PNP0C09:00/INT33D6:00/input/input17 [ 10.820078] abreu kernel: input: DLL075B:01 06CB:76AF Touchpad as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input13 [ 10.820346] abreu kernel: ACPI: button: Sleep Button [SBTN] [ 10.820410] abreu kernel: input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input18 [ 10.820697] abreu kernel: input: Intel HID 5 button array as /devices/platform/INT33D5:00/input/input15 [ 10.827989] abreu kernel: ACPI: button: Power Button [PWRF] [ 10.828125] abreu kernel: hid-multitouch 0018:06CB:76AF.0001: input,hidraw0: I2C HID v1.00 Mouse [DLL075B:01 06CB:76AF] on i2c-DLL075B:01 [ 10.844135] abreu kernel: proc_thermal 0000:00:04.0: enabling device (0000 -> 0002) [ 10.888004] abreu kernel: intel_pmc_core INT33A1:00: initialized [ 10.898775] abreu kernel: intel_rapl_common: Found RAPL domain package [ 10.898792] abreu kernel: intel_rapl_common: Found RAPL domain dram [ 10.943566] abreu kernel: Adding 8387904k swap on /dev/nvme0n1p4. Priority:-2 extents:1 across:8387904k SS [ 11.020722] abreu kernel: mc: Linux media interface: v0.10 [ 11.022860] abreu kernel: input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input20 [ 11.022959] abreu kernel: input: ELAN Touchscreen UNKNOWN as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input21 [ 11.023011] abreu kernel: input: ELAN Touchscreen UNKNOWN as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input22 [ 11.023123] abreu kernel: hid-multitouch 0003:04F3:2234.0002: input,hiddev0,hidraw1: USB HID v1.10 Device [ELAN Touchscreen] on usb-0000:00:14.0-4/input0 [ 11.107500] abreu kernel: ACPI: battery: Slot [BAT0] (battery present) [ 11.139798] abreu kernel: input: PC Speaker as /devices/platform/pcspkr/input/input24 [ 11.150222] abreu kernel: Bluetooth: Core ver 2.22 [ 11.150259] abreu kernel: NET: Registered PF_BLUETOOTH protocol family [ 11.150262] abreu kernel: Bluetooth: HCI device and connection manager initialized [ 11.150269] abreu kernel: Bluetooth: HCI socket layer initialized [ 11.150275] abreu kernel: Bluetooth: L2CAP socket layer initialized [ 11.150283] abreu kernel: Bluetooth: SCO socket layer initialized [ 11.164831] abreu kernel: iTCO_vendor_support: vendor-support=0 [ 11.180509] abreu kernel: EXT4-fs (nvme0n1p2): mounted filesystem 2d23fd4c-5d03-4e1a-8a42-0e859d1f00d8 r/w with ordered data mode. Quota mode: none. [ 11.258694] abreu kernel: cfg80211: Loading compiled-in X.509 certificates for regulatory database [ 11.261901] abreu kernel: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7' [ 11.262877] abreu kernel: Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600' [ 11.266011] abreu kernel: iTCO_wdt iTCO_wdt: Found a Intel PCH TCO device (Version=4, TCOBASE=0x0400) [ 11.266575] abreu kernel: iTCO_wdt iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0) [ 11.270573] abreu kernel: cfg80211: loaded regulatory.db is malformed or signature is missing/invalid [ 11.306714] abreu kernel: RAPL PMU: API unit is 2^-32 Joules, 5 fixed counters, 655360 ms ovfl timer [ 11.306719] abreu kernel: RAPL PMU: hw unit of domain pp0-core 2^-14 Joules [ 11.306721] abreu kernel: RAPL PMU: hw unit of domain package 2^-14 Joules [ 11.306722] abreu kernel: RAPL PMU: hw unit of domain dram 2^-14 Joules [ 11.306723] abreu kernel: RAPL PMU: hw unit of domain pp1-gpu 2^-14 Joules [ 11.306725] abreu kernel: RAPL PMU: hw unit of domain psys 2^-14 Joules [ 11.317716] abreu kernel: intel_rapl_common: Found RAPL domain package [ 11.317721] abreu kernel: intel_rapl_common: Found RAPL domain core [ 11.317722] abreu kernel: intel_rapl_common: Found RAPL domain uncore [ 11.317724] abreu kernel: intel_rapl_common: Found RAPL domain dram [ 11.317725] abreu kernel: intel_rapl_common: Found RAPL domain psys [ 11.323296] abreu kernel: videodev: Linux video capture interface: v2.00 [ 11.462910] abreu kernel: input: Dell WMI hotkeys as /devices/platform/PNP0C14:01/wmi_bus/wmi_bus-PNP0C14:01/9DBB5994-A997-11DA-B012-B622A1EF5492/input/input25 [ 11.471942] abreu kernel: usb 1-5: Found UVC 1.00 device Integrated_Webcam_HD (0c45:670c) [ 11.499412] abreu kernel: usbcore: registered new interface driver btusb [ 11.501274] abreu kernel: Bluetooth: hci0: using rampatch file: qca/rampatch_usb_00000302.bin [ 11.501278] abreu kernel: Bluetooth: hci0: QCA: patch rome 0x302 build 0x3e8, firmware rome 0x302 build 0x111 [ 11.566499] abreu kernel: usbcore: registered new interface driver uvcvideo [ 11.873918] abreu kernel: Bluetooth: hci0: using NVM file: qca/nvm_usb_00000302.bin [ 11.903596] abreu kernel: Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. [ 12.080752] abreu kernel: stackdepot: allocating hash table of 1048576 entries via kvcalloc [ 12.101972] abreu kernel: Console: switching to colour dummy device 80x25 [ 12.102075] abreu kernel: i915 0000:00:02.0: vgaarb: deactivate vga console [ 12.114623] abreu kernel: i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem [ 12.115946] abreu kernel: i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/kbl_dmc_ver1_04.bin (v1.4) [ 12.175642] abreu kernel: snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 12.175759] abreu kernel: snd_hda_intel 0000:00:1f.3: enabling device (0000 -> 0002) [ 12.239057] abreu kernel: ath10k_pci 0000:3a:00.0: enabling device (0000 -> 0002) [ 12.249199] abreu kernel: ath10k_pci 0000:3a:00.0: pci irq msi oper_irq_mode 2 irq_mode 0 reset_mode 0 [ 12.252733] abreu kernel: audit: type=1400 audit(1711443226.383:2): apparmor="STATUS" operation="profile_load" profile="unconfined" name="lsb_release" pid=549 comm="apparmor_parser" [ 12.252971] abreu kernel: audit: type=1400 audit(1711443226.383:3): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe" pid=550 comm="apparmor_parser" [ 12.252974] abreu kernel: audit: type=1400 audit(1711443226.383:4): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe//kmod" pid=550 comm="apparmor_parser" [ 12.260534] abreu kernel: audit: type=1400 audit(1711443226.391:5): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/bin/man" pid=555 comm="apparmor_parser" [ 12.260540] abreu kernel: audit: type=1400 audit(1711443226.391:6): apparmor="STATUS" operation="profile_load" profile="unconfined" name="man_filter" pid=555 comm="apparmor_parser" [ 12.260543] abreu kernel: audit: type=1400 audit(1711443226.391:7): apparmor="STATUS" operation="profile_load" profile="unconfined" name="man_groff" pid=555 comm="apparmor_parser" [ 12.262718] abreu kernel: audit: type=1400 audit(1711443226.391:8): apparmor="STATUS" operation="profile_load" profile="unconfined" name="tcpdump" pid=556 comm="apparmor_parser" [ 12.263528] abreu kernel: audit: type=1400 audit(1711443226.395:9): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/NetworkManager/nm-dhcp-client.action" pid=551 comm="apparmor_parser" [ 12.263532] abreu kernel: audit: type=1400 audit(1711443226.395:10): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/NetworkManager/nm-dhcp-helper" pid=551 comm="apparmor_parser" [ 12.263534] abreu kernel: audit: type=1400 audit(1711443226.395:11): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/connman/scripts/dhclient-script" pid=551 comm="apparmor_parser" [ 12.282749] abreu kernel: snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 12.366257] abreu kernel: snd_soc_skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 12.385457] abreu kernel: snd_soc_avs 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 12.394124] abreu kernel: snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 12.394454] abreu kernel: snd_soc_skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 12.394532] abreu kernel: snd_soc_avs 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 12.460182] abreu kernel: sof-audio-pci-intel-skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 12.555363] abreu kernel: ath10k_pci 0000:3a:00.0: qca6174 hw3.2 target 0x05030000 chip_id 0x00340aff sub 1a56:1535 [ 12.555369] abreu kernel: ath10k_pci 0000:3a:00.0: kconfig debug 0 debugfs 0 tracing 0 dfs 0 testmode 0 [ 12.556058] abreu kernel: ath10k_pci 0000:3a:00.0: firmware ver WLAN.RM.4.4.1-00288- api 6 features wowlan,ignore-otp,mfp crc32 bf907c7c [ 12.646775] abreu kernel: ath10k_pci 0000:3a:00.0: board_file api 2 bmi_id N/A crc32 d2863f91 [ 12.753957] abreu kernel: i915 0000:00:02.0: [drm] [ENCODER:102:DDI B/PHY B] is disabled/in DSI mode with an ungated DDI clock, gate it [ 12.760817] abreu kernel: i915 0000:00:02.0: [drm] [ENCODER:113:DDI C/PHY C] is disabled/in DSI mode with an ungated DDI clock, gate it [ 12.782907] abreu kernel: mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915]) [ 12.790937] abreu kernel: ath10k_pci 0000:3a:00.0: htt-ver 3.87 wmi-op 4 htt-op 3 cal otp max-sta 32 raw 0 hwcrypto 1 [ 12.816704] abreu kernel: [drm] Initialized i915 1.6.0 20230929 for 0000:00:02.0 on minor 0 [ 12.853758] abreu kernel: ACPI: video: Video Device [GFX0] (multi-head: yes rom: no post: no) [ 12.858762] abreu kernel: input: Video Bus as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input26 [ 12.859011] abreu kernel: snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 12.859220] abreu kernel: snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915]) [ 12.884768] abreu kernel: ath: EEPROM regdomain: 0x6c [ 12.884772] abreu kernel: ath: EEPROM indicates we should expect a direct regpair map [ 12.884773] abreu kernel: ath: Country alpha2 being used: 00 [ 12.884774] abreu kernel: ath: Regpair used: 0x6c [ 12.887463] abreu kernel: fbcon: i915drmfb (fb0) is primary device [ 12.894574] abreu kernel: ath10k_pci 0000:3a:00.0 wlp58s0: renamed from wlan0 [ 12.899587] abreu kernel: Console: switching to colour frame buffer device 200x56 [ 12.916502] abreu kernel: i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device [ 13.059132] abreu kernel: snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC3246: line_outs=1 (0x14/0x0/0x0/0x0/0x0) type:speaker [ 13.059140] abreu kernel: snd_hda_codec_realtek hdaudioC0D0: speaker_outs=0 (0x0/0x0/0x0/0x0/0x0) [ 13.059143] abreu kernel: snd_hda_codec_realtek hdaudioC0D0: hp_outs=1 (0x21/0x0/0x0/0x0/0x0) [ 13.059145] abreu kernel: snd_hda_codec_realtek hdaudioC0D0: mono: mono_out=0x0 [ 13.059146] abreu kernel: snd_hda_codec_realtek hdaudioC0D0: inputs: [ 13.059147] abreu kernel: snd_hda_codec_realtek hdaudioC0D0: Headset Mic=0x19 [ 13.059149] abreu kernel: snd_hda_codec_realtek hdaudioC0D0: Headphone Mic=0x1a [ 13.059150] abreu kernel: snd_hda_codec_realtek hdaudioC0D0: Internal Mic=0x12 [ 13.150504] abreu kernel: input: HDA Digital PCBeep as /devices/pci0000:00/0000:00:1f.3/sound/card0/input27 [ 13.150574] abreu kernel: input: HDA Intel PCH Headphone Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input28 [ 13.150640] abreu kernel: input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input29 [ 13.150705] abreu kernel: input: HDA Intel PCH HDMI/DP,pcm=7 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input30 [ 13.150765] abreu kernel: input: HDA Intel PCH HDMI/DP,pcm=8 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input31 [ 13.289207] abreu kernel: Initializing XFRM netlink socket [ 13.344135] abreu kernel: PPP generic driver version 2.4.2 [ 13.451064] abreu kernel: NET: Registered PF_PPPOX protocol family [ 13.461392] abreu kernel: IPsec XFRM device driver [ 13.870314] abreu kernel: l2tp_core: L2TP core driver, V2.0 [ 13.872730] abreu kernel: l2tp_netlink: L2TP netlink interface [ 13.880593] abreu kernel: l2tp_ppp: PPPoL2TP kernel driver, V2.0 [ 16.821258] abreu kernel: rfkill: input handler disabled [ 21.528629] abreu systemd-journald[395]: /var/log/journal/16ae67b9dca94ecebbc8ec78ab24e074/user-5272.journal: Journal file uses a different sequence number ID, rotating. [ 21.946541] abreu kernel: rfkill: input handler enabled [ 24.024296] abreu kernel: wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 24.024302] abreu kernel: wlp58s0: no HE support, limiting to HT/VHT [ 24.024304] abreu kernel: wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 24.024317] abreu kernel: wlp58s0: determined AP 04:bd:88:b7:31:70 to be VHT [ 24.024321] abreu kernel: wlp58s0: connecting with VHT mode, max bandwidth 80 MHz [ 24.053398] abreu kernel: wlp58s0: authenticate with 04:bd:88:b7:31:70 (local address=9c:b6:d0:d1:6a:b1) [ 24.053404] abreu kernel: wlp58s0: send auth to 04:bd:88:b7:31:70 (try 1/3) [ 24.054150] abreu kernel: wlp58s0: authenticated [ 24.054270] abreu kernel: wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 24.054272] abreu kernel: wlp58s0: no HE support, limiting to HT/VHT [ 24.054274] abreu kernel: wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 24.057871] abreu kernel: wlp58s0: associate with 04:bd:88:b7:31:70 (try 1/3) [ 24.058925] abreu kernel: wlp58s0: RX AssocResp from 04:bd:88:b7:31:70 (capab=0x11 status=0 aid=2) [ 24.061477] abreu kernel: wlp58s0: associated [ 24.941616] abreu kernel: rfkill: input handler disabled [ 181.452701] abreu kernel: kvm_intel: L1TF CPU bug present and SMT on, data leak possible. See CVE-2018-3646 and https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/l1tf.html for details. [ 1178.894929] abreu kernel: kauditd_printk_skb: 22 callbacks suppressed [ 1178.894932] abreu kernel: audit: type=1400 audit(1711444392.698:34): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/bin/man" pid=4940 comm="apparmor_parser" [ 1178.895188] abreu kernel: audit: type=1400 audit(1711444392.698:35): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="man_filter" pid=4940 comm="apparmor_parser" [ 1178.895602] abreu kernel: audit: type=1400 audit(1711444392.698:36): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="man_groff" pid=4940 comm="apparmor_parser" [ 2839.663227] abreu kernel: wlp58s0: deauthenticating from 04:bd:88:b7:31:70 by local choice (Reason: 3=DEAUTH_LEAVING) [ 2844.436951] abreu kernel: PM: suspend entry (deep) [ 2844.443426] abreu kernel: Filesystems sync: 0.006 seconds [ 2844.445982] abreu kernel: Freezing user space processes [ 2844.448668] abreu kernel: Freezing user space processes completed (elapsed 0.002 seconds) [ 2844.448672] abreu kernel: OOM killer disabled. [ 2844.448673] abreu kernel: Freezing remaining freezable tasks [ 2844.449938] abreu kernel: Freezing remaining freezable tasks completed (elapsed 0.001 seconds) [ 2844.449981] abreu kernel: printk: Suspending console(s) (use no_console_suspend to debug) [ 2845.053579] abreu kernel: ACPI: EC: interrupt blocked [ 2845.087163] abreu kernel: ACPI: PM: Preparing to enter system sleep state S3 [ 2845.103578] abreu kernel: ACPI: EC: event blocked [ 2845.103584] abreu kernel: ACPI: EC: EC stopped [ 2845.103586] abreu kernel: ACPI: PM: Saving platform NVS memory [ 2845.106828] abreu kernel: Disabling non-boot CPUs ... [ 2845.109032] abreu kernel: smpboot: CPU 1 is now offline [ 2845.112617] abreu kernel: smpboot: CPU 2 is now offline [ 2845.116641] abreu kernel: smpboot: CPU 3 is now offline [ 2845.125179] abreu kernel: ACPI: PM: Low-level resume complete [ 2845.125223] abreu kernel: ACPI: EC: EC started [ 2845.125223] abreu kernel: ACPI: PM: Restoring platform NVS memory [ 2845.127146] abreu kernel: Enabling non-boot CPUs ... [ 2845.127179] abreu kernel: smpboot: Booting Node 0 Processor 1 APIC 0x2 [ 2845.127923] abreu kernel: CPU1 is up [ 2845.127941] abreu kernel: smpboot: Booting Node 0 Processor 2 APIC 0x1 [ 2845.128720] abreu kernel: CPU2 is up [ 2845.128738] abreu kernel: smpboot: Booting Node 0 Processor 3 APIC 0x3 [ 2845.129450] abreu kernel: CPU3 is up [ 2845.132422] abreu kernel: ACPI: PM: Waking up from system sleep state S3 [ 2845.172930] abreu kernel: ACPI: EC: interrupt unblocked [ 2845.225619] abreu kernel: ACPI: EC: event unblocked [ 2845.238053] abreu kernel: nvme nvme0: 4/0/0 default/read/poll queues [ 2845.246062] abreu kernel: i915 0000:00:02.0: [drm] [ENCODER:94:DDI A/PHY A] is disabled/in DSI mode with an ungated DDI clock, gate it [ 2845.259445] abreu kernel: i915 0000:00:02.0: [drm] [ENCODER:102:DDI B/PHY B] is disabled/in DSI mode with an ungated DDI clock, gate it [ 2845.275190] abreu kernel: i915 0000:00:02.0: [drm] [ENCODER:113:DDI C/PHY C] is disabled/in DSI mode with an ungated DDI clock, gate it [ 2845.475427] abreu kernel: atkbd serio0: Failed to deactivate keyboard on isa0060/serio0 [ 2845.491581] abreu kernel: usb 1-5: reset high-speed USB device number 4 using xhci_hcd [ 2845.767660] abreu kernel: usb 1-3: reset full-speed USB device number 2 using xhci_hcd [ 2846.043557] abreu kernel: usb 1-4: reset full-speed USB device number 3 using xhci_hcd [ 2846.199094] abreu kernel: OOM killer enabled. [ 2846.199097] abreu kernel: Restarting tasks ... done. [ 2846.204185] abreu kernel: random: crng reseeded on system resumption [ 2846.271190] abreu kernel: PM: suspend exit [ 2846.334154] abreu kernel: Process accounting resumed [ 2846.335711] abreu kernel: warning: `atop' uses wireless extensions which will stop working for Wi-Fi 7 hardware; use nl80211 [ 2846.401088] abreu kernel: Bluetooth: hci0: using rampatch file: qca/rampatch_usb_00000302.bin [ 2846.401094] abreu kernel: Bluetooth: hci0: QCA: patch rome 0x302 build 0x3e8, firmware rome 0x302 build 0x111 [ 2846.740845] abreu kernel: mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915]) [ 2846.761323] abreu kernel: Bluetooth: hci0: using NVM file: qca/nvm_usb_00000302.bin [ 2846.789093] abreu kernel: Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. [ 2851.761490] abreu kernel: wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 2851.761495] abreu kernel: wlp58s0: no HE support, limiting to HT/VHT [ 2851.761498] abreu kernel: wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 2851.761509] abreu kernel: wlp58s0: VHT information is missing, disabling VHT [ 2851.761510] abreu kernel: wlp58s0: determined AP 6c:f3:7f:10:ae:18 to be HT [ 2851.761513] abreu kernel: wlp58s0: connecting with HT mode, max bandwidth 40 MHz [ 2851.794534] abreu kernel: wlp58s0: authenticate with 6c:f3:7f:10:ae:18 (local address=9c:b6:d0:d1:6a:b1) [ 2851.794540] abreu kernel: wlp58s0: send auth to 6c:f3:7f:10:ae:18 (try 1/3) [ 2851.801110] abreu kernel: wlp58s0: authenticated [ 2851.801273] abreu kernel: wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 2851.801276] abreu kernel: wlp58s0: no HE support, limiting to HT/VHT [ 2851.801278] abreu kernel: wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 2851.803308] abreu kernel: wlp58s0: associate with 6c:f3:7f:10:ae:18 (try 1/3) [ 2851.812555] abreu kernel: wlp58s0: RX AssocResp from 6c:f3:7f:10:ae:18 (capab=0x411 status=0 aid=4) [ 2851.815178] abreu kernel: wlp58s0: associated [ 2852.951254] abreu kernel: ucsi_acpi USBC000:00: ucsi_handle_connector_change: ACK failed (-110) [ 2853.413203] abreu kernel: pci 0000:01:00.0: [8086:1576] type 01 class 0x060400 PCIe Switch Upstream Port [ 2853.413242] abreu kernel: pci 0000:01:00.0: PCI bridge to [bus 02-39] [ 2853.413259] abreu kernel: pci 0000:01:00.0: bridge window [mem 0xc4000000-0xda0fffff] [ 2853.413275] abreu kernel: pci 0000:01:00.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 2853.413291] abreu kernel: pci 0000:01:00.0: enabling Extended Tags [ 2853.413413] abreu kernel: pci 0000:01:00.0: supports D1 D2 [ 2853.413415] abreu kernel: pci 0000:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold [ 2853.413512] abreu kernel: pci 0000:01:00.0: 15.752 Gb/s available PCIe bandwidth, limited by 8.0 GT/s PCIe x2 link at 0000:00:1c.0 (capable of 31.504 Gb/s with 8.0 GT/s PCIe x4 link) [ 2853.414265] abreu kernel: pci 0000:02:00.0: [8086:1576] type 01 class 0x060400 PCIe Switch Downstream Port [ 2853.414307] abreu kernel: pci 0000:02:00.0: PCI bridge to [bus 03] [ 2853.414319] abreu kernel: pci 0000:02:00.0: bridge window [mem 0xda000000-0xda0fffff] [ 2853.414349] abreu kernel: pci 0000:02:00.0: enabling Extended Tags [ 2853.414465] abreu kernel: pci 0000:02:00.0: supports D1 D2 [ 2853.414466] abreu kernel: pci 0000:02:00.0: PME# supported from D0 D1 D2 D3hot D3cold [ 2853.414713] abreu kernel: pci 0000:02:01.0: [8086:1576] type 01 class 0x060400 PCIe Switch Downstream Port [ 2853.414754] abreu kernel: pci 0000:02:01.0: PCI bridge to [bus 04-38] [ 2853.414764] abreu kernel: pci 0000:02:01.0: bridge window [mem 0xc4000000-0xd9efffff] [ 2853.414780] abreu kernel: pci 0000:02:01.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 2853.414797] abreu kernel: pci 0000:02:01.0: enabling Extended Tags [ 2853.414913] abreu kernel: pci 0000:02:01.0: supports D1 D2 [ 2853.414915] abreu kernel: pci 0000:02:01.0: PME# supported from D0 D1 D2 D3hot D3cold [ 2853.415152] abreu kernel: pci 0000:02:02.0: [8086:1576] type 01 class 0x060400 PCIe Switch Downstream Port [ 2853.415191] abreu kernel: pci 0000:02:02.0: PCI bridge to [bus 39] [ 2853.415201] abreu kernel: pci 0000:02:02.0: bridge window [mem 0xd9f00000-0xd9ffffff] [ 2853.415231] abreu kernel: pci 0000:02:02.0: enabling Extended Tags [ 2853.415367] abreu kernel: pci 0000:02:02.0: supports D1 D2 [ 2853.415370] abreu kernel: pci 0000:02:02.0: PME# supported from D0 D1 D2 D3hot D3cold [ 2853.417708] abreu kernel: pci 0000:01:00.0: PCI bridge to [bus 02-39] [ 2853.417790] abreu kernel: pci 0000:02:00.0: PCI bridge to [bus 03] [ 2853.419600] abreu kernel: pci 0000:02:01.0: PCI bridge to [bus 04-38] [ 2853.419740] abreu kernel: pci 0000:39:00.0: [8086:15b5] type 00 class 0x0c0330 PCIe Endpoint [ 2853.419769] abreu kernel: pci 0000:39:00.0: BAR 0 [mem 0xd9f00000-0xd9f0ffff] [ 2853.419858] abreu kernel: pci 0000:39:00.0: enabling Extended Tags [ 2853.420025] abreu kernel: pci 0000:39:00.0: supports D1 D2 [ 2853.420027] abreu kernel: pci 0000:39:00.0: PME# supported from D0 D1 D2 D3hot D3cold [ 2853.420156] abreu kernel: pci 0000:39:00.0: 8.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s PCIe x4 link at 0000:02:02.0 (capable of 31.504 Gb/s with 8.0 GT/s PCIe x4 link) [ 2853.423702] abreu kernel: pci 0000:02:02.0: PCI bridge to [bus 39] [ 2853.423751] abreu kernel: pci_bus 0000:02: Allocating resources [ 2853.423771] abreu kernel: pci 0000:02:01.0: bridge window [io 0x1000-0x0fff] to [bus 04-38] add_size 1000 [ 2853.423776] abreu kernel: pci 0000:02:02.0: bridge window [io 0x1000-0x0fff] to [bus 39] add_size 1000 [ 2853.423780] abreu kernel: pci 0000:02:02.0: bridge window [mem 0x00100000-0x000fffff 64bit pref] to [bus 39] add_size 200000 add_align 100000 [ 2853.423784] abreu kernel: pci 0000:01:00.0: bridge window [io 0x1000-0x0fff] to [bus 02-39] add_size 2000 [ 2853.423789] abreu kernel: pci 0000:01:00.0: bridge window [io size 0x2000]: can't assign; no space [ 2853.423792] abreu kernel: pci 0000:01:00.0: bridge window [io size 0x2000]: failed to assign [ 2853.423795] abreu kernel: pci 0000:01:00.0: bridge window [io size 0x2000]: can't assign; no space [ 2853.423797] abreu kernel: pci 0000:01:00.0: bridge window [io size 0x2000]: failed to assign [ 2853.423802] abreu kernel: pci 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: can't assign; no space [ 2853.423805] abreu kernel: pci 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: failed to assign [ 2853.423808] abreu kernel: pci 0000:02:01.0: bridge window [io size 0x1000]: can't assign; no space [ 2853.423810] abreu kernel: pci 0000:02:01.0: bridge window [io size 0x1000]: failed to assign [ 2853.423812] abreu kernel: pci 0000:02:02.0: bridge window [io size 0x1000]: can't assign; no space [ 2853.423815] abreu kernel: pci 0000:02:02.0: bridge window [io size 0x1000]: failed to assign [ 2853.423819] abreu kernel: pci 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: can't assign; no space [ 2853.423821] abreu kernel: pci 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: failed to assign [ 2853.423824] abreu kernel: pci 0000:02:02.0: bridge window [io size 0x1000]: can't assign; no space [ 2853.423826] abreu kernel: pci 0000:02:02.0: bridge window [io size 0x1000]: failed to assign [ 2853.423828] abreu kernel: pci 0000:02:01.0: bridge window [io size 0x1000]: can't assign; no space [ 2853.423831] abreu kernel: pci 0000:02:01.0: bridge window [io size 0x1000]: failed to assign [ 2853.423834] abreu kernel: pci 0000:02:00.0: PCI bridge to [bus 03] [ 2853.423841] abreu kernel: pci 0000:02:00.0: bridge window [mem 0xda000000-0xda0fffff] [ 2853.423852] abreu kernel: pci 0000:02:01.0: PCI bridge to [bus 04-38] [ 2853.423858] abreu kernel: pci 0000:02:01.0: bridge window [mem 0xc4000000-0xd9efffff] [ 2853.423863] abreu kernel: pci 0000:02:01.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 2853.423872] abreu kernel: pci 0000:02:02.0: PCI bridge to [bus 39] [ 2853.423879] abreu kernel: pci 0000:02:02.0: bridge window [mem 0xd9f00000-0xd9ffffff] [ 2853.423891] abreu kernel: pci 0000:01:00.0: PCI bridge to [bus 02-39] [ 2853.423897] abreu kernel: pci 0000:01:00.0: bridge window [mem 0xc4000000-0xda0fffff] [ 2853.423902] abreu kernel: pci 0000:01:00.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 2853.425951] abreu kernel: xhci_hcd 0000:39:00.0: xHCI Host Controller [ 2853.425963] abreu kernel: xhci_hcd 0000:39:00.0: new USB bus registered, assigned bus number 3 [ 2853.427108] abreu kernel: xhci_hcd 0000:39:00.0: hcc params 0x200077c1 hci version 0x110 quirks 0x0000000200009810 [ 2853.427605] abreu kernel: xhci_hcd 0000:39:00.0: xHCI Host Controller [ 2853.427613] abreu kernel: xhci_hcd 0000:39:00.0: new USB bus registered, assigned bus number 4 [ 2853.427660] abreu kernel: xhci_hcd 0000:39:00.0: Host supports USB 3.1 Enhanced SuperSpeed [ 2853.427750] abreu kernel: usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.09 [ 2853.427754] abreu kernel: usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 2853.427756] abreu kernel: usb usb3: Product: xHCI Host Controller [ 2853.427758] abreu kernel: usb usb3: Manufacturer: Linux 6.9.0-rc1+ xhci-hcd [ 2853.427760] abreu kernel: usb usb3: SerialNumber: 0000:39:00.0 [ 2853.428002] abreu kernel: hub 3-0:1.0: USB hub found [ 2853.428015] abreu kernel: hub 3-0:1.0: 2 ports detected [ 2853.428851] abreu kernel: usb usb4: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.09 [ 2853.428856] abreu kernel: usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 2853.428858] abreu kernel: usb usb4: Product: xHCI Host Controller [ 2853.428860] abreu kernel: usb usb4: Manufacturer: Linux 6.9.0-rc1+ xhci-hcd [ 2853.428862] abreu kernel: usb usb4: SerialNumber: 0000:39:00.0 [ 2853.429029] abreu kernel: hub 4-0:1.0: USB hub found [ 2853.429043] abreu kernel: hub 4-0:1.0: 2 ports detected [ 2853.435863] abreu kernel: pci_bus 0000:02: Allocating resources [ 2853.435886] abreu kernel: pcieport 0000:02:01.0: bridge window [io 0x1000-0x0fff] to [bus 04-38] add_size 1000 [ 2853.435892] abreu kernel: pcieport 0000:02:02.0: bridge window [io 0x1000-0x0fff] to [bus 39] add_size 1000 [ 2853.435896] abreu kernel: pcieport 0000:02:02.0: bridge window [mem 0x00100000-0x000fffff 64bit pref] to [bus 39] add_size 200000 add_align 100000 [ 2853.435901] abreu kernel: pcieport 0000:01:00.0: bridge window [io 0x1000-0x0fff] to [bus 02-39] add_size 2000 [ 2853.435906] abreu kernel: pcieport 0000:01:00.0: bridge window [io size 0x2000]: can't assign; no space [ 2853.435909] abreu kernel: pcieport 0000:01:00.0: bridge window [io size 0x2000]: failed to assign [ 2853.435912] abreu kernel: pcieport 0000:01:00.0: bridge window [io size 0x2000]: can't assign; no space [ 2853.435914] abreu kernel: pcieport 0000:01:00.0: bridge window [io size 0x2000]: failed to assign [ 2853.435920] abreu kernel: pcieport 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: can't assign; no space [ 2853.435922] abreu kernel: pcieport 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: failed to assign [ 2853.435925] abreu kernel: pcieport 0000:02:01.0: bridge window [io size 0x1000]: can't assign; no space [ 2853.435927] abreu kernel: pcieport 0000:02:01.0: bridge window [io size 0x1000]: failed to assign [ 2853.435929] abreu kernel: pcieport 0000:02:02.0: bridge window [io size 0x1000]: can't assign; no space [ 2853.435931] abreu kernel: pcieport 0000:02:02.0: bridge window [io size 0x1000]: failed to assign [ 2853.435935] abreu kernel: pcieport 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: can't assign; no space [ 2853.435937] abreu kernel: pcieport 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: failed to assign [ 2853.435940] abreu kernel: pcieport 0000:02:02.0: bridge window [io size 0x1000]: can't assign; no space [ 2853.435942] abreu kernel: pcieport 0000:02:02.0: bridge window [io size 0x1000]: failed to assign [ 2853.435944] abreu kernel: pcieport 0000:02:01.0: bridge window [io size 0x1000]: can't assign; no space [ 2853.435946] abreu kernel: pcieport 0000:02:01.0: bridge window [io size 0x1000]: failed to assign [ 2853.691283] abreu kernel: usb 3-1: new high-speed USB device number 2 using xhci_hcd [ 2853.707252] abreu kernel: usb 1-1: new low-speed USB device number 5 using xhci_hcd [ 2853.842287] abreu kernel: usb 3-1: New USB device found, idVendor=2109, idProduct=2820, bcdDevice=30.03 [ 2853.842293] abreu kernel: usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 2853.842295] abreu kernel: usb 3-1: Product: USB2.0 Hub [ 2853.842296] abreu kernel: usb 3-1: Manufacturer: VIA Labs, Inc. [ 2853.844166] abreu kernel: hub 3-1:1.0: USB hub found [ 2853.844520] abreu kernel: hub 3-1:1.0: 5 ports detected [ 2853.863078] abreu kernel: usb 1-1: New USB device found, idVendor=0bf8, idProduct=101e, bcdDevice= 1.09 [ 2853.863091] abreu kernel: usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 2853.863093] abreu kernel: usb 1-1: Product: Fujitsu Keyboard [ 2853.863096] abreu kernel: usb 1-1: Manufacturer: Fujitsu [ 2853.868675] abreu kernel: input: Fujitsu Fujitsu Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/0003:0BF8:101E.0003/input/input33 [ 2853.927598] abreu kernel: hid-generic 0003:0BF8:101E.0003: input,hidraw2: USB HID v1.10 Keyboard [Fujitsu Fujitsu Keyboard] on usb-0000:00:14.0-1/input0 [ 2853.934933] abreu kernel: input: Fujitsu Fujitsu Keyboard System Control as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.1/0003:0BF8:101E.0004/input/input34 [ 2853.968059] abreu kernel: usb 4-1: new SuperSpeed Plus Gen 2x1 USB device number 2 using xhci_hcd [ 2853.991829] abreu kernel: input: Fujitsu Fujitsu Keyboard Consumer Control as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.1/0003:0BF8:101E.0004/input/input35 [ 2853.991960] abreu kernel: hid-generic 0003:0BF8:101E.0004: input,hiddev1,hidraw3: USB HID v1.10 Device [Fujitsu Fujitsu Keyboard] on usb-0000:00:14.0-1/input1 [ 2853.995047] abreu kernel: usb 4-1: New USB device found, idVendor=2109, idProduct=0820, bcdDevice=30.03 [ 2853.995054] abreu kernel: usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 2853.995057] abreu kernel: usb 4-1: Product: USB3.1 Hub [ 2853.995059] abreu kernel: usb 4-1: Manufacturer: VIA Labs, Inc. [ 2853.997016] abreu kernel: hub 4-1:1.0: USB hub found [ 2853.997111] abreu kernel: hub 4-1:1.0: 4 ports detected [ 2854.559277] abreu kernel: usb 3-1.1: new full-speed USB device number 3 using xhci_hcd [ 2854.717938] abreu kernel: usb 3-1.1: New USB device found, idVendor=06c4, idProduct=c412, bcdDevice= 0.06 [ 2854.717945] abreu kernel: usb 3-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 2854.717948] abreu kernel: usb 3-1.1: Product: DELL DA300 [ 2854.717950] abreu kernel: usb 3-1.1: Manufacturer: Bizlink [ 2854.717952] abreu kernel: usb 3-1.1: SerialNumber: MCU Ver0006 [ 2854.727476] abreu kernel: hid-generic 0003:06C4:C412.0005: hiddev2,hidraw4: USB HID v1.11 Device [Bizlink DELL DA300] on usb-0000:39:00.0-1.1/input0 [ 2854.791279] abreu kernel: usb 4-1.2: new SuperSpeed USB device number 3 using xhci_hcd [ 2854.815785] abreu kernel: usb 4-1.2: New USB device found, idVendor=0bda, idProduct=8153, bcdDevice=31.00 [ 2854.815793] abreu kernel: usb 4-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=6 [ 2854.815796] abreu kernel: usb 4-1.2: Product: USB 10/100/1000 LAN [ 2854.815798] abreu kernel: usb 4-1.2: Manufacturer: Realtek [ 2854.815800] abreu kernel: usb 4-1.2: SerialNumber: 001000001 [ 2854.848173] abreu kernel: usbcore: registered new device driver r8152-cfgselector [ 2854.931541] abreu kernel: r8152-cfgselector 4-1.2: reset SuperSpeed USB device number 3 using xhci_hcd [ 2854.954271] abreu kernel: r8152 4-1.2:1.0 (unnamed net_device) (uninitialized): Using pass-thru MAC addr 18:db:f2:2d:cc:f3 [ 2854.968461] abreu kernel: r8152 4-1.2:1.0: load rtl8153b-2 v2 04/27/23 successfully [ 2854.999939] abreu kernel: r8152 4-1.2:1.0 eth0: v1.12.13 [ 2854.999977] abreu kernel: usbcore: registered new interface driver r8152 [ 2855.026448] abreu kernel: usbcore: registered new interface driver cdc_ether [ 2855.030411] abreu kernel: usbcore: registered new interface driver r8153_ecm [ 2855.124554] abreu kernel: r8152 4-1.2:1.0 enx18dbf22dccf3: renamed from eth0 [ 2858.067204] abreu kernel: ucsi_acpi USBC000:00: GET_CABLE_PROPERTY failed (-110) [ 2858.087189] abreu kernel: usb 1-2: new low-speed USB device number 6 using xhci_hcd [ 2858.159911] abreu kernel: ucsi_acpi USBC000:00: UCSI_GET_PD_MESSAGE failed (-95) [ 2858.238505] abreu kernel: usb 1-2: New USB device found, idVendor=046d, idProduct=c077, bcdDevice=72.00 [ 2858.238511] abreu kernel: usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 2858.238513] abreu kernel: usb 1-2: Product: USB Optical Mouse [ 2858.238514] abreu kernel: usb 1-2: Manufacturer: Logitech [ 2858.242024] abreu kernel: input: Logitech USB Optical Mouse as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/0003:046D:C077.0006/input/input36 [ 2858.242248] abreu kernel: hid-generic 0003:046D:C077.0006: input,hidraw5: USB HID v1.11 Mouse [Logitech USB Optical Mouse] on usb-0000:00:14.0-2/input0 [ 2858.295425] abreu kernel: r8152 4-1.2:1.0 enx18dbf22dccf3: carrier on [ 2863.187089] abreu kernel: ucsi_acpi USBC000:00: GET_CONNECTOR_STATUS failed (-110) [ 2863.461211] abreu kernel: ucsi_acpi USBC000:00: UCSI_GET_PD_MESSAGE failed (-95) [ 2865.132506] abreu kernel: i915 0000:00:02.0: [drm] Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS. [ 2869.331008] abreu kernel: ucsi_acpi USBC000:00: GET_CONNECTOR_STATUS failed (-110) [ 3753.196631] abreu kernel: wlp58s0: deauthenticating from 6c:f3:7f:10:ae:18 by local choice (Reason: 3=DEAUTH_LEAVING) [ 4467.953286] abreu kernel: perf: interrupt took too long (2505 > 2500), lowering kernel.perf_event_max_sample_rate to 79750 [ 4888.758001] abreu kernel: perf: interrupt took too long (3148 > 3131), lowering kernel.perf_event_max_sample_rate to 63500 [ 5558.084776] abreu kernel: perf: interrupt took too long (3937 > 3935), lowering kernel.perf_event_max_sample_rate to 50750 [ 7787.898596] abreu kernel: rfkill: input handler enabled [ 7790.395266] abreu kernel: EXT4-fs (nvme0n1p2): unmounting filesystem 2d23fd4c-5d03-4e1a-8a42-0e859d1f00d8. [ 7790.488206] abreu systemd-shutdown[1]: Syncing filesystems and block devices. [ 7790.502779] abreu systemd-shutdown[1]: Sending SIGTERM to remaining processes... [ 7790.511378] abreu systemd-journald[395]: Received SIGTERM from PID 1 (systemd-shutdow).
[-- Attachment #1: Type: text/plain, Size: 11988 bytes --] Dear Linux folks, On a Dell XPS 13 9360/0596KF, BIOS 2.21.0 06/02/2022, Linux 6.9-rc1+ built with CONFIG_KCSAN=y and `KCSAN_EARLY_ENABLE` *not* selected shows the warning below. $ git log --no-decorate --oneline -1 928a87efa423 Merge tag 'gfs2-v6.8-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2 ### First try (Sorry, I didn’t save the direct output of `dmesg` the first time.) ``` $ journalctl -o short-monotonic -b -1 _TRANSPORT=kernel […] [ 1.695447] abreu kernel: ------------[ cut here ]------------ [ 1.695463] abreu kernel: Unpatched return thunk in use. This should not happen! [ 1.695472] abreu kernel: WARNING: CPU: 2 PID: 89 at arch/x86/kernel/cpu/bugs.c:2935 __warn_thunk+0x42/0x50 [ 1.695489] abreu kernel: Modules linked in: cryptd(+) [ 1.695501] abreu kernel: CPU: 2 PID: 89 Comm: modprobe Not tainted 6.9.0-rc1+ #77 [ 1.695512] abreu kernel: Hardware name: Dell Inc. XPS 13 9360/0596KF, BIOS 2.21.0 06/02/2022 [ 1.695518] abreu kernel: RIP: 0010:__warn_thunk+0x42/0x50 [ 1.695530] abreu kernel: Code: 05 da 01 00 74 05 c3 cc cc cc cc 48 c7 c7 7d f4 60 9c e8 51 5b 37 00 48 c7 c7 a0 1b 2a 9c c6 05 60 05 da 01 01 e8 5e 38 08 00 <0f> 0b c3 cc cc cc cc 0f 1f 80 00 00 00 00 90 90> [ 1.695539] abreu kernel: RSP: 0018:ffffabd5c0543a50 EFLAGS: 00010286 [ 1.695549] abreu kernel: RAX: 0000000000000000 RBX: ffffffffc05222c0 RCX: 0001ffffffffffff [ 1.695556] abreu kernel: RDX: ffff99f100e4b480 RSI: 0000000000000004 RDI: ffffffff9c4ca398 [ 1.695563] abreu kernel: RBP: ffffabd5c0543aa0 R08: ffffffff9d2ce8c8 R09: 0000000000000000 [ 1.695570] abreu kernel: R10: 0001ffff9c4ca398 R11: ffffffff9a9af821 R12: ffff99f1038d7560 [ 1.695577] abreu kernel: R13: ffffffffc0522770 R14: ffffffffc0522768 R15: ffffffffc052c008 [ 1.695584] abreu kernel: FS: 00007ff3d9264040(0000) GS:ffff99f46f100000(0000) knlGS:0000000000000000 [ 1.695593] abreu kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1.695601] abreu kernel: CR2: 00007ff3d9341170 CR3: 0000000101838004 CR4: 00000000003706f0 [ 1.695608] abreu kernel: Call Trace: [ 1.695613] abreu kernel: <TASK> [ 1.695626] abreu kernel: ? __warn+0xaf/0x1c0 [ 1.695636] abreu kernel: ? __warn_thunk+0x42/0x50 [ 1.695648] abreu kernel: ? report_bug+0x1d6/0x200 [ 1.695662] abreu kernel: ? handle_bug+0x3c/0x80 [ 1.695672] abreu kernel: ? exc_invalid_op+0x17/0x70 [ 1.695682] abreu kernel: ? asm_exc_invalid_op+0x1a/0x20 [ 1.695696] abreu kernel: ? __wake_up_klogd.part.0+0x21/0x80 [ 1.695713] abreu kernel: ? __warn_thunk+0x42/0x50 [ 1.695724] abreu kernel: warn_thunk_thunk+0x1a/0x30 [ 1.695735] abreu kernel: ? do_init_module+0xf2/0x360 [ 1.695750] abreu kernel: ? _sub_I_00099_0+0x20/0x20 [cryptd] [ 1.695801] abreu kernel: do_init_module+0xf7/0x360 [ 1.695817] abreu kernel: load_module+0x35f2/0x37d0 [ 1.695851] abreu kernel: ? init_module_from_file+0xca/0x130 [ 1.695866] abreu kernel: init_module_from_file+0xca/0x130 [ 1.695888] abreu kernel: idempotent_init_module+0x1b0/0x3d0 [ 1.695907] abreu kernel: __x64_sys_finit_module+0x88/0xe0 [ 1.695923] abreu kernel: do_syscall_64+0x85/0x1a0 [ 1.695936] abreu kernel: ? do_syscall_64+0x94/0x1a0 [ 1.695950] abreu kernel: ? fpregs_assert_state_consistent+0x7e/0x90 [ 1.695968] abreu kernel: ? arch_exit_to_user_mode_prepare.isra.0+0x69/0xa0 [ 1.695980] abreu kernel: ? syscall_exit_to_user_mode+0x40/0xe0 [ 1.695996] abreu kernel: ? do_syscall_64+0x94/0x1a0 [ 1.696009] abreu kernel: ? irqentry_exit_to_user_mode+0x36/0xd0 [ 1.696020] abreu kernel: entry_SYSCALL_64_after_hwframe+0x6c/0x74 [ 1.696032] abreu kernel: RIP: 0033:0x7ff3d9366059 [ 1.696039] abreu kernel: Code: 08 89 e8 5b 5d c3 66 2e 0f 1f 84 00 00 00 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 8f 1d 0d 00> [ 1.696048] abreu kernel: RSP: 002b:00007ffe37361958 EFLAGS: 00000246 ORIG_RAX: 0000000000000139 [ 1.696059] abreu kernel: RAX: ffffffffffffffda RBX: 0000555d44f65b40 RCX: 00007ff3d9366059 [ 1.696066] abreu kernel: RDX: 0000000000000000 RSI: 0000555d239659a6 RDI: 0000000000000000 [ 1.696073] abreu kernel: RBP: 0000000000000000 R08: 0000000000000060 R09: 0000555d44f671f0 [ 1.696080] abreu kernel: R10: 0000000000000038 R11: 0000000000000246 R12: 0000555d239659a6 [ 1.696087] abreu kernel: R13: 0000000000040000 R14: 0000555d44f65f30 R15: 0000000000000000 [ 1.696101] abreu kernel: </TASK> [ 1.696106] abreu kernel: ---[ end trace 0000000000000000 ]--- ``` ``` $ ./scripts/decodecode < first_boot.txt [ 1.696039] Code: 08 89 e8 5b 5d c3 66 2e 0f 1f 84 00 00 00 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 8f 1d 0d 00 f7 d8 64 89 01 48 All code ======== 0: 08 89 e8 5b 5d c3 or %cl,-0x3ca2a418(%rcx) 6: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) d: 00 00 00 10: 90 nop 11: 48 89 f8 mov %rdi,%rax 14: 48 89 f7 mov %rsi,%rdi 17: 48 89 d6 mov %rdx,%rsi 1a: 48 89 ca mov %rcx,%rdx 1d: 4d 89 c2 mov %r8,%r10 20: 4d 89 c8 mov %r9,%r8 23: 4c 8b 4c 24 08 mov 0x8(%rsp),%r9 28: 0f 05 syscall 2a:* 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax <-- trapping instruction 30: 73 01 jae 0x33 32: c3 ret 33: 48 8b 0d 8f 1d 0d 00 mov 0xd1d8f(%rip),%rcx # 0xd1dc9 3a: f7 d8 neg %eax 3c: 64 89 01 mov %eax,%fs:(%rcx) 3f: 48 rex.W Code starting with the faulting instruction =========================================== 0: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax 6: 73 01 jae 0x9 8: c3 ret 9: 48 8b 0d 8f 1d 0d 00 mov 0xd1d8f(%rip),%rcx # 0xd1d9f 10: f7 d8 neg %eax 12: 64 89 01 mov %eax,%fs:(%rcx) 15: 48 rex.W ``` ### Second try The Code line is a little different: ```` [ 1.685474] ------------[ cut here ]------------ [ 1.685482] Unpatched return thunk in use. This should not happen! [ 1.685498] WARNING: CPU: 1 PID: 88 at arch/x86/kernel/cpu/bugs.c:2935 __warn_thunk+0x42/0x50 [ 1.685515] Modules linked in: cryptd(+) [ 1.685527] CPU: 1 PID: 88 Comm: modprobe Not tainted 6.9.0-rc1+ #77 [ 1.685537] Hardware name: Dell Inc. XPS 13 9360/0596KF, BIOS 2.21.0 06/02/2022 [ 1.685544] RIP: 0010:__warn_thunk+0x42/0x50 [ 1.685555] Code: 05 da 01 00 74 05 c3 cc cc cc cc 48 c7 c7 7d f4 20 9b e8 51 5b 37 00 48 c7 c7 a0 1b ea 9a c6 05 60 05 da 01 01 e8 5e 38 08 00 <0f> 0b c3 cc cc cc cc 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 [ 1.685565] RSP: 0018:ffffb6a6c054bac0 EFLAGS: 00010282 [ 1.685574] RAX: 0000000000000000 RBX: ffffffffc04692c0 RCX: 0001ffffffffffff [ 1.685582] RDX: ffff996b43028000 RSI: 0000000000000004 RDI: ffffffff9b0ca398 [ 1.685589] RBP: ffffb6a6c054bb10 R08: ffffffff9bece8c8 R09: 0000000000000000 [ 1.685596] R10: 0001ffff9b0ca398 R11: ffffffff995af821 R12: ffff996b4670d4a0 [ 1.685603] R13: ffffffffc0469770 R14: ffffffffc0469768 R15: ffffffffc0473008 [ 1.685610] FS: 00007f8cee712040(0000) GS:ffff996eaf080000(0000) knlGS:0000000000000000 [ 1.685618] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1.685626] CR2: 00007ffda89fcb28 CR3: 00000001013f2004 CR4: 00000000003706f0 [ 1.685633] Call Trace: [ 1.685638] <TASK> [ 1.685644] ? __warn+0xaf/0x1c0 [ 1.685655] ? __warn_thunk+0x42/0x50 [ 1.685667] ? report_bug+0x1d6/0x200 [ 1.685680] ? handle_bug+0x3c/0x80 [ 1.685690] ? exc_invalid_op+0x17/0x70 [ 1.685700] ? asm_exc_invalid_op+0x1a/0x20 [ 1.685714] ? __wake_up_klogd.part.0+0x21/0x80 [ 1.685731] ? __warn_thunk+0x42/0x50 [ 1.685742] warn_thunk_thunk+0x1a/0x30 [ 1.685752] ? do_init_module+0xf2/0x360 [ 1.685767] ? _sub_I_00099_0+0x20/0x20 [cryptd] [ 1.685818] do_init_module+0xf7/0x360 [ 1.685835] load_module+0x35f2/0x37d0 [ 1.685868] ? init_module_from_file+0xca/0x130 [ 1.685883] init_module_from_file+0xca/0x130 [ 1.685905] idempotent_init_module+0x1b0/0x3d0 [ 1.685924] __x64_sys_finit_module+0x88/0xe0 [ 1.685940] do_syscall_64+0x85/0x1a0 [ 1.685953] ? do_syscall_64+0x94/0x1a0 [ 1.685965] ? do_syscall_64+0x94/0x1a0 [ 1.685978] ? arch_exit_to_user_mode_prepare.isra.0+0x69/0xa0 [ 1.685990] ? irqentry_exit_to_user_mode+0x36/0xd0 [ 1.686006] entry_SYSCALL_64_after_hwframe+0x6c/0x74 [ 1.686017] RIP: 0033:0x7f8cee814059 [ 1.686025] Code: 08 89 e8 5b 5d c3 66 2e 0f 1f 84 00 00 00 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 8f 1d 0d 00 f7 d8 64 89 01 48 [ 1.686034] RSP: 002b:00007ffda89ffae8 EFLAGS: 00000246 ORIG_RAX: 0000000000000139 [ 1.686045] RAX: ffffffffffffffda RBX: 000055ec481f3b40 RCX: 00007f8cee814059 [ 1.686052] RDX: 0000000000000000 RSI: 000055ec13d9d9a6 RDI: 0000000000000000 [ 1.686059] RBP: 0000000000000000 R08: 0000000000000060 R09: 000055ec481f51f0 [ 1.686066] R10: 0000000000000038 R11: 0000000000000246 R12: 000055ec13d9d9a6 [ 1.686073] R13: 0000000000040000 R14: 000055ec481f3f30 R15: 0000000000000000 [ 1.686087] </TASK> [ 1.686091] ---[ end trace 0000000000000000 ]--- ``` ``` $ ./scripts/decodecode < second_try.txt Code: 05 da 01 00 74 05 c3 cc cc cc cc 48 c7 c7 7d f4 20 9b e8 51 5b 37 00 48 c7 c7 a0 1b ea 9a c6 05 60 05 da 01 01 e8 5e 38 08 00 <0f> 0b c3 cc cc cc cc 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 All code ======== 0: 05 da 01 00 74 add $0x740001da,%eax 5: 05 c3 cc cc cc add $0xccccccc3,%eax a: cc int3 b: 48 c7 c7 7d f4 20 9b mov $0xffffffff9b20f47d,%rdi 12: e8 51 5b 37 00 call 0x375b68 17: 48 c7 c7 a0 1b ea 9a mov $0xffffffff9aea1ba0,%rdi 1e: c6 05 60 05 da 01 01 movb $0x1,0x1da0560(%rip) # 0x1da0585 25: e8 5e 38 08 00 call 0x83888 2a:* 0f 0b ud2 <-- trapping instruction 2c: c3 ret 2d: cc int3 2e: cc int3 2f: cc int3 30: cc int3 31: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 38: 90 nop 39: 90 nop 3a: 90 nop 3b: 90 nop 3c: 90 nop 3d: 90 nop 3e: 90 nop 3f: 90 nop Code starting with the faulting instruction =========================================== 0: 0f 0b ud2 2: c3 ret 3: cc int3 4: cc int3 5: cc int3 6: cc int3 7: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) e: 90 nop f: 90 nop 10: 90 nop 11: 90 nop 12: 90 nop 13: 90 nop 14: 90 nop 15: 90 nop ``` Please find the full Linux messages of the second try attached. The problem does not happen with QEMU emulator version 8.2.2 (Debian 1:8.2.2+ds-2) with machine *q35*. Kind regards, Paul [-- Attachment #2: config-6.9.0-rc1+ --] [-- Type: text/plain, Size: 201540 bytes --] # # Automatically generated file; DO NOT EDIT. # Linux/x86 6.9.0-rc1 Kernel Configuration # CONFIG_CC_VERSION_TEXT="gcc (Debian 13.2.0-19) 13.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=130200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=24200 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y CONFIG_TOOLS_SUPPORT_RELR=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 CONFIG_CONSTRUCTORS=y CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set # CONFIG_WERROR is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_BZIP2=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y CONFIG_HAVE_KERNEL_ZSTD=y # CONFIG_KERNEL_GZIP is not set # CONFIG_KERNEL_BZIP2 is not set # CONFIG_KERNEL_LZMA is not set CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_LZO is not set # CONFIG_KERNEL_LZ4 is not set # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_USELIB=y CONFIG_AUDIT=y CONFIG_HAVE_ARCH_AUDITSYSCALL=y CONFIG_AUDITSYSCALL=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_PENDING_IRQ=y CONFIG_GENERIC_IRQ_MIGRATION=y CONFIG_HARDIRQS_SW_RESEND=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_IRQ_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_CLOCKSOURCE_WATCHDOG=y CONFIG_ARCH_CLOCKSOURCE_INIT=y CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST_IDLE=y CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_CONTEXT_TRACKING=y CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set # CONFIG_NO_HZ_IDLE is not set CONFIG_NO_HZ_FULL=y CONFIG_CONTEXT_TRACKING_USER=y # CONFIG_CONTEXT_TRACKING_USER_FORCE is not set # CONFIG_NO_HZ is not set CONFIG_HIGH_RES_TIMERS=y CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=125 # end of Timers subsystem CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # # BPF subsystem # CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y # CONFIG_BPF_JIT_ALWAYS_ON is not set CONFIG_BPF_JIT_DEFAULT_ON=y CONFIG_BPF_UNPRIV_DEFAULT_OFF=y # CONFIG_BPF_PRELOAD is not set CONFIG_BPF_LSM=y # end of BPF subsystem CONFIG_PREEMPT_BUILD=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set CONFIG_PREEMPT_COUNT=y CONFIG_PREEMPTION=y CONFIG_PREEMPT_DYNAMIC=y # CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting # CONFIG_VIRT_CPU_ACCOUNTING=y CONFIG_VIRT_CPU_ACCOUNTING_GEN=y # CONFIG_IRQ_TIME_ACCOUNTING is not set CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y CONFIG_PSI=y # CONFIG_PSI_DEFAULT_DISABLED is not set # end of CPU/Task time and stats accounting CONFIG_CPU_ISOLATION=y # # RCU Subsystem # CONFIG_TREE_RCU=y CONFIG_PREEMPT_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_TREE_SRCU=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_RCU=y CONFIG_TASKS_RUDE_RCU=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y CONFIG_RCU_NOCB_CPU=y # CONFIG_RCU_NOCB_CPU_DEFAULT_ALL is not set # CONFIG_RCU_LAZY is not set # end of RCU Subsystem CONFIG_IKCONFIG=m # CONFIG_IKCONFIG_PROC is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 # CONFIG_PRINTK_INDEX is not set CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y # # Scheduler features # # CONFIG_UCLAMP_TASK is not set # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC10_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_GCC_NO_STRINGOP_OVERFLOW=y CONFIG_CC_NO_STRINGOP_OVERFLOW=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_NUMA_BALANCING=y CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set CONFIG_MEMCG=y CONFIG_MEMCG_KMEM=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y # CONFIG_RT_GROUP_SCHED is not set CONFIG_SCHED_MM_CID=y CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_RDMA=y CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_HUGETLB=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y CONFIG_CGROUP_MISC=y # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_TIME_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y CONFIG_CHECKPOINT_RESTORE=y CONFIG_SCHED_AUTOGROUP=y CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="" CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y CONFIG_RD_ZSTD=y # CONFIG_BOOT_CONFIG is not set CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y CONFIG_LD_ORPHAN_WARN_LEVEL="warn" CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y CONFIG_EXPERT=y CONFIG_UID16=y CONFIG_MULTIUSER=y CONFIG_SGETMASK_SYSCALL=y CONFIG_SYSFS_SYSCALL=y CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_PCSPKR_PLATFORM=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_IO_URING=y CONFIG_ADVISE_SYSCALLS=y CONFIG_MEMBARRIER=y CONFIG_KCMP=y CONFIG_RSEQ=y # CONFIG_DEBUG_RSEQ is not set CONFIG_CACHESTAT_SYSCALL=y # CONFIG_PC104 is not set CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_SELFTEST is not set CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_GUEST_PERF_EVENTS=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y # # Kexec and crash features # CONFIG_CRASH_RESERVE=y CONFIG_VMCORE_INFO=y CONFIG_KEXEC_CORE=y CONFIG_HAVE_IMA_KEXEC=y CONFIG_KEXEC=y CONFIG_KEXEC_FILE=y CONFIG_KEXEC_SIG=y # CONFIG_KEXEC_SIG_FORCE is not set CONFIG_KEXEC_BZIMAGE_VERIFY_SIG=y # CONFIG_KEXEC_JUMP is not set CONFIG_CRASH_DUMP=y CONFIG_CRASH_HOTPLUG=y CONFIG_CRASH_MAX_MEMORY_RANGES=8192 # end of Kexec and crash features # end of General setup CONFIG_64BIT=y CONFIG_X86_64=y CONFIG_X86=y CONFIG_INSTRUCTION_DECODER=y CONFIG_OUTPUT_FORMAT="elf64-x86-64" CONFIG_LOCKDEP_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=28 CONFIG_ARCH_MMAP_RND_BITS_MAX=32 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_AUDIT_ARCH=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_DYNAMIC_PHYSICAL_MASK=y CONFIG_PGTABLE_LEVELS=5 CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # CONFIG_SMP=y CONFIG_X86_X2APIC=y CONFIG_X86_MPPARSE=y CONFIG_X86_CPU_RESCTRL=y CONFIG_X86_FRED=y # CONFIG_X86_EXTENDED_PLATFORM is not set CONFIG_X86_INTEL_LPSS=y CONFIG_X86_AMD_PLATFORM_DEVICE=y CONFIG_IOSF_MBI=y # CONFIG_IOSF_MBI_DEBUG is not set CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y CONFIG_SCHED_OMIT_FRAME_POINTER=y CONFIG_HYPERVISOR_GUEST=y CONFIG_PARAVIRT=y CONFIG_PARAVIRT_XXL=y # CONFIG_PARAVIRT_DEBUG is not set CONFIG_PARAVIRT_SPINLOCKS=y CONFIG_X86_HV_CALLBACK_VECTOR=y CONFIG_XEN=y CONFIG_XEN_PV=y CONFIG_XEN_512GB=y CONFIG_XEN_PV_SMP=y CONFIG_XEN_PV_DOM0=y CONFIG_XEN_PVHVM=y CONFIG_XEN_PVHVM_SMP=y CONFIG_XEN_PVHVM_GUEST=y CONFIG_XEN_SAVE_RESTORE=y # CONFIG_XEN_DEBUG_FS is not set CONFIG_XEN_PVH=y CONFIG_XEN_DOM0=y CONFIG_XEN_PV_MSR_SAFE=y CONFIG_KVM_GUEST=y CONFIG_ARCH_CPUIDLE_HALTPOLL=y CONFIG_PVH=y # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set CONFIG_PARAVIRT_CLOCK=y # CONFIG_JAILHOUSE_GUEST is not set # CONFIG_ACRN_GUEST is not set CONFIG_INTEL_TDX_GUEST=y # CONFIG_MK8 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_MATOM is not set CONFIG_GENERIC_CPU=y CONFIG_X86_INTERNODE_CACHE_SHIFT=6 CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_TSC=y CONFIG_X86_HAVE_PAE=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=64 CONFIG_X86_DEBUGCTLMSR=y CONFIG_IA32_FEAT_CTL=y CONFIG_X86_VMX_FEATURE_NAMES=y # CONFIG_PROCESSOR_SELECT is not set CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_HYGON=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_CPU_SUP_ZHAOXIN=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y CONFIG_GART_IOMMU=y CONFIG_BOOT_VESA_SUPPORT=y CONFIG_MAXSMP=y CONFIG_NR_CPUS_RANGE_BEGIN=8192 CONFIG_NR_CPUS_RANGE_END=8192 CONFIG_NR_CPUS_DEFAULT=8192 CONFIG_NR_CPUS=8192 CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y CONFIG_X86_MCE=y # CONFIG_X86_MCELOG_LEGACY is not set CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_AMD=y CONFIG_X86_MCE_THRESHOLD=y # CONFIG_X86_MCE_INJECT is not set # # Performance monitoring # CONFIG_PERF_EVENTS_INTEL_UNCORE=m CONFIG_PERF_EVENTS_INTEL_RAPL=m CONFIG_PERF_EVENTS_INTEL_CSTATE=m # CONFIG_PERF_EVENTS_AMD_POWER is not set CONFIG_PERF_EVENTS_AMD_UNCORE=y # CONFIG_PERF_EVENTS_AMD_BRS is not set # end of Performance monitoring CONFIG_X86_16BIT=y CONFIG_X86_ESPFIX64=y CONFIG_X86_VSYSCALL_EMULATION=y CONFIG_X86_IOPL_IOPERM=y CONFIG_MICROCODE=y # CONFIG_MICROCODE_LATE_LOADING is not set CONFIG_X86_MSR=m CONFIG_X86_CPUID=m CONFIG_X86_5LEVEL=y CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_X86_CPA_STATISTICS is not set CONFIG_X86_MEM_ENCRYPT=y CONFIG_AMD_MEM_ENCRYPT=y CONFIG_NUMA=y CONFIG_AMD_NUMA=y CONFIG_X86_64_ACPI_NUMA=y CONFIG_NUMA_EMU=y CONFIG_NODES_SHIFT=10 CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y # CONFIG_ARCH_MEMORY_PROBE is not set CONFIG_ARCH_PROC_KCORE_TEXT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 # CONFIG_X86_PMEM_LEGACY is not set # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set CONFIG_MTRR=y CONFIG_MTRR_SANITIZER=y CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 CONFIG_X86_PAT=y CONFIG_ARCH_USES_PG_UNCACHED=y CONFIG_X86_UMIP=y CONFIG_CC_HAS_IBT=y CONFIG_X86_CET=y CONFIG_X86_KERNEL_IBT=y CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set # CONFIG_X86_INTEL_TSX_MODE_AUTO is not set CONFIG_X86_SGX=y # CONFIG_X86_USER_SHADOW_STACK is not set CONFIG_EFI=y CONFIG_EFI_STUB=y CONFIG_EFI_HANDOVER_PROTOCOL=y CONFIG_EFI_MIXED=y # CONFIG_EFI_FAKE_MEMMAP is not set CONFIG_EFI_RUNTIME_MAP=y # CONFIG_HZ_100 is not set CONFIG_HZ_250=y # CONFIG_HZ_300 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=250 CONFIG_SCHED_HRTICK=y CONFIG_ARCH_SUPPORTS_KEXEC=y CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y CONFIG_ARCH_SELECTS_KEXEC_FILE=y CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y CONFIG_ARCH_SUPPORTS_KEXEC_SIG_FORCE=y CONFIG_ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG=y CONFIG_ARCH_SUPPORTS_KEXEC_JUMP=y CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y CONFIG_ARCH_SUPPORTS_CRASH_HOTPLUG=y CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION=y CONFIG_PHYSICAL_START=0x1000000 CONFIG_RELOCATABLE=y CONFIG_RANDOMIZE_BASE=y CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x200000 CONFIG_DYNAMIC_MEMORY_LAYOUT=y CONFIG_RANDOMIZE_MEMORY=y CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0xa # CONFIG_ADDRESS_MASKING is not set CONFIG_HOTPLUG_CPU=y # CONFIG_COMPAT_VDSO is not set # CONFIG_LEGACY_VSYSCALL_XONLY is not set CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set CONFIG_MODIFY_LDT_SYSCALL=y # CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y CONFIG_LIVEPATCH=y # end of Processor type and features CONFIG_CC_HAS_NAMED_AS=y CONFIG_USE_X86_SEG_SUPPORT=y CONFIG_CC_HAS_SLS=y CONFIG_CC_HAS_RETURN_THUNK=y CONFIG_CC_HAS_ENTRY_PADDING=y CONFIG_FUNCTION_PADDING_CFI=11 CONFIG_FUNCTION_PADDING_BYTES=16 CONFIG_CALL_PADDING=y CONFIG_HAVE_CALL_THUNKS=y CONFIG_CALL_THUNKS=y CONFIG_PREFIX_SYMBOLS=y CONFIG_SPECULATION_MITIGATIONS=y CONFIG_MITIGATION_PAGE_TABLE_ISOLATION=y CONFIG_MITIGATION_RETPOLINE=y CONFIG_MITIGATION_RETHUNK=y CONFIG_MITIGATION_UNRET_ENTRY=y CONFIG_MITIGATION_CALL_DEPTH_TRACKING=y # CONFIG_CALL_THUNKS_DEBUG is not set CONFIG_MITIGATION_IBPB_ENTRY=y CONFIG_MITIGATION_IBRS_ENTRY=y CONFIG_MITIGATION_SRSO=y # CONFIG_MITIGATION_SLS is not set # CONFIG_MITIGATION_GDS_FORCE is not set CONFIG_MITIGATION_RFDS=y CONFIG_ARCH_HAS_ADD_PAGES=y # # Power management and ACPI options # CONFIG_ARCH_HIBERNATION_HEADER=y CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y # CONFIG_SUSPEND_SKIP_SYNC is not set CONFIG_HIBERNATE_CALLBACKS=y CONFIG_HIBERNATION=y CONFIG_HIBERNATION_SNAPSHOT_DEV=y CONFIG_HIBERNATION_COMP_LZO=y CONFIG_HIBERNATION_DEF_COMP="lzo" CONFIG_PM_STD_PARTITION="" CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_USERSPACE_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y # CONFIG_PM_TEST_SUSPEND is not set CONFIG_PM_SLEEP_DEBUG=y # CONFIG_DPM_WATCHDOG is not set # CONFIG_PM_TRACE_RTC is not set CONFIG_PM_CLK=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_ENERGY_MODEL=y CONFIG_ARCH_SUPPORTS_ACPI=y CONFIG_ACPI=y CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y CONFIG_ACPI_THERMAL_LIB=y CONFIG_ACPI_DEBUGGER=y CONFIG_ACPI_DEBUGGER_USER=m CONFIG_ACPI_SPCR_TABLE=y # CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_SLEEP=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=m CONFIG_ACPI_BATTERY=m CONFIG_ACPI_BUTTON=m # CONFIG_ACPI_TINY_POWER_BUTTON is not set CONFIG_ACPI_VIDEO=m CONFIG_ACPI_FAN=m # CONFIG_ACPI_TAD is not set CONFIG_ACPI_DOCK=y CONFIG_ACPI_CPU_FREQ_PSS=y CONFIG_ACPI_PROCESSOR_CSTATE=y CONFIG_ACPI_PROCESSOR_IDLE=y CONFIG_ACPI_CPPC_LIB=y CONFIG_ACPI_PROCESSOR=y CONFIG_ACPI_HOTPLUG_CPU=y CONFIG_ACPI_PROCESSOR_AGGREGATOR=m CONFIG_ACPI_THERMAL=y CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y CONFIG_ACPI_TABLE_UPGRADE=y CONFIG_ACPI_DEBUG=y CONFIG_ACPI_PCI_SLOT=y CONFIG_ACPI_CONTAINER=y CONFIG_ACPI_HOTPLUG_MEMORY=y CONFIG_ACPI_HOTPLUG_IOAPIC=y # CONFIG_ACPI_SBS is not set CONFIG_ACPI_HED=y CONFIG_ACPI_BGRT=y # CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set # CONFIG_ACPI_NFIT is not set CONFIG_ACPI_NUMA=y CONFIG_ACPI_HMAT=y CONFIG_HAVE_ACPI_APEI=y CONFIG_HAVE_ACPI_APEI_NMI=y CONFIG_ACPI_APEI=y CONFIG_ACPI_APEI_GHES=y CONFIG_ACPI_APEI_PCIEAER=y CONFIG_ACPI_APEI_MEMORY_FAILURE=y # CONFIG_ACPI_APEI_EINJ is not set # CONFIG_ACPI_APEI_ERST_DEBUG is not set # CONFIG_ACPI_DPTF is not set CONFIG_ACPI_EXTLOG=y # CONFIG_ACPI_CONFIGFS is not set # CONFIG_ACPI_PFRUT is not set CONFIG_ACPI_PCC=y # CONFIG_ACPI_FFH is not set CONFIG_PMIC_OPREGION=y CONFIG_BYTCRC_PMIC_OPREGION=y CONFIG_CHTCRC_PMIC_OPREGION=y CONFIG_CHT_WC_PMIC_OPREGION=y CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set CONFIG_X86_AMD_PSTATE=y CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3 # CONFIG_X86_AMD_PSTATE_UT is not set CONFIG_X86_ACPI_CPUFREQ=m CONFIG_X86_ACPI_CPUFREQ_CPB=y # CONFIG_X86_POWERNOW_K8 is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set # # shared options # # end of CPU Frequency scaling # # CPU Idle # CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_GOV_LADDER=y CONFIG_CPU_IDLE_GOV_MENU=y # CONFIG_CPU_IDLE_GOV_TEO is not set CONFIG_CPU_IDLE_GOV_HALTPOLL=y CONFIG_HALTPOLL_CPUIDLE=y # end of CPU Idle CONFIG_INTEL_IDLE=y # end of Power management and ACPI options # # Bus options (PCI etc.) # CONFIG_PCI_DIRECT=y CONFIG_PCI_MMCONFIG=y CONFIG_PCI_XEN=y CONFIG_MMCONF_FAM10H=y # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y CONFIG_AMD_NB=y # end of Bus options (PCI etc.) # # Binary Emulations # CONFIG_IA32_EMULATION=y # CONFIG_IA32_EMULATION_DEFAULT_DISABLED is not set CONFIG_X86_X32_ABI=y CONFIG_COMPAT_32=y CONFIG_COMPAT=y CONFIG_COMPAT_FOR_U64_ALIGNMENT=y # end of Binary Emulations CONFIG_KVM_COMMON=y CONFIG_HAVE_KVM_PFNCACHE=y CONFIG_HAVE_KVM_IRQCHIP=y CONFIG_HAVE_KVM_IRQ_ROUTING=y CONFIG_HAVE_KVM_DIRTY_RING=y CONFIG_HAVE_KVM_DIRTY_RING_TSO=y CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y CONFIG_KVM_MMIO=y CONFIG_KVM_ASYNC_PF=y CONFIG_HAVE_KVM_MSI=y CONFIG_HAVE_KVM_READONLY_MEM=y CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y CONFIG_KVM_VFIO=y CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y CONFIG_KVM_COMPAT=y CONFIG_HAVE_KVM_IRQ_BYPASS=y CONFIG_HAVE_KVM_NO_POLL=y CONFIG_KVM_XFER_TO_GUEST_WORK=y CONFIG_HAVE_KVM_PM_NOTIFIER=y CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y CONFIG_KVM_GENERIC_MMU_NOTIFIER=y CONFIG_VIRTUALIZATION=y CONFIG_KVM=m CONFIG_KVM_WERROR=y # CONFIG_KVM_SW_PROTECTED_VM is not set CONFIG_KVM_INTEL=m CONFIG_X86_SGX_KVM=y # CONFIG_KVM_AMD is not set CONFIG_KVM_SMM=y CONFIG_KVM_HYPERV=y # CONFIG_KVM_XEN is not set # CONFIG_KVM_PROVE_MMU is not set CONFIG_KVM_MAX_NR_VCPUS=4096 CONFIG_AS_AVX512=y CONFIG_AS_SHA1_NI=y CONFIG_AS_SHA256_NI=y CONFIG_AS_TPAUSE=y CONFIG_AS_GFNI=y CONFIG_AS_WRUSS=y # # General architecture-dependent options # CONFIG_HOTPLUG_SMT=y CONFIG_HOTPLUG_CORE_SYNC=y CONFIG_HOTPLUG_CORE_SYNC_DEAD=y CONFIG_HOTPLUG_CORE_SYNC_FULL=y CONFIG_HOTPLUG_SPLIT_STARTUP=y CONFIG_HOTPLUG_PARALLEL=y CONFIG_GENERIC_ENTRY=y CONFIG_KPROBES=y CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set # CONFIG_STATIC_CALL_SELFTEST is not set CONFIG_OPTPROBES=y CONFIG_KPROBES_ON_FTRACE=y CONFIG_UPROBES=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_KRETPROBES=y CONFIG_KRETPROBE_ON_RETHOOK=y CONFIG_USER_RETURN_NOTIFIER=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_ARCH_HAS_CPU_PASID=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y CONFIG_HAVE_USER_RETURN_NOTIFIER=y CONFIG_HAVE_PERF_EVENTS_NMI=y CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y CONFIG_MMU_GATHER_TABLE_FREE=y CONFIG_MMU_GATHER_RCU_TABLE_FREE=y CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_MMU_LAZY_TLB_REFCOUNT=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y CONFIG_HAVE_ARCH_SECCOMP=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG=y CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y CONFIG_LTO_NONE=y CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y CONFIG_HAVE_CONTEXT_TRACKING_USER=y CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_ARCH_WANT_PMD_MKWRITE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8 CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES=y CONFIG_HAVE_PAGE_SIZE_4KB=y CONFIG_PAGE_SIZE_4KB=y CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_PAGE_SHIFT=12 CONFIG_HAVE_OBJTOOL=y CONFIG_HAVE_JUMP_LABEL_HACK=y CONFIG_HAVE_NOINSTR_HACK=y CONFIG_HAVE_NOINSTR_VALIDATION=y CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET=y CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_USE_MEMREMAP_PROT=y # CONFIG_LOCK_EVENT_COUNTS is not set CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_ARCH_HAS_CC_PLATFORM=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y CONFIG_HAVE_PREEMPT_DYNAMIC=y CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y CONFIG_ARCH_HAS_ELFCORE_COMPAT=y CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y CONFIG_DYNAMIC_SIGFRAME=y CONFIG_HAVE_ARCH_NODE_DEV_GROUP=y CONFIG_ARCH_HAS_HW_PTE_YOUNG=y CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y CONFIG_FUNCTION_ALIGNMENT_4B=y CONFIG_FUNCTION_ALIGNMENT_16B=y CONFIG_FUNCTION_ALIGNMENT=16 # end of General architecture-dependent options CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_DEBUG is not set CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set CONFIG_MODVERSIONS=y CONFIG_ASM_MODVERSIONS=y # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS_NONE is not set # CONFIG_MODULE_COMPRESS_GZIP is not set CONFIG_MODULE_COMPRESS_XZ=y # CONFIG_MODULE_COMPRESS_ZSTD is not set CONFIG_MODULE_DECOMPRESS=y # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODPROBE_PATH="/sbin/modprobe" # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLOCK_LEGACY_AUTOLOAD=y CONFIG_BLK_RQ_ALLOC_TIME=y CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y CONFIG_BLK_DEV_INTEGRITY=y CONFIG_BLK_DEV_INTEGRITY_T10=m CONFIG_BLK_DEV_WRITE_MOUNTED=y CONFIG_BLK_DEV_ZONED=y CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_DEV_THROTTLING_LOW is not set CONFIG_BLK_WBT=y CONFIG_BLK_WBT_MQ=y # CONFIG_BLK_CGROUP_IOLATENCY is not set CONFIG_BLK_CGROUP_IOCOST=y # CONFIG_BLK_CGROUP_IOPRIO is not set CONFIG_BLK_DEBUG_FS=y CONFIG_BLK_DEBUG_FS_ZONED=y CONFIG_BLK_SED_OPAL=y # CONFIG_BLK_INLINE_ENCRYPTION is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y CONFIG_ACORN_PARTITION=y # CONFIG_ACORN_PARTITION_CUMANA is not set # CONFIG_ACORN_PARTITION_EESOX is not set CONFIG_ACORN_PARTITION_ICS=y # CONFIG_ACORN_PARTITION_ADFS is not set # CONFIG_ACORN_PARTITION_POWERTEC is not set CONFIG_ACORN_PARTITION_RISCIX=y # CONFIG_AIX_PARTITION is not set CONFIG_OSF_PARTITION=y CONFIG_AMIGA_PARTITION=y CONFIG_ATARI_PARTITION=y CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y CONFIG_BSD_DISKLABEL=y CONFIG_MINIX_SUBPARTITION=y CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set CONFIG_SGI_PARTITION=y CONFIG_ULTRIX_PARTITION=y CONFIG_SUN_PARTITION=y CONFIG_KARMA_PARTITION=y CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set # end of Partition Types CONFIG_BLK_MQ_PCI=y CONFIG_BLK_MQ_VIRTIO=y CONFIG_BLK_PM=y CONFIG_BLOCK_HOLDER_DEPRECATED=y CONFIG_BLK_MQ_STACKING=y # # IO Schedulers # CONFIG_MQ_IOSCHED_DEADLINE=y # CONFIG_MQ_IOSCHED_KYBER is not set # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers CONFIG_PREEMPT_NOTIFIERS=y CONFIG_PADATA=y CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y CONFIG_FREEZER=y # # Executable file formats # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y CONFIG_BINFMT_MISC=m CONFIG_COREDUMP=y # end of Executable file formats # # Memory Management options # CONFIG_ZPOOL=y CONFIG_SWAP=y CONFIG_ZSWAP=y # CONFIG_ZSWAP_DEFAULT_ON is not set # CONFIG_ZSWAP_SHRINKER_DEFAULT_ON is not set # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 is not set # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD is not set CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lzo" # CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD is not set # CONFIG_ZSWAP_ZPOOL_DEFAULT_Z3FOLD is not set CONFIG_ZSWAP_ZPOOL_DEFAULT_ZSMALLOC=y CONFIG_ZSWAP_ZPOOL_DEFAULT="zsmalloc" CONFIG_ZBUD=y # CONFIG_Z3FOLD is not set CONFIG_ZSMALLOC=y # CONFIG_ZSMALLOC_STAT is not set CONFIG_ZSMALLOC_CHAIN_SIZE=8 # # Slab allocator options # CONFIG_SLUB=y # CONFIG_SLUB_TINY is not set CONFIG_SLAB_MERGE_DEFAULT=y CONFIG_SLAB_FREELIST_RANDOM=y CONFIG_SLAB_FREELIST_HARDENED=y # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_RANDOM_KMALLOC_CACHES is not set # end of Slab allocator options CONFIG_SHUFFLE_PAGE_ALLOCATOR=y # CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y CONFIG_NUMA_KEEP_MEMINFO=y CONFIG_MEMORY_ISOLATION=y CONFIG_EXCLUSIVE_SYSTEM_RAM=y CONFIG_HAVE_BOOTMEM_INFO_NODE=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE=y CONFIG_MEMORY_HOTREMOVE=y CONFIG_MHP_MEMMAP_ON_MEMORY=y CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_COMPACTION=y CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 CONFIG_PAGE_REPORTING=y CONFIG_MIGRATION=y CONFIG_DEVICE_MIGRATION=y CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PCP_BATCH_SCALE_MAX=5 CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_MMU_NOTIFIER=y CONFIG_KSM=y CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y CONFIG_MEMORY_FAILURE=y # CONFIG_HWPOISON_INJECT is not set CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set # CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set CONFIG_THP_SWAP=y # CONFIG_READ_ONLY_THP_FOR_FS is not set CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_USE_PERCPU_NUMA_NODE_ID=y CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set CONFIG_MEM_SOFT_DIRTY=y CONFIG_GENERIC_EARLY_IOREMAP=y CONFIG_DEFERRED_STRUCT_PAGE_INIT=y # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ARCH_HAS_ZONE_DMA_SET=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_ZONE_DEVICE=y CONFIG_GET_FREE_REGION=y # CONFIG_DEVICE_PRIVATE is not set CONFIG_VMAP_PFN=y CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y CONFIG_ARCH_HAS_PKEYS=y CONFIG_VM_EVENT_COUNTERS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set # CONFIG_DMAPOOL_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_MEMFD_CREATE=y CONFIG_SECRETMEM=y # CONFIG_ANON_VMA_NAME is not set CONFIG_HAVE_ARCH_USERFAULTFD_WP=y CONFIG_HAVE_ARCH_USERFAULTFD_MINOR=y CONFIG_USERFAULTFD=y CONFIG_PTE_MARKER_UFFD_WP=y CONFIG_LRU_GEN=y CONFIG_LRU_GEN_ENABLED=y # CONFIG_LRU_GEN_STATS is not set CONFIG_LRU_GEN_WALKS_MMU=y CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y CONFIG_PER_VMA_LOCK=y CONFIG_LOCK_MM_AND_FIND_VMA=y CONFIG_IOMMU_MM_DATA=y # # Data Access Monitoring # # CONFIG_DAMON is not set # end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_NET_XGRESS=y CONFIG_SKB_EXTENSIONS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=m CONFIG_XFRM_USER=m # CONFIG_XFRM_USER_COMPAT is not set CONFIG_XFRM_INTERFACE=m CONFIG_XFRM_SUB_POLICY=y CONFIG_XFRM_MIGRATE=y CONFIG_XFRM_STATISTICS=y CONFIG_XFRM_ESP=m CONFIG_XFRM_IPCOMP=m # CONFIG_NET_KEY is not set CONFIG_XDP_SOCKETS=y # CONFIG_XDP_SOCKETS_DIAG is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_FIB_TRIE_STATS=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=m CONFIG_NET_IPGRE_DEMUX=m CONFIG_NET_IP_TUNNEL=m # CONFIG_NET_IPGRE is not set CONFIG_IP_MROUTE_COMMON=y CONFIG_IP_MROUTE=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y CONFIG_SYN_COOKIES=y # CONFIG_NET_IPVTI is not set CONFIG_NET_UDP_TUNNEL=m CONFIG_NET_FOU=m CONFIG_NET_FOU_IP_TUNNELS=y # CONFIG_INET_AH is not set CONFIG_INET_ESP=m # CONFIG_INET_ESP_OFFLOAD is not set # CONFIG_INET_ESPINTCP is not set # CONFIG_INET_IPCOMP is not set CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=m # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set # CONFIG_TCP_CONG_HTCP is not set # CONFIG_TCP_CONG_HSTCP is not set # CONFIG_TCP_CONG_HYBLA is not set # CONFIG_TCP_CONG_VEGAS is not set # CONFIG_TCP_CONG_NV is not set # CONFIG_TCP_CONG_SCALABLE is not set # CONFIG_TCP_CONG_LP is not set # CONFIG_TCP_CONG_VENO is not set # CONFIG_TCP_CONG_YEAH is not set # CONFIG_TCP_CONG_ILLINOIS is not set # CONFIG_TCP_CONG_DCTCP is not set # CONFIG_TCP_CONG_CDG is not set # CONFIG_TCP_CONG_BBR is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" CONFIG_TCP_SIGPOOL=y # CONFIG_TCP_AO is not set CONFIG_TCP_MD5SIG=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y CONFIG_IPV6_OPTIMISTIC_DAD=y # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set CONFIG_INET6_IPCOMP=m CONFIG_IPV6_MIP6=y # CONFIG_IPV6_ILA is not set CONFIG_INET6_XFRM_TUNNEL=m CONFIG_INET6_TUNNEL=m # CONFIG_IPV6_VTI is not set # CONFIG_IPV6_SIT is not set CONFIG_IPV6_TUNNEL=m # CONFIG_IPV6_GRE is not set CONFIG_IPV6_FOU=m CONFIG_IPV6_FOU_TUNNEL=m CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_SUBTREES=y CONFIG_IPV6_MROUTE=y CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_IPV6_PIMSM_V2=y CONFIG_IPV6_SEG6_LWTUNNEL=y CONFIG_IPV6_SEG6_HMAC=y CONFIG_IPV6_SEG6_BPF=y # CONFIG_IPV6_RPL_LWTUNNEL is not set # CONFIG_IPV6_IOAM6_LWTUNNEL is not set CONFIG_NETLABEL=y CONFIG_MPTCP=y CONFIG_MPTCP_IPV6=y CONFIG_NETWORK_SECMARK=y CONFIG_NET_PTP_CLASSIFY=y CONFIG_NETWORK_PHY_TIMESTAMPING=y CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_EGRESS=y CONFIG_NETFILTER_SKIP_EGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_BPF_LINK=y CONFIG_NETFILTER_NETLINK_ACCT=m # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set # CONFIG_NETFILTER_NETLINK_OSF is not set # CONFIG_NF_CONNTRACK is not set # CONFIG_NF_LOG_SYSLOG is not set # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=m # CONFIG_NETFILTER_XTABLES_COMPAT is not set # # Xtables combined modules # # CONFIG_NETFILTER_XT_MARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_AUDIT is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_SECMARK is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # # Xtables matches # # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # end of Core Netfilter Configuration # CONFIG_IP_SET is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set # CONFIG_NF_REJECT_IPV4 is not set CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_TTL is not set # CONFIG_IP_NF_FILTER is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_SECURITY is not set # CONFIG_IP_NF_ARPFILTER is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set # CONFIG_NF_REJECT_IPV6 is not set # CONFIG_NF_LOG_IPV6 is not set # CONFIG_IP6_NF_IPTABLES is not set # end of IPv6: Netfilter Configuration # CONFIG_IP_DCCP is not set CONFIG_IP_SCTP=m # CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5 is not set CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1=y # CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set CONFIG_SCTP_COOKIE_HMAC_MD5=y CONFIG_SCTP_COOKIE_HMAC_SHA1=y # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set CONFIG_L2TP=m # CONFIG_L2TP_DEBUGFS is not set CONFIG_L2TP_V3=y # CONFIG_L2TP_IP is not set # CONFIG_L2TP_ETH is not set # CONFIG_BRIDGE is not set # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_SKBPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set CONFIG_NET_SCH_FQ_CODEL=y # CONFIG_NET_SCH_CAKE is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_INGRESS is not set # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set CONFIG_NET_SCH_DEFAULT=y CONFIG_DEFAULT_FQ_CODEL=y # CONFIG_DEFAULT_PFIFO_FAST is not set CONFIG_DEFAULT_NET_SCH="fq_codel" # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_FLOW is not set # CONFIG_NET_CLS_CGROUP is not set # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 # CONFIG_NET_EMATCH_CMP is not set # CONFIG_NET_EMATCH_NBYTE is not set # CONFIG_NET_EMATCH_U32 is not set # CONFIG_NET_EMATCH_META is not set # CONFIG_NET_EMATCH_TEXT is not set # CONFIG_NET_EMATCH_IPT is not set CONFIG_NET_CLS_ACT=y # CONFIG_NET_ACT_POLICE is not set # CONFIG_NET_ACT_GACT is not set # CONFIG_NET_ACT_MIRRED is not set # CONFIG_NET_ACT_SAMPLE is not set # CONFIG_NET_ACT_NAT is not set # CONFIG_NET_ACT_PEDIT is not set # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set # CONFIG_NET_ACT_CSUM is not set # CONFIG_NET_ACT_MPLS is not set # CONFIG_NET_ACT_VLAN is not set # CONFIG_NET_ACT_BPF is not set # CONFIG_NET_ACT_SKBMOD is not set # CONFIG_NET_ACT_IFE is not set # CONFIG_NET_ACT_TUNNEL_KEY is not set # CONFIG_NET_ACT_GATE is not set # CONFIG_NET_TC_SKB_EXT is not set CONFIG_NET_SCH_FIFO=y CONFIG_DCB=y # CONFIG_DNS_RESOLVER is not set # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set CONFIG_MPLS=y CONFIG_NET_MPLS_GSO=y # CONFIG_MPLS_ROUTING is not set # CONFIG_NET_NSH is not set # CONFIG_HSR is not set CONFIG_NET_SWITCHDEV=y CONFIG_NET_L3_MASTER_DEV=y CONFIG_QRTR=m # CONFIG_QRTR_TUN is not set # CONFIG_NET_NCSI is not set CONFIG_PCPU_DEV_REFCNT=y CONFIG_MAX_SKB_FRAGS=17 CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y CONFIG_BPF_STREAM_PARSER=y CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_DROP_MONITOR is not set # end of Network testing # end of Networking options CONFIG_HAMRADIO=y # # Packet Radio protocols # # CONFIG_AX25 is not set # CONFIG_CAN is not set CONFIG_BT=m CONFIG_BT_BREDR=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y # CONFIG_BT_BNEP is not set # CONFIG_BT_CMTP is not set CONFIG_BT_HIDP=m CONFIG_BT_LE=y CONFIG_BT_LE_L2CAP_ECRED=y CONFIG_BT_LEDS=y # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set CONFIG_BT_DEBUGFS=y # CONFIG_BT_SELFTEST is not set # # Bluetooth device drivers # CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y CONFIG_BT_HCIBTUSB_POLL_SYNC=y CONFIG_BT_HCIBTUSB_BCM=y # CONFIG_BT_HCIBTUSB_MTK is not set CONFIG_BT_HCIBTUSB_RTL=y CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_SERDEV=y CONFIG_BT_HCIUART_H4=y # CONFIG_BT_HCIUART_NOKIA is not set # CONFIG_BT_HCIUART_BCSP is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_LL is not set # CONFIG_BT_HCIUART_3WIRE is not set # CONFIG_BT_HCIUART_INTEL is not set # CONFIG_BT_HCIUART_BCM is not set # CONFIG_BT_HCIUART_RTL is not set CONFIG_BT_HCIUART_QCA=y # CONFIG_BT_HCIUART_AG6XX is not set # CONFIG_BT_HCIUART_MRVL is not set # CONFIG_BT_HCIBCM203X is not set # CONFIG_BT_HCIBCM4377 is not set # CONFIG_BT_HCIBPA10X is not set # CONFIG_BT_HCIBFUSB is not set # CONFIG_BT_HCIVHCI is not set # CONFIG_BT_MRVL is not set # CONFIG_BT_ATH3K is not set # CONFIG_BT_MTKUART is not set CONFIG_BT_VIRTIO=m # CONFIG_BT_NXPUART is not set # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set CONFIG_STREAM_PARSER=y # CONFIG_MCTP is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_CERTIFICATION_ONUS is not set CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set CONFIG_CFG80211_CRDA_SUPPORT=y CONFIG_CFG80211_WEXT=y CONFIG_MAC80211=m CONFIG_MAC80211_HAS_RC=y CONFIG_MAC80211_RC_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" CONFIG_MAC80211_MESH=y CONFIG_MAC80211_LEDS=y # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set # CONFIG_PSAMPLE is not set # CONFIG_NET_IFE is not set CONFIG_LWTUNNEL=y CONFIG_LWTUNNEL_BPF=y CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_NET_SELFTESTS=y CONFIG_NET_SOCK_MSG=y CONFIG_PAGE_POOL=y # CONFIG_PAGE_POOL_STATS is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y # # Device Drivers # CONFIG_HAVE_EISA=y # CONFIG_EISA is not set CONFIG_HAVE_PCI=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_PCIEPORTBUS=y CONFIG_HOTPLUG_PCI_PCIE=y CONFIG_PCIEAER=y # CONFIG_PCIEAER_INJECT is not set # CONFIG_PCIE_ECRC is not set CONFIG_PCIEASPM=y CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y CONFIG_PCIE_DPC=y CONFIG_PCIE_PTM=y # CONFIG_PCIE_EDR is not set CONFIG_PCI_MSI=y CONFIG_PCI_QUIRKS=y # CONFIG_PCI_DEBUG is not set CONFIG_PCI_REALLOC_ENABLE_AUTO=y # CONFIG_PCI_STUB is not set # CONFIG_PCI_PF_STUB is not set # CONFIG_XEN_PCIDEV_FRONTEND is not set CONFIG_PCI_ATS=y CONFIG_PCI_DOE=y CONFIG_PCI_LOCKLESS_CONFIG=y CONFIG_PCI_IOV=y CONFIG_PCI_PRI=y CONFIG_PCI_PASID=y # CONFIG_PCI_P2PDMA is not set CONFIG_PCI_LABEL=y # CONFIG_PCIE_BUS_TUNE_OFF is not set CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 CONFIG_HOTPLUG_PCI=y CONFIG_HOTPLUG_PCI_ACPI=y # CONFIG_HOTPLUG_PCI_ACPI_IBM is not set CONFIG_HOTPLUG_PCI_CPCI=y # CONFIG_HOTPLUG_PCI_CPCI_ZT5550 is not set # CONFIG_HOTPLUG_PCI_CPCI_GENERIC is not set CONFIG_HOTPLUG_PCI_SHPC=y # # PCI controller drivers # # CONFIG_VMD is not set # # Cadence-based PCIe controllers # # end of Cadence-based PCIe controllers # # DesignWare-based PCIe controllers # # CONFIG_PCI_MESON is not set # CONFIG_PCIE_DW_PLAT_HOST is not set # end of DesignWare-based PCIe controllers # # Mobiveil-based PCIe controllers # # end of Mobiveil-based PCIe controllers # end of PCI controller drivers # # PCI Endpoint # # CONFIG_PCI_ENDPOINT is not set # end of PCI Endpoint # # PCI switch controller drivers # # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers CONFIG_CXL_BUS=y # CONFIG_CXL_PCI is not set # CONFIG_CXL_ACPI is not set CONFIG_CXL_PORT=y CONFIG_CXL_REGION=y # CONFIG_CXL_REGION_INVALIDATION_TEST is not set CONFIG_CXL_PMU=y # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set # # Generic Driver Options # CONFIG_AUXILIARY_BUS=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y # CONFIG_DEVTMPFS_MOUNT is not set # CONFIG_DEVTMPFS_SAFE is not set CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # # Firmware loader # CONFIG_FW_LOADER=y CONFIG_FW_LOADER_DEBUG=y CONFIG_FW_LOADER_PAGED_BUF=y CONFIG_FW_LOADER_SYSFS=y CONFIG_EXTRA_FIRMWARE="" CONFIG_FW_LOADER_USER_HELPER=y # CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set CONFIG_FW_LOADER_COMPRESS=y CONFIG_FW_LOADER_COMPRESS_XZ=y # CONFIG_FW_LOADER_COMPRESS_ZSTD is not set CONFIG_FW_CACHE=y CONFIG_FW_UPLOAD=y # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y CONFIG_ALLOW_DEV_COREDUMP=y CONFIG_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set CONFIG_HMEM_REPORTING=y # CONFIG_TEST_ASYNC_DRIVER_PROBE is not set CONFIG_SYS_HYPERVISOR=y CONFIG_GENERIC_CPU_DEVICES=y CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=m CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set # CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set # end of Generic Driver Options # # Bus devices # # CONFIG_MHI_BUS is not set # CONFIG_MHI_BUS_EP is not set # end of Bus devices # # Cache Drivers # # end of Cache Drivers CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y # # Firmware Drivers # # # ARM System Control and Management Interface Protocol # # end of ARM System Control and Management Interface Protocol # CONFIG_EDD is not set CONFIG_FIRMWARE_MEMMAP=y CONFIG_DMIID=y CONFIG_DMI_SYSFS=y CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y # CONFIG_FW_CFG_SYSFS is not set CONFIG_SYSFB=y # CONFIG_SYSFB_SIMPLEFB is not set CONFIG_GOOGLE_FIRMWARE=y # CONFIG_GOOGLE_SMI is not set # CONFIG_GOOGLE_CBMEM is not set CONFIG_GOOGLE_COREBOOT_TABLE=y # CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY is not set CONFIG_GOOGLE_FRAMEBUFFER_COREBOOT=y # CONFIG_GOOGLE_MEMCONSOLE_COREBOOT is not set # CONFIG_GOOGLE_VPD is not set # # EFI (Extensible Firmware Interface) Support # CONFIG_EFI_ESRT=y CONFIG_EFI_VARS_PSTORE=m # CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE is not set CONFIG_EFI_SOFT_RESERVE=y CONFIG_EFI_DXE_MEM_ATTRIBUTES=y CONFIG_EFI_RUNTIME_WRAPPERS=y # CONFIG_EFI_BOOTLOADER_CONTROL is not set # CONFIG_EFI_CAPSULE_LOADER is not set # CONFIG_EFI_TEST is not set CONFIG_EFI_DEV_PATH_PARSER=y CONFIG_APPLE_PROPERTIES=y CONFIG_RESET_ATTACK_MITIGATION=y # CONFIG_EFI_RCI2_TABLE is not set # CONFIG_EFI_DISABLE_PCI_DMA is not set CONFIG_EFI_EARLYCON=y CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y # CONFIG_EFI_DISABLE_RUNTIME is not set # CONFIG_EFI_COCO_SECRET is not set CONFIG_UNACCEPTED_MEMORY=y # end of EFI (Extensible Firmware Interface) Support CONFIG_UEFI_CPER=y CONFIG_UEFI_CPER_X86=y # # Qualcomm firmware drivers # # end of Qualcomm firmware drivers # # Tegra firmware driver # # end of Tegra firmware driver # end of Firmware Drivers # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y CONFIG_PARPORT=m CONFIG_PARPORT_PC=m # CONFIG_PARPORT_SERIAL is not set # CONFIG_PARPORT_PC_FIFO is not set # CONFIG_PARPORT_PC_SUPERIO is not set CONFIG_PARPORT_1284=y CONFIG_PNP=y # CONFIG_PNP_DEBUG_MESSAGES is not set # # Protocols # CONFIG_PNPACPI=y CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set # CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set # CONFIG_ZRAM is not set CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_RAM is not set # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_XEN_BLKDEV_FRONTEND is not set # CONFIG_XEN_BLKDEV_BACKEND is not set # CONFIG_VIRTIO_BLK is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_UBLK is not set # # NVME Support # CONFIG_NVME_CORE=m CONFIG_BLK_DEV_NVME=m CONFIG_NVME_MULTIPATH=y # CONFIG_NVME_VERBOSE_ERRORS is not set CONFIG_NVME_HWMON=y # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set # CONFIG_NVME_HOST_AUTH is not set # CONFIG_NVME_TARGET is not set # end of NVME Support # # Misc devices # # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_IBM_ASM is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set # CONFIG_NSM is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set # CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set # CONFIG_EEPROM_93XX46 is not set # CONFIG_EEPROM_IDT_89HPESX is not set # CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # end of Texas Instruments shared transport line discipline # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set CONFIG_INTEL_MEI=m CONFIG_INTEL_MEI_ME=m # CONFIG_INTEL_MEI_TXE is not set # CONFIG_INTEL_MEI_GSC is not set # CONFIG_INTEL_MEI_VSC_HW is not set CONFIG_INTEL_MEI_HDCP=m CONFIG_INTEL_MEI_PXP=m # CONFIG_INTEL_MEI_GSC_PROXY is not set # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_UACCE is not set CONFIG_PVPANIC=y # CONFIG_PVPANIC_MMIO is not set # CONFIG_PVPANIC_PCI is not set # CONFIG_GP_PCI1XXXX is not set # end of Misc devices # # SCSI device support # CONFIG_SCSI_MOD=m # CONFIG_RAID_ATTRS is not set CONFIG_SCSI_COMMON=m CONFIG_SCSI=m CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=m # CONFIG_CHR_DEV_ST is not set # CONFIG_BLK_DEV_SR is not set # CONFIG_CHR_DEV_SG is not set # CONFIG_BLK_DEV_BSG is not set # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports # CONFIG_SCSI_LOWLEVEL is not set # CONFIG_SCSI_DH is not set # end of SCSI device support # CONFIG_ATA is not set CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_MD_BITMAP_FILE=y # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_DEBUG is not set # CONFIG_DM_UNSTRIPED is not set CONFIG_DM_CRYPT=m # CONFIG_DM_SNAPSHOT is not set # CONFIG_DM_THIN_PROVISIONING is not set # CONFIG_DM_CACHE is not set # CONFIG_DM_WRITECACHE is not set # CONFIG_DM_EBS is not set # CONFIG_DM_ERA is not set # CONFIG_DM_CLONE is not set # CONFIG_DM_MIRROR is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set # CONFIG_DM_DUST is not set CONFIG_DM_UEVENT=y # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_DM_INTEGRITY is not set # CONFIG_DM_ZONED is not set CONFIG_DM_AUDIT=y # CONFIG_DM_VDO is not set # CONFIG_TARGET_CORE is not set CONFIG_FUSION=y # CONFIG_FUSION_SPI is not set # CONFIG_FUSION_SAS is not set CONFIG_FUSION_MAX_SGE=128 # CONFIG_FUSION_LOGGING is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set # end of IEEE 1394 (FireWire) support # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y CONFIG_MII=m CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set # CONFIG_WIREGUARD is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set # CONFIG_NET_TEAM is not set # CONFIG_MACVLAN is not set # CONFIG_IPVLAN is not set # CONFIG_VXLAN is not set # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_AMT is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set # CONFIG_TUN is not set # CONFIG_TUN_VNET_CROSS_LE is not set # CONFIG_VETH is not set # CONFIG_VIRTIO_NET is not set # CONFIG_NLMON is not set # CONFIG_NETKIT is not set # CONFIG_NET_VRF is not set # CONFIG_ARCNET is not set CONFIG_ETHERNET=y CONFIG_NET_VENDOR_3COM=y # CONFIG_VORTEX is not set # CONFIG_TYPHOON is not set CONFIG_NET_VENDOR_ADAPTEC=y # CONFIG_ADAPTEC_STARFIRE is not set CONFIG_NET_VENDOR_AGERE=y # CONFIG_ET131X is not set CONFIG_NET_VENDOR_ALACRITECH=y # CONFIG_SLICOSS is not set CONFIG_NET_VENDOR_ALTEON=y # CONFIG_ACENIC is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y # CONFIG_ENA_ETHERNET is not set CONFIG_NET_VENDOR_AMD=y # CONFIG_AMD8111_ETH is not set # CONFIG_PCNET32 is not set # CONFIG_AMD_XGBE is not set # CONFIG_PDS_CORE is not set CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_AQTION is not set # CONFIG_NET_VENDOR_ARC is not set CONFIG_NET_VENDOR_ASIX=y # CONFIG_SPI_AX88796C is not set CONFIG_NET_VENDOR_ATHEROS=y # CONFIG_ATL2 is not set # CONFIG_ATL1 is not set # CONFIG_ATL1E is not set # CONFIG_ATL1C is not set # CONFIG_ALX is not set # CONFIG_CX_ECAT is not set CONFIG_NET_VENDOR_BROADCOM=y # CONFIG_B44 is not set # CONFIG_BCMGENET is not set # CONFIG_BNX2 is not set # CONFIG_CNIC is not set # CONFIG_TIGON3 is not set # CONFIG_BNX2X is not set # CONFIG_SYSTEMPORT is not set # CONFIG_BNXT is not set CONFIG_NET_VENDOR_CADENCE=y # CONFIG_MACB is not set CONFIG_NET_VENDOR_CAVIUM=y # CONFIG_THUNDER_NIC_PF is not set # CONFIG_THUNDER_NIC_VF is not set # CONFIG_THUNDER_NIC_BGX is not set # CONFIG_THUNDER_NIC_RGX is not set # CONFIG_CAVIUM_PTP is not set # CONFIG_LIQUIDIO is not set # CONFIG_LIQUIDIO_VF is not set CONFIG_NET_VENDOR_CHELSIO=y # CONFIG_CHELSIO_T1 is not set # CONFIG_CHELSIO_T3 is not set # CONFIG_CHELSIO_T4 is not set # CONFIG_CHELSIO_T4VF is not set CONFIG_NET_VENDOR_CISCO=y # CONFIG_ENIC is not set CONFIG_NET_VENDOR_CORTINA=y CONFIG_NET_VENDOR_DAVICOM=y # CONFIG_DM9051 is not set # CONFIG_DNET is not set CONFIG_NET_VENDOR_DEC=y CONFIG_NET_TULIP=y # CONFIG_DE2104X is not set # CONFIG_TULIP is not set # CONFIG_WINBOND_840 is not set # CONFIG_DM9102 is not set # CONFIG_ULI526X is not set CONFIG_NET_VENDOR_DLINK=y # CONFIG_DL2K is not set # CONFIG_SUNDANCE is not set CONFIG_NET_VENDOR_EMULEX=y # CONFIG_BE2NET is not set CONFIG_NET_VENDOR_ENGLEDER=y # CONFIG_TSNEP is not set CONFIG_NET_VENDOR_EZCHIP=y CONFIG_NET_VENDOR_FUNGIBLE=y # CONFIG_FUN_ETH is not set CONFIG_NET_VENDOR_GOOGLE=y # CONFIG_GVE is not set CONFIG_NET_VENDOR_HUAWEI=y # CONFIG_HINIC is not set CONFIG_NET_VENDOR_I825XX=y CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set # CONFIG_E1000 is not set # CONFIG_E1000E is not set # CONFIG_IGB is not set # CONFIG_IGBVF is not set # CONFIG_IXGBE is not set # CONFIG_IXGBEVF is not set # CONFIG_I40E is not set # CONFIG_I40EVF is not set # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set # CONFIG_IDPF is not set # CONFIG_JME is not set CONFIG_NET_VENDOR_ADI=y # CONFIG_ADIN1110 is not set CONFIG_NET_VENDOR_LITEX=y CONFIG_NET_VENDOR_MARVELL=y # CONFIG_MVMDIO is not set # CONFIG_SKGE is not set # CONFIG_SKY2 is not set # CONFIG_OCTEON_EP is not set # CONFIG_OCTEON_EP_VF is not set CONFIG_NET_VENDOR_MELLANOX=y # CONFIG_MLX4_EN is not set # CONFIG_MLX5_CORE is not set # CONFIG_MLXSW_CORE is not set # CONFIG_MLXFW is not set CONFIG_NET_VENDOR_MICREL=y # CONFIG_KS8842 is not set # CONFIG_KS8851 is not set # CONFIG_KS8851_MLL is not set # CONFIG_KSZ884X_PCI is not set CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_ENC28J60 is not set # CONFIG_ENCX24J600 is not set # CONFIG_LAN743X is not set # CONFIG_VCAP is not set CONFIG_NET_VENDOR_MICROSEMI=y CONFIG_NET_VENDOR_MICROSOFT=y CONFIG_NET_VENDOR_MYRI=y # CONFIG_MYRI10GE is not set # CONFIG_FEALNX is not set CONFIG_NET_VENDOR_NI=y # CONFIG_NI_XGE_MANAGEMENT_ENET is not set CONFIG_NET_VENDOR_NATSEMI=y # CONFIG_NATSEMI is not set # CONFIG_NS83820 is not set CONFIG_NET_VENDOR_NETERION=y # CONFIG_S2IO is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP is not set CONFIG_NET_VENDOR_8390=y # CONFIG_NE2K_PCI is not set CONFIG_NET_VENDOR_NVIDIA=y # CONFIG_FORCEDETH is not set CONFIG_NET_VENDOR_OKI=y # CONFIG_ETHOC is not set CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set CONFIG_NET_VENDOR_PENSANDO=y # CONFIG_IONIC is not set CONFIG_NET_VENDOR_QLOGIC=y # CONFIG_QLA3XXX is not set # CONFIG_QLCNIC is not set # CONFIG_NETXEN_NIC is not set # CONFIG_QED is not set CONFIG_NET_VENDOR_BROCADE=y # CONFIG_BNA is not set CONFIG_NET_VENDOR_QUALCOMM=y # CONFIG_QCOM_EMAC is not set # CONFIG_RMNET is not set CONFIG_NET_VENDOR_RDC=y # CONFIG_R6040 is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_ATP is not set # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_R8169 is not set CONFIG_NET_VENDOR_RENESAS=y CONFIG_NET_VENDOR_ROCKER=y CONFIG_NET_VENDOR_SAMSUNG=y # CONFIG_SXGBE_ETH is not set # CONFIG_NET_VENDOR_SEEQ is not set CONFIG_NET_VENDOR_SILAN=y # CONFIG_SC92031 is not set CONFIG_NET_VENDOR_SIS=y # CONFIG_SIS900 is not set # CONFIG_SIS190 is not set CONFIG_NET_VENDOR_SOLARFLARE=y # CONFIG_SFC is not set # CONFIG_SFC_FALCON is not set # CONFIG_SFC_SIENA is not set CONFIG_NET_VENDOR_SMSC=y # CONFIG_EPIC100 is not set # CONFIG_SMSC911X is not set # CONFIG_SMSC9420 is not set CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_STMICRO=y # CONFIG_STMMAC_ETH is not set CONFIG_NET_VENDOR_SUN=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_CASSINI is not set # CONFIG_NIU is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_DWC_XLGMAC is not set CONFIG_NET_VENDOR_TEHUTI=y # CONFIG_TEHUTI is not set CONFIG_NET_VENDOR_TI=y # CONFIG_TI_CPSW_PHY_SEL is not set # CONFIG_TLAN is not set CONFIG_NET_VENDOR_VERTEXCOM=y # CONFIG_MSE102X is not set CONFIG_NET_VENDOR_VIA=y # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set CONFIG_NET_VENDOR_WANGXUN=y # CONFIG_NGBE is not set # CONFIG_TXGBE is not set CONFIG_NET_VENDOR_WIZNET=y # CONFIG_WIZNET_W5100 is not set # CONFIG_WIZNET_W5300 is not set CONFIG_NET_VENDOR_XILINX=y # CONFIG_XILINX_EMACLITE is not set # CONFIG_XILINX_LL_TEMAC is not set CONFIG_FDDI=y # CONFIG_DEFXX is not set # CONFIG_SKFP is not set CONFIG_HIPPI=y # CONFIG_ROADRUNNER is not set # CONFIG_NET_SB1000 is not set CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set CONFIG_FIXED_PHY=y # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_ADIN_PHY is not set # CONFIG_ADIN1100_PHY is not set # CONFIG_AQUANTIA_PHY is not set # CONFIG_AX88796B_PHY is not set # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM54140_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM84881_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_CORTINA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88Q2XXX_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set # CONFIG_MAXLINEAR_GPHY is not set # CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set # CONFIG_MICROCHIP_T1S_PHY is not set # CONFIG_MICROCHIP_PHY is not set # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_CBTX_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set # CONFIG_NCN26000_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QCA83XX_PHY is not set # CONFIG_QCA808X_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_RENESAS_PHY is not set # CONFIG_ROCKCHIP_PHY is not set # CONFIG_SMSC_PHY is not set # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_DP83822_PHY is not set # CONFIG_DP83TC811_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set # CONFIG_DP83869_PHY is not set # CONFIG_DP83TD510_PHY is not set # CONFIG_DP83TG720_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_MICREL_KS8995MA is not set # CONFIG_PSE_CONTROLLER is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y CONFIG_FWNODE_MDIO=y CONFIG_ACPI_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_MVUSB is not set # CONFIG_MDIO_MSCC_MIIM is not set # CONFIG_MDIO_THUNDER is not set # # MDIO Multiplexers # # # PCS device drivers # # end of PCS device drivers # CONFIG_PLIP is not set CONFIG_PPP=m # CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_DEFLATE is not set CONFIG_PPP_FILTER=y # CONFIG_PPP_MPPE is not set CONFIG_PPP_MULTILINK=y CONFIG_PPPOE=m # CONFIG_PPPOE_HASH_BITS_1 is not set # CONFIG_PPPOE_HASH_BITS_2 is not set CONFIG_PPPOE_HASH_BITS_4=y # CONFIG_PPPOE_HASH_BITS_8 is not set CONFIG_PPPOE_HASH_BITS=4 CONFIG_PPTP=m CONFIG_PPPOL2TP=m # CONFIG_PPP_ASYNC is not set # CONFIG_PPP_SYNC_TTY is not set # CONFIG_SLIP is not set CONFIG_SLHC=m # # Host-side USB support is needed for USB Network Adapter support # CONFIG_USB_NET_DRIVERS=m # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set CONFIG_USB_RTL8152=m # CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=m # CONFIG_USB_NET_AX8817X is not set # CONFIG_USB_NET_AX88179_178A is not set CONFIG_USB_NET_CDCETHER=m # CONFIG_USB_NET_CDC_EEM is not set # CONFIG_USB_NET_CDC_NCM is not set # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set # CONFIG_USB_NET_CDC_MBIM is not set # CONFIG_USB_NET_DM9601 is not set # CONFIG_USB_NET_SR9700 is not set # CONFIG_USB_NET_SR9800 is not set # CONFIG_USB_NET_SMSC75XX is not set # CONFIG_USB_NET_SMSC95XX is not set # CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set # CONFIG_USB_NET_PLUSB is not set # CONFIG_USB_NET_MCS7830 is not set # CONFIG_USB_NET_RNDIS_HOST is not set # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set # CONFIG_USB_NET_CX82310_ETH is not set # CONFIG_USB_NET_KALMIA is not set # CONFIG_USB_NET_QMI_WWAN is not set # CONFIG_USB_HSO is not set # CONFIG_USB_NET_INT51X1 is not set # CONFIG_USB_IPHETH is not set # CONFIG_USB_SIERRA_NET is not set # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set CONFIG_USB_RTL8153_ECM=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set CONFIG_ATH_COMMON=m CONFIG_WLAN_VENDOR_ATH=y # CONFIG_ATH_DEBUG is not set # CONFIG_ATH5K is not set CONFIG_ATH5K_PCI=y # CONFIG_ATH9K is not set # CONFIG_ATH9K_HTC is not set # CONFIG_CARL9170 is not set # CONFIG_ATH6KL is not set # CONFIG_AR5523 is not set # CONFIG_WIL6210 is not set CONFIG_ATH10K=m CONFIG_ATH10K_CE=y CONFIG_ATH10K_PCI=m # CONFIG_ATH10K_USB is not set # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set # CONFIG_ATH10K_TRACING is not set # CONFIG_WCN36XX is not set # CONFIG_ATH11K is not set # CONFIG_ATH12K is not set CONFIG_WLAN_VENDOR_ATMEL=y # CONFIG_AT76C50X_USB is not set CONFIG_WLAN_VENDOR_BROADCOM=y # CONFIG_B43 is not set # CONFIG_B43LEGACY is not set # CONFIG_BRCMSMAC is not set # CONFIG_BRCMFMAC is not set CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_IWL4965 is not set # CONFIG_IWL3945 is not set # CONFIG_IWLWIFI is not set CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_P54_COMMON is not set CONFIG_WLAN_VENDOR_MARVELL=y # CONFIG_LIBERTAS is not set # CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_MWIFIEX is not set # CONFIG_MWL8K is not set CONFIG_WLAN_VENDOR_MEDIATEK=y # CONFIG_MT7601U is not set # CONFIG_MT76x0U is not set # CONFIG_MT76x0E is not set # CONFIG_MT76x2E is not set # CONFIG_MT76x2U is not set # CONFIG_MT7603E is not set # CONFIG_MT7615E is not set # CONFIG_MT7663U is not set # CONFIG_MT7915E is not set # CONFIG_MT7921E is not set # CONFIG_MT7921U is not set # CONFIG_MT7996E is not set # CONFIG_MT7925E is not set # CONFIG_MT7925U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SPI is not set CONFIG_WLAN_VENDOR_PURELIFI=y # CONFIG_PLFXLC is not set CONFIG_WLAN_VENDOR_RALINK=y # CONFIG_RT2X00 is not set CONFIG_WLAN_VENDOR_REALTEK=y # CONFIG_RTL8180 is not set # CONFIG_RTL8187 is not set # CONFIG_RTL_CARDS is not set # CONFIG_RTL8XXXU is not set # CONFIG_RTW88 is not set # CONFIG_RTW89 is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set CONFIG_WLAN_VENDOR_SILABS=y # CONFIG_WFX is not set CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set # CONFIG_WLAN_VENDOR_TI is not set CONFIG_WLAN_VENDOR_ZYDAS=y # CONFIG_ZD1211RW is not set CONFIG_WLAN_VENDOR_QUANTENNA=y # CONFIG_QTNFMAC_PCIE is not set # CONFIG_MAC80211_HWSIM is not set # CONFIG_VIRT_WIFI is not set CONFIG_WAN=y # CONFIG_HDLC is not set # CONFIG_FRAMER is not set # # Wireless WAN # # CONFIG_WWAN is not set # end of Wireless WAN # CONFIG_XEN_NETDEV_FRONTEND is not set # CONFIG_XEN_NETDEV_BACKEND is not set # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set CONFIG_ISDN=y CONFIG_ISDN_CAPI=y # CONFIG_MISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y # CONFIG_INPUT_FF_MEMLESS is not set CONFIG_INPUT_SPARSEKMAP=m # CONFIG_INPUT_MATRIXKMAP is not set CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_MOUSEDEV_PSAUX=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=m CONFIG_INPUT_EVDEV=m # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set # CONFIG_KEYBOARD_APPLESPI is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=m # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_PINEPHONE is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_CYPRESS_SF is not set CONFIG_INPUT_MOUSE=y # CONFIG_MOUSE_PS2 is not set # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_DB9 is not set # CONFIG_JOYSTICK_GAMECON is not set # CONFIG_JOYSTICK_TURBOGRAFX is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set # CONFIG_JOYSTICK_XPAD is not set # CONFIG_JOYSTICK_WALKERA0701 is not set # CONFIG_JOYSTICK_PSXPAD_SPI is not set # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set # CONFIG_JOYSTICK_FSIA6B is not set # CONFIG_JOYSTICK_SENSEHAT is not set # CONFIG_JOYSTICK_SEESAW is not set CONFIG_INPUT_TABLET=y # CONFIG_TABLET_USB_ACECAD is not set # CONFIG_TABLET_USB_AIPTEK is not set # CONFIG_TABLET_USB_HANWANG is not set # CONFIG_TABLET_USB_KBTAB is not set # CONFIG_TABLET_USB_PEGASUS is not set # CONFIG_TABLET_SERIAL_WACOM4 is not set CONFIG_INPUT_TOUCHSCREEN=y # CONFIG_TOUCHSCREEN_ADS7846 is not set # CONFIG_TOUCHSCREEN_AD7877 is not set # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set # CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set # CONFIG_TOUCHSCREEN_CY8CTMA140 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP5 is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set # CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set # CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MSG2638 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set # CONFIG_TOUCHSCREEN_IMAGIS is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_STMFTS is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZET6223 is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set # CONFIG_TOUCHSCREEN_IQS7211 is not set # CONFIG_TOUCHSCREEN_ZINITIX is not set # CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set CONFIG_INPUT_PCSPKR=m # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_APANEL is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_DECODER is not set # CONFIG_INPUT_GPIO_VIBRA is not set # CONFIG_INPUT_ATLAS_BTNS is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_REGULATOR_HAPTIC is not set # CONFIG_INPUT_UINPUT is not set # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_PWM_VIBRA is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_DA7280_HAPTICS is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_IQS269A is not set # CONFIG_INPUT_IQS626A is not set # CONFIG_INPUT_IQS7222 is not set # CONFIG_INPUT_CMA3000 is not set CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y # CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set CONFIG_INPUT_SOC_BUTTON_ARRAY=m # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y CONFIG_SERIO_I8042=y # CONFIG_SERIO_SERPORT is not set # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PARKBD is not set # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y CONFIG_SERIO_RAW=m # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_SERIO_GPIO_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # end of Hardware I/O ports # end of Input device support # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set # CONFIG_LEGACY_TIOCSTI is not set CONFIG_LDISC_AUTOLOAD=y # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set CONFIG_SERIAL_8250_PNP=y # CONFIG_SERIAL_8250_16550A_VARIANTS is not set CONFIG_SERIAL_8250_FINTEK=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_PCILIB=y CONFIG_SERIAL_8250_PCI=y # CONFIG_SERIAL_8250_EXAR is not set CONFIG_SERIAL_8250_NR_UARTS=32 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y # CONFIG_SERIAL_8250_PCI1XXXX is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set CONFIG_SERIAL_8250_RSA=y CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set CONFIG_SERIAL_8250_MID=y CONFIG_SERIAL_8250_PERICOM=y # # Non-8250 serial port support # # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_LANTIQ is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y CONFIG_SERIAL_NONSTANDARD=y # CONFIG_MOXA_INTELLIO is not set # CONFIG_MOXA_SMARTIO is not set # CONFIG_N_HDLC is not set # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set CONFIG_HVC_DRIVER=y CONFIG_HVC_IRQ=y CONFIG_HVC_XEN=y CONFIG_HVC_XEN_FRONTEND=y CONFIG_SERIAL_DEV_BUS=y CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set CONFIG_PRINTER=m # CONFIG_LP_CONSOLE is not set CONFIG_PPDEV=m # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_INTEL is not set # CONFIG_HW_RANDOM_AMD is not set # CONFIG_HW_RANDOM_BA431 is not set # CONFIG_HW_RANDOM_VIA is not set # CONFIG_HW_RANDOM_VIRTIO is not set # CONFIG_HW_RANDOM_XIPHERA is not set # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y # CONFIG_NVRAM is not set CONFIG_DEVPORT=y CONFIG_HPET=y CONFIG_HPET_MMAP=y CONFIG_HPET_MMAP_DEFAULT=y # CONFIG_HANGCHECK_TIMER is not set CONFIG_TCG_TPM=y CONFIG_HW_RANDOM_TPM=y CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y # CONFIG_TCG_TIS_SPI is not set # CONFIG_TCG_TIS_I2C is not set # CONFIG_TCG_TIS_I2C_CR50 is not set # CONFIG_TCG_TIS_I2C_ATMEL is not set # CONFIG_TCG_TIS_I2C_INFINEON is not set # CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_NSC is not set # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_INFINEON is not set # CONFIG_TCG_XEN is not set CONFIG_TCG_CRB=y # CONFIG_TCG_VTPM_PROXY is not set # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TCG_TIS_ST33ZP24_SPI is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set # end of Character devices # # I2C support # CONFIG_I2C=y CONFIG_ACPI_I2C_OPREGION=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y # CONFIG_I2C_CHARDEV is not set CONFIG_I2C_MUX=m # # Multiplexer I2C Chip support # # CONFIG_I2C_MUX_GPIO is not set # CONFIG_I2C_MUX_LTC4306 is not set # CONFIG_I2C_MUX_PCA9541 is not set # CONFIG_I2C_MUX_PCA954x is not set # CONFIG_I2C_MUX_REG is not set # CONFIG_I2C_MUX_MLXCPLD is not set # end of Multiplexer I2C Chip support CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_SMBUS=m CONFIG_I2C_ALGOBIT=m # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_AMD_MP2 is not set CONFIG_I2C_I801=m # CONFIG_I2C_ISCH is not set # CONFIG_I2C_ISMT is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_CHT_WC is not set # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_NVIDIA_GPU is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # ACPI drivers # # CONFIG_I2C_SCMI is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CBUS_GPIO is not set CONFIG_I2C_DESIGNWARE_CORE=y # CONFIG_I2C_DESIGNWARE_SLAVE is not set CONFIG_I2C_DESIGNWARE_PLATFORM=y CONFIG_I2C_DESIGNWARE_BAYTRAIL=y # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_CP2615 is not set # CONFIG_I2C_PARPORT is not set # CONFIG_I2C_PCI1XXXX is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_MLXCPLD is not set # CONFIG_I2C_VIRTIO is not set # end of I2C Hardware Bus support # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support # CONFIG_I3C is not set CONFIG_SPI=y # CONFIG_SPI_DEBUG is not set CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y # # SPI Master Controller Drivers # # CONFIG_SPI_ALTERA is not set # CONFIG_SPI_AXI_SPI_ENGINE is not set # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_BUTTERFLY is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_DESIGNWARE is not set # CONFIG_SPI_GPIO is not set # CONFIG_SPI_INTEL_PCI is not set # CONFIG_SPI_INTEL_PLATFORM is not set # CONFIG_SPI_LM70_LLP is not set # CONFIG_SPI_MICROCHIP_CORE is not set # CONFIG_SPI_MICROCHIP_CORE_QSPI is not set # CONFIG_SPI_LANTIQ_SSC is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_PCI1XXXX is not set # CONFIG_SPI_PXA2XX is not set # CONFIG_SPI_SC18IS602 is not set # CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_MXIC is not set # CONFIG_SPI_XCOMM is not set # CONFIG_SPI_XILINX is not set # CONFIG_SPI_ZYNQMP_GQSPI is not set # CONFIG_SPI_AMD is not set # # SPI Multiplexer support # # CONFIG_SPI_MUX is not set # # SPI Protocol Masters # CONFIG_SPI_SPIDEV=y # CONFIG_SPI_LOOPBACK_TEST is not set # CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_SLAVE is not set CONFIG_SPI_DYNAMIC=y # CONFIG_SPMI is not set # CONFIG_HSI is not set CONFIG_PPS=y # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_PARPORT is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=y CONFIG_PTP_1588_CLOCK_OPTIONAL=y # CONFIG_DP83640_PHY is not set # CONFIG_PTP_1588_CLOCK_INES is not set # CONFIG_PTP_1588_CLOCK_KVM is not set # CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set # CONFIG_PTP_1588_CLOCK_FC3W is not set # CONFIG_PTP_1588_CLOCK_MOCK is not set # CONFIG_PTP_1588_CLOCK_VMW is not set # end of PTP clock support CONFIG_PINCTRL=y CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set CONFIG_PINCTRL_AMD=y # CONFIG_PINCTRL_CY8C95X0 is not set # CONFIG_PINCTRL_MCP23S08 is not set # CONFIG_PINCTRL_SX150X is not set # # Intel pinctrl drivers # CONFIG_PINCTRL_BAYTRAIL=y CONFIG_PINCTRL_CHERRYVIEW=y # CONFIG_PINCTRL_LYNXPOINT is not set CONFIG_PINCTRL_INTEL=y # CONFIG_PINCTRL_INTEL_PLATFORM is not set # CONFIG_PINCTRL_ALDERLAKE is not set CONFIG_PINCTRL_BROXTON=y CONFIG_PINCTRL_CANNONLAKE=y CONFIG_PINCTRL_CEDARFORK=y CONFIG_PINCTRL_DENVERTON=y # CONFIG_PINCTRL_ELKHARTLAKE is not set # CONFIG_PINCTRL_EMMITSBURG is not set CONFIG_PINCTRL_GEMINILAKE=y CONFIG_PINCTRL_ICELAKE=y # CONFIG_PINCTRL_JASPERLAKE is not set # CONFIG_PINCTRL_LAKEFIELD is not set CONFIG_PINCTRL_LEWISBURG=y # CONFIG_PINCTRL_METEORLAKE is not set # CONFIG_PINCTRL_METEORPOINT is not set CONFIG_PINCTRL_SUNRISEPOINT=y CONFIG_PINCTRL_TIGERLAKE=y # end of Intel pinctrl drivers # # Renesas pinctrl drivers # # end of Renesas pinctrl drivers CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_GPIO_ACPI=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_CDEV_V1=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_AMDPT is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_AMD_FCH is not set # end of Memory mapped GPIO drivers # # Port-mapped I/O GPIO drivers # # CONFIG_GPIO_VX855 is not set # CONFIG_GPIO_F7188X is not set # CONFIG_GPIO_IT87 is not set # CONFIG_GPIO_SCH311X is not set # CONFIG_GPIO_WINBOND is not set # CONFIG_GPIO_WS16C48 is not set # end of Port-mapped I/O GPIO drivers # # I2C GPIO expanders # # CONFIG_GPIO_FXL6408 is not set # CONFIG_GPIO_DS4520 is not set # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set # CONFIG_GPIO_PCA953X is not set # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # end of I2C GPIO expanders # # MFD GPIO expanders # # CONFIG_GPIO_CRYSTAL_COVE is not set # CONFIG_GPIO_ELKHARTLAKE is not set # end of MFD GPIO expanders # # PCI GPIO expanders # # CONFIG_GPIO_AMD8111 is not set # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_ML_IOH is not set # CONFIG_GPIO_PCI_IDIO_16 is not set # CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # end of PCI GPIO expanders # # SPI GPIO expanders # # CONFIG_GPIO_MAX3191X is not set # CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MC33880 is not set # CONFIG_GPIO_PISOSR is not set # CONFIG_GPIO_XRA1403 is not set # end of SPI GPIO expanders # # USB GPIO expanders # # end of USB GPIO expanders # # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set # CONFIG_GPIO_LATCH is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_VIRTIO is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers # CONFIG_W1 is not set # CONFIG_POWER_RESET is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set # CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_MANAGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_MANAGER is not set # CONFIG_CHARGER_LT3651 is not set # CONFIG_CHARGER_LTC4162L is not set # CONFIG_CHARGER_MAX77976 is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ2515X is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_BQ25980 is not set # CONFIG_CHARGER_BQ256XX is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_RT9467 is not set # CONFIG_CHARGER_RT9471 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set # CONFIG_FUEL_GAUGE_MM8013 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_ABITUGURU is not set # CONFIG_SENSORS_ABITUGURU3 is not set # CONFIG_SENSORS_AD7314 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM1177 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7310 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set # CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_K8TEMP is not set # CONFIG_SENSORS_K10TEMP is not set # CONFIG_SENSORS_FAM15H_POWER is not set # CONFIG_SENSORS_APPLESMC is not set # CONFIG_SENSORS_ASB100 is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_CHIPCAP2 is not set # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set CONFIG_SENSORS_DELL_SMM=m CONFIG_I8K=y # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FSCHMD is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_HS3001 is not set # CONFIG_SENSORS_I5500 is not set CONFIG_SENSORS_CORETEMP=m # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWERZ is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC2991 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_LTC4282 is not set # CONFIG_SENSORS_MAX1111 is not set # CONFIG_SENSORS_MAX127 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX31722 is not set # CONFIG_SENSORS_MAX31730 is not set # CONFIG_SENSORS_MAX31760 is not set # CONFIG_MAX31827 is not set # CONFIG_SENSORS_MAX6620 is not set # CONFIG_SENSORS_MAX6621 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MC34VR500 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set # CONFIG_SENSORS_MR75203 is not set # CONFIG_SENSORS_ADCXX is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_NPCM7XX is not set # CONFIG_SENSORS_NZXT_KRAKEN2 is not set # CONFIG_SENSORS_NZXT_KRAKEN3 is not set # CONFIG_SENSORS_NZXT_SMART2 is not set # CONFIG_SENSORS_OCC_P8_I2C is not set # CONFIG_SENSORS_OXP is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_PT5161L is not set # CONFIG_SENSORS_SBTSI is not set # CONFIG_SENSORS_SBRMI is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC2305 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA238 is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_TMP464 is not set # CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VIA_CPUTEMP is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83773G is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set # CONFIG_SENSORS_XGENE is not set # # ACPI drivers # # CONFIG_SENSORS_ACPI_POWER is not set # CONFIG_SENSORS_ATK0110 is not set # CONFIG_SENSORS_ASUS_WMI is not set # CONFIG_SENSORS_ASUS_EC is not set # CONFIG_SENSORS_HP_WMI is not set CONFIG_THERMAL=y CONFIG_THERMAL_NETLINK=y CONFIG_THERMAL_STATISTICS=y # CONFIG_THERMAL_DEBUGFS is not set CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set # CONFIG_THERMAL_DEFAULT_GOV_BANG_BANG is not set CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y CONFIG_THERMAL_GOV_BANG_BANG=y CONFIG_THERMAL_GOV_USER_SPACE=y CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_DEVFREQ_THERMAL=y # CONFIG_THERMAL_EMULATION is not set # # Intel thermal drivers # CONFIG_INTEL_POWERCLAMP=m CONFIG_X86_THERMAL_VECTOR=y CONFIG_INTEL_TCC=y CONFIG_X86_PKG_TEMP_THERMAL=m CONFIG_INTEL_SOC_DTS_IOSF_CORE=m # CONFIG_INTEL_SOC_DTS_THERMAL is not set # # ACPI INT340X thermal drivers # CONFIG_INT340X_THERMAL=m CONFIG_ACPI_THERMAL_REL=m # CONFIG_INT3406_THERMAL is not set CONFIG_PROC_THERMAL_MMIO_RAPL=m # end of ACPI INT340X thermal drivers CONFIG_INTEL_PCH_THERMAL=m # CONFIG_INTEL_TCC_COOLING is not set CONFIG_INTEL_HFI_THERMAL=y # end of Intel thermal drivers CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=m # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 CONFIG_WATCHDOG_SYSFS=y CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT=y # # Watchdog Pretimeout Governors # CONFIG_WATCHDOG_PRETIMEOUT_GOV=y CONFIG_WATCHDOG_PRETIMEOUT_GOV_SEL=m # CONFIG_WATCHDOG_PRETIMEOUT_GOV_NOOP is not set CONFIG_WATCHDOG_PRETIMEOUT_GOV_PANIC=m CONFIG_WATCHDOG_PRETIMEOUT_DEFAULT_GOV_PANIC=y # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_WDAT_WDT is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ACQUIRE_WDT is not set # CONFIG_ADVANTECH_WDT is not set # CONFIG_ADVANTECH_EC_WDT is not set # CONFIG_ALIM1535_WDT is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_EBC_C384_WDT is not set # CONFIG_EXAR_WDT is not set # CONFIG_F71808E_WDT is not set # CONFIG_SP5100_TCO is not set # CONFIG_SBC_FITPC2_WATCHDOG is not set # CONFIG_EUROTECH_WDT is not set # CONFIG_IB700_WDT is not set # CONFIG_IBMASR is not set # CONFIG_WAFER_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_IE6XX_WDT is not set CONFIG_ITCO_WDT=m CONFIG_ITCO_VENDOR_SUPPORT=y # CONFIG_IT8712F_WDT is not set # CONFIG_IT87_WDT is not set # CONFIG_HP_WATCHDOG is not set # CONFIG_SC1200_WDT is not set # CONFIG_PC87413_WDT is not set # CONFIG_NV_TCO is not set # CONFIG_60XX_WDT is not set # CONFIG_CPU5_WDT is not set # CONFIG_SMSC_SCH311X_WDT is not set # CONFIG_SMSC37B787_WDT is not set # CONFIG_TQMX86_WDT is not set # CONFIG_VIA_WDT is not set # CONFIG_W83627HF_WDT is not set # CONFIG_W83877F_WDT is not set # CONFIG_W83977F_WDT is not set # CONFIG_MACHZ_WDT is not set # CONFIG_SBC_EPX_C3_WATCHDOG is not set CONFIG_INTEL_MEI_WDT=m # CONFIG_NI903X_WDT is not set # CONFIG_NIC7018_WDT is not set # CONFIG_MEN_A21_WDT is not set # CONFIG_XEN_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_AS3711 is not set # CONFIG_MFD_SMPRO is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_CS42L43_I2C is not set # CONFIG_MFD_CS42L43_SDW is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set # CONFIG_MFD_DA9055 is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_MC13XXX_SPI is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set CONFIG_INTEL_SOC_PMIC=y # CONFIG_INTEL_SOC_PMIC_BXTWC is not set CONFIG_INTEL_SOC_PMIC_CHTWC=y # CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set CONFIG_MFD_INTEL_LPSS=m # CONFIG_MFD_INTEL_LPSS_ACPI is not set CONFIG_MFD_INTEL_LPSS_PCI=m CONFIG_MFD_INTEL_PMC_BXT=m # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77541 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MAX8925 is not set # CONFIG_MFD_MAX8997 is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6370 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_OCELOT is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_SY7636A is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RT5120 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set # CONFIG_MFD_PALMAS is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65090 is not set # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_MFD_TPS6594_I2C is not set # CONFIG_MFD_TPS6594_SPI is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TQMX86 is not set # CONFIG_MFD_VX855 is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC_SPI is not set # end of Multifunction device drivers CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set # CONFIG_REGULATOR_FIXED_VOLTAGE is not set # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set # CONFIG_REGULATOR_NETLINK_EVENTS is not set # CONFIG_REGULATOR_88PG86X is not set # CONFIG_REGULATOR_ACT8865 is not set # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_AW37503 is not set # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set # CONFIG_REGULATOR_FAN53555 is not set # CONFIG_REGULATOR_GPIO is not set # CONFIG_REGULATOR_ISL9305 is not set # CONFIG_REGULATOR_ISL6271A is not set # CONFIG_REGULATOR_LP3971 is not set # CONFIG_REGULATOR_LP3972 is not set # CONFIG_REGULATOR_LP872X is not set # CONFIG_REGULATOR_LP8755 is not set # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX77503 is not set # CONFIG_REGULATOR_MAX77857 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set # CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX20086 is not set # CONFIG_REGULATOR_MAX20411 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MP8859 is not set # CONFIG_REGULATOR_MT6311 is not set # CONFIG_REGULATOR_PCA9450 is not set # CONFIG_REGULATOR_PV88060 is not set # CONFIG_REGULATOR_PV88080 is not set # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_PWM is not set # CONFIG_REGULATOR_RAA215300 is not set # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT4803 is not set # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5739 is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set # CONFIG_REGULATOR_RT6190 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_RTQ6752 is not set # CONFIG_REGULATOR_RTQ2208 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set CONFIG_RC_CORE=m CONFIG_LIRC=y # CONFIG_RC_MAP is not set CONFIG_RC_DECODERS=y # CONFIG_IR_IMON_DECODER is not set # CONFIG_IR_JVC_DECODER is not set # CONFIG_IR_MCE_KBD_DECODER is not set # CONFIG_IR_NEC_DECODER is not set # CONFIG_IR_RC5_DECODER is not set # CONFIG_IR_RC6_DECODER is not set # CONFIG_IR_RCMM_DECODER is not set # CONFIG_IR_SANYO_DECODER is not set # CONFIG_IR_SHARP_DECODER is not set # CONFIG_IR_SONY_DECODER is not set # CONFIG_IR_XMP_DECODER is not set CONFIG_RC_DEVICES=y # CONFIG_IR_ENE is not set # CONFIG_IR_FINTEK is not set # CONFIG_IR_IGORPLUGUSB is not set # CONFIG_IR_IGUANA is not set # CONFIG_IR_IMON is not set # CONFIG_IR_IMON_RAW is not set # CONFIG_IR_ITE_CIR is not set # CONFIG_IR_MCEUSB is not set # CONFIG_IR_NUVOTON is not set # CONFIG_IR_REDRAT3 is not set # CONFIG_IR_SERIAL is not set # CONFIG_IR_STREAMZAP is not set # CONFIG_IR_TOY is not set # CONFIG_IR_TTUSBIR is not set # CONFIG_IR_WINBOND_CIR is not set # CONFIG_RC_ATI_REMOTE is not set # CONFIG_RC_LOOPBACK is not set # CONFIG_RC_XBOX_DVD is not set CONFIG_CEC_CORE=m # # CEC support # CONFIG_MEDIA_CEC_RC=y CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set # CONFIG_CEC_GPIO is not set # CONFIG_CEC_SECO is not set # CONFIG_USB_PULSE8_CEC is not set # CONFIG_USB_RAINSHADOW_CEC is not set # end of CEC support CONFIG_MEDIA_SUPPORT=m # CONFIG_MEDIA_SUPPORT_FILTER is not set CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y # end of Media device types # # Media core support # CONFIG_VIDEO_DEV=m CONFIG_MEDIA_CONTROLLER=y # CONFIG_DVB_CORE is not set # end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_V4L2_FWNODE=m CONFIG_V4L2_ASYNC=m # end of Video4Linux options # # Media controller options # # end of Media controller options # # Media drivers # # # Media drivers # CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # # CONFIG_USB_GSPCA is not set # CONFIG_USB_PWC is not set # CONFIG_USB_S2255 is not set # CONFIG_VIDEO_USBTV is not set CONFIG_USB_VIDEO_CLASS=m CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y # # Analog TV USB devices # # CONFIG_VIDEO_GO7007 is not set # CONFIG_VIDEO_HDPVR is not set # CONFIG_VIDEO_STK1160 is not set # # Analog/digital TV USB devices # # CONFIG_VIDEO_CX231XX is not set # # Digital TV USB devices # # # Webcam, TV (analog/digital) USB devices # # CONFIG_VIDEO_EM28XX is not set # # Software defined radio USB devices # # CONFIG_USB_AIRSPY is not set # CONFIG_USB_HACKRF is not set # CONFIG_USB_MSI2500 is not set CONFIG_MEDIA_PCI_SUPPORT=y # # Media capture support # # CONFIG_VIDEO_SOLO6X10 is not set # CONFIG_VIDEO_TW5864 is not set # CONFIG_VIDEO_TW68 is not set # CONFIG_VIDEO_TW686X is not set # CONFIG_VIDEO_ZORAN is not set # # Media capture/analog TV support # # CONFIG_VIDEO_DT3155 is not set # CONFIG_VIDEO_IVTV is not set # CONFIG_VIDEO_HEXIUM_GEMINI is not set # CONFIG_VIDEO_HEXIUM_ORION is not set # CONFIG_VIDEO_MXB is not set # # Media capture/analog/hybrid TV support # # CONFIG_VIDEO_BT848 is not set # CONFIG_VIDEO_CX25821 is not set # CONFIG_VIDEO_CX88 is not set # CONFIG_VIDEO_SAA7134 is not set # # Media digital TV PCI Adapters # # CONFIG_VIDEO_IPU3_CIO2 is not set # CONFIG_INTEL_VSC is not set # CONFIG_IPU_BRIDGE is not set # CONFIG_RADIO_ADAPTERS is not set CONFIG_MEDIA_PLATFORM_DRIVERS=y CONFIG_V4L_PLATFORM_DRIVERS=y # CONFIG_SDR_PLATFORM_DRIVERS is not set # CONFIG_DVB_PLATFORM_DRIVERS is not set CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set # # Allegro DVT media platform drivers # # # Amlogic media platform drivers # # # Amphion drivers # # # Aspeed media platform drivers # # # Atmel media platform drivers # # # Cadence media platform drivers # # CONFIG_VIDEO_CADENCE_CSI2RX is not set # CONFIG_VIDEO_CADENCE_CSI2TX is not set # # Chips&Media media platform drivers # # # Intel media platform drivers # # # Marvell media platform drivers # # CONFIG_VIDEO_CAFE_CCIC is not set # # Mediatek media platform drivers # # # Microchip Technology, Inc. media platform drivers # # # Nuvoton media platform drivers # # # NVidia media platform drivers # # # NXP media platform drivers # # # Qualcomm media platform drivers # # # Renesas media platform drivers # # # Rockchip media platform drivers # # # Samsung media platform drivers # # # STMicroelectronics media platform drivers # # # Sunxi media platform drivers # # # Texas Instruments drivers # # # Verisilicon media platform drivers # # # VIA media platform drivers # # # Xilinx media platform drivers # CONFIG_V4L_TEST_DRIVERS=y # CONFIG_VIDEO_VIM2M is not set # CONFIG_VIDEO_VICODEC is not set # CONFIG_VIDEO_VIMC is not set # CONFIG_VIDEO_VIVID is not set # CONFIG_VIDEO_VISL is not set CONFIG_UVC_COMMON=m CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_VMALLOC=m # end of Media drivers # # Media ancillary drivers # CONFIG_MEDIA_ATTACH=y # # IR I2C driver auto-selected by 'Autoselect ancillary drivers' # # CONFIG_VIDEO_IR_I2C is not set CONFIG_VIDEO_CAMERA_SENSOR=y # CONFIG_VIDEO_ALVIUM_CSI2 is not set # CONFIG_VIDEO_AR0521 is not set # CONFIG_VIDEO_GC0308 is not set # CONFIG_VIDEO_GC2145 is not set # CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_HI846 is not set # CONFIG_VIDEO_HI847 is not set # CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX296 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9M114 is not set # CONFIG_VIDEO_MT9P031 is not set # CONFIG_VIDEO_MT9T112 is not set # CONFIG_VIDEO_MT9V011 is not set # CONFIG_VIDEO_MT9V032 is not set # CONFIG_VIDEO_MT9V111 is not set # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV01A10 is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set # CONFIG_VIDEO_OV08X40 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set # CONFIG_VIDEO_OV2740 is not set # CONFIG_VIDEO_OV4689 is not set # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV5648 is not set # CONFIG_VIDEO_OV5670 is not set # CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5693 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV64A40 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV7640 is not set # CONFIG_VIDEO_OV7670 is not set # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set # CONFIG_VIDEO_OV8858 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9640 is not set # CONFIG_VIDEO_OV9650 is not set # CONFIG_VIDEO_OV9734 is not set # CONFIG_VIDEO_RDACM20 is not set # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set # # Camera ISPs # # CONFIG_VIDEO_THP7312 is not set # end of Camera ISPs # # Lens drivers # # CONFIG_VIDEO_AD5820 is not set # CONFIG_VIDEO_AK7375 is not set # CONFIG_VIDEO_DW9714 is not set # CONFIG_VIDEO_DW9719 is not set # CONFIG_VIDEO_DW9768 is not set # CONFIG_VIDEO_DW9807_VCM is not set # end of Lens drivers # # Flash devices # # CONFIG_VIDEO_ADP1653 is not set # CONFIG_VIDEO_LM3560 is not set # CONFIG_VIDEO_LM3646 is not set # end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set # CONFIG_VIDEO_CS53L32A is not set # CONFIG_VIDEO_MSP3400 is not set # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set # CONFIG_VIDEO_TDA9840 is not set # CONFIG_VIDEO_TEA6415C is not set # CONFIG_VIDEO_TEA6420 is not set # CONFIG_VIDEO_TLV320AIC23B is not set # CONFIG_VIDEO_TVAUDIO is not set # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set # CONFIG_VIDEO_WM8775 is not set # end of Audio decoders, processors and mixers # # RDS decoders # # CONFIG_VIDEO_SAA6588 is not set # end of RDS decoders # # Video decoders # # CONFIG_VIDEO_ADV7180 is not set # CONFIG_VIDEO_ADV7183 is not set # CONFIG_VIDEO_ADV7604 is not set # CONFIG_VIDEO_ADV7842 is not set # CONFIG_VIDEO_BT819 is not set # CONFIG_VIDEO_BT856 is not set # CONFIG_VIDEO_BT866 is not set # CONFIG_VIDEO_KS0127 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set # CONFIG_VIDEO_SAA711X is not set # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TC358746 is not set # CONFIG_VIDEO_TVP514X is not set # CONFIG_VIDEO_TVP5150 is not set # CONFIG_VIDEO_TVP7002 is not set # CONFIG_VIDEO_TW2804 is not set # CONFIG_VIDEO_TW9900 is not set # CONFIG_VIDEO_TW9903 is not set # CONFIG_VIDEO_TW9906 is not set # CONFIG_VIDEO_TW9910 is not set # CONFIG_VIDEO_VPX3220 is not set # # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set # CONFIG_VIDEO_CX25840 is not set # end of Video decoders # # Video encoders # # CONFIG_VIDEO_ADV7170 is not set # CONFIG_VIDEO_ADV7175 is not set # CONFIG_VIDEO_ADV7343 is not set # CONFIG_VIDEO_ADV7393 is not set # CONFIG_VIDEO_ADV7511 is not set # CONFIG_VIDEO_AK881X is not set # CONFIG_VIDEO_SAA7127 is not set # CONFIG_VIDEO_SAA7185 is not set # CONFIG_VIDEO_THS8200 is not set # end of Video encoders # # Video improvement chips # # CONFIG_VIDEO_UPD64031A is not set # CONFIG_VIDEO_UPD64083 is not set # end of Video improvement chips # # Audio/Video compression chips # # CONFIG_VIDEO_SAA6752HS is not set # end of Audio/Video compression chips # # SDR tuner chips # # CONFIG_SDR_MAX2175 is not set # end of SDR tuner chips # # Miscellaneous helper chips # # CONFIG_VIDEO_I2C is not set # CONFIG_VIDEO_M52790 is not set # CONFIG_VIDEO_ST_MIPID02 is not set # CONFIG_VIDEO_THS7303 is not set # end of Miscellaneous helper chips # # Video serializers and deserializers # # end of Video serializers and deserializers # # Media SPI Adapters # # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters CONFIG_MEDIA_TUNER=m # # Customize TV tuners # # CONFIG_MEDIA_TUNER_E4000 is not set # CONFIG_MEDIA_TUNER_FC0011 is not set # CONFIG_MEDIA_TUNER_FC0012 is not set # CONFIG_MEDIA_TUNER_FC0013 is not set # CONFIG_MEDIA_TUNER_FC2580 is not set # CONFIG_MEDIA_TUNER_IT913X is not set # CONFIG_MEDIA_TUNER_M88RS6000T is not set # CONFIG_MEDIA_TUNER_MAX2165 is not set CONFIG_MEDIA_TUNER_MC44S803=m # CONFIG_MEDIA_TUNER_MSI001 is not set # CONFIG_MEDIA_TUNER_MT2060 is not set # CONFIG_MEDIA_TUNER_MT2063 is not set CONFIG_MEDIA_TUNER_MT20XX=m # CONFIG_MEDIA_TUNER_MT2131 is not set # CONFIG_MEDIA_TUNER_MT2266 is not set # CONFIG_MEDIA_TUNER_MXL301RF is not set # CONFIG_MEDIA_TUNER_MXL5005S is not set # CONFIG_MEDIA_TUNER_MXL5007T is not set # CONFIG_MEDIA_TUNER_QM1D1B0004 is not set # CONFIG_MEDIA_TUNER_QM1D1C0042 is not set # CONFIG_MEDIA_TUNER_QT1010 is not set # CONFIG_MEDIA_TUNER_R820T is not set # CONFIG_MEDIA_TUNER_SI2157 is not set CONFIG_MEDIA_TUNER_SIMPLE=m # CONFIG_MEDIA_TUNER_TDA18212 is not set # CONFIG_MEDIA_TUNER_TDA18218 is not set # CONFIG_MEDIA_TUNER_TDA18250 is not set CONFIG_MEDIA_TUNER_TDA18271=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA9887=m CONFIG_MEDIA_TUNER_TEA5761=m CONFIG_MEDIA_TUNER_TEA5767=m # CONFIG_MEDIA_TUNER_TUA9001 is not set CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_XC5000=m # end of Customize TV tuners # # Customise DVB Frontends # # end of Customise DVB Frontends # # Tools to develop new frontends # # end of Media ancillary drivers # # Graphics support # CONFIG_APERTURE_HELPERS=y CONFIG_SCREEN_INFO=y CONFIG_VIDEO=y # CONFIG_AUXDISPLAY is not set # CONFIG_PANEL is not set # CONFIG_AGP is not set CONFIG_INTEL_GTT=m # CONFIG_VGA_SWITCHEROO is not set CONFIG_DRM=m CONFIG_DRM_MIPI_DSI=y CONFIG_DRM_DEBUG_MM=y CONFIG_DRM_KMS_HELPER=m # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set # CONFIG_DRM_DEBUG_MODESET_LOCK is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_DISPLAY_HELPER=m CONFIG_DRM_DISPLAY_DP_HELPER=y CONFIG_DRM_DISPLAY_HDCP_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y CONFIG_DRM_DP_AUX_CHARDEV=y CONFIG_DRM_DP_CEC=y CONFIG_DRM_TTM=m CONFIG_DRM_BUDDY=m # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set # end of I2C encoder or helper chips # # ARM devices # # end of ARM devices # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # CONFIG_DRM_NOUVEAU is not set CONFIG_DRM_I915=m CONFIG_DRM_I915_FORCE_PROBE="" CONFIG_DRM_I915_CAPTURE_ERROR=y CONFIG_DRM_I915_COMPRESS_ERROR=y CONFIG_DRM_I915_USERPTR=y CONFIG_DRM_I915_PXP=y # # drm/i915 Debugging # # CONFIG_DRM_I915_WERROR is not set # CONFIG_DRM_I915_DEBUG is not set # CONFIG_DRM_I915_DEBUG_MMIO is not set # CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set # CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set # CONFIG_DRM_I915_DEBUG_GUC is not set # CONFIG_DRM_I915_SELFTEST is not set # CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set # CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set # CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set # CONFIG_DRM_I915_DEBUG_WAKEREF is not set # end of drm/i915 Debugging # # drm/i915 Profile Guided Optimisation # CONFIG_DRM_I915_REQUEST_TIMEOUT=20000 CONFIG_DRM_I915_FENCE_TIMEOUT=10000 CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 CONFIG_DRM_I915_PREEMPT_TIMEOUT_COMPUTE=7500 CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 CONFIG_DRM_I915_STOP_TIMEOUT=100 CONFIG_DRM_I915_TIMESLICE_DURATION=1 # end of drm/i915 Profile Guided Optimisation # CONFIG_DRM_XE is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VKMS is not set # CONFIG_DRM_VMWGFX is not set # CONFIG_DRM_GMA500 is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_QXL is not set # CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_PANEL=y # # Display Panels # # CONFIG_DRM_PANEL_AUO_A030JTN01 is not set # CONFIG_DRM_PANEL_ORISETECH_OTA5601A is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # end of Display Panels CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_ANALOGIX_ANX78XX is not set # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_GM12U320 is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9163 is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set # CONFIG_TINYDRM_ILI9486 is not set # CONFIG_TINYDRM_MI0283QT is not set # CONFIG_TINYDRM_REPAPER is not set # CONFIG_TINYDRM_ST7586 is not set # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_XEN_FRONTEND is not set # CONFIG_DRM_VBOXVIDEO is not set # CONFIG_DRM_GUD is not set # CONFIG_DRM_SSD130X is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y # # Frame buffer Devices # CONFIG_FB=y # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ARC is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_VGA16 is not set # CONFIG_FB_UVESA is not set CONFIG_FB_VESA=y CONFIG_FB_EFI=y # CONFIG_FB_N411 is not set # CONFIG_FB_HGA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_VIA is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set CONFIG_XEN_FBDEV_FRONTEND=y # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set CONFIG_FB_SIMPLE=y # CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set CONFIG_FB_CORE=y CONFIG_FB_NOTIFY=y CONFIG_FIRMWARE_EDID=y CONFIG_FB_DEVICE=y CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYSMEM_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_IOMEM_FOPS=y CONFIG_FB_IOMEM_HELPERS=y CONFIG_FB_SYSMEM_HELPERS=y CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y CONFIG_FB_MODE_HELPERS=y CONFIG_FB_TILEBLITTING=y # end of Frame buffer Devices # # Backlight & LCD device support # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_KTD253 is not set # CONFIG_BACKLIGHT_KTD2801 is not set # CONFIG_BACKLIGHT_KTZ8866 is not set # CONFIG_BACKLIGHT_PWM is not set # CONFIG_BACKLIGHT_APPLE is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_SAHARA is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_MP3309C is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set # end of Backlight & LCD device support CONFIG_HDMI=y # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set # end of Console display driver support # CONFIG_LOGO is not set # end of Graphics support # CONFIG_DRM_ACCEL is not set CONFIG_SOUND=m CONFIG_SOUND_OSS_CORE=y # CONFIG_SOUND_OSS_CORE_PRECLAIM is not set CONFIG_SND=m CONFIG_SND_TIMER=m CONFIG_SND_PCM=m CONFIG_SND_HWDEP=m CONFIG_SND_SEQ_DEVICE=m CONFIG_SND_RAWMIDI=m CONFIG_SND_COMPRESS_OFFLOAD=m CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y CONFIG_SND_OSSEMUL=y # CONFIG_SND_MIXER_OSS is not set # CONFIG_SND_PCM_OSS is not set CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=m CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set CONFIG_SND_CTL_FAST_LOOKUP=y # CONFIG_SND_DEBUG is not set # CONFIG_SND_CTL_INPUT_VALIDATION is not set CONFIG_SND_VMASTER=y CONFIG_SND_DMA_SGBUF=y CONFIG_SND_CTL_LED=m CONFIG_SND_SEQUENCER=m CONFIG_SND_SEQ_DUMMY=m # CONFIG_SND_SEQUENCER_OSS is not set CONFIG_SND_SEQ_HRTIMER_DEFAULT=y CONFIG_SND_SEQ_MIDI_EVENT=m CONFIG_SND_SEQ_MIDI=m # CONFIG_SND_SEQ_UMP is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_PCSP is not set # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_PCMTEST is not set # CONFIG_SND_VIRMIDI is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_MTS64 is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set # CONFIG_SND_PORTMAN2X4 is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ALS300 is not set # CONFIG_SND_ALS4000 is not set # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ASIHPI is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CA0106 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_OXYGEN is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CTXFI is not set # CONFIG_SND_DARLA20 is not set # CONFIG_SND_GINA20 is not set # CONFIG_SND_LAYLA20 is not set # CONFIG_SND_DARLA24 is not set # CONFIG_SND_GINA24 is not set # CONFIG_SND_LAYLA24 is not set # CONFIG_SND_MONA is not set # CONFIG_SND_MIA is not set # CONFIG_SND_ECHO3G is not set # CONFIG_SND_INDIGO is not set # CONFIG_SND_INDIGOIO is not set # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set # CONFIG_SND_EMU10K1 is not set # CONFIG_SND_EMU10K1X is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set # CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set # CONFIG_SND_RIPTIDE is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_SE6X is not set # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_TRIDENT is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VIA82XX_MODEM is not set # CONFIG_SND_VIRTUOSO is not set # CONFIG_SND_VX222 is not set # CONFIG_SND_YMFPCI is not set # # HD-Audio # CONFIG_SND_HDA=m CONFIG_SND_HDA_GENERIC_LEDS=y CONFIG_SND_HDA_INTEL=m CONFIG_SND_HDA_HWDEP=y CONFIG_SND_HDA_RECONFIG=y CONFIG_SND_HDA_INPUT_BEEP=y CONFIG_SND_HDA_INPUT_BEEP_MODE=1 CONFIG_SND_HDA_PATCH_LOADER=y CONFIG_SND_HDA_SCODEC_COMPONENT=m # CONFIG_SND_HDA_SCODEC_CS35L41_I2C is not set # CONFIG_SND_HDA_SCODEC_CS35L41_SPI is not set # CONFIG_SND_HDA_SCODEC_CS35L56_I2C is not set # CONFIG_SND_HDA_SCODEC_CS35L56_SPI is not set # CONFIG_SND_HDA_SCODEC_TAS2781_I2C is not set CONFIG_SND_HDA_CODEC_REALTEK=m # CONFIG_SND_HDA_CODEC_ANALOG is not set # CONFIG_SND_HDA_CODEC_SIGMATEL is not set # CONFIG_SND_HDA_CODEC_VIA is not set CONFIG_SND_HDA_CODEC_HDMI=m # CONFIG_SND_HDA_CODEC_CIRRUS is not set # CONFIG_SND_HDA_CODEC_CS8409 is not set # CONFIG_SND_HDA_CODEC_CONEXANT is not set # CONFIG_SND_HDA_CODEC_CA0110 is not set # CONFIG_SND_HDA_CODEC_CA0132 is not set # CONFIG_SND_HDA_CODEC_CMEDIA is not set # CONFIG_SND_HDA_CODEC_SI3054 is not set CONFIG_SND_HDA_GENERIC=m CONFIG_SND_HDA_POWER_SAVE_DEFAULT=1 # CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM is not set # CONFIG_SND_HDA_CTL_DEV_ID is not set # end of HD-Audio CONFIG_SND_HDA_CORE=m CONFIG_SND_HDA_DSP_LOADER=y CONFIG_SND_HDA_COMPONENT=y CONFIG_SND_HDA_I915=y CONFIG_SND_HDA_EXT_CORE=m CONFIG_SND_HDA_PREALLOC_SIZE=0 CONFIG_SND_INTEL_NHLT=y CONFIG_SND_INTEL_DSP_CONFIG=m CONFIG_SND_INTEL_SOUNDWIRE_ACPI=m CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m # CONFIG_SND_USB_AUDIO_MIDI_V2 is not set CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_USX2Y is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_US122L is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_BCD2000 is not set # CONFIG_SND_USB_POD is not set # CONFIG_SND_USB_PODHD is not set # CONFIG_SND_USB_TONEPORT is not set # CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=m CONFIG_SND_SOC_COMPRESS=y CONFIG_SND_SOC_TOPOLOGY=y CONFIG_SND_SOC_ACPI=m # CONFIG_SND_SOC_ADI is not set # CONFIG_SND_SOC_AMD_ACP is not set # CONFIG_SND_SOC_AMD_ACP3x is not set # CONFIG_SND_SOC_AMD_RENOIR is not set # CONFIG_SND_SOC_AMD_ACP5x is not set # CONFIG_SND_SOC_AMD_ACP6x is not set CONFIG_SND_AMD_ACP_CONFIG=m # CONFIG_SND_SOC_AMD_ACP_COMMON is not set # CONFIG_SND_SOC_AMD_RPL_ACP6x is not set # CONFIG_SND_SOC_AMD_PS is not set # CONFIG_SND_ATMEL_SOC is not set # CONFIG_SND_BCM63XX_I2S_WHISTLER is not set # CONFIG_SND_DESIGNWARE_I2S is not set # # SoC Audio for Freescale CPUs # # # Common SoC Audio options for Freescale CPUs: # # CONFIG_SND_SOC_FSL_ASRC is not set # CONFIG_SND_SOC_FSL_SAI is not set # CONFIG_SND_SOC_FSL_AUDMIX is not set # CONFIG_SND_SOC_FSL_SSI is not set # CONFIG_SND_SOC_FSL_SPDIF is not set # CONFIG_SND_SOC_FSL_ESAI is not set # CONFIG_SND_SOC_FSL_MICFIL is not set # CONFIG_SND_SOC_FSL_XCVR is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs # CONFIG_SND_SOC_CHV3_I2S is not set # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y CONFIG_SND_SOC_INTEL_SST=m # CONFIG_SND_SOC_INTEL_CATPT is not set # CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI is not set # CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI is not set CONFIG_SND_SOC_INTEL_SKYLAKE=m CONFIG_SND_SOC_INTEL_SKL=m CONFIG_SND_SOC_INTEL_APL=m CONFIG_SND_SOC_INTEL_KBL=m CONFIG_SND_SOC_INTEL_GLK=m CONFIG_SND_SOC_INTEL_CNL=m CONFIG_SND_SOC_INTEL_CFL=m # CONFIG_SND_SOC_INTEL_CML_H is not set # CONFIG_SND_SOC_INTEL_CML_LP is not set CONFIG_SND_SOC_INTEL_SKYLAKE_FAMILY=m CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC=y CONFIG_SND_SOC_INTEL_SKYLAKE_COMMON=m CONFIG_SND_SOC_ACPI_INTEL_MATCH=m CONFIG_SND_SOC_INTEL_AVS=m # # Intel AVS Machine drivers # # # Available DSP configurations # # CONFIG_SND_SOC_INTEL_AVS_MACH_DA7219 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_DMIC is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_ES8336 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_HDAUDIO is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_I2S_TEST is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_MAX98927 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_MAX98357A is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_MAX98373 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_NAU8825 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_PROBE is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_RT274 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_RT286 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_RT298 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_RT5514 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_RT5663 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_RT5682 is not set # CONFIG_SND_SOC_INTEL_AVS_MACH_SSM4567 is not set # end of Intel AVS Machine drivers CONFIG_SND_SOC_INTEL_MACH=y CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES=y # CONFIG_SND_SOC_INTEL_SKL_RT286_MACH is not set # CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH is not set # CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH is not set # CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH is not set # CONFIG_SND_SOC_INTEL_BXT_RT298_MACH is not set # CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH is not set # CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH is not set # CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98357A_MACH is not set # CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98927_MACH is not set # CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH is not set # CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH is not set # CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH is not set # CONFIG_SND_SOC_INTEL_SOF_CS42L42_MACH is not set # CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set # CONFIG_SND_SOC_INTEL_SOF_ES8336_MACH is not set # CONFIG_SND_SOC_INTEL_SOF_NAU8825_MACH is not set # CONFIG_SND_SOC_INTEL_SOF_DA7219_MACH is not set # CONFIG_SND_SOC_INTEL_SOF_SSP_AMP_MACH is not set # CONFIG_SND_SOC_MTK_BTCVSD is not set CONFIG_SND_SOC_SOF_TOPLEVEL=y CONFIG_SND_SOC_SOF_PCI_DEV=m CONFIG_SND_SOC_SOF_PCI=m # CONFIG_SND_SOC_SOF_ACPI is not set CONFIG_SND_SOC_SOF_DEBUG_PROBES=m CONFIG_SND_SOC_SOF_CLIENT=m # CONFIG_SND_SOC_SOF_DEVELOPER_SUPPORT is not set CONFIG_SND_SOC_SOF=m CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE=y CONFIG_SND_SOC_SOF_IPC3=y CONFIG_SND_SOC_SOF_IPC4=y CONFIG_SND_SOC_SOF_AMD_TOPLEVEL=m CONFIG_SND_SOC_SOF_AMD_COMMON=m # CONFIG_SND_SOC_SOF_AMD_RENOIR is not set # CONFIG_SND_SOC_SOF_AMD_VANGOGH is not set CONFIG_SND_SOC_SOF_AMD_REMBRANDT=m CONFIG_SND_SOC_SOF_ACP_PROBES=m # CONFIG_SND_SOC_SOF_AMD_ACP63 is not set CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL=y CONFIG_SND_SOC_SOF_INTEL_COMMON=m # CONFIG_SND_SOC_SOF_MERRIFIELD is not set CONFIG_SND_SOC_SOF_INTEL_SKL=m CONFIG_SND_SOC_SOF_SKYLAKE=m # CONFIG_SND_SOC_SOF_KABYLAKE is not set # CONFIG_SND_SOC_SOF_APOLLOLAKE is not set # CONFIG_SND_SOC_SOF_GEMINILAKE is not set # CONFIG_SND_SOC_SOF_CANNONLAKE is not set # CONFIG_SND_SOC_SOF_COFFEELAKE is not set # CONFIG_SND_SOC_SOF_COMETLAKE is not set # CONFIG_SND_SOC_SOF_ICELAKE is not set # CONFIG_SND_SOC_SOF_JASPERLAKE is not set # CONFIG_SND_SOC_SOF_TIGERLAKE is not set # CONFIG_SND_SOC_SOF_ELKHARTLAKE is not set # CONFIG_SND_SOC_SOF_ALDERLAKE is not set # CONFIG_SND_SOC_SOF_METEORLAKE is not set # CONFIG_SND_SOC_SOF_LUNARLAKE is not set CONFIG_SND_SOC_SOF_HDA_COMMON=m CONFIG_SND_SOC_SOF_HDA_MLINK=m CONFIG_SND_SOC_SOF_HDA_LINK=y CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC=y CONFIG_SND_SOC_SOF_HDA_LINK_BASELINE=m CONFIG_SND_SOC_SOF_HDA=m CONFIG_SND_SOC_SOF_HDA_PROBES=m CONFIG_SND_SOC_SOF_XTENSA=m # # STMicroelectronics STM32 SOC audio support # # end of STMicroelectronics STM32 SOC audio support # CONFIG_SND_SOC_XILINX_I2S is not set # CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set # CONFIG_SND_SOC_XILINX_SPDIF is not set # CONFIG_SND_SOC_XTFPGA_I2S is not set CONFIG_SND_SOC_I2C_AND_SPI=m # # CODEC drivers # # CONFIG_SND_SOC_AC97_CODEC is not set # CONFIG_SND_SOC_ADAU1372_I2C is not set # CONFIG_SND_SOC_ADAU1372_SPI is not set # CONFIG_SND_SOC_ADAU1701 is not set # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set # CONFIG_SND_SOC_ADAU7118_HW is not set # CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set # CONFIG_SND_SOC_AK4375 is not set # CONFIG_SND_SOC_AK4458 is not set # CONFIG_SND_SOC_AK4554 is not set # CONFIG_SND_SOC_AK4613 is not set # CONFIG_SND_SOC_AK4642 is not set # CONFIG_SND_SOC_AK5386 is not set # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_AW88395 is not set # CONFIG_SND_SOC_AW88261 is not set # CONFIG_SND_SOC_AW87390 is not set # CONFIG_SND_SOC_AW88399 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CHV3_CODEC is not set # CONFIG_SND_SOC_CS35L32 is not set # CONFIG_SND_SOC_CS35L33 is not set # CONFIG_SND_SOC_CS35L34 is not set # CONFIG_SND_SOC_CS35L35 is not set # CONFIG_SND_SOC_CS35L36 is not set # CONFIG_SND_SOC_CS35L41_SPI is not set # CONFIG_SND_SOC_CS35L41_I2C is not set # CONFIG_SND_SOC_CS35L45_SPI is not set # CONFIG_SND_SOC_CS35L45_I2C is not set # CONFIG_SND_SOC_CS35L56_I2C is not set # CONFIG_SND_SOC_CS35L56_SPI is not set # CONFIG_SND_SOC_CS35L56_SDW is not set # CONFIG_SND_SOC_CS42L42 is not set # CONFIG_SND_SOC_CS42L42_SDW is not set # CONFIG_SND_SOC_CS42L51_I2C is not set # CONFIG_SND_SOC_CS42L52 is not set # CONFIG_SND_SOC_CS42L56 is not set # CONFIG_SND_SOC_CS42L73 is not set # CONFIG_SND_SOC_CS42L83 is not set # CONFIG_SND_SOC_CS4234 is not set # CONFIG_SND_SOC_CS4265 is not set # CONFIG_SND_SOC_CS4270 is not set # CONFIG_SND_SOC_CS4271_I2C is not set # CONFIG_SND_SOC_CS4271_SPI is not set # CONFIG_SND_SOC_CS42XX8_I2C is not set # CONFIG_SND_SOC_CS43130 is not set # CONFIG_SND_SOC_CS4341 is not set # CONFIG_SND_SOC_CS4349 is not set # CONFIG_SND_SOC_CS53L30 is not set # CONFIG_SND_SOC_CX2072X is not set # CONFIG_SND_SOC_DA7213 is not set # CONFIG_SND_SOC_DMIC is not set # CONFIG_SND_SOC_ES7134 is not set # CONFIG_SND_SOC_ES7241 is not set # CONFIG_SND_SOC_ES8316 is not set # CONFIG_SND_SOC_ES8326 is not set # CONFIG_SND_SOC_ES8328_I2C is not set # CONFIG_SND_SOC_ES8328_SPI is not set # CONFIG_SND_SOC_GTM601 is not set CONFIG_SND_SOC_HDAC_HDA=m CONFIG_SND_SOC_HDA=m # CONFIG_SND_SOC_ICS43432 is not set # CONFIG_SND_SOC_IDT821034 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98090 is not set # CONFIG_SND_SOC_MAX98357A is not set # CONFIG_SND_SOC_MAX98504 is not set # CONFIG_SND_SOC_MAX9867 is not set # CONFIG_SND_SOC_MAX98927 is not set # CONFIG_SND_SOC_MAX98520 is not set # CONFIG_SND_SOC_MAX98363 is not set # CONFIG_SND_SOC_MAX98373_I2C is not set # CONFIG_SND_SOC_MAX98373_SDW is not set # CONFIG_SND_SOC_MAX98388 is not set # CONFIG_SND_SOC_MAX98390 is not set # CONFIG_SND_SOC_MAX98396 is not set # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM1789_I2C is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set # CONFIG_SND_SOC_PCM186X_I2C is not set # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM5102A is not set # CONFIG_SND_SOC_PCM512x_I2C is not set # CONFIG_SND_SOC_PCM512x_SPI is not set # CONFIG_SND_SOC_PEB2466 is not set # CONFIG_SND_SOC_RK3328 is not set # CONFIG_SND_SOC_RT1017_SDCA_SDW is not set # CONFIG_SND_SOC_RT1308_SDW is not set # CONFIG_SND_SOC_RT1316_SDW is not set # CONFIG_SND_SOC_RT1318_SDW is not set # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT5682_SDW is not set # CONFIG_SND_SOC_RT700_SDW is not set # CONFIG_SND_SOC_RT711_SDW is not set # CONFIG_SND_SOC_RT711_SDCA_SDW is not set # CONFIG_SND_SOC_RT712_SDCA_SDW is not set # CONFIG_SND_SOC_RT712_SDCA_DMIC_SDW is not set # CONFIG_SND_SOC_RT722_SDCA_SDW is not set # CONFIG_SND_SOC_RT715_SDW is not set # CONFIG_SND_SOC_RT715_SDCA_SDW is not set # CONFIG_SND_SOC_RT9120 is not set # CONFIG_SND_SOC_RTQ9128 is not set # CONFIG_SND_SOC_SDW_MOCKUP is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set # CONFIG_SND_SOC_SMA1303 is not set # CONFIG_SND_SOC_SPDIF is not set # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set # CONFIG_SND_SOC_SSM2518 is not set # CONFIG_SND_SOC_SSM2602_SPI is not set # CONFIG_SND_SOC_SSM2602_I2C is not set # CONFIG_SND_SOC_SSM4567 is not set # CONFIG_SND_SOC_STA32X is not set # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set # CONFIG_SND_SOC_TAS2562 is not set # CONFIG_SND_SOC_TAS2764 is not set # CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS2780 is not set # CONFIG_SND_SOC_TAS2781_I2C is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set # CONFIG_SND_SOC_TAS5805M is not set # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320ADC3XXX is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set # CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set # CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set # CONFIG_SND_SOC_TLV320AIC3X_I2C is not set # CONFIG_SND_SOC_TLV320AIC3X_SPI is not set # CONFIG_SND_SOC_TLV320ADCX140 is not set # CONFIG_SND_SOC_TS3A227E is not set # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set # CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WCD938X_SDW is not set # CONFIG_SND_SOC_WCD939X_SDW is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set # CONFIG_SND_SOC_WM8580 is not set # CONFIG_SND_SOC_WM8711 is not set # CONFIG_SND_SOC_WM8728 is not set # CONFIG_SND_SOC_WM8731_I2C is not set # CONFIG_SND_SOC_WM8731_SPI is not set # CONFIG_SND_SOC_WM8737 is not set # CONFIG_SND_SOC_WM8741 is not set # CONFIG_SND_SOC_WM8750 is not set # CONFIG_SND_SOC_WM8753 is not set # CONFIG_SND_SOC_WM8770 is not set # CONFIG_SND_SOC_WM8776 is not set # CONFIG_SND_SOC_WM8782 is not set # CONFIG_SND_SOC_WM8804_I2C is not set # CONFIG_SND_SOC_WM8804_SPI is not set # CONFIG_SND_SOC_WM8903 is not set # CONFIG_SND_SOC_WM8904 is not set # CONFIG_SND_SOC_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8961 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set # CONFIG_SND_SOC_WM8985 is not set # CONFIG_SND_SOC_WSA881X is not set # CONFIG_SND_SOC_WSA883X is not set # CONFIG_SND_SOC_WSA884X is not set # CONFIG_SND_SOC_ZL38060 is not set # CONFIG_SND_SOC_MAX9759 is not set # CONFIG_SND_SOC_MT6351 is not set # CONFIG_SND_SOC_MT6358 is not set # CONFIG_SND_SOC_MT6660 is not set # CONFIG_SND_SOC_NAU8315 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8821 is not set # CONFIG_SND_SOC_NAU8822 is not set # CONFIG_SND_SOC_NAU8824 is not set # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_LPASS_WSA_MACRO is not set # CONFIG_SND_SOC_LPASS_VA_MACRO is not set # CONFIG_SND_SOC_LPASS_RX_MACRO is not set # CONFIG_SND_SOC_LPASS_TX_MACRO is not set # end of CODEC drivers # CONFIG_SND_SIMPLE_CARD is not set CONFIG_SND_X86=y # CONFIG_HDMI_LPE_AUDIO is not set # CONFIG_SND_XEN_FRONTEND is not set # CONFIG_SND_VIRTIO is not set CONFIG_HID_SUPPORT=y CONFIG_HID=m CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y # CONFIG_UHID is not set CONFIG_HID_GENERIC=m # # Special HID drivers # # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set # CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_ASUS is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set # CONFIG_HID_BETOP_FF is not set # CONFIG_HID_BIGBEN_FF is not set # CONFIG_HID_CHERRY is not set # CONFIG_HID_CHICONY is not set # CONFIG_HID_CORSAIR is not set # CONFIG_HID_COUGAR is not set # CONFIG_HID_MACALLY is not set # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set # CONFIG_HID_CREATIVE_SB0540 is not set # CONFIG_HID_CYPRESS is not set # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELAN is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set # CONFIG_HID_EVISION is not set # CONFIG_HID_EZKEY is not set # CONFIG_HID_FT260 is not set # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_GLORIOUS is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_GOOGLE_STADIA_FF is not set # CONFIG_HID_VIVALDI is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set # CONFIG_HID_KYE is not set # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_VRC2 is not set # CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set # CONFIG_HID_JABRA is not set # CONFIG_HID_TWINHAN is not set # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set # CONFIG_HID_LENOVO is not set # CONFIG_HID_LETSKETCH is not set # CONFIG_HID_LOGITECH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set # CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set CONFIG_HID_MULTITOUCH=m # CONFIG_HID_NINTENDO is not set # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set # CONFIG_HID_NVIDIA_SHIELD is not set # CONFIG_HID_ORTEK is not set # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PENMOUNT is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PXRC is not set # CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SEMITEK is not set # CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SONY is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_TOPRE is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_U2FZERO is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # CONFIG_HID_MCP2200 is not set # CONFIG_HID_MCP2221 is not set # end of Special HID drivers # # HID-BPF support # # CONFIG_HID_BPF is not set # end of HID-BPF support # # USB HID support # CONFIG_USB_HID=m CONFIG_HID_PID=y CONFIG_USB_HIDDEV=y # # USB HID Boot Protocol drivers # # CONFIG_USB_KBD is not set # CONFIG_USB_MOUSE is not set # end of USB HID Boot Protocol drivers # end of USB HID support CONFIG_I2C_HID=m CONFIG_I2C_HID_ACPI=m # CONFIG_I2C_HID_OF is not set CONFIG_I2C_HID_CORE=m # # Intel ISH HID support # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support # # AMD SFH HID Support # # CONFIG_AMD_SFH_HID is not set # end of AMD SFH HID Support CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=m CONFIG_USB_LED_TRIG=y # CONFIG_USB_ULPI_BUS is not set # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=m CONFIG_USB_PCI=y CONFIG_USB_PCI_AMD=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_FEW_INIT_RETRIES is not set CONFIG_USB_DYNAMIC_MINORS=y # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 # CONFIG_USB_MON is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=m # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=m # CONFIG_USB_XHCI_PCI_RENESAS is not set # CONFIG_USB_XHCI_PLATFORM is not set # CONFIG_USB_EHCI_HCD is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_MAX3421_HCD is not set # CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # CONFIG_USB_XEN_HCD is not set # # USB Device Class drivers # # CONFIG_USB_ACM is not set # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=m # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set # CONFIG_USB_UAS is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # # USB dual-mode controller drivers # # CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # # CONFIG_USB_SERIAL is not set # # USB Miscellaneous drivers # # CONFIG_USB_USS720 is not set # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_APPLE_MFI_FASTCHARGE is not set # CONFIG_USB_LJCA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HUB_USB251XB is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # end of USB Physical Layer drivers CONFIG_USB_GADGET=m # CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # # USB Peripheral Controller # # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set # CONFIG_USB_MV_UDC is not set # CONFIG_USB_MV_U3D is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_BDC_UDC is not set # CONFIG_USB_AMD5536UDC is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_NET2280 is not set # CONFIG_USB_GOKU is not set # CONFIG_USB_EG20T is not set # CONFIG_USB_MAX3420_UDC is not set # CONFIG_USB_CDNS2_UDC is not set # CONFIG_USB_DUMMY_HCD is not set # end of USB Peripheral Controller # CONFIG_USB_CONFIGFS is not set # # USB Gadget precomposed configurations # # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set # CONFIG_USB_ETH is not set # CONFIG_USB_G_NCM is not set # CONFIG_USB_GADGETFS is not set # CONFIG_USB_FUNCTIONFS is not set # CONFIG_USB_MASS_STORAGE is not set # CONFIG_USB_G_SERIAL is not set # CONFIG_USB_MIDI_GADGET is not set # CONFIG_USB_G_PRINTER is not set # CONFIG_USB_CDC_COMPOSITE is not set # CONFIG_USB_G_ACM_MS is not set # CONFIG_USB_G_MULTI is not set # CONFIG_USB_G_HID is not set # CONFIG_USB_G_DBGP is not set # CONFIG_USB_G_WEBCAM is not set # CONFIG_USB_RAW_GADGET is not set # end of USB Gadget precomposed configurations CONFIG_TYPEC=m # CONFIG_TYPEC_TCPM is not set CONFIG_TYPEC_UCSI=m # CONFIG_UCSI_CCG is not set CONFIG_UCSI_ACPI=m # CONFIG_UCSI_STM32G0 is not set # CONFIG_TYPEC_TPS6598X is not set # CONFIG_TYPEC_ANX7411 is not set # CONFIG_TYPEC_RT1719 is not set # CONFIG_TYPEC_HD3SS3220 is not set # CONFIG_TYPEC_STUSB160X is not set # CONFIG_TYPEC_WUSB3801 is not set # # USB Type-C Multiplexer/DeMultiplexer Switch support # # CONFIG_TYPEC_MUX_FSA4480 is not set # CONFIG_TYPEC_MUX_GPIO_SBU is not set # CONFIG_TYPEC_MUX_PI3USB30532 is not set # CONFIG_TYPEC_MUX_INTEL_PMC is not set # CONFIG_TYPEC_MUX_IT5205 is not set # CONFIG_TYPEC_MUX_NB7VPQ904M is not set # CONFIG_TYPEC_MUX_PTN36502 is not set # CONFIG_TYPEC_MUX_WCD939X_USBSS is not set # end of USB Type-C Multiplexer/DeMultiplexer Switch support # # USB Type-C Alternate Mode drivers # # CONFIG_TYPEC_DP_ALTMODE is not set # end of USB Type-C Alternate Mode drivers CONFIG_USB_ROLE_SWITCH=m CONFIG_USB_ROLES_INTEL_XHCI=m # CONFIG_MMC is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # CONFIG_LEDS_CLASS_MULTICOLOR is not set CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y # # LED drivers # # CONFIG_LEDS_APU is not set # CONFIG_LEDS_AW200XX is not set # CONFIG_LEDS_CHT_WCOVE is not set # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3532 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_PCA9532 is not set # CONFIG_LEDS_GPIO is not set # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_PCA995X is not set # CONFIG_LEDS_DAC124S085 is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_BD2606MVV is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_INTEL_SS4200 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_IS31FL319X is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # CONFIG_LEDS_MLXCPLD is not set # CONFIG_LEDS_MLXREG is not set # CONFIG_LEDS_USER is not set # CONFIG_LEDS_NIC78BX is not set # # Flash and Torch LED drivers # # # RGB LED drivers # # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set CONFIG_LEDS_TRIGGER_CPU=y # CONFIG_LEDS_TRIGGER_ACTIVITY is not set # CONFIG_LEDS_TRIGGER_GPIO is not set # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set CONFIG_LEDS_TRIGGER_PANIC=y # CONFIG_LEDS_TRIGGER_NETDEV is not set # CONFIG_LEDS_TRIGGER_PATTERN is not set CONFIG_LEDS_TRIGGER_AUDIO=m # CONFIG_LEDS_TRIGGER_TTY is not set # # Simple LED drivers # CONFIG_ACCESSIBILITY=y CONFIG_A11Y_BRAILLE_CONSOLE=y # # Speakup console speech # # CONFIG_SPEAKUP is not set # end of Speakup console speech # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y CONFIG_EDAC=y CONFIG_EDAC_LEGACY_SYSFS=y # CONFIG_EDAC_DEBUG is not set # CONFIG_EDAC_DECODE_MCE is not set # CONFIG_EDAC_GHES is not set # CONFIG_EDAC_E752X is not set # CONFIG_EDAC_I82975X is not set # CONFIG_EDAC_I3000 is not set # CONFIG_EDAC_I3200 is not set # CONFIG_EDAC_IE31200 is not set # CONFIG_EDAC_X38 is not set # CONFIG_EDAC_I5400 is not set # CONFIG_EDAC_I7CORE is not set # CONFIG_EDAC_I5100 is not set # CONFIG_EDAC_I7300 is not set # CONFIG_EDAC_SBRIDGE is not set # CONFIG_EDAC_SKX is not set # CONFIG_EDAC_I10NM is not set # CONFIG_EDAC_PND2 is not set # CONFIG_EDAC_IGEN6 is not set CONFIG_RTC_LIB=y CONFIG_RTC_MC146818_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_SYSTOHC=y CONFIG_RTC_SYSTOHC_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set CONFIG_RTC_NVMEM=y # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABEOZ9 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_MAX31335 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV3028 is not set # CONFIG_RTC_DRV_RV3032 is not set # CONFIG_RTC_DRV_RV8803 is not set # CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # # CONFIG_RTC_DRV_M41T93 is not set # CONFIG_RTC_DRV_M41T94 is not set # CONFIG_RTC_DRV_DS1302 is not set # CONFIG_RTC_DRV_DS1305 is not set # CONFIG_RTC_DRV_DS1343 is not set # CONFIG_RTC_DRV_DS1347 is not set # CONFIG_RTC_DRV_DS1390 is not set # CONFIG_RTC_DRV_MAX6916 is not set # CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_RX4581 is not set # CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_MAX6902 is not set # CONFIG_RTC_DRV_PCF2123 is not set # CONFIG_RTC_DRV_MCP795 is not set CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers # CONFIG_RTC_DRV_CMOS=y # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_RP5C01 is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_FTRTC010 is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_GOLDFISH is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_ACPI=y # CONFIG_ALTERA_MSGDMA is not set CONFIG_INTEL_IDMA64=m # CONFIG_INTEL_IDXD is not set # CONFIG_INTEL_IDXD_COMPAT is not set # CONFIG_INTEL_IOATDMA is not set # CONFIG_PLX_DMA is not set # CONFIG_XILINX_DMA is not set # CONFIG_XILINX_XDMA is not set # CONFIG_AMD_PTDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set # CONFIG_DW_EDMA is not set CONFIG_HSU_DMA=y # CONFIG_SF_PDMA is not set # CONFIG_INTEL_LDMA is not set # # DMA Clients # CONFIG_ASYNC_TX_DMA=y # CONFIG_DMATEST is not set # # DMABUF options # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set # CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_UIO is not set # CONFIG_VFIO is not set CONFIG_IRQ_BYPASS_MANAGER=y CONFIG_VIRT_DRIVERS=y CONFIG_VMGENID=y # CONFIG_VBOXGUEST is not set # CONFIG_NITRO_ENCLAVES is not set # CONFIG_EFI_SECRET is not set # CONFIG_SEV_GUEST is not set # CONFIG_TDX_GUEST_DRIVER is not set CONFIG_VIRTIO_ANCHOR=y CONFIG_VIRTIO=y CONFIG_VIRTIO_PCI_LIB=y CONFIG_VIRTIO_PCI_LIB_LEGACY=y CONFIG_VIRTIO_MENU=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_PCI_ADMIN_LEGACY=y CONFIG_VIRTIO_PCI_LEGACY=y # CONFIG_VIRTIO_BALLOON is not set # CONFIG_VIRTIO_MEM is not set # CONFIG_VIRTIO_INPUT is not set # CONFIG_VIRTIO_MMIO is not set # CONFIG_VDPA is not set CONFIG_VHOST_MENU=y # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support # # CONFIG_HYPERV is not set # end of Microsoft Hyper-V guest support # # Xen driver support # CONFIG_XEN_BALLOON=y CONFIG_XEN_BALLOON_MEMORY_HOTPLUG=y CONFIG_XEN_MEMORY_HOTPLUG_LIMIT=512 CONFIG_XEN_SCRUB_PAGES_DEFAULT=y # CONFIG_XEN_DEV_EVTCHN is not set CONFIG_XEN_BACKEND=y # CONFIG_XENFS is not set CONFIG_XEN_SYS_HYPERVISOR=y CONFIG_XEN_XENBUS_FRONTEND=y # CONFIG_XEN_GNTDEV is not set # CONFIG_XEN_GRANT_DEV_ALLOC is not set # CONFIG_XEN_GRANT_DMA_ALLOC is not set CONFIG_SWIOTLB_XEN=y # CONFIG_XEN_PCIDEV_BACKEND is not set # CONFIG_XEN_PVCALLS_FRONTEND is not set # CONFIG_XEN_PVCALLS_BACKEND is not set # CONFIG_XEN_PRIVCMD is not set # CONFIG_XEN_ACPI_PROCESSOR is not set CONFIG_XEN_MCE_LOG=y CONFIG_XEN_HAVE_PVMMU=y CONFIG_XEN_EFI=y CONFIG_XEN_AUTO_XLATE=y CONFIG_XEN_ACPI=y CONFIG_XEN_HAVE_VPMU=y CONFIG_XEN_UNPOPULATED_ALLOC=y # CONFIG_XEN_VIRTIO is not set # end of Xen driver support # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_RTLLIB is not set # CONFIG_R8712U is not set # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set # CONFIG_FB_SM750 is not set CONFIG_STAGING_MEDIA=y # CONFIG_INTEL_ATOMISP is not set # CONFIG_VIDEO_IPU3_IMGU is not set # # StarFive media platform drivers # # CONFIG_STAGING_MEDIA_DEPRECATED is not set # CONFIG_LTE_GDM724X is not set # CONFIG_FB_TFT is not set # CONFIG_PI433 is not set # CONFIG_FIELDBUS_DEV is not set # CONFIG_VME_BUS is not set # CONFIG_GOLDFISH is not set CONFIG_CHROME_PLATFORMS=y # CONFIG_CHROMEOS_ACPI is not set # CONFIG_CHROMEOS_LAPTOP is not set # CONFIG_CHROMEOS_PSTORE is not set # CONFIG_CHROMEOS_TBMC is not set # CONFIG_CROS_EC is not set # CONFIG_CROS_KBD_LED_BACKLIGHT is not set # CONFIG_CROS_HPS_I2C is not set # CONFIG_CHROMEOS_PRIVACY_SCREEN is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_SURFACE_PLATFORMS=y # CONFIG_SURFACE3_WMI is not set # CONFIG_SURFACE_3_POWER_OPREGION is not set # CONFIG_SURFACE_GPE is not set # CONFIG_SURFACE_HOTPLUG is not set # CONFIG_SURFACE_PRO3_BUTTON is not set # CONFIG_SURFACE_AGGREGATOR is not set CONFIG_X86_PLATFORM_DEVICES=y CONFIG_ACPI_WMI=m CONFIG_WMI_BMOF=m # CONFIG_HUAWEI_WMI is not set # CONFIG_MXM_WMI is not set # CONFIG_NVIDIA_WMI_EC_BACKLIGHT is not set # CONFIG_XIAOMI_WMI is not set # CONFIG_GIGABYTE_WMI is not set # CONFIG_YOGABOOK is not set # CONFIG_ACERHDF is not set # CONFIG_ACER_WIRELESS is not set # CONFIG_ACER_WMI is not set # CONFIG_AMD_PMC is not set # CONFIG_AMD_HSMP is not set # CONFIG_AMD_WBRF is not set # CONFIG_ADV_SWBUTTON is not set # CONFIG_APPLE_GMUX is not set # CONFIG_ASUS_LAPTOP is not set # CONFIG_ASUS_WIRELESS is not set # CONFIG_ASUS_WMI is not set # CONFIG_ASUS_TF103C_DOCK is not set # CONFIG_EEEPC_LAPTOP is not set CONFIG_X86_PLATFORM_DRIVERS_DELL=y # CONFIG_ALIENWARE_WMI is not set CONFIG_DCDBAS=m CONFIG_DELL_LAPTOP=m # CONFIG_DELL_RBU is not set # CONFIG_DELL_RBTN is not set CONFIG_DELL_SMBIOS=m CONFIG_DELL_SMBIOS_WMI=y CONFIG_DELL_SMBIOS_SMM=y # CONFIG_DELL_SMO8800 is not set CONFIG_DELL_WMI=m # CONFIG_DELL_WMI_PRIVACY is not set # CONFIG_DELL_WMI_AIO is not set CONFIG_DELL_WMI_DESCRIPTOR=m # CONFIG_DELL_WMI_DDV is not set # CONFIG_DELL_WMI_LED is not set # CONFIG_DELL_WMI_SYSMAN is not set # CONFIG_AMILO_RFKILL is not set # CONFIG_FUJITSU_LAPTOP is not set # CONFIG_FUJITSU_TABLET is not set # CONFIG_GPD_POCKET_FAN is not set CONFIG_X86_PLATFORM_DRIVERS_HP=y # CONFIG_HP_ACCEL is not set # CONFIG_HP_WMI is not set # CONFIG_HP_BIOSCFG is not set # CONFIG_WIRELESS_HOTKEY is not set # CONFIG_IBM_RTL is not set # CONFIG_IDEAPAD_LAPTOP is not set # CONFIG_LENOVO_YMC is not set # CONFIG_SENSORS_HDAPS is not set # CONFIG_THINKPAD_ACPI is not set # CONFIG_THINKPAD_LMI is not set # CONFIG_INTEL_ATOMISP2_PM is not set # CONFIG_INTEL_IFS is not set # CONFIG_INTEL_SAR_INT1092 is not set # CONFIG_INTEL_SKL_INT3472 is not set CONFIG_INTEL_PMC_CORE=m CONFIG_INTEL_PMT_CLASS=m CONFIG_INTEL_PMT_TELEMETRY=m # CONFIG_INTEL_PMT_CRASHLOG is not set # # Intel Speed Select Technology interface support # # CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set # end of Intel Speed Select Technology interface support CONFIG_INTEL_WMI=y # CONFIG_INTEL_WMI_SBL_FW_UPDATE is not set CONFIG_INTEL_WMI_THUNDERBOLT=m # # Intel Uncore Frequency Control # # CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set # end of Intel Uncore Frequency Control CONFIG_INTEL_HID_EVENT=m CONFIG_INTEL_VBTN=m # CONFIG_INTEL_INT0002_VGPIO is not set # CONFIG_INTEL_OAKTRAIL is not set # CONFIG_INTEL_BYTCRC_PWRSRC is not set # CONFIG_INTEL_PUNIT_IPC is not set # CONFIG_INTEL_RST is not set # CONFIG_INTEL_SDSI is not set # CONFIG_INTEL_SMARTCONNECT is not set # CONFIG_INTEL_TPMI is not set CONFIG_INTEL_TURBO_MAX_3=y CONFIG_INTEL_VSEC=m # CONFIG_MSI_EC is not set # CONFIG_MSI_LAPTOP is not set # CONFIG_MSI_WMI is not set # CONFIG_PCENGINES_APU2 is not set # CONFIG_BARCO_P50_GPIO is not set # CONFIG_SAMSUNG_LAPTOP is not set # CONFIG_SAMSUNG_Q10 is not set # CONFIG_TOSHIBA_BT_RFKILL is not set # CONFIG_TOSHIBA_HAPS is not set # CONFIG_TOSHIBA_WMI is not set # CONFIG_ACPI_CMPC is not set # CONFIG_COMPAL_LAPTOP is not set # CONFIG_LG_LAPTOP is not set # CONFIG_PANASONIC_LAPTOP is not set # CONFIG_SONY_LAPTOP is not set # CONFIG_SYSTEM76_ACPI is not set # CONFIG_TOPSTAR_LAPTOP is not set # CONFIG_SERIAL_MULTI_INSTANTIATE is not set # CONFIG_MLX_PLATFORM is not set # CONFIG_INSPUR_PLATFORM_PROFILE is not set # CONFIG_X86_ANDROID_TABLETS is not set # CONFIG_INTEL_IPS is not set CONFIG_INTEL_SCU_IPC=y # CONFIG_INTEL_SCU_PCI is not set # CONFIG_INTEL_SCU_PLATFORM is not set # CONFIG_SIEMENS_SIMATIC_IPC is not set # CONFIG_WINMATE_FM07_KEYS is not set # CONFIG_SEL3350_PLATFORM is not set CONFIG_P2SB=y CONFIG_HAVE_CLK=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # # Clock Source drivers # CONFIG_CLKEVT_I8253=y CONFIG_I8253_LOCK=y CONFIG_CLKBLD_I8253=y # end of Clock Source drivers CONFIG_MAILBOX=y CONFIG_PCC=y # CONFIG_ALTERA_MBOX is not set CONFIG_IOMMU_IOVA=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IO_PGTABLE=y # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set # CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_IOMMU_DMA=y CONFIG_IOMMU_SVA=y CONFIG_IOMMU_IOPF=y CONFIG_AMD_IOMMU=y CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y CONFIG_INTEL_IOMMU_SVM=y # CONFIG_INTEL_IOMMU_DEFAULT_ON is not set CONFIG_INTEL_IOMMU_FLOPPY_WA=y CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON=y CONFIG_INTEL_IOMMU_PERF_EVENTS=y # CONFIG_IOMMUFD is not set CONFIG_IRQ_REMAP=y # CONFIG_VIRTIO_IOMMU is not set # # Remoteproc drivers # # CONFIG_REMOTEPROC is not set # end of Remoteproc drivers # # Rpmsg drivers # # CONFIG_RPMSG_QCOM_GLINK_RPM is not set # CONFIG_RPMSG_VIRTIO is not set # end of Rpmsg drivers CONFIG_SOUNDWIRE=m # # SoundWire Devices # # CONFIG_SOUNDWIRE_AMD is not set CONFIG_SOUNDWIRE_CADENCE=m CONFIG_SOUNDWIRE_INTEL=m # CONFIG_SOUNDWIRE_QCOM is not set CONFIG_SOUNDWIRE_GENERIC_ALLOCATION=m # # SOC (System On Chip) specific Drivers # # # Amlogic SoC drivers # # end of Amlogic SoC drivers # # Broadcom SoC drivers # # end of Broadcom SoC drivers # # NXP/Freescale QorIQ SoC drivers # # end of NXP/Freescale QorIQ SoC drivers # # fujitsu SoC drivers # # end of fujitsu SoC drivers # # i.MX SoC drivers # # end of i.MX SoC drivers # # Enable LiteX SoC Builder specific drivers # # end of Enable LiteX SoC Builder specific drivers # CONFIG_WPCM450_SOC is not set # # Qualcomm SoC drivers # # end of Qualcomm SoC drivers # CONFIG_SOC_TI is not set # # Xilinx SoC drivers # # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers # # PM Domains # # # Amlogic PM Domains # # end of Amlogic PM Domains # # Broadcom PM Domains # # end of Broadcom PM Domains # # i.MX PM Domains # # end of i.MX PM Domains # # Qualcomm PM Domains # # end of Qualcomm PM Domains # end of PM Domains CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND is not set # CONFIG_DEVFREQ_GOV_PERFORMANCE is not set # CONFIG_DEVFREQ_GOV_POWERSAVE is not set # CONFIG_DEVFREQ_GOV_USERSPACE is not set # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # # CONFIG_PM_DEVFREQ_EVENT is not set # CONFIG_EXTCON is not set CONFIG_MEMORY=y # CONFIG_IIO is not set # CONFIG_NTB is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_CLK is not set CONFIG_PWM_CRC=y # CONFIG_PWM_DWC is not set # CONFIG_PWM_LPSS_PCI is not set # CONFIG_PWM_LPSS_PLATFORM is not set # CONFIG_PWM_PCA9685 is not set # # IRQ chip support # # end of IRQ chip support # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y # CONFIG_RESET_GPIO is not set # CONFIG_RESET_SIMPLE is not set # CONFIG_RESET_TI_SYSCON is not set # CONFIG_RESET_TI_TPS380X is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set # CONFIG_PHY_CAN_TRANSCEIVER is not set # # PHY drivers for Broadcom platforms # # CONFIG_BCM_KONA_USB2_PHY is not set # end of PHY drivers for Broadcom platforms # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set # end of PHY Subsystem CONFIG_POWERCAP=y CONFIG_INTEL_RAPL_CORE=m CONFIG_INTEL_RAPL=m CONFIG_IDLE_INJECT=y # CONFIG_MCB is not set # # Performance monitor support # # CONFIG_DWC_PCIE_PMU is not set # end of Performance monitor support CONFIG_RAS=y CONFIG_RAS_CEC=y # CONFIG_RAS_CEC_DEBUG is not set # CONFIG_AMD_ATL is not set # CONFIG_USB4 is not set # # Android # # CONFIG_ANDROID_BINDER_IPC is not set # end of Android # CONFIG_LIBNVDIMM is not set CONFIG_DAX=y # CONFIG_DEV_DAX is not set # CONFIG_DEV_DAX_HMEM is not set CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_LAYOUTS is not set # CONFIG_NVMEM_RMEM is not set # # HW tracing support # # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # end of HW tracing support # CONFIG_FPGA is not set # CONFIG_TEE is not set CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set # CONFIG_MOST is not set # CONFIG_PECI is not set # CONFIG_HTE is not set # end of Device Drivers # # File systems # CONFIG_DCACHE_WORD_ACCESS=y # CONFIG_VALIDATE_FS_PARSER is not set CONFIG_FS_IOMAP=y CONFIG_FS_STACK=y CONFIG_BUFFER_HEAD=y CONFIG_LEGACY_DIRECT_IO=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set CONFIG_EXT4_FS=m CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=m # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=m # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set # CONFIG_XFS_FS is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set # CONFIG_BCACHEFS_FS is not set # CONFIG_ZONEFS_FS is not set CONFIG_FS_DAX=y CONFIG_FS_DAX_PMD=y CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y CONFIG_EXPORTFS_BLOCK_OPS=y CONFIG_FILE_LOCKING=y CONFIG_FS_ENCRYPTION=y CONFIG_FS_ENCRYPTION_ALGS=m CONFIG_FS_VERITY=y CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y # CONFIG_QUOTA_DEBUG is not set # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=m CONFIG_FUSE_FS=y # CONFIG_CUSE is not set CONFIG_VIRTIO_FS=y CONFIG_FUSE_DAX=y CONFIG_FUSE_PASSTHROUGH=y # CONFIG_OVERLAY_FS is not set # # Caches # # end of Caches # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # end of CD-ROM/DVD Filesystems # # DOS/FAT/EXFAT/NT Filesystems # CONFIG_FAT_FS=m # CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS=m CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="ascii" CONFIG_FAT_DEFAULT_UTF8=y # CONFIG_EXFAT_FS is not set # CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_VMCORE=y # CONFIG_PROC_VMCORE_DEVICE_DUMP is not set CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_PROC_CHILDREN=y CONFIG_PROC_PID_ARCH_STATUS=y CONFIG_PROC_CPU_RESCTRL=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y CONFIG_TMPFS_INODE64=y # CONFIG_TMPFS_QUOTA is not set CONFIG_HUGETLBFS=y # CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON is not set CONFIG_HUGETLB_PAGE=y CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=m CONFIG_EFIVAR_FS=m # end of Pseudo filesystems CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_CRAMFS is not set # CONFIG_SQUASHFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 CONFIG_PSTORE_COMPRESS=y # CONFIG_PSTORE_CONSOLE is not set # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set # CONFIG_PSTORE_RAM is not set # CONFIG_PSTORE_BLK is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y # CONFIG_NFS_FS is not set # CONFIG_NFSD is not set # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set # CONFIG_SMB_SERVER is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=m # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=m # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set CONFIG_UNICODE=y # CONFIG_UNICODE_NORMALIZATION_SELFTEST is not set CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y # CONFIG_KEYS_REQUEST_CACHE is not set CONFIG_PERSISTENT_KEYRINGS=y # CONFIG_TRUSTED_KEYS is not set CONFIG_ENCRYPTED_KEYS=y # CONFIG_USER_DECRYPTED_DATA is not set CONFIG_KEY_DH_OPERATIONS=y CONFIG_SECURITY_DMESG_RESTRICT=y CONFIG_SECURITY=y CONFIG_SECURITYFS=y CONFIG_SECURITY_NETWORK=y CONFIG_SECURITY_NETWORK_XFRM=y CONFIG_SECURITY_PATH=y CONFIG_INTEL_TXT=y CONFIG_LSM_MMAP_MIN_ADDR=65536 CONFIG_HARDENED_USERCOPY=y CONFIG_FORTIFY_SOURCE=y # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_SECURITY_SELINUX=y # CONFIG_SECURITY_SELINUX_BOOTPARAM is not set CONFIG_SECURITY_SELINUX_DEVELOP=y CONFIG_SECURITY_SELINUX_AVC_STATS=y CONFIG_SECURITY_SELINUX_SIDTAB_HASH_BITS=9 CONFIG_SECURITY_SELINUX_SID2STR_CACHE_SIZE=256 # CONFIG_SECURITY_SELINUX_DEBUG is not set # CONFIG_SECURITY_SMACK is not set CONFIG_SECURITY_TOMOYO=y CONFIG_SECURITY_TOMOYO_MAX_ACCEPT_ENTRY=2048 CONFIG_SECURITY_TOMOYO_MAX_AUDIT_LOG=1024 # CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER is not set CONFIG_SECURITY_TOMOYO_POLICY_LOADER="/sbin/tomoyo-init" CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER="/sbin/init" # CONFIG_SECURITY_TOMOYO_INSECURE_BUILTIN_SETTING is not set CONFIG_SECURITY_APPARMOR=y # CONFIG_SECURITY_APPARMOR_DEBUG is not set CONFIG_SECURITY_APPARMOR_INTROSPECT_POLICY=y CONFIG_SECURITY_APPARMOR_HASH=y CONFIG_SECURITY_APPARMOR_HASH_DEFAULT=y CONFIG_SECURITY_APPARMOR_EXPORT_BINARY=y CONFIG_SECURITY_APPARMOR_PARANOID_LOAD=y # CONFIG_SECURITY_LOADPIN is not set # CONFIG_SECURITY_YAMA is not set # CONFIG_SECURITY_SAFESETID is not set # CONFIG_SECURITY_LOCKDOWN_LSM is not set CONFIG_SECURITY_LANDLOCK=y CONFIG_INTEGRITY=y CONFIG_INTEGRITY_SIGNATURE=y CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y # CONFIG_INTEGRITY_TRUSTED_KEYRING is not set CONFIG_INTEGRITY_PLATFORM_KEYRING=y CONFIG_INTEGRITY_MACHINE_KEYRING=y # CONFIG_INTEGRITY_CA_MACHINE_KEYRING is not set CONFIG_LOAD_UEFI_KEYS=y CONFIG_INTEGRITY_AUDIT=y CONFIG_IMA=y # CONFIG_IMA_KEXEC is not set CONFIG_IMA_MEASURE_PCR_IDX=10 CONFIG_IMA_LSM_RULES=y # CONFIG_IMA_NG_TEMPLATE is not set CONFIG_IMA_SIG_TEMPLATE=y CONFIG_IMA_DEFAULT_TEMPLATE="ima-sig" # CONFIG_IMA_DEFAULT_HASH_SHA1 is not set CONFIG_IMA_DEFAULT_HASH_SHA256=y CONFIG_IMA_DEFAULT_HASH="sha256" # CONFIG_IMA_WRITE_POLICY is not set # CONFIG_IMA_READ_POLICY is not set CONFIG_IMA_APPRAISE=y CONFIG_IMA_ARCH_POLICY=y # CONFIG_IMA_APPRAISE_BUILD_POLICY is not set CONFIG_IMA_APPRAISE_BOOTPARAM=y # CONFIG_IMA_APPRAISE_MODSIG is not set # CONFIG_IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY is not set CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS=y CONFIG_IMA_QUEUE_EARLY_BOOT_KEYS=y CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT=y # CONFIG_IMA_DISABLE_HTABLE is not set CONFIG_EVM=y CONFIG_EVM_ATTR_FSUUID=y # CONFIG_EVM_ADD_XATTRS is not set # CONFIG_DEFAULT_SECURITY_SELINUX is not set # CONFIG_DEFAULT_SECURITY_TOMOYO is not set CONFIG_DEFAULT_SECURITY_APPARMOR=y # CONFIG_DEFAULT_SECURITY_DAC is not set CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,integrity,apparmor,selinux,smack,tomoyo,bpf" # # Kernel hardening options # # # Memory initialization # CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y # CONFIG_INIT_STACK_NONE is not set # CONFIG_INIT_STACK_ALL_PATTERN is not set CONFIG_INIT_STACK_ALL_ZERO=y CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y # CONFIG_ZERO_CALL_USED_REGS is not set # end of Memory initialization # # Hardening of kernel data structures # CONFIG_LIST_HARDENED=y CONFIG_BUG_ON_DATA_CORRUPTION=y # end of Hardening of kernel data structures CONFIG_RANDSTRUCT_NONE=y # end of Kernel hardening options # end of Security options CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=m CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_SIG2=y CONFIG_CRYPTO_SKCIPHER=y CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=m CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set # CONFIG_CRYPTO_MANAGER_EXTRA_TESTS is not set CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_NULL2=m # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_CRYPTD=m CONFIG_CRYPTO_AUTHENC=m # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=m # end of Crypto core or helper # # Public-key cryptography # CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y # CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography # # Block ciphers # CONFIG_CRYPTO_AES=y # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST6 is not set # CONFIG_CRYPTO_DES is not set # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SM4_GENERIC is not set # CONFIG_CRYPTO_TWOFISH is not set # end of Block ciphers # # Length-preserving ciphers and modes # # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CTR=m # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_HCTR2 is not set # CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # end of Length-preserving ciphers and modes # # AEAD (authenticated encryption with associated data) ciphers # # CONFIG_CRYPTO_AEGIS128 is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_CCM=m CONFIG_CRYPTO_GCM=m CONFIG_CRYPTO_GENIV=m CONFIG_CRYPTO_SEQIV=m CONFIG_CRYPTO_ECHAINIV=m CONFIG_CRYPTO_ESSIV=m # end of AEAD (authenticated encryption with associated data) ciphers # # Hashes, digests, and MACs # # CONFIG_CRYPTO_BLAKE2B is not set CONFIG_CRYPTO_CMAC=m CONFIG_CRYPTO_GHASH=m CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_SHA3=m # CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set # CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_XXHASH is not set # end of Hashes, digests, and MACs # # CRCs (cyclic redundancy checks) # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32 is not set CONFIG_CRYPTO_CRCT10DIF=m CONFIG_CRYPTO_CRC64_ROCKSOFT=m # end of CRCs (cyclic redundancy checks) # # Compression # CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set # end of Compression # # Random number generation # CONFIG_CRYPTO_ANSI_CPRNG=m CONFIG_CRYPTO_DRBG_MENU=m CONFIG_CRYPTO_DRBG_HMAC=y CONFIG_CRYPTO_DRBG_HASH=y CONFIG_CRYPTO_DRBG_CTR=y CONFIG_CRYPTO_DRBG=m CONFIG_CRYPTO_JITTERENTROPY=m CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64 CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32 CONFIG_CRYPTO_JITTERENTROPY_OSR=1 CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation # # Userspace interface # # CONFIG_CRYPTO_USER_API_HASH is not set # CONFIG_CRYPTO_USER_API_SKCIPHER is not set # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y # # Accelerated Cryptographic Algorithms for CPU (x86) # # CONFIG_CRYPTO_CURVE25519_X86 is not set CONFIG_CRYPTO_AES_NI_INTEL=m # CONFIG_CRYPTO_BLOWFISH_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set # CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set # CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set # CONFIG_CRYPTO_DES3_EDE_X86_64 is not set # CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set # CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set # CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set # CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set # CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set # CONFIG_CRYPTO_TWOFISH_X86_64 is not set # CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set # CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set # CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set # CONFIG_CRYPTO_ARIA_AESNI_AVX2_X86_64 is not set # CONFIG_CRYPTO_ARIA_GFNI_AVX512_X86_64 is not set # CONFIG_CRYPTO_CHACHA20_X86_64 is not set # CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set # CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set # CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set CONFIG_CRYPTO_BLAKE2S_X86=y # CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set # CONFIG_CRYPTO_POLY1305_X86_64 is not set CONFIG_CRYPTO_SHA1_SSSE3=m CONFIG_CRYPTO_SHA256_SSSE3=m CONFIG_CRYPTO_SHA512_SSSE3=m # CONFIG_CRYPTO_SM3_AVX_X86_64 is not set CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m CONFIG_CRYPTO_CRC32C_INTEL=m CONFIG_CRYPTO_CRC32_PCLMUL=m CONFIG_CRYPTO_CRCT10DIF_PCLMUL=m # end of Accelerated Cryptographic Algorithms for CPU (x86) CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_PADLOCK is not set # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set CONFIG_CRYPTO_DEV_CCP=y # CONFIG_CRYPTO_DEV_CCP_DD is not set # CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set # CONFIG_CRYPTO_DEV_QAT_C3XXX is not set # CONFIG_CRYPTO_DEV_QAT_C62X is not set # CONFIG_CRYPTO_DEV_QAT_4XXX is not set # CONFIG_CRYPTO_DEV_QAT_420XX is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set # CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set # CONFIG_CRYPTO_DEV_QAT_C62XVF is not set # CONFIG_CRYPTO_DEV_VIRTIO is not set # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y # CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set CONFIG_SIGNED_PE_FILE_VERIFICATION=y # CONFIG_FIPS_SIGNATURE_SELFTEST is not set # # Certificates for signature checking # CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set CONFIG_SECONDARY_TRUSTED_KEYRING=y # CONFIG_SECONDARY_TRUSTED_KEYRING_SIGNED_BY_BUILTIN is not set CONFIG_SYSTEM_BLACKLIST_KEYRING=y CONFIG_SYSTEM_BLACKLIST_HASH_LIST="" # CONFIG_SYSTEM_REVOCATION_LIST is not set # CONFIG_SYSTEM_BLACKLIST_AUTH_UPDATE is not set # end of Certificates for signature checking CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_LINEAR_RANGES=y # CONFIG_PACKING is not set CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # # Crypto library routines # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_LIB_GF128MUL=m CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=y CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y # CONFIG_CRYPTO_LIB_CHACHA is not set # CONFIG_CRYPTO_LIB_CURVE25519 is not set CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 # CONFIG_CRYPTO_LIB_POLY1305 is not set # CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set CONFIG_CRYPTO_LIB_SHA1=y CONFIG_CRYPTO_LIB_SHA256=y # end of Crypto library routines CONFIG_CRC_CCITT=y CONFIG_CRC16=m CONFIG_CRC_T10DIF=m CONFIG_CRC64_ROCKSOFT=m # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set CONFIG_CRC64=m # CONFIG_CRC4 is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=y # CONFIG_CRC8 is not set CONFIG_XXHASH=y # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMMON=y CONFIG_ZSTD_COMPRESS=y CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_DECOMPRESS_ZSTD=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_INTERVAL_TREE=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y CONFIG_NEED_SG_DMA_FLAGS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_ARCH_HAS_FORCE_DMA_UNENCRYPTED=y CONFIG_SWIOTLB=y # CONFIG_SWIOTLB_DYNAMIC is not set CONFIG_DMA_COHERENT_POOL=y # CONFIG_DMA_API_DEBUG is not set # CONFIG_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y CONFIG_IOMMU_HELPER=y CONFIG_CHECK_SIGNATURE=y CONFIG_CPUMASK_OFFSTACK=y # CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_CLZ_TAB=y CONFIG_IRQ_POLL=y CONFIG_MPILIB=y CONFIG_SIGNATURE=y CONFIG_OID_REGISTRY=y CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y CONFIG_FONT_SUPPORT=y CONFIG_FONTS=y CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # CONFIG_FONT_6x11 is not set # CONFIG_FONT_7x14 is not set # CONFIG_FONT_PEARL_8x8 is not set # CONFIG_FONT_ACORN_8x8 is not set # CONFIG_FONT_MINI_4x6 is not set # CONFIG_FONT_6x10 is not set # CONFIG_FONT_10x18 is not set # CONFIG_FONT_SUN8x16 is not set # CONFIG_FONT_SUN12x22 is not set CONFIG_FONT_TER16x32=y # CONFIG_FONT_6x8 is not set CONFIG_SG_POOL=y CONFIG_ARCH_HAS_PMEM_API=y CONFIG_MEMREGION=y CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION=y CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_STACKDEPOT_MAX_FRAMES=64 CONFIG_SBITMAP=y # CONFIG_LWQ_TEST is not set # end of Library routines CONFIG_FIRMWARE_TABLE=y # # Kernel hacking # # # printk and dmesg options # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set # CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 CONFIG_BOOT_PRINTK_DELAY=y CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y # # Compile-time checks and compiler options # CONFIG_AS_HAS_NON_CONST_ULEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=2048 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y # CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set CONFIG_OBJTOOL=y # CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options # # Generic Kernel Debugging Instruments # CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x01b6 CONFIG_MAGIC_SYSRQ_SERIAL=y CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN=y # CONFIG_UBSAN is not set CONFIG_HAVE_ARCH_KCSAN=y CONFIG_HAVE_KCSAN_COMPILER=y CONFIG_KCSAN=y CONFIG_KCSAN_SELFTEST=y # CONFIG_KCSAN_EARLY_ENABLE is not set CONFIG_KCSAN_NUM_WATCHPOINTS=64 CONFIG_KCSAN_UDELAY_TASK=80 CONFIG_KCSAN_UDELAY_INTERRUPT=20 CONFIG_KCSAN_DELAY_RANDOMIZE=y CONFIG_KCSAN_SKIP_WATCH=4000 CONFIG_KCSAN_SKIP_WATCH_RANDOMIZE=y # CONFIG_KCSAN_INTERRUPT_WATCHER is not set CONFIG_KCSAN_REPORT_ONCE_IN_MS=3000 CONFIG_KCSAN_REPORT_RACE_UNKNOWN_ORIGIN=y # CONFIG_KCSAN_STRICT is not set CONFIG_KCSAN_REPORT_VALUE_CHANGE_ONLY=y CONFIG_KCSAN_ASSUME_PLAIN_WRITES_ATOMIC=y # CONFIG_KCSAN_IGNORE_ATOMICS is not set # CONFIG_KCSAN_PERMISSIVE is not set # end of Generic Kernel Debugging Instruments # # Networking Debugging # # CONFIG_NET_DEV_REFCNT_TRACKER is not set # CONFIG_NET_NS_REFCNT_TRACKER is not set # CONFIG_DEBUG_NET is not set # end of Networking Debugging # # Memory Debugging # CONFIG_PAGE_EXTENSION=y # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_SLUB_DEBUG=y # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_TABLE_CHECK is not set CONFIG_PAGE_POISONING=y # CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y CONFIG_DEBUG_WX=y CONFIG_GENERIC_PTDUMP=y CONFIG_PTDUMP_CORE=y # CONFIG_PTDUMP_DEBUGFS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y CONFIG_DEBUG_KMEMLEAK=y CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE=16000 CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN=y # CONFIG_PER_VMA_LOCK_STATS is not set # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set # CONFIG_DEBUG_STACK_USAGE is not set CONFIG_SCHED_STACK_END_CHECK=y CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM_PGTABLE is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set CONFIG_HAVE_ARCH_KFENCE=y CONFIG_KFENCE=y CONFIG_KFENCE_SAMPLE_INTERVAL=0 CONFIG_KFENCE_NUM_OBJECTS=255 # CONFIG_KFENCE_DEFERRABLE is not set # CONFIG_KFENCE_STATIC_KEYS is not set CONFIG_KFENCE_STRESS_TEST_FAULTS=0 CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set # # Debug Oops, Lockups and Hangs # # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_HARDLOCKUP_DETECTOR_PREFER_BUDDY is not set CONFIG_HARDLOCKUP_DETECTOR_PERF=y # CONFIG_HARDLOCKUP_DETECTOR_BUDDY is not set # CONFIG_HARDLOCKUP_DETECTOR_ARCH is not set CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set # CONFIG_WQ_WATCHDOG is not set # CONFIG_WQ_CPU_INTENSIVE_REPORT is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y CONFIG_SCHEDSTATS=y # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set # CONFIG_DEBUG_PREEMPT is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_PROVE_LOCKING is not set # CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_LOCK_ALLOC is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set # CONFIG_WW_MUTEX_SELFTEST is not set # CONFIG_SCF_TORTURE_TEST is not set # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_NMI_CHECK_CPU is not set # CONFIG_DEBUG_IRQFLAGS is not set CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set # # Debug kernel data structures # CONFIG_DEBUG_LIST=y # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # # RCU Debugging # # CONFIG_RCU_SCALE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_CPU_STALL_CPUTIME is not set # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set # CONFIG_DEBUG_CGROUP_REF is not set CONFIG_USER_STACKTRACE_SUPPORT=y CONFIG_NOP_TRACER=y CONFIG_HAVE_RETHOOK=y CONFIG_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_OBJTOOL_NOP_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACER_MAX_TRACE=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y # CONFIG_BOOTTIME_TRACING is not set CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_FUNCTION_GRAPH_RETVAL is not set CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y CONFIG_FPROBE=y # CONFIG_FUNCTION_PROFILER is not set CONFIG_STACK_TRACER=y # CONFIG_IRQSOFF_TRACER is not set # CONFIG_PREEMPT_TRACER is not set # CONFIG_SCHED_TRACER is not set # CONFIG_HWLAT_TRACER is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_TIMERLAT_TRACER is not set CONFIG_MMIOTRACE=y CONFIG_FTRACE_SYSCALLS=y CONFIG_TRACER_SNAPSHOT=y # CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set CONFIG_BLK_DEV_IO_TRACE=y CONFIG_FPROBE_EVENTS=y CONFIG_KPROBE_EVENTS=y # CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set CONFIG_UPROBE_EVENTS=y CONFIG_BPF_EVENTS=y CONFIG_DYNAMIC_EVENTS=y CONFIG_PROBE_EVENTS=y CONFIG_FTRACE_MCOUNT_RECORD=y CONFIG_FTRACE_MCOUNT_USE_CC=y CONFIG_TRACING_MAP=y CONFIG_SYNTH_EVENTS=y # CONFIG_USER_EVENTS is not set CONFIG_HIST_TRIGGERS=y # CONFIG_TRACE_EVENT_INJECT is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set # CONFIG_FTRACE_RECORD_RECURSION is not set # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_FTRACE_SORT_STARTUP_TEST is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set # CONFIG_MMIOTRACE_TEST is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_SYNTH_EVENT_GEN_TEST is not set # CONFIG_KPROBE_EVENT_GEN_TEST is not set # CONFIG_HIST_TRIGGERS_DEBUG is not set # CONFIG_RV is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y CONFIG_STRICT_DEVMEM=y CONFIG_IO_STRICT_DEVMEM=y # # x86 Debugging # # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set # CONFIG_EARLY_PRINTK_USB_XDBC is not set # CONFIG_EFI_PGT_DUMP is not set # CONFIG_DEBUG_TLBFLUSH is not set # CONFIG_IOMMU_DEBUG is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y # CONFIG_X86_DECODER_SELFTEST is not set CONFIG_IO_DELAY_0X80=y # CONFIG_IO_DELAY_0XED is not set # CONFIG_IO_DELAY_UDELAY is not set # CONFIG_IO_DELAY_NONE is not set # CONFIG_DEBUG_BOOT_PARAMS is not set # CONFIG_CPA_DEBUG is not set # CONFIG_DEBUG_ENTRY is not set # CONFIG_DEBUG_NMI_SELFTEST is not set CONFIG_X86_DEBUG_FPU=y # CONFIG_PUNIT_ATOM_DEBUG is not set CONFIG_UNWINDER_ORC=y # CONFIG_UNWINDER_FRAME_POINTER is not set # end of x86 Debugging # # Kernel Testing and Coverage # # CONFIG_KUNIT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FUNCTION_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_DHRY is not set # CONFIG_LKDTM is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_DIV64 is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_TEST_REF_TRACKER is not set # CONFIG_RBTREE_TEST is not set # CONFIG_REED_SOLOMON_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_TEST_HEXDUMP is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set # CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set # CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_BLACKHOLE_DEV is not set # CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_DYNAMIC_DEBUG is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set # CONFIG_TEST_MEMINIT is not set # CONFIG_TEST_FREE_PAGES is not set # CONFIG_TEST_FPU is not set # CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set # CONFIG_TEST_OBJPOOL is not set CONFIG_ARCH_USE_MEMTEST=y CONFIG_MEMTEST=y # end of Kernel Testing and Coverage # # Rust hacking # # end of Rust hacking # end of Kernel hacking [-- Attachment #3: 20240326--dell-xps-13-9360--linux-6.9-rc1+--messages.txt --] [-- Type: text/plain, Size: 91648 bytes --] [ 0.000000] Linux version 6.9.0-rc1+ (build@bohemianrhapsody.molgen.mpg.de) (gcc (Debian 13.2.0-19) 13.2.0, GNU ld (GNU Binutils for Debian) 2.42) #77 SMP PREEMPT_DYNAMIC Tue Mar 26 12:14:47 CET 2024 [ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-6.9.0-rc1+ root=UUID=32e29882-d94d-4a92-9ee4-4d03002bfa29 ro quiet pci=noaer mem_sleep_default=deep log_buf_len=8M cryptomgr.notests [ 0.000000] BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x0000000000057fff] usable [ 0.000000] BIOS-e820: [mem 0x0000000000058000-0x0000000000058fff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000000059000-0x000000000009dfff] usable [ 0.000000] BIOS-e820: [mem 0x000000000009e000-0x00000000000fffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000556aafff] usable [ 0.000000] BIOS-e820: [mem 0x00000000556ab000-0x00000000556abfff] ACPI NVS [ 0.000000] BIOS-e820: [mem 0x00000000556ac000-0x00000000556acfff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000556ad000-0x0000000064df3fff] usable [ 0.000000] BIOS-e820: [mem 0x0000000064df4000-0x000000006517ffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000065180000-0x00000000651c3fff] ACPI data [ 0.000000] BIOS-e820: [mem 0x00000000651c4000-0x000000006f871fff] ACPI NVS [ 0.000000] BIOS-e820: [mem 0x000000006f872000-0x000000006fffefff] reserved [ 0.000000] BIOS-e820: [mem 0x000000006ffff000-0x000000006fffffff] usable [ 0.000000] BIOS-e820: [mem 0x0000000070000000-0x0000000077ffffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000078000000-0x00000000785fffff] usable [ 0.000000] BIOS-e820: [mem 0x0000000078600000-0x000000007c7fffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fe000000-0x00000000fe010fff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000004817fffff] usable [ 0.000000] NX (Execute Disable) protection: active [ 0.000000] APIC: Static calls initialized [ 0.000000] e820: update [mem 0x50e7e018-0x50e8e057] usable ==> usable [ 0.000000] extended physical RAM map: [ 0.000000] reserve setup_data: [mem 0x0000000000000000-0x0000000000057fff] usable [ 0.000000] reserve setup_data: [mem 0x0000000000058000-0x0000000000058fff] reserved [ 0.000000] reserve setup_data: [mem 0x0000000000059000-0x000000000009dfff] usable [ 0.000000] reserve setup_data: [mem 0x000000000009e000-0x00000000000fffff] reserved [ 0.000000] reserve setup_data: [mem 0x0000000000100000-0x0000000050e7e017] usable [ 0.000000] reserve setup_data: [mem 0x0000000050e7e018-0x0000000050e8e057] usable [ 0.000000] reserve setup_data: [mem 0x0000000050e8e058-0x00000000556aafff] usable [ 0.000000] reserve setup_data: [mem 0x00000000556ab000-0x00000000556abfff] ACPI NVS [ 0.000000] reserve setup_data: [mem 0x00000000556ac000-0x00000000556acfff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000556ad000-0x0000000064df3fff] usable [ 0.000000] reserve setup_data: [mem 0x0000000064df4000-0x000000006517ffff] reserved [ 0.000000] reserve setup_data: [mem 0x0000000065180000-0x00000000651c3fff] ACPI data [ 0.000000] reserve setup_data: [mem 0x00000000651c4000-0x000000006f871fff] ACPI NVS [ 0.000000] reserve setup_data: [mem 0x000000006f872000-0x000000006fffefff] reserved [ 0.000000] reserve setup_data: [mem 0x000000006ffff000-0x000000006fffffff] usable [ 0.000000] reserve setup_data: [mem 0x0000000070000000-0x0000000077ffffff] reserved [ 0.000000] reserve setup_data: [mem 0x0000000078000000-0x00000000785fffff] usable [ 0.000000] reserve setup_data: [mem 0x0000000078600000-0x000000007c7fffff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000e0000000-0x00000000efffffff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000fe000000-0x00000000fe010fff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000fec00000-0x00000000fec00fff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000fee00000-0x00000000fee00fff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000ff000000-0x00000000ffffffff] reserved [ 0.000000] reserve setup_data: [mem 0x0000000100000000-0x00000004817fffff] usable [ 0.000000] efi: EFI v2.4 by American Megatrends [ 0.000000] efi: ACPI=0x6518d000 ACPI 2.0=0x6518d000 SMBIOS=0xf0000 SMBIOS 3.0=0xf0020 TPMFinalLog=0x6f812000 ESRT=0x6fc86698 MEMATTR=0x62676018 INITRD=0x5577da98 TPMEventLog=0x5577e018 [ 0.000000] efi: Remove mem34: MMIO range=[0xe0000000-0xefffffff] (256MB) from e820 map [ 0.000000] e820: remove [mem 0xe0000000-0xefffffff] reserved [ 0.000000] efi: Not removing mem35: MMIO range=[0xfe000000-0xfe010fff] (68KB) from e820 map [ 0.000000] efi: Not removing mem36: MMIO range=[0xfec00000-0xfec00fff] (4KB) from e820 map [ 0.000000] efi: Not removing mem37: MMIO range=[0xfee00000-0xfee00fff] (4KB) from e820 map [ 0.000000] efi: Remove mem38: MMIO range=[0xff000000-0xffffffff] (16MB) from e820 map [ 0.000000] e820: remove [mem 0xff000000-0xffffffff] reserved [ 0.000000] SMBIOS 3.0.0 present. [ 0.000000] DMI: Dell Inc. XPS 13 9360/0596KF, BIOS 2.21.0 06/02/2022 [ 0.000000] tsc: Detected 2900.000 MHz processor [ 0.000000] tsc: Detected 2899.886 MHz TSC [ 0.000653] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved [ 0.000663] e820: remove [mem 0x000a0000-0x000fffff] usable [ 0.000685] last_pfn = 0x481800 max_arch_pfn = 0x400000000 [ 0.000694] MTRR map: 4 entries (3 fixed + 1 variable; max 23), built from 10 variable MTRRs [ 0.000700] x86/PAT: Configuration [0-7]: WB WC UC- UC WB WP UC- WT [ 0.002033] last_pfn = 0x78600 max_arch_pfn = 0x400000000 [ 0.010191] esrt: Reserving ESRT space from 0x000000006fc86698 to 0x000000006fc866d0. [ 0.010207] Using GB pages for direct mapping [ 0.016813] printk: log_buf_len: 8388608 bytes [ 0.016817] printk: early log buf free: 125416(95%) [ 0.016821] Secure boot disabled [ 0.016823] RAMDISK: [mem 0x50e8f000-0x52340fff] [ 0.016839] ACPI: Early table checksum verification disabled [ 0.016850] ACPI: RSDP 0x000000006518D000 000024 (v02 DELL ) [ 0.016861] ACPI: XSDT 0x000000006518D0C8 00010C (v01 DELL CBX3 01072009 AMI 00010013) [ 0.016879] ACPI: FACP 0x00000000651B2A48 00010C (v05 DELL CBX3 01072009 AMI 00010013) [ 0.016898] ACPI: DSDT 0x000000006518D260 0257E7 (v02 DELL CBX3 01072009 INTL 20160422) [ 0.016913] ACPI: FACS 0x000000006F86F180 000040 [ 0.016923] ACPI: APIC 0x00000000651B2B58 000084 (v03 DELL CBX3 01072009 AMI 00010013) [ 0.016937] ACPI: FPDT 0x00000000651B2BE0 000044 (v01 DELL CBX3 01072009 AMI 00010013) [ 0.016951] ACPI: FIDT 0x00000000651B2C28 0000AC (v01 DELL CBX3 01072009 AMI 00010013) [ 0.016965] ACPI: MCFG 0x00000000651B2CD8 00003C (v01 DELL CBX3 01072009 MSFT 00000097) [ 0.016978] ACPI: HPET 0x00000000651B2D18 000038 (v01 DELL CBX3 01072009 AMI. 0005000B) [ 0.016992] ACPI: SSDT 0x00000000651B2D50 000359 (v01 SataRe SataTabl 00001000 INTL 20160422) [ 0.017007] ACPI: BOOT 0x00000000651B30B0 000028 (v01 DELL CBX3 01072009 AMI 00010013) [ 0.017021] ACPI: SSDT 0x00000000651B30D8 0012CF (v02 SaSsdt SaSsdt 00003000 INTL 20160422) [ 0.017035] ACPI: HPET 0x00000000651B43A8 000038 (v01 INTEL KBL-ULT 00000001 MSFT 0000005F) [ 0.017048] ACPI: SSDT 0x00000000651B43E0 000D84 (v02 INTEL xh_rvp07 00000000 INTL 20160422) [ 0.017062] ACPI: UEFI 0x00000000651B5168 000042 (v01 00000000 00000000) [ 0.017076] ACPI: SSDT 0x00000000651B51B0 000EDE (v02 CpuRef CpuSsdt 00003000 INTL 20160422) [ 0.017090] ACPI: LPIT 0x00000000651B6090 000094 (v01 INTEL KBL-ULT 00000000 MSFT 0000005F) [ 0.017104] ACPI: WSMT 0x00000000651B6128 000028 (v01 DELL CBX3 00000000 MSFT 0000005F) [ 0.017117] ACPI: SSDT 0x00000000651B6150 000161 (v02 INTEL HdaDsp 00000000 INTL 20160422) [ 0.017131] ACPI: SSDT 0x00000000651B62B8 00029F (v02 INTEL sensrhub 00000000 INTL 20160422) [ 0.017145] ACPI: SSDT 0x00000000651B6558 003002 (v02 INTEL PtidDevc 00001000 INTL 20160422) [ 0.017159] ACPI: SSDT 0x00000000651B9560 0000DB (v02 INTEL TbtTypeC 00000000 INTL 20160422) [ 0.017173] ACPI: DBGP 0x00000000651B9640 000034 (v01 INTEL 00000002 MSFT 0000005F) [ 0.017186] ACPI: DBG2 0x00000000651B9678 000054 (v00 INTEL 00000002 MSFT 0000005F) [ 0.017200] ACPI: SSDT 0x00000000651B96D0 0007DD (v02 INTEL UsbCTabl 00001000 INTL 20160422) [ 0.017214] ACPI: SSDT 0x00000000651B9EB0 0084F1 (v02 DptfTa DptfTabl 00001000 INTL 20160422) [ 0.017228] ACPI: SLIC 0x00000000651C23A8 000176 (v03 DELL CBX3 01072009 MSFT 00010013) [ 0.017242] ACPI: NHLT 0x00000000651C2520 00002D (v00 INTEL EDK2 00000002 01000013) [ 0.017255] ACPI: BGRT 0x00000000651C2550 000038 (v00 01072009 AMI 00010013) [ 0.017269] ACPI: TPM2 0x00000000651C2588 000034 (v03 Tpm2Tabl 00000001 AMI 00000000) [ 0.017283] ACPI: ASF! 0x00000000651C25C0 0000A0 (v32 INTEL HCG 00000001 TFSM 000F4240) [ 0.017297] ACPI: DMAR 0x00000000651C2660 0000F0 (v01 INTEL KBL 00000001 INTL 00000001) [ 0.017309] ACPI: Reserving FACP table memory at [mem 0x651b2a48-0x651b2b53] [ 0.017314] ACPI: Reserving DSDT table memory at [mem 0x6518d260-0x651b2a46] [ 0.017319] ACPI: Reserving FACS table memory at [mem 0x6f86f180-0x6f86f1bf] [ 0.017324] ACPI: Reserving APIC table memory at [mem 0x651b2b58-0x651b2bdb] [ 0.017329] ACPI: Reserving FPDT table memory at [mem 0x651b2be0-0x651b2c23] [ 0.017333] ACPI: Reserving FIDT table memory at [mem 0x651b2c28-0x651b2cd3] [ 0.017338] ACPI: Reserving MCFG table memory at [mem 0x651b2cd8-0x651b2d13] [ 0.017343] ACPI: Reserving HPET table memory at [mem 0x651b2d18-0x651b2d4f] [ 0.017348] ACPI: Reserving SSDT table memory at [mem 0x651b2d50-0x651b30a8] [ 0.017353] ACPI: Reserving BOOT table memory at [mem 0x651b30b0-0x651b30d7] [ 0.017358] ACPI: Reserving SSDT table memory at [mem 0x651b30d8-0x651b43a6] [ 0.017363] ACPI: Reserving HPET table memory at [mem 0x651b43a8-0x651b43df] [ 0.017368] ACPI: Reserving SSDT table memory at [mem 0x651b43e0-0x651b5163] [ 0.017373] ACPI: Reserving UEFI table memory at [mem 0x651b5168-0x651b51a9] [ 0.017378] ACPI: Reserving SSDT table memory at [mem 0x651b51b0-0x651b608d] [ 0.017383] ACPI: Reserving LPIT table memory at [mem 0x651b6090-0x651b6123] [ 0.017388] ACPI: Reserving WSMT table memory at [mem 0x651b6128-0x651b614f] [ 0.017393] ACPI: Reserving SSDT table memory at [mem 0x651b6150-0x651b62b0] [ 0.017398] ACPI: Reserving SSDT table memory at [mem 0x651b62b8-0x651b6556] [ 0.017403] ACPI: Reserving SSDT table memory at [mem 0x651b6558-0x651b9559] [ 0.017408] ACPI: Reserving SSDT table memory at [mem 0x651b9560-0x651b963a] [ 0.017413] ACPI: Reserving DBGP table memory at [mem 0x651b9640-0x651b9673] [ 0.017418] ACPI: Reserving DBG2 table memory at [mem 0x651b9678-0x651b96cb] [ 0.017424] ACPI: Reserving SSDT table memory at [mem 0x651b96d0-0x651b9eac] [ 0.017429] ACPI: Reserving SSDT table memory at [mem 0x651b9eb0-0x651c23a0] [ 0.017434] ACPI: Reserving SLIC table memory at [mem 0x651c23a8-0x651c251d] [ 0.017440] ACPI: Reserving NHLT table memory at [mem 0x651c2520-0x651c254c] [ 0.017445] ACPI: Reserving BGRT table memory at [mem 0x651c2550-0x651c2587] [ 0.017450] ACPI: Reserving TPM2 table memory at [mem 0x651c2588-0x651c25bb] [ 0.017456] ACPI: Reserving ASF! table memory at [mem 0x651c25c0-0x651c265f] [ 0.017461] ACPI: Reserving DMAR table memory at [mem 0x651c2660-0x651c274f] [ 0.017633] No NUMA configuration found [ 0.017637] Faking a node at [mem 0x0000000000000000-0x00000004817fffff] [ 0.017655] NODE_DATA(0) allocated [mem 0x47f3d3000-0x47f3fdfff] [ 0.019016] Zone ranges: [ 0.019019] DMA [mem 0x0000000000001000-0x0000000000ffffff] [ 0.019026] DMA32 [mem 0x0000000001000000-0x00000000ffffffff] [ 0.019032] Normal [mem 0x0000000100000000-0x00000004817fffff] [ 0.019038] Device empty [ 0.019042] Movable zone start for each node [ 0.019066] Early memory node ranges [ 0.019068] node 0: [mem 0x0000000000001000-0x0000000000057fff] [ 0.019073] node 0: [mem 0x0000000000059000-0x000000000009dfff] [ 0.019078] node 0: [mem 0x0000000000100000-0x00000000556aafff] [ 0.019083] node 0: [mem 0x00000000556ad000-0x0000000064df3fff] [ 0.019087] node 0: [mem 0x000000006ffff000-0x000000006fffffff] [ 0.019091] node 0: [mem 0x0000000078000000-0x00000000785fffff] [ 0.019096] node 0: [mem 0x0000000100000000-0x00000004817fffff] [ 0.019107] Initmem setup node 0 [mem 0x0000000000001000-0x00000004817fffff] [ 0.019136] On node 0, zone DMA: 1 pages in unavailable ranges [ 0.019152] On node 0, zone DMA: 1 pages in unavailable ranges [ 0.019780] On node 0, zone DMA: 98 pages in unavailable ranges [ 0.085295] On node 0, zone DMA32: 2 pages in unavailable ranges [ 0.092492] On node 0, zone DMA32: 45579 pages in unavailable ranges [ 0.103725] On node 0, zone Normal: 31232 pages in unavailable ranges [ 0.108124] On node 0, zone Normal: 26624 pages in unavailable ranges [ 0.108135] Reserving Intel graphics memory at [mem 0x7a800000-0x7c7fffff] [ 0.108342] ACPI: PM-Timer IO Port: 0x1808 [ 0.108360] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1]) [ 0.108365] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1]) [ 0.108370] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1]) [ 0.108374] ACPI: LAPIC_NMI (acpi_id[0x04] high edge lint[0x1]) [ 0.108407] IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-119 [ 0.108416] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) [ 0.108424] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level) [ 0.108440] ACPI: Using ACPI (MADT) for SMP configuration information [ 0.108444] ACPI: HPET id: 0x8086a701 base: 0xfed00000 [ 0.108464] e820: update [mem 0x62260000-0x623ecfff] usable ==> reserved [ 0.108493] TSC deadline timer available [ 0.108505] CPU topo: Max. logical packages: 1 [ 0.108508] CPU topo: Max. logical dies: 1 [ 0.108511] CPU topo: Max. dies per package: 1 [ 0.108524] CPU topo: Max. threads per core: 2 [ 0.108527] CPU topo: Num. cores per package: 2 [ 0.108530] CPU topo: Num. threads per package: 4 [ 0.108533] CPU topo: Allowing 4 present CPUs plus 0 hotplug CPUs [ 0.108666] PM: hibernation: Registered nosave memory: [mem 0x00000000-0x00000fff] [ 0.108678] PM: hibernation: Registered nosave memory: [mem 0x00058000-0x00058fff] [ 0.108690] PM: hibernation: Registered nosave memory: [mem 0x0009e000-0x000fffff] [ 0.108702] PM: hibernation: Registered nosave memory: [mem 0x50e7e000-0x50e7efff] [ 0.108714] PM: hibernation: Registered nosave memory: [mem 0x50e8e000-0x50e8efff] [ 0.108726] PM: hibernation: Registered nosave memory: [mem 0x556ab000-0x556abfff] [ 0.108730] PM: hibernation: Registered nosave memory: [mem 0x556ac000-0x556acfff] [ 0.108743] PM: hibernation: Registered nosave memory: [mem 0x62260000-0x623ecfff] [ 0.108755] PM: hibernation: Registered nosave memory: [mem 0x64df4000-0x6517ffff] [ 0.108759] PM: hibernation: Registered nosave memory: [mem 0x65180000-0x651c3fff] [ 0.108763] PM: hibernation: Registered nosave memory: [mem 0x651c4000-0x6f871fff] [ 0.108767] PM: hibernation: Registered nosave memory: [mem 0x6f872000-0x6fffefff] [ 0.108780] PM: hibernation: Registered nosave memory: [mem 0x70000000-0x77ffffff] [ 0.108793] PM: hibernation: Registered nosave memory: [mem 0x78600000-0x7c7fffff] [ 0.108797] PM: hibernation: Registered nosave memory: [mem 0x7c800000-0xfdffffff] [ 0.108801] PM: hibernation: Registered nosave memory: [mem 0xfe000000-0xfe010fff] [ 0.108805] PM: hibernation: Registered nosave memory: [mem 0xfe011000-0xfebfffff] [ 0.108809] PM: hibernation: Registered nosave memory: [mem 0xfec00000-0xfec00fff] [ 0.108813] PM: hibernation: Registered nosave memory: [mem 0xfec01000-0xfedfffff] [ 0.108817] PM: hibernation: Registered nosave memory: [mem 0xfee00000-0xfee00fff] [ 0.108821] PM: hibernation: Registered nosave memory: [mem 0xfee01000-0xffffffff] [ 0.108828] [mem 0x7c800000-0xfdffffff] available for PCI devices [ 0.108833] Booting paravirtualized kernel on bare hardware [ 0.108837] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645519600211568 ns [ 0.115074] setup_percpu: NR_CPUS:8192 nr_cpumask_bits:4 nr_cpu_ids:4 nr_node_ids:1 [ 0.115406] percpu: Embedded 65 pages/cpu s229376 r8192 d28672 u524288 [ 0.115453] pcpu-alloc: s229376 r8192 d28672 u524288 alloc=1*2097152 [ 0.115461] pcpu-alloc: [0] 0 1 2 3 [ 0.115603] Kernel command line: BOOT_IMAGE=/vmlinuz-6.9.0-rc1+ root=UUID=32e29882-d94d-4a92-9ee4-4d03002bfa29 ro quiet pci=noaer mem_sleep_default=deep log_buf_len=8M cryptomgr.notests [ 0.116079] Unknown kernel command line parameters "BOOT_IMAGE=/vmlinuz-6.9.0-rc1+", will be passed to user space. [ 0.116150] random: crng init done [ 0.117667] Dentry cache hash table entries: 2097152 (order: 12, 16777216 bytes, linear) [ 0.118432] Inode-cache hash table entries: 1048576 (order: 11, 8388608 bytes, linear) [ 0.118604] Fallback order for Node 0: 0 [ 0.118612] Built 1 zonelists, mobility grouping on. Total pages: 4026691 [ 0.118616] Policy zone: Normal [ 0.118631] mem auto-init: stack:all(zero), heap alloc:on, heap free:off [ 0.118646] software IO TLB: area num 4. [ 0.161664] Memory: 1604280K/16363068K available (22528K kernel code, 2386K rwdata, 6124K rodata, 6304K init, 8064K bss, 510640K reserved, 0K cma-reserved) [ 0.162551] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1 [ 0.162558] kmemleak: Kernel memory leak detector disabled [ 0.162611] Kernel/User page tables isolation: enabled [ 0.162694] ftrace: allocating 43400 entries in 170 pages [ 0.171468] ftrace: allocated 170 pages with 4 groups [ 0.172396] Dynamic Preempt: voluntary [ 0.172504] rcu: Preemptible hierarchical RCU implementation. [ 0.172510] rcu: RCU restricting CPUs from NR_CPUS=8192 to nr_cpu_ids=4. [ 0.172515] Trampoline variant of Tasks RCU enabled. [ 0.172518] Rude variant of Tasks RCU enabled. [ 0.172520] Tracing variant of Tasks RCU enabled. [ 0.172523] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies. [ 0.172527] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4 [ 0.172544] RCU Tasks: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1. [ 0.172551] RCU Tasks Rude: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1. [ 0.172557] RCU Tasks Trace: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1. [ 0.184519] NR_IRQS: 524544, nr_irqs: 1024, preallocated irqs: 16 [ 0.184866] rcu: srcu_init: Setting srcu_struct sizes based on contention. [ 0.185121] Console: colour dummy device 80x25 [ 0.185129] printk: legacy console [tty0] enabled [ 0.185338] ACPI: Core revision 20230628 [ 0.187253] hpet: HPET dysfunctional in PC10. Force disabled. [ 0.187258] APIC: Switch to symmetric I/O mode setup [ 0.187264] DMAR: Host address width 39 [ 0.187268] DMAR: DRHD base: 0x000000fed90000 flags: 0x0 [ 0.187285] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 19e2ff0505e [ 0.187293] DMAR: DRHD base: 0x000000fed91000 flags: 0x1 [ 0.187308] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da [ 0.187316] DMAR: RMRR base: 0x00000064ec2000 end: 0x00000064ee1fff [ 0.187322] DMAR: RMRR base: 0x0000007a000000 end: 0x0000007c7fffff [ 0.187328] DMAR: ANDD device: 1 name: \_SB.PCI0.I2C0 [ 0.187333] DMAR: ANDD device: 2 name: \_SB.PCI0.I2C1 [ 0.187340] DMAR-IR: IOAPIC id 2 under DRHD base 0xfed91000 IOMMU 1 [ 0.187346] DMAR-IR: HPET id 0 under DRHD base 0xfed91000 [ 0.187351] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. [ 0.188991] DMAR-IR: Enabled IRQ remapping in x2apic mode [ 0.188997] x2apic enabled [ 0.189097] APIC: Switched APIC routing to: cluster x2apic [ 0.193272] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x29ccd767b87, max_idle_ns: 440795223720 ns [ 0.193289] Calibrating delay loop (skipped), value calculated using timer frequency.. 5799.77 BogoMIPS (lpj=11599544) [ 0.193332] CPU0: Thermal monitoring enabled (TM1) [ 0.193377] Last level iTLB entries: 4KB 64, 2MB 8, 4MB 8 [ 0.193383] Last level dTLB entries: 4KB 64, 2MB 0, 4MB 0, 1GB 4 [ 0.193399] process: using mwait in idle threads [ 0.193404] Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization [ 0.193414] Spectre V2 : Mitigation: IBRS [ 0.193419] Spectre V2 : Spectre v2 / SpectreRSB mitigation: Filling RSB on context switch [ 0.193426] Spectre V2 : Spectre v2 / SpectreRSB : Filling RSB on VMEXIT [ 0.193431] RETBleed: Mitigation: IBRS [ 0.193440] Spectre V2 : mitigation: Enabling conditional Indirect Branch Prediction Barrier [ 0.193446] Spectre V2 : User space: Mitigation: STIBP via prctl [ 0.193456] Speculative Store Bypass: Mitigation: Speculative Store Bypass disabled via prctl [ 0.193482] MDS: Mitigation: Clear CPU buffers [ 0.193488] MMIO Stale Data: Mitigation: Clear CPU buffers [ 0.193497] SRBDS: Mitigation: Microcode [ 0.193507] GDS: Mitigation: Microcode [ 0.193521] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' [ 0.193528] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' [ 0.193535] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' [ 0.193541] x86/fpu: Supporting XSAVE feature 0x008: 'MPX bounds registers' [ 0.193548] x86/fpu: Supporting XSAVE feature 0x010: 'MPX CSR' [ 0.193555] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256 [ 0.193563] x86/fpu: xstate_offset[3]: 832, xstate_sizes[3]: 64 [ 0.193571] x86/fpu: xstate_offset[4]: 896, xstate_sizes[4]: 64 [ 0.193579] x86/fpu: Enabled xstate features 0x1f, context size is 960 bytes, using 'compacted' format. [ 0.197282] Freeing SMP alternatives memory: 36K [ 0.197282] pid_max: default: 32768 minimum: 301 [ 0.197282] LSM: initializing lsm=capability,landlock,apparmor,tomoyo,bpf,ima,evm [ 0.197282] landlock: Up and running. [ 0.197282] AppArmor: AppArmor initialized [ 0.197282] TOMOYO Linux initialized [ 0.197282] LSM support for eBPF active [ 0.197282] Mount-cache hash table entries: 32768 (order: 6, 262144 bytes, linear) [ 0.197282] Mountpoint-cache hash table entries: 32768 (order: 6, 262144 bytes, linear) [ 0.197282] kcsan: non-strict mode configured - use CONFIG_KCSAN_STRICT=y to see all data races [ 0.197282] smpboot: CPU0: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz (family: 0x6, model: 0x8e, stepping: 0x9) [ 0.197282] Performance Events: PEBS fmt3+, Skylake events, 32-deep LBR, full-width counters, Intel PMU driver. [ 0.197282] ... version: 4 [ 0.197282] ... bit width: 48 [ 0.197282] ... generic registers: 4 [ 0.197282] ... value mask: 0000ffffffffffff [ 0.197282] ... max period: 00007fffffffffff [ 0.197282] ... fixed-purpose events: 3 [ 0.197282] ... event mask: 000000070000000f [ 0.197282] signal: max sigframe size: 2032 [ 0.197282] Estimated ratio of average max frequency by base frequency (times 1024): 1235 [ 0.210964] rcu: Hierarchical SRCU implementation. [ 0.210970] rcu: Max phase no-delay instances is 1000. [ 0.212116] NMI watchdog: Enabled. Permanently consumes one hw-PMU counter. [ 0.212266] smp: Bringing up secondary CPUs ... [ 0.212496] smpboot: x86: Booting SMP configuration: [ 0.212502] .... node #0, CPUs: #1 #2 #3 [ 0.213961] MDS CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html for more details. [ 0.213961] MMIO Stale Data CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/processor_mmio_stale_data.html for more details. [ 0.213961] smp: Brought up 1 node, 4 CPUs [ 0.213961] smpboot: Total of 4 processors activated (23199.08 BogoMIPS) [ 0.417816] node 0 deferred pages initialised in 200ms [ 0.418898] devtmpfs: initialized [ 0.418898] x86/mm: Memory block size: 128MB [ 0.429017] ACPI: PM: Registering ACPI NVS region [mem 0x556ab000-0x556abfff] (4096 bytes) [ 0.429017] ACPI: PM: Registering ACPI NVS region [mem 0x651c4000-0x6f871fff] (174776320 bytes) [ 0.431698] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns [ 0.431715] futex hash table entries: 1024 (order: 4, 65536 bytes, linear) [ 0.431977] pinctrl core: initialized pinctrl subsystem [ 0.433637] NET: Registered PF_NETLINK/PF_ROUTE protocol family [ 0.434750] DMA: preallocated 2048 KiB GFP_KERNEL pool for atomic allocations [ 0.434876] DMA: preallocated 2048 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations [ 0.435008] DMA: preallocated 2048 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations [ 0.435050] audit: initializing netlink subsys (disabled) [ 0.437342] audit: type=2000 audit(1711455691.244:1): state=initialized audit_enabled=0 res=1 [ 0.439214] kcsan: selftest: 3/3 tests passed [ 0.439214] thermal_sys: Registered thermal governor 'fair_share' [ 0.439214] thermal_sys: Registered thermal governor 'bang_bang' [ 0.439214] thermal_sys: Registered thermal governor 'step_wise' [ 0.439214] thermal_sys: Registered thermal governor 'user_space' [ 0.439214] thermal_sys: Registered thermal governor 'power_allocator' [ 0.441288] cpuidle: using governor ladder [ 0.441294] cpuidle: using governor menu [ 0.441586] Simple Boot Flag at 0x47 set to 0x80 [ 0.441586] ACPI FADT declares the system doesn't support PCIe ASPM, so disable it [ 0.441586] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5 [ 0.441640] PCI: ECAM [mem 0xe0000000-0xefffffff] (base 0xe0000000) for domain 0000 [bus 00-ff] [ 0.441654] PCI: not using ECAM ([mem 0xe0000000-0xefffffff] not reserved) [ 0.441661] PCI: Using configuration type 1 for base access [ 0.442194] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible. [ 0.442194] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages [ 0.442194] HugeTLB: 16380 KiB vmemmap can be freed for a 1.00 GiB page [ 0.442194] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages [ 0.442194] HugeTLB: 28 KiB vmemmap can be freed for a 2.00 MiB page [ 0.442194] Demotion targets for Node 0: null [ 0.442194] ACPI: Added _OSI(Module Device) [ 0.442194] ACPI: Added _OSI(Processor Device) [ 0.442194] ACPI: Added _OSI(3.0 _SCP Extensions) [ 0.442194] ACPI: Added _OSI(Processor Aggregator Device) [ 0.660173] ACPI: 11 ACPI AML tables successfully acquired and loaded [ 0.686957] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored [ 0.718253] ACPI: Dynamic OEM Table Load: [ 0.718298] ACPI: SSDT 0xFFFF996B41826C00 0003FF (v02 PmRef Cpu0Cst 00003001 INTL 20160422) [ 0.726416] ACPI: Dynamic OEM Table Load: [ 0.726466] ACPI: SSDT 0xFFFF996B413DE800 0006F6 (v02 PmRef Cpu0Ist 00003000 INTL 20160422) [ 0.737544] ACPI: Dynamic OEM Table Load: [ 0.737593] ACPI: SSDT 0xFFFF996B413DE000 00065C (v02 PmRef ApIst 00003000 INTL 20160422) [ 0.747484] ACPI: Dynamic OEM Table Load: [ 0.747522] ACPI: SSDT 0xFFFF996B41A91600 00018A (v02 PmRef ApCst 00003000 INTL 20160422) [ 0.762481] ACPI: _OSC evaluated successfully for all CPUs [ 0.763569] ACPI: EC: EC started [ 0.763574] ACPI: EC: interrupt blocked [ 0.780281] ACPI: EC: EC_CMD/EC_SC=0x934, EC_DATA=0x930 [ 0.780291] ACPI: \_SB_.PCI0.LPCB.ECDV: Boot DSDT EC used to handle transactions [ 0.780298] ACPI: Interpreter enabled [ 0.780490] ACPI: PM: (supports S0 S3 S4 S5) [ 0.780496] ACPI: Using IOAPIC for interrupt routing [ 0.780675] PCI: ECAM [mem 0xe0000000-0xefffffff] (base 0xe0000000) for domain 0000 [bus 00-ff] [ 0.786442] PCI: ECAM [mem 0xe0000000-0xefffffff] reserved as ACPI motherboard resource [ 0.786493] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug [ 0.786500] PCI: Using E820 reservations for host bridge windows [ 0.790572] ACPI: Enabled 8 GPEs in block 00 to 7F [ 0.822681] ACPI: \_SB_.PCI0.RP09.PXSX.WRST: New power resource [ 0.824520] ACPI: \_SB_.PCI0.RP10.PXSX.WRST: New power resource [ 0.826356] ACPI: \_SB_.PCI0.RP11.PXSX.WRST: New power resource [ 0.828196] ACPI: \_SB_.PCI0.RP12.PXSX.WRST: New power resource [ 0.830040] ACPI: \_SB_.PCI0.RP13.PXSX.WRST: New power resource [ 0.831874] ACPI: \_SB_.PCI0.RP01.PXSX.WRST: New power resource [ 0.836771] ACPI: \_SB_.PCI0.RP02.PXSX.WRST: New power resource [ 0.838612] ACPI: \_SB_.PCI0.RP03.PXSX.WRST: New power resource [ 0.840446] ACPI: \_SB_.PCI0.RP04.PXSX.WRST: New power resource [ 0.842295] ACPI: \_SB_.PCI0.RP05.PXSX.WRST: New power resource [ 0.844130] ACPI: \_SB_.PCI0.RP06.PXSX.WRST: New power resource [ 0.845971] ACPI: \_SB_.PCI0.RP07.PXSX.WRST: New power resource [ 0.847809] ACPI: \_SB_.PCI0.RP08.PXSX.WRST: New power resource [ 0.849648] ACPI: \_SB_.PCI0.RP17.PXSX.WRST: New power resource [ 0.851480] ACPI: \_SB_.PCI0.RP18.PXSX.WRST: New power resource [ 0.853318] ACPI: \_SB_.PCI0.RP19.PXSX.WRST: New power resource [ 0.855159] ACPI: \_SB_.PCI0.RP20.PXSX.WRST: New power resource [ 0.862923] ACPI: \_SB_.PCI0.RP14.PXSX.WRST: New power resource [ 0.864759] ACPI: \_SB_.PCI0.RP15.PXSX.WRST: New power resource [ 0.866607] ACPI: \_SB_.PCI0.RP16.PXSX.WRST: New power resource [ 0.992899] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-fe]) [ 0.992921] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI HPX-Type3] [ 0.993977] acpi PNP0A08:00: _OSC: platform does not support [PCIeHotplug SHPCHotplug PME] [ 0.995996] acpi PNP0A08:00: _OSC: OS now controls [PCIeCapability LTR] [ 0.996006] acpi PNP0A08:00: FADT indicates ASPM is unsupported, using BIOS configuration [ 1.000906] PCI host bridge to bus 0000:00 [ 1.000916] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window] [ 1.000927] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window] [ 1.000939] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000dffff window] [ 1.000950] pci_bus 0000:00: root bus resource [mem 0x7c800000-0xdfffffff window] [ 1.000960] pci_bus 0000:00: root bus resource [mem 0xfd000000-0xfe7fffff window] [ 1.000970] pci_bus 0000:00: root bus resource [bus 00-fe] [ 1.001036] pci 0000:00:00.0: [8086:5904] type 00 class 0x060000 conventional PCI endpoint [ 1.001288] pci 0000:00:02.0: [8086:5916] type 00 class 0x030000 PCIe Root Complex Integrated Endpoint [ 1.001310] pci 0000:00:02.0: BAR 0 [mem 0xdb000000-0xdbffffff 64bit] [ 1.001326] pci 0000:00:02.0: BAR 2 [mem 0x90000000-0x9fffffff 64bit pref] [ 1.001339] pci 0000:00:02.0: BAR 4 [io 0xf000-0xf03f] [ 1.001395] pci 0000:00:02.0: Video device with shadowed ROM at [mem 0x000c0000-0x000dffff] [ 1.002179] pci 0000:00:04.0: [8086:1903] type 00 class 0x118000 conventional PCI endpoint [ 1.002200] pci 0000:00:04.0: BAR 0 [mem 0xdc320000-0xdc327fff 64bit] [ 1.003352] pci 0000:00:14.0: [8086:9d2f] type 00 class 0x0c0330 conventional PCI endpoint [ 1.003382] pci 0000:00:14.0: BAR 0 [mem 0xdc310000-0xdc31ffff 64bit] [ 1.003487] pci 0000:00:14.0: PME# supported from D3hot D3cold [ 1.006246] pci 0000:00:14.2: [8086:9d31] type 00 class 0x118000 conventional PCI endpoint [ 1.006276] pci 0000:00:14.2: BAR 0 [mem 0xdc334000-0xdc334fff 64bit] [ 1.006681] pci 0000:00:15.0: [8086:9d60] type 00 class 0x118000 conventional PCI endpoint [ 1.006887] pci 0000:00:15.0: BAR 0 [mem 0xdc333000-0xdc333fff 64bit] [ 1.008860] pci 0000:00:15.1: [8086:9d61] type 00 class 0x118000 conventional PCI endpoint [ 1.009078] pci 0000:00:15.1: BAR 0 [mem 0xdc332000-0xdc332fff 64bit] [ 1.011026] pci 0000:00:16.0: [8086:9d3a] type 00 class 0x078000 conventional PCI endpoint [ 1.011059] pci 0000:00:16.0: BAR 0 [mem 0xdc331000-0xdc331fff 64bit] [ 1.011158] pci 0000:00:16.0: PME# supported from D3hot [ 1.012688] pci 0000:00:1c.0: [8086:9d10] type 01 class 0x060400 PCIe Root Port [ 1.012721] pci 0000:00:1c.0: PCI bridge to [bus 01-39] [ 1.012734] pci 0000:00:1c.0: bridge window [mem 0xc4000000-0xda0fffff] [ 1.012750] pci 0000:00:1c.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 1.012846] pci 0000:00:1c.0: PME# supported from D0 D3hot D3cold [ 1.015505] pci 0000:00:1c.4: [8086:9d14] type 01 class 0x060400 PCIe Root Port [ 1.015542] pci 0000:00:1c.4: PCI bridge to [bus 3a] [ 1.015555] pci 0000:00:1c.4: bridge window [mem 0xdc000000-0xdc1fffff] [ 1.015668] pci 0000:00:1c.4: PME# supported from D0 D3hot D3cold [ 1.018373] pci 0000:00:1d.0: [8086:9d18] type 01 class 0x060400 PCIe Root Port [ 1.018407] pci 0000:00:1d.0: PCI bridge to [bus 3b] [ 1.018420] pci 0000:00:1d.0: bridge window [mem 0xdc200000-0xdc2fffff] [ 1.018522] pci 0000:00:1d.0: PME# supported from D0 D3hot D3cold [ 1.021222] pci 0000:00:1f.0: [8086:9d58] type 00 class 0x060100 conventional PCI endpoint [ 1.022483] pci 0000:00:1f.2: [8086:9d21] type 00 class 0x058000 conventional PCI endpoint [ 1.022508] pci 0000:00:1f.2: BAR 0 [mem 0xdc32c000-0xdc32ffff] [ 1.023620] pci 0000:00:1f.3: [8086:9d71] type 00 class 0x040380 conventional PCI endpoint [ 1.023653] pci 0000:00:1f.3: BAR 0 [mem 0xdc328000-0xdc32bfff 64bit] [ 1.023689] pci 0000:00:1f.3: BAR 4 [mem 0xdc300000-0xdc30ffff 64bit] [ 1.023775] pci 0000:00:1f.3: PME# supported from D3hot D3cold [ 1.026860] pci 0000:00:1f.4: [8086:9d23] type 00 class 0x0c0500 conventional PCI endpoint [ 1.026930] pci 0000:00:1f.4: BAR 0 [mem 0xdc330000-0xdc3300ff 64bit] [ 1.027010] pci 0000:00:1f.4: BAR 4 [io 0xf040-0xf05f] [ 1.028415] pci 0000:00:1c.0: PCI bridge to [bus 01-39] [ 1.029086] pci 0000:3a:00.0: [168c:003e] type 00 class 0x028000 PCIe Endpoint [ 1.029395] pci 0000:3a:00.0: BAR 0 [mem 0xdc000000-0xdc1fffff 64bit] [ 1.030938] pci 0000:3a:00.0: PME# supported from D0 D3hot D3cold [ 1.034386] pci 0000:00:1c.4: PCI bridge to [bus 3a] [ 1.034719] pci 0000:3b:00.0: [1c5c:1284] type 00 class 0x010802 PCIe Endpoint [ 1.034752] pci 0000:3b:00.0: BAR 0 [mem 0xdc200000-0xdc203fff 64bit] [ 1.034926] pci 0000:3b:00.0: PME# supported from D0 D1 D3hot [ 1.036551] pci 0000:00:1d.0: PCI bridge to [bus 3b] [ 1.055048] ACPI: PCI: Interrupt link LNKA configured for IRQ 11 [ 1.055383] ACPI: PCI: Interrupt link LNKB configured for IRQ 10 [ 1.055714] ACPI: PCI: Interrupt link LNKC configured for IRQ 11 [ 1.056048] ACPI: PCI: Interrupt link LNKD configured for IRQ 11 [ 1.056380] ACPI: PCI: Interrupt link LNKE configured for IRQ 11 [ 1.056712] ACPI: PCI: Interrupt link LNKF configured for IRQ 11 [ 1.057047] ACPI: PCI: Interrupt link LNKG configured for IRQ 11 [ 1.057385] ACPI: PCI: Interrupt link LNKH configured for IRQ 11 [ 1.125740] ACPI: EC: interrupt unblocked [ 1.125746] ACPI: EC: event unblocked [ 1.125758] ACPI: EC: EC_CMD/EC_SC=0x934, EC_DATA=0x930 [ 1.125764] ACPI: EC: GPE=0x14 [ 1.125771] ACPI: \_SB_.PCI0.LPCB.ECDV: Boot DSDT EC initialization complete [ 1.125781] ACPI: \_SB_.PCI0.LPCB.ECDV: EC: Used to handle transactions and events [ 1.126115] iommu: Default domain type: Translated [ 1.126115] iommu: DMA domain TLB invalidation policy: lazy mode [ 1.126115] pps_core: LinuxPPS API ver. 1 registered [ 1.126115] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it> [ 1.126115] PTP clock support registered [ 1.126115] EDAC MC: Ver: 3.0.0 [ 1.126329] efivars: Registered efivars operations [ 1.126603] NetLabel: Initializing [ 1.126610] NetLabel: domain hash size = 128 [ 1.126618] NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO [ 1.126618] NetLabel: unlabeled traffic allowed by default [ 1.126618] PCI: Using ACPI for IRQ routing [ 1.149895] PCI: pci_cache_line_size set to 64 bytes [ 1.150306] e820: reserve RAM buffer [mem 0x00058000-0x0005ffff] [ 1.150314] e820: reserve RAM buffer [mem 0x0009e000-0x0009ffff] [ 1.150321] e820: reserve RAM buffer [mem 0x50e7e018-0x53ffffff] [ 1.150328] e820: reserve RAM buffer [mem 0x556ab000-0x57ffffff] [ 1.150335] e820: reserve RAM buffer [mem 0x62260000-0x63ffffff] [ 1.150342] e820: reserve RAM buffer [mem 0x64df4000-0x67ffffff] [ 1.150350] e820: reserve RAM buffer [mem 0x78600000-0x7bffffff] [ 1.150356] e820: reserve RAM buffer [mem 0x481800000-0x483ffffff] [ 1.153309] pci 0000:00:02.0: vgaarb: setting as boot VGA device [ 1.153309] pci 0000:00:02.0: vgaarb: bridge control possible [ 1.153315] pci 0000:00:02.0: vgaarb: VGA device added: decodes=io+mem,owns=io+mem,locks=none [ 1.153336] vgaarb: loaded [ 1.153713] clocksource: Switched to clocksource tsc-early [ 1.155948] VFS: Disk quotas dquot_6.6.0 [ 1.155948] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes) [ 1.156315] AppArmor: AppArmor Filesystem Enabled [ 1.156366] pnp: PnP ACPI init [ 1.157456] system 00:00: [io 0x0680-0x069f] has been reserved [ 1.157473] system 00:00: [io 0xffff] has been reserved [ 1.157483] system 00:00: [io 0xffff] has been reserved [ 1.157493] system 00:00: [io 0xffff] has been reserved [ 1.157503] system 00:00: [io 0x1800-0x18fe] has been reserved [ 1.157513] system 00:00: [io 0x164e-0x164f] has been reserved [ 1.158214] system 00:02: [io 0x1854-0x1857] has been reserved [ 1.160645] system 00:05: [mem 0xfed10000-0xfed17fff] has been reserved [ 1.160659] system 00:05: [mem 0xfed18000-0xfed18fff] has been reserved [ 1.160672] system 00:05: [mem 0xfed19000-0xfed19fff] has been reserved [ 1.160685] system 00:05: [mem 0xe0000000-0xefffffff] has been reserved [ 1.160698] system 00:05: [mem 0xfed20000-0xfed3ffff] has been reserved [ 1.160709] system 00:05: [mem 0xfed90000-0xfed93fff] could not be reserved [ 1.160722] system 00:05: [mem 0xfed45000-0xfed8ffff] has been reserved [ 1.160735] system 00:05: [mem 0xff000000-0xffffffff] has been reserved [ 1.160747] system 00:05: [mem 0xfee00000-0xfeefffff] could not be reserved [ 1.160760] system 00:05: [mem 0xdffe0000-0xdfffffff] has been reserved [ 1.161003] system 00:06: [mem 0xfd000000-0xfdabffff] has been reserved [ 1.161017] system 00:06: [mem 0xfdad0000-0xfdadffff] has been reserved [ 1.161030] system 00:06: [mem 0xfdb00000-0xfdffffff] has been reserved [ 1.161041] system 00:06: [mem 0xfe000000-0xfe01ffff] could not be reserved [ 1.161055] system 00:06: [mem 0xfe036000-0xfe03bfff] has been reserved [ 1.161068] system 00:06: [mem 0xfe03d000-0xfe3fffff] has been reserved [ 1.161081] system 00:06: [mem 0xfe410000-0xfe7fffff] has been reserved [ 1.162632] system 00:07: [io 0xff00-0xfffe] has been reserved [ 1.169236] system 00:08: [mem 0xfe029000-0xfe029fff] has been reserved [ 1.169251] system 00:08: [mem 0xfe028000-0xfe028fff] has been reserved [ 1.189980] pnp: PnP ACPI: found 9 devices [ 1.200121] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns [ 1.200200] pci 0000:00:1f.1: [8086:9d20] type 00 class 0x058000 conventional PCI endpoint [ 1.200270] pci 0000:00:1f.1: BAR 0 [mem 0xfd000000-0xfdffffff 64bit] [ 1.201019] NET: Registered PF_INET protocol family [ 1.201206] IP idents hash table entries: 262144 (order: 9, 2097152 bytes, linear) [ 1.212385] tcp_listen_portaddr_hash hash table entries: 8192 (order: 5, 131072 bytes, linear) [ 1.212726] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 1.212782] TCP established hash table entries: 131072 (order: 8, 1048576 bytes, linear) [ 1.215904] TCP bind hash table entries: 65536 (order: 9, 2097152 bytes, linear) [ 1.220378] TCP: Hash tables configured (established 131072 bind 65536) [ 1.220578] MPTCP token hash table entries: 16384 (order: 6, 393216 bytes, linear) [ 1.221122] UDP hash table entries: 8192 (order: 6, 262144 bytes, linear) [ 1.222017] UDP-Lite hash table entries: 8192 (order: 6, 262144 bytes, linear) [ 1.223006] NET: Registered PF_UNIX/PF_LOCAL protocol family [ 1.223043] NET: Registered PF_XDP protocol family [ 1.223068] pci 0000:00:1c.0: bridge window [io 0x1000-0x0fff] to [bus 01-39] add_size 1000 [ 1.223098] pci 0000:00:1c.0: bridge window [io 0x2000-0x2fff]: assigned [ 1.223113] pci 0000:00:1c.0: PCI bridge to [bus 01-39] [ 1.223123] pci 0000:00:1c.0: bridge window [io 0x2000-0x2fff] [ 1.223135] pci 0000:00:1c.0: bridge window [mem 0xc4000000-0xda0fffff] [ 1.223146] pci 0000:00:1c.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 1.223161] pci 0000:00:1c.4: PCI bridge to [bus 3a] [ 1.223172] pci 0000:00:1c.4: bridge window [mem 0xdc000000-0xdc1fffff] [ 1.223188] pci 0000:00:1d.0: PCI bridge to [bus 3b] [ 1.223199] pci 0000:00:1d.0: bridge window [mem 0xdc200000-0xdc2fffff] [ 1.223215] pci_bus 0000:00: resource 4 [io 0x0000-0x0cf7 window] [ 1.223225] pci_bus 0000:00: resource 5 [io 0x0d00-0xffff window] [ 1.223234] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000dffff window] [ 1.223244] pci_bus 0000:00: resource 7 [mem 0x7c800000-0xdfffffff window] [ 1.223254] pci_bus 0000:00: resource 8 [mem 0xfd000000-0xfe7fffff window] [ 1.223264] pci_bus 0000:01: resource 0 [io 0x2000-0x2fff] [ 1.223273] pci_bus 0000:01: resource 1 [mem 0xc4000000-0xda0fffff] [ 1.223283] pci_bus 0000:01: resource 2 [mem 0xa0000000-0xc1ffffff 64bit pref] [ 1.223293] pci_bus 0000:3a: resource 1 [mem 0xdc000000-0xdc1fffff] [ 1.223302] pci_bus 0000:3b: resource 1 [mem 0xdc200000-0xdc2fffff] [ 1.225570] PCI: CLS 0 bytes, default 64 [ 1.225609] DMAR: ACPI device "device:79" under DMAR at fed91000 as 00:15.0 [ 1.225625] DMAR: ACPI device "device:7a" under DMAR at fed91000 as 00:15.1 [ 1.225673] PCI-DMA: Using software bounce buffering for IO (SWIOTLB) [ 1.225678] software IO TLB: mapped [mem 0x000000005e260000-0x0000000062260000] (64MB) [ 1.225730] Unpacking initramfs... [ 1.226011] sgx: EPC section 0x70200000-0x75f7ffff [ 1.231871] Initialise system trusted keyrings [ 1.231901] Key type blacklist registered [ 1.232095] workingset: timestamp_bits=36 max_order=22 bucket_order=0 [ 1.232153] zbud: loaded [ 1.232718] fuse: init (API version 7.40) [ 1.233571] integrity: Platform Keyring initialized [ 1.233592] integrity: Machine keyring initialized [ 1.233607] Key type asymmetric registered [ 1.233621] Asymmetric key parser 'x509' registered [ 1.524882] Freeing initrd memory: 21192K [ 1.536100] alg: self-tests disabled [ 1.536263] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 247) [ 1.536363] io scheduler mq-deadline registered [ 1.539875] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4 [ 1.546395] thermal LNXTHERM:00: registered as thermal_zone0 [ 1.546405] ACPI: thermal: Thermal Zone [THM] (25 C) [ 1.546917] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled [ 1.549429] hpet_acpi_add: no address or irqs in _CRS [ 1.561551] tpm_tis MSFT0101:00: 2.0 TPM (device-id 0xFE, rev-id 4) [ 1.604922] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12 [ 1.605325] i8042: Warning: Keylock active [ 1.607589] serio: i8042 KBD port at 0x60,0x64 irq 1 [ 1.607604] serio: i8042 AUX port at 0x60,0x64 irq 12 [ 1.608023] mousedev: PS/2 mouse device common for all mice [ 1.608090] rtc_cmos 00:01: RTC can wake from S4 [ 1.609135] rtc_cmos 00:01: registered as rtc0 [ 1.609275] rtc_cmos 00:01: setting system clock to 2024-03-26T12:21:33 UTC (1711455693) [ 1.609355] rtc_cmos 00:01: alarms up to one month, y3k, 242 bytes nvram [ 1.609709] intel_pstate: Intel P-state driver initializing [ 1.610171] intel_pstate: HWP enabled [ 1.610222] ledtrig-cpu: registered to indicate activity on CPUs [ 1.610425] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input0 [ 1.611886] efifb: probing for efifb [ 1.611930] efifb: framebuffer at 0x90000000, using 22500k, total 22500k [ 1.611937] efifb: mode is 3200x1800x32, linelength=12800, pages=1 [ 1.611945] efifb: scrolling: redraw [ 1.611949] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0 [ 1.612288] Console: switching to colour frame buffer device 200x56 [ 1.633433] fb0: EFI VGA frame buffer device [ 1.634192] NET: Registered PF_INET6 protocol family [ 1.646623] Segment Routing with IPv6 [ 1.646670] In-situ OAM (IOAM) with IPv6 [ 1.646772] mip6: Mobile IPv6 [ 1.646785] NET: Registered PF_PACKET protocol family [ 1.646874] mpls_gso: MPLS GSO support [ 1.647763] ENERGY_PERF_BIAS: Set to 'normal', was 'performance' [ 1.647965] microcode: Current revision: 0x000000f4 [ 1.647973] microcode: Updated early from: 0x000000f0 [ 1.648227] IPI shorthand broadcast: enabled [ 1.656216] sched_clock: Marking stable (1644004506, 8286096)->(1778991850, -126701248) [ 1.656606] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level [ 1.656739] registered taskstats version 1 [ 1.656839] Loading compiled-in X.509 certificates [ 1.667296] Key type .fscrypt registered [ 1.667304] Key type fscrypt-provisioning registered [ 1.685474] ------------[ cut here ]------------ [ 1.685482] Unpatched return thunk in use. This should not happen! [ 1.685498] WARNING: CPU: 1 PID: 88 at arch/x86/kernel/cpu/bugs.c:2935 __warn_thunk+0x42/0x50 [ 1.685515] Modules linked in: cryptd(+) [ 1.685527] CPU: 1 PID: 88 Comm: modprobe Not tainted 6.9.0-rc1+ #77 [ 1.685537] Hardware name: Dell Inc. XPS 13 9360/0596KF, BIOS 2.21.0 06/02/2022 [ 1.685544] RIP: 0010:__warn_thunk+0x42/0x50 [ 1.685555] Code: 05 da 01 00 74 05 c3 cc cc cc cc 48 c7 c7 7d f4 20 9b e8 51 5b 37 00 48 c7 c7 a0 1b ea 9a c6 05 60 05 da 01 01 e8 5e 38 08 00 <0f> 0b c3 cc cc cc cc 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 [ 1.685565] RSP: 0018:ffffb6a6c054bac0 EFLAGS: 00010282 [ 1.685574] RAX: 0000000000000000 RBX: ffffffffc04692c0 RCX: 0001ffffffffffff [ 1.685582] RDX: ffff996b43028000 RSI: 0000000000000004 RDI: ffffffff9b0ca398 [ 1.685589] RBP: ffffb6a6c054bb10 R08: ffffffff9bece8c8 R09: 0000000000000000 [ 1.685596] R10: 0001ffff9b0ca398 R11: ffffffff995af821 R12: ffff996b4670d4a0 [ 1.685603] R13: ffffffffc0469770 R14: ffffffffc0469768 R15: ffffffffc0473008 [ 1.685610] FS: 00007f8cee712040(0000) GS:ffff996eaf080000(0000) knlGS:0000000000000000 [ 1.685618] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1.685626] CR2: 00007ffda89fcb28 CR3: 00000001013f2004 CR4: 00000000003706f0 [ 1.685633] Call Trace: [ 1.685638] <TASK> [ 1.685644] ? __warn+0xaf/0x1c0 [ 1.685655] ? __warn_thunk+0x42/0x50 [ 1.685667] ? report_bug+0x1d6/0x200 [ 1.685680] ? handle_bug+0x3c/0x80 [ 1.685690] ? exc_invalid_op+0x17/0x70 [ 1.685700] ? asm_exc_invalid_op+0x1a/0x20 [ 1.685714] ? __wake_up_klogd.part.0+0x21/0x80 [ 1.685731] ? __warn_thunk+0x42/0x50 [ 1.685742] warn_thunk_thunk+0x1a/0x30 [ 1.685752] ? do_init_module+0xf2/0x360 [ 1.685767] ? _sub_I_00099_0+0x20/0x20 [cryptd] [ 1.685818] do_init_module+0xf7/0x360 [ 1.685835] load_module+0x35f2/0x37d0 [ 1.685868] ? init_module_from_file+0xca/0x130 [ 1.685883] init_module_from_file+0xca/0x130 [ 1.685905] idempotent_init_module+0x1b0/0x3d0 [ 1.685924] __x64_sys_finit_module+0x88/0xe0 [ 1.685940] do_syscall_64+0x85/0x1a0 [ 1.685953] ? do_syscall_64+0x94/0x1a0 [ 1.685965] ? do_syscall_64+0x94/0x1a0 [ 1.685978] ? arch_exit_to_user_mode_prepare.isra.0+0x69/0xa0 [ 1.685990] ? irqentry_exit_to_user_mode+0x36/0xd0 [ 1.686006] entry_SYSCALL_64_after_hwframe+0x6c/0x74 [ 1.686017] RIP: 0033:0x7f8cee814059 [ 1.686025] Code: 08 89 e8 5b 5d c3 66 2e 0f 1f 84 00 00 00 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 8f 1d 0d 00 f7 d8 64 89 01 48 [ 1.686034] RSP: 002b:00007ffda89ffae8 EFLAGS: 00000246 ORIG_RAX: 0000000000000139 [ 1.686045] RAX: ffffffffffffffda RBX: 000055ec481f3b40 RCX: 00007f8cee814059 [ 1.686052] RDX: 0000000000000000 RSI: 000055ec13d9d9a6 RDI: 0000000000000000 [ 1.686059] RBP: 0000000000000000 R08: 0000000000000060 R09: 000055ec481f51f0 [ 1.686066] R10: 0000000000000038 R11: 0000000000000246 R12: 000055ec13d9d9a6 [ 1.686073] R13: 0000000000040000 R14: 000055ec481f3f30 R15: 0000000000000000 [ 1.686087] </TASK> [ 1.686091] ---[ end trace 0000000000000000 ]--- [ 1.686196] cryptd: max_cpu_qlen set to 1000 [ 1.690897] AVX2 version of gcm_enc/dec engaged. [ 1.691065] AES CTR mode by8 optimization enabled [ 1.731973] Key type encrypted registered [ 1.731985] AppArmor: AppArmor sha256 policy hashing enabled [ 1.732270] integrity: Loading X.509 certificate: UEFI:db [ 1.732361] integrity: Loaded X.509 cert 'Dell Inc. UEFI DB: 5ddb772dc880660055ba0bc131886bb630a639e7' [ 1.732369] integrity: Loading X.509 certificate: UEFI:db [ 1.732469] integrity: Loaded X.509 cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4' [ 1.732477] integrity: Loading X.509 certificate: UEFI:db [ 1.732566] integrity: Loaded X.509 cert 'Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53' [ 1.733685] ima: Allocated hash algorithm: sha256 [ 1.773496] ima: No architecture policies found [ 1.773551] evm: Initialising EVM extended attributes: [ 1.773556] evm: security.selinux [ 1.773562] evm: security.SMACK64 (disabled) [ 1.773567] evm: security.SMACK64EXEC (disabled) [ 1.773573] evm: security.SMACK64TRANSMUTE (disabled) [ 1.773579] evm: security.SMACK64MMAP (disabled) [ 1.773584] evm: security.apparmor [ 1.773589] evm: security.ima [ 1.773594] evm: security.capability [ 1.773600] evm: HMAC attrs: 0x1 [ 1.775310] RAS: Correctable Errors collector initialized. [ 1.775395] clk: Disabling unused clocks [ 1.777527] Freeing unused decrypted memory: 2036K [ 1.778591] Freeing unused kernel image (initmem) memory: 6304K [ 1.778678] Write protecting the kernel read-only data: 28672k [ 1.779892] Freeing unused kernel image (rodata/data gap) memory: 20K [ 1.867807] x86/mm: Checked W+X mappings: passed, no W+X pages found. [ 1.867814] x86/mm: Checking user space page tables [ 1.950178] x86/mm: Checked W+X mappings: passed, no W+X pages found. [ 1.950194] Run /init as init process [ 1.950200] with arguments: [ 1.950205] /init [ 1.950211] with environment: [ 1.950216] HOME=/ [ 1.950221] TERM=linux [ 1.950227] BOOT_IMAGE=/vmlinuz-6.9.0-rc1+ [ 2.240311] tsc: Refined TSC clocksource calibration: 2903.999 MHz [ 2.240328] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x29dc050a48e, max_idle_ns: 440795325698 ns [ 2.240364] clocksource: Switched to clocksource tsc [ 2.375859] intel-lpss 0000:00:15.0: enabling device (0000 -> 0002) [ 2.379843] hid: raw HID events driver (C) Jiri Kosina [ 2.403876] idma64 idma64.0: Found Intel integrated DMA 64-bit [ 2.472863] ACPI: bus type USB registered [ 2.473020] usbcore: registered new interface driver usbfs [ 2.473081] usbcore: registered new interface driver hub [ 2.473135] usbcore: registered new device driver usb [ 2.503747] intel-lpss 0000:00:15.1: enabling device (0000 -> 0002) [ 2.504995] idma64 idma64.1: Found Intel integrated DMA 64-bit [ 2.710712] ACPI: bus type drm_connector registered [ 2.711930] i801_smbus 0000:00:1f.4: SPD Write Disable is set [ 2.711974] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt [ 2.767956] xhci_hcd 0000:00:14.0: xHCI Host Controller [ 2.767993] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 1 [ 2.769163] xhci_hcd 0000:00:14.0: hcc params 0x200077c1 hci version 0x100 quirks 0x0000000081109810 [ 2.771187] xhci_hcd 0000:00:14.0: xHCI Host Controller [ 2.771206] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 2 [ 2.771219] xhci_hcd 0000:00:14.0: Host supports USB 3.0 SuperSpeed [ 2.771323] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.09 [ 2.771335] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 2.771344] usb usb1: Product: xHCI Host Controller [ 2.771352] usb usb1: Manufacturer: Linux 6.9.0-rc1+ xhci-hcd [ 2.771360] usb usb1: SerialNumber: 0000:00:14.0 [ 2.771918] hub 1-0:1.0: USB hub found [ 2.771948] hub 1-0:1.0: 12 ports detected [ 2.782997] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.09 [ 2.783010] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 2.783019] usb usb2: Product: xHCI Host Controller [ 2.783027] usb usb2: Manufacturer: Linux 6.9.0-rc1+ xhci-hcd [ 2.783035] usb usb2: SerialNumber: 0000:00:14.0 [ 2.783452] hub 2-0:1.0: USB hub found [ 2.783486] hub 2-0:1.0: 6 ports detected [ 2.931846] input: DLL075B:01 06CB:76AF Mouse as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input2 [ 2.932597] input: DLL075B:01 06CB:76AF Touchpad as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input3 [ 2.933554] hid-generic 0018:06CB:76AF.0001: input,hidraw0: I2C HID v1.00 Mouse [DLL075B:01 06CB:76AF] on i2c-DLL075B:01 [ 2.993709] nvme nvme0: pci function 0000:3b:00.0 [ 3.013108] nvme nvme0: 4/0/0 default/read/poll queues [ 3.023045] nvme0n1: p1 p2 p3 p4 [ 3.040319] usb 1-1: new low-speed USB device number 2 using xhci_hcd [ 3.197418] usb 1-1: New USB device found, idVendor=0bf8, idProduct=101e, bcdDevice= 1.09 [ 3.197472] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 3.197507] usb 1-1: Product: Fujitsu Keyboard [ 3.197537] usb 1-1: Manufacturer: Fujitsu [ 3.332580] usb 1-2: new low-speed USB device number 3 using xhci_hcd [ 3.485254] usb 1-2: New USB device found, idVendor=046d, idProduct=c077, bcdDevice=72.00 [ 3.485308] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 3.485343] usb 1-2: Product: USB Optical Mouse [ 3.485373] usb 1-2: Manufacturer: Logitech [ 3.616637] usb 1-3: new full-speed USB device number 4 using xhci_hcd [ 3.766870] usb 1-3: New USB device found, idVendor=0cf3, idProduct=e300, bcdDevice= 0.01 [ 3.766924] usb 1-3: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 3.904911] usb 1-4: new full-speed USB device number 5 using xhci_hcd [ 4.055602] usb 1-4: New USB device found, idVendor=04f3, idProduct=2234, bcdDevice=11.11 [ 4.055655] usb 1-4: New USB device strings: Mfr=4, Product=14, SerialNumber=0 [ 4.055690] usb 1-4: Product: Touchscreen [ 4.055720] usb 1-4: Manufacturer: ELAN [ 4.188664] usb 1-5: new high-speed USB device number 6 using xhci_hcd [ 4.397815] usb 1-5: New USB device found, idVendor=0c45, idProduct=670c, bcdDevice=56.26 [ 4.397874] usb 1-5: New USB device strings: Mfr=2, Product=1, SerialNumber=0 [ 4.397914] usb 1-5: Product: Integrated_Webcam_HD [ 4.397949] usb 1-5: Manufacturer: CN09GTFMLOG008C8B7FWA01 [ 4.439893] input: Fujitsu Fujitsu Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/0003:0BF8:101E.0002/input/input5 [ 4.497913] hid-generic 0003:0BF8:101E.0002: input,hidraw1: USB HID v1.10 Keyboard [Fujitsu Fujitsu Keyboard] on usb-0000:00:14.0-1/input0 [ 4.507353] input: Fujitsu Fujitsu Keyboard System Control as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.1/0003:0BF8:101E.0003/input/input6 [ 4.565232] input: Fujitsu Fujitsu Keyboard Consumer Control as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.1/0003:0BF8:101E.0003/input/input7 [ 4.566433] hid-generic 0003:0BF8:101E.0003: input,hiddev0,hidraw2: USB HID v1.10 Device [Fujitsu Fujitsu Keyboard] on usb-0000:00:14.0-1/input1 [ 4.570362] input: Logitech USB Optical Mouse as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/0003:046D:C077.0004/input/input8 [ 4.571314] hid-generic 0003:046D:C077.0004: input,hidraw3: USB HID v1.11 Mouse [Logitech USB Optical Mouse] on usb-0000:00:14.0-2/input0 [ 4.584283] input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0005/input/input9 [ 4.585277] input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0005/input/input10 [ 4.585754] input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0005/input/input11 [ 4.587039] hid-generic 0003:04F3:2234.0005: input,hiddev1,hidraw4: USB HID v1.10 Device [ELAN Touchscreen] on usb-0000:00:14.0-4/input0 [ 4.587463] usbcore: registered new interface driver usbhid [ 4.587489] usbhid: USB HID core driver [ 4.691178] device-mapper: core: CONFIG_IMA_DISABLE_HTABLE is disabled. Duplicate IMA measurements will not be recorded in the IMA log. [ 4.691276] device-mapper: uevent: version 1.0.3 [ 4.691575] device-mapper: ioctl: 4.48.0-ioctl (2023-03-01) initialised: dm-devel@lists.linux.dev [ 12.809995] PM: Image not found (code -22) [ 19.848804] EXT4-fs (dm-0): mounted filesystem 32e29882-d94d-4a92-9ee4-4d03002bfa29 ro with ordered data mode. Quota mode: none. [ 19.952790] Not activating Mandatory Access Control as /sbin/tomoyo-init does not exist. [ 20.190093] systemd[1]: Inserted module 'autofs4' [ 20.253538] systemd[1]: systemd 255.4-1+b1 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified) [ 20.253595] systemd[1]: Detected architecture x86-64. [ 20.255643] systemd[1]: Hostname set to <abreu>. [ 20.607353] systemd[1]: Queued start job for default target graphical.target. [ 20.666184] systemd[1]: Created slice system-getty.slice - Slice /system/getty. [ 20.670914] systemd[1]: Created slice system-modprobe.slice - Slice /system/modprobe. [ 20.675216] systemd[1]: Created slice system-systemd\x2dcryptsetup.slice - Encrypted Volume Units Service Slice. [ 20.679483] systemd[1]: Created slice system-systemd\x2dfsck.slice - Slice /system/systemd-fsck. [ 20.681985] systemd[1]: Created slice user.slice - User and Session Slice. [ 20.682500] systemd[1]: Started systemd-ask-password-console.path - Dispatch Password Requests to Console Directory Watch. [ 20.682952] systemd[1]: Started systemd-ask-password-wall.path - Forward Password Requests to Wall Directory Watch. [ 20.684129] systemd[1]: Set up automount proc-sys-fs-binfmt_misc.automount - Arbitrary Executable File Formats File System Automount Point. [ 20.684243] systemd[1]: Expecting device dev-disk-by\x2ddiskseq-1\x2dpart4.device - /dev/disk/by-diskseq/1-part4... [ 20.684285] systemd[1]: Expecting device dev-disk-by\x2duuid-2d23fd4c\x2d5d03\x2d4e1a\x2d8a42\x2d0e859d1f00d8.device - /dev/disk/by-uuid/2d23fd4c-5d03-4e1a-8a42-0e859d1f00d8... [ 20.684402] systemd[1]: Expecting device dev-disk-by\x2duuid-61be8f50\x2d69c5\x2d49a5\x2dbcad\x2d3f4521e9c7b5.device - /dev/disk/by-uuid/61be8f50-69c5-49a5-bcad-3f4521e9c7b5... [ 20.684451] systemd[1]: Expecting device dev-disk-by\x2duuid-96BD\x2d5653.device - /dev/disk/by-uuid/96BD-5653... [ 20.684537] systemd[1]: Reached target integritysetup.target - Local Integrity Protected Volumes. [ 20.684599] systemd[1]: Reached target nss-user-lookup.target - User and Group Name Lookups. [ 20.684641] systemd[1]: Reached target paths.target - Path Units. [ 20.684691] systemd[1]: Reached target remote-fs.target - Remote File Systems. [ 20.684730] systemd[1]: Reached target slices.target - Slice Units. [ 20.684793] systemd[1]: Reached target veritysetup.target - Local Verity Protected Volumes. [ 20.688311] systemd[1]: Listening on systemd-coredump.socket - Process Core Dump Socket. [ 20.688915] systemd[1]: Listening on systemd-fsckd.socket - fsck to fsckd communication Socket. [ 20.689231] systemd[1]: Listening on systemd-initctl.socket - initctl Compatibility Named Pipe. [ 20.689905] systemd[1]: Listening on systemd-journald-dev-log.socket - Journal Socket (/dev/log). [ 20.690487] systemd[1]: Listening on systemd-journald.socket - Journal Socket. [ 20.690627] systemd[1]: systemd-pcrextend.socket - TPM2 PCR Extension (Varlink) was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 20.691575] systemd[1]: Listening on systemd-udevd-control.socket - udev Control Socket. [ 20.692001] systemd[1]: Listening on systemd-udevd-kernel.socket - udev Kernel Socket. [ 20.695955] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System... [ 20.698778] systemd[1]: Mounting dev-mqueue.mount - POSIX Message Queue File System... [ 20.702464] systemd[1]: Mounting sys-kernel-debug.mount - Kernel Debug File System... [ 20.708566] systemd[1]: Mounting sys-kernel-tracing.mount - Kernel Trace File System... [ 20.715492] systemd[1]: Starting kmod-static-nodes.service - Create List of Static Device Nodes... [ 20.724842] systemd[1]: Starting modprobe@configfs.service - Load Kernel Module configfs... [ 20.728133] systemd[1]: Starting modprobe@dm_mod.service - Load Kernel Module dm_mod... [ 20.737118] systemd[1]: Starting modprobe@drm.service - Load Kernel Module drm... [ 20.744940] systemd[1]: Starting modprobe@efi_pstore.service - Load Kernel Module efi_pstore... [ 20.748229] systemd[1]: Starting modprobe@fuse.service - Load Kernel Module fuse... [ 20.760936] systemd[1]: Starting modprobe@loop.service - Load Kernel Module loop... [ 20.761097] systemd[1]: systemd-fsck-root.service - File System Check on Root Device was skipped because of an unmet condition check (ConditionPathExists=!/run/initramfs/fsck-root). [ 20.780896] systemd[1]: Starting systemd-journald.service - Journal Service... [ 20.794404] systemd[1]: Starting systemd-modules-load.service - Load Kernel Modules... [ 20.794451] systemd[1]: systemd-pcrmachine.service - TPM2 PCR Machine ID Measurement was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 20.800703] systemd[1]: Starting systemd-remount-fs.service - Remount Root and Kernel File Systems... [ 20.800819] systemd[1]: systemd-tpm2-setup-early.service - TPM2 SRK Setup (Early) was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 20.809093] systemd[1]: Starting systemd-udev-trigger.service - Coldplug All udev Devices... [ 20.812193] pstore: Using crash dump compression: deflate [ 20.818187] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System. [ 20.818605] systemd[1]: Mounted dev-mqueue.mount - POSIX Message Queue File System. [ 20.818991] systemd[1]: Mounted sys-kernel-debug.mount - Kernel Debug File System. [ 20.824377] systemd[1]: Mounted sys-kernel-tracing.mount - Kernel Trace File System. [ 20.825344] systemd[1]: Finished kmod-static-nodes.service - Create List of Static Device Nodes. [ 20.826704] systemd[1]: modprobe@dm_mod.service: Deactivated successfully. [ 20.827482] systemd[1]: Finished modprobe@dm_mod.service - Load Kernel Module dm_mod. [ 20.842715] systemd[1]: modprobe@drm.service: Deactivated successfully. [ 20.843614] systemd[1]: Finished modprobe@drm.service - Load Kernel Module drm. [ 20.845012] systemd[1]: modprobe@configfs.service: Deactivated successfully. [ 20.845615] pstore: Registered efi_pstore as persistent store backend [ 20.845999] systemd[1]: Finished modprobe@configfs.service - Load Kernel Module configfs. [ 20.847282] systemd[1]: modprobe@fuse.service: Deactivated successfully. [ 20.848064] systemd[1]: Finished modprobe@fuse.service - Load Kernel Module fuse. [ 20.850743] systemd[1]: modprobe@efi_pstore.service: Deactivated successfully. [ 20.851518] systemd[1]: Finished modprobe@efi_pstore.service - Load Kernel Module efi_pstore. [ 20.865595] loop: module loaded [ 20.868061] systemd-journald[401]: Collecting audit messages is disabled. [ 20.889446] systemd[1]: Mounting sys-fs-fuse-connections.mount - FUSE Control File System... [ 20.908167] systemd[1]: Mounting sys-kernel-config.mount - Kernel Configuration File System... [ 20.919057] systemd[1]: Starting systemd-tmpfiles-setup-dev-early.service - Create Static Device Nodes in /dev gracefully... [ 20.927835] systemd[1]: modprobe@loop.service: Deactivated successfully. [ 20.930784] systemd[1]: Finished modprobe@loop.service - Load Kernel Module loop. [ 20.933271] systemd[1]: Mounted sys-fs-fuse-connections.mount - FUSE Control File System. [ 20.933823] systemd[1]: systemd-repart.service - Repartition Root Disk was skipped because no trigger condition checks were met. [ 20.950063] systemd[1]: Mounted sys-kernel-config.mount - Kernel Configuration File System. [ 20.961888] lp: driver loaded but no devices found [ 20.974477] EXT4-fs (dm-0): re-mounted 32e29882-d94d-4a92-9ee4-4d03002bfa29 r/w. Quota mode: none. [ 20.983018] systemd[1]: Finished systemd-remount-fs.service - Remount Root and Kernel File Systems. [ 20.989913] systemd[1]: systemd-hwdb-update.service - Rebuild Hardware Database was skipped because of an unmet condition check (ConditionNeedsUpdate=/etc). [ 20.991618] ppdev: user-space parallel port driver [ 20.997723] systemd[1]: Starting systemd-pstore.service - Platform Persistent Storage Archival... [ 21.008703] systemd[1]: Starting systemd-random-seed.service - Load/Save OS Random Seed... [ 21.008757] systemd[1]: systemd-tpm2-setup.service - TPM2 SRK Setup was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 21.025715] systemd[1]: Started systemd-journald.service - Journal Service. [ 21.066066] msr: no symbol version for __tsan_init [ 21.118659] systemd-journald[401]: Received client request to flush runtime journal. [ 21.125951] systemd-journald[401]: File /var/log/journal/16ae67b9dca94ecebbc8ec78ab24e074/system.journal corrupted or uncleanly shut down, renaming and replacing. [ 21.787348] ACPI: AC: AC Adapter [AC] (on-line) [ 21.791101] input: Lid Switch as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00/input/input13 [ 21.843876] input: Intel HID events as /devices/platform/INT33D5:00/input/input14 [ 21.849564] Adding 8387904k swap on /dev/nvme0n1p4. Priority:-2 extents:1 across:8387904k SS [ 21.892685] Consider using thermal netlink events interface [ 21.916428] ACPI: button: Lid Switch [LID0] [ 21.916814] input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input15 [ 21.933320] wmi_bus wmi_bus-PNP0C14:01: [Firmware Bug]: WQBC data block query control method not found [ 21.954526] input: Intel Virtual Buttons as /devices/pci0000:00/0000:00:1f.0/PNP0C09:00/INT33D6:00/input/input16 [ 21.957634] ACPI: button: Power Button [PBTN] [ 21.957864] input: Sleep Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input17 [ 21.958489] ACPI: button: Sleep Button [SBTN] [ 21.958684] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input19 [ 21.959312] ACPI: button: Power Button [PWRF] [ 21.967310] intel-hid INT33D5:00: platform supports 5 button array [ 21.967730] input: Intel HID 5 button array as /devices/platform/INT33D5:00/input/input20 [ 21.970229] input: DLL075B:01 06CB:76AF Mouse as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input21 [ 21.970705] input: DLL075B:01 06CB:76AF Touchpad as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input22 [ 21.971252] hid-multitouch 0018:06CB:76AF.0001: input,hidraw0: I2C HID v1.00 Mouse [DLL075B:01 06CB:76AF] on i2c-DLL075B:01 [ 22.107816] input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0005/input/input24 [ 22.108244] input: ELAN Touchscreen UNKNOWN as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0005/input/input25 [ 22.108589] input: ELAN Touchscreen UNKNOWN as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0005/input/input26 [ 22.109119] hid-multitouch 0003:04F3:2234.0005: input,hiddev1,hidraw4: USB HID v1.10 Device [ELAN Touchscreen] on usb-0000:00:14.0-4/input0 [ 22.115352] EXT4-fs (nvme0n1p2): mounted filesystem 2d23fd4c-5d03-4e1a-8a42-0e859d1f00d8 r/w with ordered data mode. Quota mode: none. [ 22.120560] ACPI: battery: Slot [BAT0] (battery present) [ 22.312513] intel_pmc_core INT33A1:00: initialized [ 22.611470] input: PC Speaker as /devices/platform/pcspkr/input/input28 [ 22.644557] iTCO_vendor_support: vendor-support=0 [ 22.650905] proc_thermal 0000:00:04.0: enabling device (0000 -> 0002) [ 22.766904] iTCO_wdt iTCO_wdt: Found a Intel PCH TCO device (Version=4, TCOBASE=0x0400) [ 22.814138] iTCO_wdt iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0) [ 22.902501] audit: type=1400 audit(1711455714.783:2): apparmor="STATUS" operation="profile_load" profile="unconfined" name="lsb_release" pid=520 comm="apparmor_parser" [ 22.905238] mei_me 0000:00:16.0: enabling device (0000 -> 0002) [ 22.906336] mc: Linux media interface: v0.10 [ 22.916979] audit: type=1400 audit(1711455714.803:3): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe" pid=521 comm="apparmor_parser" [ 22.916999] audit: type=1400 audit(1711455714.803:4): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe//kmod" pid=521 comm="apparmor_parser" [ 22.917271] intel_rapl_common: Found RAPL domain package [ 22.917282] intel_rapl_common: Found RAPL domain dram [ 22.944310] audit: type=1400 audit(1711455714.827:5): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/bin/man" pid=525 comm="apparmor_parser" [ 22.944331] audit: type=1400 audit(1711455714.827:6): apparmor="STATUS" operation="profile_load" profile="unconfined" name="man_filter" pid=525 comm="apparmor_parser" [ 22.944346] audit: type=1400 audit(1711455714.827:7): apparmor="STATUS" operation="profile_load" profile="unconfined" name="man_groff" pid=525 comm="apparmor_parser" [ 22.971927] audit: type=1400 audit(1711455714.851:8): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/NetworkManager/nm-dhcp-client.action" pid=522 comm="apparmor_parser" [ 22.971948] audit: type=1400 audit(1711455714.851:9): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/NetworkManager/nm-dhcp-helper" pid=522 comm="apparmor_parser" [ 22.971964] audit: type=1400 audit(1711455714.851:10): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/connman/scripts/dhclient-script" pid=522 comm="apparmor_parser" [ 22.971981] audit: type=1400 audit(1711455714.851:11): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/{,usr/}sbin/dhclient" pid=522 comm="apparmor_parser" [ 23.533271] RAPL PMU: API unit is 2^-32 Joules, 5 fixed counters, 655360 ms ovfl timer [ 23.533285] RAPL PMU: hw unit of domain pp0-core 2^-14 Joules [ 23.533294] RAPL PMU: hw unit of domain package 2^-14 Joules [ 23.533303] RAPL PMU: hw unit of domain dram 2^-14 Joules [ 23.533311] RAPL PMU: hw unit of domain pp1-gpu 2^-14 Joules [ 23.533319] RAPL PMU: hw unit of domain psys 2^-14 Joules [ 24.366433] intel_rapl_common: Found RAPL domain package [ 24.366447] intel_rapl_common: Found RAPL domain core [ 24.366456] intel_rapl_common: Found RAPL domain uncore [ 24.366464] intel_rapl_common: Found RAPL domain dram [ 24.366473] intel_rapl_common: Found RAPL domain psys [ 24.494859] input: Dell WMI hotkeys as /devices/platform/PNP0C14:01/wmi_bus/wmi_bus-PNP0C14:01/9DBB5994-A997-11DA-B012-B622A1EF5492/input/input29 [ 24.937632] videodev: Linux video capture interface: v2.00 [ 25.347317] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 25.347374] snd_hda_intel 0000:00:1f.3: enabling device (0000 -> 0002) [ 25.944460] usb 1-5: Found UVC 1.00 device Integrated_Webcam_HD (0c45:670c) [ 25.948656] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 25.949969] PPP generic driver version 2.4.2 [ 25.964698] NET: Registered PF_PPPOX protocol family [ 25.980608] Initializing XFRM netlink socket [ 26.079836] IPsec XFRM device driver [ 26.093937] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 26.106321] usbcore: registered new interface driver uvcvideo [ 26.170610] l2tp_core: L2TP core driver, V2.0 [ 26.225126] l2tp_netlink: L2TP netlink interface [ 26.781135] cfg80211: Loading compiled-in X.509 certificates for regulatory database [ 26.787080] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7' [ 26.792540] l2tp_ppp: PPPoL2TP kernel driver, V2.0 [ 26.799793] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600' [ 26.923113] cfg80211: loaded regulatory.db is malformed or signature is missing/invalid [ 27.253759] Bluetooth: Core ver 2.22 [ 27.253848] NET: Registered PF_BLUETOOTH protocol family [ 27.253857] Bluetooth: HCI device and connection manager initialized [ 27.253872] Bluetooth: HCI socket layer initialized [ 27.253884] Bluetooth: L2CAP socket layer initialized [ 27.253908] Bluetooth: SCO socket layer initialized [ 27.333339] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 28.341668] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 28.350025] usbcore: registered new interface driver btusb [ 28.352777] snd_soc_skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 28.352899] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 28.354124] snd_soc_skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 28.354171] snd_soc_skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 28.365971] Bluetooth: hci0: using rampatch file: qca/rampatch_usb_00000302.bin [ 28.365987] Bluetooth: hci0: QCA: patch rome 0x302 build 0x3e8, firmware rome 0x302 build 0x111 [ 28.739608] Bluetooth: hci0: using NVM file: qca/nvm_usb_00000302.bin [ 28.751516] snd_soc_avs 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 28.766065] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. [ 33.800132] sof-audio-pci-intel-skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 33.806377] stackdepot: allocating hash table of 1048576 entries via kvcalloc [ 33.830609] Console: switching to colour dummy device 80x25 [ 33.830742] i915 0000:00:02.0: vgaarb: deactivate vga console [ 33.848563] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem [ 33.850082] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/kbl_dmc_ver1_04.bin (v1.4) [ 34.327175] ath10k_pci 0000:3a:00.0: enabling device (0000 -> 0002) [ 34.330374] ath10k_pci 0000:3a:00.0: pci irq msi oper_irq_mode 2 irq_mode 0 reset_mode 0 [ 34.411336] i915 0000:00:02.0: [drm] [ENCODER:102:DDI B/PHY B] is disabled/in DSI mode with an ungated DDI clock, gate it [ 34.417147] i915 0000:00:02.0: [drm] [ENCODER:113:DDI C/PHY C] is disabled/in DSI mode with an ungated DDI clock, gate it [ 34.426175] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915]) [ 34.442140] [drm] Initialized i915 1.6.0 20230929 for 0000:00:02.0 on minor 0 [ 34.452120] ACPI: video: Video Device [GFX0] (multi-head: yes rom: no post: no) [ 34.454473] input: Video Bus as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input30 [ 34.454793] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 34.488380] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915]) [ 34.500286] fbcon: i915drmfb (fb0) is primary device [ 34.506618] Console: switching to colour frame buffer device 200x56 [ 34.544322] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device [ 34.617609] ath10k_pci 0000:3a:00.0: qca6174 hw3.2 target 0x05030000 chip_id 0x00340aff sub 1a56:1535 [ 34.617626] ath10k_pci 0000:3a:00.0: kconfig debug 0 debugfs 0 tracing 0 dfs 0 testmode 0 [ 34.627166] ath10k_pci 0000:3a:00.0: firmware ver WLAN.RM.4.4.1-00288- api 6 features wowlan,ignore-otp,mfp crc32 bf907c7c [ 34.713677] ath10k_pci 0000:3a:00.0: board_file api 2 bmi_id N/A crc32 d2863f91 [ 34.808440] ath10k_pci 0000:3a:00.0: htt-ver 3.87 wmi-op 4 htt-op 3 cal otp max-sta 32 raw 0 hwcrypto 1 [ 34.879413] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC3246: line_outs=1 (0x14/0x0/0x0/0x0/0x0) type:speaker [ 34.879476] snd_hda_codec_realtek hdaudioC0D0: speaker_outs=0 (0x0/0x0/0x0/0x0/0x0) [ 34.879520] snd_hda_codec_realtek hdaudioC0D0: hp_outs=1 (0x21/0x0/0x0/0x0/0x0) [ 34.879563] snd_hda_codec_realtek hdaudioC0D0: mono: mono_out=0x0 [ 34.879594] snd_hda_codec_realtek hdaudioC0D0: inputs: [ 34.879626] snd_hda_codec_realtek hdaudioC0D0: Headset Mic=0x19 [ 34.879664] snd_hda_codec_realtek hdaudioC0D0: Headphone Mic=0x1a [ 34.879699] snd_hda_codec_realtek hdaudioC0D0: Internal Mic=0x12 [ 34.919571] ath: EEPROM regdomain: 0x6c [ 34.919597] ath: EEPROM indicates we should expect a direct regpair map [ 34.919629] ath: Country alpha2 being used: 00 [ 34.919648] ath: Regpair used: 0x6c [ 34.947624] ath10k_pci 0000:3a:00.0 wlp58s0: renamed from wlan0 [ 35.809520] input: HDA Digital PCBeep as /devices/pci0000:00/0000:00:1f.3/sound/card0/input31 [ 35.809843] input: HDA Intel PCH Headphone Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input32 [ 35.813865] input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input33 [ 35.814248] input: HDA Intel PCH HDMI/DP,pcm=7 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input34 [ 35.814578] input: HDA Intel PCH HDMI/DP,pcm=8 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input35 [ 40.178954] rfkill: input handler disabled [ 44.752447] systemd-journald[401]: File /var/log/journal/16ae67b9dca94ecebbc8ec78ab24e074/user-5272.journal corrupted or uncleanly shut down, renaming and replacing. [ 45.326630] rfkill: input handler enabled [ 49.966547] pci 0000:01:00.0: [8086:1576] type 01 class 0x060400 PCIe Switch Upstream Port [ 49.966607] pci 0000:01:00.0: PCI bridge to [bus 02-39] [ 49.966632] pci 0000:01:00.0: bridge window [mem 0xc4000000-0xda0fffff] [ 49.966659] pci 0000:01:00.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 49.966691] pci 0000:01:00.0: enabling Extended Tags [ 49.967076] pci 0000:01:00.0: supports D1 D2 [ 49.967090] pci 0000:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold [ 49.967219] pci 0000:01:00.0: 15.752 Gb/s available PCIe bandwidth, limited by 8.0 GT/s PCIe x2 link at 0000:00:1c.0 (capable of 31.504 Gb/s with 8.0 GT/s PCIe x4 link) [ 50.002116] pci 0000:02:00.0: [8086:1576] type 01 class 0x060400 PCIe Switch Downstream Port [ 50.002183] pci 0000:02:00.0: PCI bridge to [bus 03] [ 50.002209] pci 0000:02:00.0: bridge window [mem 0xda000000-0xda0fffff] [ 50.002253] pci 0000:02:00.0: enabling Extended Tags [ 50.064405] pci 0000:02:00.0: supports D1 D2 [ 50.064420] pci 0000:02:00.0: PME# supported from D0 D1 D2 D3hot D3cold [ 50.066724] pci 0000:02:01.0: [8086:1576] type 01 class 0x060400 PCIe Switch Downstream Port [ 50.066819] pci 0000:02:01.0: PCI bridge to [bus 04-38] [ 50.066852] pci 0000:02:01.0: bridge window [mem 0xc4000000-0xd9efffff] [ 50.066878] pci 0000:02:01.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 50.066908] pci 0000:02:01.0: enabling Extended Tags [ 50.067073] pci 0000:02:01.0: supports D1 D2 [ 50.067081] pci 0000:02:01.0: PME# supported from D0 D1 D2 D3hot D3cold [ 50.067557] pci 0000:02:02.0: [8086:1576] type 01 class 0x060400 PCIe Switch Downstream Port [ 50.067605] pci 0000:02:02.0: PCI bridge to [bus 39] [ 50.067623] pci 0000:02:02.0: bridge window [mem 0xd9f00000-0xd9ffffff] [ 50.067659] pci 0000:02:02.0: enabling Extended Tags [ 50.067815] pci 0000:02:02.0: supports D1 D2 [ 50.067823] pci 0000:02:02.0: PME# supported from D0 D1 D2 D3hot D3cold [ 50.068334] pci 0000:01:00.0: PCI bridge to [bus 02-39] [ 50.068521] pci 0000:02:00.0: PCI bridge to [bus 03] [ 50.068710] pci 0000:02:01.0: PCI bridge to [bus 04-38] [ 50.081340] pci 0000:39:00.0: [8086:15b5] type 00 class 0x0c0330 PCIe Endpoint [ 50.081408] pci 0000:39:00.0: BAR 0 [mem 0xd9f00000-0xd9f0ffff] [ 50.081540] pci 0000:39:00.0: enabling Extended Tags [ 50.081886] pci 0000:39:00.0: supports D1 D2 [ 50.081899] pci 0000:39:00.0: PME# supported from D0 D1 D2 D3hot D3cold [ 50.082054] pci 0000:39:00.0: 8.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s PCIe x4 link at 0000:02:02.0 (capable of 31.504 Gb/s with 8.0 GT/s PCIe x4 link) [ 50.086201] pci 0000:02:02.0: PCI bridge to [bus 39] [ 50.086266] pci_bus 0000:02: Allocating resources [ 50.086301] pci 0000:02:01.0: bridge window [io 0x1000-0x0fff] to [bus 04-38] add_size 1000 [ 50.086320] pci 0000:02:02.0: bridge window [io 0x1000-0x0fff] to [bus 39] add_size 1000 [ 50.086337] pci 0000:02:02.0: bridge window [mem 0x00100000-0x000fffff 64bit pref] to [bus 39] add_size 200000 add_align 100000 [ 50.086358] pci 0000:01:00.0: bridge window [io 0x1000-0x0fff] to [bus 02-39] add_size 2000 [ 50.086377] pci 0000:01:00.0: bridge window [io size 0x2000]: can't assign; no space [ 50.086391] pci 0000:01:00.0: bridge window [io size 0x2000]: failed to assign [ 50.086408] pci 0000:01:00.0: bridge window [io size 0x2000]: can't assign; no space [ 50.086422] pci 0000:01:00.0: bridge window [io size 0x2000]: failed to assign [ 50.086448] pci 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: can't assign; no space [ 50.086464] pci 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: failed to assign [ 50.086480] pci 0000:02:01.0: bridge window [io size 0x1000]: can't assign; no space [ 50.086493] pci 0000:02:01.0: bridge window [io size 0x1000]: failed to assign [ 50.086507] pci 0000:02:02.0: bridge window [io size 0x1000]: can't assign; no space [ 50.086521] pci 0000:02:02.0: bridge window [io size 0x1000]: failed to assign [ 50.086544] pci 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: can't assign; no space [ 50.086560] pci 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: failed to assign [ 50.086576] pci 0000:02:02.0: bridge window [io size 0x1000]: can't assign; no space [ 50.086590] pci 0000:02:02.0: bridge window [io size 0x1000]: failed to assign [ 50.086605] pci 0000:02:01.0: bridge window [io size 0x1000]: can't assign; no space [ 50.086619] pci 0000:02:01.0: bridge window [io size 0x1000]: failed to assign [ 50.086635] pci 0000:02:00.0: PCI bridge to [bus 03] [ 50.086653] pci 0000:02:00.0: bridge window [mem 0xda000000-0xda0fffff] [ 50.086676] pci 0000:02:01.0: PCI bridge to [bus 04-38] [ 50.086693] pci 0000:02:01.0: bridge window [mem 0xc4000000-0xd9efffff] [ 50.086711] pci 0000:02:01.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 50.086733] pci 0000:02:02.0: PCI bridge to [bus 39] [ 50.086749] pci 0000:02:02.0: bridge window [mem 0xd9f00000-0xd9ffffff] [ 50.086772] pci 0000:01:00.0: PCI bridge to [bus 02-39] [ 50.086789] pci 0000:01:00.0: bridge window [mem 0xc4000000-0xda0fffff] [ 50.086806] pci 0000:01:00.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 50.090962] xhci_hcd 0000:39:00.0: xHCI Host Controller [ 50.090994] xhci_hcd 0000:39:00.0: new USB bus registered, assigned bus number 3 [ 50.092282] xhci_hcd 0000:39:00.0: hcc params 0x200077c1 hci version 0x110 quirks 0x0000000200009810 [ 50.096134] xhci_hcd 0000:39:00.0: xHCI Host Controller [ 50.096159] xhci_hcd 0000:39:00.0: new USB bus registered, assigned bus number 4 [ 50.096178] xhci_hcd 0000:39:00.0: Host supports USB 3.1 Enhanced SuperSpeed [ 50.097940] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.09 [ 50.097958] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 50.097972] usb usb3: Product: xHCI Host Controller [ 50.097984] usb usb3: Manufacturer: Linux 6.9.0-rc1+ xhci-hcd [ 50.097995] usb usb3: SerialNumber: 0000:39:00.0 [ 50.105949] hub 3-0:1.0: USB hub found [ 50.105991] hub 3-0:1.0: 2 ports detected [ 50.110817] usb usb4: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.09 [ 50.110835] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 50.110849] usb usb4: Product: xHCI Host Controller [ 50.110861] usb usb4: Manufacturer: Linux 6.9.0-rc1+ xhci-hcd [ 50.110874] usb usb4: SerialNumber: 0000:39:00.0 [ 50.116421] hub 4-0:1.0: USB hub found [ 50.116461] hub 4-0:1.0: 2 ports detected [ 50.125898] pci_bus 0000:02: Allocating resources [ 50.125942] pcieport 0000:02:01.0: bridge window [io 0x1000-0x0fff] to [bus 04-38] add_size 1000 [ 50.125962] pcieport 0000:02:02.0: bridge window [io 0x1000-0x0fff] to [bus 39] add_size 1000 [ 50.125980] pcieport 0000:02:02.0: bridge window [mem 0x00100000-0x000fffff 64bit pref] to [bus 39] add_size 200000 add_align 100000 [ 50.126003] pcieport 0000:01:00.0: bridge window [io 0x1000-0x0fff] to [bus 02-39] add_size 2000 [ 50.126025] pcieport 0000:01:00.0: bridge window [io size 0x2000]: can't assign; no space [ 50.126040] pcieport 0000:01:00.0: bridge window [io size 0x2000]: failed to assign [ 50.126057] pcieport 0000:01:00.0: bridge window [io size 0x2000]: can't assign; no space [ 50.126071] pcieport 0000:01:00.0: bridge window [io size 0x2000]: failed to assign [ 50.126099] pcieport 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: can't assign; no space [ 50.126115] pcieport 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: failed to assign [ 50.126132] pcieport 0000:02:01.0: bridge window [io size 0x1000]: can't assign; no space [ 50.126146] pcieport 0000:02:01.0: bridge window [io size 0x1000]: failed to assign [ 50.126161] pcieport 0000:02:02.0: bridge window [io size 0x1000]: can't assign; no space [ 50.126175] pcieport 0000:02:02.0: bridge window [io size 0x1000]: failed to assign [ 50.126199] pcieport 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: can't assign; no space [ 50.126215] pcieport 0000:02:02.0: bridge window [mem size 0x00200000 64bit pref]: failed to assign [ 50.126231] pcieport 0000:02:02.0: bridge window [io size 0x1000]: can't assign; no space [ 50.126246] pcieport 0000:02:02.0: bridge window [io size 0x1000]: failed to assign [ 50.126260] pcieport 0000:02:01.0: bridge window [io size 0x1000]: can't assign; no space [ 50.126274] pcieport 0000:02:01.0: bridge window [io size 0x1000]: failed to assign [ 50.368357] usb 3-1: new high-speed USB device number 2 using xhci_hcd [ 50.523900] usb 3-1: New USB device found, idVendor=2109, idProduct=2820, bcdDevice=30.03 [ 50.523922] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 50.523935] usb 3-1: Product: USB2.0 Hub [ 50.523947] usb 3-1: Manufacturer: VIA Labs, Inc. [ 50.529516] hub 3-1:1.0: USB hub found [ 50.529662] hub 3-1:1.0: 5 ports detected [ 50.658920] usb 4-1: new SuperSpeed Plus Gen 2x1 USB device number 2 using xhci_hcd [ 50.680104] usb 4-1: New USB device found, idVendor=2109, idProduct=0820, bcdDevice=30.03 [ 50.680125] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 50.680137] usb 4-1: Product: USB3.1 Hub [ 50.680147] usb 4-1: Manufacturer: VIA Labs, Inc. [ 50.687582] hub 4-1:1.0: USB hub found [ 50.688691] hub 4-1:1.0: 4 ports detected [ 51.280354] usb 3-1.1: new full-speed USB device number 3 using xhci_hcd [ 51.331463] i915 0000:00:02.0: [drm] Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS. [ 51.436463] usb 3-1.1: New USB device found, idVendor=06c4, idProduct=c412, bcdDevice= 0.06 [ 51.436493] usb 3-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 51.436512] usb 3-1.1: Product: DELL DA300 [ 51.436528] usb 3-1.1: Manufacturer: Bizlink [ 51.436544] usb 3-1.1: SerialNumber: MCU Ver0006 [ 51.451613] hid-generic 0003:06C4:C412.0006: hiddev2,hidraw5: USB HID v1.11 Device [Bizlink DELL DA300] on usb-0000:39:00.0-1.1/input0 [ 51.514688] usb 4-1.2: new SuperSpeed USB device number 3 using xhci_hcd [ 51.537711] usb 4-1.2: New USB device found, idVendor=0bda, idProduct=8153, bcdDevice=31.00 [ 51.537784] usb 4-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=6 [ 51.537839] usb 4-1.2: Product: USB 10/100/1000 LAN [ 51.537885] usb 4-1.2: Manufacturer: Realtek [ 51.537929] usb 4-1.2: SerialNumber: 001000001 [ 51.735962] usbcore: registered new device driver r8152-cfgselector [ 51.821364] r8152-cfgselector 4-1.2: reset SuperSpeed USB device number 3 using xhci_hcd [ 51.845469] r8152 4-1.2:1.0 (unnamed net_device) (uninitialized): Using pass-thru MAC addr 18:db:f2:2d:cc:f3 [ 51.865614] r8152 4-1.2:1.0: load rtl8153b-2 v2 04/27/23 successfully [ 51.914809] r8152 4-1.2:1.0 eth0: v1.12.13 [ 51.915334] usbcore: registered new interface driver r8152 [ 52.068155] usbcore: registered new interface driver cdc_ether [ 52.075467] usbcore: registered new interface driver r8153_ecm [ 52.198779] r8152 4-1.2:1.0 enx18dbf22dccf3: renamed from eth0 [ 53.221915] rfkill: input handler disabled [ 54.999664] r8152 4-1.2:1.0 enx18dbf22dccf3: carrier on [ 55.205941] ucsi_acpi USBC000:00: ucsi_handle_connector_change: ACK failed (-110) [ 62.785692] ucsi_acpi USBC000:00: UCSI_GET_PD_MESSAGE failed (-95) [ 63.201829] ucsi_acpi USBC000:00: UCSI_GET_PD_MESSAGE failed (-95) [ 68.512377] ucsi_acpi USBC000:00: GET_CONNECTOR_STATUS failed (-110) [ 77.220322] ucsi_acpi USBC000:00: ucsi_handle_connector_change: ACK failed (-110)
[-- Attachment #1: Type: text/plain, Size: 1110 bytes --] + brcm80211@lists.linux.dev On 3/26/2024 11:16 AM, Dmitry Antipov wrote: > Hopefully you might found it useful. Skipping linux-wireless@ > because Kalle seems to be constantly overloaded and has no > resources to handle simple cleanups ([1]), so feel free to > incorporate this into the next piece of your own work, if any > (with possible Suggested-by: as you wish). Actually it would go through Kalle as well. The agreement we have is that he will simply take it if I give my "Acked-by" for the patch. I will look at these and comment so you can repost to linux-wireless hopefully addressing my comments (if any). Regards, Arend > [1] https://lore.kernel.org/linux-wireless/87o7b7fjzp.fsf@toke.dk/T/#mab0c9f9641341575b2e07d0233157fa4b9f96a68 > > Dmitry Antipov (2): > wifi: brcmfmac: handle possible pci_enable_msi() error > wifi: brcmsmac: two thoughts around low-level phy operations > > .../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 14 ++++++++++---- > .../broadcom/brcm80211/brcmsmac/phy/phy_n.c | 12 +++++++++++- > 2 files changed, 21 insertions(+), 5 deletions(-) > [-- Attachment #2: S/MIME Cryptographic Signature --] [-- Type: application/pkcs7-signature, Size: 4219 bytes --]
Rework the TLDR (aka the short guide) for various reasons: * People had to read it entirely and then act upon what they learned, which from feedback I got was apparently somewhat hard and confusing given everything we expect from bug reporters; this partly was because the first paragraph covered a special case (regression in stable/longterm kernel) and not the main aspect most people cared about when they came to the document. Use a step-by-step approach to avoid this. * Make use of Documentation/admin-guide/verify-bugs-and-bisect-regressions.rst * The 'quickly report a stable regression to the stable team' approach hardly worked out: most of the time the regression was not known yet. Try a different approach using the regressions list. * Reports about stable/longterm regressions most of the time were greeted with a brief reply along the lines of 'Is mainline affected as well?'; this is needed to determine who is responsible, so it might as well make the reporter check that before sending the report (which verify-bugs-and-bisect-regressions.rst already tells them to do, too). Not-signed-off-by: Thorsten Leemhuis <linux@leemhuis.info> --- .../admin-guide/reporting-issues.rst | 104 +++++++++++------- 1 file changed, 62 insertions(+), 42 deletions(-) diff --git a/Documentation/admin-guide/reporting-issues.rst b/Documentation/admin-guide/reporting-issues.rst index e6083946c146e8..5f3c840ab94524 100644 --- a/Documentation/admin-guide/reporting-issues.rst +++ b/Documentation/admin-guide/reporting-issues.rst @@ -5,48 +5,68 @@ Reporting issues ++++++++++++++++ -The short guide (aka TL;DR) -=========================== - -Are you facing a regression with vanilla kernels from the same stable or -longterm series? One still supported? Then search the `LKML -<https://lore.kernel.org/lkml/>`_ and the `Linux stable mailing list -<https://lore.kernel.org/stable/>`_ archives for matching reports to join. If -you don't find any, install `the latest release from that series -<https://kernel.org/>`_. If it still shows the issue, report it to the stable -mailing list (stable@vger.kernel.org) and CC the regressions list -(regressions@lists.linux.dev); ideally also CC the maintainer and the mailing -list for the subsystem in question. - -In all other cases try your best guess which kernel part might be causing the -issue. Check the :ref:`MAINTAINERS <maintainers>` file for how its developers -expect to be told about problems, which most of the time will be by email with a -mailing list in CC. Check the destination's archives for matching reports; -search the `LKML <https://lore.kernel.org/lkml/>`_ and the web, too. If you -don't find any to join, install `the latest mainline kernel -<https://kernel.org/>`_. If the issue is present there, send a report. - -The issue was fixed there, but you would like to see it resolved in a still -supported stable or longterm series as well? Then install its latest release. -If it shows the problem, search for the change that fixed it in mainline and -check if backporting is in the works or was discarded; if it's neither, ask -those who handled the change for it. - -**General remarks**: When installing and testing a kernel as outlined above, -ensure it's vanilla (IOW: not patched and not using add-on modules). Also make -sure it's built and running in a healthy environment and not already tainted -before the issue occurs. - -If you are facing multiple issues with the Linux kernel at once, report each -separately. While writing your report, include all information relevant to the -issue, like the kernel and the distro used. In case of a regression, CC the -regressions mailing list (regressions@lists.linux.dev) to your report. Also try -to pin-point the culprit with a bisection; if you succeed, include its -commit-id and CC everyone in the sign-off-by chain. - -Once the report is out, answer any questions that come up and help where you -can. That includes keeping the ball rolling by occasionally retesting with newer -releases and sending a status update afterwards. +Reporting issues +++++++++++++++++ + +The short guide on reporting Linux kernel issues (aka "the TL;DR") +================================================================== + +Rule out something external causes your kernel to misbehave: skim the output of +``journalctl -k``; make sure the kernel is not tainted; consider a glitch in the +environment (hardware, firmware, initramfs, distribution, file system, ...). + +If you deal with multiple issues, process each separately. + +Search `lore <https://lore.kernel.org/all/>`_ for earlier reports and fixes. +Then the wider internet. Consult :ref:`MAINTAINERS <maintainers>` to determine +how bugs for the affected driver or subsystem must be submitted. This is usually +by mail and rarely bugzilla.kernel.org; if the driver or subsystem uses an +externally archived list or one of various bug trackers, search those as well. + +In case you deal with a regression still occurring in a less than two (ideally: +one) weeks old kernel that is vanilla or close to it: send a brief email to +regressions@lists.linux.dev asking if the regression is known; consider +continuing this guide right afterwards, but definitely do so if you do not +receive a positive reply within three days. + +Verify the bug and in case of a regression potentially bisect it as described in +Documentation/admin-guide/verify-bugs-and-bisect-regressions.rst; alternatively +perform these tasks through different measures as outlined in more detailed +step-by-step guide below. + +Were you unable to reproduce a bug with a mainline kernel you want to see fixed +in a stable or longterm series? A bug that is not a regression? Then move over +to 'Resolving non-regressions only occurring in stable or longterm kernels'. + +Compile a report with all important details. This always includes the +distribution and kernel version used. Most of the time you also want to describe +relevant aspects of your system and make the kernel's log messages available; do +the same for everything else most likely relevant. In case of a regression, make +that aspect obvious in the title; also specify the last working and first broken +early in the body. + +Submit your report in the appropriate way, which depends on the outcome of the +verification: + +* Are you facing a regression within a stable or longterm kernel series you were + unable to reproduce in a mainline kernel? Then report it by email to the + stable team while CCing the regressions list (e.g. To: Greg Kroah-Hartman + <gregkh@linuxfoundation.org>, Sasha Levin <sashal@kernel.org>; + CC: stable@vger.kernel.org, regressions@lists.linux.dev) and everyone in the + culprit's 'Signed-off-by' chain. + +* In all other cases, submit the report as specified in MAINTAINERS. In case of + a regression you have to report by mail, CC the regressions list + (regressions@lists.linux.dev); when you know the culprit, also CC everyone in + its 'Signed-off-by' chain. In case of a regression you have to file in a bug + tracker, write a short heads-up email with a link to the report to the list + once you have done so -- if the culprit is known, CC everyone that signed the + culprit off, too. + +Answer any questions in a timely manner and help where you can to resolve the +issue. Retest with at least every first release candidate (-rc1) of a new +mainline version and report your findings. + The detailed step-by-step guide on reporting Linux kernel issues ================================================================ -- 2.44.0
Rework the detailed step-by-step guide for various reasons: * Simplify the search with the help of lore.kernel.org/all/, which did not exist when the text was written. * Make use of the recently added document Documentation/admin-guide/verify-bugs-and-bisect-regressions.rst, which covers many steps this text partly covered way better. * The 'quickly report a stable regression to the stable team' approach hardly worked out: most of the time the regression was not known yet. Try a different approach using the regressions list. * Reports about stable/longterm regressions most of the time were greeted with a brief reply along the lines of 'Is mainline affected as well?'; this is needed to determine who is responsible, so we might as well make the reporter check that before sending the report (which verify-bugs-and-bisect-regressions.rst already tells them to do, too). * A lot of fine tuning after seeing what people were struggling with. FIXME: adjust the entries in the reference section to match these changes. Not-signed-off-by: Thorsten Leemhuis <linux@leemhuis.info> --- .../admin-guide/reporting-issues.rst | 391 ++++++++++-------- 1 file changed, 210 insertions(+), 181 deletions(-) diff --git a/Documentation/admin-guide/reporting-issues.rst b/Documentation/admin-guide/reporting-issues.rst index 2fd5a030235ad0..e6083946c146e8 100644 --- a/Documentation/admin-guide/reporting-issues.rst +++ b/Documentation/admin-guide/reporting-issues.rst @@ -48,187 +48,216 @@ Once the report is out, answer any questions that come up and help where you can. That includes keeping the ball rolling by occasionally retesting with newer releases and sending a status update afterwards. -Step-by-step guide how to report issues to the kernel maintainers -================================================================= - -The above TL;DR outlines roughly how to report issues to the Linux kernel -developers. It might be all that's needed for people already familiar with -reporting issues to Free/Libre & Open Source Software (FLOSS) projects. For -everyone else there is this section. It is more detailed and uses a -step-by-step approach. It still tries to be brief for readability and leaves -out a lot of details; those are described below the step-by-step guide in a -reference section, which explains each of the steps in more detail. - -Note: this section covers a few more aspects than the TL;DR and does things in -a slightly different order. That's in your interest, to make sure you notice -early if an issue that looks like a Linux kernel problem is actually caused by -something else. These steps thus help to ensure the time you invest in this -process won't feel wasted in the end: - - * Are you facing an issue with a Linux kernel a hardware or software vendor - provided? Then in almost all cases you are better off to stop reading this - document and reporting the issue to your vendor instead, unless you are - willing to install the latest Linux version yourself. Be aware the latter - will often be needed anyway to hunt down and fix issues. - - * Perform a rough search for existing reports with your favorite internet - search engine; additionally, check the archives of the `Linux Kernel Mailing - List (LKML) <https://lore.kernel.org/lkml/>`_. If you find matching reports, - join the discussion instead of sending a new one. - - * See if the issue you are dealing with qualifies as regression, security - issue, or a really severe problem: those are 'issues of high priority' that - need special handling in some steps that are about to follow. - - * Make sure it's not the kernel's surroundings that are causing the issue - you face. - - * Create a fresh backup and put system repair and restore tools at hand. - - * Ensure your system does not enhance its kernels by building additional - kernel modules on-the-fly, which solutions like DKMS might be doing locally - without your knowledge. - - * Check if your kernel was 'tainted' when the issue occurred, as the event - that made the kernel set this flag might be causing the issue you face. - - * Write down coarsely how to reproduce the issue. If you deal with multiple - issues at once, create separate notes for each of them and make sure they - work independently on a freshly booted system. That's needed, as each issue - needs to get reported to the kernel developers separately, unless they are - strongly entangled. - - * If you are facing a regression within a stable or longterm version line - (say something broke when updating from 5.10.4 to 5.10.5), scroll down to - 'Dealing with regressions within a stable and longterm kernel line'. - - * Locate the driver or kernel subsystem that seems to be causing the issue. - Find out how and where its developers expect reports. Note: most of the - time this won't be bugzilla.kernel.org, as issues typically need to be sent - by mail to a maintainer and a public mailing list. - - * Search the archives of the bug tracker or mailing list in question - thoroughly for reports that might match your issue. If you find anything, - join the discussion instead of sending a new report. - -After these preparations you'll now enter the main part: - - * Unless you are already running the latest 'mainline' Linux kernel, better - go and install it for the reporting process. Testing and reporting with - the latest 'stable' Linux can be an acceptable alternative in some - situations; during the merge window that actually might be even the best - approach, but in that development phase it can be an even better idea to - suspend your efforts for a few days anyway. Whatever version you choose, - ideally use a 'vanilla' build. Ignoring these advices will dramatically - increase the risk your report will be rejected or ignored. - - * Ensure the kernel you just installed does not 'taint' itself when - running. - - * Reproduce the issue with the kernel you just installed. If it doesn't show - up there, scroll down to the instructions for issues only happening with - stable and longterm kernels. - - * Optimize your notes: try to find and write the most straightforward way to - reproduce your issue. Make sure the end result has all the important - details, and at the same time is easy to read and understand for others - that hear about it for the first time. And if you learned something in this - process, consider searching again for existing reports about the issue. - - * If your failure involves a 'panic', 'Oops', 'warning', or 'BUG', consider - decoding the kernel log to find the line of code that triggered the error. - - * If your problem is a regression, try to narrow down when the issue was - introduced as much as possible. - - * Start to compile the report by writing a detailed description about the - issue. Always mention a few things: the latest kernel version you installed - for reproducing, the Linux Distribution used, and your notes on how to - reproduce the issue. Ideally, make the kernel's build configuration - (.config) and the output from ``dmesg`` available somewhere on the net and - link to it. Include or upload all other information that might be relevant, - like the output/screenshot of an Oops or the output from ``lspci``. Once - you wrote this main part, insert a normal length paragraph on top of it - outlining the issue and the impact quickly. On top of this add one sentence - that briefly describes the problem and gets people to read on. Now give the - thing a descriptive title or subject that yet again is shorter. Then you're - ready to send or file the report like the MAINTAINERS file told you, unless - you are dealing with one of those 'issues of high priority': they need - special care which is explained in 'Special handling for high priority - issues' below. - - * Wait for reactions and keep the thing rolling until you can accept the - outcome in one way or the other. Thus react publicly and in a timely manner - to any inquiries. Test proposed fixes. Do proactive testing: retest with at - least every first release candidate (RC) of a new mainline version and - report your results. Send friendly reminders if things stall. And try to - help yourself, if you don't get any help or if it's unsatisfying. - - -Reporting regressions within a stable and longterm kernel line --------------------------------------------------------------- - -This subsection is for you, if you followed above process and got sent here at -the point about regression within a stable or longterm kernel version line. You -face one of those if something breaks when updating from 5.10.4 to 5.10.5 (a -switch from 5.9.15 to 5.10.5 does not qualify). The developers want to fix such -regressions as quickly as possible, hence there is a streamlined process to -report them: - - * Check if the kernel developers still maintain the Linux kernel version - line you care about: go to the `front page of kernel.org - <https://kernel.org/>`_ and make sure it mentions - the latest release of the particular version line without an '[EOL]' tag. - - * Check the archives of the `Linux stable mailing list - <https://lore.kernel.org/stable/>`_ for existing reports. - - * Install the latest release from the particular version line as a vanilla - kernel. Ensure this kernel is not tainted and still shows the problem, as - the issue might have already been fixed there. If you first noticed the - problem with a vendor kernel, check a vanilla build of the last version - known to work performs fine as well. - - * Send a short problem report to the Linux stable mailing list - (stable@vger.kernel.org) and CC the Linux regressions mailing list - (regressions@lists.linux.dev); if you suspect the cause in a particular - subsystem, CC its maintainer and its mailing list. Roughly describe the - issue and ideally explain how to reproduce it. Mention the first version - that shows the problem and the last version that's working fine. Then - wait for further instructions. - -The reference section below explains each of these steps in more detail. - - -Reporting issues only occurring in older kernel version lines -------------------------------------------------------------- - -This subsection is for you, if you tried the latest mainline kernel as outlined -above, but failed to reproduce your issue there; at the same time you want to -see the issue fixed in a still supported stable or longterm series or vendor -kernels regularly rebased on those. If that the case, follow these steps: - - * Prepare yourself for the possibility that going through the next few steps - might not get the issue solved in older releases: the fix might be too big - or risky to get backported there. - - * Perform the first three steps in the section "Dealing with regressions - within a stable and longterm kernel line" above. - - * Search the Linux kernel version control system for the change that fixed - the issue in mainline, as its commit message might tell you if the fix is - scheduled for backporting already. If you don't find anything that way, - search the appropriate mailing lists for posts that discuss such an issue - or peer-review possible fixes; then check the discussions if the fix was - deemed unsuitable for backporting. If backporting was not considered at - all, join the newest discussion, asking if it's in the cards. - - * One of the former steps should lead to a solution. If that doesn't work - out, ask the maintainers for the subsystem that seems to be causing the - issue for advice; CC the mailing list for the particular subsystem as well - as the stable mailing list. - -The reference section below explains each of these steps in more detail. +The detailed step-by-step guide on reporting Linux kernel issues +================================================================ + +The short guide above might be all needed for people already familiar +with reporting issues to Free/Libre & Open Source Software projects. For +everyone else there is this more detailed step-by-step guide. It still tries to +be brief and leaves a lot of details occasionally relevant to a reference +section, which holds additional information for almost all of the steps. + +Note: this step-by-step guide covers more aspects than the short guide above and +does things in a slightly different order; that is done in the reader's interest, +to make sure you notice early on when on the wrong track. + +* Be aware you must have or install a fresh vanilla mainline kernel for + reporting; you furthermore must remove any software that builds or relies on + externally developed kernel modules possibly installed. There is also a decent + chance you will have to build a patched kernel yourself to help resolve the + issue. + + In case that sounds do demanding to you, better report the issue to the vendor + who built your kernel (usually your Linux distributor or hardware manufacturer). + +* Skim the output of ``journalctl -k`` for any indicators of problems that might + lead to your bug. + +* Check if the kernel was already 'tainted' when the issue first occurred: the + event that led to this flag being set might cause your issue, even if it looks + totally unrelated. + +* Consider some glitch in your kernel's environment makes it misbehave -- like + a hardware defect, a mis-configured system firmware, an overclocked component, + a broken initramfs, an inconsistent file system, broken firmware files, + a pre-release compiler, or a malfunctioning/misconfigured Linux distribution. + +* If you deal with multiple issues at once, process them separately from now on. + If there is even a small chance they are related, briefly mention the other + issues in each of the reports later, ideally while linking to the others. + +* Search for fixes and earlier reports referring to an issue like yours. Start + by checking `lore <https://lore.kernel.org/all/>`_. Then perform a general + internet search. Consult :ref:`MAINTAINERS <maintainers>` to determine where + developers of the affected code expect bugs to be submitted to; if in a doubt, + use your best guess to determine the driver or kernel subsystem. If its + developers have a dedicated mailing list not archived on lore, search its + archives; when they are among the few that uses one of + various bug trackers, search it as well. Note, bugzilla.kernel.org + is the right place to file bugs only for a small percentage of the kernel; if + you submit bugs for other code there it most likely will be ignored. + + If you find fixes, try them. If you find matching reports, evaluate whatever + is wiser: joining the discussion or reporting the problem anew. In the latter + case mention and link to the related report you found; after you submit it, + add a note to the related report along the lines of 'I have a problem that + might be the same or related, for details see <link_to_your_report>'. + +* Are you facing a regression? One still occurring with a less than two + (ideally: one) weeks old kernel from the affected series? A kernel that is + vanilla or close to it? Then send a brief (one or two short paragraphs) email + to <regressions@lists.linux.dev> asking if the problem is known already. + Consider proceeding with this guide immediately to confine the problem and + report it properly; definitely do so, if you don't receive any helpful + answer within three days. + +* Evaluate if the issue you are dealing with qualifies as regression, security + issue, or a really severe problem: those need special handling in some of the + following steps. + +* Write down coarsely how to reproduce the issue on a freshly booted system. + +* Verify the bug and potentially bisect any regression as described in + Documentation/admin-guide/verify-bugs-and-bisect-regressions.rst; + alternatively handle the tasks it covers on your own: + + * Verify the bug occurs with an up-to-date kernel. For regressions within a + still supported stable or longterm series this means the latest release from + that series. In all other cases, this means a mainline release, pre-release, or + snapshot ideally less than one week old and two at maximum; the latest release + from the newest stable series might work as well, especially if the series + is based on a mainline version released in the past two weeks. + + * In case of a regression, consider bisecting it. If it is one within a stable + or longterm series, you must verify if current mainline is affected as well. + + * All kernels used for verifying and reporting bugs must be free of externally + developed modules (like Nvidia's graphics drivers, OpenZFS, or VirtualBox's + host drivers). The kernels also should be built from pristine (aka 'vanilla') + Linux sources, but lightly patched might work, too. The kernels furthermore + should not be 'tainted' when the issue occurs. + + Note, don't skip this step or take its demands lightheartedly, as there is a + decent chance your report otherwise will be ignored or welcomed brusquely. + +* If you learned anything new about the bug while following this guide so far, + consider searching once more for earlier reports and fixes. + +* Were you unable to reproduce a bug with a current mainline kernel you want to + see fixed in a stable or longterm series? A bug that is not a regression? Then + move over to ‘Resolving non-regressions only occurring in stable or longterm + kernels’. + +* Optional: if your failure involves a 'panic', 'Oops', 'warning', or 'BUG', + ideally decode the included stack trace. + +* Prepare the report by writing a detailed description of the issue. + + Always mention the Linux distribution and the kernel version used for the + verification; also include your notes on how to reproduce the issue. If your + failure involves a 'panic', 'Oops', 'warning', or 'BUG', include a copy or + photo of it. + + Most of the time you also want to describe relevant aspects of your + environment, like the machine's model name, the relevant hardware components, + or the version of related userspace drivers. Often you want to also save the + output of ``journalctl -k`` to a file you later attach to your report or + upload somewhere and link to. + + If there other aspects about the environment likely are relevant, attach or + upload & link detailed information about is as well, like the output from + commands as ``lsblk``, ``lspci``, ``lsusb.py`` and + ``grep -s '' /sys/class/dmi/id/*``. + + If anything in the attached or linked files is certainly relevant, ensure + to copy that part to the body of the report to make it easily accessible. + Furthermore make sure to not overload the report with many or huge + attachments: developers will ask for additional data when needed. + + Ensure both the subject and the first sentence of the report outlines the core + of the problem and gets people interested enough to read on. + + When finished, review and optimize the report once more to make it as + straightforward as possible and the core of the problem easy to grasp. + +* Submit your report in the appropriate way, which depends on the outcome of the + verification: + + * In case you deal with a security issue, follow the instructions in + Documentation/process/security-bugs.rst. + + * Are you facing a regression within a stable or longterm kernel series you + were unable to reproduce with a fresh mainline kernel? Then report it by + email to the stable team while CCing the regressions lists (To: + Greg Kroah-Hartman <gregkh@linuxfoundation.org>, + Sasha Levin <sashal@kernel.org>; CC: stable@vger.kernel.org, + regressions@lists.linux.dev). + + * In all other cases, submit the report as specified in MAINTAINERS. In case + of a regression you have to report by mail, CC the regressions list + (regressions@lists.linux.dev); when you know the culprit, also CC everyone + in its 'Signed-off-by' chain. In case of a regression you had to file in a + bug tracker, write a short heads-up email with a link to the report to the + list and everyone that signed the patch off, if the culprit is known. + + Did you send the brief inquiry about a regression mentioned earlier? Then in + both of these cases keep it involved: either send your report as a reply to + the earlier inquiry while adding relevant recipients or send a quick note + with a link to the proper report. + +* Wait for reactions and keep the ball rolling until you can accept the outcome + in one way or the other. That among others means: + + * React publicly and in a timely manner to any inquiries. + + * Try to quickly test proposed fixes. + + * Perform proactive testing: retest with at least every first release + candidate (e.g. -rc1) of a new mainline version and report your findings in + a reply to your report. + + * If things stall for more than three or four weeks, check if that happened + due to an inadequate report of yours; if not, send a friendly inquiry. + + * Be aware that nobody is obliged to help you, unless it is a recent + regression, a security issue, or a really severe problem; hence try to help + yourself, if you don't receive any or only unsatisfying help. + +Resolving non-regressions only occurring in stable or longterm kernels +---------------------------------------------------------------------- + +Are you facing an issue in a still supported stable or longterm series you were +unable to reproduce with a fresh mainline kernel? An issue that is also not a +regression and still happens in the series latest release? In that case follow +these steps: + +* Prepare yourself for the possibility that trying to resolve the issue resolved + in the affected stable or longterm series might not work out: the fix might be + too big or risky to include there. + +* Search Linux' mainline Git repository or lore for the change that resolved the + issue; when unsuccessful, consider using a bisection to find it. Then check + the description of the fix for a 'stable tag', e.g, a line like + 'Cc: <stable@vger.kernel.org>': + + * In case there is such a tag the change is already scheduled for backporting. + Usually it will be picked up within two or three weeks after being merged to + mainline. Note, a version number after the tag might limit backporting to a + series that is newer than the one you care for; plans to backport a change + sometimes are also discarded. In such cases search lore or contact the + involved developers for details, but you likely are out of luck. + + * If there was no stable tag, search the mailing list archives if backporting + nevertheless is in the works. If not, search for the review of the fix and + check if backporting to stable and longterm kernels is planned or was + rejected. If it's neither, send a reply asking the developers if backporting + to the series is an option. Note, they might greenlight it, but unwilling to + handle the job themselves -- in that case consider testing and submitting the + fix and everything it depends on as explained in + Documentation/process/stable-kernel-rules.rst. + + In case you have trouble locating the fix or the discussion about it, consider + asking the maintainers and developers of the affected subsystem for advice. Reference section: Reporting issues to the kernel maintainers -- 2.44.0
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: Linux Memory Management List <linux-mm@kvack.org> TO: Suren Baghdasaryan <surenb@google.com> CC: Andrew Morton <akpm@linux-foundation.org> CC: Linux Memory Management List <linux-mm@kvack.org> CC: Kent Overstreet <kent.overstreet@linux.dev> CC: Kees Cook <keescook@chromium.org> tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: 084c8e315db34b59d38d06e684b1a0dd07d30287 commit: c64e38ed88d13557ebeb4cb8def02390a8f3dfc4 [1083/1266] mm/slab: enable slab allocation tagging for kmalloc and friends :::::: branch date: 5 hours ago :::::: commit date: 3 days ago config: m68k-randconfig-r071-20240326 (https://download.01.org/0day-ci/archive/20240326/202403261808.c8ovEmC1-lkp@intel.com/config) compiler: m68k-linux-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403261808.c8ovEmC1-lkp@intel.com/ smatch warnings: drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli' drivers/dma/sun6i-dma.c:848 sun6i_dma_prep_dma_cyclic() error: dereferencing freed memory 'v_lli' vim +/v_lli +777 drivers/dma/sun6i-dma.c 555859308723d8 Maxime Ripard 2014-07-17 699 555859308723d8 Maxime Ripard 2014-07-17 700 static struct dma_async_tx_descriptor *sun6i_dma_prep_slave_sg( 555859308723d8 Maxime Ripard 2014-07-17 701 struct dma_chan *chan, struct scatterlist *sgl, 555859308723d8 Maxime Ripard 2014-07-17 702 unsigned int sg_len, enum dma_transfer_direction dir, 555859308723d8 Maxime Ripard 2014-07-17 703 unsigned long flags, void *context) 555859308723d8 Maxime Ripard 2014-07-17 704 { 555859308723d8 Maxime Ripard 2014-07-17 705 struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device); 555859308723d8 Maxime Ripard 2014-07-17 706 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); 555859308723d8 Maxime Ripard 2014-07-17 707 struct dma_slave_config *sconfig = &vchan->cfg; 555859308723d8 Maxime Ripard 2014-07-17 708 struct sun6i_dma_lli *v_lli, *prev = NULL; 555859308723d8 Maxime Ripard 2014-07-17 709 struct sun6i_desc *txd; 555859308723d8 Maxime Ripard 2014-07-17 710 struct scatterlist *sg; 555859308723d8 Maxime Ripard 2014-07-17 711 dma_addr_t p_lli; 52c871798ff84b Jean-Francois Moine 2016-04-22 712 u32 lli_cfg; 555859308723d8 Maxime Ripard 2014-07-17 713 int i, ret; 555859308723d8 Maxime Ripard 2014-07-17 714 555859308723d8 Maxime Ripard 2014-07-17 715 if (!sgl) 555859308723d8 Maxime Ripard 2014-07-17 716 return NULL; 555859308723d8 Maxime Ripard 2014-07-17 717 52c871798ff84b Jean-Francois Moine 2016-04-22 718 ret = set_config(sdev, sconfig, dir, &lli_cfg); 52c871798ff84b Jean-Francois Moine 2016-04-22 719 if (ret) { 52c871798ff84b Jean-Francois Moine 2016-04-22 720 dev_err(chan2dev(chan), "Invalid DMA configuration\n"); 52c871798ff84b Jean-Francois Moine 2016-04-22 721 return NULL; 52c871798ff84b Jean-Francois Moine 2016-04-22 722 } 52c871798ff84b Jean-Francois Moine 2016-04-22 723 555859308723d8 Maxime Ripard 2014-07-17 724 txd = kzalloc(sizeof(*txd), GFP_NOWAIT); 555859308723d8 Maxime Ripard 2014-07-17 725 if (!txd) 555859308723d8 Maxime Ripard 2014-07-17 726 return NULL; 555859308723d8 Maxime Ripard 2014-07-17 727 555859308723d8 Maxime Ripard 2014-07-17 728 for_each_sg(sgl, sg, sg_len, i) { ec31c5c5949275 Samuel Holland 2022-04-24 729 v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli); 4fbd804e009ae9 Maxime Ripard 2014-07-30 730 if (!v_lli) 4fbd804e009ae9 Maxime Ripard 2014-07-30 731 goto err_lli_free; 555859308723d8 Maxime Ripard 2014-07-17 732 52c871798ff84b Jean-Francois Moine 2016-04-22 733 v_lli->len = sg_dma_len(sg); 52c871798ff84b Jean-Francois Moine 2016-04-22 734 v_lli->para = NORMAL_WAIT; 555859308723d8 Maxime Ripard 2014-07-17 735 52c871798ff84b Jean-Francois Moine 2016-04-22 736 if (dir == DMA_MEM_TO_DEV) { ec31c5c5949275 Samuel Holland 2022-04-24 737 sun6i_dma_set_addr(sdev, v_lli, ec31c5c5949275 Samuel Holland 2022-04-24 738 sg_dma_address(sg), ec31c5c5949275 Samuel Holland 2022-04-24 739 sconfig->dst_addr); 802440bdf3b787 Jernej Skrabec 2019-05-27 740 v_lli->cfg = lli_cfg; 67f34055118cb6 Jernej Skrabec 2019-05-27 741 sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port); 802440bdf3b787 Jernej Skrabec 2019-05-27 742 sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE); 555859308723d8 Maxime Ripard 2014-07-17 743 555859308723d8 Maxime Ripard 2014-07-17 744 dev_dbg(chan2dev(chan), 7f5e03e7367293 Vinod Koul 2014-07-28 745 "%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n", 555859308723d8 Maxime Ripard 2014-07-17 746 __func__, vchan->vc.chan.chan_id, 555859308723d8 Maxime Ripard 2014-07-17 747 &sconfig->dst_addr, &sg_dma_address(sg), 555859308723d8 Maxime Ripard 2014-07-17 748 sg_dma_len(sg), flags); 555859308723d8 Maxime Ripard 2014-07-17 749 555859308723d8 Maxime Ripard 2014-07-17 750 } else { ec31c5c5949275 Samuel Holland 2022-04-24 751 sun6i_dma_set_addr(sdev, v_lli, ec31c5c5949275 Samuel Holland 2022-04-24 752 sconfig->src_addr, ec31c5c5949275 Samuel Holland 2022-04-24 753 sg_dma_address(sg)); 802440bdf3b787 Jernej Skrabec 2019-05-27 754 v_lli->cfg = lli_cfg; 67f34055118cb6 Jernej Skrabec 2019-05-27 755 sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM); 802440bdf3b787 Jernej Skrabec 2019-05-27 756 sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE); 555859308723d8 Maxime Ripard 2014-07-17 757 555859308723d8 Maxime Ripard 2014-07-17 758 dev_dbg(chan2dev(chan), 7f5e03e7367293 Vinod Koul 2014-07-28 759 "%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n", 555859308723d8 Maxime Ripard 2014-07-17 760 __func__, vchan->vc.chan.chan_id, 555859308723d8 Maxime Ripard 2014-07-17 761 &sg_dma_address(sg), &sconfig->src_addr, 555859308723d8 Maxime Ripard 2014-07-17 762 sg_dma_len(sg), flags); 555859308723d8 Maxime Ripard 2014-07-17 763 } 555859308723d8 Maxime Ripard 2014-07-17 764 555859308723d8 Maxime Ripard 2014-07-17 765 prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd); 555859308723d8 Maxime Ripard 2014-07-17 766 } 555859308723d8 Maxime Ripard 2014-07-17 767 555859308723d8 Maxime Ripard 2014-07-17 768 dev_dbg(chan2dev(chan), "First: %pad\n", &txd->p_lli); 9aa48806edb8c3 Samuel Holland 2022-04-24 769 for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli; 9aa48806edb8c3 Samuel Holland 2022-04-24 770 p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next) 9aa48806edb8c3 Samuel Holland 2022-04-24 771 sun6i_dma_dump_lli(vchan, v_lli, p_lli); 555859308723d8 Maxime Ripard 2014-07-17 772 555859308723d8 Maxime Ripard 2014-07-17 773 return vchan_tx_prep(&vchan->vc, &txd->vd, flags); 555859308723d8 Maxime Ripard 2014-07-17 774 4fbd804e009ae9 Maxime Ripard 2014-07-30 775 err_lli_free: 9aa48806edb8c3 Samuel Holland 2022-04-24 776 for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli; 9aa48806edb8c3 Samuel Holland 2022-04-24 @777 p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next) 9aa48806edb8c3 Samuel Holland 2022-04-24 778 dma_pool_free(sdev->pool, v_lli, p_lli); 4fbd804e009ae9 Maxime Ripard 2014-07-30 779 kfree(txd); 555859308723d8 Maxime Ripard 2014-07-17 780 return NULL; 555859308723d8 Maxime Ripard 2014-07-17 781 } 555859308723d8 Maxime Ripard 2014-07-17 782 a90e173f3faf29 Jean-Francois Moine 2016-04-28 783 static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_cyclic( a90e173f3faf29 Jean-Francois Moine 2016-04-28 784 struct dma_chan *chan, a90e173f3faf29 Jean-Francois Moine 2016-04-28 785 dma_addr_t buf_addr, a90e173f3faf29 Jean-Francois Moine 2016-04-28 786 size_t buf_len, a90e173f3faf29 Jean-Francois Moine 2016-04-28 787 size_t period_len, a90e173f3faf29 Jean-Francois Moine 2016-04-28 788 enum dma_transfer_direction dir, a90e173f3faf29 Jean-Francois Moine 2016-04-28 789 unsigned long flags) a90e173f3faf29 Jean-Francois Moine 2016-04-28 790 { a90e173f3faf29 Jean-Francois Moine 2016-04-28 791 struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device); a90e173f3faf29 Jean-Francois Moine 2016-04-28 792 struct sun6i_vchan *vchan = to_sun6i_vchan(chan); a90e173f3faf29 Jean-Francois Moine 2016-04-28 793 struct dma_slave_config *sconfig = &vchan->cfg; a90e173f3faf29 Jean-Francois Moine 2016-04-28 794 struct sun6i_dma_lli *v_lli, *prev = NULL; a90e173f3faf29 Jean-Francois Moine 2016-04-28 795 struct sun6i_desc *txd; a90e173f3faf29 Jean-Francois Moine 2016-04-28 796 dma_addr_t p_lli; a90e173f3faf29 Jean-Francois Moine 2016-04-28 797 u32 lli_cfg; a90e173f3faf29 Jean-Francois Moine 2016-04-28 798 unsigned int i, periods = buf_len / period_len; a90e173f3faf29 Jean-Francois Moine 2016-04-28 799 int ret; a90e173f3faf29 Jean-Francois Moine 2016-04-28 800 a90e173f3faf29 Jean-Francois Moine 2016-04-28 801 ret = set_config(sdev, sconfig, dir, &lli_cfg); a90e173f3faf29 Jean-Francois Moine 2016-04-28 802 if (ret) { a90e173f3faf29 Jean-Francois Moine 2016-04-28 803 dev_err(chan2dev(chan), "Invalid DMA configuration\n"); a90e173f3faf29 Jean-Francois Moine 2016-04-28 804 return NULL; a90e173f3faf29 Jean-Francois Moine 2016-04-28 805 } a90e173f3faf29 Jean-Francois Moine 2016-04-28 806 a90e173f3faf29 Jean-Francois Moine 2016-04-28 807 txd = kzalloc(sizeof(*txd), GFP_NOWAIT); a90e173f3faf29 Jean-Francois Moine 2016-04-28 808 if (!txd) a90e173f3faf29 Jean-Francois Moine 2016-04-28 809 return NULL; a90e173f3faf29 Jean-Francois Moine 2016-04-28 810 a90e173f3faf29 Jean-Francois Moine 2016-04-28 811 for (i = 0; i < periods; i++) { ec31c5c5949275 Samuel Holland 2022-04-24 812 v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli); a90e173f3faf29 Jean-Francois Moine 2016-04-28 813 if (!v_lli) { a90e173f3faf29 Jean-Francois Moine 2016-04-28 814 dev_err(sdev->slave.dev, "Failed to alloc lli memory\n"); a90e173f3faf29 Jean-Francois Moine 2016-04-28 815 goto err_lli_free; a90e173f3faf29 Jean-Francois Moine 2016-04-28 816 } a90e173f3faf29 Jean-Francois Moine 2016-04-28 817 a90e173f3faf29 Jean-Francois Moine 2016-04-28 818 v_lli->len = period_len; a90e173f3faf29 Jean-Francois Moine 2016-04-28 819 v_lli->para = NORMAL_WAIT; a90e173f3faf29 Jean-Francois Moine 2016-04-28 820 a90e173f3faf29 Jean-Francois Moine 2016-04-28 821 if (dir == DMA_MEM_TO_DEV) { ec31c5c5949275 Samuel Holland 2022-04-24 822 sun6i_dma_set_addr(sdev, v_lli, ec31c5c5949275 Samuel Holland 2022-04-24 823 buf_addr + period_len * i, ec31c5c5949275 Samuel Holland 2022-04-24 824 sconfig->dst_addr); 802440bdf3b787 Jernej Skrabec 2019-05-27 825 v_lli->cfg = lli_cfg; 67f34055118cb6 Jernej Skrabec 2019-05-27 826 sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port); 802440bdf3b787 Jernej Skrabec 2019-05-27 827 sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE); a90e173f3faf29 Jean-Francois Moine 2016-04-28 828 } else { ec31c5c5949275 Samuel Holland 2022-04-24 829 sun6i_dma_set_addr(sdev, v_lli, ec31c5c5949275 Samuel Holland 2022-04-24 830 sconfig->src_addr, ec31c5c5949275 Samuel Holland 2022-04-24 831 buf_addr + period_len * i); 802440bdf3b787 Jernej Skrabec 2019-05-27 832 v_lli->cfg = lli_cfg; 67f34055118cb6 Jernej Skrabec 2019-05-27 833 sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM); 802440bdf3b787 Jernej Skrabec 2019-05-27 834 sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE); a90e173f3faf29 Jean-Francois Moine 2016-04-28 835 } a90e173f3faf29 Jean-Francois Moine 2016-04-28 836 a90e173f3faf29 Jean-Francois Moine 2016-04-28 837 prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd); a90e173f3faf29 Jean-Francois Moine 2016-04-28 838 } a90e173f3faf29 Jean-Francois Moine 2016-04-28 839 a90e173f3faf29 Jean-Francois Moine 2016-04-28 840 prev->p_lli_next = txd->p_lli; /* cyclic list */ a90e173f3faf29 Jean-Francois Moine 2016-04-28 841 a90e173f3faf29 Jean-Francois Moine 2016-04-28 842 vchan->cyclic = true; a90e173f3faf29 Jean-Francois Moine 2016-04-28 843 a90e173f3faf29 Jean-Francois Moine 2016-04-28 844 return vchan_tx_prep(&vchan->vc, &txd->vd, flags); a90e173f3faf29 Jean-Francois Moine 2016-04-28 845 a90e173f3faf29 Jean-Francois Moine 2016-04-28 846 err_lli_free: 9aa48806edb8c3 Samuel Holland 2022-04-24 847 for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli; 9aa48806edb8c3 Samuel Holland 2022-04-24 @848 p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next) 9aa48806edb8c3 Samuel Holland 2022-04-24 849 dma_pool_free(sdev->pool, v_lli, p_lli); a90e173f3faf29 Jean-Francois Moine 2016-04-28 850 kfree(txd); a90e173f3faf29 Jean-Francois Moine 2016-04-28 851 return NULL; a90e173f3faf29 Jean-Francois Moine 2016-04-28 852 } a90e173f3faf29 Jean-Francois Moine 2016-04-28 853 :::::: The code at line 777 was first introduced by commit :::::: 9aa48806edb8c37e82532dbc6098b03f6bd4245e dmaengine: sun6i: Do not use virt_to_phys :::::: TO: Samuel Holland <samuel@sholland.org> :::::: CC: Vinod Koul <vkoul@kernel.org> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
在 2024/3/26 下午12:11, Dan Jurgens 写道: >> From: Heng Qi <hengqi@linux.alibaba.com> >> Sent: Monday, March 25, 2024 9:54 PM >> To: Dan Jurgens <danielj@nvidia.com>; netdev@vger.kernel.org >> Cc: mst@redhat.com; jasowang@redhat.com; xuanzhuo@linux.alibaba.com; >> virtualization@lists.linux.dev; davem@davemloft.net; >> edumazet@google.com; kuba@kernel.org; pabeni@redhat.com; Jiri Pirko >> <jiri@nvidia.com> >> Subject: Re: [PATCH net-next 0/4] Remove RTNL lock protection of CVQ >> >> >> >> 在 2024/3/26 上午5:49, Daniel Jurgens 写道: >>> Currently the buffer used for control VQ commands is protected by the >>> RTNL lock. Previously this wasn't a major concern because the control >>> VQ was only used during device setup and user interaction. With the >>> recent addition of dynamic interrupt moderation the control VQ may be >>> used frequently during normal operation. >>> >>> This series removes the RNTL lock dependancy by introducing a spin >>> lock to protect the control buffer and writing SGs to the control VQ. >> Hi Daniel. >> >> It's a nice piece of work, but now that we're talking about ctrlq adding >> interrupts, spin lock has some conflicts with its goals. For example, we expect >> the ethtool command to be blocked. >> Therefore, a mutex lock may be more suitable. >> >> Any how, the final conclusion may require some waiting. > Thanks, Heng > > I took this a step further and made the ctrlq interrupt driven, but an internal reviewer pointed me to this: > https://lore.kernel.org/lkml/20230413064027.13267-1-jasowang@redhat.com/ (sorry if it gets safelinked) > > It seemed there was little appetite to go that route last year, because of set RX mode behavior change, and consumption of an additional IRQ. Hi DanielJ. Jason now supports this and wants to make changes to ctrlq. Yes, our requirements for ctrlq have become higher and we need to make updates as expected. So your patches look good: Reviewed-by: Heng Qi <hengqi@linux.alibaba.com> I will make further modifications on top of these. Regards, Heng > > Either way, I think the spin lock is still needed. In my interrupt driven implantation I was allocating a new control buffer instead of just the data fields. The spin lock was tighter around virtqueue_add_sgs, after the kick it would unlock and wait for a completion that would be triggered from the cvq callback. > > >> Regards, >> Heng >> >>> Daniel Jurgens (4): >>> virtio_net: Store RSS setting in virtnet_info >>> virtio_net: Remove command data from control_buf >>> virtio_net: Add a lock for the command VQ. >>> virtio_net: Remove rtnl lock protection of command buffers >>> >>> drivers/net/virtio_net.c | 185 ++++++++++++++++++++++----------------- >>> 1 file changed, 104 insertions(+), 81 deletions(-) >>>
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: Linux Memory Management List <linux-mm@kvack.org> TO: Cristian Marussi <cristian.marussi@arm.com> CC: Sudeep Holla <sudeep.holla@arm.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: 1fdad13606e104ff103ca19d2d660830cb36d43e commit: 7f620d5b0b1dd7c7972cdf1b40b30552ac7bd325 [614/1266] firmware: arm_scmi: Make raw debugfs entries non-seekable :::::: branch date: 28 hours ago :::::: commit date: 11 days ago config: loongarch-randconfig-r064-20240325 (https://download.01.org/0day-ci/archive/20240326/202403261302.ww11nNYx-lkp@intel.com/config) compiler: loongarch64-linux-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403261302.ww11nNYx-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> drivers/firmware/arm_scmi/raw_mode.c:924:8-24: WARNING: scmi_dbg_raw_mode_reset_fops: .write() has stream semantic; safe to change nonseekable_open -> stream_open. vim +924 drivers/firmware/arm_scmi/raw_mode.c 3c3d818a9317a5 Cristian Marussi 2023-01-18 886 3c3d818a9317a5 Cristian Marussi 2023-01-18 887 static int scmi_dbg_raw_mode_open(struct inode *inode, struct file *filp) 3c3d818a9317a5 Cristian Marussi 2023-01-18 888 { 7860701d1e6e6e Cristian Marussi 2023-01-18 889 u8 id; 3c3d818a9317a5 Cristian Marussi 2023-01-18 890 struct scmi_raw_mode_info *raw; 3c3d818a9317a5 Cristian Marussi 2023-01-18 891 struct scmi_dbg_raw_data *rd; 7860701d1e6e6e Cristian Marussi 2023-01-18 892 const char *id_str = filp->f_path.dentry->d_parent->d_name.name; 3c3d818a9317a5 Cristian Marussi 2023-01-18 893 3c3d818a9317a5 Cristian Marussi 2023-01-18 894 if (!inode->i_private) 3c3d818a9317a5 Cristian Marussi 2023-01-18 895 return -ENODEV; 3c3d818a9317a5 Cristian Marussi 2023-01-18 896 3c3d818a9317a5 Cristian Marussi 2023-01-18 897 raw = inode->i_private; 3c3d818a9317a5 Cristian Marussi 2023-01-18 898 rd = kzalloc(sizeof(*rd), GFP_KERNEL); 3c3d818a9317a5 Cristian Marussi 2023-01-18 899 if (!rd) 3c3d818a9317a5 Cristian Marussi 2023-01-18 900 return -ENOMEM; 3c3d818a9317a5 Cristian Marussi 2023-01-18 901 3c3d818a9317a5 Cristian Marussi 2023-01-18 902 rd->rx.len = raw->desc->max_msg_size + sizeof(u32); 3c3d818a9317a5 Cristian Marussi 2023-01-18 903 rd->rx.buf = kzalloc(rd->rx.len, GFP_KERNEL); 3c3d818a9317a5 Cristian Marussi 2023-01-18 904 if (!rd->rx.buf) { 3c3d818a9317a5 Cristian Marussi 2023-01-18 905 kfree(rd); 3c3d818a9317a5 Cristian Marussi 2023-01-18 906 return -ENOMEM; 3c3d818a9317a5 Cristian Marussi 2023-01-18 907 } 3c3d818a9317a5 Cristian Marussi 2023-01-18 908 3c3d818a9317a5 Cristian Marussi 2023-01-18 909 rd->tx.len = raw->desc->max_msg_size + sizeof(u32); 3c3d818a9317a5 Cristian Marussi 2023-01-18 910 rd->tx.buf = kzalloc(rd->tx.len, GFP_KERNEL); 3c3d818a9317a5 Cristian Marussi 2023-01-18 911 if (!rd->tx.buf) { 3c3d818a9317a5 Cristian Marussi 2023-01-18 912 kfree(rd->rx.buf); 3c3d818a9317a5 Cristian Marussi 2023-01-18 913 kfree(rd); 3c3d818a9317a5 Cristian Marussi 2023-01-18 914 return -ENOMEM; 3c3d818a9317a5 Cristian Marussi 2023-01-18 915 } 3c3d818a9317a5 Cristian Marussi 2023-01-18 916 7860701d1e6e6e Cristian Marussi 2023-01-18 917 /* Grab channel ID from debugfs entry naming if any */ 7860701d1e6e6e Cristian Marussi 2023-01-18 918 if (!kstrtou8(id_str, 16, &id)) 7860701d1e6e6e Cristian Marussi 2023-01-18 919 rd->chan_id = id; 7860701d1e6e6e Cristian Marussi 2023-01-18 920 3c3d818a9317a5 Cristian Marussi 2023-01-18 921 rd->raw = raw; 3c3d818a9317a5 Cristian Marussi 2023-01-18 922 filp->private_data = rd; 3c3d818a9317a5 Cristian Marussi 2023-01-18 923 7f620d5b0b1dd7 Cristian Marussi 2024-03-15 @924 return nonseekable_open(inode, filp); 3c3d818a9317a5 Cristian Marussi 2023-01-18 925 } 3c3d818a9317a5 Cristian Marussi 2023-01-18 926 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
> From: Heng Qi <hengqi@linux.alibaba.com> > Sent: Monday, March 25, 2024 9:54 PM > To: Dan Jurgens <danielj@nvidia.com>; netdev@vger.kernel.org > Cc: mst@redhat.com; jasowang@redhat.com; xuanzhuo@linux.alibaba.com; > virtualization@lists.linux.dev; davem@davemloft.net; > edumazet@google.com; kuba@kernel.org; pabeni@redhat.com; Jiri Pirko > <jiri@nvidia.com> > Subject: Re: [PATCH net-next 0/4] Remove RTNL lock protection of CVQ > > > > 在 2024/3/26 上午5:49, Daniel Jurgens 写道: > > Currently the buffer used for control VQ commands is protected by the > > RTNL lock. Previously this wasn't a major concern because the control > > VQ was only used during device setup and user interaction. With the > > recent addition of dynamic interrupt moderation the control VQ may be > > used frequently during normal operation. > > > > This series removes the RNTL lock dependancy by introducing a spin > > lock to protect the control buffer and writing SGs to the control VQ. > > Hi Daniel. > > It's a nice piece of work, but now that we're talking about ctrlq adding > interrupts, spin lock has some conflicts with its goals. For example, we expect > the ethtool command to be blocked. > Therefore, a mutex lock may be more suitable. > > Any how, the final conclusion may require some waiting. Thanks, Heng I took this a step further and made the ctrlq interrupt driven, but an internal reviewer pointed me to this: https://lore.kernel.org/lkml/20230413064027.13267-1-jasowang@redhat.com/ (sorry if it gets safelinked) It seemed there was little appetite to go that route last year, because of set RX mode behavior change, and consumption of an additional IRQ. Either way, I think the spin lock is still needed. In my interrupt driven implantation I was allocating a new control buffer instead of just the data fields. The spin lock was tighter around virtqueue_add_sgs, after the kick it would unlock and wait for a completion that would be triggered from the cvq callback. > > Regards, > Heng > > > > > Daniel Jurgens (4): > > virtio_net: Store RSS setting in virtnet_info > > virtio_net: Remove command data from control_buf > > virtio_net: Add a lock for the command VQ. > > virtio_net: Remove rtnl lock protection of command buffers > > > > drivers/net/virtio_net.c | 185 ++++++++++++++++++++++----------------- > > 1 file changed, 104 insertions(+), 81 deletions(-) > >
Future changes will need to add a new member to struct vm_unmapped_area_info. This would cause trouble for any call site that doesn't initialize the struct. Currently every caller sets each member manually, so if new ones are added they will be uninitialized and the core code parsing the struct will see garbage in the new member. It could be possible to initialize the new member manually to 0 at each call site. This and a couple other options were discussed. Having some struct vm_unmapped_area_info instances not zero initialized will put those sites at risk of feeding garbage into vm_unmapped_area(), if the convention is to zero initialize the struct and any new field addition missed a call site that initializes each field manually. So it is useful to do things similar across the kernel. The consensus (see links) was that in general the best way to accomplish taking into account both code cleanliness and minimizing the chance of introducing bugs, was to do C99 static initialization. As in: struct vm_unmapped_area_info info = {}; With this method of initialization, the whole struct will be zero initialized, and any statements setting fields to zero will be unneeded. The change should not leave cleanup at the call sides. While iterating though the possible solutions a few archs kindly acked other variations that still zero initialized the struct. These sites have been modified in previous changes using the pattern acked by the respective arch. So to be reduce the chance of bugs via uninitialized fields, perform a tree wide change using the consensus for the best general way to do this change. Use C99 static initializing to zero the struct and remove and statements that simply set members to zero. Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com> Reviewed-by: Kees Cook <keescook@chromium.org> Cc: linux-mm@kvack.org Cc: linux-alpha@vger.kernel.org Cc: linux-snps-arc@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-csky@vger.kernel.org Cc: loongarch@lists.linux.dev Cc: linux-mips@vger.kernel.org Cc: linux-s390@vger.kernel.org Cc: linux-sh@vger.kernel.org Cc: sparclinux@vger.kernel.org Link: https://lore.kernel.org/lkml/202402280912.33AEE7A9CF@keescook/#t Link: https://lore.kernel.org/lkml/j7bfvig3gew3qruouxrh7z7ehjjafrgkbcmg6tcghhfh3rhmzi@wzlcoecgy5rs/ Link: https://lore.kernel.org/lkml/ec3e377a-c0a0-4dd3-9cb9-96517e54d17e@csgroup.eu/ --- v4: - Trivial rebase conflict in s390 Hi archs, For some context, this is part of a larger series to improve shadow stack guard gaps. It involves plumbing a new field via struct vm_unmapped_area_info. The first user is x86, but arm and riscv may likely use it as well. The change is compile tested only for non-x86. Thanks, Rick --- arch/alpha/kernel/osf_sys.c | 5 +---- arch/arc/mm/mmap.c | 4 +--- arch/arm/mm/mmap.c | 5 ++--- arch/loongarch/mm/mmap.c | 3 +-- arch/mips/mm/mmap.c | 3 +-- arch/s390/mm/hugetlbpage.c | 7 ++----- arch/s390/mm/mmap.c | 5 ++--- arch/sh/mm/mmap.c | 5 ++--- arch/sparc/kernel/sys_sparc_32.c | 3 +-- arch/sparc/kernel/sys_sparc_64.c | 5 ++--- arch/sparc/mm/hugetlbpage.c | 7 ++----- arch/x86/kernel/sys_x86_64.c | 7 ++----- arch/x86/mm/hugetlbpage.c | 7 ++----- fs/hugetlbfs/inode.c | 7 ++----- mm/mmap.c | 9 ++------- 15 files changed, 25 insertions(+), 57 deletions(-) diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 5db88b627439..e5f881bc8288 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -1218,14 +1218,11 @@ static unsigned long arch_get_unmapped_area_1(unsigned long addr, unsigned long len, unsigned long limit) { - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = addr; info.high_limit = limit; - info.align_mask = 0; - info.align_offset = 0; return vm_unmapped_area(&info); } diff --git a/arch/arc/mm/mmap.c b/arch/arc/mm/mmap.c index 3c1c7ae73292..69a915297155 100644 --- a/arch/arc/mm/mmap.c +++ b/arch/arc/mm/mmap.c @@ -27,7 +27,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* * We enforce the MAP_FIXED case. @@ -51,11 +51,9 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; - info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; return vm_unmapped_area(&info); } diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index a0f8a0ca0788..d65d0e6ed10a 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c @@ -34,7 +34,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, struct vm_area_struct *vma; int do_align = 0; int aliasing = cache_is_vipt_aliasing(); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* * We only need to do colour alignment if either the I or D @@ -68,7 +68,6 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; @@ -87,7 +86,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, unsigned long addr = addr0; int do_align = 0; int aliasing = cache_is_vipt_aliasing(); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* * We only need to do colour alignment if either the I or D diff --git a/arch/loongarch/mm/mmap.c b/arch/loongarch/mm/mmap.c index a9630a81b38a..4bbd449b4a47 100644 --- a/arch/loongarch/mm/mmap.c +++ b/arch/loongarch/mm/mmap.c @@ -24,7 +24,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, struct vm_area_struct *vma; unsigned long addr = addr0; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (unlikely(len > TASK_SIZE)) return -ENOMEM; @@ -82,7 +82,6 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, */ } - info.flags = 0; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; return vm_unmapped_area(&info); diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c index 00fe90c6db3e..7e11d7b58761 100644 --- a/arch/mips/mm/mmap.c +++ b/arch/mips/mm/mmap.c @@ -34,7 +34,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, struct vm_area_struct *vma; unsigned long addr = addr0; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (unlikely(len > TASK_SIZE)) return -ENOMEM; @@ -92,7 +92,6 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, */ } - info.flags = 0; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; return vm_unmapped_area(&info); diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c index 219d906fe830..46de7a4c0309 100644 --- a/arch/s390/mm/hugetlbpage.c +++ b/arch/s390/mm/hugetlbpage.c @@ -258,14 +258,12 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = current->mm->mmap_base; info.high_limit = TASK_SIZE; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -274,7 +272,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; unsigned long addr; info.flags = VM_UNMAPPED_AREA_TOPDOWN; @@ -282,7 +280,6 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, info.low_limit = PAGE_SIZE; info.high_limit = current->mm->mmap_base; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c index 6b2e4436ad4a..206756946589 100644 --- a/arch/s390/mm/mmap.c +++ b/arch/s390/mm/mmap.c @@ -86,7 +86,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (len > TASK_SIZE - mmap_min_addr) return -ENOMEM; @@ -102,7 +102,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, goto check_asce_limit; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; @@ -122,7 +121,7 @@ unsigned long arch_get_unmapped_area_topdown(struct file *filp, unsigned long ad { struct vm_area_struct *vma; struct mm_struct *mm = current->mm; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* requested length too big for entire address space */ if (len > TASK_SIZE - mmap_min_addr) diff --git a/arch/sh/mm/mmap.c b/arch/sh/mm/mmap.c index b82199878b45..bee329d4149a 100644 --- a/arch/sh/mm/mmap.c +++ b/arch/sh/mm/mmap.c @@ -57,7 +57,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, struct mm_struct *mm = current->mm; struct vm_area_struct *vma; int do_colour_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate @@ -88,7 +88,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = TASK_UNMAPPED_BASE; info.high_limit = TASK_SIZE; @@ -106,7 +105,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, struct mm_struct *mm = current->mm; unsigned long addr = addr0; int do_colour_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c index 082a551897ed..08a19727795c 100644 --- a/arch/sparc/kernel/sys_sparc_32.c +++ b/arch/sparc/kernel/sys_sparc_32.c @@ -41,7 +41,7 @@ SYSCALL_DEFINE0(getpagesize) unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate @@ -59,7 +59,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi if (!addr) addr = TASK_UNMAPPED_BASE; - info.flags = 0; info.length = len; info.low_limit = addr; info.high_limit = TASK_SIZE; diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 1dbf7211666e..d9c3b34ca744 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -93,7 +93,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi struct vm_area_struct * vma; unsigned long task_size = TASK_SIZE; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate @@ -126,7 +126,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi return addr; } - info.flags = 0; info.length = len; info.low_limit = TASK_UNMAPPED_BASE; info.high_limit = min(task_size, VA_EXCLUDE_START); @@ -154,7 +153,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, unsigned long task_size = STACK_TOP32; unsigned long addr = addr0; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* This should only ever run for 32-bit processes. */ BUG_ON(!test_thread_flag(TIF_32BIT)); diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index 38a1bef47efb..4caf56b32e26 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c @@ -31,17 +31,15 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *filp, { struct hstate *h = hstate_file(filp); unsigned long task_size = TASK_SIZE; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (test_thread_flag(TIF_32BIT)) task_size = STACK_TOP32; - info.flags = 0; info.length = len; info.low_limit = TASK_UNMAPPED_BASE; info.high_limit = min(task_size, VA_EXCLUDE_START); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); if ((addr & ~PAGE_MASK) && task_size > VA_EXCLUDE_END) { @@ -63,7 +61,7 @@ hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, struct hstate *h = hstate_file(filp); struct mm_struct *mm = current->mm; unsigned long addr = addr0; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* This should only ever run for 32-bit processes. */ BUG_ON(!test_thread_flag(TIF_32BIT)); @@ -73,7 +71,6 @@ hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, info.low_limit = PAGE_SIZE; info.high_limit = mm->mmap_base; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index cb9fa1d5c66f..96b9d29aead0 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -118,7 +118,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; unsigned long begin, end; if (flags & MAP_FIXED) @@ -137,11 +137,9 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = begin; info.high_limit = end; - info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; if (filp) { info.align_mask = get_align_mask(); @@ -158,7 +156,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, struct vm_area_struct *vma; struct mm_struct *mm = current->mm; unsigned long addr = addr0; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* requested length too big for entire address space */ if (len > TASK_SIZE) @@ -203,7 +201,6 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, if (addr > DEFAULT_MAP_WINDOW && !in_32bit_syscall()) info.high_limit += TASK_SIZE_MAX - DEFAULT_MAP_WINDOW; - info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; if (filp) { info.align_mask = get_align_mask(); diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index 6d77c0039617..fb600949a355 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c @@ -51,9 +51,8 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = get_mmap_base(1); @@ -65,7 +64,6 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, task_size_32bit() : task_size_64bit(addr > DEFAULT_MAP_WINDOW); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -74,7 +72,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; info.flags = VM_UNMAPPED_AREA_TOPDOWN; info.length = len; @@ -89,7 +87,6 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, info.high_limit += TASK_SIZE_MAX - DEFAULT_MAP_WINDOW; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 3dee18bf47ed..2f4e88552d3f 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -176,14 +176,12 @@ hugetlb_get_unmapped_area_bottomup(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = current->mm->mmap_base; info.high_limit = arch_get_mmap_end(addr, len, flags); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -192,14 +190,13 @@ hugetlb_get_unmapped_area_topdown(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; info.flags = VM_UNMAPPED_AREA_TOPDOWN; info.length = len; info.low_limit = PAGE_SIZE; info.high_limit = arch_get_mmap_base(addr, current->mm->mmap_base); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/mm/mmap.c b/mm/mmap.c index f734e4fa6d94..609c087bba8e 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1705,7 +1705,7 @@ generic_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma, *prev; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; const unsigned long mmap_end = arch_get_mmap_end(addr, len, flags); if (len > mmap_end - mmap_min_addr) @@ -1723,12 +1723,9 @@ generic_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = mmap_end; - info.align_mask = 0; - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -1753,7 +1750,7 @@ generic_get_unmapped_area_topdown(struct file *filp, unsigned long addr, { struct vm_area_struct *vma, *prev; struct mm_struct *mm = current->mm; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; const unsigned long mmap_end = arch_get_mmap_end(addr, len, flags); /* requested length too big for entire address space */ @@ -1777,8 +1774,6 @@ generic_get_unmapped_area_topdown(struct file *filp, unsigned long addr, info.length = len; info.low_limit = PAGE_SIZE; info.high_limit = arch_get_mmap_base(addr, mm->mmap_base); - info.align_mask = 0; - info.align_offset = 0; addr = vm_unmapped_area(&info); /* -- 2.34.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Future changes will need to add a new member to struct vm_unmapped_area_info. This would cause trouble for any call site that doesn't initialize the struct. Currently every caller sets each member manually, so if new ones are added they will be uninitialized and the core code parsing the struct will see garbage in the new member. It could be possible to initialize the new member manually to 0 at each call site. This and a couple other options were discussed. Having some struct vm_unmapped_area_info instances not zero initialized will put those sites at risk of feeding garbage into vm_unmapped_area(), if the convention is to zero initialize the struct and any new field addition missed a call site that initializes each field manually. So it is useful to do things similar across the kernel. The consensus (see links) was that in general the best way to accomplish taking into account both code cleanliness and minimizing the chance of introducing bugs, was to do C99 static initialization. As in: struct vm_unmapped_area_info info = {}; With this method of initialization, the whole struct will be zero initialized, and any statements setting fields to zero will be unneeded. The change should not leave cleanup at the call sides. While iterating though the possible solutions a few archs kindly acked other variations that still zero initialized the struct. These sites have been modified in previous changes using the pattern acked by the respective arch. So to be reduce the chance of bugs via uninitialized fields, perform a tree wide change using the consensus for the best general way to do this change. Use C99 static initializing to zero the struct and remove and statements that simply set members to zero. Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com> Reviewed-by: Kees Cook <keescook@chromium.org> Cc: linux-mm@kvack.org Cc: linux-alpha@vger.kernel.org Cc: linux-snps-arc@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-csky@vger.kernel.org Cc: loongarch@lists.linux.dev Cc: linux-mips@vger.kernel.org Cc: linux-s390@vger.kernel.org Cc: linux-sh@vger.kernel.org Cc: sparclinux@vger.kernel.org Link: https://lore.kernel.org/lkml/202402280912.33AEE7A9CF@keescook/#t Link: https://lore.kernel.org/lkml/j7bfvig3gew3qruouxrh7z7ehjjafrgkbcmg6tcghhfh3rhmzi@wzlcoecgy5rs/ Link: https://lore.kernel.org/lkml/ec3e377a-c0a0-4dd3-9cb9-96517e54d17e@csgroup.eu/ --- v4: - Trivial rebase conflict in s390 Hi archs, For some context, this is part of a larger series to improve shadow stack guard gaps. It involves plumbing a new field via struct vm_unmapped_area_info. The first user is x86, but arm and riscv may likely use it as well. The change is compile tested only for non-x86. Thanks, Rick --- arch/alpha/kernel/osf_sys.c | 5 +---- arch/arc/mm/mmap.c | 4 +--- arch/arm/mm/mmap.c | 5 ++--- arch/loongarch/mm/mmap.c | 3 +-- arch/mips/mm/mmap.c | 3 +-- arch/s390/mm/hugetlbpage.c | 7 ++----- arch/s390/mm/mmap.c | 5 ++--- arch/sh/mm/mmap.c | 5 ++--- arch/sparc/kernel/sys_sparc_32.c | 3 +-- arch/sparc/kernel/sys_sparc_64.c | 5 ++--- arch/sparc/mm/hugetlbpage.c | 7 ++----- arch/x86/kernel/sys_x86_64.c | 7 ++----- arch/x86/mm/hugetlbpage.c | 7 ++----- fs/hugetlbfs/inode.c | 7 ++----- mm/mmap.c | 9 ++------- 15 files changed, 25 insertions(+), 57 deletions(-) diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 5db88b627439..e5f881bc8288 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -1218,14 +1218,11 @@ static unsigned long arch_get_unmapped_area_1(unsigned long addr, unsigned long len, unsigned long limit) { - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = addr; info.high_limit = limit; - info.align_mask = 0; - info.align_offset = 0; return vm_unmapped_area(&info); } diff --git a/arch/arc/mm/mmap.c b/arch/arc/mm/mmap.c index 3c1c7ae73292..69a915297155 100644 --- a/arch/arc/mm/mmap.c +++ b/arch/arc/mm/mmap.c @@ -27,7 +27,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* * We enforce the MAP_FIXED case. @@ -51,11 +51,9 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; - info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; return vm_unmapped_area(&info); } diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index a0f8a0ca0788..d65d0e6ed10a 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c @@ -34,7 +34,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, struct vm_area_struct *vma; int do_align = 0; int aliasing = cache_is_vipt_aliasing(); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* * We only need to do colour alignment if either the I or D @@ -68,7 +68,6 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; @@ -87,7 +86,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, unsigned long addr = addr0; int do_align = 0; int aliasing = cache_is_vipt_aliasing(); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* * We only need to do colour alignment if either the I or D diff --git a/arch/loongarch/mm/mmap.c b/arch/loongarch/mm/mmap.c index a9630a81b38a..4bbd449b4a47 100644 --- a/arch/loongarch/mm/mmap.c +++ b/arch/loongarch/mm/mmap.c @@ -24,7 +24,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, struct vm_area_struct *vma; unsigned long addr = addr0; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (unlikely(len > TASK_SIZE)) return -ENOMEM; @@ -82,7 +82,6 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, */ } - info.flags = 0; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; return vm_unmapped_area(&info); diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c index 00fe90c6db3e..7e11d7b58761 100644 --- a/arch/mips/mm/mmap.c +++ b/arch/mips/mm/mmap.c @@ -34,7 +34,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, struct vm_area_struct *vma; unsigned long addr = addr0; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (unlikely(len > TASK_SIZE)) return -ENOMEM; @@ -92,7 +92,6 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, */ } - info.flags = 0; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; return vm_unmapped_area(&info); diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c index 219d906fe830..46de7a4c0309 100644 --- a/arch/s390/mm/hugetlbpage.c +++ b/arch/s390/mm/hugetlbpage.c @@ -258,14 +258,12 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = current->mm->mmap_base; info.high_limit = TASK_SIZE; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -274,7 +272,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; unsigned long addr; info.flags = VM_UNMAPPED_AREA_TOPDOWN; @@ -282,7 +280,6 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, info.low_limit = PAGE_SIZE; info.high_limit = current->mm->mmap_base; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c index 6b2e4436ad4a..206756946589 100644 --- a/arch/s390/mm/mmap.c +++ b/arch/s390/mm/mmap.c @@ -86,7 +86,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (len > TASK_SIZE - mmap_min_addr) return -ENOMEM; @@ -102,7 +102,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, goto check_asce_limit; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; @@ -122,7 +121,7 @@ unsigned long arch_get_unmapped_area_topdown(struct file *filp, unsigned long ad { struct vm_area_struct *vma; struct mm_struct *mm = current->mm; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* requested length too big for entire address space */ if (len > TASK_SIZE - mmap_min_addr) diff --git a/arch/sh/mm/mmap.c b/arch/sh/mm/mmap.c index b82199878b45..bee329d4149a 100644 --- a/arch/sh/mm/mmap.c +++ b/arch/sh/mm/mmap.c @@ -57,7 +57,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, struct mm_struct *mm = current->mm; struct vm_area_struct *vma; int do_colour_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate @@ -88,7 +88,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = TASK_UNMAPPED_BASE; info.high_limit = TASK_SIZE; @@ -106,7 +105,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, struct mm_struct *mm = current->mm; unsigned long addr = addr0; int do_colour_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c index 082a551897ed..08a19727795c 100644 --- a/arch/sparc/kernel/sys_sparc_32.c +++ b/arch/sparc/kernel/sys_sparc_32.c @@ -41,7 +41,7 @@ SYSCALL_DEFINE0(getpagesize) unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate @@ -59,7 +59,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi if (!addr) addr = TASK_UNMAPPED_BASE; - info.flags = 0; info.length = len; info.low_limit = addr; info.high_limit = TASK_SIZE; diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 1dbf7211666e..d9c3b34ca744 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -93,7 +93,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi struct vm_area_struct * vma; unsigned long task_size = TASK_SIZE; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate @@ -126,7 +126,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi return addr; } - info.flags = 0; info.length = len; info.low_limit = TASK_UNMAPPED_BASE; info.high_limit = min(task_size, VA_EXCLUDE_START); @@ -154,7 +153,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, unsigned long task_size = STACK_TOP32; unsigned long addr = addr0; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* This should only ever run for 32-bit processes. */ BUG_ON(!test_thread_flag(TIF_32BIT)); diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index 38a1bef47efb..4caf56b32e26 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c @@ -31,17 +31,15 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *filp, { struct hstate *h = hstate_file(filp); unsigned long task_size = TASK_SIZE; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (test_thread_flag(TIF_32BIT)) task_size = STACK_TOP32; - info.flags = 0; info.length = len; info.low_limit = TASK_UNMAPPED_BASE; info.high_limit = min(task_size, VA_EXCLUDE_START); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); if ((addr & ~PAGE_MASK) && task_size > VA_EXCLUDE_END) { @@ -63,7 +61,7 @@ hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, struct hstate *h = hstate_file(filp); struct mm_struct *mm = current->mm; unsigned long addr = addr0; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* This should only ever run for 32-bit processes. */ BUG_ON(!test_thread_flag(TIF_32BIT)); @@ -73,7 +71,6 @@ hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, info.low_limit = PAGE_SIZE; info.high_limit = mm->mmap_base; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index cb9fa1d5c66f..96b9d29aead0 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -118,7 +118,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; unsigned long begin, end; if (flags & MAP_FIXED) @@ -137,11 +137,9 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = begin; info.high_limit = end; - info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; if (filp) { info.align_mask = get_align_mask(); @@ -158,7 +156,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, struct vm_area_struct *vma; struct mm_struct *mm = current->mm; unsigned long addr = addr0; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* requested length too big for entire address space */ if (len > TASK_SIZE) @@ -203,7 +201,6 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, if (addr > DEFAULT_MAP_WINDOW && !in_32bit_syscall()) info.high_limit += TASK_SIZE_MAX - DEFAULT_MAP_WINDOW; - info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; if (filp) { info.align_mask = get_align_mask(); diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index 6d77c0039617..fb600949a355 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c @@ -51,9 +51,8 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = get_mmap_base(1); @@ -65,7 +64,6 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, task_size_32bit() : task_size_64bit(addr > DEFAULT_MAP_WINDOW); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -74,7 +72,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; info.flags = VM_UNMAPPED_AREA_TOPDOWN; info.length = len; @@ -89,7 +87,6 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, info.high_limit += TASK_SIZE_MAX - DEFAULT_MAP_WINDOW; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 3dee18bf47ed..2f4e88552d3f 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -176,14 +176,12 @@ hugetlb_get_unmapped_area_bottomup(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = current->mm->mmap_base; info.high_limit = arch_get_mmap_end(addr, len, flags); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -192,14 +190,13 @@ hugetlb_get_unmapped_area_topdown(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; info.flags = VM_UNMAPPED_AREA_TOPDOWN; info.length = len; info.low_limit = PAGE_SIZE; info.high_limit = arch_get_mmap_base(addr, current->mm->mmap_base); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/mm/mmap.c b/mm/mmap.c index f734e4fa6d94..609c087bba8e 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1705,7 +1705,7 @@ generic_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma, *prev; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; const unsigned long mmap_end = arch_get_mmap_end(addr, len, flags); if (len > mmap_end - mmap_min_addr) @@ -1723,12 +1723,9 @@ generic_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = mmap_end; - info.align_mask = 0; - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -1753,7 +1750,7 @@ generic_get_unmapped_area_topdown(struct file *filp, unsigned long addr, { struct vm_area_struct *vma, *prev; struct mm_struct *mm = current->mm; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; const unsigned long mmap_end = arch_get_mmap_end(addr, len, flags); /* requested length too big for entire address space */ @@ -1777,8 +1774,6 @@ generic_get_unmapped_area_topdown(struct file *filp, unsigned long addr, info.length = len; info.low_limit = PAGE_SIZE; info.high_limit = arch_get_mmap_base(addr, mm->mmap_base); - info.align_mask = 0; - info.align_offset = 0; addr = vm_unmapped_area(&info); /* -- 2.34.1 _______________________________________________ linux-snps-arc mailing list linux-snps-arc@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-snps-arc
Future changes will need to add a new member to struct vm_unmapped_area_info. This would cause trouble for any call site that doesn't initialize the struct. Currently every caller sets each member manually, so if new ones are added they will be uninitialized and the core code parsing the struct will see garbage in the new member. It could be possible to initialize the new member manually to 0 at each call site. This and a couple other options were discussed. Having some struct vm_unmapped_area_info instances not zero initialized will put those sites at risk of feeding garbage into vm_unmapped_area(), if the convention is to zero initialize the struct and any new field addition missed a call site that initializes each field manually. So it is useful to do things similar across the kernel. The consensus (see links) was that in general the best way to accomplish taking into account both code cleanliness and minimizing the chance of introducing bugs, was to do C99 static initialization. As in: struct vm_unmapped_area_info info = {}; With this method of initialization, the whole struct will be zero initialized, and any statements setting fields to zero will be unneeded. The change should not leave cleanup at the call sides. While iterating though the possible solutions a few archs kindly acked other variations that still zero initialized the struct. These sites have been modified in previous changes using the pattern acked by the respective arch. So to be reduce the chance of bugs via uninitialized fields, perform a tree wide change using the consensus for the best general way to do this change. Use C99 static initializing to zero the struct and remove and statements that simply set members to zero. Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com> Reviewed-by: Kees Cook <keescook@chromium.org> Cc: linux-mm@kvack.org Cc: linux-alpha@vger.kernel.org Cc: linux-snps-arc@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-csky@vger.kernel.org Cc: loongarch@lists.linux.dev Cc: linux-mips@vger.kernel.org Cc: linux-s390@vger.kernel.org Cc: linux-sh@vger.kernel.org Cc: sparclinux@vger.kernel.org Link: https://lore.kernel.org/lkml/202402280912.33AEE7A9CF@keescook/#t Link: https://lore.kernel.org/lkml/j7bfvig3gew3qruouxrh7z7ehjjafrgkbcmg6tcghhfh3rhmzi@wzlcoecgy5rs/ Link: https://lore.kernel.org/lkml/ec3e377a-c0a0-4dd3-9cb9-96517e54d17e@csgroup.eu/ --- v4: - Trivial rebase conflict in s390 Hi archs, For some context, this is part of a larger series to improve shadow stack guard gaps. It involves plumbing a new field via struct vm_unmapped_area_info. The first user is x86, but arm and riscv may likely use it as well. The change is compile tested only for non-x86. Thanks, Rick --- arch/alpha/kernel/osf_sys.c | 5 +---- arch/arc/mm/mmap.c | 4 +--- arch/arm/mm/mmap.c | 5 ++--- arch/loongarch/mm/mmap.c | 3 +-- arch/mips/mm/mmap.c | 3 +-- arch/s390/mm/hugetlbpage.c | 7 ++----- arch/s390/mm/mmap.c | 5 ++--- arch/sh/mm/mmap.c | 5 ++--- arch/sparc/kernel/sys_sparc_32.c | 3 +-- arch/sparc/kernel/sys_sparc_64.c | 5 ++--- arch/sparc/mm/hugetlbpage.c | 7 ++----- arch/x86/kernel/sys_x86_64.c | 7 ++----- arch/x86/mm/hugetlbpage.c | 7 ++----- fs/hugetlbfs/inode.c | 7 ++----- mm/mmap.c | 9 ++------- 15 files changed, 25 insertions(+), 57 deletions(-) diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 5db88b627439..e5f881bc8288 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -1218,14 +1218,11 @@ static unsigned long arch_get_unmapped_area_1(unsigned long addr, unsigned long len, unsigned long limit) { - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = addr; info.high_limit = limit; - info.align_mask = 0; - info.align_offset = 0; return vm_unmapped_area(&info); } diff --git a/arch/arc/mm/mmap.c b/arch/arc/mm/mmap.c index 3c1c7ae73292..69a915297155 100644 --- a/arch/arc/mm/mmap.c +++ b/arch/arc/mm/mmap.c @@ -27,7 +27,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* * We enforce the MAP_FIXED case. @@ -51,11 +51,9 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; - info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; return vm_unmapped_area(&info); } diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index a0f8a0ca0788..d65d0e6ed10a 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c @@ -34,7 +34,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, struct vm_area_struct *vma; int do_align = 0; int aliasing = cache_is_vipt_aliasing(); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* * We only need to do colour alignment if either the I or D @@ -68,7 +68,6 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; @@ -87,7 +86,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, unsigned long addr = addr0; int do_align = 0; int aliasing = cache_is_vipt_aliasing(); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* * We only need to do colour alignment if either the I or D diff --git a/arch/loongarch/mm/mmap.c b/arch/loongarch/mm/mmap.c index a9630a81b38a..4bbd449b4a47 100644 --- a/arch/loongarch/mm/mmap.c +++ b/arch/loongarch/mm/mmap.c @@ -24,7 +24,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, struct vm_area_struct *vma; unsigned long addr = addr0; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (unlikely(len > TASK_SIZE)) return -ENOMEM; @@ -82,7 +82,6 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, */ } - info.flags = 0; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; return vm_unmapped_area(&info); diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c index 00fe90c6db3e..7e11d7b58761 100644 --- a/arch/mips/mm/mmap.c +++ b/arch/mips/mm/mmap.c @@ -34,7 +34,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, struct vm_area_struct *vma; unsigned long addr = addr0; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (unlikely(len > TASK_SIZE)) return -ENOMEM; @@ -92,7 +92,6 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, */ } - info.flags = 0; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; return vm_unmapped_area(&info); diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c index 219d906fe830..46de7a4c0309 100644 --- a/arch/s390/mm/hugetlbpage.c +++ b/arch/s390/mm/hugetlbpage.c @@ -258,14 +258,12 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = current->mm->mmap_base; info.high_limit = TASK_SIZE; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -274,7 +272,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; unsigned long addr; info.flags = VM_UNMAPPED_AREA_TOPDOWN; @@ -282,7 +280,6 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, info.low_limit = PAGE_SIZE; info.high_limit = current->mm->mmap_base; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c index 6b2e4436ad4a..206756946589 100644 --- a/arch/s390/mm/mmap.c +++ b/arch/s390/mm/mmap.c @@ -86,7 +86,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (len > TASK_SIZE - mmap_min_addr) return -ENOMEM; @@ -102,7 +102,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, goto check_asce_limit; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = TASK_SIZE; @@ -122,7 +121,7 @@ unsigned long arch_get_unmapped_area_topdown(struct file *filp, unsigned long ad { struct vm_area_struct *vma; struct mm_struct *mm = current->mm; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* requested length too big for entire address space */ if (len > TASK_SIZE - mmap_min_addr) diff --git a/arch/sh/mm/mmap.c b/arch/sh/mm/mmap.c index b82199878b45..bee329d4149a 100644 --- a/arch/sh/mm/mmap.c +++ b/arch/sh/mm/mmap.c @@ -57,7 +57,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, struct mm_struct *mm = current->mm; struct vm_area_struct *vma; int do_colour_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate @@ -88,7 +88,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = TASK_UNMAPPED_BASE; info.high_limit = TASK_SIZE; @@ -106,7 +105,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, struct mm_struct *mm = current->mm; unsigned long addr = addr0; int do_colour_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c index 082a551897ed..08a19727795c 100644 --- a/arch/sparc/kernel/sys_sparc_32.c +++ b/arch/sparc/kernel/sys_sparc_32.c @@ -41,7 +41,7 @@ SYSCALL_DEFINE0(getpagesize) unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate @@ -59,7 +59,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi if (!addr) addr = TASK_UNMAPPED_BASE; - info.flags = 0; info.length = len; info.low_limit = addr; info.high_limit = TASK_SIZE; diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 1dbf7211666e..d9c3b34ca744 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -93,7 +93,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi struct vm_area_struct * vma; unsigned long task_size = TASK_SIZE; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (flags & MAP_FIXED) { /* We do not accept a shared mapping if it would violate @@ -126,7 +126,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi return addr; } - info.flags = 0; info.length = len; info.low_limit = TASK_UNMAPPED_BASE; info.high_limit = min(task_size, VA_EXCLUDE_START); @@ -154,7 +153,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, unsigned long task_size = STACK_TOP32; unsigned long addr = addr0; int do_color_align; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* This should only ever run for 32-bit processes. */ BUG_ON(!test_thread_flag(TIF_32BIT)); diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index 38a1bef47efb..4caf56b32e26 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c @@ -31,17 +31,15 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *filp, { struct hstate *h = hstate_file(filp); unsigned long task_size = TASK_SIZE; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; if (test_thread_flag(TIF_32BIT)) task_size = STACK_TOP32; - info.flags = 0; info.length = len; info.low_limit = TASK_UNMAPPED_BASE; info.high_limit = min(task_size, VA_EXCLUDE_START); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); if ((addr & ~PAGE_MASK) && task_size > VA_EXCLUDE_END) { @@ -63,7 +61,7 @@ hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, struct hstate *h = hstate_file(filp); struct mm_struct *mm = current->mm; unsigned long addr = addr0; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* This should only ever run for 32-bit processes. */ BUG_ON(!test_thread_flag(TIF_32BIT)); @@ -73,7 +71,6 @@ hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, info.low_limit = PAGE_SIZE; info.high_limit = mm->mmap_base; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index cb9fa1d5c66f..96b9d29aead0 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -118,7 +118,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; unsigned long begin, end; if (flags & MAP_FIXED) @@ -137,11 +137,9 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = begin; info.high_limit = end; - info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; if (filp) { info.align_mask = get_align_mask(); @@ -158,7 +156,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, struct vm_area_struct *vma; struct mm_struct *mm = current->mm; unsigned long addr = addr0; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; /* requested length too big for entire address space */ if (len > TASK_SIZE) @@ -203,7 +201,6 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, if (addr > DEFAULT_MAP_WINDOW && !in_32bit_syscall()) info.high_limit += TASK_SIZE_MAX - DEFAULT_MAP_WINDOW; - info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; if (filp) { info.align_mask = get_align_mask(); diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index 6d77c0039617..fb600949a355 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c @@ -51,9 +51,8 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = get_mmap_base(1); @@ -65,7 +64,6 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, task_size_32bit() : task_size_64bit(addr > DEFAULT_MAP_WINDOW); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -74,7 +72,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; info.flags = VM_UNMAPPED_AREA_TOPDOWN; info.length = len; @@ -89,7 +87,6 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, info.high_limit += TASK_SIZE_MAX - DEFAULT_MAP_WINDOW; info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 3dee18bf47ed..2f4e88552d3f 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -176,14 +176,12 @@ hugetlb_get_unmapped_area_bottomup(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; - info.flags = 0; info.length = len; info.low_limit = current->mm->mmap_base; info.high_limit = arch_get_mmap_end(addr, len, flags); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -192,14 +190,13 @@ hugetlb_get_unmapped_area_topdown(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { struct hstate *h = hstate_file(file); - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; info.flags = VM_UNMAPPED_AREA_TOPDOWN; info.length = len; info.low_limit = PAGE_SIZE; info.high_limit = arch_get_mmap_base(addr, current->mm->mmap_base); info.align_mask = PAGE_MASK & ~huge_page_mask(h); - info.align_offset = 0; addr = vm_unmapped_area(&info); /* diff --git a/mm/mmap.c b/mm/mmap.c index f734e4fa6d94..609c087bba8e 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1705,7 +1705,7 @@ generic_get_unmapped_area(struct file *filp, unsigned long addr, { struct mm_struct *mm = current->mm; struct vm_area_struct *vma, *prev; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; const unsigned long mmap_end = arch_get_mmap_end(addr, len, flags); if (len > mmap_end - mmap_min_addr) @@ -1723,12 +1723,9 @@ generic_get_unmapped_area(struct file *filp, unsigned long addr, return addr; } - info.flags = 0; info.length = len; info.low_limit = mm->mmap_base; info.high_limit = mmap_end; - info.align_mask = 0; - info.align_offset = 0; return vm_unmapped_area(&info); } @@ -1753,7 +1750,7 @@ generic_get_unmapped_area_topdown(struct file *filp, unsigned long addr, { struct vm_area_struct *vma, *prev; struct mm_struct *mm = current->mm; - struct vm_unmapped_area_info info; + struct vm_unmapped_area_info info = {}; const unsigned long mmap_end = arch_get_mmap_end(addr, len, flags); /* requested length too big for entire address space */ @@ -1777,8 +1774,6 @@ generic_get_unmapped_area_topdown(struct file *filp, unsigned long addr, info.length = len; info.low_limit = PAGE_SIZE; info.high_limit = arch_get_mmap_base(addr, mm->mmap_base); - info.align_mask = 0; - info.align_offset = 0; addr = vm_unmapped_area(&info); /* -- 2.34.1
The mm_struct contains a function pointer *get_unmapped_area(), which is set to either arch_get_unmapped_area() or arch_get_unmapped_area_topdown() during the initialization of the mm. Since the function pointer only ever points to two functions that are named the same across all arch's, a function pointer is not really required. In addition future changes will want to add versions of the functions that take additional arguments. So to save a pointers worth of bytes in mm_struct, and prevent adding additional function pointers to mm_struct in future changes, remove it and keep the information about which get_unmapped_area() to use in a flag. Add the new flag to MMF_INIT_MASK so it doesn't get clobbered on fork by mmf_init_flags(). Most MM flags get clobbered on fork. In the pre-existing behavior mm->get_unmapped_area() would get copied to the new mm in dup_mm(), so not clobbering the flag preserves the existing behavior around inheriting the topdown-ness. Introduce a helper, mm_get_unmapped_area(), to easily convert code that refers to the old function pointer to instead select and call either arch_get_unmapped_area() or arch_get_unmapped_area_topdown() based on the flag. Then drop the mm->get_unmapped_area() function pointer. Leave the get_unmapped_area() pointer in struct file_operations alone. The main purpose of this change is to reorganize in preparation for future changes, but it also converts the calls of mm->get_unmapped_area() from indirect branches into a direct ones. The stress-ng bigheap benchmark calls realloc a lot, which calls through get_unmapped_area() in the kernel. On x86, the change yielded a ~1% improvement there on a retpoline config. In testing a few x86 configs, removing the pointer unfortunately didn't result in any actual size reductions in the compiled layout of mm_struct. But depending on compiler or arch alignment requirements, the change could shrink the size of mm_struct. Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com> Acked-by: Dave Hansen <dave.hansen@linux.intel.com> Acked-by: Liam R. Howlett <Liam.Howlett@oracle.com> Reviewed-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: linux-s390@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: sparclinux@vger.kernel.org Cc: linux-sgx@vger.kernel.org Cc: nvdimm@lists.linux.dev Cc: linux-cxl@vger.kernel.org Cc: linux-mm@kvack.org Cc: linux-fsdevel@vger.kernel.org Cc: io-uring@vger.kernel.org Cc: bpf@vger.kernel.org --- v4: - Split out pde_get_unmapped_area() refactor into separate patch (Christophe Leroy) v3: - Fix comment that still referred to mm->get_unmapped_area() - Resolve trivial rebase conflicts with "mm: thp_get_unmapped_area must honour topdown preference" - Spelling fix in log v2: - Fix comment on MMF_TOPDOWN (Kirill, rppt) - Move MMF_TOPDOWN to actually unused bit - Add MMF_TOPDOWN to MMF_INIT_MASK so it doesn't get clobbered on fork, and result in the children using the search up path. - New lower performance results after above bug fix - Add Reviews and Acks --- arch/s390/mm/hugetlbpage.c | 2 +- arch/s390/mm/mmap.c | 4 ++-- arch/sparc/kernel/sys_sparc_64.c | 15 ++++++--------- arch/sparc/mm/hugetlbpage.c | 2 +- arch/x86/kernel/cpu/sgx/driver.c | 2 +- arch/x86/mm/hugetlbpage.c | 2 +- arch/x86/mm/mmap.c | 4 ++-- drivers/char/mem.c | 2 +- drivers/dax/device.c | 6 +++--- fs/hugetlbfs/inode.c | 4 ++-- fs/proc/inode.c | 3 ++- fs/ramfs/file-mmu.c | 2 +- include/linux/mm_types.h | 6 +----- include/linux/sched/coredump.h | 5 ++++- include/linux/sched/mm.h | 5 +++++ io_uring/io_uring.c | 2 +- kernel/bpf/arena.c | 2 +- kernel/bpf/syscall.c | 2 +- mm/debug.c | 6 ------ mm/huge_memory.c | 9 ++++----- mm/mmap.c | 21 ++++++++++++++++++--- mm/shmem.c | 11 +++++------ mm/util.c | 6 +++--- 23 files changed, 66 insertions(+), 57 deletions(-) diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c index c2e8242bd15d..219d906fe830 100644 --- a/arch/s390/mm/hugetlbpage.c +++ b/arch/s390/mm/hugetlbpage.c @@ -328,7 +328,7 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, goto check_asce_limit; } - if (mm->get_unmapped_area == arch_get_unmapped_area) + if (!test_bit(MMF_TOPDOWN, &mm->flags)) addr = hugetlb_get_unmapped_area_bottomup(file, addr, len, pgoff, flags); else diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c index b14fc0887654..6b2e4436ad4a 100644 --- a/arch/s390/mm/mmap.c +++ b/arch/s390/mm/mmap.c @@ -185,10 +185,10 @@ void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) */ if (mmap_is_legacy(rlim_stack)) { mm->mmap_base = mmap_base_legacy(random_factor); - mm->get_unmapped_area = arch_get_unmapped_area; + clear_bit(MMF_TOPDOWN, &mm->flags); } else { mm->mmap_base = mmap_base(random_factor, rlim_stack); - mm->get_unmapped_area = arch_get_unmapped_area_topdown; + set_bit(MMF_TOPDOWN, &mm->flags); } } diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 1e9a9e016237..1dbf7211666e 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -218,14 +218,10 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, unsigned long len, unsigned long pgoff, unsigned long flags) { unsigned long align_goal, addr = -ENOMEM; - unsigned long (*get_area)(struct file *, unsigned long, - unsigned long, unsigned long, unsigned long); - - get_area = current->mm->get_unmapped_area; if (flags & MAP_FIXED) { /* Ok, don't mess with it. */ - return get_area(NULL, orig_addr, len, pgoff, flags); + return mm_get_unmapped_area(current->mm, NULL, orig_addr, len, pgoff, flags); } flags &= ~MAP_SHARED; @@ -238,7 +234,8 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u align_goal = (64UL * 1024); do { - addr = get_area(NULL, orig_addr, len + (align_goal - PAGE_SIZE), pgoff, flags); + addr = mm_get_unmapped_area(current->mm, NULL, orig_addr, + len + (align_goal - PAGE_SIZE), pgoff, flags); if (!(addr & ~PAGE_MASK)) { addr = (addr + (align_goal - 1UL)) & ~(align_goal - 1UL); break; @@ -256,7 +253,7 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u * be obtained. */ if (addr & ~PAGE_MASK) - addr = get_area(NULL, orig_addr, len, pgoff, flags); + addr = mm_get_unmapped_area(current->mm, NULL, orig_addr, len, pgoff, flags); return addr; } @@ -292,7 +289,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) gap == RLIM_INFINITY || sysctl_legacy_va_layout) { mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; - mm->get_unmapped_area = arch_get_unmapped_area; + clear_bit(MMF_TOPDOWN, &mm->flags); } else { /* We know it's 32-bit */ unsigned long task_size = STACK_TOP32; @@ -303,7 +300,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) gap = (task_size / 6 * 5); mm->mmap_base = PAGE_ALIGN(task_size - gap - random_factor); - mm->get_unmapped_area = arch_get_unmapped_area_topdown; + set_bit(MMF_TOPDOWN, &mm->flags); } } diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index b432500c13a5..38a1bef47efb 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c @@ -123,7 +123,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, (!vma || addr + len <= vm_start_gap(vma))) return addr; } - if (mm->get_unmapped_area == arch_get_unmapped_area) + if (!test_bit(MMF_TOPDOWN, &mm->flags)) return hugetlb_get_unmapped_area_bottomup(file, addr, len, pgoff, flags); else diff --git a/arch/x86/kernel/cpu/sgx/driver.c b/arch/x86/kernel/cpu/sgx/driver.c index 262f5fb18d74..22b65a5f5ec6 100644 --- a/arch/x86/kernel/cpu/sgx/driver.c +++ b/arch/x86/kernel/cpu/sgx/driver.c @@ -113,7 +113,7 @@ static unsigned long sgx_get_unmapped_area(struct file *file, if (flags & MAP_FIXED) return addr; - return current->mm->get_unmapped_area(file, addr, len, pgoff, flags); + return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags); } #ifdef CONFIG_COMPAT diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index 5804bbae4f01..6d77c0039617 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c @@ -141,7 +141,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, } get_unmapped_area: - if (mm->get_unmapped_area == arch_get_unmapped_area) + if (!test_bit(MMF_TOPDOWN, &mm->flags)) return hugetlb_get_unmapped_area_bottomup(file, addr, len, pgoff, flags); else diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c index c90c20904a60..a2cabb1c81e1 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c @@ -129,9 +129,9 @@ static void arch_pick_mmap_base(unsigned long *base, unsigned long *legacy_base, void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) { if (mmap_is_legacy()) - mm->get_unmapped_area = arch_get_unmapped_area; + clear_bit(MMF_TOPDOWN, &mm->flags); else - mm->get_unmapped_area = arch_get_unmapped_area_topdown; + set_bit(MMF_TOPDOWN, &mm->flags); arch_pick_mmap_base(&mm->mmap_base, &mm->mmap_legacy_base, arch_rnd(mmap64_rnd_bits), task_size_64bit(0), diff --git a/drivers/char/mem.c b/drivers/char/mem.c index 3c6670cf905f..9b80e622ae80 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c @@ -544,7 +544,7 @@ static unsigned long get_unmapped_area_zero(struct file *file, } /* Otherwise flags & MAP_PRIVATE: with no shmem object beneath it */ - return current->mm->get_unmapped_area(file, addr, len, pgoff, flags); + return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags); #else return -ENOSYS; #endif diff --git a/drivers/dax/device.c b/drivers/dax/device.c index 93ebedc5ec8c..47c126d37b59 100644 --- a/drivers/dax/device.c +++ b/drivers/dax/device.c @@ -329,14 +329,14 @@ static unsigned long dax_get_unmapped_area(struct file *filp, if ((off + len_align) < off) goto out; - addr_align = current->mm->get_unmapped_area(filp, addr, len_align, - pgoff, flags); + addr_align = mm_get_unmapped_area(current->mm, filp, addr, len_align, + pgoff, flags); if (!IS_ERR_VALUE(addr_align)) { addr_align += (off - addr_align) & (align - 1); return addr_align; } out: - return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); + return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags); } static const struct address_space_operations dev_dax_aops = { diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 6502c7e776d1..3dee18bf47ed 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -249,11 +249,11 @@ generic_hugetlb_get_unmapped_area(struct file *file, unsigned long addr, } /* - * Use mm->get_unmapped_area value as a hint to use topdown routine. + * Use MMF_TOPDOWN flag as a hint to use topdown routine. * If architectures have special needs, they should define their own * version of hugetlb_get_unmapped_area. */ - if (mm->get_unmapped_area == arch_get_unmapped_area_topdown) + if (test_bit(MMF_TOPDOWN, &mm->flags)) return hugetlb_get_unmapped_area_topdown(file, addr, len, pgoff, flags); return hugetlb_get_unmapped_area_bottomup(file, addr, len, diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 75396a24fd8c..d19434e2a58e 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -455,8 +455,9 @@ pde_get_unmapped_area(struct proc_dir_entry *pde, struct file *file, unsigned lo return pde->proc_ops->proc_get_unmapped_area(file, orig_addr, len, pgoff, flags); #ifdef CONFIG_MMU - return current->mm->get_unmapped_area(file, orig_addr, len, pgoff, flags); + return mm_get_unmapped_area(current->mm, file, orig_addr, len, pgoff, flags); #endif + return orig_addr; } diff --git a/fs/ramfs/file-mmu.c b/fs/ramfs/file-mmu.c index c7a1aa3c882b..b45c7edc3225 100644 --- a/fs/ramfs/file-mmu.c +++ b/fs/ramfs/file-mmu.c @@ -35,7 +35,7 @@ static unsigned long ramfs_mmu_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { - return current->mm->get_unmapped_area(file, addr, len, pgoff, flags); + return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags); } const struct file_operations ramfs_file_operations = { diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 5240bd7bca33..9313e43123d4 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -777,11 +777,7 @@ struct mm_struct { } ____cacheline_aligned_in_smp; struct maple_tree mm_mt; -#ifdef CONFIG_MMU - unsigned long (*get_unmapped_area) (struct file *filp, - unsigned long addr, unsigned long len, - unsigned long pgoff, unsigned long flags); -#endif + unsigned long mmap_base; /* base of mmap area */ unsigned long mmap_legacy_base; /* base of mmap area in bottom-up allocations */ #ifdef CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES diff --git a/include/linux/sched/coredump.h b/include/linux/sched/coredump.h index 02f5090ffea2..e62ff805cfc9 100644 --- a/include/linux/sched/coredump.h +++ b/include/linux/sched/coredump.h @@ -92,9 +92,12 @@ static inline int get_dumpable(struct mm_struct *mm) #define MMF_VM_MERGE_ANY 30 #define MMF_VM_MERGE_ANY_MASK (1 << MMF_VM_MERGE_ANY) +#define MMF_TOPDOWN 31 /* mm searches top down by default */ +#define MMF_TOPDOWN_MASK (1 << MMF_TOPDOWN) + #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\ MMF_DISABLE_THP_MASK | MMF_HAS_MDWE_MASK |\ - MMF_VM_MERGE_ANY_MASK) + MMF_VM_MERGE_ANY_MASK | MMF_TOPDOWN_MASK) static inline unsigned long mmf_init_flags(unsigned long flags) { diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h index b6543f9d78d6..ed1caa26c8be 100644 --- a/include/linux/sched/mm.h +++ b/include/linux/sched/mm.h @@ -8,6 +8,7 @@ #include <linux/mm_types.h> #include <linux/gfp.h> #include <linux/sync_core.h> +#include <linux/sched/coredump.h> /* * Routines for handling mm_structs @@ -186,6 +187,10 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags); +unsigned long mm_get_unmapped_area(struct mm_struct *mm, struct file *filp, + unsigned long addr, unsigned long len, + unsigned long pgoff, unsigned long flags); + unsigned long generic_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index 5d4b448fdc50..405bab0a560c 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -3520,7 +3520,7 @@ static unsigned long io_uring_mmu_get_unmapped_area(struct file *filp, #else addr = 0UL; #endif - return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); + return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags); } #else /* !CONFIG_MMU */ diff --git a/kernel/bpf/arena.c b/kernel/bpf/arena.c index 86571e760dd6..74d566dcd2cb 100644 --- a/kernel/bpf/arena.c +++ b/kernel/bpf/arena.c @@ -314,7 +314,7 @@ static unsigned long arena_get_unmapped_area(struct file *filp, unsigned long ad return -EINVAL; } - ret = current->mm->get_unmapped_area(filp, addr, len * 2, 0, flags); + ret = mm_get_unmapped_area(current->mm, filp, addr, len * 2, 0, flags); if (IS_ERR_VALUE(ret)) return ret; if ((ret >> 32) == ((ret + len - 1) >> 32)) diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index ae2ff73bde7e..dead5e1977d8 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -980,7 +980,7 @@ static unsigned long bpf_get_unmapped_area(struct file *filp, unsigned long addr if (map->ops->map_get_unmapped_area) return map->ops->map_get_unmapped_area(filp, addr, len, pgoff, flags); #ifdef CONFIG_MMU - return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); + return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags); #else return addr; #endif diff --git a/mm/debug.c b/mm/debug.c index c1c1a6a484e4..37a17f77df9f 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -180,9 +180,6 @@ EXPORT_SYMBOL(dump_vma); void dump_mm(const struct mm_struct *mm) { pr_emerg("mm %px task_size %lu\n" -#ifdef CONFIG_MMU - "get_unmapped_area %px\n" -#endif "mmap_base %lu mmap_legacy_base %lu\n" "pgd %px mm_users %d mm_count %d pgtables_bytes %lu map_count %d\n" "hiwater_rss %lx hiwater_vm %lx total_vm %lx locked_vm %lx\n" @@ -208,9 +205,6 @@ void dump_mm(const struct mm_struct *mm) "def_flags: %#lx(%pGv)\n", mm, mm->task_size, -#ifdef CONFIG_MMU - mm->get_unmapped_area, -#endif mm->mmap_base, mm->mmap_legacy_base, mm->pgd, atomic_read(&mm->mm_users), atomic_read(&mm->mm_count), diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 9859aa4f7553..cede9ccb84dc 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -824,8 +824,8 @@ static unsigned long __thp_get_unmapped_area(struct file *filp, if (len_pad < len || (off + len_pad) < off) return 0; - ret = current->mm->get_unmapped_area(filp, addr, len_pad, - off >> PAGE_SHIFT, flags); + ret = mm_get_unmapped_area(current->mm, filp, addr, len_pad, + off >> PAGE_SHIFT, flags); /* * The failure might be due to length padding. The caller will retry @@ -843,8 +843,7 @@ static unsigned long __thp_get_unmapped_area(struct file *filp, off_sub = (off - ret) & (size - 1); - if (current->mm->get_unmapped_area == arch_get_unmapped_area_topdown && - !off_sub) + if (test_bit(MMF_TOPDOWN, ¤t->mm->flags) && !off_sub) return ret + size; ret += off_sub; @@ -861,7 +860,7 @@ unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, if (ret) return ret; - return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); + return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags); } EXPORT_SYMBOL_GPL(thp_get_unmapped_area); diff --git a/mm/mmap.c b/mm/mmap.c index 6dbda99a47da..224e9ce1e2fd 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1813,7 +1813,8 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { unsigned long (*get_area)(struct file *, unsigned long, - unsigned long, unsigned long, unsigned long); + unsigned long, unsigned long, unsigned long) + = NULL; unsigned long error = arch_mmap_check(addr, len, flags); if (error) @@ -1823,7 +1824,6 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, if (len > TASK_SIZE) return -ENOMEM; - get_area = current->mm->get_unmapped_area; if (file) { if (file->f_op->get_unmapped_area) get_area = file->f_op->get_unmapped_area; @@ -1842,7 +1842,11 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, if (!file) pgoff = 0; - addr = get_area(file, addr, len, pgoff, flags); + if (get_area) + addr = get_area(file, addr, len, pgoff, flags); + else + addr = mm_get_unmapped_area(current->mm, file, addr, len, + pgoff, flags); if (IS_ERR_VALUE(addr)) return addr; @@ -1857,6 +1861,17 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, EXPORT_SYMBOL(get_unmapped_area); +unsigned long +mm_get_unmapped_area(struct mm_struct *mm, struct file *file, + unsigned long addr, unsigned long len, + unsigned long pgoff, unsigned long flags) +{ + if (test_bit(MMF_TOPDOWN, &mm->flags)) + return arch_get_unmapped_area_topdown(file, addr, len, pgoff, flags); + return arch_get_unmapped_area(file, addr, len, pgoff, flags); +} +EXPORT_SYMBOL(mm_get_unmapped_area); + /** * find_vma_intersection() - Look up the first VMA which intersects the interval * @mm: The process address space. diff --git a/mm/shmem.c b/mm/shmem.c index 0aad0d9a621b..4078c3a1b2d0 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2273,8 +2273,6 @@ unsigned long shmem_get_unmapped_area(struct file *file, unsigned long uaddr, unsigned long len, unsigned long pgoff, unsigned long flags) { - unsigned long (*get_area)(struct file *, - unsigned long, unsigned long, unsigned long, unsigned long); unsigned long addr; unsigned long offset; unsigned long inflated_len; @@ -2284,8 +2282,8 @@ unsigned long shmem_get_unmapped_area(struct file *file, if (len > TASK_SIZE) return -ENOMEM; - get_area = current->mm->get_unmapped_area; - addr = get_area(file, uaddr, len, pgoff, flags); + addr = mm_get_unmapped_area(current->mm, file, uaddr, len, pgoff, + flags); if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) return addr; @@ -2342,7 +2340,8 @@ unsigned long shmem_get_unmapped_area(struct file *file, if (inflated_len < len) return addr; - inflated_addr = get_area(NULL, uaddr, inflated_len, 0, flags); + inflated_addr = mm_get_unmapped_area(current->mm, NULL, uaddr, + inflated_len, 0, flags); if (IS_ERR_VALUE(inflated_addr)) return addr; if (inflated_addr & ~PAGE_MASK) @@ -4807,7 +4806,7 @@ unsigned long shmem_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags) { - return current->mm->get_unmapped_area(file, addr, len, pgoff, flags); + return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags); } #endif diff --git a/mm/util.c b/mm/util.c index 669397235787..8619d353a1aa 100644 --- a/mm/util.c +++ b/mm/util.c @@ -469,17 +469,17 @@ void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) if (mmap_is_legacy(rlim_stack)) { mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; - mm->get_unmapped_area = arch_get_unmapped_area; + clear_bit(MMF_TOPDOWN, &mm->flags); } else { mm->mmap_base = mmap_base(random_factor, rlim_stack); - mm->get_unmapped_area = arch_get_unmapped_area_topdown; + set_bit(MMF_TOPDOWN, &mm->flags); } } #elif defined(CONFIG_MMU) && !defined(HAVE_ARCH_PICK_MMAP_LAYOUT) void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) { mm->mmap_base = TASK_UNMAPPED_BASE; - mm->get_unmapped_area = arch_get_unmapped_area; + clear_bit(MMF_TOPDOWN, &mm->flags); } #endif -- 2.34.1
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: Chao Yu <yuchao0@huawei.com>, Chao Yu <chao@kernel.org> TO: Chao Yu <yuchao0@huawei.com>, Chao Yu <chao@kernel.org> tree: https://git.kernel.org/pub/scm/linux/kernel/git/chao/linux.git wip head: ffa2225cad631419f3944c962518291a7df50367 commit: aac0576c96c228281b5db26528047da6a585fe84 [7/9] f2fs: zone: allow IPU in regular block device :::::: branch date: 2 days ago :::::: commit date: 2 days ago config: xtensa-randconfig-r081-20240325 (https://download.01.org/0day-ci/archive/20240326/202403260735.dL4awPJc-lkp@intel.com/config) compiler: xtensa-linux-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403260735.dL4awPJc-lkp@intel.com/ New smatch warnings: fs/f2fs/data.c:2590 f2fs_should_update_outplace() error: we previously assumed 'fio' could be null (see line 2581) Old smatch warnings: fs/f2fs/data.c:276 f2fs_post_read_work() warn: bitwise AND condition is false here fs/f2fs/data.c:281 f2fs_post_read_work() warn: bitwise AND condition is false here arch/xtensa/include/asm/thread_info.h:97 current_thread_info() warn: inconsistent indenting vim +/fio +2590 fs/f2fs/data.c bb9e3bb8dbf597 Chao Yu 2018-01-17 2573 4d57b86dd86404 Chao Yu 2018-05-30 2574 bool f2fs_should_update_outplace(struct inode *inode, struct f2fs_io_info *fio) bb9e3bb8dbf597 Chao Yu 2018-01-17 2575 { bb9e3bb8dbf597 Chao Yu 2018-01-17 2576 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); bb9e3bb8dbf597 Chao Yu 2018-01-17 2577 19bdba5265624b Jaegeuk Kim 2021-12-09 2578 /* The below cases were checked when setting it. */ 19bdba5265624b Jaegeuk Kim 2021-12-09 2579 if (f2fs_is_pinned_file(inode)) 19bdba5265624b Jaegeuk Kim 2021-12-09 2580 return false; 19bdba5265624b Jaegeuk Kim 2021-12-09 @2581 if (fio && is_sbi_flag_set(sbi, SBI_NEED_FSCK)) 19bdba5265624b Jaegeuk Kim 2021-12-09 2582 return true; aac0576c96c228 Chao Yu 2024-03-23 2583 if (f2fs_lfs_mode(sbi)) { aac0576c96c228 Chao Yu 2024-03-23 2584 if (!f2fs_sb_has_blkzoned(sbi)) bb9e3bb8dbf597 Chao Yu 2018-01-17 2585 return true; aac0576c96c228 Chao Yu 2024-03-23 2586 /* no regular block device in mainarea */ aac0576c96c228 Chao Yu 2024-03-23 2587 if (!sbi->first_zoned_segno) aac0576c96c228 Chao Yu 2024-03-23 2588 return true; aac0576c96c228 Chao Yu 2024-03-23 2589 /* blkaddr locates in sequential zone */ aac0576c96c228 Chao Yu 2024-03-23 @2590 if (GET_SEGNO(sbi, fio->old_blkaddr) >= sbi->first_zoned_segno) aac0576c96c228 Chao Yu 2024-03-23 2591 return true; aac0576c96c228 Chao Yu 2024-03-23 2592 } bb9e3bb8dbf597 Chao Yu 2018-01-17 2593 if (S_ISDIR(inode->i_mode)) bb9e3bb8dbf597 Chao Yu 2018-01-17 2594 return true; af033b2aa8a874 Chao Yu 2018-09-20 2595 if (IS_NOQUOTA(inode)) af033b2aa8a874 Chao Yu 2018-09-20 2596 return true; bb9e3bb8dbf597 Chao Yu 2018-01-17 2597 if (f2fs_is_atomic_file(inode)) bb9e3bb8dbf597 Chao Yu 2018-01-17 2598 return true; 943f7c6f987f4a Chao Yu 2023-09-04 2599 /* rewrite low ratio compress data w/ OPU mode to avoid fragmentation */ 943f7c6f987f4a Chao Yu 2023-09-04 2600 if (f2fs_compressed_file(inode) && 943f7c6f987f4a Chao Yu 2023-09-04 2601 F2FS_OPTION(sbi).compress_mode == COMPR_MODE_USER && 943f7c6f987f4a Chao Yu 2023-09-04 2602 is_inode_flag_set(inode, FI_ENABLE_COMPRESS)) 943f7c6f987f4a Chao Yu 2023-09-04 2603 return true; 859fca6b706e00 Chao Yu 2021-05-26 2604 859fca6b706e00 Chao Yu 2021-05-26 2605 /* swap file is migrating in aligned write mode */ 859fca6b706e00 Chao Yu 2021-05-26 2606 if (is_inode_flag_set(inode, FI_ALIGNED_WRITE)) 859fca6b706e00 Chao Yu 2021-05-26 2607 return true; 859fca6b706e00 Chao Yu 2021-05-26 2608 1018a5463a0637 Chao Yu 2022-02-04 2609 if (is_inode_flag_set(inode, FI_OPU_WRITE)) 1018a5463a0637 Chao Yu 2022-02-04 2610 return true; 1018a5463a0637 Chao Yu 2022-02-04 2611 bb9e3bb8dbf597 Chao Yu 2018-01-17 2612 if (fio) { b763f3bedc2da2 Chao Yu 2021-04-28 2613 if (page_private_gcing(fio->page)) bb9e3bb8dbf597 Chao Yu 2018-01-17 2614 return true; 4354994f097d06 Daniel Rosenberg 2018-08-20 2615 if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED) && 4354994f097d06 Daniel Rosenberg 2018-08-20 2616 f2fs_is_checkpointed_data(sbi, fio->old_blkaddr))) 4354994f097d06 Daniel Rosenberg 2018-08-20 2617 return true; bb9e3bb8dbf597 Chao Yu 2018-01-17 2618 } bb9e3bb8dbf597 Chao Yu 2018-01-17 2619 return false; bb9e3bb8dbf597 Chao Yu 2018-01-17 2620 } bb9e3bb8dbf597 Chao Yu 2018-01-17 2621 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
When an SVSM is present, the guest can also request attestation reports from the SVSM. These SVSM attestation reports can be used to attest the SVSM and any services running within the SVSM. Extend the config-fs attestation support to allow for an SVSM attestation report. This involves creating four (4) new config-fs attributes: - 'service-provider' (input) This attribute is used to determine whether the attestation request should be sent to the specified service provider or to the SEV firmware. The SVSM service provider is represented by the value 'svsm'. - 'service_guid' (input) Used for requesting the attestation of a single service within the service provider. A null GUID implies that the SVSM_ATTEST_SERVICES call should be used to request the attestation report. A non-null GUID implies that the SVSM_ATTEST_SINGLE_SERVICE call should be used. - 'service_manifest_version' (input) Used with the SVSM_ATTEST_SINGLE_SERVICE call, the service version represents a specific service manifest version be used for the attestation report. - 'manifestblob' (output) Used to return the service manifest associated with the attestation report. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> --- Documentation/ABI/testing/configfs-tsm | 69 +++++++++++ arch/x86/include/asm/sev.h | 31 ++++- arch/x86/kernel/sev.c | 50 ++++++++ drivers/virt/coco/sev-guest/sev-guest.c | 151 ++++++++++++++++++++++++ drivers/virt/coco/tsm.c | 93 ++++++++++++++- include/linux/tsm.h | 11 ++ 6 files changed, 402 insertions(+), 3 deletions(-) diff --git a/Documentation/ABI/testing/configfs-tsm b/Documentation/ABI/testing/configfs-tsm index dd24202b5ba5..72a7acdb5258 100644 --- a/Documentation/ABI/testing/configfs-tsm +++ b/Documentation/ABI/testing/configfs-tsm @@ -31,6 +31,21 @@ Description: Standardization v2.03 Section 4.1.8.1 MSG_REPORT_REQ. https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/56421.pdf +What: /sys/kernel/config/tsm/report/$name/manifestblob +Date: January, 2024 +KernelVersion: v6.10 +Contact: linux-coco@lists.linux.dev +Description: + (RO) Optional supplemental data that a TSM may emit, visibility + of this attribute depends on TSM, and may be empty if no + manifest data is available. + + When @provider is "sev_guest" and the @service_provider is + "svsm" this file contains the service manifest used for the SVSM + attestation report from the Secure VM Service Module for SEV-SNP + Guests v1.00 Section 7. + https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/58019.pdf + What: /sys/kernel/config/tsm/report/$name/provider Date: September, 2023 KernelVersion: v6.7 @@ -80,3 +95,57 @@ Contact: linux-coco@lists.linux.dev Description: (RO) Indicates the minimum permissible value that can be written to @privlevel. + +What: /sys/kernel/config/tsm/report/$name/service_provider +Date: January, 2024 +KernelVersion: v6.10 +Contact: linux-coco@lists.linux.dev +Description: + (WO) Attribute is visible if a TSM implementation provider + supports the concept of attestation reports from a service + provider for TVMs, like SEV-SNP running under an SVSM. + Specifying the service provider via this attribute will create + an attestation report as specified by the service provider. + Currently supported service-providers are: + svsm + + For the SVSM service provider, see the Secure VM Service Module + for SEV-SNP Guests v1.00 Section 7. + https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/58019.pdf + +What: /sys/kernel/config/tsm/report/$name/service_guid +Date: January, 2024 +KernelVersion: v6.10 +Contact: linux-coco@lists.linux.dev +Description: + (WO) Attribute is visible if a TSM implementation provider + supports the concept of attestation reports from a service + provider for TVMs, like SEV-SNP running under an SVSM. + Specifying an empty/null GUID (00000000-0000-0000-0000-000000) + requests all active services within the service provider be + part of the attestation report. Specifying a GUID request + an attestation report of just the specified service using the + manifest form specified by the service_manifest_version + attribute. + + For the SVSM service provider, see the Secure VM Service Module + for SEV-SNP Guests v1.00 Section 7. + https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/58019.pdf + +What: /sys/kernel/config/tsm/report/$name/service_manifest_version +Date: January, 2024 +KernelVersion: v6.10 +Contact: linux-coco@lists.linux.dev +Description: + (WO) Attribute is visible if a TSM implementation provider + supports the concept of attestation reports from a service + provider for TVMs, like SEV-SNP running under an SVSM. + Indicates the service manifest version requested for the + attestation report. If this field is not set by the user, + the default manifest version of the service (the service's + initial/first manifest version) is returned. The initial + manifest version is always available. + + For the SVSM service provider, see the Secure VM Service Module + for SEV-SNP Guests v1.00 Section 7. + https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/58019.pdf diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h index 066eb0ba3d63..94af7fb7a8e1 100644 --- a/arch/x86/include/asm/sev.h +++ b/arch/x86/include/asm/sev.h @@ -209,6 +209,27 @@ struct svsm_pvalidate_call { struct svsm_pvalidate_entry entry[]; }; +/* + * The SVSM Attestation related structures + */ +struct svsm_location_entry { + u64 pa; + u32 len; + u8 rsvd[4]; +}; + +struct svsm_attestation_call { + struct svsm_location_entry report_buffer; + struct svsm_location_entry nonce; + struct svsm_location_entry manifest_buffer; + struct svsm_location_entry certificates_buffer; + + /* For attesting a single service */ + u8 service_guid[16]; + u32 service_manifest_version; + u8 rsvd[4]; +}; + /* * SVSM protocol structure */ @@ -232,6 +253,10 @@ struct svsm_call { #define SVSM_CORE_CREATE_VCPU 2 #define SVSM_CORE_DELETE_VCPU 3 +#define SVSM_ATTEST_CALL(x) ((1ULL << 32) | (x)) +#define SVSM_ATTEST_SERVICES 0 +#define SVSM_ATTEST_SINGLE_SERVICE 1 + #ifdef CONFIG_AMD_MEM_ENCRYPT extern void __sev_es_ist_enter(struct pt_regs *regs); extern void __sev_es_ist_exit(void); @@ -302,6 +327,7 @@ void snp_set_wakeup_secondary_cpu(void); bool snp_init(struct boot_params *bp); void __noreturn snp_abort(void); int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, struct snp_guest_request_ioctl *rio); +int snp_issue_svsm_attestation_request(u64 call_id, struct svsm_attestation_call *input); void snp_accept_memory(phys_addr_t start, phys_addr_t end); u64 snp_get_unsupported_features(u64 status); u64 sev_get_status(void); @@ -333,7 +359,10 @@ static inline int snp_issue_guest_request(u64 exit_code, struct snp_req_data *in { return -ENOTTY; } - +static inline int snp_issue_svsm_attestation_request(u64 call_id, struct svsm_attestation_call *input) +{ + return -ENOTTY; +} static inline void snp_accept_memory(phys_addr_t start, phys_addr_t end) { } static inline u64 snp_get_unsupported_features(u64 status) { return 0; } static inline u64 sev_get_status(void) { return 0; } diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c index 7e2b9934a95d..0a06632898c6 100644 --- a/arch/x86/kernel/sev.c +++ b/arch/x86/kernel/sev.c @@ -2400,6 +2400,56 @@ static int __init init_sev_config(char *str) } __setup("sev=", init_sev_config); +static void update_attestation_input(struct svsm_call *call, struct svsm_attestation_call *input) +{ + /* If (new) lengths have been returned, propograte them up */ + if (call->rcx_out != call->rcx) + input->manifest_buffer.len = call->rcx_out; + + if (call->rdx_out != call->rdx) + input->certificates_buffer.len = call->rdx_out; + + if (call->r8_out != call->r8) + input->report_buffer.len = call->r8_out; +} + +int snp_issue_svsm_attestation_request(u64 call_id, struct svsm_attestation_call *input) +{ + struct svsm_attestation_call *attest_call; + struct svsm_call call = {}; + unsigned long flags; + u64 attest_call_pa; + int ret; + + if (!vmpl) + return -EINVAL; + + local_irq_save(flags); + + call.caa = __svsm_get_caa(); + + attest_call = (struct svsm_attestation_call *)call.caa->svsm_buffer; + attest_call_pa = __svsm_get_caa_pa() + offsetof(struct svsm_ca, svsm_buffer); + + *attest_call = *input; + + /* + * Set input registers for the request and set RDX and R8 to known + * values in order to detect length values being returned in them. + */ + call.rax = call_id; + call.rcx = attest_call_pa; + call.rdx = -1; + call.r8 = -1; + ret = svsm_protocol(&call); + update_attestation_input(&call, input); + + local_irq_restore(flags); + + return ret; +} +EXPORT_SYMBOL_GPL(snp_issue_svsm_attestation_request); + int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, struct snp_guest_request_ioctl *rio) { struct ghcb_state state; diff --git a/drivers/virt/coco/sev-guest/sev-guest.c b/drivers/virt/coco/sev-guest/sev-guest.c index bba6531cb606..0d2c9926a97c 100644 --- a/drivers/virt/coco/sev-guest/sev-guest.c +++ b/drivers/virt/coco/sev-guest/sev-guest.c @@ -38,6 +38,8 @@ #define SNP_REQ_MAX_RETRY_DURATION (60*HZ) #define SNP_REQ_RETRY_DELAY (2*HZ) +#define SVSM_MAX_RETRIES 3 + struct snp_guest_crypto { struct crypto_aead *tfm; u8 *iv, *authtag; @@ -783,6 +785,148 @@ struct snp_msg_cert_entry { u32 length; }; +static int sev_svsm_report_new(struct tsm_report *report, void *data) +{ + unsigned int report_len, manifest_len, certificates_len; + void *report_blob, *manifest_blob, *certificates_blob; + struct svsm_attestation_call attest_call = {}; + struct tsm_desc *desc = &report->desc; + unsigned int retry_count; + unsigned int size; + bool try_again; + void *buffer; + u64 call_id; + int ret; + + /* + * Allocate pages for the request: + * - Report blob (4K) + * - Manifest blob (4K) + * - Certificate blob (16K) + * + * Above addresses must be 4K aligned + */ + report_len = SZ_4K; + manifest_len = SZ_4K; + certificates_len = SEV_FW_BLOB_MAX_SIZE; + + if (guid_is_null(&desc->service_guid)) { + call_id = SVSM_ATTEST_CALL(SVSM_ATTEST_SERVICES); + } else { + export_guid(attest_call.service_guid, &desc->service_guid); + attest_call.service_manifest_version = desc->service_manifest_version; + + call_id = SVSM_ATTEST_CALL(SVSM_ATTEST_SINGLE_SERVICE); + } + + retry_count = 0; + +retry: + size = report_len + manifest_len + certificates_len; + buffer = alloc_pages_exact(size, __GFP_ZERO); + if (!buffer) + return -ENOMEM; + + report_blob = buffer; + attest_call.report_buffer.pa = __pa(report_blob); + attest_call.report_buffer.len = report_len; + + manifest_blob = report_blob + report_len; + attest_call.manifest_buffer.pa = __pa(manifest_blob); + attest_call.manifest_buffer.len = manifest_len; + + certificates_blob = manifest_blob + manifest_len; + attest_call.certificates_buffer.pa = __pa(certificates_blob); + attest_call.certificates_buffer.len = certificates_len; + + attest_call.nonce.pa = __pa(desc->inblob); + attest_call.nonce.len = desc->inblob_len; + + ret = snp_issue_svsm_attestation_request(call_id, &attest_call); + switch (ret) { + case SVSM_SUCCESS: + break; + case SVSM_ERR_INVALID_PARAMETER: + ret = -EINVAL; + + if (retry_count >= SVSM_MAX_RETRIES) + goto error; + + try_again = false; + + if (attest_call.report_buffer.len > report_len) { + report_len = PAGE_ALIGN(attest_call.report_buffer.len); + try_again = true; + } + + if (attest_call.manifest_buffer.len > manifest_len) { + manifest_len = PAGE_ALIGN(attest_call.manifest_buffer.len); + try_again = true; + } + + if (attest_call.certificates_buffer.len > certificates_len) { + certificates_len = PAGE_ALIGN(attest_call.certificates_buffer.len); + try_again = true; + } + + /* If one of the buffers wasn't large enough, retry the request */ + if (try_again) { + free_pages_exact(buffer, size); + retry_count++; + goto retry; + } + + goto error; + case SVSM_ERR_BUSY: + ret = -EAGAIN; + goto error; + default: + pr_err_ratelimited("SVSM attestation request failed (%#x)\n", ret); + ret = -EINVAL; + goto error; + } + + ret = -ENOMEM; + + report_len = attest_call.report_buffer.len; + void *rbuf __free(kvfree) = kvzalloc(report_len, GFP_KERNEL); + if (!rbuf) + goto error; + + memcpy(rbuf, report_blob, report_len); + report->outblob = no_free_ptr(rbuf); + report->outblob_len = report_len; + + manifest_len = attest_call.manifest_buffer.len; + void *mbuf __free(kvfree) = kvzalloc(manifest_len, GFP_KERNEL); + if (!mbuf) + goto error; + + memcpy(mbuf, manifest_blob, manifest_len); + report->manifestblob = no_free_ptr(mbuf); + report->manifestblob_len = manifest_len; + + certificates_len = attest_call.certificates_buffer.len; + if (!certificates_len) + goto success; + + void *cbuf __free(kvfree) = kvzalloc(certificates_len, GFP_KERNEL); + if (!cbuf) + goto error; + + memcpy(cbuf, certificates_blob, certificates_len); + report->auxblob = no_free_ptr(cbuf); + report->auxblob_len = certificates_len; + +success: + ret = 0; + +error: + free_pages_exact(buffer, size); + + return ret; +} + static int sev_report_new(struct tsm_report *report, void *data) { struct snp_msg_cert_entry *cert_table; @@ -797,6 +941,13 @@ static int sev_report_new(struct tsm_report *report, void *data) if (desc->inblob_len != SNP_REPORT_USER_DATA_SIZE) return -EINVAL; + if (desc->service_provider) { + if (strcmp(desc->service_provider, "svsm")) + return -EINVAL; + + return sev_svsm_report_new(report, data); + } + void *buf __free(kvfree) = kvzalloc(size, GFP_KERNEL); if (!buf) return -ENOMEM; diff --git a/drivers/virt/coco/tsm.c b/drivers/virt/coco/tsm.c index d1c2db83a8ca..46f230bf13ac 100644 --- a/drivers/virt/coco/tsm.c +++ b/drivers/virt/coco/tsm.c @@ -35,7 +35,7 @@ static DECLARE_RWSEM(tsm_rwsem); * The attestation report format is TSM provider specific, when / if a standard * materializes that can be published instead of the vendor layout. Until then * the 'provider' attribute indicates the format of 'outblob', and optionally - * 'auxblob'. + * 'auxblob' and 'manifestblob'. */ struct tsm_report_state { @@ -48,6 +48,7 @@ struct tsm_report_state { enum tsm_data_select { TSM_REPORT, TSM_CERTS, + TSM_MANIFEST, }; static struct tsm_report *to_tsm_report(struct config_item *cfg) @@ -119,6 +120,74 @@ static ssize_t tsm_report_privlevel_floor_show(struct config_item *cfg, } CONFIGFS_ATTR_RO(tsm_report_, privlevel_floor); +static ssize_t tsm_report_service_provider_store(struct config_item *cfg, + const char *buf, size_t len) +{ + struct tsm_report *report = to_tsm_report(cfg); + size_t sp_len; + char *sp; + int rc; + + guard(rwsem_write)(&tsm_rwsem); + rc = try_advance_write_generation(report); + if (rc) + return rc; + + sp_len = (buf[len - 1] != '\n') ? len : len - 1; + + sp = kstrndup(buf, sp_len, GFP_KERNEL); + if (!sp) + return -ENOMEM; + kfree(report->desc.service_provider); + + report->desc.service_provider = sp; + + return len; +} +CONFIGFS_ATTR_WO(tsm_report_, service_provider); + +static ssize_t tsm_report_service_guid_store(struct config_item *cfg, + const char *buf, size_t len) +{ + struct tsm_report *report = to_tsm_report(cfg); + int rc; + + guard(rwsem_write)(&tsm_rwsem); + rc = try_advance_write_generation(report); + if (rc) + return rc; + + report->desc.service_guid = guid_null; + + rc = guid_parse(buf, &report->desc.service_guid); + if (rc) + return rc; + + return len; +} +CONFIGFS_ATTR_WO(tsm_report_, service_guid); + +static ssize_t tsm_report_service_manifest_version_store(struct config_item *cfg, + const char *buf, size_t len) +{ + struct tsm_report *report = to_tsm_report(cfg); + unsigned int val; + int rc; + + rc = kstrtouint(buf, 0, &val); + if (rc) + return rc; + + guard(rwsem_write)(&tsm_rwsem); + rc = try_advance_write_generation(report); + if (rc) + return rc; + report->desc.service_manifest_version = val; + + return len; +} +CONFIGFS_ATTR_WO(tsm_report_, service_manifest_version); + static ssize_t tsm_report_inblob_write(struct config_item *cfg, const void *buf, size_t count) { @@ -163,6 +232,9 @@ static ssize_t __read_report(struct tsm_report *report, void *buf, size_t count, if (select == TSM_REPORT) { out = report->outblob; len = report->outblob_len; + } else if (select == TSM_MANIFEST) { + out = report->manifestblob; + len = report->manifestblob_len; } else { out = report->auxblob; len = report->auxblob_len; @@ -188,7 +260,7 @@ static ssize_t read_cached_report(struct tsm_report *report, void *buf, /* * A given TSM backend always fills in ->outblob regardless of - * whether the report includes an auxblob or not. + * whether the report includes an auxblob/manifestblob or not. */ if (!report->outblob || state->read_generation != state->write_generation) @@ -224,8 +296,10 @@ static ssize_t tsm_report_read(struct tsm_report *report, void *buf, kvfree(report->outblob); kvfree(report->auxblob); + kvfree(report->manifestblob); report->outblob = NULL; report->auxblob = NULL; + report->manifestblob = NULL; rc = ops->report_new(report, provider.data); if (rc < 0) return rc; @@ -252,6 +326,15 @@ static ssize_t tsm_report_auxblob_read(struct config_item *cfg, void *buf, } CONFIGFS_BIN_ATTR_RO(tsm_report_, auxblob, NULL, TSM_OUTBLOB_MAX); +static ssize_t tsm_report_manifestblob_read(struct config_item *cfg, void *buf, + size_t count) +{ + struct tsm_report *report = to_tsm_report(cfg); + + return tsm_report_read(report, buf, count, TSM_MANIFEST); +} +CONFIGFS_BIN_ATTR_RO(tsm_report_, manifestblob, NULL, TSM_OUTBLOB_MAX); + #define TSM_DEFAULT_ATTRS() \ &tsm_report_attr_generation, \ &tsm_report_attr_provider @@ -265,6 +348,9 @@ static struct configfs_attribute *tsm_report_extra_attrs[] = { TSM_DEFAULT_ATTRS(), &tsm_report_attr_privlevel, &tsm_report_attr_privlevel_floor, + &tsm_report_attr_service_provider, + &tsm_report_attr_service_guid, + &tsm_report_attr_service_manifest_version, NULL, }; @@ -280,6 +366,7 @@ static struct configfs_bin_attribute *tsm_report_bin_attrs[] = { static struct configfs_bin_attribute *tsm_report_bin_extra_attrs[] = { TSM_DEFAULT_BIN_ATTRS(), &tsm_report_attr_auxblob, + &tsm_report_attr_manifestblob, NULL, }; @@ -288,8 +375,10 @@ static void tsm_report_item_release(struct config_item *cfg) struct tsm_report *report = to_tsm_report(cfg); struct tsm_report_state *state = to_state(report); + kvfree(report->manifestblob); kvfree(report->auxblob); kvfree(report->outblob); + kfree(report->desc.service_provider); kfree(state); } diff --git a/include/linux/tsm.h b/include/linux/tsm.h index 50c5769657d8..27cc97fe8dcd 100644 --- a/include/linux/tsm.h +++ b/include/linux/tsm.h @@ -4,6 +4,7 @@ #include <linux/sizes.h> #include <linux/types.h> +#include <linux/uuid.h> #define TSM_INBLOB_MAX 64 #define TSM_OUTBLOB_MAX SZ_32K @@ -19,11 +20,17 @@ * @privlevel: optional privilege level to associate with @outblob * @inblob_len: sizeof @inblob * @inblob: arbitrary input data + * @service_provider: optional name of where to obtain the tsm report blob + * @service_guid: optional service-provider service guid to attest + * @service_manifest_version: optional service-provider service manifest version requested */ struct tsm_desc { unsigned int privlevel; size_t inblob_len; u8 inblob[TSM_INBLOB_MAX]; + char *service_provider; + guid_t service_guid; + unsigned int service_manifest_version; }; /** @@ -33,6 +40,8 @@ struct tsm_desc { * @outblob: generated evidence to provider to the attestation agent * @auxblob_len: sizeof(@auxblob) * @auxblob: (optional) auxiliary data to the report (e.g. certificate data) + * @manifestblob_len: sizeof(@manifestblob) + * @manifestblob: (optional) manifest data associated with the report */ struct tsm_report { struct tsm_desc desc; @@ -40,6 +49,8 @@ struct tsm_report { u8 *outblob; size_t auxblob_len; u8 *auxblob; + size_t manifestblob_len; + u8 *manifestblob; }; /** -- 2.43.2
On Mon, Mar 25, 2024 at 12:44:44PM +0000, Subbaraya Sundeep Bhatta wrote:
> Hi,
>
> >-----Original Message-----
> >From: Su Hui <suhui@nfschina.com>
> >Sent: Monday, March 25, 2024 1:06 PM
> >To: Sunil Kovvuri Goutham <sgoutham@marvell.com>; Geethasowjanya Akula
> ><gakula@marvell.com>; Subbaraya Sundeep Bhatta <sbhatta@marvell.com>;
> >Hariprasad Kelam <hkelam@marvell.com>; davem@davemloft.net;
> >edumazet@google.com; kuba@kernel.org; pabeni@redhat.com;
> >nathan@kernel.org; ndesaulniers@google.com; morbo@google.com;
> >justinstitt@google.com
> >Cc: Su Hui <suhui@nfschina.com>; netdev@vger.kernel.org; linux-
> >kernel@vger.kernel.org; llvm@lists.linux.dev; kernel-janitors@vger.kernel.org
> >Subject: [PATCH 2/2] octeontx2-pf: remove unused variables
> >req_hdr and rsp_hdr
> >
> >Clang static checker(scan-buid):
> >drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c:503:2: warning:
> >Value stored to 'rsp_hdr' is never read [deadcode.DeadStores]
> >
> Consider this also as a fix and add Fixes tag. Also please add "net" in subject to
> easily identify whether this patch as net or net-next material.
>
It's not a bug fix so it doesn't need a Fixes tag.
regards,
dan carpenter
Hi Jason Wang Thank you for your review. Yes, you're correct. I will update the patch accordingly to address the issues you pointed out. V2:https://lore.kernel.org/all/20240318130008.1928-1-gavin.liu@jaguarmicro.com/ Here is the content of the V2 version: From: Yuxue Liu <yuxue.liu@jaguarmicro.com> When there is a ctlq and it doesn't require interrupt callbacks,the original method of calculating vectors wastes hardware MSI or MSI-X resources as well as system IRQ resources. Referencing the per_vq_vectors mode in the vp_find_vqs_msix function, calculate the required number of vectors based on whether the callback is set. Signed-off-by: Yuxue Liu <yuxue.liu@jaguarmicro.com> --- V1 -> V2: fix when allocating IRQs, scan all queues. V1: https://lore.kernel.org/all/20240318030121.1873-1-gavin.liu@jaguarmicro.com/ --- drivers/vdpa/virtio_pci/vp_vdpa.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c index 281287fae89f..87329d4358ce 100644 --- a/drivers/vdpa/virtio_pci/vp_vdpa.c +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c @@ -160,8 +160,15 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa) struct pci_dev *pdev = mdev->pci_dev; int i, ret, irq; int queues = vp_vdpa->queues; - int vectors = queues + 1; + int allocated_vectors, vectors = 0; + u16 msix_vec; + for (i = 0; i < queues; i++) { + if (vp_vdpa->vring[i].cb.callback != NULL) + vectors++; + } + /*By default, config interrupts request a single vector*/ + vectors = vectors + 1; ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX); if (ret != vectors) { dev_err(&pdev->dev, @@ -169,13 +176,17 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa) vectors, ret); return ret; } - vp_vdpa->vectors = vectors; for (i = 0; i < queues; i++) { + if (vp_vdpa->vring[i].cb.callback == NULL) + continue; + else + msix_vec = allocated_vectors++; + snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-%d\n", pci_name(pdev), i); - irq = pci_irq_vector(pdev, i); + irq = pci_irq_vector(pdev, msix_vec); ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_vq_handler, 0, vp_vdpa->vring[i].msix_name, @@ -185,13 +196,14 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa) "vp_vdpa: fail to request irq for vq %d\n", i); goto err; } - vp_modern_queue_vector(mdev, i, i); + vp_modern_queue_vector(mdev, i, msix_vec); vp_vdpa->vring[i].irq = irq; } + msix_vec = allocated_vectors; snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n", pci_name(pdev)); - irq = pci_irq_vector(pdev, queues); + irq = pci_irq_vector(pdev, msix_vec); ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0, vp_vdpa->msix_name, vp_vdpa); if (ret) { @@ -199,7 +211,7 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa) "vp_vdpa: fail to request irq for vq %d\n", i); goto err; } - vp_modern_config_vector(mdev, queues); + vp_modern_config_vector(mdev, msix_vec); vp_vdpa->config_irq = irq; return 0; ------- —————————————————————————————————————— Best regards, Gavin ----- Original Message ----- From: Jason Wang jasowang@redhat.com Sent: March 18, 2024, 12:06 To: Gavin Liu gavin.liu@jaguarmicro.com Cc: mst@redhat.com; xuanzhuo@linux.alibaba.com; virtualization@lists.linux.dev; Angus Chen angus.chen@jaguarmicro.com; Gavin Liu gavin.liu@jaguarmicro.com Subject: Re: [PATCH] vp_vdpa: fix the method of calculating vectors External Mail: This email originated from OUTSIDE of the organization! Do not click links, open attachments or provide ANY information unless you recognize the sender and know the content is safe. On Mon, Mar 18, 2024 at 11:01 AM gavin.liu <gavin.liu@jaguarmicro.com> wrote: > > From: Yuxue Liu <yuxue.liu@jaguarmicro.com> > > When there is a ctlq and it doesn't require interrupt callbacks,the > original method of calculating vectors wastes hardware MSI or MSI-X > resources as well as system IRQ resources. Referencing the > per_vq_vectors mode in the vp_find_vqs_msix function, calculate the > required number of vectors based on whether the callback is set. > > Signed-off-by: Yuxue Liu <yuxue.liu@jaguarmicro.com> > --- > drivers/vdpa/virtio_pci/vp_vdpa.c | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-) > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c > b/drivers/vdpa/virtio_pci/vp_vdpa.c > index 281287fae89f..5066970b2570 100644 > --- a/drivers/vdpa/virtio_pci/vp_vdpa.c > +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c > @@ -160,7 +160,13 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa) > struct pci_dev *pdev = mdev->pci_dev; > int i, ret, irq; > int queues = vp_vdpa->queues; > - int vectors = queues + 1; > + int vectors = 0; > + > + for (i = 0; i < queues; i++) { > + if (vp_vdpa->vring[i].cb.callback != NULL) > + vectors++; > + } > + vectors = vectors + 1; > > ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX); > if (ret != vectors) { > @@ -172,7 +178,7 @@ static int vp_vdpa_request_irq(struct vp_vdpa > *vp_vdpa) > > vp_vdpa->vectors = vectors; > > - for (i = 0; i < queues; i++) { > + for (i = 0; i < vectors - 1; i++) { This seems to be buggy. You didn't scan all queues so you will miss the IRQ for the last queue. Thanks > snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE, > "vp-vdpa[%s]-%d\n", pci_name(pdev), i); > irq = pci_irq_vector(pdev, i); @@ -191,7 +197,7 @@ > static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa) > > snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n", > pci_name(pdev)); > - irq = pci_irq_vector(pdev, queues); > + irq = pci_irq_vector(pdev, vectors - 1); > ret = devm_request_irq(&pdev->dev, irq, vp_vdpa_config_handler, 0, > vp_vdpa->msix_name, vp_vdpa); > if (ret) { > @@ -199,7 +205,7 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa) > "vp_vdpa: fail to request irq for vq %d\n", i); > goto err; > } > - vp_modern_config_vector(mdev, queues); > + vp_modern_config_vector(mdev, vectors - 1); > vp_vdpa->config_irq = irq; > > return 0; > -- > 2.43.0 >
Hi Jason Wang Thanks for your review. Yes, you're correct. I will update the patch accordingly to address the issues you pointed out. Here is the link to the V2 version: https://lore.kernel.org/all/20240325110333.249-1-gavin.liu@jaguarmicro.com/ Here is the content of the V2 version: ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- In the vp_vdpa_set_status function, when setting the device status to VIRTIO_CONFIG_S_DRIVER_OK, the vp_vdpa_request_irq function may fail. In such cases, the device status should not be set to DRIVER_OK. Add exception printing to remind the user. Signed-off-by: Yuxue Liu <yuxue.liu@jaguarmicro.com> --- V1 -> V2: Remove redundant printouts V1: https://lore.kernel.org/all/20240315102857.1803-1-gavin.liu@jaguarmicro.com/ --- drivers/vdpa/virtio_pci/vp_vdpa.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c index df5f4a3bccb5..4caca0517cad 100644 --- a/drivers/vdpa/virtio_pci/vp_vdpa.c +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c @@ -216,7 +216,10 @@ static void vp_vdpa_set_status(struct vdpa_device *vdpa, u8 status) if (status & VIRTIO_CONFIG_S_DRIVER_OK && !(s & VIRTIO_CONFIG_S_DRIVER_OK)) { - vp_vdpa_request_irq(vp_vdpa); + if (vp_vdpa_request_irq(vp_vdpa)) { + WARN_ON(1); + return; + } } vp_modern_set_status(mdev, status); -- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Best regards, Gavin -----Original Message----- From: Jason Wang jasowang@redhat.com Sent: March 18, 2024 12:25 To: Gavin Liu gavin.liu@jaguarmicro.com Cc: mst@redhat.com; xuanzhuo@linux.alibaba.com; virtualization@lists.linux.dev; Angus Chen angus.chen@jaguarmicro.com; Gavin Liu gavin.liu@jaguarmicro.com Subject: Re: [PATCH] vp_vdpa: Fix return value check vp_vdpa_request_irq External Mail: This email originated from OUTSIDE of the organization! Do not click links, open attachments or provide ANY information unless you recognize the sender and know the content is safe. On Fri, Mar 15, 2024 at 6:29 PM gavin.liu <gavin.liu@jaguarmicro.com> wrote: > > From: Yuxue Liu <yuxue.liu@jaguarmicro.com> > > In the vp_vdpa_set_status function, when setting the device status to > VIRTIO_CONFIG_S_DRIVER_OK, the vp_vdpa_request_irq function may fail. > In such cases, the device status should not be set to DRIVER_OK. Add > exception printing to remind the user. > > Signed-off-by: Yuxue Liu <yuxue.liu@jaguarmicro.com> > --- > drivers/vdpa/virtio_pci/vp_vdpa.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c > index 281287fae89f..c1270b263867 100644 > --- a/drivers/vdpa/virtio_pci/vp_vdpa.c > +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c > @@ -213,10 +213,16 @@ static void vp_vdpa_set_status(struct vdpa_device *vdpa, u8 status) > struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa); > struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa); > u8 s = vp_vdpa_get_status(vdpa); > + struct pci_dev *pdev = mdev->pci_dev; > > if (status & VIRTIO_CONFIG_S_DRIVER_OK && > !(s & VIRTIO_CONFIG_S_DRIVER_OK)) { > - vp_vdpa_request_irq(vp_vdpa); > + if (vp_vdpa_request_irq(vp_vdpa)) { > + WARN_ON(1); > + dev_err(&pdev->dev, > + "vp_vdpa : fail set status is DRIVER_OK\n"); I think having one of the WARN_ON or dev_err should be sufficient. Thanks > + return; > + } > } > > vp_modern_set_status(mdev, status); > -- > 2.43.0 >
[Public] > -----Original Message----- > From: amd-gfx <amd-gfx-bounces@lists.freedesktop.org> On Behalf Of > Damien Le Moal > Sent: Monday, March 25, 2024 3:09 AM > To: linux-pci@vger.kernel.org; Bjorn Helgaas <bhelgaas@google.com>; > Manivannan Sadhasivami <manivannan.sadhasivam@linaro.org>; linux- > scsi@vger.kernel.org; Martin K . Petersen <martin.petersen@oracle.com>; > Jaroslav Kysela <perex@perex.cz>; linux-sound@vger.kernel.org; Greg Kroah- > Hartman <gregkh@linuxfoundation.org>; linux-usb@vger.kernel.org; linux- > serial@vger.kernel.org; Hans de Goede <hdegoede@redhat.com>; platform- > driver-x86@vger.kernel.org; ntb@lists.linux.dev; Lee Jones <lee@kernel.org>; > David Airlie <airlied@gmail.com>; amd-gfx@lists.freedesktop.org; Jason > Gunthorpe <jgg@ziepe.ca>; linux-rdma@vger.kernel.org; David S . Miller > <davem@davemloft.net>; Eric Dumazet <edumazet@google.com>; > netdev@vger.kernel.org; linux-kernel@vger.kernel.org > Subject: [PATCH 10/28] drm: amdgpu: Use PCI_IRQ_INTX > > Use the macro PCI_IRQ_INTX instead of the deprecated PCI_IRQ_LEGACY > macro. > > Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Feel free to take it through whatever tree makes sense. If you want me to pick it up, let me know. Acked-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c > index 7e6d09730e6d..d18113017ee7 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c > @@ -279,7 +279,7 @@ int amdgpu_irq_init(struct amdgpu_device *adev) > adev->irq.msi_enabled = false; > > if (!amdgpu_msi_ok(adev)) > - flags = PCI_IRQ_LEGACY; > + flags = PCI_IRQ_INTX; > else > flags = PCI_IRQ_ALL_TYPES; > > -- > 2.44.0
Hi, >-----Original Message----- >From: Su Hui <suhui@nfschina.com> >Sent: Monday, March 25, 2024 1:06 PM >To: Sunil Kovvuri Goutham <sgoutham@marvell.com>; Geethasowjanya Akula ><gakula@marvell.com>; Subbaraya Sundeep Bhatta <sbhatta@marvell.com>; >Hariprasad Kelam <hkelam@marvell.com>; davem@davemloft.net; >edumazet@google.com; kuba@kernel.org; pabeni@redhat.com; >nathan@kernel.org; ndesaulniers@google.com; morbo@google.com; >justinstitt@google.com >Cc: Su Hui <suhui@nfschina.com>; netdev@vger.kernel.org; linux- >kernel@vger.kernel.org; llvm@lists.linux.dev; kernel-janitors@vger.kernel.org >Subject: [PATCH 2/2] octeontx2-pf: remove unused variables >req_hdr and rsp_hdr > >Clang static checker(scan-buid): >drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c:503:2: warning: >Value stored to 'rsp_hdr' is never read [deadcode.DeadStores] > Consider this also as a fix and add Fixes tag. Also please add "net" in subject to easily identify whether this patch as net or net-next material. Thanks, Sundeep >Remove these unused variables to save some space. > >Signed-off-by: Su Hui <suhui@nfschina.com> >--- > drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c | 8 ++------ > 1 file changed, 2 insertions(+), 6 deletions(-) > >diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c >b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c >index 3f46d5e0fb2e..637b05c79c42 100644 >--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c >+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c >@@ -450,7 +450,6 @@ static void otx2_pfvf_mbox_handler(struct >work_struct *work) > struct mbox_msghdr *msg = NULL; > int offset, vf_idx, id, err; > struct otx2_mbox_dev *mdev; >- struct mbox_hdr *req_hdr; > struct otx2_mbox *mbox; > struct mbox *vf_mbox; > struct otx2_nic *pf; >@@ -461,9 +460,8 @@ static void otx2_pfvf_mbox_handler(struct >work_struct *work) > > mbox = &pf->mbox_pfvf[0].mbox; > mdev = &mbox->dev[vf_idx]; >- req_hdr = (struct mbox_hdr *)(mdev->mbase + mbox->rx_start); > >- offset = ALIGN(sizeof(*req_hdr), MBOX_MSG_ALIGN); >+ offset = ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN); > > for (id = 0; id < vf_mbox->num_msgs; id++) { > msg = (struct mbox_msghdr *)(mdev->mbase + mbox->rx_start >+ >@@ -494,7 +492,6 @@ static void otx2_pfvf_mbox_up_handler(struct >work_struct *work) > struct otx2_nic *pf = vf_mbox->pfvf; > struct otx2_mbox_dev *mdev; > int offset, id, vf_idx = 0; >- struct mbox_hdr *rsp_hdr; > struct mbox_msghdr *msg; > struct otx2_mbox *mbox; > >@@ -502,8 +499,7 @@ static void otx2_pfvf_mbox_up_handler(struct >work_struct *work) > mbox = &pf->mbox_pfvf[0].mbox_up; > mdev = &mbox->dev[vf_idx]; > >- rsp_hdr = (struct mbox_hdr *)(mdev->mbase + mbox->rx_start); >- offset = mbox->rx_start + ALIGN(sizeof(*rsp_hdr), >MBOX_MSG_ALIGN); >+ offset = mbox->rx_start + ALIGN(sizeof(struct mbox_hdr), >MBOX_MSG_ALIGN); > > for (id = 0; id < vf_mbox->up_num_msgs; id++) { > msg = mdev->mbase + offset; >-- >2.30.2
Hi Shameer, On Mon, Mar 25, 2024 at 10:44 AM Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com> wrote: > > > > > -----Original Message----- > > From: Mostafa Saleh <smostafa@google.com> > > Sent: Monday, March 25, 2024 10:22 AM > > To: Jason Gunthorpe <jgg@nvidia.com> > > Cc: iommu@lists.linux.dev; Joerg Roedel <joro@8bytes.org>; linux-arm- > > kernel@lists.infradead.org; Robin Murphy <robin.murphy@arm.com>; Will > > Deacon <will@kernel.org>; Eric Auger <eric.auger@redhat.com>; Jean- > > Philippe Brucker <jean-philippe@linaro.org>; Moritz Fischer > > <mdf@kernel.org>; Michael Shavit <mshavit@google.com>; Nicolin Chen > > <nicolinc@nvidia.com>; patches@lists.linux.dev; Shameerali Kolothum Thodi > > <shameerali.kolothum.thodi@huawei.com> > > Subject: Re: [PATCH v5 00/27] Update SMMUv3 to the modern iommu API > > (part 2/3) > > > > Hi Jason, > > > > On Mon, Mar 04, 2024 at 07:43:48PM -0400, Jason Gunthorpe wrote: > > > Continuing the work of part 1 this focuses on the CD, PASID and SVA > > > components: > > > > > > - attach_dev failure does not change the HW configuration. > > > > > > - Full PASID API support including: > > > - S1/SVA domains attached to PASIDs > > > - IDENTITY/BLOCKED/S1 attached to RID > > > - Change of the RID domain while PASIDs are attached > > > > > > - Streamlined SVA support using the core infrastructure > > > > > > - Hitless, whenever possible, change between two domains > > > > > > Making the CD programming work like the new STE programming allows > > > untangling some of the confusing SVA flows. From there the focus is on > > > building out the core infrastructure for dealing with PASID and CD > > > entries, then keeping track of unique SSID's for ATS invalidation. > > > > > > The ATS ordering is generalized so that the PASID flow can use it and put > > > into a form where it is fully hitless, whenever possible. Care is taken to > > > ensure that ATC flushes are present after any change in translation. > > > > > > Finally we simply kill the entire outdated SVA mmu_notifier > > implementation > > > in one shot and switch it over to the newly created generic PASID & CD > > > code. This avoids the messy and confusing approach of trying to > > > incrementally untangle this in place. The new code is small and simple > > > enough this is much better than trying to figure out smaller steps. > > > > > > Once SVA is resting on the right CD code it is straightforward to make the > > > PASID interface functionally complete. > > > > > > It achieves the same goals as the several series from Michael and the S1DSS > > > series from Nicolin that were trying to improve portions of the API. > > > > > > This is on github: > > > https://github.com/jgunthorpe/linux/commits/smmuv3_newapi > > > > Testing on qemu[1], with the same VMM Shameer tested with[2]: > > qemu/build/qemu-system-aarch64 -M virt -machine virt,gic- > > version=3,iommu=nested-smmuv3,iommufd=iommufd0 \ > > -cpu cortex-a53,pmu=off -smp 1 -m 2048 \ > > -kernel Image \ > > -drive file=rootfs.ext4,if=virtio,format=raw \ > > -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng- > > pci,rng=rng0 -nographic \ > > -append 'console=ttyAMA0 rootwait root=/dev/vda' \ > > -device virtio-scsi-pci,id=scsi0 \ > > -device ioh3420,id=pcie.1,chassis=1 \ > > -object iommufd,id=iommufd0 \ > > -device vfio-pci,host=0000:00:03.0,iommufd=iommufd0 > > > > I see the following panic: > > I think that is probably because you are testing with "nested-smmuv3". This > series not yet fully enable that. For that, I think you are missing few patches > from Nicolin's iommufd branch, > https://github.com/nicolinc/iommufd/commits/wip/iommufd_nesting-03112024/ I see, thanks for clarifying. I think we shouldn't still crash the kernel, but that's a problem for part 3. Thanks, Mostafa _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Hi Shameer,
On Mon, Mar 25, 2024 at 10:44 AM Shameerali Kolothum Thodi
<shameerali.kolothum.thodi@huawei.com> wrote:
>
>
>
> > -----Original Message-----
> > From: Mostafa Saleh <smostafa@google.com>
> > Sent: Monday, March 25, 2024 10:22 AM
> > To: Jason Gunthorpe <jgg@nvidia.com>
> > Cc: iommu@lists.linux.dev; Joerg Roedel <joro@8bytes.org>; linux-arm-
> > kernel@lists.infradead.org; Robin Murphy <robin.murphy@arm.com>; Will
> > Deacon <will@kernel.org>; Eric Auger <eric.auger@redhat.com>; Jean-
> > Philippe Brucker <jean-philippe@linaro.org>; Moritz Fischer
> > <mdf@kernel.org>; Michael Shavit <mshavit@google.com>; Nicolin Chen
> > <nicolinc@nvidia.com>; patches@lists.linux.dev; Shameerali Kolothum Thodi
> > <shameerali.kolothum.thodi@huawei.com>
> > Subject: Re: [PATCH v5 00/27] Update SMMUv3 to the modern iommu API
> > (part 2/3)
> >
> > Hi Jason,
> >
> > On Mon, Mar 04, 2024 at 07:43:48PM -0400, Jason Gunthorpe wrote:
> > > Continuing the work of part 1 this focuses on the CD, PASID and SVA
> > > components:
> > >
> > > - attach_dev failure does not change the HW configuration.
> > >
> > > - Full PASID API support including:
> > > - S1/SVA domains attached to PASIDs
> > > - IDENTITY/BLOCKED/S1 attached to RID
> > > - Change of the RID domain while PASIDs are attached
> > >
> > > - Streamlined SVA support using the core infrastructure
> > >
> > > - Hitless, whenever possible, change between two domains
> > >
> > > Making the CD programming work like the new STE programming allows
> > > untangling some of the confusing SVA flows. From there the focus is on
> > > building out the core infrastructure for dealing with PASID and CD
> > > entries, then keeping track of unique SSID's for ATS invalidation.
> > >
> > > The ATS ordering is generalized so that the PASID flow can use it and put
> > > into a form where it is fully hitless, whenever possible. Care is taken to
> > > ensure that ATC flushes are present after any change in translation.
> > >
> > > Finally we simply kill the entire outdated SVA mmu_notifier
> > implementation
> > > in one shot and switch it over to the newly created generic PASID & CD
> > > code. This avoids the messy and confusing approach of trying to
> > > incrementally untangle this in place. The new code is small and simple
> > > enough this is much better than trying to figure out smaller steps.
> > >
> > > Once SVA is resting on the right CD code it is straightforward to make the
> > > PASID interface functionally complete.
> > >
> > > It achieves the same goals as the several series from Michael and the S1DSS
> > > series from Nicolin that were trying to improve portions of the API.
> > >
> > > This is on github:
> > > https://github.com/jgunthorpe/linux/commits/smmuv3_newapi
> >
> > Testing on qemu[1], with the same VMM Shameer tested with[2]:
> > qemu/build/qemu-system-aarch64 -M virt -machine virt,gic-
> > version=3,iommu=nested-smmuv3,iommufd=iommufd0 \
> > -cpu cortex-a53,pmu=off -smp 1 -m 2048 \
> > -kernel Image \
> > -drive file=rootfs.ext4,if=virtio,format=raw \
> > -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-
> > pci,rng=rng0 -nographic \
> > -append 'console=ttyAMA0 rootwait root=/dev/vda' \
> > -device virtio-scsi-pci,id=scsi0 \
> > -device ioh3420,id=pcie.1,chassis=1 \
> > -object iommufd,id=iommufd0 \
> > -device vfio-pci,host=0000:00:03.0,iommufd=iommufd0
> >
> > I see the following panic:
>
> I think that is probably because you are testing with "nested-smmuv3". This
> series not yet fully enable that. For that, I think you are missing few patches
> from Nicolin's iommufd branch,
> https://github.com/nicolinc/iommufd/commits/wip/iommufd_nesting-03112024/
I see, thanks for clarifying. I think we shouldn't still crash the
kernel, but that's a problem for part 3.
Thanks,
Mostafa
> -----Original Message----- > From: Mostafa Saleh <smostafa@google.com> > Sent: Monday, March 25, 2024 10:22 AM > To: Jason Gunthorpe <jgg@nvidia.com> > Cc: iommu@lists.linux.dev; Joerg Roedel <joro@8bytes.org>; linux-arm- > kernel@lists.infradead.org; Robin Murphy <robin.murphy@arm.com>; Will > Deacon <will@kernel.org>; Eric Auger <eric.auger@redhat.com>; Jean- > Philippe Brucker <jean-philippe@linaro.org>; Moritz Fischer > <mdf@kernel.org>; Michael Shavit <mshavit@google.com>; Nicolin Chen > <nicolinc@nvidia.com>; patches@lists.linux.dev; Shameerali Kolothum Thodi > <shameerali.kolothum.thodi@huawei.com> > Subject: Re: [PATCH v5 00/27] Update SMMUv3 to the modern iommu API > (part 2/3) > > Hi Jason, > > On Mon, Mar 04, 2024 at 07:43:48PM -0400, Jason Gunthorpe wrote: > > Continuing the work of part 1 this focuses on the CD, PASID and SVA > > components: > > > > - attach_dev failure does not change the HW configuration. > > > > - Full PASID API support including: > > - S1/SVA domains attached to PASIDs > > - IDENTITY/BLOCKED/S1 attached to RID > > - Change of the RID domain while PASIDs are attached > > > > - Streamlined SVA support using the core infrastructure > > > > - Hitless, whenever possible, change between two domains > > > > Making the CD programming work like the new STE programming allows > > untangling some of the confusing SVA flows. From there the focus is on > > building out the core infrastructure for dealing with PASID and CD > > entries, then keeping track of unique SSID's for ATS invalidation. > > > > The ATS ordering is generalized so that the PASID flow can use it and put > > into a form where it is fully hitless, whenever possible. Care is taken to > > ensure that ATC flushes are present after any change in translation. > > > > Finally we simply kill the entire outdated SVA mmu_notifier > implementation > > in one shot and switch it over to the newly created generic PASID & CD > > code. This avoids the messy and confusing approach of trying to > > incrementally untangle this in place. The new code is small and simple > > enough this is much better than trying to figure out smaller steps. > > > > Once SVA is resting on the right CD code it is straightforward to make the > > PASID interface functionally complete. > > > > It achieves the same goals as the several series from Michael and the S1DSS > > series from Nicolin that were trying to improve portions of the API. > > > > This is on github: > > https://github.com/jgunthorpe/linux/commits/smmuv3_newapi > > Testing on qemu[1], with the same VMM Shameer tested with[2]: > qemu/build/qemu-system-aarch64 -M virt -machine virt,gic- > version=3,iommu=nested-smmuv3,iommufd=iommufd0 \ > -cpu cortex-a53,pmu=off -smp 1 -m 2048 \ > -kernel Image \ > -drive file=rootfs.ext4,if=virtio,format=raw \ > -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng- > pci,rng=rng0 -nographic \ > -append 'console=ttyAMA0 rootwait root=/dev/vda' \ > -device virtio-scsi-pci,id=scsi0 \ > -device ioh3420,id=pcie.1,chassis=1 \ > -object iommufd,id=iommufd0 \ > -device vfio-pci,host=0000:00:03.0,iommufd=iommufd0 > > I see the following panic: I think that is probably because you are testing with "nested-smmuv3". This series not yet fully enable that. For that, I think you are missing few patches from Nicolin's iommufd branch, https://github.com/nicolinc/iommufd/commits/wip/iommufd_nesting-03112024/ Thanks, Shameer _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> -----Original Message----- > From: Mostafa Saleh <smostafa@google.com> > Sent: Monday, March 25, 2024 10:22 AM > To: Jason Gunthorpe <jgg@nvidia.com> > Cc: iommu@lists.linux.dev; Joerg Roedel <joro@8bytes.org>; linux-arm- > kernel@lists.infradead.org; Robin Murphy <robin.murphy@arm.com>; Will > Deacon <will@kernel.org>; Eric Auger <eric.auger@redhat.com>; Jean- > Philippe Brucker <jean-philippe@linaro.org>; Moritz Fischer > <mdf@kernel.org>; Michael Shavit <mshavit@google.com>; Nicolin Chen > <nicolinc@nvidia.com>; patches@lists.linux.dev; Shameerali Kolothum Thodi > <shameerali.kolothum.thodi@huawei.com> > Subject: Re: [PATCH v5 00/27] Update SMMUv3 to the modern iommu API > (part 2/3) > > Hi Jason, > > On Mon, Mar 04, 2024 at 07:43:48PM -0400, Jason Gunthorpe wrote: > > Continuing the work of part 1 this focuses on the CD, PASID and SVA > > components: > > > > - attach_dev failure does not change the HW configuration. > > > > - Full PASID API support including: > > - S1/SVA domains attached to PASIDs > > - IDENTITY/BLOCKED/S1 attached to RID > > - Change of the RID domain while PASIDs are attached > > > > - Streamlined SVA support using the core infrastructure > > > > - Hitless, whenever possible, change between two domains > > > > Making the CD programming work like the new STE programming allows > > untangling some of the confusing SVA flows. From there the focus is on > > building out the core infrastructure for dealing with PASID and CD > > entries, then keeping track of unique SSID's for ATS invalidation. > > > > The ATS ordering is generalized so that the PASID flow can use it and put > > into a form where it is fully hitless, whenever possible. Care is taken to > > ensure that ATC flushes are present after any change in translation. > > > > Finally we simply kill the entire outdated SVA mmu_notifier > implementation > > in one shot and switch it over to the newly created generic PASID & CD > > code. This avoids the messy and confusing approach of trying to > > incrementally untangle this in place. The new code is small and simple > > enough this is much better than trying to figure out smaller steps. > > > > Once SVA is resting on the right CD code it is straightforward to make the > > PASID interface functionally complete. > > > > It achieves the same goals as the several series from Michael and the S1DSS > > series from Nicolin that were trying to improve portions of the API. > > > > This is on github: > > https://github.com/jgunthorpe/linux/commits/smmuv3_newapi > > Testing on qemu[1], with the same VMM Shameer tested with[2]: > qemu/build/qemu-system-aarch64 -M virt -machine virt,gic- > version=3,iommu=nested-smmuv3,iommufd=iommufd0 \ > -cpu cortex-a53,pmu=off -smp 1 -m 2048 \ > -kernel Image \ > -drive file=rootfs.ext4,if=virtio,format=raw \ > -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng- > pci,rng=rng0 -nographic \ > -append 'console=ttyAMA0 rootwait root=/dev/vda' \ > -device virtio-scsi-pci,id=scsi0 \ > -device ioh3420,id=pcie.1,chassis=1 \ > -object iommufd,id=iommufd0 \ > -device vfio-pci,host=0000:00:03.0,iommufd=iommufd0 > > I see the following panic: I think that is probably because you are testing with "nested-smmuv3". This series not yet fully enable that. For that, I think you are missing few patches from Nicolin's iommufd branch, https://github.com/nicolinc/iommufd/commits/wip/iommufd_nesting-03112024/ Thanks, Shameer
> -----Original Message----- > From: SeongJae Park <sj@kernel.org> > Sent: Saturday, March 23, 2024 12:03 AM > To: Prasad, Aravinda <aravinda.prasad@intel.com> > Cc: SeongJae Park <sj@kernel.org>; damon@lists.linux.dev; linux- > mm@kvack.org; linux-kernel@vger.kernel.org; s2322819@ed.ac.uk; Kumar, > Sandeep4 <sandeep4.kumar@intel.com>; Huang, Ying <ying.huang@intel.com>; > Hansen, Dave <dave.hansen@intel.com>; Williams, Dan J > <dan.j.williams@intel.com>; Subramoney, Sreenivas > <sreenivas.subramoney@intel.com>; Kervinen, Antti <antti.kervinen@intel.com>; > Kanevskiy, Alexander <alexander.kanevskiy@intel.com> > Subject: RE: [PATCH v2 0/3] mm/damon: Profiling enhancements for DAMON > > On Fri, 22 Mar 2024 12:12:09 +0000 "Prasad, Aravinda" > <aravinda.prasad@intel.com> wrote: > > [...] > > > > For large regions (say 10GB, that has 2,621,440 4K pages), > > > > sampling at PTE level will not cover a good portion of the region. > > > > For example, default 5ms sampling and 100ms aggregation samples > > > > only 20 4K pages in an aggregation interval. > > > > > > If the 20 attempts all failed at finding any single accessed 4K > > > page, I think it roughly means less than 5% of the region is > > > accessed within the user-specified time (aggregation interval). I > > > would translate that as only tiny portion of the > > I now find the above sentence is not correct. Sorry, my bad. Let me re-write. > > I think it roughly means the workload is not accessing the region in a frequency > that high enough for DAMON to observe within the user-specified time (sampling > interval). > > > > region is accessed within the user-specified time, and hence DAMON > > > is ok to say the region is nearly not accessed. > > > > I am looking at it from the other way: > > > > To detect if a region is hot or cold at least 1% of the pages in the > > region should be sampled. For a 10GB region (with 2,621,440 4K pages) > > this requires sampling at least 26,214 pages. For a 100GB region this > > will require sampling at least > > 262,144 pages. > > Why do you think 1% of the pages should be sampled? 1% is just an example. > > DAMON defines the region as an address range that contains pages having similar > access frequency. Hence if we see a page was accessed within a given time > interval, we can assume all pages in the page is also accessed within the interval, > and vice versa. That's why we sample only single page per region, and how > DAMON's monitoring overhead can be controlled regardless of the size of the > monitoring target memory. Initially when DAMON creates "min" regions, it does not consider access frequency. They are created by diving the address space. So, at the beginning, these regions need not have pages with similar access frequency. But eventually, as regions are split and merged then regions are formed that have similar access frequency. We observe that hot sets are spread across the address space of the application and many times, only a portion of the DAMON created regions contain a hot data as per the application's access pattern. In such cases a single sample per region is not enough. For small memory footprint applications with small region size, I agree there are absolutely no issues (also confirmed by our experiments). But for large footprint applications (1TB+) that can have large regions (50GB+) we see these issues. > > To detect if the region is hot or cold, DAMON continues sampling multiple times > and use number of sampling intervals that seen the access to the region > (nr_accesses) as the relative hotness of the region. Hence, how many sampling is > required depends on what precision of the relative hotness the user wants. > The size of the region doesn't matter here. > > Am I missing something? As mentioned before all these are working fine for small footprint applications (<100GB). But as we go beyond 1TB footprint we start seeing issues. I can show you a demo on 1TB+ footprint applications. > > > > > If we sample at 5ms, this takes 131.072 seconds to cover 1% of 10GB > > and 1310.72 seconds to cover 100GB. > > > > DAMON shows that the selected page as accessed if that page was > > accessed during the 5ms sampling window. Now if we increase the > > sampling to 20ms to improve access detection, then covering 1% of the region > takes even longer. > > > > > > > > > Increasing sampling to 1 ms and aggregation to 1 second can only > > > > cover > > > > 1000 4K pages, but results in higher CPU overheads due to frequent > sampling. > > > > Even increasing the aggregation interval to 60 seconds but > > > > sampling at 5ms can only cover 12000 samples, but region splitting > > > > and merging happens once in 60 seconds. > > > > > > At the beginning of each sampling interval, DAMON randomly picks one > > > page per region, clear their accessed bits, wait until the sampling > > > interval is finished, and check the accessed bits again. In other > > > words, DAMON shows only accesses that made in last sampling interval. > > > > Yes, I see this in the code: > > > > while(time < aggregation_interval) > > { > > clear_access_bit > > sleep(sampling_time) > > check_access_bit > > } > > > > I would suggest this logic instead. > > > > while(time < aggregation_interval) > > { > > Number_of_samples = aggregation_interval / sampling_time; > > > > for (i = 0, I < number_of_samples; i++) > > { > > clear_access_bit > > } > > > > sleep(aggregation_time) > > > > for (i = 0, I < number_of_samples; i++) > > { > > check_access_bit > > } > > } > > > > This can help in better access detection. I am sure you would > > have already explored it. > > The way to detect the access in the region is implemented by each monitoring > operations set (vaddr, fvaddr, and paddr). We could implement yet another > monitoring operations set with a new access detection method. Nonetheless, I > think changing existing monitoring operations sets to use this suggestion while > keeping their concepts would be not easy. Agree. > > > > > > > > > Increasing number of samples per aggregation interval can help DAMON > > > knows the access frequency of regions in finer granularity, but > > > doesn't allow DAMON see more accesses. Rather than that, if the > > > aggregation interval is fixed (reducing sampling interval), DAMON can show > even less amount of accesses. > > > > > > What we need here is giving the workload longer sampling time so > > > that the workload can make access to a size of memory regions that > > > large enough to be found by DAMON. > > > > But even with longer sampling time, we may miss the access. For > > example, consider all the pages in the region are accessed > > sequentially. Now if DAMON samples a different page other than the > > page that is being accessed it will miss. Now even if we have longer sampling > time it is possible that none of the accesses are detected. > > If there was accesses to some pages of the region but unaccessed page has > picked as the sampling target, someone could say only a tiny portion of the region > is accessed, so we can treat the region as not accessed at all. That's at least what > the monitoring operations set you use here ('vaddr') thinks. > > [...] > > > Also, if we can allow large enough age, the random region split will > > > eventually find the small hot regions even without high level > > > accessed bit hint. Of course the hint could help finding it > > > earlier. I think that was one of my comment on the first version of this patch. > > > > The problem is that a large region that is split is immediately merged > > as the split regions have access count zero. > > > > We observe that large regions are never getting split at all due to this. > > I understand this is a valid concern. Especially because we currently split each > region into two sub-regions, finding small hot memory region in the middle of a > huge region could be challenging. This concern has raised before DAMON has > merged into the mainline by Jonathan Cameron. There was also a research from > my previous colleague saying incresing the sub-regions for each split improves the > accuracy. Nonetheless, it increases overall number of regions and hence > increased the overhead. And we didn't get real issue due to this from the > production so far, so we still keeping the old behavior. I'm thinking about a way to > make this better. These issues are observed only when memory footprint is large enough (1TB+). Production systems may not be using such large footprint applications yet. > > That said, the real system would have more than the single region, and the access > pattern will be more dynamic. It will cause the region to be merged and split in > more random and chaotic way. Hence I think there is still a chance to find the > small hot portion eventually. Also, the sampling regions are picked randomly. A > page of the small hot portion will eventually picked as sampling target, even > multiple times, and at least reset the 'age' of the region. > > I sometimes turn on DAMON to monitor entire physical address space (about 128 > GiB) of my machine and run no active workload but just a few background > deamons. So the system would have only small amount of accesses. At the > beginning, the monitoring output shows all regions as not accessed (nr_accesses > 0) and having same 'age'. But as time goes by, the regions are still showing no > access (nr_accesses 0), but different ages and sizes. Have not tired with physical address space monitoring. But for "vaddr", we see DAMON working good up to 100GB footprint. > > Again, I'm not saying existing monitoring mechanism is perfect and optimum. We > should continue optimizing it. Nonetheless, the current accuracy is not perfectly > proved to be too awful to be used in real world. I know at least a few unnamed > production usages of DAMON, and they didn't complained about DAMON's > accuracy so far. We see this problem very consistently on large footprint applications, so could be working fine for small footprint applications in production. Regards, Aravinda > > > Thanks, > SJ > > > > > Regards, > > Aravinda > [...]
> -----Original Message----- > From: Marcel Ziswiler <marcel@ziswiler.com> > Sent: 2024年3月22日 21:07 > To: linux-phy@lists.infradead.org > Cc: dl-linux-imx <linux-imx@nxp.com>; Lucas Stach <l.stach@pengutronix.de>; > linux-arm-kernel@lists.infradead.org; kernel@pengutronix.de; Hongxing Zhu > <hongxing.zhu@nxp.com>; linux-kernel@vger.kernel.org; Marcel Ziswiler > <marcel.ziswiler@toradex.com>; Fabio Estevam <festevam@gmail.com>; Heiko > Stuebner <heiko@sntech.de>; Kishon Vijay Abraham I <kishon@kernel.org>; > Marc Kleine-Budde <mkl@pengutronix.de>; Rob Herring <robh@kernel.org>; > Sascha Hauer <s.hauer@pengutronix.de>; Shawn Guo <shawnguo@kernel.org>; > tharvey@gateworks.com; Vinod Koul <vkoul@kernel.org>; Yang Li > <yang.lee@linux.alibaba.com>; imx@lists.linux.dev > Subject: [PATCH v1 1/1] phy: freescale: imx8m-pcie: fix pcie link-up instability > > From: Marcel Ziswiler <marcel.ziswiler@toradex.com> > > Leaving AUX_PLL_REFCLK_SEL at its reset default of AUX_IN (PLL clock) proves to > be more stable on the i.MX 8M Mini. > > Fixes: 1aa97b002258 ("phy: freescale: pcie: Initialize the imx8 pcie standalone > phy driver") > Hi Marcel I took look back at the validation codes. i.MX8MM PCIe doesn't configure cmn_reg063 (offset: 0x18C) indeed. It's my bad to treat i.MX8MM same as i.MX8MP refer to my assumption on the literal meaning of these bit definitions. Reviewed-by: Richard Zhu <hongxing.zhu@nxp.com> Best Regards Richard Zhu > Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> > --- > > drivers/phy/freescale/phy-fsl-imx8m-pcie.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > b/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > index b700f52b7b67..11fcb1867118 100644 > --- a/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > +++ b/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > @@ -110,8 +110,10 @@ static int imx8_pcie_phy_power_on(struct phy *phy) > /* Source clock from SoC internal PLL */ > writel(ANA_PLL_CLK_OUT_TO_EXT_IO_SEL, > imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG062); > - writel(AUX_PLL_REFCLK_SEL_SYS_PLL, > - imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG063); > + if (imx8_phy->drvdata->variant != IMX8MM) { > + writel(AUX_PLL_REFCLK_SEL_SYS_PLL, > + imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG063); > + } > val = ANA_AUX_RX_TX_SEL_TX | ANA_AUX_TX_TERM; > writel(val | ANA_AUX_RX_TERM_GND_EN, > imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG064); > -- > 2.44.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> -----Original Message----- > From: Marcel Ziswiler <marcel@ziswiler.com> > Sent: 2024年3月22日 21:07 > To: linux-phy@lists.infradead.org > Cc: dl-linux-imx <linux-imx@nxp.com>; Lucas Stach <l.stach@pengutronix.de>; > linux-arm-kernel@lists.infradead.org; kernel@pengutronix.de; Hongxing Zhu > <hongxing.zhu@nxp.com>; linux-kernel@vger.kernel.org; Marcel Ziswiler > <marcel.ziswiler@toradex.com>; Fabio Estevam <festevam@gmail.com>; Heiko > Stuebner <heiko@sntech.de>; Kishon Vijay Abraham I <kishon@kernel.org>; > Marc Kleine-Budde <mkl@pengutronix.de>; Rob Herring <robh@kernel.org>; > Sascha Hauer <s.hauer@pengutronix.de>; Shawn Guo <shawnguo@kernel.org>; > tharvey@gateworks.com; Vinod Koul <vkoul@kernel.org>; Yang Li > <yang.lee@linux.alibaba.com>; imx@lists.linux.dev > Subject: [PATCH v1 1/1] phy: freescale: imx8m-pcie: fix pcie link-up instability > > From: Marcel Ziswiler <marcel.ziswiler@toradex.com> > > Leaving AUX_PLL_REFCLK_SEL at its reset default of AUX_IN (PLL clock) proves to > be more stable on the i.MX 8M Mini. > > Fixes: 1aa97b002258 ("phy: freescale: pcie: Initialize the imx8 pcie standalone > phy driver") > Hi Marcel I took look back at the validation codes. i.MX8MM PCIe doesn't configure cmn_reg063 (offset: 0x18C) indeed. It's my bad to treat i.MX8MM same as i.MX8MP refer to my assumption on the literal meaning of these bit definitions. Reviewed-by: Richard Zhu <hongxing.zhu@nxp.com> Best Regards Richard Zhu > Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> > --- > > drivers/phy/freescale/phy-fsl-imx8m-pcie.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > b/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > index b700f52b7b67..11fcb1867118 100644 > --- a/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > +++ b/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > @@ -110,8 +110,10 @@ static int imx8_pcie_phy_power_on(struct phy *phy) > /* Source clock from SoC internal PLL */ > writel(ANA_PLL_CLK_OUT_TO_EXT_IO_SEL, > imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG062); > - writel(AUX_PLL_REFCLK_SEL_SYS_PLL, > - imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG063); > + if (imx8_phy->drvdata->variant != IMX8MM) { > + writel(AUX_PLL_REFCLK_SEL_SYS_PLL, > + imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG063); > + } > val = ANA_AUX_RX_TX_SEL_TX | ANA_AUX_TX_TERM; > writel(val | ANA_AUX_RX_TERM_GND_EN, > imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG064); > -- > 2.44.0 -- linux-phy mailing list linux-phy@lists.infradead.org https://lists.infradead.org/mailman/listinfo/linux-phy
> -----Original Message----- > From: Marcel Ziswiler <marcel@ziswiler.com> > Sent: 2024年3月22日 21:07 > To: linux-phy@lists.infradead.org > Cc: dl-linux-imx <linux-imx@nxp.com>; Lucas Stach <l.stach@pengutronix.de>; > linux-arm-kernel@lists.infradead.org; kernel@pengutronix.de; Hongxing Zhu > <hongxing.zhu@nxp.com>; linux-kernel@vger.kernel.org; Marcel Ziswiler > <marcel.ziswiler@toradex.com>; Fabio Estevam <festevam@gmail.com>; Heiko > Stuebner <heiko@sntech.de>; Kishon Vijay Abraham I <kishon@kernel.org>; > Marc Kleine-Budde <mkl@pengutronix.de>; Rob Herring <robh@kernel.org>; > Sascha Hauer <s.hauer@pengutronix.de>; Shawn Guo <shawnguo@kernel.org>; > tharvey@gateworks.com; Vinod Koul <vkoul@kernel.org>; Yang Li > <yang.lee@linux.alibaba.com>; imx@lists.linux.dev > Subject: [PATCH v1 1/1] phy: freescale: imx8m-pcie: fix pcie link-up instability > > From: Marcel Ziswiler <marcel.ziswiler@toradex.com> > > Leaving AUX_PLL_REFCLK_SEL at its reset default of AUX_IN (PLL clock) proves to > be more stable on the i.MX 8M Mini. > > Fixes: 1aa97b002258 ("phy: freescale: pcie: Initialize the imx8 pcie standalone > phy driver") > Hi Marcel I took look back at the validation codes. i.MX8MM PCIe doesn't configure cmn_reg063 (offset: 0x18C) indeed. It's my bad to treat i.MX8MM same as i.MX8MP refer to my assumption on the literal meaning of these bit definitions. Reviewed-by: Richard Zhu <hongxing.zhu@nxp.com> Best Regards Richard Zhu > Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> > --- > > drivers/phy/freescale/phy-fsl-imx8m-pcie.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > b/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > index b700f52b7b67..11fcb1867118 100644 > --- a/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > +++ b/drivers/phy/freescale/phy-fsl-imx8m-pcie.c > @@ -110,8 +110,10 @@ static int imx8_pcie_phy_power_on(struct phy *phy) > /* Source clock from SoC internal PLL */ > writel(ANA_PLL_CLK_OUT_TO_EXT_IO_SEL, > imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG062); > - writel(AUX_PLL_REFCLK_SEL_SYS_PLL, > - imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG063); > + if (imx8_phy->drvdata->variant != IMX8MM) { > + writel(AUX_PLL_REFCLK_SEL_SYS_PLL, > + imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG063); > + } > val = ANA_AUX_RX_TX_SEL_TX | ANA_AUX_TX_TERM; > writel(val | ANA_AUX_RX_TERM_GND_EN, > imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG064); > -- > 2.44.0
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: Hans Verkuil <hverkuil@xs4all.nl> tree: git://linuxtv.org/hverkuil/media_tree.git vivid-cec head: bfe9974b584040f6df7aebada2a3b6a61d0dbb67 commit: 514333e776cd80413971a91ce668634fe7e030c3 [59/62] vivid: drop display_present control, route EDIDs correctly :::::: branch date: 3 days ago :::::: commit date: 3 days ago config: arc-randconfig-r071-20240325 (https://download.01.org/0day-ci/archive/20240325/202403251134.rCvdEVfY-lkp@intel.com/config) compiler: arceb-elf-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403251134.rCvdEVfY-lkp@intel.com/ smatch warnings: drivers/media/test-drivers/vivid/vivid-vid-cap.c:1570 vivid_update_connected_outputs() warn: variable dereferenced before check 'dev_tx' (see line 1569) vim +/dev_tx +1570 drivers/media/test-drivers/vivid/vivid-vid-cap.c 514333e776cd80 Hans Verkuil 2024-03-22 1553 514333e776cd80 Hans Verkuil 2024-03-22 1554 void vivid_update_connected_outputs(struct vivid_dev *dev) 514333e776cd80 Hans Verkuil 2024-03-22 1555 { 514333e776cd80 Hans Verkuil 2024-03-22 1556 u16 phys_addr = cec_get_edid_phys_addr(dev->edid, dev->edid_blocks * 128, NULL); 514333e776cd80 Hans Verkuil 2024-03-22 1557 514333e776cd80 Hans Verkuil 2024-03-22 1558 for (unsigned int i = 0, j = 0; i < dev->num_inputs; i++) { 514333e776cd80 Hans Verkuil 2024-03-22 1559 unsigned int menu_idx = 514333e776cd80 Hans Verkuil 2024-03-22 1560 dev->input_is_connected_to_output[i]; 514333e776cd80 Hans Verkuil 2024-03-22 1561 514333e776cd80 Hans Verkuil 2024-03-22 1562 if (dev->input_type[i] != HDMI) 514333e776cd80 Hans Verkuil 2024-03-22 1563 continue; 514333e776cd80 Hans Verkuil 2024-03-22 1564 j++; 514333e776cd80 Hans Verkuil 2024-03-22 1565 if (menu_idx < FIXED_MENU_ITEMS) 514333e776cd80 Hans Verkuil 2024-03-22 1566 continue; 514333e776cd80 Hans Verkuil 2024-03-22 1567 struct vivid_dev *dev_tx = vivid_ctrl_hdmi_to_output_instance[menu_idx]; 514333e776cd80 Hans Verkuil 2024-03-22 1568 unsigned int output = vivid_ctrl_hdmi_to_output_index[menu_idx]; 514333e776cd80 Hans Verkuil 2024-03-22 @1569 unsigned int hdmi_output = dev_tx->output_to_iface_index[output]; 514333e776cd80 Hans Verkuil 2024-03-22 @1570 if (!dev_tx) 514333e776cd80 Hans Verkuil 2024-03-22 1571 continue; 514333e776cd80 Hans Verkuil 2024-03-22 1572 vivid_update_outputs(dev_tx); 514333e776cd80 Hans Verkuil 2024-03-22 1573 if (dev->edid_blocks) { 514333e776cd80 Hans Verkuil 2024-03-22 1574 cec_s_phys_addr(dev_tx->cec_tx_adap[hdmi_output], 514333e776cd80 Hans Verkuil 2024-03-22 1575 v4l2_phys_addr_for_input(phys_addr, j), 514333e776cd80 Hans Verkuil 2024-03-22 1576 false); 514333e776cd80 Hans Verkuil 2024-03-22 1577 } else { 514333e776cd80 Hans Verkuil 2024-03-22 1578 cec_phys_addr_invalidate(dev_tx->cec_tx_adap[hdmi_output]); 514333e776cd80 Hans Verkuil 2024-03-22 1579 } 514333e776cd80 Hans Verkuil 2024-03-22 1580 } 514333e776cd80 Hans Verkuil 2024-03-22 1581 } 514333e776cd80 Hans Verkuil 2024-03-22 1582 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: linux-kernel@vger.kernel.org TO: Trond Myklebust <trond.myklebust@hammerspace.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 4cece764965020c22cff7665b18a012006359095 commit: 1d97316692f708de755655ac1cfd704d7a55843f SUNRPC: Fix up xdr_read_pages() to take arbitrary object lengths date: 3 years, 4 months ago :::::: branch date: 6 hours ago :::::: commit date: 3 years, 4 months ago config: x86_64-randconfig-102-20240324 (https://download.01.org/0day-ci/archive/20240325/202403251147.waqPmwFw-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403251147.waqPmwFw-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> net/sunrpc/xdr.c:1248:12-14: WARNING opportunity for min() vim +1248 net/sunrpc/xdr.c 3994ee6fbf5185 Trond Myklebust 2012-06-26 1220 ^1da177e4c3f41 Linus Torvalds 2005-04-16 1221 /** 1d97316692f708 Trond Myklebust 2020-11-20 1222 * xdr_read_pages - align page-based XDR data to current pointer position ^1da177e4c3f41 Linus Torvalds 2005-04-16 1223 * @xdr: pointer to xdr_stream struct ^1da177e4c3f41 Linus Torvalds 2005-04-16 1224 * @len: number of bytes of page data ^1da177e4c3f41 Linus Torvalds 2005-04-16 1225 * ^1da177e4c3f41 Linus Torvalds 2005-04-16 1226 * Moves data beyond the current pointer position from the XDR head[] buffer 1d97316692f708 Trond Myklebust 2020-11-20 1227 * into the page list. Any data that lies beyond current position + @len 1d97316692f708 Trond Myklebust 2020-11-20 1228 * bytes is moved into the XDR tail[]. The xdr_stream current position is 1d97316692f708 Trond Myklebust 2020-11-20 1229 * then advanced past that data to align to the next XDR object in the tail. 3994ee6fbf5185 Trond Myklebust 2012-06-26 1230 * 3994ee6fbf5185 Trond Myklebust 2012-06-26 1231 * Returns the number of XDR encoded bytes now contained in the pages ^1da177e4c3f41 Linus Torvalds 2005-04-16 1232 */ 3994ee6fbf5185 Trond Myklebust 2012-06-26 1233 unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len) ^1da177e4c3f41 Linus Torvalds 2005-04-16 1234 { 1d97316692f708 Trond Myklebust 2020-11-20 1235 unsigned int nwords = XDR_QUADLEN(len); 1d97316692f708 Trond Myklebust 2020-11-20 1236 unsigned int base, end, pglen; ^1da177e4c3f41 Linus Torvalds 2005-04-16 1237 1d97316692f708 Trond Myklebust 2020-11-20 1238 pglen = xdr_align_pages(xdr, nwords << 2); 1d97316692f708 Trond Myklebust 2020-11-20 1239 if (pglen == 0) 3994ee6fbf5185 Trond Myklebust 2012-06-26 1240 return 0; bd00f84bc57f42 Trond Myklebust 2012-06-26 1241 1d97316692f708 Trond Myklebust 2020-11-20 1242 xdr->nwords -= nwords; 1d97316692f708 Trond Myklebust 2020-11-20 1243 base = (nwords << 2) - pglen; 1d97316692f708 Trond Myklebust 2020-11-20 1244 end = xdr_stream_remaining(xdr) - pglen; 1d97316692f708 Trond Myklebust 2020-11-20 1245 1d97316692f708 Trond Myklebust 2020-11-20 1246 if (xdr_set_iov(xdr, xdr->buf->tail, base, end) == 0) 1d97316692f708 Trond Myklebust 2020-11-20 1247 xdr->nwords = 0; 1d97316692f708 Trond Myklebust 2020-11-20 @1248 return len <= pglen ? len : pglen; ^1da177e4c3f41 Linus Torvalds 2005-04-16 1249 } 468039ee469c57 Trond Myklebust 2008-12-23 1250 EXPORT_SYMBOL_GPL(xdr_read_pages); ^1da177e4c3f41 Linus Torvalds 2005-04-16 1251 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Hello: This patch was applied to chrome-platform/linux.git (for-next) by Bartosz Golaszewski <bartosz.golaszewski@linaro.org>: On Mon, 19 Feb 2024 20:52:27 -0800 you wrote: > The ChromeOS embedded controller (EC) supports setting the state of > GPIOs when the system is unlocked, and getting the state of GPIOs in all > cases. The GPIOs are on the EC itself, so the EC acts similar to a GPIO > expander. Add a driver to get and set the GPIOs on the EC through the > host command interface. > > Cc: Lee Jones <lee@kernel.org> > Cc: Linus Walleij <linus.walleij@linaro.org> > Cc: Bartosz Golaszewski <brgl@bgdev.pl> > Cc: Benson Leung <bleung@chromium.org> > Cc: Guenter Roeck <groeck@chromium.org> > Cc: <linux-gpio@vger.kernel.org> > Cc: <chrome-platform@lists.linux.dev> > Cc: Pin-yen Lin <treapking@chromium.org> > Signed-off-by: Stephen Boyd <swboyd@chromium.org> > > [...] Here is the summary with links: - [v2] gpio: Add ChromeOS EC GPIO driver https://git.kernel.org/chrome-platform/c/f837fe1bffe6 You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html
Hello: This patch was applied to chrome-platform/linux.git (for-kernelci) by Bartosz Golaszewski <bartosz.golaszewski@linaro.org>: On Mon, 19 Feb 2024 20:52:27 -0800 you wrote: > The ChromeOS embedded controller (EC) supports setting the state of > GPIOs when the system is unlocked, and getting the state of GPIOs in all > cases. The GPIOs are on the EC itself, so the EC acts similar to a GPIO > expander. Add a driver to get and set the GPIOs on the EC through the > host command interface. > > Cc: Lee Jones <lee@kernel.org> > Cc: Linus Walleij <linus.walleij@linaro.org> > Cc: Bartosz Golaszewski <brgl@bgdev.pl> > Cc: Benson Leung <bleung@chromium.org> > Cc: Guenter Roeck <groeck@chromium.org> > Cc: <linux-gpio@vger.kernel.org> > Cc: <chrome-platform@lists.linux.dev> > Cc: Pin-yen Lin <treapking@chromium.org> > Signed-off-by: Stephen Boyd <swboyd@chromium.org> > > [...] Here is the summary with links: - [v2] gpio: Add ChromeOS EC GPIO driver https://git.kernel.org/chrome-platform/c/f837fe1bffe6 You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html
From: David Howells <dhowells@redhat.com> [ Upstream commit f3dc1bdb6b0b0693562c7c54a6c28bafa608ba3c ] cifs writeback doesn't correctly handle the case where cifs_extend_writeback() hits a point where it is considering an additional folio, but this would overrun the wsize - at which point it drops out of the xarray scanning loop and calls xas_pause(). The problem is that xas_pause() advances the loop counter - thereby skipping that page. What needs to happen is for xas_reset() to be called any time we decide we don't want to process the page we're looking at, but rather send the request we are building and start a new one. Fix this by copying and adapting the netfslib writepages code as a temporary measure, with cifs writeback intending to be offloaded to netfslib in the near future. This also fixes the issue with the use of filemap_get_folios_tag() causing retry of a bunch of pages which the extender already dealt with. This can be tested by creating, say, a 64K file somewhere not on cifs (otherwise copy-offload may get underfoot), mounting a cifs share with a wsize of 64000, copying the file to it and then comparing the original file and the copy: dd if=/dev/urandom of=/tmp/64K bs=64k count=1 mount //192.168.6.1/test /mnt -o user=...,pass=...,wsize=64000 cp /tmp/64K /mnt/64K cmp /tmp/64K /mnt/64K Without the fix, the cmp fails at position 64000 (or shortly thereafter). Fixes: d08089f649a0 ("cifs: Change the I/O paths to use an iterator rather than a page list") Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Paulo Alcantara <pc@manguebit.com> cc: Ronnie Sahlberg <ronniesahlberg@gmail.com> cc: Shyam Prasad N <sprasad@microsoft.com> cc: Tom Talpey <tom@talpey.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: samba-technical@lists.samba.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Sasha Levin <sashal@kernel.org> --- fs/smb/client/file.c | 283 ++++++++++++++++++++++++------------------- 1 file changed, 157 insertions(+), 126 deletions(-) diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 7320272ef0074..c156460eb5587 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2622,20 +2622,20 @@ static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to) * dirty pages if possible, but don't sleep while doing so. */ static void cifs_extend_writeback(struct address_space *mapping, + struct xa_state *xas, long *_count, loff_t start, int max_pages, - size_t max_len, - unsigned int *_len) + loff_t max_len, + size_t *_len) { struct folio_batch batch; struct folio *folio; - unsigned int psize, nr_pages; - size_t len = *_len; - pgoff_t index = (start + len) / PAGE_SIZE; + unsigned int nr_pages; + pgoff_t index = (start + *_len) / PAGE_SIZE; + size_t len; bool stop = true; unsigned int i; - XA_STATE(xas, &mapping->i_pages, index); folio_batch_init(&batch); @@ -2646,54 +2646,64 @@ static void cifs_extend_writeback(struct address_space *mapping, */ rcu_read_lock(); - xas_for_each(&xas, folio, ULONG_MAX) { + xas_for_each(xas, folio, ULONG_MAX) { stop = true; - if (xas_retry(&xas, folio)) + if (xas_retry(xas, folio)) continue; if (xa_is_value(folio)) break; - if (folio->index != index) + if (folio->index != index) { + xas_reset(xas); break; + } + if (!folio_try_get_rcu(folio)) { - xas_reset(&xas); + xas_reset(xas); continue; } nr_pages = folio_nr_pages(folio); - if (nr_pages > max_pages) + if (nr_pages > max_pages) { + xas_reset(xas); break; + } /* Has the page moved or been split? */ - if (unlikely(folio != xas_reload(&xas))) { + if (unlikely(folio != xas_reload(xas))) { folio_put(folio); + xas_reset(xas); break; } if (!folio_trylock(folio)) { folio_put(folio); + xas_reset(xas); break; } - if (!folio_test_dirty(folio) || folio_test_writeback(folio)) { + if (!folio_test_dirty(folio) || + folio_test_writeback(folio)) { folio_unlock(folio); folio_put(folio); + xas_reset(xas); break; } max_pages -= nr_pages; - psize = folio_size(folio); - len += psize; + len = folio_size(folio); stop = false; - if (max_pages <= 0 || len >= max_len || *_count <= 0) - stop = true; index += nr_pages; + *_count -= nr_pages; + *_len += len; + if (max_pages <= 0 || *_len >= max_len || *_count <= 0) + stop = true; + if (!folio_batch_add(&batch, folio)) break; if (stop) break; } - if (!stop) - xas_pause(&xas); + xas_pause(xas); rcu_read_unlock(); /* Now, if we obtained any pages, we can shift them to being @@ -2710,16 +2720,12 @@ static void cifs_extend_writeback(struct address_space *mapping, if (!folio_clear_dirty_for_io(folio)) WARN_ON(1); folio_start_writeback(folio); - - *_count -= folio_nr_pages(folio); folio_unlock(folio); } folio_batch_release(&batch); cond_resched(); } while (!stop); - - *_len = len; } /* @@ -2727,8 +2733,10 @@ static void cifs_extend_writeback(struct address_space *mapping, */ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, struct writeback_control *wbc, + struct xa_state *xas, struct folio *folio, - loff_t start, loff_t end) + unsigned long long start, + unsigned long long end) { struct inode *inode = mapping->host; struct TCP_Server_Info *server; @@ -2737,17 +2745,18 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, struct cifs_credits credits_on_stack; struct cifs_credits *credits = &credits_on_stack; struct cifsFileInfo *cfile = NULL; - unsigned int xid, wsize, len; - loff_t i_size = i_size_read(inode); - size_t max_len; + unsigned long long i_size = i_size_read(inode), max_len; + unsigned int xid, wsize; + size_t len = folio_size(folio); long count = wbc->nr_to_write; int rc; /* The folio should be locked, dirty and not undergoing writeback. */ + if (!folio_clear_dirty_for_io(folio)) + WARN_ON_ONCE(1); folio_start_writeback(folio); count -= folio_nr_pages(folio); - len = folio_size(folio); xid = get_xid(); server = cifs_pick_channel(cifs_sb_master_tcon(cifs_sb)->ses); @@ -2777,9 +2786,10 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, wdata->server = server; cfile = NULL; - /* Find all consecutive lockable dirty pages, stopping when we find a - * page that is not immediately lockable, is not dirty or is missing, - * or we reach the end of the range. + /* Find all consecutive lockable dirty pages that have contiguous + * written regions, stopping when we find a page that is not + * immediately lockable, is not dirty or is missing, or we reach the + * end of the range. */ if (start < i_size) { /* Trim the write to the EOF; the extra data is ignored. Also @@ -2799,19 +2809,18 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, max_pages -= folio_nr_pages(folio); if (max_pages > 0) - cifs_extend_writeback(mapping, &count, start, + cifs_extend_writeback(mapping, xas, &count, start, max_pages, max_len, &len); } - len = min_t(loff_t, len, max_len); } - - wdata->bytes = len; + len = min_t(unsigned long long, len, i_size - start); /* We now have a contiguous set of dirty pages, each with writeback * set; the first page is still locked at this point, but all the rest * have been unlocked. */ folio_unlock(folio); + wdata->bytes = len; if (start < i_size) { iov_iter_xarray(&wdata->iter, ITER_SOURCE, &mapping->i_pages, @@ -2862,102 +2871,118 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, /* * write a region of pages back to the server */ -static int cifs_writepages_region(struct address_space *mapping, - struct writeback_control *wbc, - loff_t start, loff_t end, loff_t *_next) +static ssize_t cifs_writepages_begin(struct address_space *mapping, + struct writeback_control *wbc, + struct xa_state *xas, + unsigned long long *_start, + unsigned long long end) { - struct folio_batch fbatch; + struct folio *folio; + unsigned long long start = *_start; + ssize_t ret; int skips = 0; - folio_batch_init(&fbatch); - do { - int nr; - pgoff_t index = start / PAGE_SIZE; +search_again: + /* Find the first dirty page. */ + rcu_read_lock(); - nr = filemap_get_folios_tag(mapping, &index, end / PAGE_SIZE, - PAGECACHE_TAG_DIRTY, &fbatch); - if (!nr) + for (;;) { + folio = xas_find_marked(xas, end / PAGE_SIZE, PAGECACHE_TAG_DIRTY); + if (xas_retry(xas, folio) || xa_is_value(folio)) + continue; + if (!folio) break; - for (int i = 0; i < nr; i++) { - ssize_t ret; - struct folio *folio = fbatch.folios[i]; + if (!folio_try_get_rcu(folio)) { + xas_reset(xas); + continue; + } -redo_folio: - start = folio_pos(folio); /* May regress with THPs */ + if (unlikely(folio != xas_reload(xas))) { + folio_put(folio); + xas_reset(xas); + continue; + } - /* At this point we hold neither the i_pages lock nor the - * page lock: the page may be truncated or invalidated - * (changing page->mapping to NULL), or even swizzled - * back from swapper_space to tmpfs file mapping - */ - if (wbc->sync_mode != WB_SYNC_NONE) { - ret = folio_lock_killable(folio); - if (ret < 0) - goto write_error; - } else { - if (!folio_trylock(folio)) - goto skip_write; - } + xas_pause(xas); + break; + } + rcu_read_unlock(); + if (!folio) + return 0; - if (folio->mapping != mapping || - !folio_test_dirty(folio)) { - start += folio_size(folio); - folio_unlock(folio); - continue; - } + start = folio_pos(folio); /* May regress with THPs */ - if (folio_test_writeback(folio) || - folio_test_fscache(folio)) { - folio_unlock(folio); - if (wbc->sync_mode == WB_SYNC_NONE) - goto skip_write; + /* At this point we hold neither the i_pages lock nor the page lock: + * the page may be truncated or invalidated (changing page->mapping to + * NULL), or even swizzled back from swapper_space to tmpfs file + * mapping + */ +lock_again: + if (wbc->sync_mode != WB_SYNC_NONE) { + ret = folio_lock_killable(folio); + if (ret < 0) + return ret; + } else { + if (!folio_trylock(folio)) + goto search_again; + } - folio_wait_writeback(folio); + if (folio->mapping != mapping || + !folio_test_dirty(folio)) { + start += folio_size(folio); + folio_unlock(folio); + goto search_again; + } + + if (folio_test_writeback(folio) || + folio_test_fscache(folio)) { + folio_unlock(folio); + if (wbc->sync_mode != WB_SYNC_NONE) { + folio_wait_writeback(folio); #ifdef CONFIG_CIFS_FSCACHE - folio_wait_fscache(folio); + folio_wait_fscache(folio); #endif - goto redo_folio; - } - - if (!folio_clear_dirty_for_io(folio)) - /* We hold the page lock - it should've been dirty. */ - WARN_ON(1); - - ret = cifs_write_back_from_locked_folio(mapping, wbc, folio, start, end); - if (ret < 0) - goto write_error; - - start += ret; - continue; - -write_error: - folio_batch_release(&fbatch); - *_next = start; - return ret; + goto lock_again; + } -skip_write: - /* - * Too many skipped writes, or need to reschedule? - * Treat it as a write error without an error code. - */ + start += folio_size(folio); + if (wbc->sync_mode == WB_SYNC_NONE) { if (skips >= 5 || need_resched()) { ret = 0; - goto write_error; + goto out; } - - /* Otherwise, just skip that folio and go on to the next */ skips++; - start += folio_size(folio); - continue; } + goto search_again; + } - folio_batch_release(&fbatch); - cond_resched(); - } while (wbc->nr_to_write > 0); + ret = cifs_write_back_from_locked_folio(mapping, wbc, xas, folio, start, end); +out: + if (ret > 0) + *_start = start + ret; + return ret; +} - *_next = start; - return 0; +/* + * Write a region of pages back to the server + */ +static int cifs_writepages_region(struct address_space *mapping, + struct writeback_control *wbc, + unsigned long long *_start, + unsigned long long end) +{ + ssize_t ret; + + XA_STATE(xas, &mapping->i_pages, *_start / PAGE_SIZE); + + do { + ret = cifs_writepages_begin(mapping, wbc, &xas, _start, end); + if (ret > 0 && wbc->nr_to_write > 0) + cond_resched(); + } while (ret > 0 && wbc->nr_to_write > 0); + + return ret > 0 ? 0 : ret; } /* @@ -2966,7 +2991,7 @@ static int cifs_writepages_region(struct address_space *mapping, static int cifs_writepages(struct address_space *mapping, struct writeback_control *wbc) { - loff_t start, next; + loff_t start, end; int ret; /* We have to be careful as we can end up racing with setattr() @@ -2974,28 +2999,34 @@ static int cifs_writepages(struct address_space *mapping, * to prevent it. */ - if (wbc->range_cyclic) { + if (wbc->range_cyclic && mapping->writeback_index) { start = mapping->writeback_index * PAGE_SIZE; - ret = cifs_writepages_region(mapping, wbc, start, LLONG_MAX, &next); - if (ret == 0) { - mapping->writeback_index = next / PAGE_SIZE; - if (start > 0 && wbc->nr_to_write > 0) { - ret = cifs_writepages_region(mapping, wbc, 0, - start, &next); - if (ret == 0) - mapping->writeback_index = - next / PAGE_SIZE; - } + ret = cifs_writepages_region(mapping, wbc, &start, LLONG_MAX); + if (ret < 0) + goto out; + + if (wbc->nr_to_write <= 0) { + mapping->writeback_index = start / PAGE_SIZE; + goto out; } + + start = 0; + end = mapping->writeback_index * PAGE_SIZE; + mapping->writeback_index = 0; + ret = cifs_writepages_region(mapping, wbc, &start, end); + if (ret == 0) + mapping->writeback_index = start / PAGE_SIZE; } else if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) { - ret = cifs_writepages_region(mapping, wbc, 0, LLONG_MAX, &next); + start = 0; + ret = cifs_writepages_region(mapping, wbc, &start, LLONG_MAX); if (wbc->nr_to_write > 0 && ret == 0) - mapping->writeback_index = next / PAGE_SIZE; + mapping->writeback_index = start / PAGE_SIZE; } else { - ret = cifs_writepages_region(mapping, wbc, - wbc->range_start, wbc->range_end, &next); + start = wbc->range_start; + ret = cifs_writepages_region(mapping, wbc, &start, wbc->range_end); } +out: return ret; } -- 2.43.0
From: Stephen Boyd <swboyd@chromium.org> [ Upstream commit a743f26d03a96593c0f3d05dc26b388f45de67c9 ] Per commit b3f11af9b2ce ("arm64: ftrace: forbid CALL_OPS with CC_OPTIMIZE_FOR_SIZE"), GCC is silently ignoring `-falign-functions=N` when passed `-Os`, causing functions to be improperly aligned. This doesn't seem to be a problem with Clang though, where enabling CALL_OPS with CC_OPTIMIZE_FOR_SIZE doesn't spit out any warnings at boot about misaligned patch-sites. Only forbid CALL_OPS if GCC is used and we're optimizing for size so that CALL_OPS can be used with clang optimizing for size. Cc: Jason Ling <jasonling@chromium.org> Cc: Florian Fainelli <f.fainelli@gmail.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Bill Wendling <morbo@google.com> Cc: Justin Stitt <justinstitt@google.com> Cc: llvm@lists.linux.dev Fixes: b3f11af9b2ce ("arm64: ftrace: forbid CALL_OPS with CC_OPTIMIZE_FOR_SIZE") Signed-off-by: Stephen Boyd <swboyd@chromium.org> Reviewed-by: Nathan Chancellor <nathan@kernel.org> Link: https://lore.kernel.org/r/20240223064032.3463229-1-swboyd@chromium.org Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Sasha Levin <sashal@kernel.org> --- arch/arm64/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index b5df38c2a0067..f9777ce2ccb2d 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -196,7 +196,7 @@ config ARM64 if DYNAMIC_FTRACE_WITH_ARGS && DYNAMIC_FTRACE_WITH_CALL_OPS select HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS \ if (DYNAMIC_FTRACE_WITH_ARGS && !CFI_CLANG && \ - !CC_OPTIMIZE_FOR_SIZE) + (CC_IS_CLANG || !CC_OPTIMIZE_FOR_SIZE)) select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY \ if DYNAMIC_FTRACE_WITH_ARGS select HAVE_SAMPLE_FTRACE_DIRECT -- 2.43.0
From: Ian Rogers <irogers@google.com> [ Upstream commit c7ba9d18ae47924a6ea6a47ca139779f58eb83c0 ] The child_process for addr2line sets in and out to -1 so that pipes get created. It is the caller's responsibility to close the pipes, finish_command doesn't do it. Add the missed closes. Fixes: b3801e791231 ("perf srcline: Simplify addr2line subprocess") Signed-off-by: Ian Rogers <irogers@google.com> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: James Clark <james.clark@arm.com> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: John Garry <john.g.garry@oracle.com> Cc: Tom Rix <trix@redhat.com> Cc: llvm@lists.linux.dev Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20240201001504.1348511-8-irogers@google.com Signed-off-by: Sasha Levin <sashal@kernel.org> --- tools/perf/util/srcline.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index 034b496df2978..7addc34afcf5d 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -399,6 +399,8 @@ static void addr2line_subprocess_cleanup(struct child_process *a2l) kill(a2l->pid, SIGKILL); finish_command(a2l); /* ignore result, we don't care */ a2l->pid = -1; + close(a2l->in); + close(a2l->out); } free(a2l); -- 2.43.0
From: David Howells <dhowells@redhat.com> [ Upstream commit f3dc1bdb6b0b0693562c7c54a6c28bafa608ba3c ] cifs writeback doesn't correctly handle the case where cifs_extend_writeback() hits a point where it is considering an additional folio, but this would overrun the wsize - at which point it drops out of the xarray scanning loop and calls xas_pause(). The problem is that xas_pause() advances the loop counter - thereby skipping that page. What needs to happen is for xas_reset() to be called any time we decide we don't want to process the page we're looking at, but rather send the request we are building and start a new one. Fix this by copying and adapting the netfslib writepages code as a temporary measure, with cifs writeback intending to be offloaded to netfslib in the near future. This also fixes the issue with the use of filemap_get_folios_tag() causing retry of a bunch of pages which the extender already dealt with. This can be tested by creating, say, a 64K file somewhere not on cifs (otherwise copy-offload may get underfoot), mounting a cifs share with a wsize of 64000, copying the file to it and then comparing the original file and the copy: dd if=/dev/urandom of=/tmp/64K bs=64k count=1 mount //192.168.6.1/test /mnt -o user=...,pass=...,wsize=64000 cp /tmp/64K /mnt/64K cmp /tmp/64K /mnt/64K Without the fix, the cmp fails at position 64000 (or shortly thereafter). Fixes: d08089f649a0 ("cifs: Change the I/O paths to use an iterator rather than a page list") Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Paulo Alcantara <pc@manguebit.com> cc: Ronnie Sahlberg <ronniesahlberg@gmail.com> cc: Shyam Prasad N <sprasad@microsoft.com> cc: Tom Talpey <tom@talpey.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: samba-technical@lists.samba.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Sasha Levin <sashal@kernel.org> --- fs/smb/client/file.c | 283 ++++++++++++++++++++++++------------------- 1 file changed, 157 insertions(+), 126 deletions(-) diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 7320272ef0074..c156460eb5587 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2622,20 +2622,20 @@ static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to) * dirty pages if possible, but don't sleep while doing so. */ static void cifs_extend_writeback(struct address_space *mapping, + struct xa_state *xas, long *_count, loff_t start, int max_pages, - size_t max_len, - unsigned int *_len) + loff_t max_len, + size_t *_len) { struct folio_batch batch; struct folio *folio; - unsigned int psize, nr_pages; - size_t len = *_len; - pgoff_t index = (start + len) / PAGE_SIZE; + unsigned int nr_pages; + pgoff_t index = (start + *_len) / PAGE_SIZE; + size_t len; bool stop = true; unsigned int i; - XA_STATE(xas, &mapping->i_pages, index); folio_batch_init(&batch); @@ -2646,54 +2646,64 @@ static void cifs_extend_writeback(struct address_space *mapping, */ rcu_read_lock(); - xas_for_each(&xas, folio, ULONG_MAX) { + xas_for_each(xas, folio, ULONG_MAX) { stop = true; - if (xas_retry(&xas, folio)) + if (xas_retry(xas, folio)) continue; if (xa_is_value(folio)) break; - if (folio->index != index) + if (folio->index != index) { + xas_reset(xas); break; + } + if (!folio_try_get_rcu(folio)) { - xas_reset(&xas); + xas_reset(xas); continue; } nr_pages = folio_nr_pages(folio); - if (nr_pages > max_pages) + if (nr_pages > max_pages) { + xas_reset(xas); break; + } /* Has the page moved or been split? */ - if (unlikely(folio != xas_reload(&xas))) { + if (unlikely(folio != xas_reload(xas))) { folio_put(folio); + xas_reset(xas); break; } if (!folio_trylock(folio)) { folio_put(folio); + xas_reset(xas); break; } - if (!folio_test_dirty(folio) || folio_test_writeback(folio)) { + if (!folio_test_dirty(folio) || + folio_test_writeback(folio)) { folio_unlock(folio); folio_put(folio); + xas_reset(xas); break; } max_pages -= nr_pages; - psize = folio_size(folio); - len += psize; + len = folio_size(folio); stop = false; - if (max_pages <= 0 || len >= max_len || *_count <= 0) - stop = true; index += nr_pages; + *_count -= nr_pages; + *_len += len; + if (max_pages <= 0 || *_len >= max_len || *_count <= 0) + stop = true; + if (!folio_batch_add(&batch, folio)) break; if (stop) break; } - if (!stop) - xas_pause(&xas); + xas_pause(xas); rcu_read_unlock(); /* Now, if we obtained any pages, we can shift them to being @@ -2710,16 +2720,12 @@ static void cifs_extend_writeback(struct address_space *mapping, if (!folio_clear_dirty_for_io(folio)) WARN_ON(1); folio_start_writeback(folio); - - *_count -= folio_nr_pages(folio); folio_unlock(folio); } folio_batch_release(&batch); cond_resched(); } while (!stop); - - *_len = len; } /* @@ -2727,8 +2733,10 @@ static void cifs_extend_writeback(struct address_space *mapping, */ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, struct writeback_control *wbc, + struct xa_state *xas, struct folio *folio, - loff_t start, loff_t end) + unsigned long long start, + unsigned long long end) { struct inode *inode = mapping->host; struct TCP_Server_Info *server; @@ -2737,17 +2745,18 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, struct cifs_credits credits_on_stack; struct cifs_credits *credits = &credits_on_stack; struct cifsFileInfo *cfile = NULL; - unsigned int xid, wsize, len; - loff_t i_size = i_size_read(inode); - size_t max_len; + unsigned long long i_size = i_size_read(inode), max_len; + unsigned int xid, wsize; + size_t len = folio_size(folio); long count = wbc->nr_to_write; int rc; /* The folio should be locked, dirty and not undergoing writeback. */ + if (!folio_clear_dirty_for_io(folio)) + WARN_ON_ONCE(1); folio_start_writeback(folio); count -= folio_nr_pages(folio); - len = folio_size(folio); xid = get_xid(); server = cifs_pick_channel(cifs_sb_master_tcon(cifs_sb)->ses); @@ -2777,9 +2786,10 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, wdata->server = server; cfile = NULL; - /* Find all consecutive lockable dirty pages, stopping when we find a - * page that is not immediately lockable, is not dirty or is missing, - * or we reach the end of the range. + /* Find all consecutive lockable dirty pages that have contiguous + * written regions, stopping when we find a page that is not + * immediately lockable, is not dirty or is missing, or we reach the + * end of the range. */ if (start < i_size) { /* Trim the write to the EOF; the extra data is ignored. Also @@ -2799,19 +2809,18 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, max_pages -= folio_nr_pages(folio); if (max_pages > 0) - cifs_extend_writeback(mapping, &count, start, + cifs_extend_writeback(mapping, xas, &count, start, max_pages, max_len, &len); } - len = min_t(loff_t, len, max_len); } - - wdata->bytes = len; + len = min_t(unsigned long long, len, i_size - start); /* We now have a contiguous set of dirty pages, each with writeback * set; the first page is still locked at this point, but all the rest * have been unlocked. */ folio_unlock(folio); + wdata->bytes = len; if (start < i_size) { iov_iter_xarray(&wdata->iter, ITER_SOURCE, &mapping->i_pages, @@ -2862,102 +2871,118 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, /* * write a region of pages back to the server */ -static int cifs_writepages_region(struct address_space *mapping, - struct writeback_control *wbc, - loff_t start, loff_t end, loff_t *_next) +static ssize_t cifs_writepages_begin(struct address_space *mapping, + struct writeback_control *wbc, + struct xa_state *xas, + unsigned long long *_start, + unsigned long long end) { - struct folio_batch fbatch; + struct folio *folio; + unsigned long long start = *_start; + ssize_t ret; int skips = 0; - folio_batch_init(&fbatch); - do { - int nr; - pgoff_t index = start / PAGE_SIZE; +search_again: + /* Find the first dirty page. */ + rcu_read_lock(); - nr = filemap_get_folios_tag(mapping, &index, end / PAGE_SIZE, - PAGECACHE_TAG_DIRTY, &fbatch); - if (!nr) + for (;;) { + folio = xas_find_marked(xas, end / PAGE_SIZE, PAGECACHE_TAG_DIRTY); + if (xas_retry(xas, folio) || xa_is_value(folio)) + continue; + if (!folio) break; - for (int i = 0; i < nr; i++) { - ssize_t ret; - struct folio *folio = fbatch.folios[i]; + if (!folio_try_get_rcu(folio)) { + xas_reset(xas); + continue; + } -redo_folio: - start = folio_pos(folio); /* May regress with THPs */ + if (unlikely(folio != xas_reload(xas))) { + folio_put(folio); + xas_reset(xas); + continue; + } - /* At this point we hold neither the i_pages lock nor the - * page lock: the page may be truncated or invalidated - * (changing page->mapping to NULL), or even swizzled - * back from swapper_space to tmpfs file mapping - */ - if (wbc->sync_mode != WB_SYNC_NONE) { - ret = folio_lock_killable(folio); - if (ret < 0) - goto write_error; - } else { - if (!folio_trylock(folio)) - goto skip_write; - } + xas_pause(xas); + break; + } + rcu_read_unlock(); + if (!folio) + return 0; - if (folio->mapping != mapping || - !folio_test_dirty(folio)) { - start += folio_size(folio); - folio_unlock(folio); - continue; - } + start = folio_pos(folio); /* May regress with THPs */ - if (folio_test_writeback(folio) || - folio_test_fscache(folio)) { - folio_unlock(folio); - if (wbc->sync_mode == WB_SYNC_NONE) - goto skip_write; + /* At this point we hold neither the i_pages lock nor the page lock: + * the page may be truncated or invalidated (changing page->mapping to + * NULL), or even swizzled back from swapper_space to tmpfs file + * mapping + */ +lock_again: + if (wbc->sync_mode != WB_SYNC_NONE) { + ret = folio_lock_killable(folio); + if (ret < 0) + return ret; + } else { + if (!folio_trylock(folio)) + goto search_again; + } - folio_wait_writeback(folio); + if (folio->mapping != mapping || + !folio_test_dirty(folio)) { + start += folio_size(folio); + folio_unlock(folio); + goto search_again; + } + + if (folio_test_writeback(folio) || + folio_test_fscache(folio)) { + folio_unlock(folio); + if (wbc->sync_mode != WB_SYNC_NONE) { + folio_wait_writeback(folio); #ifdef CONFIG_CIFS_FSCACHE - folio_wait_fscache(folio); + folio_wait_fscache(folio); #endif - goto redo_folio; - } - - if (!folio_clear_dirty_for_io(folio)) - /* We hold the page lock - it should've been dirty. */ - WARN_ON(1); - - ret = cifs_write_back_from_locked_folio(mapping, wbc, folio, start, end); - if (ret < 0) - goto write_error; - - start += ret; - continue; - -write_error: - folio_batch_release(&fbatch); - *_next = start; - return ret; + goto lock_again; + } -skip_write: - /* - * Too many skipped writes, or need to reschedule? - * Treat it as a write error without an error code. - */ + start += folio_size(folio); + if (wbc->sync_mode == WB_SYNC_NONE) { if (skips >= 5 || need_resched()) { ret = 0; - goto write_error; + goto out; } - - /* Otherwise, just skip that folio and go on to the next */ skips++; - start += folio_size(folio); - continue; } + goto search_again; + } - folio_batch_release(&fbatch); - cond_resched(); - } while (wbc->nr_to_write > 0); + ret = cifs_write_back_from_locked_folio(mapping, wbc, xas, folio, start, end); +out: + if (ret > 0) + *_start = start + ret; + return ret; +} - *_next = start; - return 0; +/* + * Write a region of pages back to the server + */ +static int cifs_writepages_region(struct address_space *mapping, + struct writeback_control *wbc, + unsigned long long *_start, + unsigned long long end) +{ + ssize_t ret; + + XA_STATE(xas, &mapping->i_pages, *_start / PAGE_SIZE); + + do { + ret = cifs_writepages_begin(mapping, wbc, &xas, _start, end); + if (ret > 0 && wbc->nr_to_write > 0) + cond_resched(); + } while (ret > 0 && wbc->nr_to_write > 0); + + return ret > 0 ? 0 : ret; } /* @@ -2966,7 +2991,7 @@ static int cifs_writepages_region(struct address_space *mapping, static int cifs_writepages(struct address_space *mapping, struct writeback_control *wbc) { - loff_t start, next; + loff_t start, end; int ret; /* We have to be careful as we can end up racing with setattr() @@ -2974,28 +2999,34 @@ static int cifs_writepages(struct address_space *mapping, * to prevent it. */ - if (wbc->range_cyclic) { + if (wbc->range_cyclic && mapping->writeback_index) { start = mapping->writeback_index * PAGE_SIZE; - ret = cifs_writepages_region(mapping, wbc, start, LLONG_MAX, &next); - if (ret == 0) { - mapping->writeback_index = next / PAGE_SIZE; - if (start > 0 && wbc->nr_to_write > 0) { - ret = cifs_writepages_region(mapping, wbc, 0, - start, &next); - if (ret == 0) - mapping->writeback_index = - next / PAGE_SIZE; - } + ret = cifs_writepages_region(mapping, wbc, &start, LLONG_MAX); + if (ret < 0) + goto out; + + if (wbc->nr_to_write <= 0) { + mapping->writeback_index = start / PAGE_SIZE; + goto out; } + + start = 0; + end = mapping->writeback_index * PAGE_SIZE; + mapping->writeback_index = 0; + ret = cifs_writepages_region(mapping, wbc, &start, end); + if (ret == 0) + mapping->writeback_index = start / PAGE_SIZE; } else if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) { - ret = cifs_writepages_region(mapping, wbc, 0, LLONG_MAX, &next); + start = 0; + ret = cifs_writepages_region(mapping, wbc, &start, LLONG_MAX); if (wbc->nr_to_write > 0 && ret == 0) - mapping->writeback_index = next / PAGE_SIZE; + mapping->writeback_index = start / PAGE_SIZE; } else { - ret = cifs_writepages_region(mapping, wbc, - wbc->range_start, wbc->range_end, &next); + start = wbc->range_start; + ret = cifs_writepages_region(mapping, wbc, &start, wbc->range_end); } +out: return ret; } -- 2.43.0
From: Stephen Boyd <swboyd@chromium.org> [ Upstream commit a743f26d03a96593c0f3d05dc26b388f45de67c9 ] Per commit b3f11af9b2ce ("arm64: ftrace: forbid CALL_OPS with CC_OPTIMIZE_FOR_SIZE"), GCC is silently ignoring `-falign-functions=N` when passed `-Os`, causing functions to be improperly aligned. This doesn't seem to be a problem with Clang though, where enabling CALL_OPS with CC_OPTIMIZE_FOR_SIZE doesn't spit out any warnings at boot about misaligned patch-sites. Only forbid CALL_OPS if GCC is used and we're optimizing for size so that CALL_OPS can be used with clang optimizing for size. Cc: Jason Ling <jasonling@chromium.org> Cc: Florian Fainelli <f.fainelli@gmail.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Bill Wendling <morbo@google.com> Cc: Justin Stitt <justinstitt@google.com> Cc: llvm@lists.linux.dev Fixes: b3f11af9b2ce ("arm64: ftrace: forbid CALL_OPS with CC_OPTIMIZE_FOR_SIZE") Signed-off-by: Stephen Boyd <swboyd@chromium.org> Reviewed-by: Nathan Chancellor <nathan@kernel.org> Link: https://lore.kernel.org/r/20240223064032.3463229-1-swboyd@chromium.org Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Sasha Levin <sashal@kernel.org> --- arch/arm64/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 456e8680e16ea..77dfbc8ab2d3b 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -196,7 +196,7 @@ config ARM64 if DYNAMIC_FTRACE_WITH_ARGS && DYNAMIC_FTRACE_WITH_CALL_OPS select HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS \ if (DYNAMIC_FTRACE_WITH_ARGS && !CFI_CLANG && \ - !CC_OPTIMIZE_FOR_SIZE) + (CC_IS_CLANG || !CC_OPTIMIZE_FOR_SIZE)) select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY \ if DYNAMIC_FTRACE_WITH_ARGS select HAVE_SAMPLE_FTRACE_DIRECT -- 2.43.0
From: Ian Rogers <irogers@google.com> [ Upstream commit c7ba9d18ae47924a6ea6a47ca139779f58eb83c0 ] The child_process for addr2line sets in and out to -1 so that pipes get created. It is the caller's responsibility to close the pipes, finish_command doesn't do it. Add the missed closes. Fixes: b3801e791231 ("perf srcline: Simplify addr2line subprocess") Signed-off-by: Ian Rogers <irogers@google.com> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: James Clark <james.clark@arm.com> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: John Garry <john.g.garry@oracle.com> Cc: Tom Rix <trix@redhat.com> Cc: llvm@lists.linux.dev Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20240201001504.1348511-8-irogers@google.com Signed-off-by: Sasha Levin <sashal@kernel.org> --- tools/perf/util/srcline.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index 034b496df2978..7addc34afcf5d 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -399,6 +399,8 @@ static void addr2line_subprocess_cleanup(struct child_process *a2l) kill(a2l->pid, SIGKILL); finish_command(a2l); /* ignore result, we don't care */ a2l->pid = -1; + close(a2l->in); + close(a2l->out); } free(a2l); -- 2.43.0
From: David Howells <dhowells@redhat.com> [ Upstream commit f3dc1bdb6b0b0693562c7c54a6c28bafa608ba3c ] cifs writeback doesn't correctly handle the case where cifs_extend_writeback() hits a point where it is considering an additional folio, but this would overrun the wsize - at which point it drops out of the xarray scanning loop and calls xas_pause(). The problem is that xas_pause() advances the loop counter - thereby skipping that page. What needs to happen is for xas_reset() to be called any time we decide we don't want to process the page we're looking at, but rather send the request we are building and start a new one. Fix this by copying and adapting the netfslib writepages code as a temporary measure, with cifs writeback intending to be offloaded to netfslib in the near future. This also fixes the issue with the use of filemap_get_folios_tag() causing retry of a bunch of pages which the extender already dealt with. This can be tested by creating, say, a 64K file somewhere not on cifs (otherwise copy-offload may get underfoot), mounting a cifs share with a wsize of 64000, copying the file to it and then comparing the original file and the copy: dd if=/dev/urandom of=/tmp/64K bs=64k count=1 mount //192.168.6.1/test /mnt -o user=...,pass=...,wsize=64000 cp /tmp/64K /mnt/64K cmp /tmp/64K /mnt/64K Without the fix, the cmp fails at position 64000 (or shortly thereafter). Fixes: d08089f649a0 ("cifs: Change the I/O paths to use an iterator rather than a page list") Signed-off-by: David Howells <dhowells@redhat.com> cc: Steve French <sfrench@samba.org> cc: Paulo Alcantara <pc@manguebit.com> cc: Ronnie Sahlberg <ronniesahlberg@gmail.com> cc: Shyam Prasad N <sprasad@microsoft.com> cc: Tom Talpey <tom@talpey.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cifs@vger.kernel.org cc: samba-technical@lists.samba.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Sasha Levin <sashal@kernel.org> --- fs/smb/client/file.c | 283 ++++++++++++++++++++++++------------------- 1 file changed, 157 insertions(+), 126 deletions(-) diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index f391c9b803d84..98514f2f2d7b1 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2624,20 +2624,20 @@ static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to) * dirty pages if possible, but don't sleep while doing so. */ static void cifs_extend_writeback(struct address_space *mapping, + struct xa_state *xas, long *_count, loff_t start, int max_pages, - size_t max_len, - unsigned int *_len) + loff_t max_len, + size_t *_len) { struct folio_batch batch; struct folio *folio; - unsigned int psize, nr_pages; - size_t len = *_len; - pgoff_t index = (start + len) / PAGE_SIZE; + unsigned int nr_pages; + pgoff_t index = (start + *_len) / PAGE_SIZE; + size_t len; bool stop = true; unsigned int i; - XA_STATE(xas, &mapping->i_pages, index); folio_batch_init(&batch); @@ -2648,54 +2648,64 @@ static void cifs_extend_writeback(struct address_space *mapping, */ rcu_read_lock(); - xas_for_each(&xas, folio, ULONG_MAX) { + xas_for_each(xas, folio, ULONG_MAX) { stop = true; - if (xas_retry(&xas, folio)) + if (xas_retry(xas, folio)) continue; if (xa_is_value(folio)) break; - if (folio->index != index) + if (folio->index != index) { + xas_reset(xas); break; + } + if (!folio_try_get_rcu(folio)) { - xas_reset(&xas); + xas_reset(xas); continue; } nr_pages = folio_nr_pages(folio); - if (nr_pages > max_pages) + if (nr_pages > max_pages) { + xas_reset(xas); break; + } /* Has the page moved or been split? */ - if (unlikely(folio != xas_reload(&xas))) { + if (unlikely(folio != xas_reload(xas))) { folio_put(folio); + xas_reset(xas); break; } if (!folio_trylock(folio)) { folio_put(folio); + xas_reset(xas); break; } - if (!folio_test_dirty(folio) || folio_test_writeback(folio)) { + if (!folio_test_dirty(folio) || + folio_test_writeback(folio)) { folio_unlock(folio); folio_put(folio); + xas_reset(xas); break; } max_pages -= nr_pages; - psize = folio_size(folio); - len += psize; + len = folio_size(folio); stop = false; - if (max_pages <= 0 || len >= max_len || *_count <= 0) - stop = true; index += nr_pages; + *_count -= nr_pages; + *_len += len; + if (max_pages <= 0 || *_len >= max_len || *_count <= 0) + stop = true; + if (!folio_batch_add(&batch, folio)) break; if (stop) break; } - if (!stop) - xas_pause(&xas); + xas_pause(xas); rcu_read_unlock(); /* Now, if we obtained any pages, we can shift them to being @@ -2712,16 +2722,12 @@ static void cifs_extend_writeback(struct address_space *mapping, if (!folio_clear_dirty_for_io(folio)) WARN_ON(1); folio_start_writeback(folio); - - *_count -= folio_nr_pages(folio); folio_unlock(folio); } folio_batch_release(&batch); cond_resched(); } while (!stop); - - *_len = len; } /* @@ -2729,8 +2735,10 @@ static void cifs_extend_writeback(struct address_space *mapping, */ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, struct writeback_control *wbc, + struct xa_state *xas, struct folio *folio, - loff_t start, loff_t end) + unsigned long long start, + unsigned long long end) { struct inode *inode = mapping->host; struct TCP_Server_Info *server; @@ -2739,17 +2747,18 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, struct cifs_credits credits_on_stack; struct cifs_credits *credits = &credits_on_stack; struct cifsFileInfo *cfile = NULL; - unsigned int xid, wsize, len; - loff_t i_size = i_size_read(inode); - size_t max_len; + unsigned long long i_size = i_size_read(inode), max_len; + unsigned int xid, wsize; + size_t len = folio_size(folio); long count = wbc->nr_to_write; int rc; /* The folio should be locked, dirty and not undergoing writeback. */ + if (!folio_clear_dirty_for_io(folio)) + WARN_ON_ONCE(1); folio_start_writeback(folio); count -= folio_nr_pages(folio); - len = folio_size(folio); xid = get_xid(); server = cifs_pick_channel(cifs_sb_master_tcon(cifs_sb)->ses); @@ -2779,9 +2788,10 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, wdata->server = server; cfile = NULL; - /* Find all consecutive lockable dirty pages, stopping when we find a - * page that is not immediately lockable, is not dirty or is missing, - * or we reach the end of the range. + /* Find all consecutive lockable dirty pages that have contiguous + * written regions, stopping when we find a page that is not + * immediately lockable, is not dirty or is missing, or we reach the + * end of the range. */ if (start < i_size) { /* Trim the write to the EOF; the extra data is ignored. Also @@ -2801,19 +2811,18 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, max_pages -= folio_nr_pages(folio); if (max_pages > 0) - cifs_extend_writeback(mapping, &count, start, + cifs_extend_writeback(mapping, xas, &count, start, max_pages, max_len, &len); } - len = min_t(loff_t, len, max_len); } - - wdata->bytes = len; + len = min_t(unsigned long long, len, i_size - start); /* We now have a contiguous set of dirty pages, each with writeback * set; the first page is still locked at this point, but all the rest * have been unlocked. */ folio_unlock(folio); + wdata->bytes = len; if (start < i_size) { iov_iter_xarray(&wdata->iter, ITER_SOURCE, &mapping->i_pages, @@ -2864,102 +2873,118 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, /* * write a region of pages back to the server */ -static int cifs_writepages_region(struct address_space *mapping, - struct writeback_control *wbc, - loff_t start, loff_t end, loff_t *_next) +static ssize_t cifs_writepages_begin(struct address_space *mapping, + struct writeback_control *wbc, + struct xa_state *xas, + unsigned long long *_start, + unsigned long long end) { - struct folio_batch fbatch; + struct folio *folio; + unsigned long long start = *_start; + ssize_t ret; int skips = 0; - folio_batch_init(&fbatch); - do { - int nr; - pgoff_t index = start / PAGE_SIZE; +search_again: + /* Find the first dirty page. */ + rcu_read_lock(); - nr = filemap_get_folios_tag(mapping, &index, end / PAGE_SIZE, - PAGECACHE_TAG_DIRTY, &fbatch); - if (!nr) + for (;;) { + folio = xas_find_marked(xas, end / PAGE_SIZE, PAGECACHE_TAG_DIRTY); + if (xas_retry(xas, folio) || xa_is_value(folio)) + continue; + if (!folio) break; - for (int i = 0; i < nr; i++) { - ssize_t ret; - struct folio *folio = fbatch.folios[i]; + if (!folio_try_get_rcu(folio)) { + xas_reset(xas); + continue; + } -redo_folio: - start = folio_pos(folio); /* May regress with THPs */ + if (unlikely(folio != xas_reload(xas))) { + folio_put(folio); + xas_reset(xas); + continue; + } - /* At this point we hold neither the i_pages lock nor the - * page lock: the page may be truncated or invalidated - * (changing page->mapping to NULL), or even swizzled - * back from swapper_space to tmpfs file mapping - */ - if (wbc->sync_mode != WB_SYNC_NONE) { - ret = folio_lock_killable(folio); - if (ret < 0) - goto write_error; - } else { - if (!folio_trylock(folio)) - goto skip_write; - } + xas_pause(xas); + break; + } + rcu_read_unlock(); + if (!folio) + return 0; - if (folio->mapping != mapping || - !folio_test_dirty(folio)) { - start += folio_size(folio); - folio_unlock(folio); - continue; - } + start = folio_pos(folio); /* May regress with THPs */ - if (folio_test_writeback(folio) || - folio_test_fscache(folio)) { - folio_unlock(folio); - if (wbc->sync_mode == WB_SYNC_NONE) - goto skip_write; + /* At this point we hold neither the i_pages lock nor the page lock: + * the page may be truncated or invalidated (changing page->mapping to + * NULL), or even swizzled back from swapper_space to tmpfs file + * mapping + */ +lock_again: + if (wbc->sync_mode != WB_SYNC_NONE) { + ret = folio_lock_killable(folio); + if (ret < 0) + return ret; + } else { + if (!folio_trylock(folio)) + goto search_again; + } - folio_wait_writeback(folio); + if (folio->mapping != mapping || + !folio_test_dirty(folio)) { + start += folio_size(folio); + folio_unlock(folio); + goto search_again; + } + + if (folio_test_writeback(folio) || + folio_test_fscache(folio)) { + folio_unlock(folio); + if (wbc->sync_mode != WB_SYNC_NONE) { + folio_wait_writeback(folio); #ifdef CONFIG_CIFS_FSCACHE - folio_wait_fscache(folio); + folio_wait_fscache(folio); #endif - goto redo_folio; - } - - if (!folio_clear_dirty_for_io(folio)) - /* We hold the page lock - it should've been dirty. */ - WARN_ON(1); - - ret = cifs_write_back_from_locked_folio(mapping, wbc, folio, start, end); - if (ret < 0) - goto write_error; - - start += ret; - continue; - -write_error: - folio_batch_release(&fbatch); - *_next = start; - return ret; + goto lock_again; + } -skip_write: - /* - * Too many skipped writes, or need to reschedule? - * Treat it as a write error without an error code. - */ + start += folio_size(folio); + if (wbc->sync_mode == WB_SYNC_NONE) { if (skips >= 5 || need_resched()) { ret = 0; - goto write_error; + goto out; } - - /* Otherwise, just skip that folio and go on to the next */ skips++; - start += folio_size(folio); - continue; } + goto search_again; + } - folio_batch_release(&fbatch); - cond_resched(); - } while (wbc->nr_to_write > 0); + ret = cifs_write_back_from_locked_folio(mapping, wbc, xas, folio, start, end); +out: + if (ret > 0) + *_start = start + ret; + return ret; +} - *_next = start; - return 0; +/* + * Write a region of pages back to the server + */ +static int cifs_writepages_region(struct address_space *mapping, + struct writeback_control *wbc, + unsigned long long *_start, + unsigned long long end) +{ + ssize_t ret; + + XA_STATE(xas, &mapping->i_pages, *_start / PAGE_SIZE); + + do { + ret = cifs_writepages_begin(mapping, wbc, &xas, _start, end); + if (ret > 0 && wbc->nr_to_write > 0) + cond_resched(); + } while (ret > 0 && wbc->nr_to_write > 0); + + return ret > 0 ? 0 : ret; } /* @@ -2968,7 +2993,7 @@ static int cifs_writepages_region(struct address_space *mapping, static int cifs_writepages(struct address_space *mapping, struct writeback_control *wbc) { - loff_t start, next; + loff_t start, end; int ret; /* We have to be careful as we can end up racing with setattr() @@ -2976,28 +3001,34 @@ static int cifs_writepages(struct address_space *mapping, * to prevent it. */ - if (wbc->range_cyclic) { + if (wbc->range_cyclic && mapping->writeback_index) { start = mapping->writeback_index * PAGE_SIZE; - ret = cifs_writepages_region(mapping, wbc, start, LLONG_MAX, &next); - if (ret == 0) { - mapping->writeback_index = next / PAGE_SIZE; - if (start > 0 && wbc->nr_to_write > 0) { - ret = cifs_writepages_region(mapping, wbc, 0, - start, &next); - if (ret == 0) - mapping->writeback_index = - next / PAGE_SIZE; - } + ret = cifs_writepages_region(mapping, wbc, &start, LLONG_MAX); + if (ret < 0) + goto out; + + if (wbc->nr_to_write <= 0) { + mapping->writeback_index = start / PAGE_SIZE; + goto out; } + + start = 0; + end = mapping->writeback_index * PAGE_SIZE; + mapping->writeback_index = 0; + ret = cifs_writepages_region(mapping, wbc, &start, end); + if (ret == 0) + mapping->writeback_index = start / PAGE_SIZE; } else if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) { - ret = cifs_writepages_region(mapping, wbc, 0, LLONG_MAX, &next); + start = 0; + ret = cifs_writepages_region(mapping, wbc, &start, LLONG_MAX); if (wbc->nr_to_write > 0 && ret == 0) - mapping->writeback_index = next / PAGE_SIZE; + mapping->writeback_index = start / PAGE_SIZE; } else { - ret = cifs_writepages_region(mapping, wbc, - wbc->range_start, wbc->range_end, &next); + start = wbc->range_start; + ret = cifs_writepages_region(mapping, wbc, &start, wbc->range_end); } +out: return ret; } -- 2.43.0
From: Stephen Boyd <swboyd@chromium.org> [ Upstream commit a743f26d03a96593c0f3d05dc26b388f45de67c9 ] Per commit b3f11af9b2ce ("arm64: ftrace: forbid CALL_OPS with CC_OPTIMIZE_FOR_SIZE"), GCC is silently ignoring `-falign-functions=N` when passed `-Os`, causing functions to be improperly aligned. This doesn't seem to be a problem with Clang though, where enabling CALL_OPS with CC_OPTIMIZE_FOR_SIZE doesn't spit out any warnings at boot about misaligned patch-sites. Only forbid CALL_OPS if GCC is used and we're optimizing for size so that CALL_OPS can be used with clang optimizing for size. Cc: Jason Ling <jasonling@chromium.org> Cc: Florian Fainelli <f.fainelli@gmail.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Bill Wendling <morbo@google.com> Cc: Justin Stitt <justinstitt@google.com> Cc: llvm@lists.linux.dev Fixes: b3f11af9b2ce ("arm64: ftrace: forbid CALL_OPS with CC_OPTIMIZE_FOR_SIZE") Signed-off-by: Stephen Boyd <swboyd@chromium.org> Reviewed-by: Nathan Chancellor <nathan@kernel.org> Link: https://lore.kernel.org/r/20240223064032.3463229-1-swboyd@chromium.org Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Sasha Levin <sashal@kernel.org> --- arch/arm64/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index aa7c1d4351396..6b96d75a3a3d8 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -198,7 +198,7 @@ config ARM64 if DYNAMIC_FTRACE_WITH_ARGS && DYNAMIC_FTRACE_WITH_CALL_OPS select HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS \ if (DYNAMIC_FTRACE_WITH_ARGS && !CFI_CLANG && \ - !CC_OPTIMIZE_FOR_SIZE) + (CC_IS_CLANG || !CC_OPTIMIZE_FOR_SIZE)) select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY \ if DYNAMIC_FTRACE_WITH_ARGS select HAVE_SAMPLE_FTRACE_DIRECT -- 2.43.0
From: Ian Rogers <irogers@google.com> [ Upstream commit c7ba9d18ae47924a6ea6a47ca139779f58eb83c0 ] The child_process for addr2line sets in and out to -1 so that pipes get created. It is the caller's responsibility to close the pipes, finish_command doesn't do it. Add the missed closes. Fixes: b3801e791231 ("perf srcline: Simplify addr2line subprocess") Signed-off-by: Ian Rogers <irogers@google.com> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: James Clark <james.clark@arm.com> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: John Garry <john.g.garry@oracle.com> Cc: Tom Rix <trix@redhat.com> Cc: llvm@lists.linux.dev Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20240201001504.1348511-8-irogers@google.com Signed-off-by: Sasha Levin <sashal@kernel.org> --- tools/perf/util/srcline.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index 034b496df2978..7addc34afcf5d 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -399,6 +399,8 @@ static void addr2line_subprocess_cleanup(struct child_process *a2l) kill(a2l->pid, SIGKILL); finish_command(a2l); /* ignore result, we don't care */ a2l->pid = -1; + close(a2l->in); + close(a2l->out); } free(a2l); -- 2.43.0
Hi Linus, here is a quick regressions report. I already added a handful of regression from this cycle to the tracking (see below), but none of those are really worrying I'd say. There is one more: a fix for a KASAN splat is already in next since Friday as 9ddd90c947da4e ("fs/9p: fix uaf in in v9fs_stat2inode_dotl")[1]. I had hoped Eric would have sent it to you by now because it apparently is somewhat annoying for the net maintainers[2] and maybe other kernel developers that use virtme -- but seems that it's not on the way to you yet. :-/ Sigh. This "regression fixes are ready at have been in next, but maintainers don't send them to Linus before the next -rc" is sometimes slightly annoying from my point of view... [1] https://lore.kernel.org/all/20240202121531.2550018-1-lizhi.xu@windriver.com/ [2] https://lore.kernel.org/all/20240321182824.6f303e38@kernel.org/ A few words on regressions from the 6.8 cycle that have an easy fix available and are kinda stalled, in case you are interested: * A change that came late in the previous cycle made Johan Hovold report yet another 6.8 regression with the Lenovo ThinkPad X13s, this time about a Bluetooth problem. He provided a revert to fix it - the BT people replied, but then nothing happened for 10 days now afaics; will prod tomorrow: https://lore.kernel.org/lkml/20240314100103.GC6100@craftyguy.net/ * Two people reported CPU stalls on some Rockchip SOCs that a revert can fix, but so far I could not convince the developer to set things in motion: https://lore.kernel.org/lkml/ZYhQ2-OnjDgoqjvt@wens.tw/ https://lore.kernel.org/lkml/1553a526-6f28-4a68-88a8-f35bd22d9894@linumiz.com/ * A fix for bogus lockdep warnings in network driver stmmac also is making no progress, despite a Reviewed-by: from Eric and some prodding from my side: https://lore.kernel.org/lkml/20240306111157.29327-1-petr@tesarici.cz/ Ciao, Thorsten --- Hi, this is regzbot, the Linux kernel regression tracking bot. Currently I'm aware of 4 regressions in linux-mainline. Find the current status below and the latest on the web: https://linux-regtracking.leemhuis.info/regzbot/mainline/ Bye bye, hope to see you soon for the next report. Regzbot (on behalf of Thorsten Leemhuis) ======================================================== current cycle (v6.8.. aka v6.8-post), culprit identified ======================================================== [ *NEW* ] x86/percpu: crashes in qemu with nosmp builds and Intel CPUs ---------------------------------------------------------------------- https://linux-regtracking.leemhuis.info/regzbot/regression/lore/e20d88d0-5fb9-4307-be67-88b04ae9a188@roeck-us.net/ https://lore.kernel.org/lkml/e20d88d0-5fb9-4307-be67-88b04ae9a188@roeck-us.net/ By Guenter Roeck; 8 days ago; 34 activities, latest 1 days ago. Introduced in 71eb4893cfaf Fix incoming: * x86/cpu: Ensure that CPU info updates are propagated on UP https://lore.kernel.org/regressions/07ba20d1-3c95-42b6-b566-f5c1980ffe16@leemhuis.info/ [ *NEW* ] mm: vmalloc: persistent "spinlock bad magic" message when booting s390 images with spinlock debugging enabled ----------------------------------------------------------------------------------------------------------------------- https://linux-regtracking.leemhuis.info/regzbot/regression/lore/bbc242d5-3ab0-410f-a3b1-54a68e3e375f@roeck-us.net/ https://lore.kernel.org/lkml/bbc242d5-3ab0-410f-a3b1-54a68e3e375f@roeck-us.net/ By Guenter Roeck; 1 days ago; 3 activities, latest 1 days ago. Introduced in 72210662c5a2 Recent activities from: Guenter Roeck (2), Uladzislau Rezki (1) One patch associated with this regression: * Re: [PATCH v3 07/11] mm: vmalloc: Offload free_vmap_area_lock lock https://lore.kernel.org/lkml/Zf3V6B9f5o0H1LnE@pc636/ 1 days ago, by Uladzislau Rezki [ *NEW* ] Re: [PATCH] fs: Remove NTFS classic --------------------------------------------- https://linux-regtracking.leemhuis.info/regzbot/regression/lore/Zf2zPf5TO5oYt3I3@hovoldconsulting.com/ https://lore.kernel.org/linux-fsdevel/Zf2zPf5TO5oYt3I3@hovoldconsulting.com/ By Johan Hovold; 1 days ago; 1 activities, latest 1 days ago. Introduced in 7ffa8f3d3023 Recent activities from: Johan Hovold (1) [ *NEW* ] SUNRPC: RFC 8009 encryption test fails ------------------------------------------------ https://linux-regtracking.leemhuis.info/regzbot/regression/lore/ZfxJZFwXqqurfet0@aion/ https://lore.kernel.org/linux-nfs/ZfxJZFwXqqurfet0@aion/ By Scott Mayhew; 3 days ago; 2 activities, latest 2 days ago. Introduced in 561141dd4943 Recent activities from: Chuck Lever III (1), Scott Mayhew (1) ============= End of report ============= All regressions marked '[ *NEW* ]' were added since the previous report, which can be found here: https://lore.kernel.org/r/170947112079.436664.2969102323110743234@leemhuis.info Thanks for your attention, have a nice day! Regzbot, your hard working Linux kernel regression tracking robot P.S.: Wanna know more about regzbot or how to use it to track regressions for your subsystem? Then check out the getting started guide or the reference documentation: https://gitlab.com/knurd42/regzbot/-/blob/main/docs/getting_started.md https://gitlab.com/knurd42/regzbot/-/blob/main/docs/reference.md The short version: if you see a regression report you want to see tracked, just send a reply to the report where you Cc regressions@lists.linux.dev with a line like this: #regzbot introduced: v5.13..v5.14-rc1 If you want to fix a tracked regression, just do what is expected anyway: add a 'Link:' tag with the url to the report, e.g.: Link: https://lore.kernel.org/all/30th.anniversary.repost@klaava.Helsinki.FI/
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: linux-kernel@vger.kernel.org TO: Suren Baghdasaryan <surenb@google.com> CC: Andrew Morton <akpm@linux-foundation.org> CC: Linux Memory Management List <linux-mm@kvack.org> CC: Kees Cook <keescook@chromium.org> CC: Pasha Tatashin <pasha.tatashin@soleen.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 70293240c5ce675a67bfc48f419b093023b862b3 commit: 772dd0342727cc3c3b676b5d97c99708e75730a2 mm: enumerate all gfp flags date: 3 weeks ago :::::: branch date: 12 hours ago :::::: commit date: 3 weeks ago config: riscv-randconfig-r071-20240324 (https://download.01.org/0day-ci/archive/20240324/202403241705.ciJcrrdh-lkp@intel.com/config) compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project 23de3862dce582ce91c1aa914467d982cb1a73b4) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403241705.ciJcrrdh-lkp@intel.com/ smatch warnings: drivers/tty/serial/amba-pl011.c:1110 pl011_dma_startup() warn: Please consider using kzalloc instead of kmalloc vim +1110 drivers/tty/serial/amba-pl011.c cb06ff102e2d79 drivers/tty/serial/amba-pl011.c Chanho Min 2013-03-27 1099 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1100 static void pl011_dma_startup(struct uart_amba_port *uap) 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1101 { ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1102 int ret; ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1103 1c9be31015747b drivers/tty/serial/amba-pl011.c Jorge Ramirez-Ortiz 2015-03-06 1104 if (!uap->dma_probed) 1c9be31015747b drivers/tty/serial/amba-pl011.c Jorge Ramirez-Ortiz 2015-03-06 1105 pl011_dma_probe(uap); 1c9be31015747b drivers/tty/serial/amba-pl011.c Jorge Ramirez-Ortiz 2015-03-06 1106 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1107 if (!uap->dmatx.chan) 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1108 return; 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1109 4c0be45b18a3bd drivers/tty/serial/amba-pl011.c Andrew Jackson 2014-11-07 @1110 uap->dmatx.buf = kmalloc(PL011_DMA_BUFFER_SIZE, GFP_KERNEL | __GFP_DMA); 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1111 if (!uap->dmatx.buf) { 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1112 uap->port.fifosize = uap->fifosize; 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1113 return; 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1114 } 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1115 58ac1b37997990 drivers/tty/serial/amba-pl011.c Arnd Bergmann 2023-11-22 1116 uap->dmatx.len = PL011_DMA_BUFFER_SIZE; 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1117 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1118 /* The DMA buffer is now the FIFO the TTY subsystem can use */ 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1119 uap->port.fifosize = PL011_DMA_BUFFER_SIZE; ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1120 uap->using_tx_dma = true; ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1121 ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1122 if (!uap->dmarx.chan) ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1123 goto skip_rx; 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1124 ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1125 /* Allocate and map DMA RX buffers */ 58ac1b37997990 drivers/tty/serial/amba-pl011.c Arnd Bergmann 2023-11-22 1126 ret = pl011_dmabuf_init(uap->dmarx.chan, &uap->dmarx.dbuf_a, ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1127 DMA_FROM_DEVICE); ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1128 if (ret) { ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1129 dev_err(uap->port.dev, "failed to init DMA %s: %d\n", ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1130 "RX buffer A", ret); ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1131 goto skip_rx; ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1132 } ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1133 58ac1b37997990 drivers/tty/serial/amba-pl011.c Arnd Bergmann 2023-11-22 1134 ret = pl011_dmabuf_init(uap->dmarx.chan, &uap->dmarx.dbuf_b, ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1135 DMA_FROM_DEVICE); ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1136 if (ret) { ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1137 dev_err(uap->port.dev, "failed to init DMA %s: %d\n", ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1138 "RX buffer B", ret); 58ac1b37997990 drivers/tty/serial/amba-pl011.c Arnd Bergmann 2023-11-22 1139 pl011_dmabuf_free(uap->dmarx.chan, &uap->dmarx.dbuf_a, ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1140 DMA_FROM_DEVICE); ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1141 goto skip_rx; ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1142 } ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1143 ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1144 uap->using_rx_dma = true; 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1145 ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1146 skip_rx: 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1147 /* Turn on DMA error (RX/TX will be enabled on demand) */ 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1148 uap->dmacr |= UART011_DMAONERR; 9f25bc510e960c drivers/tty/serial/amba-pl011.c Russell King 2015-11-03 1149 pl011_write(uap->dmacr, uap, REG_DMACR); 38d624361b2a82 drivers/serial/amba-pl011.c Russell King 2010-12-22 1150 38d624361b2a82 drivers/serial/amba-pl011.c Russell King 2010-12-22 1151 /* 38d624361b2a82 drivers/serial/amba-pl011.c Russell King 2010-12-22 1152 * ST Micro variants has some specific dma burst threshold 38d624361b2a82 drivers/serial/amba-pl011.c Russell King 2010-12-22 1153 * compensation. Set this to 16 bytes, so burst will only 38d624361b2a82 drivers/serial/amba-pl011.c Russell King 2010-12-22 1154 * be issued above/below 16 bytes. 38d624361b2a82 drivers/serial/amba-pl011.c Russell King 2010-12-22 1155 */ 38d624361b2a82 drivers/serial/amba-pl011.c Russell King 2010-12-22 1156 if (uap->vendor->dma_threshold) 7583633921d54f drivers/tty/serial/amba-pl011.c Russell King 2015-11-03 1157 pl011_write(ST_UART011_DMAWM_RX_16 | ST_UART011_DMAWM_TX_16, 9f25bc510e960c drivers/tty/serial/amba-pl011.c Russell King 2015-11-03 1158 uap, REG_ST_DMAWM); ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1159 ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1160 if (uap->using_rx_dma) { ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1161 if (pl011_dma_rx_trigger_dma(uap)) fd64ff0966d394 drivers/tty/serial/amba-pl011.c Théo Lebrun 2023-12-07 1162 dev_dbg(uap->port.dev, fd64ff0966d394 drivers/tty/serial/amba-pl011.c Théo Lebrun 2023-12-07 1163 "could not trigger initial RX DMA job, fall back to interrupt mode\n"); cb06ff102e2d79 drivers/tty/serial/amba-pl011.c Chanho Min 2013-03-27 1164 if (uap->dmarx.poll_rate) { f7f730968264c1 drivers/tty/serial/amba-pl011.c Kees Cook 2017-10-16 1165 timer_setup(&uap->dmarx.timer, pl011_dma_rx_poll, 0); cb06ff102e2d79 drivers/tty/serial/amba-pl011.c Chanho Min 2013-03-27 1166 mod_timer(&uap->dmarx.timer, d93ebe0fcfbd29 drivers/tty/serial/amba-pl011.c Théo Lebrun 2023-12-07 1167 jiffies + msecs_to_jiffies(uap->dmarx.poll_rate)); cb06ff102e2d79 drivers/tty/serial/amba-pl011.c Chanho Min 2013-03-27 1168 uap->dmarx.last_residue = PL011_DMA_BUFFER_SIZE; cb06ff102e2d79 drivers/tty/serial/amba-pl011.c Chanho Min 2013-03-27 1169 uap->dmarx.last_jiffies = jiffies; cb06ff102e2d79 drivers/tty/serial/amba-pl011.c Chanho Min 2013-03-27 1170 } ead76f329f777c drivers/tty/serial/amba-pl011.c Linus Walleij 2011-02-24 1171 } 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1172 } 68b65f7305e54b drivers/serial/amba-pl011.c Russell King 2010-12-22 1173 :::::: The code at line 1110 was first introduced by commit :::::: 4c0be45b18a3bd5c215589c4b320648e35024f6e serial: pl011: Allocate TX DMA buffer from DMA capable memory :::::: TO: Andrew Jackson <Andrew.Jackson@arm.com> :::::: CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: linux-kernel@vger.kernel.org TO: Suren Baghdasaryan <surenb@google.com> CC: Andrew Morton <akpm@linux-foundation.org> CC: Linux Memory Management List <linux-mm@kvack.org> CC: Kees Cook <keescook@chromium.org> CC: Pasha Tatashin <pasha.tatashin@soleen.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 70293240c5ce675a67bfc48f419b093023b862b3 commit: 772dd0342727cc3c3b676b5d97c99708e75730a2 mm: enumerate all gfp flags date: 3 weeks ago :::::: branch date: 11 hours ago :::::: commit date: 3 weeks ago config: xtensa-randconfig-r071-20240323 (https://download.01.org/0day-ci/archive/20240324/202403241656.OBJEk2rO-lkp@intel.com/config) compiler: xtensa-linux-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403241656.OBJEk2rO-lkp@intel.com/ smatch warnings: drivers/mtd/nand/raw/marvell_nand.c:2870 marvell_nfc_init_dma() warn: Please consider using kzalloc instead of kmalloc vim +2870 drivers/mtd/nand/raw/marvell_nand.c 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2819 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2820 static int marvell_nfc_init_dma(struct marvell_nfc *nfc) 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2821 { 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2822 struct platform_device *pdev = container_of(nfc->dev, 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2823 struct platform_device, 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2824 dev); 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2825 struct dma_slave_config config = {}; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2826 struct resource *r; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2827 int ret; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2828 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2829 if (!IS_ENABLED(CONFIG_PXA_DMA)) { 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2830 dev_warn(nfc->dev, 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2831 "DMA not enabled in configuration\n"); 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2832 return -ENOTSUPP; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2833 } 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2834 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2835 ret = dma_set_mask_and_coherent(nfc->dev, DMA_BIT_MASK(32)); 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2836 if (ret) 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2837 return ret; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2838 cf9e2389482179 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2839 nfc->dma_chan = dma_request_chan(nfc->dev, "data"); cf9e2389482179 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2840 if (IS_ERR(nfc->dma_chan)) { cf9e2389482179 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2841 ret = PTR_ERR(nfc->dma_chan); cf9e2389482179 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2842 nfc->dma_chan = NULL; 6ce92faeefc018 drivers/mtd/nand/raw/marvell_nand.c Krzysztof Kozlowski 2020-09-01 2843 return dev_err_probe(nfc->dev, ret, "DMA channel request failed\n"); 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2844 } 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2845 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2846 r = platform_get_resource(pdev, IORESOURCE_MEM, 0); aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2847 if (!r) { aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2848 ret = -ENXIO; aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2849 goto release_channel; aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2850 } 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2851 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2852 config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2853 config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2854 config.src_addr = r->start + NDDB; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2855 config.dst_addr = r->start + NDDB; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2856 config.src_maxburst = 32; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2857 config.dst_maxburst = 32; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2858 ret = dmaengine_slave_config(nfc->dma_chan, &config); 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2859 if (ret < 0) { 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2860 dev_err(nfc->dev, "Failed to configure DMA channel\n"); aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2861 goto release_channel; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2862 } 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2863 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2864 /* 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2865 * DMA must act on length multiple of 32 and this length may be 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2866 * bigger than the destination buffer. Use this buffer instead 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2867 * for DMA transfers and then copy the desired amount of data to 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2868 * the provided buffer. 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2869 */ c495a9275eeca0 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-19 @2870 nfc->dma_buf = kmalloc(MAX_CHUNK_SIZE, GFP_KERNEL | GFP_DMA); aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2871 if (!nfc->dma_buf) { aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2872 ret = -ENOMEM; aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2873 goto release_channel; aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2874 } 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2875 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2876 nfc->use_dma = true; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2877 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2878 return 0; aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2879 aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2880 release_channel: aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2881 dma_release_channel(nfc->dma_chan); aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2882 nfc->dma_chan = NULL; aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2883 aafe30baf4ad13 drivers/mtd/nand/raw/marvell_nand.c Peter Ujfalusi 2020-02-27 2884 return ret; 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2885 } 02f26ecf8c7727 drivers/mtd/nand/marvell_nand.c Miquel Raynal 2018-01-09 2886 :::::: The code at line 2870 was first introduced by commit :::::: c495a9275eeca0bbc9358de7200e58184e864aeb mtd: nand: marvell: Fix missing memory allocation modifier :::::: TO: Miquel Raynal <miquel.raynal@free-electrons.com> :::::: CC: Boris Brezillon <boris.brezillon@free-electrons.com> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: David Howells <dhowells@redhat.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git netfs-writeback head: 6d4dafd8301ee8645d4814a7e75a9135acf67613 commit: 9a3702e1d161f5b03a7b42122f9f693af1144fc8 [15/22] netfs: New writeback implementation :::::: branch date: 3 days ago :::::: commit date: 3 days ago config: x86_64-randconfig-102-20240324 (https://download.01.org/0day-ci/archive/20240324/202403241507.oq4guPPM-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Julia Lawall <julia.lawall@inria.fr> | Closes: https://lore.kernel.org/r/202403241507.oq4guPPM-lkp@intel.com/ cocci warnings: (new ones prefixed by >>) >> fs/netfs/write_collect.c:254:7-13: ERROR: invalid reference to the index variable of the iterator on line 225 vim +254 fs/netfs/write_collect.c 9a3702e1d161f5 David Howells 2024-03-18 160 9a3702e1d161f5 David Howells 2024-03-18 161 /* 9a3702e1d161f5 David Howells 2024-03-18 162 * Perform retries on the streams that need it. 9a3702e1d161f5 David Howells 2024-03-18 163 */ 9a3702e1d161f5 David Howells 2024-03-18 164 static void netfs_retry_write_stream(struct netfs_io_request *wreq, 9a3702e1d161f5 David Howells 2024-03-18 165 struct netfs_io_stream *stream) 9a3702e1d161f5 David Howells 2024-03-18 166 { 9a3702e1d161f5 David Howells 2024-03-18 167 struct list_head *next; 9a3702e1d161f5 David Howells 2024-03-18 168 9a3702e1d161f5 David Howells 2024-03-18 169 _enter("R=%x[%x:]", wreq->debug_id, stream->stream_nr); 9a3702e1d161f5 David Howells 2024-03-18 170 9a3702e1d161f5 David Howells 2024-03-18 171 if (unlikely(stream->failed)) 9a3702e1d161f5 David Howells 2024-03-18 172 return; 9a3702e1d161f5 David Howells 2024-03-18 173 9a3702e1d161f5 David Howells 2024-03-18 174 /* If there's no renegotiation to do, just resend each failed subreq. */ 9a3702e1d161f5 David Howells 2024-03-18 175 if (!stream->prepare_write) { 9a3702e1d161f5 David Howells 2024-03-18 176 struct netfs_io_subrequest *subreq; 9a3702e1d161f5 David Howells 2024-03-18 177 9a3702e1d161f5 David Howells 2024-03-18 178 list_for_each_entry(subreq, &stream->subrequests, rreq_link) { 9a3702e1d161f5 David Howells 2024-03-18 179 if (test_bit(NETFS_SREQ_FAILED, &subreq->flags)) 9a3702e1d161f5 David Howells 2024-03-18 180 break; 9a3702e1d161f5 David Howells 2024-03-18 181 if (__test_and_clear_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags)) { 9a3702e1d161f5 David Howells 2024-03-18 182 __set_bit(NETFS_SREQ_RETRYING, &subreq->flags); 9a3702e1d161f5 David Howells 2024-03-18 183 netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit); 9a3702e1d161f5 David Howells 2024-03-18 184 netfs_reissue_write(stream, subreq); 9a3702e1d161f5 David Howells 2024-03-18 185 } 9a3702e1d161f5 David Howells 2024-03-18 186 } 9a3702e1d161f5 David Howells 2024-03-18 187 return; 9a3702e1d161f5 David Howells 2024-03-18 188 } 9a3702e1d161f5 David Howells 2024-03-18 189 9a3702e1d161f5 David Howells 2024-03-18 190 if (list_empty(&stream->subrequests)) 9a3702e1d161f5 David Howells 2024-03-18 191 return; 9a3702e1d161f5 David Howells 2024-03-18 192 next = stream->subrequests.next; 9a3702e1d161f5 David Howells 2024-03-18 193 9a3702e1d161f5 David Howells 2024-03-18 194 do { 9a3702e1d161f5 David Howells 2024-03-18 195 struct netfs_io_subrequest *subreq = NULL, *from, *to, *tmp; 9a3702e1d161f5 David Howells 2024-03-18 196 unsigned long long start, len; 9a3702e1d161f5 David Howells 2024-03-18 197 size_t part; 9a3702e1d161f5 David Howells 2024-03-18 198 bool boundary = false; 9a3702e1d161f5 David Howells 2024-03-18 199 9a3702e1d161f5 David Howells 2024-03-18 200 /* Go through the stream and find the next span of contiguous 9a3702e1d161f5 David Howells 2024-03-18 201 * data that we then rejig (cifs, for example, needs the wsize 9a3702e1d161f5 David Howells 2024-03-18 202 * renegotiating) and reissue. 9a3702e1d161f5 David Howells 2024-03-18 203 */ 9a3702e1d161f5 David Howells 2024-03-18 204 from = list_entry(next, struct netfs_io_subrequest, rreq_link); 9a3702e1d161f5 David Howells 2024-03-18 205 to = from; 9a3702e1d161f5 David Howells 2024-03-18 206 start = from->start + from->transferred; 9a3702e1d161f5 David Howells 2024-03-18 207 len = from->len - from->transferred; 9a3702e1d161f5 David Howells 2024-03-18 208 9a3702e1d161f5 David Howells 2024-03-18 209 if (test_bit(NETFS_SREQ_FAILED, &from->flags) || 9a3702e1d161f5 David Howells 2024-03-18 210 !test_bit(NETFS_SREQ_NEED_RETRY, &from->flags)) 9a3702e1d161f5 David Howells 2024-03-18 211 return; 9a3702e1d161f5 David Howells 2024-03-18 212 9a3702e1d161f5 David Howells 2024-03-18 213 list_for_each_continue(next, &stream->subrequests) { 9a3702e1d161f5 David Howells 2024-03-18 214 subreq = list_entry(next, struct netfs_io_subrequest, rreq_link); 9a3702e1d161f5 David Howells 2024-03-18 215 if (subreq->start + subreq->transferred != start + len || 9a3702e1d161f5 David Howells 2024-03-18 216 test_bit(NETFS_SREQ_BOUNDARY, &subreq->flags) || 9a3702e1d161f5 David Howells 2024-03-18 217 !test_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags)) 9a3702e1d161f5 David Howells 2024-03-18 218 break; 9a3702e1d161f5 David Howells 2024-03-18 219 to = subreq; 9a3702e1d161f5 David Howells 2024-03-18 220 len += to->len; 9a3702e1d161f5 David Howells 2024-03-18 221 } 9a3702e1d161f5 David Howells 2024-03-18 222 9a3702e1d161f5 David Howells 2024-03-18 223 /* Work through the sublist. */ 9a3702e1d161f5 David Howells 2024-03-18 224 subreq = from; 9a3702e1d161f5 David Howells 2024-03-18 @225 list_for_each_entry_from(subreq, &stream->subrequests, rreq_link) { 9a3702e1d161f5 David Howells 2024-03-18 226 if (!len) 9a3702e1d161f5 David Howells 2024-03-18 227 break; 9a3702e1d161f5 David Howells 2024-03-18 228 /* Renegotiate max_len (wsize) */ 9a3702e1d161f5 David Howells 2024-03-18 229 trace_netfs_sreq(subreq, netfs_sreq_trace_retry); 9a3702e1d161f5 David Howells 2024-03-18 230 __clear_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags); 9a3702e1d161f5 David Howells 2024-03-18 231 __set_bit(NETFS_SREQ_RETRYING, &subreq->flags); 9a3702e1d161f5 David Howells 2024-03-18 232 stream->prepare_write(subreq); 9a3702e1d161f5 David Howells 2024-03-18 233 9a3702e1d161f5 David Howells 2024-03-18 234 part = min(len, subreq->max_len); 9a3702e1d161f5 David Howells 2024-03-18 235 subreq->len = part; 9a3702e1d161f5 David Howells 2024-03-18 236 subreq->start = start; 9a3702e1d161f5 David Howells 2024-03-18 237 subreq->transferred = 0; 9a3702e1d161f5 David Howells 2024-03-18 238 len -= part; 9a3702e1d161f5 David Howells 2024-03-18 239 start += part; 9a3702e1d161f5 David Howells 2024-03-18 240 if (len && subreq == to && 9a3702e1d161f5 David Howells 2024-03-18 241 __test_and_clear_bit(NETFS_SREQ_BOUNDARY, &to->flags)) 9a3702e1d161f5 David Howells 2024-03-18 242 boundary = true; 9a3702e1d161f5 David Howells 2024-03-18 243 9a3702e1d161f5 David Howells 2024-03-18 244 netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit); 9a3702e1d161f5 David Howells 2024-03-18 245 netfs_reissue_write(stream, subreq); 9a3702e1d161f5 David Howells 2024-03-18 246 if (subreq == to) 9a3702e1d161f5 David Howells 2024-03-18 247 break; 9a3702e1d161f5 David Howells 2024-03-18 248 } 9a3702e1d161f5 David Howells 2024-03-18 249 9a3702e1d161f5 David Howells 2024-03-18 250 /* If we managed to use fewer subreqs, we can discard the 9a3702e1d161f5 David Howells 2024-03-18 251 * excess; if we used the same number, then we're done. 9a3702e1d161f5 David Howells 2024-03-18 252 */ 9a3702e1d161f5 David Howells 2024-03-18 253 if (!len) { 9a3702e1d161f5 David Howells 2024-03-18 @254 if (subreq == to) 9a3702e1d161f5 David Howells 2024-03-18 255 continue; 9a3702e1d161f5 David Howells 2024-03-18 256 list_for_each_entry_safe_from(subreq, tmp, 9a3702e1d161f5 David Howells 2024-03-18 257 &stream->subrequests, rreq_link) { 9a3702e1d161f5 David Howells 2024-03-18 258 trace_netfs_sreq(subreq, netfs_sreq_trace_discard); 9a3702e1d161f5 David Howells 2024-03-18 259 list_del(&subreq->rreq_link); 9a3702e1d161f5 David Howells 2024-03-18 260 netfs_put_subrequest(subreq, false, netfs_sreq_trace_put_done); 9a3702e1d161f5 David Howells 2024-03-18 261 if (subreq == to) 9a3702e1d161f5 David Howells 2024-03-18 262 break; 9a3702e1d161f5 David Howells 2024-03-18 263 } 9a3702e1d161f5 David Howells 2024-03-18 264 continue; 9a3702e1d161f5 David Howells 2024-03-18 265 } 9a3702e1d161f5 David Howells 2024-03-18 266 9a3702e1d161f5 David Howells 2024-03-18 267 /* We ran out of subrequests, so we need to allocate some more 9a3702e1d161f5 David Howells 2024-03-18 268 * and insert them after. 9a3702e1d161f5 David Howells 2024-03-18 269 */ 9a3702e1d161f5 David Howells 2024-03-18 270 do { 9a3702e1d161f5 David Howells 2024-03-18 271 subreq = netfs_alloc_subrequest(wreq); 9a3702e1d161f5 David Howells 2024-03-18 272 subreq->source = to->source; 9a3702e1d161f5 David Howells 2024-03-18 273 subreq->start = start; 9a3702e1d161f5 David Howells 2024-03-18 274 subreq->max_len = len; 9a3702e1d161f5 David Howells 2024-03-18 275 subreq->max_nr_segs = INT_MAX; 9a3702e1d161f5 David Howells 2024-03-18 276 subreq->debug_index = atomic_inc_return(&wreq->subreq_counter); 9a3702e1d161f5 David Howells 2024-03-18 277 subreq->stream_nr = to->stream_nr; 9a3702e1d161f5 David Howells 2024-03-18 278 __set_bit(NETFS_SREQ_RETRYING, &subreq->flags); 9a3702e1d161f5 David Howells 2024-03-18 279 9a3702e1d161f5 David Howells 2024-03-18 280 trace_netfs_sreq_ref(wreq->debug_id, subreq->debug_index, 9a3702e1d161f5 David Howells 2024-03-18 281 refcount_read(&subreq->ref), 9a3702e1d161f5 David Howells 2024-03-18 282 netfs_sreq_trace_new); 9a3702e1d161f5 David Howells 2024-03-18 283 netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit); 9a3702e1d161f5 David Howells 2024-03-18 284 9a3702e1d161f5 David Howells 2024-03-18 285 list_add(&subreq->rreq_link, &to->rreq_link); 9a3702e1d161f5 David Howells 2024-03-18 286 to = list_next_entry(to, rreq_link); 9a3702e1d161f5 David Howells 2024-03-18 287 trace_netfs_sreq(subreq, netfs_sreq_trace_retry); 9a3702e1d161f5 David Howells 2024-03-18 288 9a3702e1d161f5 David Howells 2024-03-18 289 switch (stream->source) { 9a3702e1d161f5 David Howells 2024-03-18 290 case NETFS_UPLOAD_TO_SERVER: 9a3702e1d161f5 David Howells 2024-03-18 291 netfs_stat(&netfs_n_wh_upload); 9a3702e1d161f5 David Howells 2024-03-18 292 subreq->max_len = min(len, wreq->wsize); 9a3702e1d161f5 David Howells 2024-03-18 293 break; 9a3702e1d161f5 David Howells 2024-03-18 294 case NETFS_WRITE_TO_CACHE: 9a3702e1d161f5 David Howells 2024-03-18 295 netfs_stat(&netfs_n_wh_write); 9a3702e1d161f5 David Howells 2024-03-18 296 break; 9a3702e1d161f5 David Howells 2024-03-18 297 default: 9a3702e1d161f5 David Howells 2024-03-18 298 WARN_ON_ONCE(1); 9a3702e1d161f5 David Howells 2024-03-18 299 } 9a3702e1d161f5 David Howells 2024-03-18 300 9a3702e1d161f5 David Howells 2024-03-18 301 stream->prepare_write(subreq); 9a3702e1d161f5 David Howells 2024-03-18 302 9a3702e1d161f5 David Howells 2024-03-18 303 part = min(len, subreq->max_len); 9a3702e1d161f5 David Howells 2024-03-18 304 subreq->len = subreq->transferred + part; 9a3702e1d161f5 David Howells 2024-03-18 305 len -= part; 9a3702e1d161f5 David Howells 2024-03-18 306 start += part; 9a3702e1d161f5 David Howells 2024-03-18 307 if (!len && boundary) { 9a3702e1d161f5 David Howells 2024-03-18 308 __set_bit(NETFS_SREQ_BOUNDARY, &to->flags); 9a3702e1d161f5 David Howells 2024-03-18 309 boundary = false; 9a3702e1d161f5 David Howells 2024-03-18 310 } 9a3702e1d161f5 David Howells 2024-03-18 311 9a3702e1d161f5 David Howells 2024-03-18 312 netfs_reissue_write(stream, subreq); 9a3702e1d161f5 David Howells 2024-03-18 313 if (!len) 9a3702e1d161f5 David Howells 2024-03-18 314 break; 9a3702e1d161f5 David Howells 2024-03-18 315 9a3702e1d161f5 David Howells 2024-03-18 316 } while (len); 9a3702e1d161f5 David Howells 2024-03-18 317 9a3702e1d161f5 David Howells 2024-03-18 318 } while (!list_is_head(next, &stream->subrequests)); 9a3702e1d161f5 David Howells 2024-03-18 319 } 9a3702e1d161f5 David Howells 2024-03-18 320 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
:::::: :::::: Manual check reason: "low confidence static check first_new_problem: /opt/cross/clang-23de3862dc/lib/clang/19/include/arm_neon.h:28:2: sparse: sparse: "NEON intrinsics not available with the soft-float ABI. Please use -mfloat-abi=softfp or -mfloat-abi=hard"" :::::: BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: linux-kernel@vger.kernel.org TO: Kent Overstreet <kent.overstreet@linux.dev> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 70293240c5ce675a67bfc48f419b093023b862b3 commit: cd575ddf57af004913ff5a994aa5f3203216fa68 bcachefs: Erasure coding date: 5 months ago :::::: branch date: 7 hours ago :::::: commit date: 5 months ago config: arm64-randconfig-r121-20240321 (https://download.01.org/0day-ci/archive/20240324/202403241343.b1kQNIm6-lkp@intel.com/config) compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project 23de3862dce582ce91c1aa914467d982cb1a73b4) reproduce: (https://download.01.org/0day-ci/archive/20240324/202403241343.b1kQNIm6-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/r/202403241343.b1kQNIm6-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) lib/raid6/recov_neon_inner.c: note: in included file: >> /opt/cross/clang-23de3862dc/lib/clang/19/include/arm_neon.h:28:2: sparse: sparse: "NEON intrinsics not available with the soft-float ABI. Please use -mfloat-abi=softfp or -mfloat-abi=hard" lib/raid6/recov_neon_inner.c: note: in included file: lib/raid6/neon.h:15:50: sparse: sparse: Expected ) in function declarator lib/raid6/neon.h:15:50: sparse: sparse: got * lib/raid6/neon.h:19:50: sparse: sparse: Expected ) in function declarator lib/raid6/neon.h:19:50: sparse: sparse: got * lib/raid6/recov_neon_inner.c:28:50: sparse: sparse: Expected ) in function declarator lib/raid6/recov_neon_inner.c:28:50: sparse: sparse: got * lib/raid6/recov_neon_inner.c:33:20: sparse: sparse: Expected ; at end of declaration lib/raid6/recov_neon_inner.c:33:20: sparse: sparse: got pm1 lib/raid6/recov_neon_inner.c:34:20: sparse: sparse: Expected ; at end of declaration lib/raid6/recov_neon_inner.c:34:20: sparse: sparse: got qm0 lib/raid6/recov_neon_inner.c:35:20: sparse: sparse: Expected ; at end of declaration lib/raid6/recov_neon_inner.c:35:20: sparse: sparse: got qm1 lib/raid6/recov_neon_inner.c:36:20: sparse: sparse: Expected ; at end of declaration lib/raid6/recov_neon_inner.c:36:20: sparse: sparse: got x0f lib/raid6/recov_neon_inner.c:50:9: sparse: sparse: Trying to use reserved word 'while' as identifier lib/raid6/recov_neon_inner.c:50:16: sparse: sparse: missing type declaration for parameter 'bytes' lib/raid6/recov_neon_inner.c:51:28: sparse: sparse: Expected ; at end of statement lib/raid6/recov_neon_inner.c:51:28: sparse: sparse: got vx lib/raid6/recov_neon_inner.c:76:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/recov_neon_inner.c:76:1: sparse: sparse: got } lib/raid6/recov_neon_inner.c:82:20: sparse: sparse: Expected ; at end of declaration lib/raid6/recov_neon_inner.c:82:20: sparse: sparse: got qm1 lib/raid6/recov_neon_inner.c:83:20: sparse: sparse: Expected ; at end of declaration lib/raid6/recov_neon_inner.c:83:20: sparse: sparse: got x0f lib/raid6/recov_neon_inner.c:92:9: sparse: sparse: Trying to use reserved word 'while' as identifier lib/raid6/recov_neon_inner.c:92:16: sparse: sparse: missing type declaration for parameter 'bytes' lib/raid6/recov_neon_inner.c:93:28: sparse: sparse: Expected ; at end of statement lib/raid6/recov_neon_inner.c:93:28: sparse: sparse: got vx lib/raid6/recov_neon_inner.c:111:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/recov_neon_inner.c:111:1: sparse: sparse: got } lib/raid6/recov_neon_inner.c:53:17: sparse: sparse: undefined identifier 'px' lib/raid6/recov_neon_inner.c:53:22: sparse: sparse: undefined identifier 'veorq_u8' lib/raid6/recov_neon_inner.c:54:17: sparse: sparse: undefined identifier 'vx' lib/raid6/recov_neon_inner.c:54:22: sparse: sparse: undefined identifier 'veorq_u8' lib/raid6/recov_neon_inner.c:56:17: sparse: sparse: undefined identifier 'vy' lib/raid6/recov_neon_inner.c:56:22: sparse: sparse: undefined identifier 'vshrq_n_u8' lib/raid6/recov_neon_inner.c:57:17: sparse: sparse: undefined identifier 'vx' lib/raid6/recov_neon_inner.c:57:22: sparse: sparse: undefined identifier 'vqtbl1q_u8' lib/raid6/recov_neon_inner.c:58:17: sparse: sparse: undefined identifier 'vy' lib/raid6/recov_neon_inner.c:58:22: sparse: sparse: undefined identifier 'vqtbl1q_u8' lib/raid6/recov_neon_inner.c:59:17: sparse: sparse: undefined identifier 'qx' lib/raid6/recov_neon_inner.c:59:22: sparse: sparse: undefined identifier 'veorq_u8' lib/raid6/recov_neon_inner.c:61:17: sparse: sparse: undefined identifier 'vy' lib/raid6/recov_neon_inner.c:61:22: sparse: sparse: undefined identifier 'vshrq_n_u8' lib/raid6/recov_neon_inner.c:62:17: sparse: sparse: undefined identifier 'vx' lib/raid6/recov_neon_inner.c:62:22: sparse: sparse: undefined identifier 'vqtbl1q_u8' lib/raid6/recov_neon_inner.c:63:17: sparse: sparse: undefined identifier 'vy' lib/raid6/recov_neon_inner.c:63:22: sparse: sparse: undefined identifier 'vqtbl1q_u8' lib/raid6/recov_neon_inner.c:64:17: sparse: sparse: undefined identifier 'vx' lib/raid6/recov_neon_inner.c:64:22: sparse: sparse: undefined identifier 'veorq_u8' lib/raid6/recov_neon_inner.c:65:17: sparse: sparse: undefined identifier 'db' lib/raid6/recov_neon_inner.c:65:22: sparse: sparse: undefined identifier 'veorq_u8' lib/raid6/recov_neon_inner.c:67:17: sparse: sparse: undefined identifier 'vst1q_u8' lib/raid6/recov_neon_inner.c:68:17: sparse: sparse: undefined identifier 'vst1q_u8' lib/raid6/recov_neon_inner.c:71:17: sparse: sparse: undefined identifier 'p' lib/raid6/recov_neon_inner.c:72:17: sparse: sparse: undefined identifier 'q' lib/raid6/recov_neon_inner.c:73:17: sparse: sparse: undefined identifier 'dp' lib/raid6/recov_neon_inner.c:74:17: sparse: sparse: undefined identifier 'dq' lib/raid6/recov_neon_inner.c:95:17: sparse: sparse: undefined identifier 'vx' lib/raid6/recov_neon_inner.c:95:22: sparse: sparse: undefined identifier 'veorq_u8' lib/raid6/recov_neon_inner.c:97:17: sparse: sparse: undefined identifier 'vy' lib/raid6/recov_neon_inner.c:97:22: sparse: sparse: undefined identifier 'vshrq_n_u8' lib/raid6/recov_neon_inner.c:98:17: sparse: sparse: undefined identifier 'vx' lib/raid6/recov_neon_inner.c:98:22: sparse: sparse: undefined identifier 'vqtbl1q_u8' lib/raid6/recov_neon_inner.c:99:17: sparse: sparse: undefined identifier 'vy' lib/raid6/recov_neon_inner.c:99:22: sparse: sparse: undefined identifier 'vqtbl1q_u8' lib/raid6/recov_neon_inner.c:100:17: sparse: sparse: undefined identifier 'vx' lib/raid6/recov_neon_inner.c:100:22: sparse: sparse: undefined identifier 'veorq_u8' lib/raid6/recov_neon_inner.c:101:17: sparse: sparse: undefined identifier 'vy' lib/raid6/recov_neon_inner.c:101:22: sparse: sparse: undefined identifier 'veorq_u8' lib/raid6/recov_neon_inner.c:103:17: sparse: sparse: undefined identifier 'vst1q_u8' lib/raid6/recov_neon_inner.c:104:17: sparse: sparse: undefined identifier 'vst1q_u8' lib/raid6/recov_neon_inner.c:107:17: sparse: sparse: undefined identifier 'p' lib/raid6/recov_neon_inner.c:108:17: sparse: sparse: undefined identifier 'q' lib/raid6/recov_neon_inner.c:109:17: sparse: sparse: undefined identifier 'dq' -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: linux-kernel@vger.kernel.org TO: Dmitry Safonov <dima@arista.com> CC: Francesco Ruggeri <fruggeri@arista.com> CC: Salam Noureddine <noureddine@arista.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 70293240c5ce675a67bfc48f419b093023b862b3 commit: ef84703a911f4ee52ca585e8308b7084093941f4 net/tcp: Add TCP-AO getsockopt()s date: 5 months ago :::::: branch date: 6 hours ago :::::: commit date: 5 months ago config: sparc64-randconfig-r081-20240323 (https://download.01.org/0day-ci/archive/20240324/202403241158.NX7mmXFv-lkp@intel.com/config) compiler: sparc64-linux-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403241158.NX7mmXFv-lkp@intel.com/ New smatch warnings: net/ipv4/tcp_ao.c:2089 tcp_ao_copy_mkts_to_user() error: __builtin_memcpy() '&key->addr' too small (4 vs 16) Old smatch warnings: net/ipv4/tcp_ao.c:1755 tcp_ao_del_cmd() error: memcmp() '&key->addr' too small (4 vs 16) vim +2089 net/ipv4/tcp_ao.c 4954f17ddefc51 Dmitry Safonov 2023-10-23 1896 ef84703a911f4e Dmitry Safonov 2023-10-23 1897 /* tcp_ao_copy_mkts_to_user(ao_info, optval, optlen) ef84703a911f4e Dmitry Safonov 2023-10-23 1898 * ef84703a911f4e Dmitry Safonov 2023-10-23 1899 * @ao_info: struct tcp_ao_info on the socket that ef84703a911f4e Dmitry Safonov 2023-10-23 1900 * socket getsockopt(TCP_AO_GET_KEYS) is executed on ef84703a911f4e Dmitry Safonov 2023-10-23 1901 * @optval: pointer to array of tcp_ao_getsockopt structures in user space. ef84703a911f4e Dmitry Safonov 2023-10-23 1902 * Must be != NULL. ef84703a911f4e Dmitry Safonov 2023-10-23 1903 * @optlen: pointer to size of tcp_ao_getsockopt structure. ef84703a911f4e Dmitry Safonov 2023-10-23 1904 * Must be != NULL. ef84703a911f4e Dmitry Safonov 2023-10-23 1905 * ef84703a911f4e Dmitry Safonov 2023-10-23 1906 * Return value: 0 on success, a negative error number otherwise. ef84703a911f4e Dmitry Safonov 2023-10-23 1907 * ef84703a911f4e Dmitry Safonov 2023-10-23 1908 * optval points to an array of tcp_ao_getsockopt structures in user space. ef84703a911f4e Dmitry Safonov 2023-10-23 1909 * optval[0] is used as both input and output to getsockopt. It determines ef84703a911f4e Dmitry Safonov 2023-10-23 1910 * which keys are returned by the kernel. ef84703a911f4e Dmitry Safonov 2023-10-23 1911 * optval[0].nkeys is the size of the array in user space. On return it contains ef84703a911f4e Dmitry Safonov 2023-10-23 1912 * the number of keys matching the search criteria. ef84703a911f4e Dmitry Safonov 2023-10-23 1913 * If tcp_ao_getsockopt::get_all is set, then all keys in the socket are ef84703a911f4e Dmitry Safonov 2023-10-23 1914 * returned, otherwise only keys matching <addr, prefix, sndid, rcvid> ef84703a911f4e Dmitry Safonov 2023-10-23 1915 * in optval[0] are returned. ef84703a911f4e Dmitry Safonov 2023-10-23 1916 * optlen is also used as both input and output. The user provides the size ef84703a911f4e Dmitry Safonov 2023-10-23 1917 * of struct tcp_ao_getsockopt in user space, and the kernel returns the size ef84703a911f4e Dmitry Safonov 2023-10-23 1918 * of the structure in kernel space. ef84703a911f4e Dmitry Safonov 2023-10-23 1919 * The size of struct tcp_ao_getsockopt may differ between user and kernel. ef84703a911f4e Dmitry Safonov 2023-10-23 1920 * There are three cases to consider: ef84703a911f4e Dmitry Safonov 2023-10-23 1921 * * If usize == ksize, then keys are copied verbatim. ef84703a911f4e Dmitry Safonov 2023-10-23 1922 * * If usize < ksize, then the userspace has passed an old struct to a ef84703a911f4e Dmitry Safonov 2023-10-23 1923 * newer kernel. The rest of the trailing bytes in optval[0] ef84703a911f4e Dmitry Safonov 2023-10-23 1924 * (ksize - usize) are interpreted as 0 by the kernel. ef84703a911f4e Dmitry Safonov 2023-10-23 1925 * * If usize > ksize, then the userspace has passed a new struct to an ef84703a911f4e Dmitry Safonov 2023-10-23 1926 * older kernel. The trailing bytes unknown to the kernel (usize - ksize) ef84703a911f4e Dmitry Safonov 2023-10-23 1927 * are checked to ensure they are zeroed, otherwise -E2BIG is returned. ef84703a911f4e Dmitry Safonov 2023-10-23 1928 * On return the kernel fills in min(usize, ksize) in each entry of the array. ef84703a911f4e Dmitry Safonov 2023-10-23 1929 * The layout of the fields in the user and kernel structures is expected to ef84703a911f4e Dmitry Safonov 2023-10-23 1930 * be the same (including in the 32bit vs 64bit case). ef84703a911f4e Dmitry Safonov 2023-10-23 1931 */ ef84703a911f4e Dmitry Safonov 2023-10-23 1932 static int tcp_ao_copy_mkts_to_user(struct tcp_ao_info *ao_info, ef84703a911f4e Dmitry Safonov 2023-10-23 1933 sockptr_t optval, sockptr_t optlen) ef84703a911f4e Dmitry Safonov 2023-10-23 1934 { ef84703a911f4e Dmitry Safonov 2023-10-23 1935 struct tcp_ao_getsockopt opt_in, opt_out; ef84703a911f4e Dmitry Safonov 2023-10-23 1936 struct tcp_ao_key *key, *current_key; ef84703a911f4e Dmitry Safonov 2023-10-23 1937 bool do_address_matching = true; ef84703a911f4e Dmitry Safonov 2023-10-23 1938 union tcp_ao_addr *addr = NULL; ef84703a911f4e Dmitry Safonov 2023-10-23 1939 unsigned int max_keys; /* maximum number of keys to copy to user */ ef84703a911f4e Dmitry Safonov 2023-10-23 1940 size_t out_offset = 0; ef84703a911f4e Dmitry Safonov 2023-10-23 1941 size_t bytes_to_write; /* number of bytes to write to user level */ ef84703a911f4e Dmitry Safonov 2023-10-23 1942 int err, user_len; ef84703a911f4e Dmitry Safonov 2023-10-23 1943 u32 matched_keys; /* keys from ao_info matched so far */ ef84703a911f4e Dmitry Safonov 2023-10-23 1944 int optlen_out; ef84703a911f4e Dmitry Safonov 2023-10-23 1945 __be16 port = 0; ef84703a911f4e Dmitry Safonov 2023-10-23 1946 ef84703a911f4e Dmitry Safonov 2023-10-23 1947 if (copy_from_sockptr(&user_len, optlen, sizeof(int))) ef84703a911f4e Dmitry Safonov 2023-10-23 1948 return -EFAULT; ef84703a911f4e Dmitry Safonov 2023-10-23 1949 ef84703a911f4e Dmitry Safonov 2023-10-23 1950 if (user_len <= 0) ef84703a911f4e Dmitry Safonov 2023-10-23 1951 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 1952 ef84703a911f4e Dmitry Safonov 2023-10-23 1953 memset(&opt_in, 0, sizeof(struct tcp_ao_getsockopt)); ef84703a911f4e Dmitry Safonov 2023-10-23 1954 err = copy_struct_from_sockptr(&opt_in, sizeof(opt_in), ef84703a911f4e Dmitry Safonov 2023-10-23 1955 optval, user_len); ef84703a911f4e Dmitry Safonov 2023-10-23 1956 if (err < 0) ef84703a911f4e Dmitry Safonov 2023-10-23 1957 return err; ef84703a911f4e Dmitry Safonov 2023-10-23 1958 ef84703a911f4e Dmitry Safonov 2023-10-23 1959 if (opt_in.pkt_good || opt_in.pkt_bad) ef84703a911f4e Dmitry Safonov 2023-10-23 1960 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 1961 ef84703a911f4e Dmitry Safonov 2023-10-23 1962 if (opt_in.reserved != 0) ef84703a911f4e Dmitry Safonov 2023-10-23 1963 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 1964 ef84703a911f4e Dmitry Safonov 2023-10-23 1965 max_keys = opt_in.nkeys; ef84703a911f4e Dmitry Safonov 2023-10-23 1966 ef84703a911f4e Dmitry Safonov 2023-10-23 1967 if (opt_in.get_all || opt_in.is_current || opt_in.is_rnext) { ef84703a911f4e Dmitry Safonov 2023-10-23 1968 if (opt_in.get_all && (opt_in.is_current || opt_in.is_rnext)) ef84703a911f4e Dmitry Safonov 2023-10-23 1969 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 1970 do_address_matching = false; ef84703a911f4e Dmitry Safonov 2023-10-23 1971 } ef84703a911f4e Dmitry Safonov 2023-10-23 1972 ef84703a911f4e Dmitry Safonov 2023-10-23 1973 switch (opt_in.addr.ss_family) { ef84703a911f4e Dmitry Safonov 2023-10-23 1974 case AF_INET: { ef84703a911f4e Dmitry Safonov 2023-10-23 1975 struct sockaddr_in *sin; ef84703a911f4e Dmitry Safonov 2023-10-23 1976 __be32 mask; ef84703a911f4e Dmitry Safonov 2023-10-23 1977 ef84703a911f4e Dmitry Safonov 2023-10-23 1978 sin = (struct sockaddr_in *)&opt_in.addr; ef84703a911f4e Dmitry Safonov 2023-10-23 1979 port = sin->sin_port; ef84703a911f4e Dmitry Safonov 2023-10-23 1980 addr = (union tcp_ao_addr *)&sin->sin_addr; ef84703a911f4e Dmitry Safonov 2023-10-23 1981 ef84703a911f4e Dmitry Safonov 2023-10-23 1982 if (opt_in.prefix > 32) ef84703a911f4e Dmitry Safonov 2023-10-23 1983 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 1984 ef84703a911f4e Dmitry Safonov 2023-10-23 1985 if (ntohl(sin->sin_addr.s_addr) == INADDR_ANY && ef84703a911f4e Dmitry Safonov 2023-10-23 1986 opt_in.prefix != 0) ef84703a911f4e Dmitry Safonov 2023-10-23 1987 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 1988 ef84703a911f4e Dmitry Safonov 2023-10-23 1989 mask = inet_make_mask(opt_in.prefix); ef84703a911f4e Dmitry Safonov 2023-10-23 1990 if (sin->sin_addr.s_addr & ~mask) ef84703a911f4e Dmitry Safonov 2023-10-23 1991 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 1992 ef84703a911f4e Dmitry Safonov 2023-10-23 1993 break; ef84703a911f4e Dmitry Safonov 2023-10-23 1994 } ef84703a911f4e Dmitry Safonov 2023-10-23 1995 case AF_INET6: { ef84703a911f4e Dmitry Safonov 2023-10-23 1996 struct sockaddr_in6 *sin6; ef84703a911f4e Dmitry Safonov 2023-10-23 1997 struct in6_addr *addr6; ef84703a911f4e Dmitry Safonov 2023-10-23 1998 ef84703a911f4e Dmitry Safonov 2023-10-23 1999 sin6 = (struct sockaddr_in6 *)&opt_in.addr; ef84703a911f4e Dmitry Safonov 2023-10-23 2000 addr = (union tcp_ao_addr *)&sin6->sin6_addr; ef84703a911f4e Dmitry Safonov 2023-10-23 2001 addr6 = &sin6->sin6_addr; ef84703a911f4e Dmitry Safonov 2023-10-23 2002 port = sin6->sin6_port; ef84703a911f4e Dmitry Safonov 2023-10-23 2003 ef84703a911f4e Dmitry Safonov 2023-10-23 2004 /* We don't have to change family and @addr here if ef84703a911f4e Dmitry Safonov 2023-10-23 2005 * ipv6_addr_v4mapped() like in key adding: ef84703a911f4e Dmitry Safonov 2023-10-23 2006 * tcp_ao_key_cmp() does it. Do the sanity checks though. ef84703a911f4e Dmitry Safonov 2023-10-23 2007 */ ef84703a911f4e Dmitry Safonov 2023-10-23 2008 if (opt_in.prefix != 0) { ef84703a911f4e Dmitry Safonov 2023-10-23 2009 if (ipv6_addr_v4mapped(addr6)) { ef84703a911f4e Dmitry Safonov 2023-10-23 2010 __be32 mask, addr4 = addr6->s6_addr32[3]; ef84703a911f4e Dmitry Safonov 2023-10-23 2011 ef84703a911f4e Dmitry Safonov 2023-10-23 2012 if (opt_in.prefix > 32 || ef84703a911f4e Dmitry Safonov 2023-10-23 2013 ntohl(addr4) == INADDR_ANY) ef84703a911f4e Dmitry Safonov 2023-10-23 2014 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 2015 mask = inet_make_mask(opt_in.prefix); ef84703a911f4e Dmitry Safonov 2023-10-23 2016 if (addr4 & ~mask) ef84703a911f4e Dmitry Safonov 2023-10-23 2017 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 2018 } else { ef84703a911f4e Dmitry Safonov 2023-10-23 2019 struct in6_addr pfx; ef84703a911f4e Dmitry Safonov 2023-10-23 2020 ef84703a911f4e Dmitry Safonov 2023-10-23 2021 if (ipv6_addr_any(addr6) || ef84703a911f4e Dmitry Safonov 2023-10-23 2022 opt_in.prefix > 128) ef84703a911f4e Dmitry Safonov 2023-10-23 2023 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 2024 ef84703a911f4e Dmitry Safonov 2023-10-23 2025 ipv6_addr_prefix(&pfx, addr6, opt_in.prefix); ef84703a911f4e Dmitry Safonov 2023-10-23 2026 if (ipv6_addr_cmp(&pfx, addr6)) ef84703a911f4e Dmitry Safonov 2023-10-23 2027 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 2028 } ef84703a911f4e Dmitry Safonov 2023-10-23 2029 } else if (!ipv6_addr_any(addr6)) { ef84703a911f4e Dmitry Safonov 2023-10-23 2030 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 2031 } ef84703a911f4e Dmitry Safonov 2023-10-23 2032 break; ef84703a911f4e Dmitry Safonov 2023-10-23 2033 } ef84703a911f4e Dmitry Safonov 2023-10-23 2034 case 0: ef84703a911f4e Dmitry Safonov 2023-10-23 2035 if (!do_address_matching) ef84703a911f4e Dmitry Safonov 2023-10-23 2036 break; ef84703a911f4e Dmitry Safonov 2023-10-23 2037 fallthrough; ef84703a911f4e Dmitry Safonov 2023-10-23 2038 default: ef84703a911f4e Dmitry Safonov 2023-10-23 2039 return -EAFNOSUPPORT; ef84703a911f4e Dmitry Safonov 2023-10-23 2040 } ef84703a911f4e Dmitry Safonov 2023-10-23 2041 ef84703a911f4e Dmitry Safonov 2023-10-23 2042 if (!do_address_matching) { ef84703a911f4e Dmitry Safonov 2023-10-23 2043 /* We could just ignore those, but let's do stricter checks */ ef84703a911f4e Dmitry Safonov 2023-10-23 2044 if (addr || port) ef84703a911f4e Dmitry Safonov 2023-10-23 2045 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 2046 if (opt_in.prefix || opt_in.sndid || opt_in.rcvid) ef84703a911f4e Dmitry Safonov 2023-10-23 2047 return -EINVAL; ef84703a911f4e Dmitry Safonov 2023-10-23 2048 } ef84703a911f4e Dmitry Safonov 2023-10-23 2049 ef84703a911f4e Dmitry Safonov 2023-10-23 2050 bytes_to_write = min_t(int, user_len, sizeof(struct tcp_ao_getsockopt)); ef84703a911f4e Dmitry Safonov 2023-10-23 2051 matched_keys = 0; ef84703a911f4e Dmitry Safonov 2023-10-23 2052 /* May change in RX, while we're dumping, pre-fetch it */ ef84703a911f4e Dmitry Safonov 2023-10-23 2053 current_key = READ_ONCE(ao_info->current_key); ef84703a911f4e Dmitry Safonov 2023-10-23 2054 ef84703a911f4e Dmitry Safonov 2023-10-23 2055 hlist_for_each_entry_rcu(key, &ao_info->head, node) { ef84703a911f4e Dmitry Safonov 2023-10-23 2056 if (opt_in.get_all) ef84703a911f4e Dmitry Safonov 2023-10-23 2057 goto match; ef84703a911f4e Dmitry Safonov 2023-10-23 2058 ef84703a911f4e Dmitry Safonov 2023-10-23 2059 if (opt_in.is_current || opt_in.is_rnext) { ef84703a911f4e Dmitry Safonov 2023-10-23 2060 if (opt_in.is_current && key == current_key) ef84703a911f4e Dmitry Safonov 2023-10-23 2061 goto match; ef84703a911f4e Dmitry Safonov 2023-10-23 2062 if (opt_in.is_rnext && key == ao_info->rnext_key) ef84703a911f4e Dmitry Safonov 2023-10-23 2063 goto match; ef84703a911f4e Dmitry Safonov 2023-10-23 2064 continue; ef84703a911f4e Dmitry Safonov 2023-10-23 2065 } ef84703a911f4e Dmitry Safonov 2023-10-23 2066 ef84703a911f4e Dmitry Safonov 2023-10-23 2067 if (tcp_ao_key_cmp(key, addr, opt_in.prefix, ef84703a911f4e Dmitry Safonov 2023-10-23 2068 opt_in.addr.ss_family, ef84703a911f4e Dmitry Safonov 2023-10-23 2069 opt_in.sndid, opt_in.rcvid) != 0) ef84703a911f4e Dmitry Safonov 2023-10-23 2070 continue; ef84703a911f4e Dmitry Safonov 2023-10-23 2071 match: ef84703a911f4e Dmitry Safonov 2023-10-23 2072 matched_keys++; ef84703a911f4e Dmitry Safonov 2023-10-23 2073 if (matched_keys > max_keys) ef84703a911f4e Dmitry Safonov 2023-10-23 2074 continue; ef84703a911f4e Dmitry Safonov 2023-10-23 2075 ef84703a911f4e Dmitry Safonov 2023-10-23 2076 memset(&opt_out, 0, sizeof(struct tcp_ao_getsockopt)); ef84703a911f4e Dmitry Safonov 2023-10-23 2077 ef84703a911f4e Dmitry Safonov 2023-10-23 2078 if (key->family == AF_INET) { ef84703a911f4e Dmitry Safonov 2023-10-23 2079 struct sockaddr_in *sin_out = (struct sockaddr_in *)&opt_out.addr; ef84703a911f4e Dmitry Safonov 2023-10-23 2080 ef84703a911f4e Dmitry Safonov 2023-10-23 2081 sin_out->sin_family = key->family; ef84703a911f4e Dmitry Safonov 2023-10-23 2082 sin_out->sin_port = 0; ef84703a911f4e Dmitry Safonov 2023-10-23 2083 memcpy(&sin_out->sin_addr, &key->addr, sizeof(struct in_addr)); ef84703a911f4e Dmitry Safonov 2023-10-23 2084 } else { ef84703a911f4e Dmitry Safonov 2023-10-23 2085 struct sockaddr_in6 *sin6_out = (struct sockaddr_in6 *)&opt_out.addr; ef84703a911f4e Dmitry Safonov 2023-10-23 2086 ef84703a911f4e Dmitry Safonov 2023-10-23 2087 sin6_out->sin6_family = key->family; ef84703a911f4e Dmitry Safonov 2023-10-23 2088 sin6_out->sin6_port = 0; ef84703a911f4e Dmitry Safonov 2023-10-23 @2089 memcpy(&sin6_out->sin6_addr, &key->addr, sizeof(struct in6_addr)); ef84703a911f4e Dmitry Safonov 2023-10-23 2090 } ef84703a911f4e Dmitry Safonov 2023-10-23 2091 opt_out.sndid = key->sndid; ef84703a911f4e Dmitry Safonov 2023-10-23 2092 opt_out.rcvid = key->rcvid; ef84703a911f4e Dmitry Safonov 2023-10-23 2093 opt_out.prefix = key->prefixlen; ef84703a911f4e Dmitry Safonov 2023-10-23 2094 opt_out.keyflags = key->keyflags; ef84703a911f4e Dmitry Safonov 2023-10-23 2095 opt_out.is_current = (key == current_key); ef84703a911f4e Dmitry Safonov 2023-10-23 2096 opt_out.is_rnext = (key == ao_info->rnext_key); ef84703a911f4e Dmitry Safonov 2023-10-23 2097 opt_out.nkeys = 0; ef84703a911f4e Dmitry Safonov 2023-10-23 2098 opt_out.maclen = key->maclen; ef84703a911f4e Dmitry Safonov 2023-10-23 2099 opt_out.keylen = key->keylen; ef84703a911f4e Dmitry Safonov 2023-10-23 2100 opt_out.pkt_good = atomic64_read(&key->pkt_good); ef84703a911f4e Dmitry Safonov 2023-10-23 2101 opt_out.pkt_bad = atomic64_read(&key->pkt_bad); ef84703a911f4e Dmitry Safonov 2023-10-23 2102 memcpy(&opt_out.key, key->key, key->keylen); ef84703a911f4e Dmitry Safonov 2023-10-23 2103 tcp_sigpool_algo(key->tcp_sigpool_id, opt_out.alg_name, 64); ef84703a911f4e Dmitry Safonov 2023-10-23 2104 ef84703a911f4e Dmitry Safonov 2023-10-23 2105 /* Copy key to user */ ef84703a911f4e Dmitry Safonov 2023-10-23 2106 if (copy_to_sockptr_offset(optval, out_offset, ef84703a911f4e Dmitry Safonov 2023-10-23 2107 &opt_out, bytes_to_write)) ef84703a911f4e Dmitry Safonov 2023-10-23 2108 return -EFAULT; ef84703a911f4e Dmitry Safonov 2023-10-23 2109 out_offset += user_len; ef84703a911f4e Dmitry Safonov 2023-10-23 2110 } ef84703a911f4e Dmitry Safonov 2023-10-23 2111 ef84703a911f4e Dmitry Safonov 2023-10-23 2112 optlen_out = (int)sizeof(struct tcp_ao_getsockopt); ef84703a911f4e Dmitry Safonov 2023-10-23 2113 if (copy_to_sockptr(optlen, &optlen_out, sizeof(int))) ef84703a911f4e Dmitry Safonov 2023-10-23 2114 return -EFAULT; ef84703a911f4e Dmitry Safonov 2023-10-23 2115 ef84703a911f4e Dmitry Safonov 2023-10-23 2116 out_offset = offsetof(struct tcp_ao_getsockopt, nkeys); ef84703a911f4e Dmitry Safonov 2023-10-23 2117 if (copy_to_sockptr_offset(optval, out_offset, ef84703a911f4e Dmitry Safonov 2023-10-23 2118 &matched_keys, sizeof(u32))) ef84703a911f4e Dmitry Safonov 2023-10-23 2119 return -EFAULT; ef84703a911f4e Dmitry Safonov 2023-10-23 2120 ef84703a911f4e Dmitry Safonov 2023-10-23 2121 return 0; ef84703a911f4e Dmitry Safonov 2023-10-23 2122 } ef84703a911f4e Dmitry Safonov 2023-10-23 2123 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Hi Tim,
Thanks a lot for being kind enough to spend your precious time to analyze my storage issues.
My eyes were on '/var/lib/jenkins/workspace' when I copy pasted it to you.
I will look into it and resolve those issues. Thanks a lot once again.
I will surely try the 'next' branch whenever it is available to check 'user authentication, security, and job distribution' features.
Thanks a have a nice weekend.
Regards,
Dhinakar K.
-----Original Message-----
From: Bird, Tim [mailto:Tim.Bird@sony.com]
Sent: Saturday, March 23, 2024 3:58 AM
To: dhinakar.k <dhinakar.k@samsung.com>; fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org
Subject: RE: RE[3]: Distribute continuous integration (build) to servers outside docker container
Dhinakar,
OK - here's a summary of your object counts and storage issues:
/var/lib/jenkins - 32G
.../userContent - 1.8G
.../jobs - 11G
.../workspace - 19G
/fuego-rw - 13G
../buildzone - ~6G
../buildzone/X86-SSH-Test.default.Functional.kernel_build-x86-64 - 1.8G
../buildzone/Functional.LTP-x86_64 - 2.4G
6 nodes, 135 jobs, 78 runs
docker image: 2.41G?
(or is it 173 GB?)
This is confusing. Your latest fuego docker container is 2.41G, but you have /var/lib/jenkins that is about 32G (and that should all be in your container image).
It looks like the builds for the kernel and for LTP are taking the most space.
I have no idea why your /var/lib/jenkins/jobs directory would be so big (11G) Maybe do:
$ du -sh /var/lib/jenkins/jobs/* | sort -sh and see which jobs have a lot of info.
Also, I don't know what's going on with your /var/lib/jenkins/workspace (19G) I don't even have that directory on my system.
My stats look quite different:
I have 13 nodes, 387 jobs and 1129 runs in my most active Fuego container, my /var/lib/Jenkins is only 204M.
My /fuego-rw/buildzone is 64G, due to lots of instances of LTP (and something very funky about one Interbench build):
1.2G ren1.latest-smoke.Functional.LTP-poky-aarch64
1.7G Functional.kselftest-x86_64
1.7G rpi3-2.default.Functional.kernel_build-aarch64
1.9G Functional.LTP_one_at_a_time-debian-armhf
2.0G Functional.raspi_kinstall-debian-armhf
2.3G bbb.latest-smoke.Functional.LTP-debian-armhf
2.4G Functional.LTP-x86_64
2.4G Functional.LTP_one_at_a_time-x86_64
2.5G Functional.LTP-poky-aarch64
2.5G Functional.LTP_one_at_a_time-aarch64
2.5G Functional.LTP_one_at_a_time-poky-aarch64
3.0G min1.latest-smoke.Functional.LTP-x86_64
3.0G min1.latest.Functional.LTP-x86_64
3.2G rpi3-2.latest-smoke.Functional.LTP-aarch64
32G Benchmark.Interbench-x86_64
There might be stuff in /var/lib/jenkins/workspace you could get rid of.
I have a lot more runs on my system, but very many of those have very short run.json files, as they are for tests with small results. I believe the largest run.json and consolelog.txt files are for LTP. If you have a lot of those, maybe you can archive old ones to reduce disk usage and improve performance.
In any event, is there any particular operation which is taking a long time to complete, due to the docker size (or fuego directory) being too big or taking too much space?
Finally, I'm still working on the new docker container (with more recent versions of Debian and Jenkins). I've already fixed a few bugs that I found, but there are a lot of old Fuego packages that don't compile with newer toolchains. There are workarounds for this, but it will take a while to implement.
My plan is to publish my working branch for this work on bitbucket, as a 'next' branch, even though not all problems are resolved.
You could then build a container using that (if you want to), and check if the new version of Jenkins has the features you need for user authentication, security, and job distribution.
I can give you some install steps for using a 'next' branch, if you are interested in trying that.
Sorry this has taken so long.
-- Tim
> -----Original Message-----
> From: dhinakar.k <dhinakar.k@samsung.com> Hi Tim,
>
> Thanks for your prompt response.
> Please find the details you requested below.
>
> # du -sh /fuego-rw/logs/* | sort -h
> 4.0K /fuego-rw/logs/README
> 8.0K /fuego-rw/logs/logruns
> 56K /fuego-rw/logs/Benchmark.gtkperf
> 60K /fuego-rw/logs/Functional.glib
> 96K /fuego-rw/logs/Benchmark.GLMark
> 228K /fuego-rw/logs/theme
> 284K /fuego-rw/logs/Benchmark.dbench4
> 284K /fuego-rw/logs/Benchmark.himeno
> 284K /fuego-rw/logs/Benchmark.iperf
> 284K /fuego-rw/logs/Benchmark.x11perf
> 288K /fuego-rw/logs/Benchmark.linpack
> 288K /fuego-rw/logs/Functional.aiostress
> 288K /fuego-rw/logs/Functional.bc
> 288K /fuego-rw/logs/Functional.crashme
> 288K /fuego-rw/logs/Functional.fontconfig
> 288K /fuego-rw/logs/Functional.hello_world
> 288K /fuego-rw/logs/Functional.stress
> 288K /fuego-rw/logs/Functional.synctest
> 288K /fuego-rw/logs/Functional.zlib
> 292K /fuego-rw/logs/Benchmark.Stream
> 292K /fuego-rw/logs/Benchmark.netperf
> 292K /fuego-rw/logs/Benchmark.tiobench
> 296K /fuego-rw/logs/Functional.ipv6connect
> 304K /fuego-rw/logs/Benchmark.nbench_byte
> 304K /fuego-rw/logs/Benchmark.netpipe
> 312K /fuego-rw/logs/Benchmark.fio
> 312K /fuego-rw/logs/Functional.scrashme
> 316K /fuego-rw/logs/Benchmark.Java
> 344K /fuego-rw/logs/Functional.bzip2
> 352K /fuego-rw/logs/Benchmark.IOzone
> 352K /fuego-rw/logs/Functional.jpeg
> 356K /fuego-rw/logs/Benchmark.OpenSSL
> 372K /fuego-rw/logs/Functional.netperf
> 396K /fuego-rw/logs/Functional.expat
> 400K /fuego-rw/logs/Benchmark.lmbench2
> 404K /fuego-rw/logs/Functional.kernel_build
> 424K /fuego-rw/logs/Functional.rmaptest
> 524K /fuego-rw/logs/image
> 536K /fuego-rw/logs/Benchmark.Interbench
> 552K /fuego-rw/logs/Benchmark.ebizzy
> 552K /fuego-rw/logs/Benchmark.signaltest
> 556K /fuego-rw/logs/Functional.pi_tests
> 588K /fuego-rw/logs/Benchmark.Whetstone
> 740K /fuego-rw/logs/Functional.ft2demos
> 808K /fuego-rw/logs/Benchmark.Dhrystone
> 1.1M /fuego-rw/logs/Benchmark.cyclictest
> 1.1M /fuego-rw/logs/Benchmark.ffsb
> 1.2M /fuego-rw/logs/Benchmark.bonnie
> 1.6M /fuego-rw/logs/Benchmark.hackbench
> 2.1M /fuego-rw/logs/Functional.OpenSSL
> 7.5M /fuego-rw/logs/Extract
> 11M /fuego-rw/logs/Functional.linus_stress
> 12M /fuego-rw/logs/Functional.LTP
>
> # ftc list-nodes | wc -l
> 6
>
> Jenkins nodes in this system:
> ARM64-SSH-Test
> ARM64-Serial-Test
> SAPIENT-MAIN-Server-Node
> X86-SSH-Test
> X86-Serial-Test
>
> # ftc list-jobs | wc -l
> 135
>
> # ftc list-runs | wc -l
> 78
>
> Regards,
> Dhinakar K.
>
> -----Original Message-----
> From: Bird, Tim [mailto:Tim.Bird@sony.com]
> Sent: Saturday, March 16, 2024 12:12 AM
> To: dhinakar.k <dhinakar.k@samsung.com>; fuego+owner@lists.linux.dev;
> fuego@lists.linuxfoundation.org
> Subject: RE: RE[3]: Distribute continuous integration (build) to
> servers outside docker container
>
> Dhinkar,
>
> Can you send me the info for these as well:
>
> # du -sh /fuego-rw/logs/* | sort -h
>
>
> # ftc list-nodes | wc -l
>
>
> # ftc list-jobs | wc -l
>
>
> # ftc list-runs | wc -l
>
>
> -- Tim
>
> > -----Original Message-----
> > From: dhinakar.k <dhinakar.k@samsung.com>
> > Sent: Friday, March 15, 2024 9:38 AM
> > To: Bird, Tim <Tim.Bird@sony.com>; fuego+owner@lists.linux.dev;
> > fuego@lists.linuxfoundation.org
> > Subject: RE[3]: Distribute continuous integration (build) to servers
> > outside docker container
> >
> > Hi Tim, Thanks a lot for your response. Please find below the
> > details that you requested. # du -sh /var/lib/Jenkins 32G
> > /var/lib/Jenkins # du -sh
> > /var/lib/jenkins/* | sort -h 0 /var/lib/jenkins/secret. key.
> > not-so-secret 4. 0K /var/lib/jenkins/com. cloudbees. hudson. plugins.
> > folder. config. AbstractFolderConfiguration. xml
> > ZjQcmQRYFpfptBannerStart Caution : This email originated from outside of Sony.
> > Do not click links or open any attachments unless you recognize the sender and know the content is safe. Please report phishing if unsure.
> >
> > ZjQcmQRYFpfptBannerEnd
> > Hi Tim,
> >
> > Thanks a lot for your response.
> > Please find below the details that you requested.
> >
> > # du -sh /var/lib/Jenkins
> > 32G /var/lib/Jenkins
> >
> > # du -sh /var/lib/jenkins/* | sort -h
> > 0 /var/lib/jenkins/secret.key.not-so-secret
> > 4.0K /var/lib/jenkins/com.cloudbees.hudson.plugins.folder.config.AbstractFolderConfiguration.xml
> > 4.0K /var/lib/jenkins/com.mtvi.plateng.hudson.ldap.LdapMailAddressResolver.xml
> > 4.0K /var/lib/jenkins/com.orctom.jenkins.plugin.buildtimestamp.BuildTimestampWrapper.xml
> > 4.0K /var/lib/jenkins/credentials.xml
> > 4.0K /var/lib/jenkins/hudson.maven.MavenModuleSet.xml
> > 4.0K /var/lib/jenkins/hudson.model.UpdateCenter.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.emailext.ExtendedEmailPublisher.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.git.GitSCM.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.git.GitTool.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.sidebar_link.SidebarLinkPlugin.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.sonar.SonarGlobalConfiguration.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.timestamper.TimestamperConfig.xml
> > 4.0K /var/lib/jenkins/hudson.tasks.Mailer.xml
> > 4.0K /var/lib/jenkins/hudson.tasks.Shell.xml
> > 4.0K /var/lib/jenkins/hudson.triggers.SCMTrigger.xml
> > 4.0K /var/lib/jenkins/identity.key.enc
> > 4.0K /var/lib/jenkins/io.jenkins.plugins.junit.storage.JunitTestResultStorageConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.fingerprints.GlobalFingerprintConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion
> > 4.0K /var/lib/jenkins/jenkins.install.UpgradeWizard.state
> > 4.0K /var/lib/jenkins/jenkins.model.ArtifactManagerConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.model.GlobalBuildDiscarderConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.model.JenkinsLocationConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.plugins.msginject.MsgInjectConfig.xml
> > 4.0K /var/lib/jenkins/jenkins.security.ResourceDomainConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.security.apitoken.ApiTokenPropertyConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.telemetry.Correlator.xml
> > 4.0K /var/lib/jenkins/net.plavcak.jenkins.plugins.scmskip.SCMSkipBuildWrapper.xml
> > 4.0K /var/lib/jenkins/net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.xml
> > 4.0K /var/lib/jenkins/nodeMonitors.xml
> > 4.0K /var/lib/jenkins/org.codefirst.SimpleThemeDecorator.xml
> > 4.0K /var/lib/jenkins/org.jenkinsCi.plugins.projectDescriptionSetter.DescriptionSetterWrapper.xml
> > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.ansible_tower.AnsibleTower.xml
> > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.corsfilter.AccessControlsFilter.xml
> > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.lucene.search.config.SearchBackendConfiguration.xml
> > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.workflow.flow.GlobalDefaultFlowDurabilityLevel.xml
> > 4.0K /var/lib/jenkins/org.quality.gates.jenkins.plugin.GlobalConfig.xml
> > 4.0K /var/lib/jenkins/queue.xml
> > 4.0K /var/lib/jenkins/queue.xml.bak
> > 4.0K /var/lib/jenkins/scriptApproval.xml
> > 4.0K /var/lib/jenkins/secret.key
> > 4.0K /var/lib/jenkins/sidebar-link.xml
> > 12K /var/lib/jenkins/gerrit-trigger.xml
> > 16K /var/lib/jenkins/hudson.plugins.ansicolor.AnsiColorBuildWrapper.xml
> > 20K /var/lib/jenkins/config.xml
> > 44K /var/lib/jenkins/nodes
> > 72K /var/lib/jenkins/secrets
> > 356K /var/lib/jenkins/users
> > 1.7M /var/lib/jenkins/logs
> > 1.8M /var/lib/jenkins/luceneIndex
> > 3.6M /var/lib/jenkins/updates
> > 3.9M /var/lib/jenkins/plugins_backup
> > 316M /var/lib/jenkins/plugins
> > 316M /var/lib/jenkins/plugins_not_working
> > 372M /var/lib/jenkins/plugins_old_2ndFeb2024
> > 376M /var/lib/jenkins/plugins_working_2ndFeb2024
> > 1.8G /var/lib/jenkins/userContent
> > 11G /var/lib/jenkins/jobs
> > 19G /var/lib/jenkins/workspace
> >
> > # du -sh /fuego-rw
> > 13G /fuego-rw
> >
> > # du -sh /fuego-rw/buildzone/* | sort -h # du -sh /fuego-rw/logs/* | sort -h # ftc list-nodes | wc -l # ftc list-jobs | wc -l # ftc list-runs | wc -l
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Dhrystone-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.GLMark-aarch64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.GLMark-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.IOzone-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Interbench-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Java-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.OpenSSL-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Stream-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Whetstone-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.bonnie-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.cyclictest-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.dbench4-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.ebizzy-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.ffsb-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.fio-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.gtkperf-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.hackbench-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.himeno-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.iperf-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.linpack-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.lmbench2-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.nbench_byte-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.netperf-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.netpipe-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.signaltest-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.tiobench-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.x11perf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Dhrystone-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.GLMark-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.IOzone-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Interbench-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Java-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.OpenSSL-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Stream-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Whetstone-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.bonnie-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.cyclictest-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.dbench4-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.ebizzy-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.ffsb-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.fio-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.gtkperf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.hackbench-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.himeno-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.iperf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.linpack-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.lmbench2-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.nbench_byte-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.netperf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.netpipe-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.signaltest-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.tiobench-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.x11perf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.LTP-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.OpenSSL-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.aiostress-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.bc-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.bzip2-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.crashme-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.expat-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.fontconfig-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.ft2demos-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.glib-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.hello_world-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.ipv6connect-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.jpeg-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.linus_stress-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.netperf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.pi_tests-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.rmaptest-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.scrashme-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.stress-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.synctest-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.zlib-x86_64
> > 4.0K /fuego-rw/buildzone/README
> > 12K /fuego-rw/buildzone/Functional.bc-x86_64
> > 32K /fuego-rw/buildzone/Functional.hello_world-x86_64
> > 32K /fuego-rw/buildzone/Functional.linus_stress-x86_64
> > 32K /fuego-rw/buildzone/Functional.synctest-x86_64
> > 36K /fuego-rw/buildzone/Functional.rmaptest-x86_64
> > 48K /fuego-rw/buildzone/Benchmark.himeno-x86_64
> > 48K /fuego-rw/buildzone/Benchmark.linpack-x86_64
> > 48K /fuego-rw/buildzone/Functional.ipv6connect-x86_64
> > 60K /fuego-rw/buildzone/Benchmark.Stream-x86_64
> > 76K /fuego-rw/buildzone/Benchmark.Whetstone-x86_64
> > 76K /fuego-rw/buildzone/Benchmark.ebizzy-x86_64
> > 84K /fuego-rw/buildzone/Functional.aiostress-x86_64
> > 168K /fuego-rw/buildzone/Benchmark.Dhrystone-x86_64
> > 240K /fuego-rw/buildzone/Benchmark.tiobench-x86_64
> > 244K /fuego-rw/buildzone/Functional.crashme-x86_64
> > 488K /fuego-rw/buildzone/Benchmark.Interbench-x86_64
> > 576K /fuego-rw/buildzone/Functional.scrashme-x86_64
> > 760K /fuego-rw/buildzone/Benchmark.hackbench-x86_64
> > 816K /fuego-rw/buildzone/Benchmark.signaltest-x86_64
> > 868K /fuego-rw/buildzone/Functional.pi_tests-x86_64
> > 900K /fuego-rw/buildzone/Benchmark.netpipe-x86_64
> > 904K /fuego-rw/buildzone/Benchmark.cyclictest-x86_64
> > 1004K /fuego-rw/buildzone/Functional.stress-x86_64
> > 1.3M /fuego-rw/buildzone/Benchmark.ffsb-x86_64
> > 1.6M /fuego-rw/buildzone/Benchmark.GLMark-aarch64
> > 1.6M /fuego-rw/buildzone/Benchmark.GLMark-x86_64
> > 1.7M /fuego-rw/buildzone/Benchmark.nbench_byte-x86_64
> > 2.1M /fuego-rw/buildzone/Benchmark.iperf-x86_64
> > 2.3M /fuego-rw/buildzone/Benchmark.gtkperf-x86_64
> > 2.4M /fuego-rw/buildzone/Benchmark.bonnie-x86_64
> > 2.5M /fuego-rw/buildzone/Benchmark.x11perf-x86_64
> > 2.9M /fuego-rw/buildzone/Functional.bzip2-x86_64
> > 3.0M /fuego-rw/buildzone/Functional.zlib-x86_64
> > 3.1M /fuego-rw/buildzone/Benchmark.IOzone-x86_64
> > 3.5M /fuego-rw/buildzone/Functional.jpeg-x86_64
> > 5.2M /fuego-rw/buildzone/Benchmark.lmbench2-x86_64
> > 6.1M /fuego-rw/buildzone/Benchmark.netperf-x86_64
> > 6.1M /fuego-rw/buildzone/Functional.netperf-x86_64
> > 7.0M /fuego-rw/buildzone/Functional.fontconfig-x86_64
> > 9.1M /fuego-rw/buildzone/Benchmark.fio-x86_64
> > 29M /fuego-rw/buildzone/Functional.expat-x86_64
> > 33M /fuego-rw/buildzone/Benchmark.dbench4-x86_64
> > 34M /fuego-rw/buildzone/Functional.ft2demos-x86_64
> > 49M /fuego-rw/buildzone/Functional.glib-x86_64
> > 74M /fuego-rw/buildzone/Benchmark.OpenSSL-x86_64
> > 74M /fuego-rw/buildzone/Functional.OpenSSL-x86_64
> > 160M /fuego-rw/buildzone/Benchmark.Java-x86_64
> > 1.8G /fuego-rw/buildzone/X86-SSH-Test.default.Functional.kernel_build-x86_64
> > 2.4G /fuego-rw/buildzone/Functional.LTP-x86_64
> >
> > Outside the container, can you run:
> > $ docker image ls
> > nxo-container-backup-2ndsep2021 latest b6a3d16508e8 2 years ago 173GB
> > fuego-base-image-20thaug2019-container latest b2cf22891ac6 4 years ago 2.41GB
> > fuegocontainerbackup-4thmar2019 latest 04112c383476 5 years ago 3.34GB
> > fuego-piper-image-22ndnov2021 latest 0121b1c342e6 6 years ago 10.7GB
> > fuego-xyz-image-22ndnov2021 latest 0bf6b942db70 6 years ago 5.8GB
> > fuego-dart-image-22ndnov2021 latest 1d2c6a99dc0a 6 years ago 1.66GB
> > fuego-pavv-image-22ndnov2021 latest ba71ede1e872 6 years ago 4.63GB
> > fuego-gpu-image-22ndnov2021 latest 42718d86dd09 6 years ago 3.41GB
> >
> > Regarding below request, I just want to lock the Jenkins user
> > interface/ dashboard, so that none can see all the jobs, results,
> > logs and other details without logging in. So to start with even one
> > user with
> login credentials will help.
> > But I don't know how Jenkins credentials relate to user accounts. I
> > haven't ever set up Jenkins to handle multiple user accounts.
> > Indeed, in my current 2.414.1 Jenkins setup I can see an option to
> > list "People" (which I presume is registered user accounts), but I
> > can find no way
> to create or manage new user accounts.
> >
> > Thanks a lot for all other details, they were very helpful.
> >
> > Regards,
> > Dhinakar K.
> >
> > -----Original Message-----
> > From: Bird, Tim [mailto:Tim.Bird@sony.com]
> > Sent: Wednesday, March 13, 2024 5:47 AM
> > To: dhinakar.k <dhinakar.k@samsung.com>;
> > fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org
> > Subject: RE: HTML message rejected: Re: Distribute continuous
> > integration (build) to servers outside docker container
> >
> > Hey Dhinakar,
> >
> > Sorry to not respond sooner. There was a lot to process in your
> > email, and some of it I don't have answers for, but I'll try to give some status and feedback where I can.
> >
> > > -----Original Message-----
> > > From: dhinakar.k <dhinakar.k@samsung.com> Hi Tim,
> > >
> > > I had sent a reply to your response on 3rd Feb.2024, not sure if it had reached you.
> > > I am posting the same message below again.
> > >
> > > Thanks a lot for your prompt reply.
> > > Iam looking forward to try the updated docker container with an
> > > upgraded distribution base from Debian stretch to Debian bullseye,
> > > and from a Jenkins version of 2.249.3 to 2.414.1. Please let me
> > whenever it is available.
> >
> > OK - Will do. I haven't been able to allocate time for testing and
> > fixing it, so I didn't want to push it to the master branch. If I
> > pushed something to a testing branch, would you be able to download
> > from
> there and test it?
> >
> > One issue that came up is that some of the toolchains for some of my
> > old boards/distros are not supported (ie don't work) in Debian bullseye, and so I was looking for solutions for that.
> >
> > > We are migrating to another server, so Iam looking for best
> > > options to transfer all the content to the new server. Since the
> > > docker container size is huge I want to trim it down by removing unwanted old logs.
> >
> > It would be good to know where the container size is coming from.
> > Is it in the Fuego build directories, the Fuego run directories
> > (where Fuego logs and run artifacts are stored), or in the Jenkins
> > build directories (where Jenkins logs and artifacts are)? The
> > materials under /fuego-rw should be on the host system, and not
> > inside the container
> itself (since these are volume mounts). But I don't know how this
> space is accounted to the container (if any). It shouldn't be in any container image.
> >
> > The materials under /var/lib/jenkins are inside the container image.
> >
> > Can you run the following commands, inside your container, and send the results:
> >
> > # du -sh /var/lib/jenkins
> > # du -sh /var/lib/jenkins/* | sort -h # du -sh /fuego-rw # du -sh
> > /fuego-rw/buildzone/* | sort -h # du -sh /fuego-rw/logs/* | sort -h
> > # ftc list-nodes | wc -l # ftc list-jobs | wc -l # ftc list-runs |
> > wc -l
> >
> > Outside the container, can you run:
> > $ docker image ls
> > (and remove any lines not related to fuego images)
> >
> > But I don't know how Jenkins credentials relate to user accounts. I
> > haven't ever set up Jenkins to handle multiple user accounts.
> > Indeed, in my current 2.414.1 Jenkins setup I can see an option to
> > list "People" (which I presume is registered user accounts), but I
> > can find no way
> to create or manage new user accounts.
> >
> > > Also, I am worried about server crash and hard disk crash due to so many read/write cycles (that happens during continuous integration).
> > > Hence looking for the best way to back up the container and also
> > > to distribute the load & read/write cycles to another server (via
> > > an ssh agent). I tried with plain Jenkins via ssh credentials
> > > plugin, it seems feasible. Hence if fuego upgrades to debian
> > > bullseye it would be really
> > helpful.
> > OK - I'll keep plugging away at this.
> >
> > >
> > > Also, would like to know, when login credentials support will be
> > > available in fuego? Because as a security measure we are supposed
> > > to have login credentials for each user. Will be available after
> > > debian
> > upgrade?
> >
> > I believe you are referring to Jenkins credentials? It appears that
> > Jenkins supports credentials in version 2.414, which is the new
> > version of Jenkins in the new docker container (with the Debian
> > upgrade). So
> I believe the answer is yes.
> >
> > But I don't know how Jenkins credentials relate to user accounts. I
> > haven't ever set up Jenkins to handle multiple user accounts.
> > Indeed, in my current 2.414.1 Jenkins setup I can see an option to
> > list "People" (which I presume is registered user accounts), but I
> > can find no way
> to create or manage new user accounts.
> >
> > > With respect to removing the logs I will figure out the best way
> > > as I see so many options but not sure if that will reduce the
> > > container size directly or need to run some container commands to
> > > trim it down. I
> > will explore that as well and email my observations in this forum.
> >
> > I have considered adding an "rm-run" sub-command to ftc, which would allow you to remove old runs.
> > However, I'd like to see if it's the run data that is causing the size problem that you are seeing.
> >
> > If you want to archive the data for an individual run, then you can
> > use 'ftc package-run' and move the resulting package to some
> > long-term storage device (before, ostensibly, removing that run from
> > the
> > system.)
> >
> > I hope this is helpful.
> > -- Tim
> >
> >
> >
> > >
> > > Regards,
> > > Dhinakar K.
> > >
> > > -----Original Message-----
> > > From: Bird, Tim [mailto:Tim.Bird@sony.com]
> > > Sent: Saturday, February 3, 2024 3:44 AM
> > > To: dhinakar k <dhinakar.k@gmail.com>;
> > > fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org
> > > Subject: RE: HTML message rejected: Re: Distribute continuous
> > > integration (build) to servers outside docker container
> > >
> > > Dhinakar, See my answers inline below..
> > >
> > > > -----Original Message-----
> > > > From: dhinakar k <dhinakar.k@gmail.com> Dear Fuego users,
> > > >
> > > > I have a requirement, so I thought of checking with the
> > > > community if it was feasible and if so what is the best or most
> > > > efficient way to implement it.
> > > > We have fuego setup in a server and all our continuous
> > > > integration jobs (for multiple code bases) are setup in it. But
> > > > the issue is there are too many builds happening, which puts
> > > > pressure on the hard disk (so many read/writes) and also
> > > > increases the docker container size (because of build logs).
> > > >
> > > > Hence I would like to know if we can distribute the load to
> > > > another server, for e.g. job will be created on our main server
> > > > but build will happen on the agent on another server. The idea
> > > > is to move out all cpu, memory, storage intensive activity to
> > > > agents (other
> > > > servers) on the network. The resultant logs can also be stored
> > > > on those servers (outside docker container) so that docker size
> > > > won't be growing rapidly.
> > > >
> > > > I tried creating a new node and setup an agent (connect via ssh)
> > > > but facing issues in installing the 'SSH Build Agents' plugin
> > > > because of compatibility issues (jenkins version needs to be upgraded).
> > > >
> > > > If anyone already tried and has a solution for this issue please let me know.
> > >
> > > Unfortunately, I have not tried this, so I'm not familiar with how Jenkins supports distributed jobs.
> > >
> > > But I have a few ideas to share.
> > >
> > > First, I'm working now on an update to the docker container, from
> > > a distribution base of Debian stretch to Debian bullseye, and from
> > > a Jenkins version of 2.249.3 to 2.414.1 (thanks to a patch
> > > provided by Fuego user Yoichi Tachibana). I have applied the
> > > patches, but found
> > some issues with the build instructions for some packages working in
> > Debian bullseye. So I have not committed the changes to
> > > the Fuego master branch yet. I hope to be able to do this soon.
> > >
> > > This might help with the issue of not being able to use the ssh agent plugin for Jenkins.
> > >
> > > Second, it may be possible to do some kind of proxy job submission
> > > thing, by creating proxy jobs on the main Jenkins server, but
> > > having the jobs actually executed ("built", in Jenkins
> > > terminology) on secondary
> > servers.
> > >
> > > There are a number of ways of supporting remote execution, and how
> > > you implement it will determine where the CPU cycles and memory
> > > usage is during the job, and where the logs end up living (and
> > > taking up
> > > space.)
> > >
> > > If you are using 'ttc' as your transport layer, recent versions of
> > > ttc have support for remote boards via ssh (configured in ttc.conf). But that would leave logs on the master server.
> > >
> > > There are multiple ways to configure Fuego on the secondary
> > > servers
> > > - for example using Docker containers or installing Fuego natively.
> > > In any event, it may be possible to set up proxy jobs on the main
> > > server that
> > call 'ftc' on the secondary
> > > servers, to run the jobs of interest. Depending on how this was structured
> > > you may end up with build artifacts and logs on the secondary
> > > system, and only Jenkins artifacts and logs on the main system (which should save space).
> > >
> > > It might be good to get a more detailed description of your Jenkins setup to be able to understand the options available.
> > >
> > > >
> > > > Also, what is the best way to backup the container after
> > > > trimming it down (remove unwanted files/logs etc. and reduce it's size)?
> > >
> > > I'm not sure how to backup a container in Docker. There's the 'docker container commit'
> > > command, but I haven't used that.
> > >
> > > In general, to trim down you data usage you will want to perform a few operations.
> > > Inside Jenkins, you can delete individual builds. You can likely
> > > automate this (not have to do it manually through the UI), by
> > > using the remote API. That should work for the material that is
> > > inside the container. Lots of data, however, including the build
> > > artifacts and the
> > logs are natively on the host, and are only present in the container through bind mounts.
> > >
> > > This means you can remove this data directly using file operations (e.g. rm) on the host.
> > > There are a few nuances to this, however, as some of the build directories are referenced via symlinks.
> > >
> > > 'ftc' currently supports removing jobs and nodes. I don't recall
> > > off the top of my head if this includes removing all the builds
> > > for a job or
> not.
> > > But in any case, it sounds like you only want to remove some of the builds/runs, not the jobs themselves.
> > > We could possibly support 'ftc rm-run', which could remove specific runs. 'ftc query-runs'
> > > could be used to generate a list of runs (e.g. that were created before a certain date).
> > >
> > > Please provide a few more details, and maybe we can talk through and/or develop some solutions that will help meet your needs.
> > >
> > > -- Tim
> > >
> > > >
> > > > On Thu, Feb 1, 2024 at 11:52 PM <fuego+owner@lists.linux.dev> wrote:
> > > > >
> > > > > Greetings!
> > > > >
> > > > > This is the mlmmj program managing the <fuego@lists.linux.dev>
> > > > > mailing list.
> > > > >
> > > > > Your message to <fuego@lists.linux.dev> was not delivered to
> > > > > the list because it contained a HTML part. Only text/plain
> > > > > messages are allowed on this list.
> > > > >
> > > > > Please configure your mail client to only send plain text mail.
> > > > >
> > > > > For your reference, the rejected message follows below.
> > > > >
> > > > >
> > > > >
> > > > > ---------- Forwarded message ----------
> > > > > From: dhinakar k <dhinakar.k@gmail.com>
> > > > > To: fuego+help@lists.linux.dev,
> > > > > fuego@lists.linuxfoundation.org, "Bird, Timothy"
> > > > > <Tim.Bird@sony.com>
> > > > > Cc:
> > > > > Bcc:
> > > > > Date: Thu, 1 Feb 2024 23:51:30 +0530
> > > > > Subject: Re: Distribute continuous integration (build) to
> > > > > servers outside docker container Dear Fuego users,
> > > > >
> > > > > I have a requirement, so I thought of checking with the
> > > > > community if it was feasible and if so what is the best or
> > > > > most efficient way to
> > > > implement it.
> > > > > We have fuego setup in a server and all our continuous
> > > > > integration jobs (for multiple code bases) are setup in it.
> > > > > But the issue is there are
> > > > too many builds happening, which puts pressure on the hard disk
> > > > (so many read/writes) and also increases the docker container size (because of build logs).
> > > > >
> > > > > Hence I would like to know if we can distribute the load to
> > > > > another server, for e.g. job will be created on our main
> > > > > server but build will
> > > > happen on the agent on another server. The idea is to move out
> > > > all cpu, memory, storage intensive activity to agents (other
> > > > servers) on the network. The resultant logs can also be stored
> > > > on those servers
> > > (outside docker container) so that docker size won't be growing rapidly.
> > > > >
> > > > > I tried creating a new node and setup an agent (connect via
> > > > > ssh) but facing issues in installing the 'SSH Build Agents'
> > > > > plugin because of
> > > > compatibility issues (jenkins version needs to be upgraded).
> > > > >
> > > > > If anyone already tried and has a solution for this issue please let me know.
> > > > >
> > > > > Also, what is the best way to backup the container after trimming it down (remove unwanted files/logs etc. and reduce it's size)?
> > > > >
> > > > > Regards,
> > > > > Dhinakar K.
> > > > > Samsung India, Bengaluru.
> > > > >
> > > > > On Thu, Feb 1, 2024 at 10:30 PM dhinakar k <dhinakar.k@gmail.com> wrote:
> > > > >>
> > > > >> Dear Fuego users,
> > > > >>
> > > > >> I have a requirement, so I thought of checking with the
> > > > >> community if it was feasible and if so what is the best or
> > > > >> most efficient way to
> > > > implement it.
> > > > >> We have fuego setup in a server and all our continuous
> > > > >> integration jobs (for multiple code bases) are setup in it.
> > > > >> But the issue is there are
> > > > too many builds happening, which puts pressure on the hard disk
> > > > (so many read/writes) and also increases the docker container size (because of build logs).
> > > > >>
> > > > >> Hence I would like to know if we can distribute the load to
> > > > >> another server, for e.g. job will be created on our main
> > > > >> server but build will
> > > > happen on the agent on another server. The idea is to move out
> > > > all cpu, memory, storage intensive activity to agents (other
> > > > servers) on the network. The resultant logs can also be stored
> > > > on those servers
> > > (outside docker container) so that docker size won't be growing rapidly.
> > > > >>
> > > > >> I tried creating a new node and setup an agent (connect via
> > > > >> ssh) but facing issues in installing the 'SSH Build Agents'
> > > > >> plugin because of
> > > > compatibility issues (jenkins version needs to be upgraded).
> > > > >>
> > > > >> If anyone already tried and has a solution for this issue please let me know.
> > > > >>
> > > > >> Also, what is the best way to backup the container after trimming it down (remove unwanted files/logs etc. and reduce it's size)?
> > > > >>
> > > > >> Regards,
> > > > >> Dhinakar K.
> > > > >> Samsung India, Bengaluru.
> > >
> > >
> > >
> >
> >
>
>
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev In-Reply-To: <20240322060947.3254967-2-tujinjiang@huawei.com> References: <20240322060947.3254967-2-tujinjiang@huawei.com> TO: Jinjiang Tu <tujinjiang@huawei.com> TO: akpm@linux-foundation.org TO: david@redhat.com TO: shr@devkernel.io TO: hannes@cmpxchg.org TO: riel@surriel.com TO: wangkefeng.wang@huawei.com TO: sunnanyong@huawei.com TO: linux-mm@kvack.org CC: tujinjiang@huawei.com Hi Jinjiang, kernel test robot noticed the following build warnings: [auto build test WARNING on akpm-mm/mm-everything] url: https://github.com/intel-lab-lkp/linux/commits/Jinjiang-Tu/mm-ksm-fix-ksm-exec-support-for-prctl/20240322-141317 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20240322060947.3254967-2-tujinjiang%40huawei.com patch subject: [PATCH v2 1/2] mm/ksm: fix ksm exec support for prctl :::::: branch date: 35 hours ago :::::: commit date: 35 hours ago config: openrisc-randconfig-r081-20240322 (https://download.01.org/0day-ci/archive/20240324/202403240146.Pv4gVc5N-lkp@intel.com/config) compiler: or1k-linux-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403240146.Pv4gVc5N-lkp@intel.com/ smatch warnings: fs/exec.c:305 __bprm_mm_init() error: uninitialized symbol 'err'. vim +/err +305 fs/exec.c b6a2fea39318e43 Ollie Wild 2007-07-19 254 b6a2fea39318e43 Ollie Wild 2007-07-19 255 static int __bprm_mm_init(struct linux_binprm *bprm) b6a2fea39318e43 Ollie Wild 2007-07-19 256 { eaccbfa564e48c8 Luiz Fernando N. Capitulino 2009-01-06 257 int err; b6a2fea39318e43 Ollie Wild 2007-07-19 258 struct vm_area_struct *vma = NULL; b6a2fea39318e43 Ollie Wild 2007-07-19 259 struct mm_struct *mm = bprm->mm; b6a2fea39318e43 Ollie Wild 2007-07-19 260 490fc053865c9cc Linus Torvalds 2018-07-21 261 bprm->vma = vma = vm_area_alloc(mm); b6a2fea39318e43 Ollie Wild 2007-07-19 262 if (!vma) eaccbfa564e48c8 Luiz Fernando N. Capitulino 2009-01-06 263 return -ENOMEM; bfd40eaff5abb9f Kirill A. Shutemov 2018-07-26 264 vma_set_anonymous(vma); b6a2fea39318e43 Ollie Wild 2007-07-19 265 d8ed45c5dcd455f Michel Lespinasse 2020-06-08 266 if (mmap_write_lock_killable(mm)) { f268dfe905d4682 Michal Hocko 2016-05-23 267 err = -EINTR; f268dfe905d4682 Michal Hocko 2016-05-23 268 goto err_free; f268dfe905d4682 Michal Hocko 2016-05-23 269 } b6a2fea39318e43 Ollie Wild 2007-07-19 270 d282f6b19afd1a9 Jinjiang Tu 2024-03-22 271 /* d282f6b19afd1a9 Jinjiang Tu 2024-03-22 272 * Need to be called with mmap write lock d282f6b19afd1a9 Jinjiang Tu 2024-03-22 273 * held, to avoid race with ksmd. d282f6b19afd1a9 Jinjiang Tu 2024-03-22 274 */ d282f6b19afd1a9 Jinjiang Tu 2024-03-22 275 if (ksm_execve(mm)) d282f6b19afd1a9 Jinjiang Tu 2024-03-22 276 goto err_ksm; d282f6b19afd1a9 Jinjiang Tu 2024-03-22 277 b6a2fea39318e43 Ollie Wild 2007-07-19 278 /* b6a2fea39318e43 Ollie Wild 2007-07-19 279 * Place the stack at the largest stack address the architecture b6a2fea39318e43 Ollie Wild 2007-07-19 280 * supports. Later, we'll move this to an appropriate place. We don't b6a2fea39318e43 Ollie Wild 2007-07-19 281 * use STACK_TOP because that can depend on attributes which aren't b6a2fea39318e43 Ollie Wild 2007-07-19 282 * configured yet. b6a2fea39318e43 Ollie Wild 2007-07-19 283 */ aacb3d17a73f644 Michal Hocko 2011-07-26 284 BUILD_BUG_ON(VM_STACK_FLAGS & VM_STACK_INCOMPLETE_SETUP); b6a2fea39318e43 Ollie Wild 2007-07-19 285 vma->vm_end = STACK_TOP_MAX; b6a2fea39318e43 Ollie Wild 2007-07-19 286 vma->vm_start = vma->vm_end - PAGE_SIZE; 1c71222e5f2393b Suren Baghdasaryan 2023-01-26 287 vm_flags_init(vma, VM_SOFTDIRTY | VM_STACK_FLAGS | VM_STACK_INCOMPLETE_SETUP); 3ed75eb8f1cd895 Coly Li 2007-10-18 288 vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); 462e635e5b73ba9 Tavis Ormandy 2010-12-09 289 b6a2fea39318e43 Ollie Wild 2007-07-19 290 err = insert_vm_struct(mm, vma); eaccbfa564e48c8 Luiz Fernando N. Capitulino 2009-01-06 291 if (err) b6a2fea39318e43 Ollie Wild 2007-07-19 292 goto err; b6a2fea39318e43 Ollie Wild 2007-07-19 293 b6a2fea39318e43 Ollie Wild 2007-07-19 294 mm->stack_vm = mm->total_vm = 1; d8ed45c5dcd455f Michel Lespinasse 2020-06-08 295 mmap_write_unlock(mm); b6a2fea39318e43 Ollie Wild 2007-07-19 296 bprm->p = vma->vm_end - sizeof(void *); b6a2fea39318e43 Ollie Wild 2007-07-19 297 return 0; b6a2fea39318e43 Ollie Wild 2007-07-19 298 err: d282f6b19afd1a9 Jinjiang Tu 2024-03-22 299 ksm_exit(mm); d282f6b19afd1a9 Jinjiang Tu 2024-03-22 300 err_ksm: d8ed45c5dcd455f Michel Lespinasse 2020-06-08 301 mmap_write_unlock(mm); f268dfe905d4682 Michal Hocko 2016-05-23 302 err_free: b6a2fea39318e43 Ollie Wild 2007-07-19 303 bprm->vma = NULL; 3928d4f5ee37cdc Linus Torvalds 2018-07-21 304 vm_area_free(vma); b6a2fea39318e43 Ollie Wild 2007-07-19 @305 return err; b6a2fea39318e43 Ollie Wild 2007-07-19 306 } b6a2fea39318e43 Ollie Wild 2007-07-19 307 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: linux-kernel@vger.kernel.org TO: Kent Overstreet <kent.overstreet@linux.dev> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: bfa8f18691ed2e978e4dd51190569c434f93e268 commit: 1c6fdbd8f2465ddfb73a01ec620cbf3d14044e1a bcachefs: Initial commit date: 5 months ago :::::: branch date: 21 hours ago :::::: commit date: 5 months ago config: sparc64-randconfig-r081-20240323 (https://download.01.org/0day-ci/archive/20240324/202403240122.yrVmeP9o-lkp@intel.com/config) compiler: sparc64-linux-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403240122.yrVmeP9o-lkp@intel.com/ smatch warnings: fs/bcachefs/bkey.c:1155 bch2_bkey_pack_test() error: uninitialized symbol 'a'. vim +/a +1155 fs/bcachefs/bkey.c 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1123 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1124 #ifdef CONFIG_BCACHEFS_DEBUG 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1125 void bch2_bkey_pack_test(void) 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1126 { 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1127 struct bkey t = KEY(4134ULL, 1250629070527416633ULL, 0); 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1128 struct bkey_packed p; 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1129 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1130 struct bkey_format test_format = { 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1131 .key_u64s = 2, 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1132 .nr_fields = BKEY_NR_FIELDS, 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1133 .bits_per_field = { 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1134 13, 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1135 64, 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1136 }, 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1137 }; 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1138 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1139 struct unpack_state in_s = 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1140 unpack_state_init(&bch2_bkey_format_current, (void *) &t); 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1141 struct pack_state out_s = pack_state_init(&test_format, &p); 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1142 unsigned i; 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1143 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1144 for (i = 0; i < out_s.format->nr_fields; i++) { 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1145 u64 a, v = get_inc_field(&in_s, i); 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1146 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1147 switch (i) { 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1148 #define x(id, field) case id: a = t.field; break; 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1149 bkey_fields() 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1150 #undef x 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1151 default: 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1152 BUG(); 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1153 } 1c6fdbd8f2465d Kent Overstreet 2017-03-16 1154 1c6fdbd8f2465d Kent Overstreet 2017-03-16 @1155 if (a != v) -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: David Howells <dhowells@redhat.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git netfs-writeback head: 6d4dafd8301ee8645d4814a7e75a9135acf67613 commit: 52ff5a10870495fafb8bdf0ee2e987d861b1b42c [17/22] netfs, 9p: Implement helpers for new write code :::::: branch date: 2 days ago :::::: commit date: 2 days ago config: sparc64-randconfig-r081-20240323 (https://download.01.org/0day-ci/archive/20240323/202403232142.egfToXYX-lkp@intel.com/config) compiler: sparc64-linux-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403232142.egfToXYX-lkp@intel.com/ smatch warnings: fs/netfs/write_collect.c:110 netfs_writeback_lookup_folio() error: we previously assumed 'folio' could be null (see line 99) vim +/folio +110 fs/netfs/write_collect.c 9a3702e1d161f5 David Howells 2024-03-18 81 9a3702e1d161f5 David Howells 2024-03-18 82 /* 9a3702e1d161f5 David Howells 2024-03-18 83 * Get hold of a folio we have under writeback. We don't want to get the 9a3702e1d161f5 David Howells 2024-03-18 84 * refcount on it. 9a3702e1d161f5 David Howells 2024-03-18 85 */ 9a3702e1d161f5 David Howells 2024-03-18 86 static struct folio *netfs_writeback_lookup_folio(struct netfs_io_request *wreq, loff_t pos) 9a3702e1d161f5 David Howells 2024-03-18 87 { 9a3702e1d161f5 David Howells 2024-03-18 88 XA_STATE(xas, &wreq->mapping->i_pages, pos / PAGE_SIZE); 9a3702e1d161f5 David Howells 2024-03-18 89 struct folio *folio; 9a3702e1d161f5 David Howells 2024-03-18 90 9a3702e1d161f5 David Howells 2024-03-18 91 rcu_read_lock(); 9a3702e1d161f5 David Howells 2024-03-18 92 9a3702e1d161f5 David Howells 2024-03-18 93 for (;;) { 9a3702e1d161f5 David Howells 2024-03-18 94 xas_reset(&xas); 9a3702e1d161f5 David Howells 2024-03-18 95 folio = xas_load(&xas); 9a3702e1d161f5 David Howells 2024-03-18 96 if (xas_retry(&xas, folio)) 9a3702e1d161f5 David Howells 2024-03-18 97 continue; 9a3702e1d161f5 David Howells 2024-03-18 98 9a3702e1d161f5 David Howells 2024-03-18 @99 if (!folio || xa_is_value(folio)) 9a3702e1d161f5 David Howells 2024-03-18 100 kdebug("R=%08x: folio %lx (%llx) not present", 9a3702e1d161f5 David Howells 2024-03-18 101 wreq->debug_id, xas.xa_index, pos / PAGE_SIZE); 9a3702e1d161f5 David Howells 2024-03-18 102 BUG_ON(!folio || xa_is_value(folio)); 9a3702e1d161f5 David Howells 2024-03-18 103 9a3702e1d161f5 David Howells 2024-03-18 104 if (folio == xas_reload(&xas)) 9a3702e1d161f5 David Howells 2024-03-18 105 break; 9a3702e1d161f5 David Howells 2024-03-18 106 } 9a3702e1d161f5 David Howells 2024-03-18 107 9a3702e1d161f5 David Howells 2024-03-18 108 rcu_read_unlock(); 9a3702e1d161f5 David Howells 2024-03-18 109 9a3702e1d161f5 David Howells 2024-03-18 @110 if (WARN_ONCE(!folio_test_writeback(folio), 9a3702e1d161f5 David Howells 2024-03-18 111 "R=%08x: folio %lx is not under writeback\n", 9a3702e1d161f5 David Howells 2024-03-18 112 wreq->debug_id, folio->index)) { 9a3702e1d161f5 David Howells 2024-03-18 113 trace_netfs_folio(folio, netfs_folio_trace_not_under_wback); 9a3702e1d161f5 David Howells 2024-03-18 114 } 9a3702e1d161f5 David Howells 2024-03-18 115 return folio; 9a3702e1d161f5 David Howells 2024-03-18 116 } 9a3702e1d161f5 David Howells 2024-03-18 117 :::::: The code at line 110 was first introduced by commit :::::: 9a3702e1d161f5b03a7b42122f9f693af1144fc8 netfs: New writeback implementation :::::: TO: David Howells <dhowells@redhat.com> :::::: CC: David Howells <dhowells@redhat.com> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
[-- Attachment #1: Type: text/plain, Size: 980 bytes --] Dear Linux folks, On a Dell XPS 13 9360, Linux “6.9-rc0” still logs errors after 936e4d49ecbc Input: atkbd - skip ATKBD_CMD_GETID in translated mode 58f65f9db7e0 Input: atkbd - use ab83 as id when skipping the getid command 683cd8259a9b Input: atkbd - skip ATKBD_CMD_SETLEDS when skipping ATKBD_CMD_GETID 9cf6e24c9fbf Input: atkbd - do not skip atkbd_deactivate() when skipping ATKBD_CMD_GETID Today the first time during cold boot (which I do not do often), so I noticed it on the console: [ 0.565863] atkbd serio0: Failed to deactivate keyboard on isa0060/serio0 [ 0.974053] atkbd serio0: Failed to enable keyboard on isa0060/serio0 Looking through the logs, throughout the 6.8 cycle Linux often logged the line below during resume from ACPI S3. atkbd serio0: Failed to deactivate keyboard on isa0060/serio0 In the attached logs it was only logged during the second ACPI S3 suspend/resume cycle. Kind regards, Paul [-- Attachment #2: 20240323--dell-xps-13-9360--linux-6.9-rc0+--messages.txt --] [-- Type: text/plain, Size: 99706 bytes --] [ 0.000000] Linux version 6.8.0+ (build@bohemianrhapsody.molgen.mpg.de) (gcc (Debian 13.2.0-16.1) 13.2.0, GNU ld (GNU Binutils for Debian) 2.42) #67 SMP PREEMPT_DYNAMIC Fri Mar 22 16:40:31 CET 2024 [ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-6.8.0+ root=UUID=32e29882-d94d-4a92-9ee4-4d03002bfa29 ro quiet pci=noaer mem_sleep_default=deep log_buf_len=8M cryptomgr.notests [ 0.000000] BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x0000000000057fff] usable [ 0.000000] BIOS-e820: [mem 0x0000000000058000-0x0000000000058fff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000000059000-0x000000000009dfff] usable [ 0.000000] BIOS-e820: [mem 0x000000000009e000-0x00000000000fffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000556aafff] usable [ 0.000000] BIOS-e820: [mem 0x00000000556ab000-0x00000000556abfff] ACPI NVS [ 0.000000] BIOS-e820: [mem 0x00000000556ac000-0x00000000556acfff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000556ad000-0x0000000064df3fff] usable [ 0.000000] BIOS-e820: [mem 0x0000000064df4000-0x000000006517ffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000065180000-0x00000000651c3fff] ACPI data [ 0.000000] BIOS-e820: [mem 0x00000000651c4000-0x000000006f871fff] ACPI NVS [ 0.000000] BIOS-e820: [mem 0x000000006f872000-0x000000006fffefff] reserved [ 0.000000] BIOS-e820: [mem 0x000000006ffff000-0x000000006fffffff] usable [ 0.000000] BIOS-e820: [mem 0x0000000070000000-0x0000000077ffffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000078000000-0x00000000785fffff] usable [ 0.000000] BIOS-e820: [mem 0x0000000078600000-0x000000007c7fffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fe000000-0x00000000fe010fff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000004817fffff] usable [ 0.000000] NX (Execute Disable) protection: active [ 0.000000] APIC: Static calls initialized [ 0.000000] e820: update [mem 0x513f1018-0x51401057] usable ==> usable [ 0.000000] e820: update [mem 0x513f1018-0x51401057] usable ==> usable [ 0.000000] extended physical RAM map: [ 0.000000] reserve setup_data: [mem 0x0000000000000000-0x0000000000057fff] usable [ 0.000000] reserve setup_data: [mem 0x0000000000058000-0x0000000000058fff] reserved [ 0.000000] reserve setup_data: [mem 0x0000000000059000-0x000000000009dfff] usable [ 0.000000] reserve setup_data: [mem 0x000000000009e000-0x00000000000fffff] reserved [ 0.000000] reserve setup_data: [mem 0x0000000000100000-0x00000000513f1017] usable [ 0.000000] reserve setup_data: [mem 0x00000000513f1018-0x0000000051401057] usable [ 0.000000] reserve setup_data: [mem 0x0000000051401058-0x00000000556aafff] usable [ 0.000000] reserve setup_data: [mem 0x00000000556ab000-0x00000000556abfff] ACPI NVS [ 0.000000] reserve setup_data: [mem 0x00000000556ac000-0x00000000556acfff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000556ad000-0x0000000064df3fff] usable [ 0.000000] reserve setup_data: [mem 0x0000000064df4000-0x000000006517ffff] reserved [ 0.000000] reserve setup_data: [mem 0x0000000065180000-0x00000000651c3fff] ACPI data [ 0.000000] reserve setup_data: [mem 0x00000000651c4000-0x000000006f871fff] ACPI NVS [ 0.000000] reserve setup_data: [mem 0x000000006f872000-0x000000006fffefff] reserved [ 0.000000] reserve setup_data: [mem 0x000000006ffff000-0x000000006fffffff] usable [ 0.000000] reserve setup_data: [mem 0x0000000070000000-0x0000000077ffffff] reserved [ 0.000000] reserve setup_data: [mem 0x0000000078000000-0x00000000785fffff] usable [ 0.000000] reserve setup_data: [mem 0x0000000078600000-0x000000007c7fffff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000e0000000-0x00000000efffffff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000fe000000-0x00000000fe010fff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000fec00000-0x00000000fec00fff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000fee00000-0x00000000fee00fff] reserved [ 0.000000] reserve setup_data: [mem 0x00000000ff000000-0x00000000ffffffff] reserved [ 0.000000] reserve setup_data: [mem 0x0000000100000000-0x00000004817fffff] usable [ 0.000000] efi: EFI v2.4 by American Megatrends [ 0.000000] efi: ACPI=0x6518d000 ACPI 2.0=0x6518d000 SMBIOS=0xf0000 SMBIOS 3.0=0xf0020 TPMFinalLog=0x6f812000 ESRT=0x6fc86698 MEMATTR=0x62679298 INITRD=0x5577da98 TPMEventLog=0x5577e018 [ 0.000000] efi: Remove mem34: MMIO range=[0xe0000000-0xefffffff] (256MB) from e820 map [ 0.000000] e820: remove [mem 0xe0000000-0xefffffff] reserved [ 0.000000] efi: Not removing mem35: MMIO range=[0xfe000000-0xfe010fff] (68KB) from e820 map [ 0.000000] efi: Not removing mem36: MMIO range=[0xfec00000-0xfec00fff] (4KB) from e820 map [ 0.000000] efi: Not removing mem37: MMIO range=[0xfee00000-0xfee00fff] (4KB) from e820 map [ 0.000000] efi: Remove mem38: MMIO range=[0xff000000-0xffffffff] (16MB) from e820 map [ 0.000000] e820: remove [mem 0xff000000-0xffffffff] reserved [ 0.000000] SMBIOS 3.0.0 present. [ 0.000000] DMI: Dell Inc. XPS 13 9360/0596KF, BIOS 2.21.0 06/02/2022 [ 0.000000] tsc: Detected 2900.000 MHz processor [ 0.000000] tsc: Detected 2899.886 MHz TSC [ 0.000792] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved [ 0.000794] e820: remove [mem 0x000a0000-0x000fffff] usable [ 0.000802] last_pfn = 0x481800 max_arch_pfn = 0x400000000 [ 0.000805] MTRR map: 4 entries (3 fixed + 1 variable; max 23), built from 10 variable MTRRs [ 0.000807] x86/PAT: Configuration [0-7]: WB WC UC- UC WB WP UC- WT [ 0.001117] last_pfn = 0x78600 max_arch_pfn = 0x400000000 [ 0.007628] esrt: Reserving ESRT space from 0x000000006fc86698 to 0x000000006fc866d0. [ 0.007633] Using GB pages for direct mapping [ 0.014155] printk: log_buf_len: 8388608 bytes [ 0.014156] printk: early log buf free: 125344(95%) [ 0.014157] Secure boot disabled [ 0.014158] RAMDISK: [mem 0x51402000-0x5271cfff] [ 0.014161] ACPI: Early table checksum verification disabled [ 0.014164] ACPI: RSDP 0x000000006518D000 000024 (v02 DELL ) [ 0.014168] ACPI: XSDT 0x000000006518D0C8 00010C (v01 DELL CBX3 01072009 AMI 00010013) [ 0.014174] ACPI: FACP 0x00000000651B2A48 00010C (v05 DELL CBX3 01072009 AMI 00010013) [ 0.014178] ACPI: DSDT 0x000000006518D260 0257E7 (v02 DELL CBX3 01072009 INTL 20160422) [ 0.014181] ACPI: FACS 0x000000006F86F180 000040 [ 0.014183] ACPI: APIC 0x00000000651B2B58 000084 (v03 DELL CBX3 01072009 AMI 00010013) [ 0.014186] ACPI: FPDT 0x00000000651B2BE0 000044 (v01 DELL CBX3 01072009 AMI 00010013) [ 0.014188] ACPI: FIDT 0x00000000651B2C28 0000AC (v01 DELL CBX3 01072009 AMI 00010013) [ 0.014191] ACPI: MCFG 0x00000000651B2CD8 00003C (v01 DELL CBX3 01072009 MSFT 00000097) [ 0.014194] ACPI: HPET 0x00000000651B2D18 000038 (v01 DELL CBX3 01072009 AMI. 0005000B) [ 0.014196] ACPI: SSDT 0x00000000651B2D50 000359 (v01 SataRe SataTabl 00001000 INTL 20160422) [ 0.014199] ACPI: BOOT 0x00000000651B30B0 000028 (v01 DELL CBX3 01072009 AMI 00010013) [ 0.014201] ACPI: SSDT 0x00000000651B30D8 0012CF (v02 SaSsdt SaSsdt 00003000 INTL 20160422) [ 0.014204] ACPI: HPET 0x00000000651B43A8 000038 (v01 INTEL KBL-ULT 00000001 MSFT 0000005F) [ 0.014207] ACPI: SSDT 0x00000000651B43E0 000D84 (v02 INTEL xh_rvp07 00000000 INTL 20160422) [ 0.014209] ACPI: UEFI 0x00000000651B5168 000042 (v01 00000000 00000000) [ 0.014212] ACPI: SSDT 0x00000000651B51B0 000EDE (v02 CpuRef CpuSsdt 00003000 INTL 20160422) [ 0.014215] ACPI: LPIT 0x00000000651B6090 000094 (v01 INTEL KBL-ULT 00000000 MSFT 0000005F) [ 0.014217] ACPI: WSMT 0x00000000651B6128 000028 (v01 DELL CBX3 00000000 MSFT 0000005F) [ 0.014220] ACPI: SSDT 0x00000000651B6150 000161 (v02 INTEL HdaDsp 00000000 INTL 20160422) [ 0.014222] ACPI: SSDT 0x00000000651B62B8 00029F (v02 INTEL sensrhub 00000000 INTL 20160422) [ 0.014225] ACPI: SSDT 0x00000000651B6558 003002 (v02 INTEL PtidDevc 00001000 INTL 20160422) [ 0.014228] ACPI: SSDT 0x00000000651B9560 0000DB (v02 INTEL TbtTypeC 00000000 INTL 20160422) [ 0.014230] ACPI: DBGP 0x00000000651B9640 000034 (v01 INTEL 00000002 MSFT 0000005F) [ 0.014233] ACPI: DBG2 0x00000000651B9678 000054 (v00 INTEL 00000002 MSFT 0000005F) [ 0.014235] ACPI: SSDT 0x00000000651B96D0 0007DD (v02 INTEL UsbCTabl 00001000 INTL 20160422) [ 0.014238] ACPI: SSDT 0x00000000651B9EB0 0084F1 (v02 DptfTa DptfTabl 00001000 INTL 20160422) [ 0.014241] ACPI: SLIC 0x00000000651C23A8 000176 (v03 DELL CBX3 01072009 MSFT 00010013) [ 0.014243] ACPI: NHLT 0x00000000651C2520 00002D (v00 INTEL EDK2 00000002 01000013) [ 0.014246] ACPI: BGRT 0x00000000651C2550 000038 (v00 01072009 AMI 00010013) [ 0.014249] ACPI: TPM2 0x00000000651C2588 000034 (v03 Tpm2Tabl 00000001 AMI 00000000) [ 0.014251] ACPI: ASF! 0x00000000651C25C0 0000A0 (v32 INTEL HCG 00000001 TFSM 000F4240) [ 0.014254] ACPI: DMAR 0x00000000651C2660 0000F0 (v01 INTEL KBL 00000001 INTL 00000001) [ 0.014256] ACPI: Reserving FACP table memory at [mem 0x651b2a48-0x651b2b53] [ 0.014258] ACPI: Reserving DSDT table memory at [mem 0x6518d260-0x651b2a46] [ 0.014258] ACPI: Reserving FACS table memory at [mem 0x6f86f180-0x6f86f1bf] [ 0.014259] ACPI: Reserving APIC table memory at [mem 0x651b2b58-0x651b2bdb] [ 0.014260] ACPI: Reserving FPDT table memory at [mem 0x651b2be0-0x651b2c23] [ 0.014260] ACPI: Reserving FIDT table memory at [mem 0x651b2c28-0x651b2cd3] [ 0.014261] ACPI: Reserving MCFG table memory at [mem 0x651b2cd8-0x651b2d13] [ 0.014262] ACPI: Reserving HPET table memory at [mem 0x651b2d18-0x651b2d4f] [ 0.014263] ACPI: Reserving SSDT table memory at [mem 0x651b2d50-0x651b30a8] [ 0.014263] ACPI: Reserving BOOT table memory at [mem 0x651b30b0-0x651b30d7] [ 0.014264] ACPI: Reserving SSDT table memory at [mem 0x651b30d8-0x651b43a6] [ 0.014265] ACPI: Reserving HPET table memory at [mem 0x651b43a8-0x651b43df] [ 0.014265] ACPI: Reserving SSDT table memory at [mem 0x651b43e0-0x651b5163] [ 0.014266] ACPI: Reserving UEFI table memory at [mem 0x651b5168-0x651b51a9] [ 0.014267] ACPI: Reserving SSDT table memory at [mem 0x651b51b0-0x651b608d] [ 0.014267] ACPI: Reserving LPIT table memory at [mem 0x651b6090-0x651b6123] [ 0.014268] ACPI: Reserving WSMT table memory at [mem 0x651b6128-0x651b614f] [ 0.014269] ACPI: Reserving SSDT table memory at [mem 0x651b6150-0x651b62b0] [ 0.014269] ACPI: Reserving SSDT table memory at [mem 0x651b62b8-0x651b6556] [ 0.014270] ACPI: Reserving SSDT table memory at [mem 0x651b6558-0x651b9559] [ 0.014271] ACPI: Reserving SSDT table memory at [mem 0x651b9560-0x651b963a] [ 0.014271] ACPI: Reserving DBGP table memory at [mem 0x651b9640-0x651b9673] [ 0.014272] ACPI: Reserving DBG2 table memory at [mem 0x651b9678-0x651b96cb] [ 0.014273] ACPI: Reserving SSDT table memory at [mem 0x651b96d0-0x651b9eac] [ 0.014274] ACPI: Reserving SSDT table memory at [mem 0x651b9eb0-0x651c23a0] [ 0.014274] ACPI: Reserving SLIC table memory at [mem 0x651c23a8-0x651c251d] [ 0.014275] ACPI: Reserving NHLT table memory at [mem 0x651c2520-0x651c254c] [ 0.014276] ACPI: Reserving BGRT table memory at [mem 0x651c2550-0x651c2587] [ 0.014276] ACPI: Reserving TPM2 table memory at [mem 0x651c2588-0x651c25bb] [ 0.014277] ACPI: Reserving ASF! table memory at [mem 0x651c25c0-0x651c265f] [ 0.014278] ACPI: Reserving DMAR table memory at [mem 0x651c2660-0x651c274f] [ 0.014404] No NUMA configuration found [ 0.014405] Faking a node at [mem 0x0000000000000000-0x00000004817fffff] [ 0.014412] NODE_DATA(0) allocated [mem 0x47f3d3000-0x47f3fdfff] [ 0.014557] Zone ranges: [ 0.014557] DMA [mem 0x0000000000001000-0x0000000000ffffff] [ 0.014559] DMA32 [mem 0x0000000001000000-0x00000000ffffffff] [ 0.014560] Normal [mem 0x0000000100000000-0x00000004817fffff] [ 0.014562] Device empty [ 0.014562] Movable zone start for each node [ 0.014565] Early memory node ranges [ 0.014565] node 0: [mem 0x0000000000001000-0x0000000000057fff] [ 0.014566] node 0: [mem 0x0000000000059000-0x000000000009dfff] [ 0.014567] node 0: [mem 0x0000000000100000-0x00000000556aafff] [ 0.014568] node 0: [mem 0x00000000556ad000-0x0000000064df3fff] [ 0.014569] node 0: [mem 0x000000006ffff000-0x000000006fffffff] [ 0.014570] node 0: [mem 0x0000000078000000-0x00000000785fffff] [ 0.014570] node 0: [mem 0x0000000100000000-0x00000004817fffff] [ 0.014572] Initmem setup node 0 [mem 0x0000000000001000-0x00000004817fffff] [ 0.014576] On node 0, zone DMA: 1 pages in unavailable ranges [ 0.014578] On node 0, zone DMA: 1 pages in unavailable ranges [ 0.014609] On node 0, zone DMA: 98 pages in unavailable ranges [ 0.016952] On node 0, zone DMA32: 2 pages in unavailable ranges [ 0.017391] On node 0, zone DMA32: 45579 pages in unavailable ranges [ 0.017916] On node 0, zone Normal: 31232 pages in unavailable ranges [ 0.018174] On node 0, zone Normal: 26624 pages in unavailable ranges [ 0.018182] Reserving Intel graphics memory at [mem 0x7a800000-0x7c7fffff] [ 0.018373] ACPI: PM-Timer IO Port: 0x1808 [ 0.018379] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1]) [ 0.018381] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1]) [ 0.018381] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1]) [ 0.018382] ACPI: LAPIC_NMI (acpi_id[0x04] high edge lint[0x1]) [ 0.018408] IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-119 [ 0.018411] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) [ 0.018412] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level) [ 0.018416] ACPI: Using ACPI (MADT) for SMP configuration information [ 0.018417] ACPI: HPET id: 0x8086a701 base: 0xfed00000 [ 0.018422] e820: update [mem 0x62260000-0x623ecfff] usable ==> reserved [ 0.018432] TSC deadline timer available [ 0.018436] CPU topo: Max. logical packages: 1 [ 0.018437] CPU topo: Max. logical dies: 1 [ 0.018437] CPU topo: Max. dies per package: 1 [ 0.018441] CPU topo: Max. threads per core: 2 [ 0.018442] CPU topo: Num. cores per package: 2 [ 0.018443] CPU topo: Num. threads per package: 4 [ 0.018443] CPU topo: Allowing 4 present CPUs plus 0 hotplug CPUs [ 0.018457] PM: hibernation: Registered nosave memory: [mem 0x00000000-0x00000fff] [ 0.018459] PM: hibernation: Registered nosave memory: [mem 0x00058000-0x00058fff] [ 0.018460] PM: hibernation: Registered nosave memory: [mem 0x0009e000-0x000fffff] [ 0.018462] PM: hibernation: Registered nosave memory: [mem 0x513f1000-0x513f1fff] [ 0.018463] PM: hibernation: Registered nosave memory: [mem 0x51401000-0x51401fff] [ 0.018464] PM: hibernation: Registered nosave memory: [mem 0x556ab000-0x556abfff] [ 0.018465] PM: hibernation: Registered nosave memory: [mem 0x556ac000-0x556acfff] [ 0.018466] PM: hibernation: Registered nosave memory: [mem 0x62260000-0x623ecfff] [ 0.018468] PM: hibernation: Registered nosave memory: [mem 0x64df4000-0x6517ffff] [ 0.018468] PM: hibernation: Registered nosave memory: [mem 0x65180000-0x651c3fff] [ 0.018469] PM: hibernation: Registered nosave memory: [mem 0x651c4000-0x6f871fff] [ 0.018469] PM: hibernation: Registered nosave memory: [mem 0x6f872000-0x6fffefff] [ 0.018471] PM: hibernation: Registered nosave memory: [mem 0x70000000-0x77ffffff] [ 0.018472] PM: hibernation: Registered nosave memory: [mem 0x78600000-0x7c7fffff] [ 0.018473] PM: hibernation: Registered nosave memory: [mem 0x7c800000-0xfdffffff] [ 0.018474] PM: hibernation: Registered nosave memory: [mem 0xfe000000-0xfe010fff] [ 0.018474] PM: hibernation: Registered nosave memory: [mem 0xfe011000-0xfebfffff] [ 0.018475] PM: hibernation: Registered nosave memory: [mem 0xfec00000-0xfec00fff] [ 0.018475] PM: hibernation: Registered nosave memory: [mem 0xfec01000-0xfedfffff] [ 0.018477] PM: hibernation: Registered nosave memory: [mem 0xfee00000-0xfee00fff] [ 0.018478] PM: hibernation: Registered nosave memory: [mem 0xfee01000-0xffffffff] [ 0.018481] [mem 0x7c800000-0xfdffffff] available for PCI devices [ 0.018482] Booting paravirtualized kernel on bare hardware [ 0.018484] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645519600211568 ns [ 0.023259] setup_percpu: NR_CPUS:8192 nr_cpumask_bits:4 nr_cpu_ids:4 nr_node_ids:1 [ 0.023555] percpu: Embedded 65 pages/cpu s229376 r8192 d28672 u524288 [ 0.023560] pcpu-alloc: s229376 r8192 d28672 u524288 alloc=1*2097152 [ 0.023562] pcpu-alloc: [0] 0 1 2 3 [ 0.023578] Kernel command line: BOOT_IMAGE=/vmlinuz-6.8.0+ root=UUID=32e29882-d94d-4a92-9ee4-4d03002bfa29 ro quiet pci=noaer mem_sleep_default=deep log_buf_len=8M cryptomgr.notests [ 0.023646] Unknown kernel command line parameters "BOOT_IMAGE=/vmlinuz-6.8.0+", will be passed to user space. [ 0.023680] random: crng init done [ 0.025176] Dentry cache hash table entries: 2097152 (order: 12, 16777216 bytes, linear) [ 0.025936] Inode-cache hash table entries: 1048576 (order: 11, 8388608 bytes, linear) [ 0.025996] Fallback order for Node 0: 0 [ 0.025999] Built 1 zonelists, mobility grouping on. Total pages: 4026691 [ 0.026000] Policy zone: Normal [ 0.026004] mem auto-init: stack:all(zero), heap alloc:on, heap free:off [ 0.026012] software IO TLB: area num 4. [ 0.044060] Memory: 1618196K/16363068K available (16384K kernel code, 2385K rwdata, 6028K rodata, 4032K init, 5548K bss, 496724K reserved, 0K cma-reserved) [ 0.044242] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1 [ 0.044258] Kernel/User page tables isolation: enabled [ 0.044291] ftrace: allocating 43302 entries in 170 pages [ 0.051448] ftrace: allocated 170 pages with 4 groups [ 0.052069] Dynamic Preempt: voluntary [ 0.052100] rcu: Preemptible hierarchical RCU implementation. [ 0.052100] rcu: RCU restricting CPUs from NR_CPUS=8192 to nr_cpu_ids=4. [ 0.052102] Trampoline variant of Tasks RCU enabled. [ 0.052102] Rude variant of Tasks RCU enabled. [ 0.052102] Tracing variant of Tasks RCU enabled. [ 0.052103] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies. [ 0.052104] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4 [ 0.052108] RCU Tasks: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1. [ 0.052110] RCU Tasks Rude: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1. [ 0.052111] RCU Tasks Trace: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1. [ 0.054635] NR_IRQS: 524544, nr_irqs: 1024, preallocated irqs: 16 [ 0.054839] rcu: srcu_init: Setting srcu_struct sizes based on contention. [ 0.054999] Console: colour dummy device 80x25 [ 0.055002] printk: legacy console [tty0] enabled [ 0.055036] ACPI: Core revision 20230628 [ 0.055182] hpet: HPET dysfunctional in PC10. Force disabled. [ 0.055183] APIC: Switch to symmetric I/O mode setup [ 0.055185] DMAR: Host address width 39 [ 0.055186] DMAR: DRHD base: 0x000000fed90000 flags: 0x0 [ 0.055191] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 19e2ff0505e [ 0.055193] DMAR: DRHD base: 0x000000fed91000 flags: 0x1 [ 0.055197] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da [ 0.055199] DMAR: RMRR base: 0x00000064ec2000 end: 0x00000064ee1fff [ 0.055201] DMAR: RMRR base: 0x0000007a000000 end: 0x0000007c7fffff [ 0.055202] DMAR: ANDD device: 1 name: \_SB.PCI0.I2C0 [ 0.055203] DMAR: ANDD device: 2 name: \_SB.PCI0.I2C1 [ 0.055204] DMAR-IR: IOAPIC id 2 under DRHD base 0xfed91000 IOMMU 1 [ 0.055206] DMAR-IR: HPET id 0 under DRHD base 0xfed91000 [ 0.055207] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. [ 0.056834] DMAR-IR: Enabled IRQ remapping in x2apic mode [ 0.056836] x2apic enabled [ 0.056893] APIC: Switched APIC routing to: cluster x2apic [ 0.060818] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x29ccd767b87, max_idle_ns: 440795223720 ns [ 0.060823] Calibrating delay loop (skipped), value calculated using timer frequency.. 5799.77 BogoMIPS (lpj=11599544) [ 0.060853] CPU0: Thermal monitoring enabled (TM1) [ 0.060887] Last level iTLB entries: 4KB 64, 2MB 8, 4MB 8 [ 0.060888] Last level dTLB entries: 4KB 64, 2MB 0, 4MB 0, 1GB 4 [ 0.060892] process: using mwait in idle threads [ 0.060893] Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization [ 0.060895] Spectre V2 : Mitigation: IBRS [ 0.060896] Spectre V2 : Spectre v2 / SpectreRSB mitigation: Filling RSB on context switch [ 0.060897] Spectre V2 : Spectre v2 / SpectreRSB : Filling RSB on VMEXIT [ 0.060898] RETBleed: Mitigation: IBRS [ 0.060900] Spectre V2 : mitigation: Enabling conditional Indirect Branch Prediction Barrier [ 0.060901] Spectre V2 : User space: Mitigation: STIBP via prctl [ 0.060902] Speculative Store Bypass: Mitigation: Speculative Store Bypass disabled via prctl [ 0.060910] MDS: Mitigation: Clear CPU buffers [ 0.060911] MMIO Stale Data: Mitigation: Clear CPU buffers [ 0.060915] SRBDS: Mitigation: Microcode [ 0.060921] GDS: Mitigation: Microcode [ 0.060926] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' [ 0.060928] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' [ 0.060929] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' [ 0.060930] x86/fpu: Supporting XSAVE feature 0x008: 'MPX bounds registers' [ 0.060931] x86/fpu: Supporting XSAVE feature 0x010: 'MPX CSR' [ 0.060932] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256 [ 0.060934] x86/fpu: xstate_offset[3]: 832, xstate_sizes[3]: 64 [ 0.060935] x86/fpu: xstate_offset[4]: 896, xstate_sizes[4]: 64 [ 0.060936] x86/fpu: Enabled xstate features 0x1f, context size is 960 bytes, using 'compacted' format. [ 0.064821] Freeing SMP alternatives memory: 36K [ 0.064821] pid_max: default: 32768 minimum: 301 [ 0.064821] LSM: initializing lsm=lockdown,capability,landlock,yama,apparmor,tomoyo,bpf,ima,evm [ 0.064821] landlock: Up and running. [ 0.064821] Yama: becoming mindful. [ 0.064821] AppArmor: AppArmor initialized [ 0.064821] TOMOYO Linux initialized [ 0.064821] LSM support for eBPF active [ 0.064821] Mount-cache hash table entries: 32768 (order: 6, 262144 bytes, linear) [ 0.064821] Mountpoint-cache hash table entries: 32768 (order: 6, 262144 bytes, linear) [ 0.064821] smpboot: CPU0: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz (family: 0x6, model: 0x8e, stepping: 0x9) [ 0.064821] Performance Events: PEBS fmt3+, Skylake events, 32-deep LBR, full-width counters, Intel PMU driver. [ 0.064821] ... version: 4 [ 0.064821] ... bit width: 48 [ 0.064821] ... generic registers: 4 [ 0.064821] ... value mask: 0000ffffffffffff [ 0.064821] ... max period: 00007fffffffffff [ 0.064821] ... fixed-purpose events: 3 [ 0.064821] ... event mask: 000000070000000f [ 0.064821] signal: max sigframe size: 2032 [ 0.064821] Estimated ratio of average max frequency by base frequency (times 1024): 1235 [ 0.064821] rcu: Hierarchical SRCU implementation. [ 0.064821] rcu: Max phase no-delay instances is 1000. [ 0.064821] NMI watchdog: Enabled. Permanently consumes one hw-PMU counter. [ 0.064821] smp: Bringing up secondary CPUs ... [ 0.064821] smpboot: x86: Booting SMP configuration: [ 0.064821] .... node #0, CPUs: #1 #2 #3 [ 0.064821] MDS CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html for more details. [ 0.064821] MMIO Stale Data CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/processor_mmio_stale_data.html for more details. [ 0.064821] smp: Brought up 1 node, 4 CPUs [ 0.064821] smpboot: Total of 4 processors activated (23199.08 BogoMIPS) [ 0.084849] node 0 deferred pages initialised in 20ms [ 0.085803] devtmpfs: initialized [ 0.085803] x86/mm: Memory block size: 128MB [ 0.086169] ACPI: PM: Registering ACPI NVS region [mem 0x556ab000-0x556abfff] (4096 bytes) [ 0.086169] ACPI: PM: Registering ACPI NVS region [mem 0x651c4000-0x6f871fff] (174776320 bytes) [ 0.090220] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns [ 0.090228] futex hash table entries: 1024 (order: 4, 65536 bytes, linear) [ 0.090282] pinctrl core: initialized pinctrl subsystem [ 0.090740] NET: Registered PF_NETLINK/PF_ROUTE protocol family [ 0.090963] DMA: preallocated 2048 KiB GFP_KERNEL pool for atomic allocations [ 0.091084] DMA: preallocated 2048 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations [ 0.091202] DMA: preallocated 2048 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations [ 0.091222] audit: initializing netlink subsys (disabled) [ 0.091238] audit: type=2000 audit(1711173480.028:1): state=initialized audit_enabled=0 res=1 [ 0.091238] thermal_sys: Registered thermal governor 'fair_share' [ 0.091238] thermal_sys: Registered thermal governor 'bang_bang' [ 0.091238] thermal_sys: Registered thermal governor 'step_wise' [ 0.091238] thermal_sys: Registered thermal governor 'user_space' [ 0.091238] thermal_sys: Registered thermal governor 'power_allocator' [ 0.091238] cpuidle: using governor ladder [ 0.091238] cpuidle: using governor menu [ 0.091238] Simple Boot Flag at 0x47 set to 0x80 [ 0.091238] ACPI FADT declares the system doesn't support PCIe ASPM, so disable it [ 0.091238] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5 [ 0.091238] PCI: ECAM [mem 0xe0000000-0xefffffff] (base 0xe0000000) for domain 0000 [bus 00-ff] [ 0.091238] PCI: not using ECAM ([mem 0xe0000000-0xefffffff] not reserved) [ 0.091238] PCI: Using configuration type 1 for base access [ 0.091238] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible. [ 0.091238] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages [ 0.091238] HugeTLB: 16380 KiB vmemmap can be freed for a 1.00 GiB page [ 0.091238] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages [ 0.091238] HugeTLB: 28 KiB vmemmap can be freed for a 2.00 MiB page [ 0.091238] Demotion targets for Node 0: null [ 0.091238] ACPI: Added _OSI(Module Device) [ 0.091238] ACPI: Added _OSI(Processor Device) [ 0.091238] ACPI: Added _OSI(3.0 _SCP Extensions) [ 0.091238] ACPI: Added _OSI(Processor Aggregator Device) [ 0.131871] ACPI: 11 ACPI AML tables successfully acquired and loaded [ 0.138778] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored [ 0.144827] ACPI: Dynamic OEM Table Load: [ 0.144834] ACPI: SSDT 0xFFFF939B012C7400 0003FF (v02 PmRef Cpu0Cst 00003001 INTL 20160422) [ 0.146177] ACPI: Dynamic OEM Table Load: [ 0.146182] ACPI: SSDT 0xFFFF939B01B58000 0006F6 (v02 PmRef Cpu0Ist 00003000 INTL 20160422) [ 0.148284] ACPI: Dynamic OEM Table Load: [ 0.148289] ACPI: SSDT 0xFFFF939B01B5B000 00065C (v02 PmRef ApIst 00003000 INTL 20160422) [ 0.149928] ACPI: Dynamic OEM Table Load: [ 0.149932] ACPI: SSDT 0xFFFF939B010B8400 00018A (v02 PmRef ApCst 00003000 INTL 20160422) [ 0.152979] ACPI: _OSC evaluated successfully for all CPUs [ 0.153164] ACPI: EC: EC started [ 0.153165] ACPI: EC: interrupt blocked [ 0.158912] ACPI: EC: EC_CMD/EC_SC=0x934, EC_DATA=0x930 [ 0.158915] ACPI: \_SB_.PCI0.LPCB.ECDV: Boot DSDT EC used to handle transactions [ 0.158916] ACPI: Interpreter enabled [ 0.158953] ACPI: PM: (supports S0 S3 S4 S5) [ 0.158961] ACPI: Using IOAPIC for interrupt routing [ 0.158996] PCI: ECAM [mem 0xe0000000-0xefffffff] (base 0xe0000000) for domain 0000 [bus 00-ff] [ 0.159924] PCI: ECAM [mem 0xe0000000-0xefffffff] reserved as ACPI motherboard resource [ 0.159933] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug [ 0.159935] PCI: Using E820 reservations for host bridge windows [ 0.160578] ACPI: Enabled 8 GPEs in block 00 to 7F [ 0.164575] ACPI: \_SB_.PCI0.RP09.PXSX.WRST: New power resource [ 0.164914] ACPI: \_SB_.PCI0.RP10.PXSX.WRST: New power resource [ 0.165235] ACPI: \_SB_.PCI0.RP11.PXSX.WRST: New power resource [ 0.165554] ACPI: \_SB_.PCI0.RP12.PXSX.WRST: New power resource [ 0.165874] ACPI: \_SB_.PCI0.RP13.PXSX.WRST: New power resource [ 0.166197] ACPI: \_SB_.PCI0.RP01.PXSX.WRST: New power resource [ 0.167022] ACPI: \_SB_.PCI0.RP02.PXSX.WRST: New power resource [ 0.167344] ACPI: \_SB_.PCI0.RP03.PXSX.WRST: New power resource [ 0.167667] ACPI: \_SB_.PCI0.RP04.PXSX.WRST: New power resource [ 0.167986] ACPI: \_SB_.PCI0.RP05.PXSX.WRST: New power resource [ 0.168305] ACPI: \_SB_.PCI0.RP06.PXSX.WRST: New power resource [ 0.168624] ACPI: \_SB_.PCI0.RP07.PXSX.WRST: New power resource [ 0.168947] ACPI: \_SB_.PCI0.RP08.PXSX.WRST: New power resource [ 0.169276] ACPI: \_SB_.PCI0.RP17.PXSX.WRST: New power resource [ 0.169598] ACPI: \_SB_.PCI0.RP18.PXSX.WRST: New power resource [ 0.169917] ACPI: \_SB_.PCI0.RP19.PXSX.WRST: New power resource [ 0.170236] ACPI: \_SB_.PCI0.RP20.PXSX.WRST: New power resource [ 0.171586] ACPI: \_SB_.PCI0.RP14.PXSX.WRST: New power resource [ 0.171906] ACPI: \_SB_.PCI0.RP15.PXSX.WRST: New power resource [ 0.172225] ACPI: \_SB_.PCI0.RP16.PXSX.WRST: New power resource [ 0.195606] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-fe]) [ 0.195613] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI HPX-Type3] [ 0.195811] acpi PNP0A08:00: _OSC: platform does not support [PCIeHotplug SHPCHotplug PME] [ 0.196182] acpi PNP0A08:00: _OSC: OS now controls [PCIeCapability LTR] [ 0.196184] acpi PNP0A08:00: FADT indicates ASPM is unsupported, using BIOS configuration [ 0.197146] PCI host bridge to bus 0000:00 [ 0.197148] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window] [ 0.197150] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window] [ 0.197152] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000dffff window] [ 0.197154] pci_bus 0000:00: root bus resource [mem 0x7c800000-0xdfffffff window] [ 0.197155] pci_bus 0000:00: root bus resource [mem 0xfd000000-0xfe7fffff window] [ 0.197157] pci_bus 0000:00: root bus resource [bus 00-fe] [ 0.197173] pci 0000:00:00.0: [8086:5904] type 00 class 0x060000 conventional PCI endpoint [ 0.197247] pci 0000:00:02.0: [8086:5916] type 00 class 0x030000 PCIe Root Complex Integrated Endpoint [ 0.197254] pci 0000:00:02.0: BAR 0 [mem 0xdb000000-0xdbffffff 64bit] [ 0.197259] pci 0000:00:02.0: BAR 2 [mem 0x90000000-0x9fffffff 64bit pref] [ 0.197263] pci 0000:00:02.0: BAR 4 [io 0xf000-0xf03f] [ 0.197277] pci 0000:00:02.0: Video device with shadowed ROM at [mem 0x000c0000-0x000dffff] [ 0.197433] pci 0000:00:04.0: [8086:1903] type 00 class 0x118000 conventional PCI endpoint [ 0.197441] pci 0000:00:04.0: BAR 0 [mem 0xdc320000-0xdc327fff 64bit] [ 0.197723] pci 0000:00:14.0: [8086:9d2f] type 00 class 0x0c0330 conventional PCI endpoint [ 0.197740] pci 0000:00:14.0: BAR 0 [mem 0xdc310000-0xdc31ffff 64bit] [ 0.197799] pci 0000:00:14.0: PME# supported from D3hot D3cold [ 0.198345] pci 0000:00:14.2: [8086:9d31] type 00 class 0x118000 conventional PCI endpoint [ 0.198360] pci 0000:00:14.2: BAR 0 [mem 0xdc334000-0xdc334fff 64bit] [ 0.198500] pci 0000:00:15.0: [8086:9d60] type 00 class 0x118000 conventional PCI endpoint [ 0.198531] pci 0000:00:15.0: BAR 0 [mem 0xdc333000-0xdc333fff 64bit] [ 0.198876] pci 0000:00:15.1: [8086:9d61] type 00 class 0x118000 conventional PCI endpoint [ 0.198921] pci 0000:00:15.1: BAR 0 [mem 0xdc332000-0xdc332fff 64bit] [ 0.199293] pci 0000:00:16.0: [8086:9d3a] type 00 class 0x078000 conventional PCI endpoint [ 0.199307] pci 0000:00:16.0: BAR 0 [mem 0xdc331000-0xdc331fff 64bit] [ 0.199351] pci 0000:00:16.0: PME# supported from D3hot [ 0.199681] pci 0000:00:1c.0: [8086:9d10] type 01 class 0x060400 PCIe Root Port [ 0.199702] pci 0000:00:1c.0: PCI bridge to [bus 01-39] [ 0.199707] pci 0000:00:1c.0: bridge window [mem 0xc4000000-0xda0fffff] [ 0.199714] pci 0000:00:1c.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 0.199765] pci 0000:00:1c.0: PME# supported from D0 D3hot D3cold [ 0.200258] pci 0000:00:1c.4: [8086:9d14] type 01 class 0x060400 PCIe Root Port [ 0.200280] pci 0000:00:1c.4: PCI bridge to [bus 3a] [ 0.200284] pci 0000:00:1c.4: bridge window [mem 0xdc000000-0xdc1fffff] [ 0.200342] pci 0000:00:1c.4: PME# supported from D0 D3hot D3cold [ 0.200839] pci 0000:00:1d.0: [8086:9d18] type 01 class 0x060400 PCIe Root Port [ 0.200858] pci 0000:00:1d.0: PCI bridge to [bus 3b] [ 0.200862] pci 0000:00:1d.0: bridge window [mem 0xdc200000-0xdc2fffff] [ 0.200912] pci 0000:00:1d.0: PME# supported from D0 D3hot D3cold [ 0.201423] pci 0000:00:1f.0: [8086:9d58] type 00 class 0x060100 conventional PCI endpoint [ 0.201736] pci 0000:00:1f.2: [8086:9d21] type 00 class 0x058000 conventional PCI endpoint [ 0.201748] pci 0000:00:1f.2: BAR 0 [mem 0xdc32c000-0xdc32ffff] [ 0.201981] pci 0000:00:1f.3: [8086:9d71] type 00 class 0x040380 conventional PCI endpoint [ 0.202001] pci 0000:00:1f.3: BAR 0 [mem 0xdc328000-0xdc32bfff 64bit] [ 0.202025] pci 0000:00:1f.3: BAR 4 [mem 0xdc300000-0xdc30ffff 64bit] [ 0.202066] pci 0000:00:1f.3: PME# supported from D3hot D3cold [ 0.202669] pci 0000:00:1f.4: [8086:9d23] type 00 class 0x0c0500 conventional PCI endpoint [ 0.202728] pci 0000:00:1f.4: BAR 0 [mem 0xdc330000-0xdc3300ff 64bit] [ 0.202799] pci 0000:00:1f.4: BAR 4 [io 0xf040-0xf05f] [ 0.203151] pci 0000:00:1c.0: PCI bridge to [bus 01-39] [ 0.203599] pci 0000:3a:00.0: [168c:003e] type 00 class 0x028000 PCIe Endpoint [ 0.203818] pci 0000:3a:00.0: BAR 0 [mem 0xdc000000-0xdc1fffff 64bit] [ 0.204933] pci 0000:3a:00.0: PME# supported from D0 D3hot D3cold [ 0.206668] pci 0000:00:1c.4: PCI bridge to [bus 3a] [ 0.206769] pci 0000:3b:00.0: [1c5c:1284] type 00 class 0x010802 PCIe Endpoint [ 0.206789] pci 0000:3b:00.0: BAR 0 [mem 0xdc200000-0xdc203fff 64bit] [ 0.206901] pci 0000:3b:00.0: PME# supported from D0 D1 D3hot [ 0.207282] pci 0000:00:1d.0: PCI bridge to [bus 3b] [ 0.210342] ACPI: PCI: Interrupt link LNKA configured for IRQ 11 [ 0.210342] ACPI: PCI: Interrupt link LNKB configured for IRQ 10 [ 0.210342] ACPI: PCI: Interrupt link LNKC configured for IRQ 11 [ 0.210342] ACPI: PCI: Interrupt link LNKD configured for IRQ 11 [ 0.210342] ACPI: PCI: Interrupt link LNKE configured for IRQ 11 [ 0.210342] ACPI: PCI: Interrupt link LNKF configured for IRQ 11 [ 0.210342] ACPI: PCI: Interrupt link LNKG configured for IRQ 11 [ 0.210342] ACPI: PCI: Interrupt link LNKH configured for IRQ 11 [ 0.223794] ACPI: EC: interrupt unblocked [ 0.223796] ACPI: EC: event unblocked [ 0.223801] ACPI: EC: EC_CMD/EC_SC=0x934, EC_DATA=0x930 [ 0.223803] ACPI: EC: GPE=0x14 [ 0.223804] ACPI: \_SB_.PCI0.LPCB.ECDV: Boot DSDT EC initialization complete [ 0.223806] ACPI: \_SB_.PCI0.LPCB.ECDV: EC: Used to handle transactions and events [ 0.223882] iommu: Default domain type: Translated [ 0.223882] iommu: DMA domain TLB invalidation policy: lazy mode [ 0.223882] pps_core: LinuxPPS API ver. 1 registered [ 0.223882] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it> [ 0.223882] PTP clock support registered [ 0.223882] EDAC MC: Ver: 3.0.0 [ 0.223882] efivars: Registered efivars operations [ 0.223882] NetLabel: Initializing [ 0.223882] NetLabel: domain hash size = 128 [ 0.223882] NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO [ 0.223882] NetLabel: unlabeled traffic allowed by default [ 0.223882] PCI: Using ACPI for IRQ routing [ 0.247397] PCI: pci_cache_line_size set to 64 bytes [ 0.247773] e820: reserve RAM buffer [mem 0x00058000-0x0005ffff] [ 0.247775] e820: reserve RAM buffer [mem 0x0009e000-0x0009ffff] [ 0.247776] e820: reserve RAM buffer [mem 0x513f1018-0x53ffffff] [ 0.247777] e820: reserve RAM buffer [mem 0x556ab000-0x57ffffff] [ 0.247778] e820: reserve RAM buffer [mem 0x62260000-0x63ffffff] [ 0.247779] e820: reserve RAM buffer [mem 0x64df4000-0x67ffffff] [ 0.247780] e820: reserve RAM buffer [mem 0x78600000-0x7bffffff] [ 0.247781] e820: reserve RAM buffer [mem 0x481800000-0x483ffffff] [ 0.248830] pci 0000:00:02.0: vgaarb: setting as boot VGA device [ 0.248830] pci 0000:00:02.0: vgaarb: bridge control possible [ 0.248831] pci 0000:00:02.0: vgaarb: VGA device added: decodes=io+mem,owns=io+mem,locks=none [ 0.248834] vgaarb: loaded [ 0.248887] clocksource: Switched to clocksource tsc-early [ 0.249461] VFS: Disk quotas dquot_6.6.0 [ 0.249478] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes) [ 0.249614] AppArmor: AppArmor Filesystem Enabled [ 0.249626] pnp: PnP ACPI init [ 0.249802] system 00:00: [io 0x0680-0x069f] has been reserved [ 0.249805] system 00:00: [io 0xffff] has been reserved [ 0.249807] system 00:00: [io 0xffff] has been reserved [ 0.249808] system 00:00: [io 0xffff] has been reserved [ 0.249810] system 00:00: [io 0x1800-0x18fe] has been reserved [ 0.249811] system 00:00: [io 0x164e-0x164f] has been reserved [ 0.249956] system 00:02: [io 0x1854-0x1857] has been reserved [ 0.250377] system 00:05: [mem 0xfed10000-0xfed17fff] has been reserved [ 0.250380] system 00:05: [mem 0xfed18000-0xfed18fff] has been reserved [ 0.250382] system 00:05: [mem 0xfed19000-0xfed19fff] has been reserved [ 0.250383] system 00:05: [mem 0xe0000000-0xefffffff] has been reserved [ 0.250385] system 00:05: [mem 0xfed20000-0xfed3ffff] has been reserved [ 0.250387] system 00:05: [mem 0xfed90000-0xfed93fff] could not be reserved [ 0.250388] system 00:05: [mem 0xfed45000-0xfed8ffff] has been reserved [ 0.250390] system 00:05: [mem 0xff000000-0xffffffff] has been reserved [ 0.250392] system 00:05: [mem 0xfee00000-0xfeefffff] could not be reserved [ 0.250393] system 00:05: [mem 0xdffe0000-0xdfffffff] has been reserved [ 0.250433] system 00:06: [mem 0xfd000000-0xfdabffff] has been reserved [ 0.250435] system 00:06: [mem 0xfdad0000-0xfdadffff] has been reserved [ 0.250437] system 00:06: [mem 0xfdb00000-0xfdffffff] has been reserved [ 0.250438] system 00:06: [mem 0xfe000000-0xfe01ffff] could not be reserved [ 0.250440] system 00:06: [mem 0xfe036000-0xfe03bfff] has been reserved [ 0.250441] system 00:06: [mem 0xfe03d000-0xfe3fffff] has been reserved [ 0.250443] system 00:06: [mem 0xfe410000-0xfe7fffff] has been reserved [ 0.250728] system 00:07: [io 0xff00-0xfffe] has been reserved [ 0.251890] system 00:08: [mem 0xfe029000-0xfe029fff] has been reserved [ 0.251893] system 00:08: [mem 0xfe028000-0xfe028fff] has been reserved [ 0.255665] pnp: PnP ACPI: found 9 devices [ 0.261489] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns [ 0.261533] pci 0000:00:1f.1: [8086:9d20] type 00 class 0x058000 conventional PCI endpoint [ 0.261592] pci 0000:00:1f.1: BAR 0 [mem 0xfd000000-0xfdffffff 64bit] [ 0.261874] NET: Registered PF_INET protocol family [ 0.261994] IP idents hash table entries: 262144 (order: 9, 2097152 bytes, linear) [ 0.264282] tcp_listen_portaddr_hash hash table entries: 8192 (order: 5, 131072 bytes, linear) [ 0.264307] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.264368] TCP established hash table entries: 131072 (order: 8, 1048576 bytes, linear) [ 0.264545] TCP bind hash table entries: 65536 (order: 9, 2097152 bytes, linear) [ 0.264742] TCP: Hash tables configured (established 131072 bind 65536) [ 0.264819] MPTCP token hash table entries: 16384 (order: 6, 393216 bytes, linear) [ 0.264859] UDP hash table entries: 8192 (order: 6, 262144 bytes, linear) [ 0.264891] UDP-Lite hash table entries: 8192 (order: 6, 262144 bytes, linear) [ 0.264951] NET: Registered PF_UNIX/PF_LOCAL protocol family [ 0.264956] NET: Registered PF_XDP protocol family [ 0.264964] pci 0000:00:1c.0: bridge window [io 0x1000-0x0fff] to [bus 01-39] add_size 1000 [ 0.264974] pci 0000:00:1c.0: bridge window [io 0x2000-0x2fff]: assigned [ 0.264977] pci 0000:00:1c.0: PCI bridge to [bus 01-39] [ 0.264979] pci 0000:00:1c.0: bridge window [io 0x2000-0x2fff] [ 0.264983] pci 0000:00:1c.0: bridge window [mem 0xc4000000-0xda0fffff] [ 0.264986] pci 0000:00:1c.0: bridge window [mem 0xa0000000-0xc1ffffff 64bit pref] [ 0.264990] pci 0000:00:1c.4: PCI bridge to [bus 3a] [ 0.264994] pci 0000:00:1c.4: bridge window [mem 0xdc000000-0xdc1fffff] [ 0.265000] pci 0000:00:1d.0: PCI bridge to [bus 3b] [ 0.265002] pci 0000:00:1d.0: bridge window [mem 0xdc200000-0xdc2fffff] [ 0.265008] pci_bus 0000:00: resource 4 [io 0x0000-0x0cf7 window] [ 0.265010] pci_bus 0000:00: resource 5 [io 0x0d00-0xffff window] [ 0.265011] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000dffff window] [ 0.265012] pci_bus 0000:00: resource 7 [mem 0x7c800000-0xdfffffff window] [ 0.265014] pci_bus 0000:00: resource 8 [mem 0xfd000000-0xfe7fffff window] [ 0.265015] pci_bus 0000:01: resource 0 [io 0x2000-0x2fff] [ 0.265016] pci_bus 0000:01: resource 1 [mem 0xc4000000-0xda0fffff] [ 0.265017] pci_bus 0000:01: resource 2 [mem 0xa0000000-0xc1ffffff 64bit pref] [ 0.265019] pci_bus 0000:3a: resource 1 [mem 0xdc000000-0xdc1fffff] [ 0.265021] pci_bus 0000:3b: resource 1 [mem 0xdc200000-0xdc2fffff] [ 0.265662] PCI: CLS 0 bytes, default 64 [ 0.265673] DMAR: ACPI device "device:79" under DMAR at fed91000 as 00:15.0 [ 0.265677] DMAR: ACPI device "device:7a" under DMAR at fed91000 as 00:15.1 [ 0.265685] PCI-DMA: Using software bounce buffering for IO (SWIOTLB) [ 0.265686] software IO TLB: mapped [mem 0x000000005e260000-0x0000000062260000] (64MB) [ 0.265719] Unpacking initramfs... [ 0.265745] sgx: EPC section 0x70200000-0x75f7ffff [ 0.266605] Initialise system trusted keyrings [ 0.266617] Key type blacklist registered [ 0.266698] workingset: timestamp_bits=36 max_order=22 bucket_order=0 [ 0.266723] zbud: loaded [ 0.266915] fuse: init (API version 7.40) [ 0.267203] integrity: Platform Keyring initialized [ 0.267211] integrity: Machine keyring initialized [ 0.267215] Key type asymmetric registered [ 0.267218] Asymmetric key parser 'x509' registered [ 0.295920] Freeing initrd memory: 19564K [ 0.299316] alg: self-tests disabled [ 0.299386] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 247) [ 0.299414] io scheduler mq-deadline registered [ 0.300481] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4 [ 0.302622] thermal LNXTHERM:00: registered as thermal_zone0 [ 0.302624] ACPI: thermal: Thermal Zone [THM] (25 C) [ 0.302778] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled [ 0.303402] hpet_acpi_add: no address or irqs in _CRS [ 0.315800] tpm_tis MSFT0101:00: 2.0 TPM (device-id 0xFE, rev-id 4) [ 0.355599] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12 [ 0.355970] i8042: Warning: Keylock active [ 0.357750] serio: i8042 KBD port at 0x60,0x64 irq 1 [ 0.357755] serio: i8042 AUX port at 0x60,0x64 irq 12 [ 0.357849] mousedev: PS/2 mouse device common for all mice [ 0.357873] rtc_cmos 00:01: RTC can wake from S4 [ 0.358596] rtc_cmos 00:01: registered as rtc0 [ 0.358728] rtc_cmos 00:01: setting system clock to 2024-03-23T05:58:00 UTC (1711173480) [ 0.358752] rtc_cmos 00:01: alarms up to one month, y3k, 242 bytes nvram [ 0.358850] intel_pstate: Intel P-state driver initializing [ 0.358979] intel_pstate: HWP enabled [ 0.359001] ledtrig-cpu: registered to indicate activity on CPUs [ 0.359290] efifb: probing for efifb [ 0.359302] efifb: framebuffer at 0x90000000, using 22500k, total 22500k [ 0.359304] efifb: mode is 3200x1800x32, linelength=12800, pages=1 [ 0.359306] efifb: scrolling: redraw [ 0.359306] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0 [ 0.359383] Console: switching to colour frame buffer device 200x56 [ 0.363275] fb0: EFI VGA frame buffer device [ 0.363450] NET: Registered PF_INET6 protocol family [ 0.367532] Segment Routing with IPv6 [ 0.367546] In-situ OAM (IOAM) with IPv6 [ 0.367571] mip6: Mobile IPv6 [ 0.367576] NET: Registered PF_PACKET protocol family [ 0.367637] mpls_gso: MPLS GSO support [ 0.367967] ENERGY_PERF_BIAS: Set to 'normal', was 'performance' [ 0.368080] microcode: Current revision: 0x000000f4 [ 0.368083] microcode: Updated early from: 0x000000f0 [ 0.368229] IPI shorthand broadcast: enabled [ 0.369467] sched_clock: Marking stable (362355159, 5855388)->(403861059, -35650512) [ 0.369600] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level [ 0.369703] registered taskstats version 1 [ 0.369733] Loading compiled-in X.509 certificates [ 0.370356] Loaded X.509 cert 'Build time autogenerated kernel key: d47c33c70b7d8c925a93309ef39ed6f8acab6016' [ 0.372133] Key type .fscrypt registered [ 0.372135] Key type fscrypt-provisioning registered [ 0.377659] cryptd: module verification failed: signature and/or required key missing - tainting kernel [ 0.378226] cryptd: max_cpu_qlen set to 1000 [ 0.379431] AVX2 version of gcm_enc/dec engaged. [ 0.379472] AES CTR mode by8 optimization enabled [ 0.393421] Key type encrypted registered [ 0.393427] AppArmor: AppArmor sha256 policy hashing enabled [ 0.393674] integrity: Loading X.509 certificate: UEFI:db [ 0.393703] integrity: Loaded X.509 cert 'Dell Inc. UEFI DB: 5ddb772dc880660055ba0bc131886bb630a639e7' [ 0.393704] integrity: Loading X.509 certificate: UEFI:db [ 0.393725] integrity: Loaded X.509 cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4' [ 0.393727] integrity: Loading X.509 certificate: UEFI:db [ 0.393743] integrity: Loaded X.509 cert 'Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53' [ 0.394088] ima: Allocated hash algorithm: sha256 [ 0.435231] ima: No architecture policies found [ 0.435255] evm: Initialising EVM extended attributes: [ 0.435256] evm: security.selinux [ 0.435258] evm: security.SMACK64 (disabled) [ 0.435259] evm: security.SMACK64EXEC (disabled) [ 0.435261] evm: security.SMACK64TRANSMUTE (disabled) [ 0.435262] evm: security.SMACK64MMAP (disabled) [ 0.435263] evm: security.apparmor [ 0.435264] evm: security.ima [ 0.435265] evm: security.capability [ 0.435267] evm: HMAC attrs: 0x1 [ 0.436779] RAS: Correctable Errors collector initialized. [ 0.436831] clk: Disabling unused clocks [ 0.438122] Freeing unused decrypted memory: 2036K [ 0.438767] Freeing unused kernel image (initmem) memory: 4032K [ 0.438858] Write protecting the kernel read-only data: 22528k [ 0.439224] Freeing unused kernel image (rodata/data gap) memory: 116K [ 0.499027] x86/mm: Checked W+X mappings: passed, no W+X pages found. [ 0.499030] x86/mm: Checking user space page tables [ 0.540595] x86/mm: Checked W+X mappings: passed, no W+X pages found. [ 0.540600] Run /init as init process [ 0.540601] with arguments: [ 0.540603] /init [ 0.540604] with environment: [ 0.540604] HOME=/ [ 0.540605] TERM=linux [ 0.540606] BOOT_IMAGE=/vmlinuz-6.8.0+ [ 0.565863] atkbd serio0: Failed to deactivate keyboard on isa0060/serio0 [ 0.667066] hid: raw HID events driver (C) Jiri Kosina [ 0.667941] intel-lpss 0000:00:15.0: enabling device (0000 -> 0002) [ 0.671185] idma64 idma64.0: Found Intel integrated DMA 64-bit [ 0.681464] ACPI: bus type USB registered [ 0.681503] usbcore: registered new interface driver usbfs [ 0.681513] usbcore: registered new interface driver hub [ 0.681526] usbcore: registered new device driver usb [ 0.690303] intel-lpss 0000:00:15.1: enabling device (0000 -> 0002) [ 0.690581] idma64 idma64.1: Found Intel integrated DMA 64-bit [ 0.705926] ACPI: bus type drm_connector registered [ 0.706055] i801_smbus 0000:00:1f.4: SPD Write Disable is set [ 0.706082] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt [ 0.719661] xhci_hcd 0000:00:14.0: xHCI Host Controller [ 0.719671] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 1 [ 0.720737] xhci_hcd 0000:00:14.0: hcc params 0x200077c1 hci version 0x100 quirks 0x0000000081109810 [ 0.721202] xhci_hcd 0000:00:14.0: xHCI Host Controller [ 0.721207] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 2 [ 0.721211] xhci_hcd 0000:00:14.0: Host supports USB 3.0 SuperSpeed [ 0.721265] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.08 [ 0.721267] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 0.721269] usb usb1: Product: xHCI Host Controller [ 0.721270] usb usb1: Manufacturer: Linux 6.8.0+ xhci-hcd [ 0.721271] usb usb1: SerialNumber: 0000:00:14.0 [ 0.721549] hub 1-0:1.0: USB hub found [ 0.721571] hub 1-0:1.0: 12 ports detected [ 0.723869] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.08 [ 0.723872] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 0.723874] usb usb2: Product: xHCI Host Controller [ 0.723876] usb usb2: Manufacturer: Linux 6.8.0+ xhci-hcd [ 0.723877] usb usb2: SerialNumber: 0000:00:14.0 [ 0.723977] hub 2-0:1.0: USB hub found [ 0.723992] hub 2-0:1.0: 6 ports detected [ 0.883527] input: DLL075B:01 06CB:76AF Mouse as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input1 [ 0.883775] input: DLL075B:01 06CB:76AF Touchpad as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input2 [ 0.883950] hid-generic 0018:06CB:76AF.0001: input,hidraw0: I2C HID v1.00 Mouse [DLL075B:01 06CB:76AF] on i2c-DLL075B:01 [ 0.893404] nvme nvme0: pci function 0000:3b:00.0 [ 0.911085] nvme nvme0: 4/0/0 default/read/poll queues [ 0.917526] nvme0n1: p1 p2 p3 p4 [ 0.974053] atkbd serio0: Failed to enable keyboard on isa0060/serio0 [ 0.974439] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input0 [ 0.986070] usb 1-3: new full-speed USB device number 2 using xhci_hcd [ 1.136681] usb 1-3: New USB device found, idVendor=0cf3, idProduct=e300, bcdDevice= 0.01 [ 1.136699] usb 1-3: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 1.365290] tsc: Refined TSC clocksource calibration: 2904.000 MHz [ 1.365296] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x29dc05e54fc, max_idle_ns: 440795291716 ns [ 1.365319] clocksource: Switched to clocksource tsc [ 1.422161] usb 1-4: new full-speed USB device number 3 using xhci_hcd [ 1.566634] atkbd serio0: Spurious ACK on isa0060/serio0. Some program might be trying to access hardware directly. [ 1.572324] usb 1-4: New USB device found, idVendor=04f3, idProduct=2234, bcdDevice=11.11 [ 1.572341] usb 1-4: New USB device strings: Mfr=4, Product=14, SerialNumber=0 [ 1.572349] usb 1-4: Product: Touchscreen [ 1.572355] usb 1-4: Manufacturer: ELAN [ 1.702112] usb 1-5: new high-speed USB device number 4 using xhci_hcd [ 1.911293] usb 1-5: New USB device found, idVendor=0c45, idProduct=670c, bcdDevice=56.26 [ 1.911311] usb 1-5: New USB device strings: Mfr=2, Product=1, SerialNumber=0 [ 1.911318] usb 1-5: Product: Integrated_Webcam_HD [ 1.911324] usb 1-5: Manufacturer: CN09GTFMLOG008C8B7FWA01 [ 1.942280] input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input5 [ 1.942581] input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input6 [ 1.942666] input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input7 [ 1.942878] hid-generic 0003:04F3:2234.0002: input,hiddev0,hidraw1: USB HID v1.10 Device [ELAN Touchscreen] on usb-0000:00:14.0-4/input0 [ 1.942907] usbcore: registered new interface driver usbhid [ 1.942908] usbhid: USB HID core driver [ 1.959227] device-mapper: core: CONFIG_IMA_DISABLE_HTABLE is disabled. Duplicate IMA measurements will not be recorded in the IMA log. [ 1.959255] device-mapper: uevent: version 1.0.3 [ 1.959345] device-mapper: ioctl: 4.48.0-ioctl (2023-03-01) initialised: dm-devel@lists.linux.dev [ 40.435988] PM: Image not found (code -22) [ 40.572313] EXT4-fs (dm-0): mounted filesystem 32e29882-d94d-4a92-9ee4-4d03002bfa29 ro with ordered data mode. Quota mode: none. [ 40.595777] Not activating Mandatory Access Control as /sbin/tomoyo-init does not exist. [ 40.689819] systemd[1]: Inserted module 'autofs4' [ 40.737225] systemd[1]: systemd 255.4-1+b1 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified) [ 40.737270] systemd[1]: Detected architecture x86-64. [ 40.739359] systemd[1]: Hostname set to <abreu>. [ 40.960254] systemd[1]: Queued start job for default target graphical.target. [ 40.995043] systemd[1]: Created slice system-getty.slice - Slice /system/getty. [ 40.996040] systemd[1]: Created slice system-modprobe.slice - Slice /system/modprobe. [ 40.996311] systemd[1]: Created slice system-systemd\x2dcryptsetup.slice - Encrypted Volume Units Service Slice. [ 40.996577] systemd[1]: Created slice system-systemd\x2dfsck.slice - Slice /system/systemd-fsck. [ 40.996785] systemd[1]: Created slice user.slice - User and Session Slice. [ 40.996854] systemd[1]: Started systemd-ask-password-console.path - Dispatch Password Requests to Console Directory Watch. [ 40.996902] systemd[1]: Started systemd-ask-password-wall.path - Forward Password Requests to Wall Directory Watch. [ 40.997063] systemd[1]: Set up automount proc-sys-fs-binfmt_misc.automount - Arbitrary Executable File Formats File System Automount Point. [ 40.997083] systemd[1]: Expecting device dev-disk-by\x2ddiskseq-1\x2dpart4.device - /dev/disk/by-diskseq/1-part4... [ 40.997089] systemd[1]: Expecting device dev-disk-by\x2duuid-2d23fd4c\x2d5d03\x2d4e1a\x2d8a42\x2d0e859d1f00d8.device - /dev/disk/by-uuid/2d23fd4c-5d03-4e1a-8a42-0e859d1f00d8... [ 40.997095] systemd[1]: Expecting device dev-disk-by\x2duuid-61be8f50\x2d69c5\x2d49a5\x2dbcad\x2d3f4521e9c7b5.device - /dev/disk/by-uuid/61be8f50-69c5-49a5-bcad-3f4521e9c7b5... [ 40.997100] systemd[1]: Expecting device dev-disk-by\x2duuid-96BD\x2d5653.device - /dev/disk/by-uuid/96BD-5653... [ 40.997115] systemd[1]: Reached target integritysetup.target - Local Integrity Protected Volumes. [ 40.997133] systemd[1]: Reached target nss-user-lookup.target - User and Group Name Lookups. [ 40.997142] systemd[1]: Reached target paths.target - Path Units. [ 40.997155] systemd[1]: Reached target remote-fs.target - Remote File Systems. [ 40.997163] systemd[1]: Reached target slices.target - Slice Units. [ 40.997191] systemd[1]: Reached target veritysetup.target - Local Verity Protected Volumes. [ 40.998377] systemd[1]: Listening on systemd-coredump.socket - Process Core Dump Socket. [ 40.998469] systemd[1]: Listening on systemd-fsckd.socket - fsck to fsckd communication Socket. [ 40.998525] systemd[1]: Listening on systemd-initctl.socket - initctl Compatibility Named Pipe. [ 40.998642] systemd[1]: Listening on systemd-journald-dev-log.socket - Journal Socket (/dev/log). [ 40.998761] systemd[1]: Listening on systemd-journald.socket - Journal Socket. [ 40.998797] systemd[1]: systemd-pcrextend.socket - TPM2 PCR Extension (Varlink) was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 40.999088] systemd[1]: Listening on systemd-udevd-control.socket - udev Control Socket. [ 40.999180] systemd[1]: Listening on systemd-udevd-kernel.socket - udev Kernel Socket. [ 41.000243] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System... [ 41.001200] systemd[1]: Mounting dev-mqueue.mount - POSIX Message Queue File System... [ 41.002284] systemd[1]: Mounting sys-kernel-debug.mount - Kernel Debug File System... [ 41.006055] systemd[1]: Mounting sys-kernel-tracing.mount - Kernel Trace File System... [ 41.007858] systemd[1]: Starting kmod-static-nodes.service - Create List of Static Device Nodes... [ 41.011513] systemd[1]: Starting modprobe@configfs.service - Load Kernel Module configfs... [ 41.014621] systemd[1]: Starting modprobe@dm_mod.service - Load Kernel Module dm_mod... [ 41.017300] systemd[1]: Starting modprobe@drm.service - Load Kernel Module drm... [ 41.024909] systemd[1]: Starting modprobe@efi_pstore.service - Load Kernel Module efi_pstore... [ 41.026298] systemd[1]: Starting modprobe@fuse.service - Load Kernel Module fuse... [ 41.028137] systemd[1]: Starting modprobe@loop.service - Load Kernel Module loop... [ 41.028274] systemd[1]: systemd-fsck-root.service - File System Check on Root Device was skipped because of an unmet condition check (ConditionPathExists=!/run/initramfs/fsck-root). [ 41.031103] systemd[1]: Starting systemd-journald.service - Journal Service... [ 41.033147] pstore: Using crash dump compression: deflate [ 41.037625] systemd[1]: Starting systemd-modules-load.service - Load Kernel Modules... [ 41.037659] systemd[1]: systemd-pcrmachine.service - TPM2 PCR Machine ID Measurement was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 41.040154] pstore: Registered efi_pstore as persistent store backend [ 41.040420] systemd[1]: Starting systemd-remount-fs.service - Remount Root and Kernel File Systems... [ 41.040487] systemd[1]: systemd-tpm2-setup-early.service - TPM2 SRK Setup (Early) was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 41.046169] loop: module loaded [ 41.046747] systemd[1]: Starting systemd-udev-trigger.service - Coldplug All udev Devices... [ 41.049145] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System. [ 41.049315] systemd[1]: Mounted dev-mqueue.mount - POSIX Message Queue File System. [ 41.049437] systemd[1]: Mounted sys-kernel-debug.mount - Kernel Debug File System. [ 41.049544] systemd[1]: Mounted sys-kernel-tracing.mount - Kernel Trace File System. [ 41.049806] systemd[1]: Finished kmod-static-nodes.service - Create List of Static Device Nodes. [ 41.050298] systemd[1]: modprobe@configfs.service: Deactivated successfully. [ 41.050465] systemd[1]: Finished modprobe@configfs.service - Load Kernel Module configfs. [ 41.050818] systemd[1]: modprobe@dm_mod.service: Deactivated successfully. [ 41.050988] systemd[1]: Finished modprobe@dm_mod.service - Load Kernel Module dm_mod. [ 41.051310] systemd[1]: modprobe@drm.service: Deactivated successfully. [ 41.051464] systemd[1]: Finished modprobe@drm.service - Load Kernel Module drm. [ 41.051791] systemd[1]: modprobe@efi_pstore.service: Deactivated successfully. [ 41.051945] systemd[1]: Finished modprobe@efi_pstore.service - Load Kernel Module efi_pstore. [ 41.052381] systemd[1]: modprobe@fuse.service: Deactivated successfully. [ 41.052566] systemd[1]: Finished modprobe@fuse.service - Load Kernel Module fuse. [ 41.052955] systemd[1]: modprobe@loop.service: Deactivated successfully. [ 41.053121] systemd[1]: Finished modprobe@loop.service - Load Kernel Module loop. [ 41.058044] systemd[1]: Mounting sys-fs-fuse-connections.mount - FUSE Control File System... [ 41.060809] systemd[1]: Mounting sys-kernel-config.mount - Kernel Configuration File System... [ 41.060892] systemd[1]: systemd-repart.service - Repartition Root Disk was skipped because no trigger condition checks were met. [ 41.062260] systemd[1]: Starting systemd-tmpfiles-setup-dev-early.service - Create Static Device Nodes in /dev gracefully... [ 41.064636] systemd-journald[481]: Collecting audit messages is disabled. [ 41.066091] lp: driver loaded but no devices found [ 41.066581] systemd[1]: Mounted sys-fs-fuse-connections.mount - FUSE Control File System. [ 41.070140] systemd[1]: Mounted sys-kernel-config.mount - Kernel Configuration File System. [ 41.072785] ppdev: user-space parallel port driver [ 41.087469] EXT4-fs (dm-0): re-mounted 32e29882-d94d-4a92-9ee4-4d03002bfa29 r/w. Quota mode: none. [ 41.088807] systemd[1]: Finished systemd-remount-fs.service - Remount Root and Kernel File Systems. [ 41.089685] systemd[1]: systemd-hwdb-update.service - Rebuild Hardware Database was skipped because of an unmet condition check (ConditionNeedsUpdate=/etc). [ 41.089750] systemd[1]: systemd-pstore.service - Platform Persistent Storage Archival was skipped because of an unmet condition check (ConditionDirectoryNotEmpty=/sys/fs/pstore). [ 41.118142] systemd[1]: Starting systemd-random-seed.service - Load/Save OS Random Seed... [ 41.118169] systemd[1]: systemd-tpm2-setup.service - TPM2 SRK Setup was skipped because of an unmet condition check (ConditionSecurity=measured-uki). [ 41.118454] systemd[1]: Finished systemd-modules-load.service - Load Kernel Modules. [ 41.118713] systemd[1]: Finished systemd-tmpfiles-setup-dev-early.service - Create Static Device Nodes in /dev gracefully. [ 41.118842] systemd[1]: Started systemd-journald.service - Journal Service. [ 41.140672] systemd-journald[481]: Received client request to flush runtime journal. [ 41.157132] systemd-journald[481]: /var/log/journal/16ae67b9dca94ecebbc8ec78ab24e074/system.journal: Journal file uses a different sequence number ID, rotating. [ 41.157141] systemd-journald[481]: Rotating system journal. [ 41.322665] input: Lid Switch as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00/input/input9 [ 41.339612] ACPI: button: Lid Switch [LID0] [ 41.339693] input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input10 [ 41.340214] ACPI: AC: AC Adapter [AC] (off-line) [ 41.371558] input: Intel HID events as /devices/platform/INT33D5:00/input/input11 [ 41.385792] Consider using thermal netlink events interface [ 41.386730] wmi_bus wmi_bus-PNP0C14:01: [Firmware Bug]: WQBC data block query control method not found [ 41.388444] input: Intel Virtual Buttons as /devices/pci0000:00/0000:00:1f.0/PNP0C09:00/INT33D6:00/input/input12 [ 41.398225] ACPI: button: Power Button [PBTN] [ 41.398288] input: Sleep Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input14 [ 41.398365] ACPI: button: Sleep Button [SBTN] [ 41.398429] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input15 [ 41.400091] intel-hid INT33D5:00: platform supports 5 button array [ 41.400136] input: Intel HID 5 button array as /devices/platform/INT33D5:00/input/input16 [ 41.420546] ACPI: battery: Slot [BAT0] (battery present) [ 41.464333] mei_me 0000:00:16.0: enabling device (0000 -> 0002) [ 41.466803] Adding 8387904k swap on /dev/nvme0n1p4. Priority:-2 extents:1 across:8387904k SS [ 41.489617] input: DLL075B:01 06CB:76AF Mouse as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input17 [ 41.489674] ACPI: button: Power Button [PWRF] [ 41.489946] input: DLL075B:01 06CB:76AF Touchpad as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-DLL075B:01/0018:06CB:76AF.0001/input/input18 [ 41.494070] hid-multitouch 0018:06CB:76AF.0001: input,hidraw0: I2C HID v1.00 Mouse [DLL075B:01 06CB:76AF] on i2c-DLL075B:01 [ 41.498735] intel_pmc_core INT33A1:00: initialized [ 41.610730] input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input20 [ 41.613547] input: ELAN Touchscreen UNKNOWN as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input21 [ 41.614214] input: ELAN Touchscreen UNKNOWN as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/0003:04F3:2234.0002/input/input22 [ 41.618511] hid-multitouch 0003:04F3:2234.0002: input,hiddev0,hidraw1: USB HID v1.10 Device [ELAN Touchscreen] on usb-0000:00:14.0-4/input0 [ 41.957130] input: PC Speaker as /devices/platform/pcspkr/input/input24 [ 41.960182] proc_thermal 0000:00:04.0: enabling device (0000 -> 0002) [ 42.047297] intel_rapl_common: Found RAPL domain package [ 42.047314] intel_rapl_common: Found RAPL domain dram [ 42.100476] mc: Linux media interface: v0.10 [ 42.106634] iTCO_vendor_support: vendor-support=0 [ 42.123640] EXT4-fs (nvme0n1p2): mounted filesystem 2d23fd4c-5d03-4e1a-8a42-0e859d1f00d8 r/w with ordered data mode. Quota mode: none. [ 42.128691] iTCO_wdt iTCO_wdt: Found a Intel PCH TCO device (Version=4, TCOBASE=0x0400) [ 42.132940] iTCO_wdt iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0) [ 42.175774] videodev: Linux video capture interface: v2.00 [ 42.213648] input: Dell WMI hotkeys as /devices/platform/PNP0C14:01/wmi_bus/wmi_bus-PNP0C14:01/9DBB5994-A997-11DA-B012-B622A1EF5492/input/input25 [ 42.269932] RAPL PMU: API unit is 2^-32 Joules, 5 fixed counters, 655360 ms ovfl timer [ 42.269936] RAPL PMU: hw unit of domain pp0-core 2^-14 Joules [ 42.269937] RAPL PMU: hw unit of domain package 2^-14 Joules [ 42.269938] RAPL PMU: hw unit of domain dram 2^-14 Joules [ 42.269939] RAPL PMU: hw unit of domain pp1-gpu 2^-14 Joules [ 42.269940] RAPL PMU: hw unit of domain psys 2^-14 Joules [ 42.276964] cfg80211: Loading compiled-in X.509 certificates for regulatory database [ 42.277206] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7' [ 42.280286] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600' [ 42.282807] cfg80211: loaded regulatory.db is malformed or signature is missing/invalid [ 42.309098] intel_rapl_common: Found RAPL domain package [ 42.309103] intel_rapl_common: Found RAPL domain core [ 42.309104] intel_rapl_common: Found RAPL domain uncore [ 42.309105] intel_rapl_common: Found RAPL domain dram [ 42.309107] intel_rapl_common: Found RAPL domain psys [ 42.309139] Bluetooth: Core ver 2.22 [ 42.309159] NET: Registered PF_BLUETOOTH protocol family [ 42.309161] Bluetooth: HCI device and connection manager initialized [ 42.309164] Bluetooth: HCI socket layer initialized [ 42.309167] Bluetooth: L2CAP socket layer initialized [ 42.309171] Bluetooth: SCO socket layer initialized [ 42.368003] usb 1-5: Found UVC 1.00 device Integrated_Webcam_HD (0c45:670c) [ 42.389587] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 42.389609] snd_hda_intel 0000:00:1f.3: enabling device (0000 -> 0002) [ 42.450835] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 42.452683] usbcore: registered new interface driver uvcvideo [ 42.463092] audit: type=1400 audit(1711173522.598:2): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe" pid=615 comm="apparmor_parser" [ 42.463106] audit: type=1400 audit(1711173522.598:3): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe//kmod" pid=615 comm="apparmor_parser" [ 42.468619] audit: type=1400 audit(1711173522.606:4): apparmor="STATUS" operation="profile_load" profile="unconfined" name="lsb_release" pid=614 comm="apparmor_parser" [ 42.481040] audit: type=1400 audit(1711173522.618:5): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/NetworkManager/nm-dhcp-client.action" pid=616 comm="apparmor_parser" [ 42.481050] audit: type=1400 audit(1711173522.618:6): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/NetworkManager/nm-dhcp-helper" pid=616 comm="apparmor_parser" [ 42.481054] audit: type=1400 audit(1711173522.618:7): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/connman/scripts/dhclient-script" pid=616 comm="apparmor_parser" [ 42.481057] audit: type=1400 audit(1711173522.618:8): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/{,usr/}sbin/dhclient" pid=616 comm="apparmor_parser" [ 42.490483] audit: type=1400 audit(1711173522.630:9): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/bin/man" pid=619 comm="apparmor_parser" [ 42.490494] audit: type=1400 audit(1711173522.630:10): apparmor="STATUS" operation="profile_load" profile="unconfined" name="man_filter" pid=619 comm="apparmor_parser" [ 42.490497] audit: type=1400 audit(1711173522.630:11): apparmor="STATUS" operation="profile_load" profile="unconfined" name="man_groff" pid=619 comm="apparmor_parser" [ 42.496341] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 42.496889] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 42.497250] usbcore: registered new interface driver btusb [ 42.509784] Bluetooth: hci0: using rampatch file: qca/rampatch_usb_00000302.bin [ 42.509790] Bluetooth: hci0: QCA: patch rome 0x302 build 0x3e8, firmware rome 0x302 build 0x111 [ 42.884213] Bluetooth: hci0: using NVM file: qca/nvm_usb_00000302.bin [ 42.911669] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. [ 42.942538] stackdepot: allocating hash table of 1048576 entries via kvcalloc [ 42.953919] Console: switching to colour dummy device 80x25 [ 42.953983] i915 0000:00:02.0: vgaarb: deactivate vga console [ 42.996760] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem [ 42.998313] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/kbl_dmc_ver1_04.bin (v1.4) [ 43.002988] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.077812] snd_soc_skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.142340] snd_soc_avs 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.275108] ath10k_pci 0000:3a:00.0: enabling device (0000 -> 0002) [ 43.278965] ath10k_pci 0000:3a:00.0: pci irq msi oper_irq_mode 2 irq_mode 0 reset_mode 0 [ 43.329105] sof-audio-pci-intel-skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.418728] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.421921] snd_soc_skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.421942] snd_soc_avs 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.421952] sof-audio-pci-intel-skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.566692] ath10k_pci 0000:3a:00.0: qca6174 hw3.2 target 0x05030000 chip_id 0x00340aff sub 1a56:1535 [ 43.566698] ath10k_pci 0000:3a:00.0: kconfig debug 0 debugfs 0 tracing 0 dfs 0 testmode 0 [ 43.567088] ath10k_pci 0000:3a:00.0: firmware ver WLAN.RM.4.4.1-00288- api 6 features wowlan,ignore-otp,mfp crc32 bf907c7c [ 43.637222] ath10k_pci 0000:3a:00.0: board_file api 2 bmi_id N/A crc32 d2863f91 [ 43.647165] i915 0000:00:02.0: [drm] [ENCODER:102:DDI B/PHY B] is disabled/in DSI mode with an ungated DDI clock, gate it [ 43.654380] i915 0000:00:02.0: [drm] [ENCODER:113:DDI C/PHY C] is disabled/in DSI mode with an ungated DDI clock, gate it [ 43.669522] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915]) [ 43.705729] [drm] Initialized i915 1.6.0 20230929 for 0000:00:02.0 on minor 0 [ 43.719405] ACPI: video: Video Device [GFX0] (multi-head: yes rom: no post: no) [ 43.723779] input: Video Bus as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input26 [ 43.723945] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.724202] snd_soc_skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.724210] snd_soc_avs 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.724218] sof-audio-pci-intel-skl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.728318] snd_hda_intel 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if info 0x040380 [ 43.742948] ath10k_pci 0000:3a:00.0: htt-ver 3.87 wmi-op 4 htt-op 3 cal otp max-sta 32 raw 0 hwcrypto 1 [ 43.765940] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915]) [ 43.797454] fbcon: i915drmfb (fb0) is primary device [ 43.817213] Console: switching to colour frame buffer device 200x56 [ 43.844821] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device [ 43.856551] ath: EEPROM regdomain: 0x6c [ 43.856554] ath: EEPROM indicates we should expect a direct regpair map [ 43.856555] ath: Country alpha2 being used: 00 [ 43.856556] ath: Regpair used: 0x6c [ 43.869616] Initializing XFRM netlink socket [ 43.870958] ath10k_pci 0000:3a:00.0 wlp58s0: renamed from wlan0 [ 43.916913] IPsec XFRM device driver [ 43.951746] PPP generic driver version 2.4.2 [ 43.958318] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC3246: line_outs=1 (0x14/0x0/0x0/0x0/0x0) type:speaker [ 43.958326] snd_hda_codec_realtek hdaudioC0D0: speaker_outs=0 (0x0/0x0/0x0/0x0/0x0) [ 43.958329] snd_hda_codec_realtek hdaudioC0D0: hp_outs=1 (0x21/0x0/0x0/0x0/0x0) [ 43.958332] snd_hda_codec_realtek hdaudioC0D0: mono: mono_out=0x0 [ 43.958334] snd_hda_codec_realtek hdaudioC0D0: inputs: [ 43.958336] snd_hda_codec_realtek hdaudioC0D0: Headset Mic=0x19 [ 43.958338] snd_hda_codec_realtek hdaudioC0D0: Headphone Mic=0x1a [ 43.958340] snd_hda_codec_realtek hdaudioC0D0: Internal Mic=0x12 [ 44.099147] input: HDA Digital PCBeep as /devices/pci0000:00/0000:00:1f.3/sound/card0/input27 [ 44.099351] input: HDA Intel PCH Headphone Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input28 [ 44.100336] input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input29 [ 44.100439] input: HDA Intel PCH HDMI/DP,pcm=7 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input30 [ 44.100529] input: HDA Intel PCH HDMI/DP,pcm=8 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input31 [ 44.376323] NET: Registered PF_PPPOX protocol family [ 44.669435] l2tp_core: L2TP core driver, V2.0 [ 44.671187] l2tp_netlink: L2TP netlink interface [ 44.674946] l2tp_ppp: PPPoL2TP kernel driver, V2.0 [ 47.396979] rfkill: input handler disabled [ 59.890659] wlp58s0: no HE support, limiting to HT/VHT [ 59.890666] wlp58s0: determined local STA to be HT, BW limited to 40 MHz [ 59.890677] wlp58s0: determined AP 88:71:b1:81:93:1a to be HT [ 59.890680] wlp58s0: connecting with HT mode, max bandwidth 40 MHz [ 59.945149] wlp58s0: authenticate with 88:71:b1:81:93:1a (local address=9c:b6:d0:d1:6a:b1) [ 59.945156] wlp58s0: send auth to 88:71:b1:81:93:1a (try 1/3) [ 60.046059] wlp58s0: send auth to 88:71:b1:81:93:1a (try 2/3) [ 60.150063] wlp58s0: send auth to 88:71:b1:81:93:1a (try 3/3) [ 60.254071] wlp58s0: authentication with 88:71:b1:81:93:1a timed out [ 65.247925] wlp58s0: no HE support, limiting to HT/VHT [ 65.247932] wlp58s0: determined local STA to be HT, BW limited to 40 MHz [ 65.247943] wlp58s0: determined AP 88:71:b1:81:93:1a to be HT [ 65.247946] wlp58s0: connecting with HT mode, max bandwidth 40 MHz [ 65.300994] wlp58s0: authenticate with 88:71:b1:81:93:1a (local address=9c:b6:d0:d1:6a:b1) [ 65.301000] wlp58s0: send auth to 88:71:b1:81:93:1a (try 1/3) [ 65.406089] wlp58s0: send auth to 88:71:b1:81:93:1a (try 2/3) [ 65.509980] wlp58s0: send auth to 88:71:b1:81:93:1a (try 3/3) [ 65.614055] wlp58s0: authentication with 88:71:b1:81:93:1a timed out [ 71.003269] wlp58s0: no HE support, limiting to HT/VHT [ 71.003274] wlp58s0: determined local STA to be HT, BW limited to 40 MHz [ 71.003283] wlp58s0: determined AP 88:71:b1:81:93:1a to be HT [ 71.003286] wlp58s0: connecting with HT mode, max bandwidth 40 MHz [ 71.056546] wlp58s0: authenticate with 88:71:b1:81:93:1a (local address=9c:b6:d0:d1:6a:b1) [ 71.056553] wlp58s0: send auth to 88:71:b1:81:93:1a (try 1/3) [ 71.158076] wlp58s0: send auth to 88:71:b1:81:93:1a (try 2/3) [ 71.262083] wlp58s0: send auth to 88:71:b1:81:93:1a (try 3/3) [ 71.365981] wlp58s0: authentication with 88:71:b1:81:93:1a timed out [ 77.265665] wlp58s0: no HE support, limiting to HT/VHT [ 77.265676] wlp58s0: determined local STA to be HT, BW limited to 40 MHz [ 77.265699] wlp58s0: determined AP 88:71:b1:81:93:1a to be HT [ 77.265707] wlp58s0: connecting with HT mode, max bandwidth 40 MHz [ 77.319241] wlp58s0: authenticate with 88:71:b1:81:93:1a (local address=9c:b6:d0:d1:6a:b1) [ 77.319255] wlp58s0: send auth to 88:71:b1:81:93:1a (try 1/3) [ 77.422069] wlp58s0: send auth to 88:71:b1:81:93:1a (try 2/3) [ 77.526067] wlp58s0: send auth to 88:71:b1:81:93:1a (try 3/3) [ 77.630078] wlp58s0: authentication with 88:71:b1:81:93:1a timed out [ 90.070558] wlp58s0: no HE support, limiting to HT/VHT [ 90.070568] wlp58s0: determined local STA to be HT, BW limited to 40 MHz [ 90.070589] wlp58s0: determined AP 88:71:b1:81:93:1a to be HT [ 90.070596] wlp58s0: connecting with HT mode, max bandwidth 40 MHz [ 90.123851] wlp58s0: authenticate with 88:71:b1:81:93:1a (local address=9c:b6:d0:d1:6a:b1) [ 90.123864] wlp58s0: send auth to 88:71:b1:81:93:1a (try 1/3) [ 90.226090] wlp58s0: send auth to 88:71:b1:81:93:1a (try 2/3) [ 90.330094] wlp58s0: send auth to 88:71:b1:81:93:1a (try 3/3) [ 90.434087] wlp58s0: authentication with 88:71:b1:81:93:1a timed out [ 97.963931] systemd-journald[481]: /var/log/journal/16ae67b9dca94ecebbc8ec78ab24e074/user-5272.journal: Journal file uses a different sequence number ID, rotating. [ 98.364947] rfkill: input handler enabled [ 101.770628] rfkill: input handler disabled [ 105.335265] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 105.335270] wlp58s0: no HE support, limiting to HT/VHT [ 105.335272] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 105.335284] wlp58s0: determined AP 88:71:b1:81:93:1b to be VHT [ 105.335287] wlp58s0: connecting with VHT mode, max bandwidth 80 MHz [ 105.374782] wlp58s0: authenticate with 88:71:b1:81:93:1b (local address=9c:b6:d0:d1:6a:b1) [ 105.374789] wlp58s0: send auth to 88:71:b1:81:93:1b (try 1/3) [ 105.477884] wlp58s0: send auth to 88:71:b1:81:93:1b (try 2/3) [ 105.581888] wlp58s0: send auth to 88:71:b1:81:93:1b (try 3/3) [ 105.685906] wlp58s0: authentication with 88:71:b1:81:93:1b timed out [ 135.493967] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 135.493972] wlp58s0: no HE support, limiting to HT/VHT [ 135.493976] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 135.493989] wlp58s0: determined AP 88:71:b1:81:93:1b to be VHT [ 135.493993] wlp58s0: connecting with VHT mode, max bandwidth 80 MHz [ 135.526622] wlp58s0: authenticate with 88:71:b1:81:93:1b (local address=9c:b6:d0:d1:6a:b1) [ 135.526629] wlp58s0: send auth to 88:71:b1:81:93:1b (try 1/3) [ 135.629899] wlp58s0: send auth to 88:71:b1:81:93:1b (try 2/3) [ 135.733900] wlp58s0: send auth to 88:71:b1:81:93:1b (try 3/3) [ 135.837879] wlp58s0: authentication with 88:71:b1:81:93:1b timed out [ 136.026843] wlp58s0: no HE support, limiting to HT/VHT [ 136.026849] wlp58s0: determined local STA to be HT, BW limited to 40 MHz [ 136.026860] wlp58s0: determined AP 88:71:b1:81:93:1a to be HT [ 136.026863] wlp58s0: connecting with HT mode, max bandwidth 40 MHz [ 136.081810] wlp58s0: authenticate with 88:71:b1:81:93:1a (local address=9c:b6:d0:d1:6a:b1) [ 136.081815] wlp58s0: send auth to 88:71:b1:81:93:1a (try 1/3) [ 136.185904] wlp58s0: send auth to 88:71:b1:81:93:1a (try 2/3) [ 136.289904] wlp58s0: send auth to 88:71:b1:81:93:1a (try 3/3) [ 136.393911] wlp58s0: authentication with 88:71:b1:81:93:1a timed out [ 141.474986] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 141.474991] wlp58s0: no HE support, limiting to HT/VHT [ 141.474994] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 141.475005] wlp58s0: determined AP 88:71:b1:81:93:1b to be VHT [ 141.475008] wlp58s0: connecting with VHT mode, max bandwidth 80 MHz [ 141.505430] wlp58s0: authenticate with 88:71:b1:81:93:1b (local address=9c:b6:d0:d1:6a:b1) [ 141.505435] wlp58s0: send auth to 88:71:b1:81:93:1b (try 1/3) [ 141.609921] wlp58s0: send auth to 88:71:b1:81:93:1b (try 2/3) [ 141.713916] wlp58s0: send auth to 88:71:b1:81:93:1b (try 3/3) [ 141.817885] wlp58s0: authentication with 88:71:b1:81:93:1b timed out [ 142.902546] wlp58s0: no HE support, limiting to HT/VHT [ 142.902551] wlp58s0: determined local STA to be HT, BW limited to 40 MHz [ 142.902559] wlp58s0: determined AP 88:71:b1:81:93:1a to be HT [ 142.902562] wlp58s0: connecting with HT mode, max bandwidth 40 MHz [ 142.958355] wlp58s0: authenticate with 88:71:b1:81:93:1a (local address=9c:b6:d0:d1:6a:b1) [ 142.958360] wlp58s0: send auth to 88:71:b1:81:93:1a (try 1/3) [ 143.061922] wlp58s0: send auth to 88:71:b1:81:93:1a (try 2/3) [ 143.165917] wlp58s0: send auth to 88:71:b1:81:93:1a (try 3/3) [ 143.269919] wlp58s0: authentication with 88:71:b1:81:93:1a timed out [ 153.855159] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 153.855164] wlp58s0: no HE support, limiting to HT/VHT [ 153.855166] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 153.855179] wlp58s0: determined AP 88:71:b1:81:93:1b to be VHT [ 153.855182] wlp58s0: connecting with VHT mode, max bandwidth 80 MHz [ 153.885776] wlp58s0: authenticate with 88:71:b1:81:93:1b (local address=9c:b6:d0:d1:6a:b1) [ 153.885781] wlp58s0: send auth to 88:71:b1:81:93:1b (try 1/3) [ 153.989909] wlp58s0: send auth to 88:71:b1:81:93:1b (try 2/3) [ 154.093908] wlp58s0: send auth to 88:71:b1:81:93:1b (try 3/3) [ 154.197908] wlp58s0: authentication with 88:71:b1:81:93:1b timed out [ 165.666279] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 165.666284] wlp58s0: no HE support, limiting to HT/VHT [ 165.666287] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 165.666300] wlp58s0: determined AP 88:71:b1:81:93:1b to be VHT [ 165.666303] wlp58s0: connecting with VHT mode, max bandwidth 80 MHz [ 165.695710] wlp58s0: authenticate with 88:71:b1:81:93:1b (local address=9c:b6:d0:d1:6a:b1) [ 165.695716] wlp58s0: send auth to 88:71:b1:81:93:1b (try 1/3) [ 165.697577] wlp58s0: authenticated [ 165.697753] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 165.697756] wlp58s0: no HE support, limiting to HT/VHT [ 165.697759] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 165.697891] wlp58s0: associate with 88:71:b1:81:93:1b (try 1/3) [ 165.718275] wlp58s0: RX AssocResp from 88:71:b1:81:93:1b (capab=0x1011 status=0 aid=1) [ 165.720864] wlp58s0: associated [ 165.794175] wlp58s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 88:71:b1:81:93:1b [ 5944.835372] wlp58s0: deauthenticating from 88:71:b1:81:93:1b by local choice (Reason: 3=DEAUTH_LEAVING) [ 5950.844234] PM: hibernation: hibernation entry [ 5950.857258] Filesystems sync: 0.010 seconds [ 5950.857640] Freezing user space processes [ 5950.862413] Freezing user space processes completed (elapsed 0.004 seconds) [ 5950.862424] OOM killer disabled. [ 5950.862719] PM: hibernation: Marking nosave pages: [mem 0x00000000-0x00000fff] [ 5950.862727] PM: hibernation: Marking nosave pages: [mem 0x00058000-0x00058fff] [ 5950.862731] PM: hibernation: Marking nosave pages: [mem 0x0009e000-0x000fffff] [ 5950.862738] PM: hibernation: Marking nosave pages: [mem 0x513f1000-0x513f1fff] [ 5950.862741] PM: hibernation: Marking nosave pages: [mem 0x51401000-0x51401fff] [ 5950.862744] PM: hibernation: Marking nosave pages: [mem 0x556ab000-0x556acfff] [ 5950.862747] PM: hibernation: Marking nosave pages: [mem 0x62260000-0x623ecfff] [ 5950.862762] PM: hibernation: Marking nosave pages: [mem 0x64df4000-0x6fffefff] [ 5950.864185] PM: hibernation: Marking nosave pages: [mem 0x70000000-0x77ffffff] [ 5950.864454] PM: hibernation: Marking nosave pages: [mem 0x78600000-0xffffffff] [ 5950.869464] PM: hibernation: Basic memory bitmaps created [ 5950.869466] PM: hibernation: Preallocating image memory [ 5958.848483] PM: hibernation: Allocated 1706818 pages for snapshot [ 5958.848488] PM: hibernation: Allocated 6827272 kbytes in 7.97 seconds (856.62 MB/s) [ 5958.848491] Freezing remaining freezable tasks [ 5958.850025] Freezing remaining freezable tasks completed (elapsed 0.001 seconds) [ 5958.869814] printk: Suspending console(s) (use no_console_suspend to debug) [ 5959.433934] ACPI: EC: interrupt blocked [ 5959.442042] Disabling non-boot CPUs ... [ 5959.445197] smpboot: CPU 1 is now offline [ 5959.450298] smpboot: CPU 2 is now offline [ 5959.453062] smpboot: CPU 3 is now offline [ 5959.455164] PM: hibernation: Creating image: [ 5959.728130] PM: hibernation: Need to copy 1694382 pages [ 5959.728133] PM: hibernation: Normal pages needed: 1694382 + 1024, available pages: 2395520 [ 5961.008800] PM: hibernation: Image created (1103483 pages copied, 590899 zero pages) [ 5959.456230] Enabling non-boot CPUs ... [ 5959.456258] smpboot: Booting Node 0 Processor 1 APIC 0x2 [ 5959.456953] CPU1 is up [ 5959.456970] smpboot: Booting Node 0 Processor 2 APIC 0x1 [ 5959.457701] CPU2 is up [ 5959.457720] smpboot: Booting Node 0 Processor 3 APIC 0x3 [ 5959.458391] CPU3 is up [ 5959.460163] ACPI: EC: interrupt unblocked [ 5959.497630] nvme nvme0: 4/0/0 default/read/poll queues [ 5959.802964] PM: Using 3 thread(s) for lzo compression [ 5959.802981] PM: Compressing and saving image data (1106793 pages)... [ 5959.803063] PM: Image saving progress: 0% [ 5959.803726] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915]) [ 5960.268391] PM: Image saving progress: 10% [ 5960.733863] PM: Image saving progress: 20% [ 5961.207809] PM: Image saving progress: 30% [ 5961.604119] PM: Image saving progress: 40% [ 5961.963254] PM: Image saving progress: 50% [ 5962.292222] PM: Image saving progress: 60% [ 5962.634869] PM: Image saving progress: 70% [ 5962.978929] PM: Image saving progress: 80% [ 5963.384730] PM: Image saving progress: 90% [ 5963.750858] PM: Image saving progress: 100% [ 5963.750962] PM: Image saving done [ 5963.750963] PM: hibernation: Wrote 4427172 kbytes in 3.94 seconds (1123.64 MB/s) [ 5963.750965] PM: Image size after compression: 620576 kbytes [ 5963.751020] PM: S| [ 5963.970131] printk: Suspending console(s) (use no_console_suspend to debug) [ 5964.525026] ACPI: EC: interrupt blocked [ 5964.561017] ACPI: PM: Preparing to enter system sleep state S3 [ 5964.571379] ACPI: EC: event blocked [ 5964.571383] ACPI: EC: EC stopped [ 5964.571384] ACPI: PM: Saving platform NVS memory [ 5964.573987] Disabling non-boot CPUs ... [ 5964.575764] smpboot: CPU 1 is now offline [ 5964.578499] smpboot: CPU 2 is now offline [ 5964.581437] smpboot: CPU 3 is now offline [ 5964.586491] ACPI: PM: Low-level resume complete [ 5964.586535] ACPI: EC: EC started [ 5964.586536] ACPI: PM: Restoring platform NVS memory [ 5964.588467] Enabling non-boot CPUs ... [ 5964.588499] smpboot: Booting Node 0 Processor 1 APIC 0x2 [ 5964.589266] CPU1 is up [ 5964.589284] smpboot: Booting Node 0 Processor 2 APIC 0x1 [ 5964.590059] CPU2 is up [ 5964.590079] smpboot: Booting Node 0 Processor 3 APIC 0x3 [ 5964.590789] CPU3 is up [ 5964.593764] ACPI: PM: Waking up from system sleep state S3 [ 5964.632697] ACPI: EC: interrupt unblocked [ 5964.677424] ACPI: EC: event unblocked [ 5964.690051] nvme nvme0: 4/0/0 default/read/poll queues [ 5964.703397] i915 0000:00:02.0: [drm] [ENCODER:94:DDI A/PHY A] is disabled/in DSI mode with an ungated DDI clock, gate it [ 5964.710019] i915 0000:00:02.0: [drm] [ENCODER:102:DDI B/PHY B] is disabled/in DSI mode with an ungated DDI clock, gate it [ 5964.724664] i915 0000:00:02.0: [drm] [ENCODER:113:DDI C/PHY C] is disabled/in DSI mode with an ungated DDI clock, gate it [ 5964.935375] atkbd serio0: Failed to deactivate keyboard on isa0060/serio0 [ 5964.943582] usb 1-3: reset full-speed USB device number 2 using xhci_hcd [ 5965.219543] usb 1-5: reset high-speed USB device number 4 using xhci_hcd [ 5965.495639] usb 1-4: reset full-speed USB device number 3 using xhci_hcd [ 5965.682087] PM: hibernation: Basic memory bitmaps freed [ 5965.682178] OOM killer enabled. [ 5965.682179] Restarting tasks ... done. [ 5965.935181] PM: hibernation: hibernation exit [ 5965.935657] Bluetooth: hci0: using rampatch file: qca/rampatch_usb_00000302.bin [ 5965.935661] Bluetooth: hci0: QCA: patch rome 0x302 build 0x3e8, firmware rome 0x302 build 0x111 [ 5966.160147] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915]) [ 5966.296230] Bluetooth: hci0: using NVM file: qca/nvm_usb_00000302.bin [ 5966.325025] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. [ 5966.609067] Process accounting resumed [ 5966.609350] warning: `atop' uses wireless extensions which will stop working for Wi-Fi 7 hardware; use nl80211 [ 5971.833642] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 5971.833649] wlp58s0: no HE support, limiting to HT/VHT [ 5971.833653] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 5971.833667] wlp58s0: determined AP 88:71:b1:81:93:1b to be VHT [ 5971.833670] wlp58s0: connecting with VHT mode, max bandwidth 80 MHz [ 5971.869002] wlp58s0: authenticate with 88:71:b1:81:93:1b (local address=9c:b6:d0:d1:6a:b1) [ 5971.869009] wlp58s0: send auth to 88:71:b1:81:93:1b (try 1/3) [ 5971.871083] wlp58s0: authenticated [ 5971.871338] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 5971.871342] wlp58s0: no HE support, limiting to HT/VHT [ 5971.871345] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 5971.875304] wlp58s0: associate with 88:71:b1:81:93:1b (try 1/3) [ 5971.895801] wlp58s0: RX AssocResp from 88:71:b1:81:93:1b (capab=0x1011 status=0 aid=1) [ 5971.898966] wlp58s0: associated [ 5971.910870] wlp58s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 88:71:b1:81:93:1b [ 8571.537694] ucsi_acpi USBC000:00: ucsi_handle_connector_change: ACK failed (-110) [ 8576.657514] ucsi_acpi USBC000:00: GET_CABLE_PROPERTY failed (-110) [ 8576.810905] ucsi_acpi USBC000:00: UCSI_GET_PD_MESSAGE failed (-95) [ 8582.033276] ucsi_acpi USBC000:00: GET_CONNECTOR_STATUS failed (-110) [ 8582.495520] ucsi_acpi USBC000:00: UCSI_GET_PD_MESSAGE failed (-95) [ 8588.176564] ucsi_acpi USBC000:00: GET_CONNECTOR_STATUS failed (-110) [ 8835.495979] wlp58s0: deauthenticating from 88:71:b1:81:93:1b by local choice (Reason: 3=DEAUTH_LEAVING) [ 8839.953992] PM: suspend entry (deep) [ 8839.965618] Filesystems sync: 0.011 seconds [ 8839.973167] Freezing user space processes [ 8839.976658] Freezing user space processes completed (elapsed 0.003 seconds) [ 8839.976672] OOM killer disabled. [ 8839.976676] Freezing remaining freezable tasks [ 8839.978391] Freezing remaining freezable tasks completed (elapsed 0.001 seconds) [ 8839.978506] printk: Suspending console(s) (use no_console_suspend to debug) [ 8840.568863] ACPI: EC: interrupt blocked [ 8840.604409] ACPI: PM: Preparing to enter system sleep state S3 [ 8840.626378] ACPI: EC: event blocked [ 8840.626379] ACPI: EC: EC stopped [ 8840.626380] ACPI: PM: Saving platform NVS memory [ 8840.627902] Disabling non-boot CPUs ... [ 8840.629232] smpboot: CPU 1 is now offline [ 8840.631873] smpboot: CPU 2 is now offline [ 8840.633446] smpboot: CPU 3 is now offline [ 8840.640816] ACPI: PM: Low-level resume complete [ 8840.640861] ACPI: EC: EC started [ 8840.640861] ACPI: PM: Restoring platform NVS memory [ 8840.642748] Enabling non-boot CPUs ... [ 8840.642781] smpboot: Booting Node 0 Processor 1 APIC 0x2 [ 8840.643525] CPU1 is up [ 8840.643544] smpboot: Booting Node 0 Processor 2 APIC 0x1 [ 8840.644297] CPU2 is up [ 8840.644315] smpboot: Booting Node 0 Processor 3 APIC 0x3 [ 8840.645008] CPU3 is up [ 8840.647948] ACPI: PM: Waking up from system sleep state S3 [ 8840.699304] ACPI: EC: interrupt unblocked [ 8840.718438] ACPI: EC: event unblocked [ 8840.731576] nvme nvme0: 4/0/0 default/read/poll queues [ 8840.735252] i915 0000:00:02.0: [drm] [ENCODER:94:DDI A/PHY A] is disabled/in DSI mode with an ungated DDI clock, gate it [ 8840.744590] i915 0000:00:02.0: [drm] [ENCODER:102:DDI B/PHY B] is disabled/in DSI mode with an ungated DDI clock, gate it [ 8840.767103] i915 0000:00:02.0: [drm] [ENCODER:113:DDI C/PHY C] is disabled/in DSI mode with an ungated DDI clock, gate it [ 8840.976606] atkbd serio0: Failed to deactivate keyboard on isa0060/serio0 [ 8841.028820] usb 1-5: reset high-speed USB device number 4 using xhci_hcd [ 8841.308795] usb 1-4: reset full-speed USB device number 3 using xhci_hcd [ 8841.588790] usb 1-3: reset full-speed USB device number 2 using xhci_hcd [ 8841.742813] OOM killer enabled. [ 8841.742816] Restarting tasks ... done. [ 8841.753171] random: crng reseeded on system resumption [ 8841.863622] PM: suspend exit [ 8841.937529] Process accounting resumed [ 8841.948290] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. [ 8842.245719] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915]) [ 8847.043697] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 8847.043704] wlp58s0: no HE support, limiting to HT/VHT [ 8847.043708] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 8847.043733] wlp58s0: determined AP 88:71:b1:81:93:1b to be VHT [ 8847.043741] wlp58s0: connecting with VHT mode, max bandwidth 80 MHz [ 8847.076931] wlp58s0: authenticate with 88:71:b1:81:93:1b (local address=9c:b6:d0:d1:6a:b1) [ 8847.076947] wlp58s0: send auth to 88:71:b1:81:93:1b (try 1/3) [ 8847.080080] wlp58s0: authenticated [ 8847.080680] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 8847.080689] wlp58s0: no HE support, limiting to HT/VHT [ 8847.080692] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 8847.084419] wlp58s0: associate with 88:71:b1:81:93:1b (try 1/3) [ 8847.107729] wlp58s0: RX AssocResp from 88:71:b1:81:93:1b (capab=0x1011 status=0 aid=1) [ 8847.110716] wlp58s0: associated [ 8847.171767] wlp58s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 88:71:b1:81:93:1b [ 8847.768614] ucsi_acpi USBC000:00: ucsi_handle_connector_change: ACK failed (-110) [ 9263.633136] wlp58s0: deauthenticating from 88:71:b1:81:93:1b by local choice (Reason: 3=DEAUTH_LEAVING) [ 9266.842134] PM: suspend entry (deep) [ 9266.856869] Filesystems sync: 0.014 seconds [ 9266.873376] Freezing user space processes [ 9266.880672] Freezing user space processes completed (elapsed 0.007 seconds) [ 9266.880688] OOM killer disabled. [ 9266.880692] Freezing remaining freezable tasks [ 9266.882529] Freezing remaining freezable tasks completed (elapsed 0.001 seconds) [ 9266.882656] printk: Suspending console(s) (use no_console_suspend to debug) [ 9267.476915] ACPI: EC: interrupt blocked [ 9267.512372] ACPI: PM: Preparing to enter system sleep state S3 [ 9267.525003] ACPI: EC: event blocked [ 9267.525008] ACPI: EC: EC stopped [ 9267.525010] ACPI: PM: Saving platform NVS memory [ 9267.528328] Disabling non-boot CPUs ... [ 9267.530335] smpboot: CPU 1 is now offline [ 9267.533569] smpboot: CPU 2 is now offline [ 9267.538408] smpboot: CPU 3 is now offline [ 9267.546488] ACPI: PM: Low-level resume complete [ 9267.546531] ACPI: EC: EC started [ 9267.546532] ACPI: PM: Restoring platform NVS memory [ 9267.548430] Enabling non-boot CPUs ... [ 9267.548456] smpboot: Booting Node 0 Processor 1 APIC 0x2 [ 9267.549185] CPU1 is up [ 9267.549204] smpboot: Booting Node 0 Processor 2 APIC 0x1 [ 9267.549951] CPU2 is up [ 9267.549969] smpboot: Booting Node 0 Processor 3 APIC 0x3 [ 9267.550647] CPU3 is up [ 9267.553610] ACPI: PM: Waking up from system sleep state S3 [ 9267.592556] ACPI: EC: interrupt unblocked [ 9267.614609] ACPI: EC: event unblocked [ 9267.627256] nvme nvme0: 4/0/0 default/read/poll queues [ 9267.635115] i915 0000:00:02.0: [drm] [ENCODER:94:DDI A/PHY A] is disabled/in DSI mode with an ungated DDI clock, gate it [ 9267.644548] i915 0000:00:02.0: [drm] [ENCODER:102:DDI B/PHY B] is disabled/in DSI mode with an ungated DDI clock, gate it [ 9267.658040] i915 0000:00:02.0: [drm] [ENCODER:113:DDI C/PHY C] is disabled/in DSI mode with an ungated DDI clock, gate it [ 9267.860571] atkbd serio0: Failed to deactivate keyboard on isa0060/serio0 [ 9267.932710] usb 1-5: reset high-speed USB device number 4 using xhci_hcd [ 9268.213115] usb 1-4: reset full-speed USB device number 3 using xhci_hcd [ 9268.492685] usb 1-3: reset full-speed USB device number 2 using xhci_hcd [ 9268.647351] OOM killer enabled. [ 9268.647353] Restarting tasks ... done. [ 9268.653410] random: crng reseeded on system resumption [ 9268.744771] PM: suspend exit [ 9268.845208] Process accounting resumed [ 9268.851205] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. [ 9269.080955] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915]) [ 9273.998457] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 9273.998462] wlp58s0: no HE support, limiting to HT/VHT [ 9273.998466] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 9273.998478] wlp58s0: determined AP 88:71:b1:81:93:1b to be VHT [ 9273.998482] wlp58s0: connecting with VHT mode, max bandwidth 80 MHz [ 9274.034595] wlp58s0: authenticate with 88:71:b1:81:93:1b (local address=9c:b6:d0:d1:6a:b1) [ 9274.034621] wlp58s0: send auth to 88:71:b1:81:93:1b (try 1/3) [ 9274.037746] wlp58s0: authenticated [ 9274.038493] wlp58s0: no VHT 160 MHz capability on 5 GHz, limiting to 80 MHz [ 9274.038504] wlp58s0: no HE support, limiting to HT/VHT [ 9274.038512] wlp58s0: determined local STA to be VHT, BW limited to 80 MHz [ 9274.040850] wlp58s0: associate with 88:71:b1:81:93:1b (try 1/3) [ 9274.072590] wlp58s0: RX AssocResp from 88:71:b1:81:93:1b (capab=0x1011 status=0 aid=1) [ 9274.077283] wlp58s0: associated [ 9274.120593] wlp58s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 88:71:b1:81:93:1b
Dhinakar,
OK - here's a summary of your object counts and storage issues:
/var/lib/jenkins - 32G
.../userContent - 1.8G
.../jobs - 11G
.../workspace - 19G
/fuego-rw - 13G
../buildzone - ~6G
../buildzone/X86-SSH-Test.default.Functional.kernel_build-x86-64 - 1.8G
../buildzone/Functional.LTP-x86_64 - 2.4G
6 nodes, 135 jobs, 78 runs
docker image: 2.41G?
(or is it 173 GB?)
This is confusing. Your latest fuego docker container is 2.41G, but you have
/var/lib/jenkins that is about 32G (and that should all be in your container image).
It looks like the builds for the kernel and for LTP are taking the most space.
I have no idea why your /var/lib/jenkins/jobs directory would be so big (11G)
Maybe do:
$ du -sh /var/lib/jenkins/jobs/* | sort -sh
and see which jobs have a lot of info.
Also, I don't know what's going on with your /var/lib/jenkins/workspace (19G)
I don't even have that directory on my system.
My stats look quite different:
I have 13 nodes, 387 jobs and 1129 runs in my most active Fuego container,
my /var/lib/Jenkins is only 204M.
My /fuego-rw/buildzone is 64G, due to lots of instances of LTP
(and something very funky about one Interbench build):
1.2G ren1.latest-smoke.Functional.LTP-poky-aarch64
1.7G Functional.kselftest-x86_64
1.7G rpi3-2.default.Functional.kernel_build-aarch64
1.9G Functional.LTP_one_at_a_time-debian-armhf
2.0G Functional.raspi_kinstall-debian-armhf
2.3G bbb.latest-smoke.Functional.LTP-debian-armhf
2.4G Functional.LTP-x86_64
2.4G Functional.LTP_one_at_a_time-x86_64
2.5G Functional.LTP-poky-aarch64
2.5G Functional.LTP_one_at_a_time-aarch64
2.5G Functional.LTP_one_at_a_time-poky-aarch64
3.0G min1.latest-smoke.Functional.LTP-x86_64
3.0G min1.latest.Functional.LTP-x86_64
3.2G rpi3-2.latest-smoke.Functional.LTP-aarch64
32G Benchmark.Interbench-x86_64
There might be stuff in /var/lib/jenkins/workspace you could get rid of.
I have a lot more runs on my system, but very many of those have very short run.json
files, as they are for tests with small results. I believe the largest run.json and consolelog.txt
files are for LTP. If you have a lot of those, maybe you can archive old ones to reduce disk
usage and improve performance.
In any event, is there any particular operation which is taking a long time to complete,
due to the docker size (or fuego directory) being too big or taking too much space?
Finally, I'm still working on the new docker container (with more recent versions of Debian
and Jenkins). I've already fixed a few bugs that I found, but there are a lot of old Fuego
packages that don't compile with newer toolchains. There are workarounds for this, but
it will take a while to implement.
My plan is to publish my working branch for this work on bitbucket, as a 'next' branch,
even though not all problems are resolved.
You could then build a container using that (if you want to), and check if the new version
of Jenkins has the features you need for user authentication, security, and job distribution.
I can give you some install steps for using a 'next' branch, if you are interested in trying that.
Sorry this has taken so long.
-- Tim
> -----Original Message-----
> From: dhinakar.k <dhinakar.k@samsung.com>
> Hi Tim,
>
> Thanks for your prompt response.
> Please find the details you requested below.
>
> # du -sh /fuego-rw/logs/* | sort -h
> 4.0K /fuego-rw/logs/README
> 8.0K /fuego-rw/logs/logruns
> 56K /fuego-rw/logs/Benchmark.gtkperf
> 60K /fuego-rw/logs/Functional.glib
> 96K /fuego-rw/logs/Benchmark.GLMark
> 228K /fuego-rw/logs/theme
> 284K /fuego-rw/logs/Benchmark.dbench4
> 284K /fuego-rw/logs/Benchmark.himeno
> 284K /fuego-rw/logs/Benchmark.iperf
> 284K /fuego-rw/logs/Benchmark.x11perf
> 288K /fuego-rw/logs/Benchmark.linpack
> 288K /fuego-rw/logs/Functional.aiostress
> 288K /fuego-rw/logs/Functional.bc
> 288K /fuego-rw/logs/Functional.crashme
> 288K /fuego-rw/logs/Functional.fontconfig
> 288K /fuego-rw/logs/Functional.hello_world
> 288K /fuego-rw/logs/Functional.stress
> 288K /fuego-rw/logs/Functional.synctest
> 288K /fuego-rw/logs/Functional.zlib
> 292K /fuego-rw/logs/Benchmark.Stream
> 292K /fuego-rw/logs/Benchmark.netperf
> 292K /fuego-rw/logs/Benchmark.tiobench
> 296K /fuego-rw/logs/Functional.ipv6connect
> 304K /fuego-rw/logs/Benchmark.nbench_byte
> 304K /fuego-rw/logs/Benchmark.netpipe
> 312K /fuego-rw/logs/Benchmark.fio
> 312K /fuego-rw/logs/Functional.scrashme
> 316K /fuego-rw/logs/Benchmark.Java
> 344K /fuego-rw/logs/Functional.bzip2
> 352K /fuego-rw/logs/Benchmark.IOzone
> 352K /fuego-rw/logs/Functional.jpeg
> 356K /fuego-rw/logs/Benchmark.OpenSSL
> 372K /fuego-rw/logs/Functional.netperf
> 396K /fuego-rw/logs/Functional.expat
> 400K /fuego-rw/logs/Benchmark.lmbench2
> 404K /fuego-rw/logs/Functional.kernel_build
> 424K /fuego-rw/logs/Functional.rmaptest
> 524K /fuego-rw/logs/image
> 536K /fuego-rw/logs/Benchmark.Interbench
> 552K /fuego-rw/logs/Benchmark.ebizzy
> 552K /fuego-rw/logs/Benchmark.signaltest
> 556K /fuego-rw/logs/Functional.pi_tests
> 588K /fuego-rw/logs/Benchmark.Whetstone
> 740K /fuego-rw/logs/Functional.ft2demos
> 808K /fuego-rw/logs/Benchmark.Dhrystone
> 1.1M /fuego-rw/logs/Benchmark.cyclictest
> 1.1M /fuego-rw/logs/Benchmark.ffsb
> 1.2M /fuego-rw/logs/Benchmark.bonnie
> 1.6M /fuego-rw/logs/Benchmark.hackbench
> 2.1M /fuego-rw/logs/Functional.OpenSSL
> 7.5M /fuego-rw/logs/Extract
> 11M /fuego-rw/logs/Functional.linus_stress
> 12M /fuego-rw/logs/Functional.LTP
>
> # ftc list-nodes | wc -l
> 6
>
> Jenkins nodes in this system:
> ARM64-SSH-Test
> ARM64-Serial-Test
> SAPIENT-MAIN-Server-Node
> X86-SSH-Test
> X86-Serial-Test
>
> # ftc list-jobs | wc -l
> 135
>
> # ftc list-runs | wc -l
> 78
>
> Regards,
> Dhinakar K.
>
> -----Original Message-----
> From: Bird, Tim [mailto:Tim.Bird@sony.com]
> Sent: Saturday, March 16, 2024 12:12 AM
> To: dhinakar.k <dhinakar.k@samsung.com>; fuego+owner@lists.linux.dev; fuego@lists.linuxfoundation.org
> Subject: RE: RE[3]: Distribute continuous integration (build) to servers outside docker container
>
> Dhinkar,
>
> Can you send me the info for these as well:
>
> # du -sh /fuego-rw/logs/* | sort -h
>
>
> # ftc list-nodes | wc -l
>
>
> # ftc list-jobs | wc -l
>
>
> # ftc list-runs | wc -l
>
>
> -- Tim
>
> > -----Original Message-----
> > From: dhinakar.k <dhinakar.k@samsung.com>
> > Sent: Friday, March 15, 2024 9:38 AM
> > To: Bird, Tim <Tim.Bird@sony.com>; fuego+owner@lists.linux.dev;
> > fuego@lists.linuxfoundation.org
> > Subject: RE[3]: Distribute continuous integration (build) to servers
> > outside docker container
> >
> > Hi Tim, Thanks a lot for your response. Please find below the details
> > that you requested. # du -sh /var/lib/Jenkins 32G /var/lib/Jenkins #
> > du -sh
> > /var/lib/jenkins/* | sort -h 0 /var/lib/jenkins/secret. key.
> > not-so-secret 4. 0K /var/lib/jenkins/com. cloudbees. hudson. plugins.
> > folder. config. AbstractFolderConfiguration. xml
> > ZjQcmQRYFpfptBannerStart Caution : This email originated from outside of Sony.
> > Do not click links or open any attachments unless you recognize the sender and know the content is safe. Please report phishing if unsure.
> >
> > ZjQcmQRYFpfptBannerEnd
> > Hi Tim,
> >
> > Thanks a lot for your response.
> > Please find below the details that you requested.
> >
> > # du -sh /var/lib/Jenkins
> > 32G /var/lib/Jenkins
> >
> > # du -sh /var/lib/jenkins/* | sort -h
> > 0 /var/lib/jenkins/secret.key.not-so-secret
> > 4.0K /var/lib/jenkins/com.cloudbees.hudson.plugins.folder.config.AbstractFolderConfiguration.xml
> > 4.0K /var/lib/jenkins/com.mtvi.plateng.hudson.ldap.LdapMailAddressResolver.xml
> > 4.0K /var/lib/jenkins/com.orctom.jenkins.plugin.buildtimestamp.BuildTimestampWrapper.xml
> > 4.0K /var/lib/jenkins/credentials.xml
> > 4.0K /var/lib/jenkins/hudson.maven.MavenModuleSet.xml
> > 4.0K /var/lib/jenkins/hudson.model.UpdateCenter.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.emailext.ExtendedEmailPublisher.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.git.GitSCM.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.git.GitTool.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.sidebar_link.SidebarLinkPlugin.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.sonar.SonarGlobalConfiguration.xml
> > 4.0K /var/lib/jenkins/hudson.plugins.timestamper.TimestamperConfig.xml
> > 4.0K /var/lib/jenkins/hudson.tasks.Mailer.xml
> > 4.0K /var/lib/jenkins/hudson.tasks.Shell.xml
> > 4.0K /var/lib/jenkins/hudson.triggers.SCMTrigger.xml
> > 4.0K /var/lib/jenkins/identity.key.enc
> > 4.0K /var/lib/jenkins/io.jenkins.plugins.junit.storage.JunitTestResultStorageConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.fingerprints.GlobalFingerprintConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion
> > 4.0K /var/lib/jenkins/jenkins.install.UpgradeWizard.state
> > 4.0K /var/lib/jenkins/jenkins.model.ArtifactManagerConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.model.GlobalBuildDiscarderConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.model.JenkinsLocationConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.plugins.msginject.MsgInjectConfig.xml
> > 4.0K /var/lib/jenkins/jenkins.security.ResourceDomainConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.security.apitoken.ApiTokenPropertyConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml
> > 4.0K /var/lib/jenkins/jenkins.telemetry.Correlator.xml
> > 4.0K /var/lib/jenkins/net.plavcak.jenkins.plugins.scmskip.SCMSkipBuildWrapper.xml
> > 4.0K /var/lib/jenkins/net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.xml
> > 4.0K /var/lib/jenkins/nodeMonitors.xml
> > 4.0K /var/lib/jenkins/org.codefirst.SimpleThemeDecorator.xml
> > 4.0K /var/lib/jenkins/org.jenkinsCi.plugins.projectDescriptionSetter.DescriptionSetterWrapper.xml
> > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.ansible_tower.AnsibleTower.xml
> > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.corsfilter.AccessControlsFilter.xml
> > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.lucene.search.config.SearchBackendConfiguration.xml
> > 4.0K /var/lib/jenkins/org.jenkinsci.plugins.workflow.flow.GlobalDefaultFlowDurabilityLevel.xml
> > 4.0K /var/lib/jenkins/org.quality.gates.jenkins.plugin.GlobalConfig.xml
> > 4.0K /var/lib/jenkins/queue.xml
> > 4.0K /var/lib/jenkins/queue.xml.bak
> > 4.0K /var/lib/jenkins/scriptApproval.xml
> > 4.0K /var/lib/jenkins/secret.key
> > 4.0K /var/lib/jenkins/sidebar-link.xml
> > 12K /var/lib/jenkins/gerrit-trigger.xml
> > 16K /var/lib/jenkins/hudson.plugins.ansicolor.AnsiColorBuildWrapper.xml
> > 20K /var/lib/jenkins/config.xml
> > 44K /var/lib/jenkins/nodes
> > 72K /var/lib/jenkins/secrets
> > 356K /var/lib/jenkins/users
> > 1.7M /var/lib/jenkins/logs
> > 1.8M /var/lib/jenkins/luceneIndex
> > 3.6M /var/lib/jenkins/updates
> > 3.9M /var/lib/jenkins/plugins_backup
> > 316M /var/lib/jenkins/plugins
> > 316M /var/lib/jenkins/plugins_not_working
> > 372M /var/lib/jenkins/plugins_old_2ndFeb2024
> > 376M /var/lib/jenkins/plugins_working_2ndFeb2024
> > 1.8G /var/lib/jenkins/userContent
> > 11G /var/lib/jenkins/jobs
> > 19G /var/lib/jenkins/workspace
> >
> > # du -sh /fuego-rw
> > 13G /fuego-rw
> >
> > # du -sh /fuego-rw/buildzone/* | sort -h # du -sh /fuego-rw/logs/* | sort -h # ftc list-nodes | wc -l # ftc list-jobs | wc -l # ftc list-runs | wc -l
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Dhrystone-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.GLMark-aarch64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.GLMark-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.IOzone-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Interbench-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Java-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.OpenSSL-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Stream-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.Whetstone-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.bonnie-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.cyclictest-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.dbench4-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.ebizzy-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.ffsb-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.fio-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.gtkperf-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.hackbench-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.himeno-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.iperf-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.linpack-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.lmbench2-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.nbench_byte-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.netperf-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.netpipe-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.signaltest-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.tiobench-x86_64
> > 0 /fuego-rw/buildzone/ARM64-SSH-Test.default.Benchmark.x11perf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Dhrystone-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.GLMark-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.IOzone-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Interbench-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Java-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.OpenSSL-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Stream-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.Whetstone-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.bonnie-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.cyclictest-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.dbench4-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.ebizzy-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.ffsb-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.fio-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.gtkperf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.hackbench-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.himeno-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.iperf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.linpack-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.lmbench2-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.nbench_byte-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.netperf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.netpipe-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.signaltest-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.tiobench-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Benchmark.x11perf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.LTP-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.OpenSSL-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.aiostress-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.bc-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.bzip2-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.crashme-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.expat-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.fontconfig-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.ft2demos-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.glib-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.hello_world-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.ipv6connect-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.jpeg-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.linus_stress-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.netperf-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.pi_tests-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.rmaptest-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.scrashme-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.stress-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.synctest-x86_64
> > 0 /fuego-rw/buildzone/X86-SSH-Test.default.Functional.zlib-x86_64
> > 4.0K /fuego-rw/buildzone/README
> > 12K /fuego-rw/buildzone/Functional.bc-x86_64
> > 32K /fuego-rw/buildzone/Functional.hello_world-x86_64
> > 32K /fuego-rw/buildzone/Functional.linus_stress-x86_64
> > 32K /fuego-rw/buildzone/Functional.synctest-x86_64
> > 36K /fuego-rw/buildzone/Functional.rmaptest-x86_64
> > 48K /fuego-rw/buildzone/Benchmark.himeno-x86_64
> > 48K /fuego-rw/buildzone/Benchmark.linpack-x86_64
> > 48K /fuego-rw/buildzone/Functional.ipv6connect-x86_64
> > 60K /fuego-rw/buildzone/Benchmark.Stream-x86_64
> > 76K /fuego-rw/buildzone/Benchmark.Whetstone-x86_64
> > 76K /fuego-rw/buildzone/Benchmark.ebizzy-x86_64
> > 84K /fuego-rw/buildzone/Functional.aiostress-x86_64
> > 168K /fuego-rw/buildzone/Benchmark.Dhrystone-x86_64
> > 240K /fuego-rw/buildzone/Benchmark.tiobench-x86_64
> > 244K /fuego-rw/buildzone/Functional.crashme-x86_64
> > 488K /fuego-rw/buildzone/Benchmark.Interbench-x86_64
> > 576K /fuego-rw/buildzone/Functional.scrashme-x86_64
> > 760K /fuego-rw/buildzone/Benchmark.hackbench-x86_64
> > 816K /fuego-rw/buildzone/Benchmark.signaltest-x86_64
> > 868K /fuego-rw/buildzone/Functional.pi_tests-x86_64
> > 900K /fuego-rw/buildzone/Benchmark.netpipe-x86_64
> > 904K /fuego-rw/buildzone/Benchmark.cyclictest-x86_64
> > 1004K /fuego-rw/buildzone/Functional.stress-x86_64
> > 1.3M /fuego-rw/buildzone/Benchmark.ffsb-x86_64
> > 1.6M /fuego-rw/buildzone/Benchmark.GLMark-aarch64
> > 1.6M /fuego-rw/buildzone/Benchmark.GLMark-x86_64
> > 1.7M /fuego-rw/buildzone/Benchmark.nbench_byte-x86_64
> > 2.1M /fuego-rw/buildzone/Benchmark.iperf-x86_64
> > 2.3M /fuego-rw/buildzone/Benchmark.gtkperf-x86_64
> > 2.4M /fuego-rw/buildzone/Benchmark.bonnie-x86_64
> > 2.5M /fuego-rw/buildzone/Benchmark.x11perf-x86_64
> > 2.9M /fuego-rw/buildzone/Functional.bzip2-x86_64
> > 3.0M /fuego-rw/buildzone/Functional.zlib-x86_64
> > 3.1M /fuego-rw/buildzone/Benchmark.IOzone-x86_64
> > 3.5M /fuego-rw/buildzone/Functional.jpeg-x86_64
> > 5.2M /fuego-rw/buildzone/Benchmark.lmbench2-x86_64
> > 6.1M /fuego-rw/buildzone/Benchmark.netperf-x86_64
> > 6.1M /fuego-rw/buildzone/Functional.netperf-x86_64
> > 7.0M /fuego-rw/buildzone/Functional.fontconfig-x86_64
> > 9.1M /fuego-rw/buildzone/Benchmark.fio-x86_64
> > 29M /fuego-rw/buildzone/Functional.expat-x86_64
> > 33M /fuego-rw/buildzone/Benchmark.dbench4-x86_64
> > 34M /fuego-rw/buildzone/Functional.ft2demos-x86_64
> > 49M /fuego-rw/buildzone/Functional.glib-x86_64
> > 74M /fuego-rw/buildzone/Benchmark.OpenSSL-x86_64
> > 74M /fuego-rw/buildzone/Functional.OpenSSL-x86_64
> > 160M /fuego-rw/buildzone/Benchmark.Java-x86_64
> > 1.8G /fuego-rw/buildzone/X86-SSH-Test.default.Functional.kernel_build-x86_64
> > 2.4G /fuego-rw/buildzone/Functional.LTP-x86_64
> >
> > Outside the container, can you run:
> > $ docker image ls
> > nxo-container-backup-2ndsep2021 latest b6a3d16508e8 2 years ago 173GB
> > fuego-base-image-20thaug2019-container latest b2cf22891ac6 4 years ago 2.41GB
> > fuegocontainerbackup-4thmar2019 latest 04112c383476 5 years ago 3.34GB
> > fuego-piper-image-22ndnov2021 latest 0121b1c342e6 6 years ago 10.7GB
> > fuego-xyz-image-22ndnov2021 latest 0bf6b942db70 6 years ago 5.8GB
> > fuego-dart-image-22ndnov2021 latest 1d2c6a99dc0a 6 years ago 1.66GB
> > fuego-pavv-image-22ndnov2021 latest ba71ede1e872 6 years ago 4.63GB
> > fuego-gpu-image-22ndnov2021 latest 42718d86dd09 6 years ago 3.41GB
> >
> > Regarding below request, I just want to lock the Jenkins user
> > interface/ dashboard, so that none can see all the jobs, results, logs and other details without logging in. So to start with even one user with
> login credentials will help.
> > But I don't know how Jenkins credentials relate to user accounts. I
> > haven't ever set up Jenkins to handle multiple user accounts. Indeed,
> > in my current 2.414.1 Jenkins setup I can see an option to list "People" (which I presume is registered user accounts), but I can find no way
> to create or manage new user accounts.
> >
> > Thanks a lot for all other details, they were very helpful.
> >
> > Regards,
> > Dhinakar K.
> >
> > -----Original Message-----
> > From: Bird, Tim [mailto:Tim.Bird@sony.com]
> > Sent: Wednesday, March 13, 2024 5:47 AM
> > To: dhinakar.k <dhinakar.k@samsung.com>; fuego+owner@lists.linux.dev;
> > fuego@lists.linuxfoundation.org
> > Subject: RE: HTML message rejected: Re: Distribute continuous
> > integration (build) to servers outside docker container
> >
> > Hey Dhinakar,
> >
> > Sorry to not respond sooner. There was a lot to process in your
> > email, and some of it I don't have answers for, but I'll try to give some status and feedback where I can.
> >
> > > -----Original Message-----
> > > From: dhinakar.k <dhinakar.k@samsung.com> Hi Tim,
> > >
> > > I had sent a reply to your response on 3rd Feb.2024, not sure if it had reached you.
> > > I am posting the same message below again.
> > >
> > > Thanks a lot for your prompt reply.
> > > Iam looking forward to try the updated docker container with an
> > > upgraded distribution base from Debian stretch to Debian bullseye,
> > > and from a Jenkins version of 2.249.3 to 2.414.1. Please let me
> > whenever it is available.
> >
> > OK - Will do. I haven't been able to allocate time for testing and
> > fixing it, so I didn't want to push it to the master branch. If I pushed something to a testing branch, would you be able to download from
> there and test it?
> >
> > One issue that came up is that some of the toolchains for some of my
> > old boards/distros are not supported (ie don't work) in Debian bullseye, and so I was looking for solutions for that.
> >
> > > We are migrating to another server, so Iam looking for best options
> > > to transfer all the content to the new server. Since the docker
> > > container size is huge I want to trim it down by removing unwanted old logs.
> >
> > It would be good to know where the container size is coming from. Is
> > it in the Fuego build directories, the Fuego run directories (where
> > Fuego logs and run artifacts are stored), or in the Jenkins build
> > directories (where Jenkins logs and artifacts are)? The materials under /fuego-rw should be on the host system, and not inside the container
> itself (since these are volume mounts). But I don't know how this space is accounted to the container (if any). It shouldn't be in any container
> image.
> >
> > The materials under /var/lib/jenkins are inside the container image.
> >
> > Can you run the following commands, inside your container, and send the results:
> >
> > # du -sh /var/lib/jenkins
> > # du -sh /var/lib/jenkins/* | sort -h
> > # du -sh /fuego-rw
> > # du -sh /fuego-rw/buildzone/* | sort -h # du -sh /fuego-rw/logs/* |
> > sort -h # ftc list-nodes | wc -l # ftc list-jobs | wc -l # ftc
> > list-runs | wc -l
> >
> > Outside the container, can you run:
> > $ docker image ls
> > (and remove any lines not related to fuego images)
> >
> > But I don't know how Jenkins credentials relate to user accounts. I
> > haven't ever set up Jenkins to handle multiple user accounts. Indeed,
> > in my current 2.414.1 Jenkins setup I can see an option to list "People" (which I presume is registered user accounts), but I can find no way
> to create or manage new user accounts.
> >
> > > Also, I am worried about server crash and hard disk crash due to so many read/write cycles (that happens during continuous integration).
> > > Hence looking for the best way to back up the container and also to
> > > distribute the load & read/write cycles to another server (via an
> > > ssh agent). I tried with plain Jenkins via ssh credentials plugin,
> > > it seems feasible. Hence if fuego upgrades to debian bullseye it
> > > would be really
> > helpful.
> > OK - I'll keep plugging away at this.
> >
> > >
> > > Also, would like to know, when login credentials support will be
> > > available in fuego? Because as a security measure we are supposed to
> > > have login credentials for each user. Will be available after debian
> > upgrade?
> >
> > I believe you are referring to Jenkins credentials? It appears that
> > Jenkins supports credentials in version 2.414, which is the new version of Jenkins in the new docker container (with the Debian upgrade). So
> I believe the answer is yes.
> >
> > But I don't know how Jenkins credentials relate to user accounts. I
> > haven't ever set up Jenkins to handle multiple user accounts. Indeed,
> > in my current 2.414.1 Jenkins setup I can see an option to list "People" (which I presume is registered user accounts), but I can find no way
> to create or manage new user accounts.
> >
> > > With respect to removing the logs I will figure out the best way as
> > > I see so many options but not sure if that will reduce the container
> > > size directly or need to run some container commands to trim it
> > > down. I
> > will explore that as well and email my observations in this forum.
> >
> > I have considered adding an "rm-run" sub-command to ftc, which would allow you to remove old runs.
> > However, I'd like to see if it's the run data that is causing the size problem that you are seeing.
> >
> > If you want to archive the data for an individual run, then you can
> > use 'ftc package-run' and move the resulting package to some long-term
> > storage device (before, ostensibly, removing that run from the
> > system.)
> >
> > I hope this is helpful.
> > -- Tim
> >
> >
> >
> > >
> > > Regards,
> > > Dhinakar K.
> > >
> > > -----Original Message-----
> > > From: Bird, Tim [mailto:Tim.Bird@sony.com]
> > > Sent: Saturday, February 3, 2024 3:44 AM
> > > To: dhinakar k <dhinakar.k@gmail.com>; fuego+owner@lists.linux.dev;
> > > fuego@lists.linuxfoundation.org
> > > Subject: RE: HTML message rejected: Re: Distribute continuous
> > > integration (build) to servers outside docker container
> > >
> > > Dhinakar, See my answers inline below..
> > >
> > > > -----Original Message-----
> > > > From: dhinakar k <dhinakar.k@gmail.com> Dear Fuego users,
> > > >
> > > > I have a requirement, so I thought of checking with the community
> > > > if it was feasible and if so what is the best or most efficient
> > > > way to implement it.
> > > > We have fuego setup in a server and all our continuous integration
> > > > jobs (for multiple code bases) are setup in it. But the issue is
> > > > there are too many builds happening, which puts pressure on the
> > > > hard disk (so many read/writes) and also increases the docker
> > > > container size (because of build logs).
> > > >
> > > > Hence I would like to know if we can distribute the load to
> > > > another server, for e.g. job will be created on our main server
> > > > but build will happen on the agent on another server. The idea is
> > > > to move out all cpu, memory, storage intensive activity to agents
> > > > (other
> > > > servers) on the network. The resultant logs can also be stored on
> > > > those servers (outside docker container) so that docker size won't
> > > > be growing rapidly.
> > > >
> > > > I tried creating a new node and setup an agent (connect via ssh)
> > > > but facing issues in installing the 'SSH Build Agents' plugin
> > > > because of compatibility issues (jenkins version needs to be upgraded).
> > > >
> > > > If anyone already tried and has a solution for this issue please let me know.
> > >
> > > Unfortunately, I have not tried this, so I'm not familiar with how Jenkins supports distributed jobs.
> > >
> > > But I have a few ideas to share.
> > >
> > > First, I'm working now on an update to the docker container, from a
> > > distribution base of Debian stretch to Debian bullseye, and from a
> > > Jenkins version of 2.249.3 to 2.414.1 (thanks to a patch provided by
> > > Fuego user Yoichi Tachibana). I have applied the patches, but found
> > some issues with the build instructions for some packages working in
> > Debian bullseye. So I have not committed the changes to
> > > the Fuego master branch yet. I hope to be able to do this soon.
> > >
> > > This might help with the issue of not being able to use the ssh agent plugin for Jenkins.
> > >
> > > Second, it may be possible to do some kind of proxy job submission
> > > thing, by creating proxy jobs on the main Jenkins server, but having
> > > the jobs actually executed ("built", in Jenkins terminology) on
> > > secondary
> > servers.
> > >
> > > There are a number of ways of supporting remote execution, and how
> > > you implement it will determine where the CPU cycles and memory
> > > usage is during the job, and where the logs end up living (and
> > > taking up
> > > space.)
> > >
> > > If you are using 'ttc' as your transport layer, recent versions of
> > > ttc have support for remote boards via ssh (configured in ttc.conf). But that would leave logs on the master server.
> > >
> > > There are multiple ways to configure Fuego on the secondary servers
> > > - for example using Docker containers or installing Fuego natively.
> > > In any event, it may be possible to set up proxy jobs on the main
> > > server that
> > call 'ftc' on the secondary
> > > servers, to run the jobs of interest. Depending on how this was structured
> > > you may end up with build artifacts and logs on the secondary
> > > system, and only Jenkins artifacts and logs on the main system (which should save space).
> > >
> > > It might be good to get a more detailed description of your Jenkins setup to be able to understand the options available.
> > >
> > > >
> > > > Also, what is the best way to backup the container after trimming
> > > > it down (remove unwanted files/logs etc. and reduce it's size)?
> > >
> > > I'm not sure how to backup a container in Docker. There's the 'docker container commit'
> > > command, but I haven't used that.
> > >
> > > In general, to trim down you data usage you will want to perform a few operations.
> > > Inside Jenkins, you can delete individual builds. You can likely
> > > automate this (not have to do it manually through the UI), by using
> > > the remote API. That should work for the material that is inside
> > > the container. Lots of data, however, including the build artifacts
> > > and the
> > logs are natively on the host, and are only present in the container through bind mounts.
> > >
> > > This means you can remove this data directly using file operations (e.g. rm) on the host.
> > > There are a few nuances to this, however, as some of the build directories are referenced via symlinks.
> > >
> > > 'ftc' currently supports removing jobs and nodes. I don't recall off the top of my head if this includes removing all the builds for a job or
> not.
> > > But in any case, it sounds like you only want to remove some of the builds/runs, not the jobs themselves.
> > > We could possibly support 'ftc rm-run', which could remove specific runs. 'ftc query-runs'
> > > could be used to generate a list of runs (e.g. that were created before a certain date).
> > >
> > > Please provide a few more details, and maybe we can talk through and/or develop some solutions that will help meet your needs.
> > >
> > > -- Tim
> > >
> > > >
> > > > On Thu, Feb 1, 2024 at 11:52 PM <fuego+owner@lists.linux.dev> wrote:
> > > > >
> > > > > Greetings!
> > > > >
> > > > > This is the mlmmj program managing the <fuego@lists.linux.dev>
> > > > > mailing list.
> > > > >
> > > > > Your message to <fuego@lists.linux.dev> was not delivered to the
> > > > > list because it contained a HTML part. Only text/plain messages
> > > > > are allowed on this list.
> > > > >
> > > > > Please configure your mail client to only send plain text mail.
> > > > >
> > > > > For your reference, the rejected message follows below.
> > > > >
> > > > >
> > > > >
> > > > > ---------- Forwarded message ----------
> > > > > From: dhinakar k <dhinakar.k@gmail.com>
> > > > > To: fuego+help@lists.linux.dev, fuego@lists.linuxfoundation.org,
> > > > > "Bird, Timothy" <Tim.Bird@sony.com>
> > > > > Cc:
> > > > > Bcc:
> > > > > Date: Thu, 1 Feb 2024 23:51:30 +0530
> > > > > Subject: Re: Distribute continuous integration (build) to
> > > > > servers outside docker container Dear Fuego users,
> > > > >
> > > > > I have a requirement, so I thought of checking with the
> > > > > community if it was feasible and if so what is the best or most
> > > > > efficient way to
> > > > implement it.
> > > > > We have fuego setup in a server and all our continuous
> > > > > integration jobs (for multiple code bases) are setup in it. But
> > > > > the issue is there are
> > > > too many builds happening, which puts pressure on the hard disk
> > > > (so many read/writes) and also increases the docker container size (because of build logs).
> > > > >
> > > > > Hence I would like to know if we can distribute the load to
> > > > > another server, for e.g. job will be created on our main server
> > > > > but build will
> > > > happen on the agent on another server. The idea is to move out all
> > > > cpu, memory, storage intensive activity to agents (other servers)
> > > > on the network. The resultant logs can also be stored on those
> > > > servers
> > > (outside docker container) so that docker size won't be growing rapidly.
> > > > >
> > > > > I tried creating a new node and setup an agent (connect via ssh)
> > > > > but facing issues in installing the 'SSH Build Agents' plugin
> > > > > because of
> > > > compatibility issues (jenkins version needs to be upgraded).
> > > > >
> > > > > If anyone already tried and has a solution for this issue please let me know.
> > > > >
> > > > > Also, what is the best way to backup the container after trimming it down (remove unwanted files/logs etc. and reduce it's size)?
> > > > >
> > > > > Regards,
> > > > > Dhinakar K.
> > > > > Samsung India, Bengaluru.
> > > > >
> > > > > On Thu, Feb 1, 2024 at 10:30 PM dhinakar k <dhinakar.k@gmail.com> wrote:
> > > > >>
> > > > >> Dear Fuego users,
> > > > >>
> > > > >> I have a requirement, so I thought of checking with the
> > > > >> community if it was feasible and if so what is the best or most
> > > > >> efficient way to
> > > > implement it.
> > > > >> We have fuego setup in a server and all our continuous
> > > > >> integration jobs (for multiple code bases) are setup in it. But
> > > > >> the issue is there are
> > > > too many builds happening, which puts pressure on the hard disk
> > > > (so many read/writes) and also increases the docker container size (because of build logs).
> > > > >>
> > > > >> Hence I would like to know if we can distribute the load to
> > > > >> another server, for e.g. job will be created on our main server
> > > > >> but build will
> > > > happen on the agent on another server. The idea is to move out all
> > > > cpu, memory, storage intensive activity to agents (other servers)
> > > > on the network. The resultant logs can also be stored on those
> > > > servers
> > > (outside docker container) so that docker size won't be growing rapidly.
> > > > >>
> > > > >> I tried creating a new node and setup an agent (connect via
> > > > >> ssh) but facing issues in installing the 'SSH Build Agents'
> > > > >> plugin because of
> > > > compatibility issues (jenkins version needs to be upgraded).
> > > > >>
> > > > >> If anyone already tried and has a solution for this issue please let me know.
> > > > >>
> > > > >> Also, what is the best way to backup the container after trimming it down (remove unwanted files/logs etc. and reduce it's size)?
> > > > >>
> > > > >> Regards,
> > > > >> Dhinakar K.
> > > > >> Samsung India, Bengaluru.
> > >
> > >
> > >
> >
> >
>
>
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: Stafford Horne <shorne@gmail.com> tree: https://github.com/stffrdhrn/linux.git or1k-fpu-regs head: ead6248f25e104b2c2b03071d37f2ffdeb1e62e8 commit: ead6248f25e104b2c2b03071d37f2ffdeb1e62e8 [3/3] openrisc: Move FPU state out of pt_regs :::::: branch date: 5 days ago :::::: commit date: 5 days ago config: openrisc-randconfig-r081-20240322 (https://download.01.org/0day-ci/archive/20240322/202403222317.OWCfI67M-lkp@intel.com/config) compiler: or1k-linux-gcc (GCC) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403222317.OWCfI67M-lkp@intel.com/ smatch warnings: arch/openrisc/kernel/signal.c:50 restore_fp_state() warn: maybe return -EFAULT instead of the bytes remaining? arch/openrisc/kernel/signal.c:67 save_fp_state() warn: maybe return -EFAULT instead of the bytes remaining? vim +50 arch/openrisc/kernel/signal.c 1c4de499e6134e Stafford Horne 2023-08-20 39 1c4de499e6134e Stafford Horne 2023-08-20 40 asmlinkage int do_work_pending(struct pt_regs *regs, unsigned int thread_flags, 1c4de499e6134e Stafford Horne 2023-08-20 41 int syscall); 1c4de499e6134e Stafford Horne 2023-08-20 42 ead6248f25e104 Stafford Horne 2024-03-05 43 #ifdef CONFIG_FPU ead6248f25e104 Stafford Horne 2024-03-05 44 static long restore_fp_state(struct sigcontext __user *sc) ead6248f25e104 Stafford Horne 2024-03-05 45 { ead6248f25e104 Stafford Horne 2024-03-05 46 long err; ead6248f25e104 Stafford Horne 2024-03-05 47 ead6248f25e104 Stafford Horne 2024-03-05 48 err = __copy_from_user(¤t->thread.fpcsr, &sc->fpcsr, sizeof(unsigned long)); ead6248f25e104 Stafford Horne 2024-03-05 49 if (unlikely(err)) ead6248f25e104 Stafford Horne 2024-03-05 @50 return err; ead6248f25e104 Stafford Horne 2024-03-05 51 ead6248f25e104 Stafford Horne 2024-03-05 52 /* Restore the FPU state */ ead6248f25e104 Stafford Horne 2024-03-05 53 restore_fpu(current); ead6248f25e104 Stafford Horne 2024-03-05 54 ead6248f25e104 Stafford Horne 2024-03-05 55 return 0; ead6248f25e104 Stafford Horne 2024-03-05 56 } ead6248f25e104 Stafford Horne 2024-03-05 57 ead6248f25e104 Stafford Horne 2024-03-05 58 static long save_fp_state(struct sigcontext __user *sc) ead6248f25e104 Stafford Horne 2024-03-05 59 { ead6248f25e104 Stafford Horne 2024-03-05 60 long err; ead6248f25e104 Stafford Horne 2024-03-05 61 ead6248f25e104 Stafford Horne 2024-03-05 62 /* Sync the user FPU state so we can copy to sigcontext */ ead6248f25e104 Stafford Horne 2024-03-05 63 save_fpu(current); ead6248f25e104 Stafford Horne 2024-03-05 64 ead6248f25e104 Stafford Horne 2024-03-05 65 err = __copy_to_user(&sc->fpcsr, ¤t->thread.fpcsr, sizeof(unsigned long)); ead6248f25e104 Stafford Horne 2024-03-05 66 ead6248f25e104 Stafford Horne 2024-03-05 @67 return err; ead6248f25e104 Stafford Horne 2024-03-05 68 } ead6248f25e104 Stafford Horne 2024-03-05 69 #else ead6248f25e104 Stafford Horne 2024-03-05 70 #define save_fp_state(sc) (0) ead6248f25e104 Stafford Horne 2024-03-05 71 #define restore_fp_state(sc) (0) ead6248f25e104 Stafford Horne 2024-03-05 72 #endif ead6248f25e104 Stafford Horne 2024-03-05 73 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
> -----Original Message----- > From: Nicolin Chen <nicolinc@nvidia.com> > Sent: Wednesday, March 13, 2024 11:51 PM > To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com> > Cc: Jason Gunthorpe <jgg@nvidia.com>; iommu@lists.linux.dev; Linuxarm > <linuxarm@huawei.com>; Zhangfei Gao <zhangfei.gao@linaro.org>; Michael > Shavit <mshavit@google.com>; Eric Auger <eric.auger@redhat.com>; Moritz > Fischer <mdf@kernel.org> > Subject: Re: Query on ARM SMMUv3 nested support > > On Wed, Mar 13, 2024 at 10:13:58AM +0000, Shameerali Kolothum Thodi > wrote: > > Hi Nicolin, > > > > Thanks for the latest repos with basic SMMUv3 nested support enabled[1]. > > I did some basic sanity runs on a HiSilicon platform and they seems to > work as > > expected. The only problem being we can't assign two devices to the VM if > > they are on different physical SMMUs. > > > > qemu-system-aarch64: -device > > vfio-pci,host=0000:75:00.1,iommufd=iommufd0: [iommufd=29] error > attach > > 0000:75:00.1 (36) to id=4: Invalid argument > > qemu-system-aarch64: -device > > vfio-pci,host=0000:75:00.1,iommufd=iommufd0: Unable to attach dev to > > stage-2 HW pagetable: -1 > > Segmentation fault (core dumped) > > ... > > > > I see that on the Qemu side we now allocate a single s2 hwpt and attach > that into > > all the devices . But this will only work currently if all the assigned devices > > are under the same physical SMMUv3 as we have a check in kernel > > whether domains are having the same SMMUv3. I remember Jason > mentioning > > that he is planning to relax that. So are the Qemu side changes based on > that > > assumption? And any idea how we are planning to relax that restriction? > We > > do a check for compatibility of the phys SMMUv3s and then allow/restrict > in kernel? > > Do Qemu can then try allocating a separate s2 hwpt for those and attach > again? > > Sorry if this was already discussed elsewhere and I missed that. > > You are very right about this. I haven't thought about supporting > that case yet. Likely I need to spare some time to refine the QEMU > part in the coming weeks or so (have been waiting for Zhenzhong's > full nesting patches). > > Also, NVIDIA has an interest to support CMDQ-V accelerator, where > we need more vSMMU instances, than just one. I haven't decided how > to handle this for both single-vSMMU and multi-vSMMU versions. > > Yet, some of the ongoing work might help: > https://github.com/nicolinc/iommufd/commit/b7520901184fd9fa127abb88c > 1f0be16b9967cff > https://github.com/nicolinc/iommufd/commit/d969ffeac899491d3a6e54557 > bf6a46d52b95865 > So, each device should poll hw_info to get its SMMU ID, if it is > not in the S2 list of the vSMMU's, add it and allocate a new S2. Thanks for the reference to above CMDQ-V. Looks interesting. I think we can have a go with retry logic first to allocate a new hwpt if the attach fails. For now, I have a temp fix where I allocate a new hwpt every time. I also noticed another problem with the commit below, 6691a2f("hw/arm/smmu-common: Use sysmem for get_address _space until !!s2_hwpti") This actually breaks a virtio-pci dev assignment when that is the only assigned device to the Guest without any pass-through dev in nested scenario. I have a temp fix for that as well here, https://github.com/hisilicon/qemu/commit/ff0230e9593ba1a172aa7ec9162967d6ae6875b0 (I know it is ugly!). I will revisit that again. Please let me know if you have any ideas. FWIW, I have a working branch for vSVA here, https://github.com/hisilicon/qemu/tree/iommufd_vsmmu-02292024-vsva-wip-v2 I still have that io_uring write issue mentioned in the other thread[1], but for now I use io_uring API only for read and make use of normal write() for updating kernel with page response. I have done some basic sanity runs with our ACC devices and those seems to work(of course needs more testing). Please have a look and let me know if you spot anything. Thanks, Shameer 1. https://lore.kernel.org/all/ad4575588dd247fa8beae60963f36404@huawei.com/
Hi Tina, On Fri, Mar 22, 2024 at 04:41:01AM +0000, Zhang, Tina wrote: > Hi Dimitri, > > > > -----Original Message----- > > From: Dimitri Sivanich <sivanich@hpe.com> > > Sent: Friday, March 22, 2024 4:51 AM > > To: Thomas Gleixner <tglx@linutronix.de>; Joerg Roedel <joro@8bytes.org>; > > Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>; Will Deacon > > <will@kernel.org>; Robin Murphy <robin.murphy@arm.com>; David > > Woodhouse <dwmw2@infradead.org>; Lu Baolu <baolu.lu@linux.intel.com>; > > Mark Rutland <mark.rutland@arm.com>; Peter Zijlstra > > <peterz@infradead.org>; Arnd Bergmann <arnd@arndb.de>; YueHaibing > > <yuehaibing@huawei.com>; iommu@lists.linux.dev; Dimitri Sivanich > > <sivanich@hpe.com> > > Cc: linux-kernel@vger.kernel.org; Steve Wahl <steve.wahl@hpe.com>; > > Anderson, Russ <russ.anderson@hpe.com> > > Subject: [PATCH v2] iommu/vt-d: Allocate DMAR fault interrupts locally > > > > The Intel IOMMU code currently tries to allocate all DMAR fault interrupt > > vectors on the boot cpu. On large systems with high DMAR counts this > > results in vector exhaustion, and most of the vectors are not initially allocated > > socket local. > > > > Instead, have a cpu on each node do the vector allocation for the DMARs on > > that node. The boot cpu still does the allocation for its node during its boot > > sequence. > > > > Signed-off-by: Dimitri Sivanich <sivanich@hpe.com> > > --- > > > > v2: per Thomas Gleixner, implement this from a DYN CPU hotplug state, > > though > > this implementation runs in CPUHP_AP_ONLINE_DYN space rather than > > CPUHP_BP_PREPARE_DYN space. > > > > drivers/iommu/amd/amd_iommu.h | 2 +- > > drivers/iommu/amd/init.c | 2 +- > > drivers/iommu/intel/dmar.c | 9 +++++++-- > > drivers/iommu/irq_remapping.c | 5 ++++- drivers/iommu/irq_remapping.h | > > 2 +- > > include/linux/dmar.h | 2 +- > > 6 files changed, 15 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/iommu/amd/amd_iommu.h > > b/drivers/iommu/amd/amd_iommu.h index f482aab420f7..410c360e7e24 > > 100644 > > --- a/drivers/iommu/amd/amd_iommu.h > > +++ b/drivers/iommu/amd/amd_iommu.h > > @@ -33,7 +33,7 @@ int amd_iommu_prepare(void); int > > amd_iommu_enable(void); void amd_iommu_disable(void); int > > amd_iommu_reenable(int mode); -int amd_iommu_enable_faulting(void); > > +int amd_iommu_enable_faulting(unsigned int cpu); > > extern int amd_iommu_guest_ir; > > extern enum io_pgtable_fmt amd_iommu_pgtable; extern int > > amd_iommu_gpt_level; diff --git a/drivers/iommu/amd/init.c > > b/drivers/iommu/amd/init.c index e7a44929f0da..4782f690ed97 100644 > > --- a/drivers/iommu/amd/init.c > > +++ b/drivers/iommu/amd/init.c > > @@ -3389,7 +3389,7 @@ int amd_iommu_reenable(int mode) > > return 0; > > } > > > > -int __init amd_iommu_enable_faulting(void) > > +int __init amd_iommu_enable_faulting(unsigned int cpu) > > { > > /* We enable MSI later when PCI is initialized */ > > return 0; > > diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c index > > 36d7427b1202..7644a42f283c 100644 > > --- a/drivers/iommu/intel/dmar.c > > +++ b/drivers/iommu/intel/dmar.c > > @@ -2122,7 +2122,7 @@ int dmar_set_interrupt(struct intel_iommu > > *iommu) > > return ret; > > } > > > > -int __init enable_drhd_fault_handling(void) > > +int enable_drhd_fault_handling(unsigned int cpu) > > { > > struct dmar_drhd_unit *drhd; > > struct intel_iommu *iommu; > > @@ -2132,7 +2132,12 @@ int __init enable_drhd_fault_handling(void) > > */ > > for_each_iommu(iommu, drhd) { > > u32 fault_status; > > - int ret = dmar_set_interrupt(iommu); > > + int ret; > > + > > + if (iommu->irq || iommu->node != cpu_to_node(cpu)) > > + continue; > If iommu->irq is set, current logic will clear any previous faults by accessing DMAR_FSTS_REG. However, the code change in this patch seems missing it. Yes, the current logic does clear the faults even in the iommu->irq!=0 case, but enable_drhd_fault_handling is currently only run once by the boot cpu, prior to startup of the other processors. So each iommu will, initially at least, only have its faults cleared once. With this patch, enable_drhd_fault_handling will still run on the boot cpu prior to the startup of other processors, but will also run on each AP as it is brought up (hotplugged). It will now only operate on the iommus that are on its own socket, however. If we add back the fault clearing for the iommu->irq!=0 case, each iommu on a socket would end up having faults cleared once for each cpu on the socket (so 120 times for a 60-core socket with HT enabled). In addition, this would happen again each time a cpu is hot-plugged after having been hot-unplugged. So is there a specific reason why faults would need to be cleared if the iommu->irq has already been set, since I assume they would've already been cleared during this boot? I'm definitely willing to add back the fault clearing for the iommu->irq!=0 case, but am looking for guidance from others like yourself on this. > > The current logic: > int dmar_set_interrupt(struct intel_iommu *iommu) > { > int irq, ret; > > /* > * Check if the fault interrupt is already initialized. > */ > if (iommu->irq) > return 0; > ... > > int __init enable_drhd_fault_handling(void) > { > ... > for_each_iommu(iommu, drhd) { > u32 fault_status; > int ret = dmar_set_interrupt(iommu); > > if (ret) { > pr_err("DRHD %Lx: failed to enable fault, interrupt, ret %d\n", > (unsigned long long)drhd->reg_base_addr, ret); > return -1; > } > > /* > * Clear any previous faults. > */ > dmar_fault(iommu->irq, iommu); > fault_status = readl(iommu->reg + DMAR_FSTS_REG); > writel(fault_status, iommu->reg + DMAR_FSTS_REG); > } > ... > > Regards, > > -Tina
> -----Original Message----- > From: SeongJae Park <sj@kernel.org> > Sent: Friday, March 22, 2024 4:40 AM > To: Prasad, Aravinda <aravinda.prasad@intel.com> > Cc: SeongJae Park <sj@kernel.org>; damon@lists.linux.dev; linux- > mm@kvack.org; linux-kernel@vger.kernel.org; s2322819@ed.ac.uk; Kumar, > Sandeep4 <sandeep4.kumar@intel.com>; Huang, Ying <ying.huang@intel.com>; > Hansen, Dave <dave.hansen@intel.com>; Williams, Dan J > <dan.j.williams@intel.com>; Subramoney, Sreenivas > <sreenivas.subramoney@intel.com>; Kervinen, Antti <antti.kervinen@intel.com>; > Kanevskiy, Alexander <alexander.kanevskiy@intel.com> > Subject: RE: [PATCH v2 0/3] mm/damon: Profiling enhancements for DAMON > > On Wed, 20 Mar 2024 12:31:17 +0000 "Prasad, Aravinda" > <aravinda.prasad@intel.com> wrote: > > > > > > > > -----Original Message----- > > > From: SeongJae Park <sj@kernel.org> > > > Sent: Tuesday, March 19, 2024 10:51 AM > > > To: Prasad, Aravinda <aravinda.prasad@intel.com> > > > Cc: damon@lists.linux.dev; linux-mm@kvack.org; sj@kernel.org; linux- > > > kernel@vger.kernel.org; s2322819@ed.ac.uk; Kumar, Sandeep4 > > > <sandeep4.kumar@intel.com>; Huang, Ying <ying.huang@intel.com>; > > > Hansen, Dave <dave.hansen@intel.com>; Williams, Dan J > > > <dan.j.williams@intel.com>; Subramoney, Sreenivas > > > <sreenivas.subramoney@intel.com>; Kervinen, Antti > > > <antti.kervinen@intel.com>; Kanevskiy, Alexander > > > <alexander.kanevskiy@intel.com> > > > Subject: Re: [PATCH v2 0/3] mm/damon: Profiling enhancements for > > > DAMON > > > > > > Hi Aravinda, > > > > > > > > > Thank you for posting this new revision! > > > > > > I remember I told you that I don't see a high level significant > > > problems on on the reply to the previous revision of this patch[1], but I show a > concern now. > > > Sorry for not raising this earlier, but let me explain my humble > > > concerns before being even more late. > > > > Please find my comments below: > > > > > > > > On Mon, 18 Mar 2024 18:58:45 +0530 Aravinda Prasad > > > <aravinda.prasad@intel.com> wrote: > > > > > > > DAMON randomly samples one or more pages in every region and > > > > tracks accesses to them using the ACCESSED bit in PTE (or PMD for 2MB > pages). > > > > When the region size is large (e.g., several GBs), which is common > > > > for large footprint applications, detecting whether the region is > > > > accessed or not completely depends on whether the pages that are > > > > actively accessed in the region are picked during random sampling. > > > > If such pages are not picked for sampling, DAMON fails to identify > > > > the region as accessed. However, increasing the sampling rate or > > > > increasing the number of regions increases CPU overheads of kdamond. > > > > > > DAMON uses sampling because it considers a region as accessed if a > > > portion of the region that big enough to be detected via sampling is > > > all accessed. If a region is having some pages that really accessed > > > but the proportion is too small to be found via sampling, I think > > > DAMON could say the overall access to the region is only modest and > > > could even be ignored. In my humble opinion, this fits with the > > > definition of DAMON region: A memory address range that constructed with > pages having similar access frequency. > > > > Agree that DAMON considers a region as accessed if a good portion of > > the region is accessed. But few points I would like to discuss: > > > > For large regions (say 10GB, that has 2,621,440 4K pages), sampling at > > PTE level will not cover a good portion of the region. For example, > > default 5ms sampling and 100ms aggregation samples only 20 4K pages in an > aggregation interval. > > If the 20 attempts all failed at finding any single accessed 4K page, I think it > roughly means less than 5% of the region is accessed within the user-specified > time (aggregation interval). I would translate that as only tiny portion of the > region is accessed within the user-specified time, and hence DAMON is ok to say > the region is nearly not accessed. I am looking at it from the other way: To detect if a region is hot or cold at least 1% of the pages in the region should be sampled. For a 10GB region (with 2,621,440 4K pages) this requires sampling at least 26,214 pages. For a 100GB region this will require sampling at least 262,144 pages. If we sample at 5ms, this takes 131.072 seconds to cover 1% of 10GB and 1310.72 seconds to cover 100GB. DAMON shows that the selected page as accessed if that page was accessed during the 5ms sampling window. Now if we increase the sampling to 20ms to improve access detection, then covering 1% of the region takes even longer. > > > Increasing sampling to 1 ms and aggregation to 1 second can only cover > > 1000 4K pages, but results in higher CPU overheads due to frequent sampling. > > Even increasing the aggregation interval to 60 seconds but sampling at > > 5ms can only cover 12000 samples, but region splitting and merging > > happens once in 60 seconds. > > At the beginning of each sampling interval, DAMON randomly picks one page per > region, clear their accessed bits, wait until the sampling interval is finished, and > check the accessed bits again. In other words, DAMON shows only accesses that > made in last sampling interval. Yes, I see this in the code: while(time < aggregation_interval) { clear_access_bit sleep(sampling_time) check_access_bit } I would suggest this logic instead. while(time < aggregation_interval) { Number_of_samples = aggregation_interval / sampling_time; for (i = 0, I < number_of_samples; i++) { clear_access_bit } sleep(aggregation_time) for (i = 0, I < number_of_samples; i++) { check_access_bit } } This can help in better access detection. I am sure you would have already explored it. > > Increasing number of samples per aggregation interval can help DAMON knows > the access frequency of regions in finer granularity, but doesn't allow DAMON see > more accesses. Rather than that, if the aggregation interval is fixed (reducing > sampling interval), DAMON can show even less amount of accesses. > > What we need here is giving the workload longer sampling time so that the > workload can make access to a size of memory regions that large enough to be > found by DAMON. But even with longer sampling time, we may miss the access. For example, consider all the pages in the region are accessed sequentially. Now if DAMON samples a different page other than the page that is being accessed it will miss. Now even if we have longer sampling time it is possible that none of the accesses are detected. > > > > > In addition, this worsens when region sizes are say 100GB+. We observe > > that sampling at PTE level does not help for large regions as more > > samples are are required. So, decreasing/increasing the sampling or > > aggressions intervals proportional to the region size is not practical > > as all regions are of not equal size, we can have 100GB regions as > > well as many small regions (e.g., 16KB to 1MB). > > IMO, it becomes worse because the minimum size of accessed memory regions > that can be found by DAMON via sampling has increased together, while you > didn't give more sampling time (a.k.a the time to let the workload make accesses > that DAMON can show). > > > So tuning sampling rate and aggregation interval did not help for > > large regions. > > Due to the mechanism of the DAMON's sampling I mentioned above, I think this > is what expected. We need to increase sampling interval. > > > > > It can also be observed that large regions cannot be avoided. Large > > regions are created by merging adjacent smaller regions or at the > > beginning of profiling (depending on min regions parameter which defaults to > 10). > > Increasing min region reduces the size of regions but increases > > kdamond overheads, hence, not preferable. > > > > So, sampling at PTE level cannot precisely detect accesses to large > > regions resulting in inaccuracies, even though it works for small regions. > > From our experiments, we found that with 10% hot data in a large > > region (80+GB regions in a 1TB+ footprint application), DAMON was not > > able to detect a single access to that region in 95+% cases with > > different sample and aggregation interval combinations. But DAMON > > works good for applications with footprint <50GB where regions are typically > small. > > > > Now consider the scenario with the proposed enhancement. With a 100GB > > region, if we sample a PUD entry that covers 1GB address space, then > > the default 5ms sampling and 100ms aggregation samples > > 20 PUD entries that is 20 GB portion of the region. This gives a good > > estimate of the portion of the region that is accessed. But the > > downside is that as PUD accessed bit is set even if a small set of > > pages are accessed under its subtree this can report more access as real as you > noted. > > > > But such large regions are split into two in the next aggregation interval. > > As the splitting of the regions continues, in next few aggregation > > intervals many smaller regions are formed. Once smaller regions are > > formed, the proposed enhancement cannot pick higher levels of the page > > table tree and behaves as good as default DAMON. So, with the proposed > > enhancement, larger regions are quickly split into smaller regions if > > they have only small set of pages accessed. > > I fully agree. This is what could be a real and important benefits. > > > > > To avoid misinterpreting region access count, I feel that the "age" of > > the region is of real help and should be considered by both DAMON and > > the proposed enhancement. If the age of a region is small (<10) then > > that region should not be considered stable and hence should not be > > considered for any memory tiering decisions. For regions with age, say > > >10, can be considered as stable as they reflect the actual access > > frequency. > > I think this is a good approach, but difficult to be used by default. I think we > might be able to get the benefit without making problem at the over-reporting > accesses by using the high level accessed bit check results as a hint for better > quality of region split? I agree, high level page table profiling can give hints to split the region instead of using it to detect accesses to the region. > > Also, if we can allow large enough age, the random region split will eventually find > the small hot regions even without high level accessed bit hint. Of course the hint > could help finding it earlier. I think that was one of my comment on the first > version of this patch. The problem is that a large region that is split is immediately merged as the split regions have access count zero. We observe that large regions are never getting split at all due to this. Regards, Aravinda > > > > > > > > > > > > > > This patch proposes profiling different levels of the > > > > application\u2019s page table tree to detect whether a region is > > > > accessed or not. This patch set is based on the observation that, > > > > when the accessed bit for a page is set, the accessed bits at the > > > > higher levels of the page table tree (PMD/PUD/PGD) corresponding > > > > to the path of the page table walk are also set. Hence, it is > > > > efficient to check the accessed bits at the higher levels of the > > > > page table tree to detect whether a region is accessed or not. For > > > > example, if the access bit for a PUD entry is set, then one or > > > > more pages in the 1GB PUD subtree is accessed as each PUD entry > > > > covers 1GB mapping. Hence, instead of sampling thousands of 4K/2M > > > > pages to detect accesses in a large region, sampling at the higher > > > > level of page table tree is faster and > > > efficient. > > > > > > Due to the above reason, I concern this could result in making DAMON > > > monitoring results be inaccurately biased to report more than real accesses. > > > > DAMON, even without the proposed enhancement, can result in > > inaccuracies for large regions, (see examples above). > > I think temporarily missing such tiny portion of accesses is not a critical problem. > If this is a problem, the user should increase the sampling interval in my opinion. > That said, as mentioned above, DAMON would better to improve its regions split > mechanism. > > > > > > > > > > > > > > This patch set is based on 6.8-rc5 kernel (commit: f48159f8, > > > > mm-unstable > > > > tree) > > > > > > > > Changes since v1 [1] > > > > ==================== > > > > > > > > - Added support for 5-level page table tree > > > > - Split the patch to mm infrastructure changes and DAMON > > > > enhancements > > > > - Code changes as per comments on v1 > > > > - Added kerneldoc comments > > > > > > > > [1] https://lkml.org/lkml/2023/12/15/272 > > > > > > > > Evaluation: > > > > > > > > - MASIM benchmark with 1GB, 10GB, 100GB footprint with 10% hot data > > > > and 5TB with 10GB hot data. > > > > - DAMON: 5ms sampling, 200ms aggregation interval. Rest all > > > > parameters set to default value. > > > > - DAMON+PTP: Page table profiling applied to DAMON with the above > > > > parameters. > > > > > > > > Profiling efficiency in detecting hot data: > > > > > > > > Footprint 1GB 10GB 100GB 5TB > > > > --------------------------------------------- > > > > DAMON >90% <50% ~0% 0% > > > > DAMON+PTP >90% >90% >90% >90% > > > > > > Sampling interval is the time interval that assumed to be large > > > enough for the workload to make meaningful amount of accesses within > > > the interval. Hence, meaningful amount of sampling interval depends > > > on the workload's characteristic and system's memory bandwidth. > > > > > > Here, the size of the hot memory region is about 100MB, 1GB, 10GB, > > > and 10GB for the four cases, respectively. And you set the sampling > > > interval as 5ms. Let's assume the system can access, say, 50 GB per > > > second, and hence it could be able to access only up to 250 MB per > > > 5ms. So, in case of 1GB and footprint, all hot memory region would > > > be accessed while DAMON is waiting for next sampling interval. > > > Hence, DAMON would be able to see most accesses via sampling. But > > > for 100GB footprint case, only 250MB / 10GB = about 2.5% of the hot > > > memory region would be accessed between the sampling interval. DAMON > cannot see whole accesses, and hence the precision could be low. > > > > > > I don't know exact memory bandwith of the system, but to detect the > > > 10 GB hot region with 5ms sampling interval, the system should be > > > able to access 2GB memory per millisecond, or about 2TB memory per > > > second. I think systems of such memory bandwidth is not that common. > > > > > > I show you also explored a configuration setting the aggregation interval > higher. > > > But because each sampling checks only access between the sampling > > > interval, that might not help in this setup. I'm wondering if you > > > also explored increasing sampling interval. > > > > > > > What we have observed that many real-world benchmarks we experimented > > with do not saturate the memory bandwidth. We also experimented with > > masim microbenchmark to understand the impact on memory access rate > > (we inserted delay between memory access operations in do_rnd_ro() and > > other functions). We see decrease in the precision as access intensity > > is reduced. We have experimented with different sampling and > > aggregation intervals, but that did not help much in improving precision. > > Again, please note that DAMON can show only accesses made between each > sampling interval at a time. The important factor for expectation of DAMON's > accuracy is, the balance between the memory access intensity of the workload, > and the length of the sampling interval. The workload should be access intensive > enough to make sufficient amount of accesses between sampling interval. The > sampling interval should be long enough to allow the workload makes sufficient > amount of accesses within the time interval. > > The fact that the workloads were not saturating the memory bandwidth is not > enough to know if that means the workload was memory intensive enough, and > the sampling interval was long enough. > > I was mentioning the memory bandwidth as only the maximum memory intensity > of the system that could be achieved. > > > > > So, what I think is it that most of the cases the precision depends on > > the page (hot or cold) that is randomly picked for sampling than the > > sampling rate. Most of the time only cold 4K pages are picked in a > > large region as they typically account for 90% of the pages in the > > region and hence DAMON does not detect any accesses at all. By > > profiling higher levels of the page table tree this can be improved. > > Again, agreed. This is an important and grateful finding. Thank you. And again as > mentioned above, I don't think we can merge this patch as is, but we could think > about using the high level access bit check results as a hint to better split the > regions. > > Indeed, DAMON's monitoring mechanism has many rooms for improvements. I > also have some ideas but my time was more spent on more capabilities of > DAMON/DAMOS so far. It was a bit intentional proiority setting since I got no real > DAMON accuracy problem report from the production usage, and improving the > accuracy will deliver the benefit to all DAMON/DAMOS features. > > Since an important milestone of DAMOS, namely auto-tuning, has merged into > the mainline, I think I may better to spend more time on monitoring accuracy > improvement. I have some immature ideas in my head. I will try to summarize > and share the ideas in near future. > > > > > > Sorry again for finding this concern not early enough. But I think > > > we may need to discuss about this first. > > > > Absolutely no problem. Please let me know your thoughts. > > Thank you for patiently walking with me :) > > > Thanks, > SJ > > > > > Regards, > > Aravinda > > > > > > > > [1] https://lkml.kernel.org/r/20231215201159.73845-1-sj@kernel.org > > > > > > > > > Thanks, > > > SJ > > > > > > > > > > > > > > CPU overheads (in billion cycles) for kdamond: > > > > > > > > Footprint 1GB 10GB 100GB 5TB > > > > --------------------------------------------- > > > > DAMON 1.15 19.53 3.52 9.55 > > > > DAMON+PTP 0.83 3.20 1.27 2.55 > > > > > > > > A detailed explanation and evaluation can be found in the arXiv paper: > > > > https://arxiv.org/pdf/2311.10275.pdf > > > > > > > > > > > > Aravinda Prasad (3): > > > > mm/damon: mm infrastructure support > > > > mm/damon: profiling enhancement > > > > mm/damon: documentation updates > > > > > > > > Documentation/mm/damon/design.rst | 42 ++++++ > > > > arch/x86/include/asm/pgtable.h | 20 +++ > > > > arch/x86/mm/pgtable.c | 28 +++- > > > > include/linux/mmu_notifier.h | 36 +++++ > > > > include/linux/pgtable.h | 79 ++++++++++ > > > > mm/damon/vaddr.c | 233 ++++++++++++++++++++++++++++-- > > > > 6 files changed, 424 insertions(+), 14 deletions(-) > > > > > > > > -- > > > > 2.21.3
:::::: :::::: Manual check reason: "low confidence static check first_new_problem: /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:13:2: sparse: sparse: "AltiVec support not enabled"" :::::: BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev CC: linux-kernel@vger.kernel.org TO: Kent Overstreet <kent.overstreet@linux.dev> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 8e938e39866920ddc266898e6ae1fffc5c8f51aa commit: cd575ddf57af004913ff5a994aa5f3203216fa68 bcachefs: Erasure coding date: 5 months ago :::::: branch date: 7 hours ago :::::: commit date: 5 months ago config: powerpc-randconfig-r132-20240321 (https://download.01.org/0day-ci/archive/20240322/202403221609.ZwvYkFdR-lkp@intel.com/config) compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project 23de3862dce582ce91c1aa914467d982cb1a73b4) reproduce: (https://download.01.org/0day-ci/archive/20240322/202403221609.ZwvYkFdR-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/r/202403221609.ZwvYkFdR-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) lib/raid6/altivec2.c: note: in included file: >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:13:2: sparse: sparse: "AltiVec support not enabled" lib/raid6/altivec2.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:14:26: sparse: sparse: bad constant expression type lib/raid6/altivec2.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:14:23: sparse: sparse: bad constant expression type lib/raid6/altivec2.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:17:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:16:24: sparse: sparse: bad constant expression type lib/raid6/altivec2.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:41: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:20: sparse: sparse: bad constant expression type lib/raid6/altivec2.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:14:24: sparse: sparse: bad constant expression type lib/raid6/altivec2.c: note: in included file: /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: got pixel /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: got float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: Expected ) in function declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: got float >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: got } -- /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17097:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:2: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: got unsigned >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: Trying to use reserved word 'float' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: got unaligned_vec_float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: got char /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: got } lib/raid6/altivec2.c:41:16: sparse: sparse: two or more data types in declaration specifiers lib/raid6/altivec2.c:41:16: sparse: sparse: Trying to use reserved word 'signed' as identifier lib/raid6/altivec2.c:41:23: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec2.c:41:23: sparse: sparse: got char lib/raid6/altivec2.c:50:45: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec2.c:50:45: sparse: sparse: got SHLBYTE lib/raid6/altivec2.c:53:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec2.c:53:1: sparse: sparse: got } lib/raid6/altivec2.c:64:9: sparse: sparse: Trying to use reserved word 'return' as identifier lib/raid6/altivec2.c:64:27: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec2.c:64:27: sparse: sparse: got vec_cmpgt lib/raid6/altivec2.c:65:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec2.c:65:1: sparse: sparse: got } lib/raid6/altivec2.c:77:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec2.c:77:19: sparse: sparse: got wd0 lib/raid6/altivec2.c:78:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec2.c:78:19: sparse: sparse: got wd1 lib/raid6/altivec2.c:79:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec2.c:79:19: sparse: sparse: got x1d lib/raid6/altivec2.c:85:17: sparse: sparse: Expected ) in function declarator lib/raid6/altivec2.c:85:17: sparse: sparse: got = lib/raid6/altivec2.c:85:9: sparse: sparse: Trying to use reserved word 'for' as identifier lib/raid6/altivec2.c:85:25: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec2.c:85:25: sparse: sparse: got < lib/raid6/altivec2.c:85:37: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec2.c:85:37: sparse: sparse: got += lib/raid6/altivec2.c:87:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/altivec2.c:88:25: sparse: sparse: Expected ) in function declarator lib/raid6/altivec2.c:88:25: sparse: sparse: got = lib/raid6/altivec2.c:88:17: sparse: sparse: Trying to use reserved word 'for' as identifier lib/raid6/altivec2.c:88:36: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec2.c:88:36: sparse: sparse: got >= lib/raid6/altivec2.c:88:44: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec2.c:88:44: sparse: sparse: got -- lib/raid6/altivec2.c:90:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/altivec2.c:103:17: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec2.c:103:17: sparse: sparse: got } lib/raid6/altivec2.c:105:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec2.c:105:29: sparse: sparse: got * lib/raid6/altivec2.c:106:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec2.c:106:29: sparse: sparse: got * lib/raid6/altivec2.c:107:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec2.c:107:29: sparse: sparse: got * lib/raid6/altivec2.c:108:9: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec2.c:108:9: sparse: sparse: got } lib/raid6/altivec2.c:120:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec2.c:120:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:13: sparse: sparse: bad constant expression type >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697) lib/raid6/altivec2.c:81:14: sparse: sparse: undefined identifier 'disks' lib/raid6/altivec2.c:82:13: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec2.c:82:9: sparse: sparse: symbol 'p' redeclared with different type (different base types): lib/raid6/altivec2.c:82:9: sparse: int [addressable] [toplevel] p lib/raid6/altivec2.c:74:12: sparse: note: previously declared as: lib/raid6/altivec2.c:74:12: sparse: unsigned char [usertype] *[addressable] [toplevel] p lib/raid6/altivec2.c:83:13: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec2.c:83:9: sparse: sparse: symbol 'q' redeclared with different type (different base types): lib/raid6/altivec2.c:83:9: sparse: int [addressable] [toplevel] q lib/raid6/altivec2.c:74:16: sparse: note: previously declared as: lib/raid6/altivec2.c:74:16: sparse: unsigned char [usertype] *[addressable] [toplevel] q lib/raid6/altivec2.c:87:23: sparse: sparse: undefined identifier 'wp1' lib/raid6/altivec2.c:87:29: sparse: sparse: cannot dereference this type lib/raid6/altivec2.c:87:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec2.c:90:31: sparse: sparse: cannot dereference this type lib/raid6/altivec2.c:90:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec2.c:91:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec2.c:92:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec2.c:93:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec2.c:94:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec2.c:95:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec2.c:96:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec2.c:97:31: sparse: sparse: undefined identifier 'vec_and' lib/raid6/altivec2.c:97:25: sparse: sparse: symbol 'w20' has multiple initializers (originally initialized at lib/raid6/altivec2.c:93) lib/raid6/altivec2.c:98:31: sparse: sparse: undefined identifier 'vec_and' lib/raid6/altivec2.c:98:25: sparse: sparse: symbol 'w21' has multiple initializers (originally initialized at lib/raid6/altivec2.c:94) lib/raid6/altivec2.c:99:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec2.c:99:25: sparse: sparse: symbol 'w10' has multiple initializers (originally initialized at lib/raid6/altivec2.c:95) lib/raid6/altivec2.c:100:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec2.c:100:25: sparse: sparse: symbol 'w11' has multiple initializers (originally initialized at lib/raid6/altivec2.c:96) lib/raid6/altivec2.c:101:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec2.c:102:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec2.c:102:25: sparse: sparse: symbol 'wq1' has multiple initializers (originally initialized at lib/raid6/altivec2.c:87) lib/raid6/altivec2.c:105:17: sparse: sparse: symbol 'unative_t' redeclared with different type (different base types): lib/raid6/altivec2.c:105:17: sparse: incomplete type *static [toplevel] unative_t lib/raid6/altivec2.c:79:9: sparse: note: previously declared as: lib/raid6/altivec2.c:79:9: sparse: int static [toplevel] unative_t lib/raid6/altivec2.c:106:17: sparse: sparse: symbol 'unative_t' redeclared with different type (different base types): lib/raid6/altivec2.c:106:17: sparse: incomplete type *static [toplevel] unative_t lib/raid6/altivec2.c:79:9: sparse: note: previously declared as: lib/raid6/altivec2.c:79:9: sparse: int static [toplevel] unative_t lib/raid6/altivec2.c:107:17: sparse: sparse: symbol 'unative_t' redeclared with different type (different base types): lib/raid6/altivec2.c:107:17: sparse: incomplete type *static [toplevel] unative_t lib/raid6/altivec2.c:79:9: sparse: note: previously declared as: lib/raid6/altivec2.c:79:9: sparse: int static [toplevel] unative_t lib/raid6/altivec2.c:118:9: sparse: sparse: symbol 'disable_kernel_altivec' redeclared with different type (different base types): lib/raid6/altivec2.c:118:9: sparse: int static [signed] [toplevel] disable_kernel_altivec( ... ) lib/raid6/altivec2.c: note: in included file: arch/powerpc/include/asm/switch_to.h:58:20: sparse: note: previously declared as: arch/powerpc/include/asm/switch_to.h:58:20: sparse: void static inline [gnu_inline] [toplevel] disable_kernel_altivec( ... ) lib/raid6/altivec2.c:136:9: sparse: sparse: undefined identifier 'raid6_altivec2_gen_syndrome' lib/raid6/altivec2.c:138:9: sparse: sparse: undefined identifier 'raid6_have_altivec' -- lib/raid6/altivec1.c: note: in included file: >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:13:2: sparse: sparse: "AltiVec support not enabled" lib/raid6/altivec1.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:14:26: sparse: sparse: bad constant expression type lib/raid6/altivec1.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:14:23: sparse: sparse: bad constant expression type lib/raid6/altivec1.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:17:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:16:24: sparse: sparse: bad constant expression type lib/raid6/altivec1.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:41: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:20: sparse: sparse: bad constant expression type lib/raid6/altivec1.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:14:24: sparse: sparse: bad constant expression type lib/raid6/altivec1.c: note: in included file: /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: got pixel /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: got float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: Expected ) in function declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: got float >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: got } -- /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17097:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:2: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: got unsigned >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: Trying to use reserved word 'float' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: got unaligned_vec_float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: got char /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: got } lib/raid6/altivec1.c:41:16: sparse: sparse: two or more data types in declaration specifiers lib/raid6/altivec1.c:41:16: sparse: sparse: Trying to use reserved word 'signed' as identifier lib/raid6/altivec1.c:41:23: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec1.c:41:23: sparse: sparse: got char lib/raid6/altivec1.c:50:45: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec1.c:50:45: sparse: sparse: got SHLBYTE lib/raid6/altivec1.c:53:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec1.c:53:1: sparse: sparse: got } lib/raid6/altivec1.c:64:9: sparse: sparse: Trying to use reserved word 'return' as identifier lib/raid6/altivec1.c:64:27: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec1.c:64:27: sparse: sparse: got vec_cmpgt lib/raid6/altivec1.c:65:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec1.c:65:1: sparse: sparse: got } lib/raid6/altivec1.c:77:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec1.c:77:19: sparse: sparse: got wd0 lib/raid6/altivec1.c:78:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec1.c:78:19: sparse: sparse: got x1d lib/raid6/altivec1.c:84:17: sparse: sparse: Expected ) in function declarator lib/raid6/altivec1.c:84:17: sparse: sparse: got = lib/raid6/altivec1.c:84:9: sparse: sparse: Trying to use reserved word 'for' as identifier lib/raid6/altivec1.c:84:25: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec1.c:84:25: sparse: sparse: got < lib/raid6/altivec1.c:84:37: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec1.c:84:37: sparse: sparse: got += lib/raid6/altivec1.c:86:25: sparse: sparse: Expected ) in function declarator lib/raid6/altivec1.c:86:25: sparse: sparse: got = lib/raid6/altivec1.c:86:17: sparse: sparse: Trying to use reserved word 'for' as identifier lib/raid6/altivec1.c:86:36: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec1.c:86:36: sparse: sparse: got >= lib/raid6/altivec1.c:86:44: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec1.c:86:44: sparse: sparse: got -- lib/raid6/altivec1.c:94:17: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec1.c:94:17: sparse: sparse: got } lib/raid6/altivec1.c:96:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec1.c:96:29: sparse: sparse: got * lib/raid6/altivec1.c:97:9: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec1.c:97:9: sparse: sparse: got } lib/raid6/altivec1.c:109:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec1.c:109:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:13: sparse: sparse: bad constant expression type >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697) lib/raid6/altivec1.c:80:14: sparse: sparse: undefined identifier 'disks' lib/raid6/altivec1.c:81:13: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec1.c:81:9: sparse: sparse: symbol 'p' redeclared with different type (different base types): lib/raid6/altivec1.c:81:9: sparse: int [addressable] [toplevel] p lib/raid6/altivec1.c:74:12: sparse: note: previously declared as: lib/raid6/altivec1.c:74:12: sparse: unsigned char [usertype] *[addressable] [toplevel] p lib/raid6/altivec1.c:82:13: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec1.c:82:9: sparse: sparse: symbol 'q' redeclared with different type (different base types): lib/raid6/altivec1.c:82:9: sparse: int [addressable] [toplevel] q lib/raid6/altivec1.c:74:16: sparse: note: previously declared as: lib/raid6/altivec1.c:74:16: sparse: unsigned char [usertype] *[addressable] [toplevel] q lib/raid6/altivec1.c:88:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec1.c:89:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec1.c:90:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec1.c:91:31: sparse: sparse: undefined identifier 'vec_and' lib/raid6/altivec1.c:91:25: sparse: sparse: symbol 'w20' has multiple initializers (originally initialized at lib/raid6/altivec1.c:89) lib/raid6/altivec1.c:92:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec1.c:92:25: sparse: sparse: symbol 'w10' has multiple initializers (originally initialized at lib/raid6/altivec1.c:90) lib/raid6/altivec1.c:93:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec1.c:96:17: sparse: sparse: symbol 'unative_t' redeclared with different type (different base types): lib/raid6/altivec1.c:96:17: sparse: incomplete type *static [toplevel] unative_t lib/raid6/altivec1.c:78:9: sparse: note: previously declared as: lib/raid6/altivec1.c:78:9: sparse: int static [toplevel] unative_t lib/raid6/altivec1.c:107:9: sparse: sparse: symbol 'disable_kernel_altivec' redeclared with different type (different base types): lib/raid6/altivec1.c:107:9: sparse: int static [signed] [toplevel] disable_kernel_altivec( ... ) lib/raid6/altivec1.c: note: in included file: arch/powerpc/include/asm/switch_to.h:58:20: sparse: note: previously declared as: arch/powerpc/include/asm/switch_to.h:58:20: sparse: void static inline [gnu_inline] [toplevel] disable_kernel_altivec( ... ) lib/raid6/altivec1.c:125:9: sparse: sparse: undefined identifier 'raid6_altivec1_gen_syndrome' -- lib/raid6/altivec8.c: note: in included file: >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:13:2: sparse: sparse: "AltiVec support not enabled" lib/raid6/altivec8.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:14:26: sparse: sparse: bad constant expression type lib/raid6/altivec8.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:14:23: sparse: sparse: bad constant expression type lib/raid6/altivec8.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:17:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:16:24: sparse: sparse: bad constant expression type lib/raid6/altivec8.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:41: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:20: sparse: sparse: bad constant expression type lib/raid6/altivec8.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:14:24: sparse: sparse: bad constant expression type lib/raid6/altivec8.c: note: in included file: /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: got pixel /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: got float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: Expected ) in function declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: got float >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: got } -- /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17097:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:2: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: got unsigned >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: Trying to use reserved word 'float' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: got unaligned_vec_float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: got char /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: got } lib/raid6/altivec8.c:41:16: sparse: sparse: two or more data types in declaration specifiers lib/raid6/altivec8.c:41:16: sparse: sparse: Trying to use reserved word 'signed' as identifier lib/raid6/altivec8.c:41:23: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec8.c:41:23: sparse: sparse: got char lib/raid6/altivec8.c:50:45: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec8.c:50:45: sparse: sparse: got SHLBYTE lib/raid6/altivec8.c:53:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec8.c:53:1: sparse: sparse: got } lib/raid6/altivec8.c:64:9: sparse: sparse: Trying to use reserved word 'return' as identifier lib/raid6/altivec8.c:64:27: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec8.c:64:27: sparse: sparse: got vec_cmpgt lib/raid6/altivec8.c:65:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec8.c:65:1: sparse: sparse: got } lib/raid6/altivec8.c:77:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec8.c:77:19: sparse: sparse: got wd0 lib/raid6/altivec8.c:78:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec8.c:78:19: sparse: sparse: got wd1 lib/raid6/altivec8.c:79:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec8.c:79:19: sparse: sparse: got wd2 lib/raid6/altivec8.c:80:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec8.c:80:19: sparse: sparse: got wd3 lib/raid6/altivec8.c:81:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec8.c:81:19: sparse: sparse: got wd4 -- lib/raid6/altivec8.c:108:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/altivec8.c:157:17: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec8.c:157:17: sparse: sparse: got } lib/raid6/altivec8.c:159:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:159:29: sparse: sparse: got * lib/raid6/altivec8.c:160:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:160:29: sparse: sparse: got * lib/raid6/altivec8.c:161:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:161:29: sparse: sparse: got * lib/raid6/altivec8.c:162:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:162:29: sparse: sparse: got * lib/raid6/altivec8.c:163:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:163:29: sparse: sparse: got * lib/raid6/altivec8.c:164:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:164:29: sparse: sparse: got * lib/raid6/altivec8.c:165:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:165:29: sparse: sparse: got * lib/raid6/altivec8.c:166:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:166:29: sparse: sparse: got * lib/raid6/altivec8.c:167:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:167:29: sparse: sparse: got * lib/raid6/altivec8.c:168:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:168:29: sparse: sparse: got * lib/raid6/altivec8.c:169:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:169:29: sparse: sparse: got * lib/raid6/altivec8.c:170:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:170:29: sparse: sparse: got * lib/raid6/altivec8.c:171:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:171:29: sparse: sparse: got * lib/raid6/altivec8.c:172:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:172:29: sparse: sparse: got * lib/raid6/altivec8.c:173:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec8.c:173:29: sparse: sparse: got * lib/raid6/altivec8.c:174:9: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec8.c:174:9: sparse: sparse: got } lib/raid6/altivec8.c:186:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec8.c:186:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:13: sparse: sparse: bad constant expression type >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697) lib/raid6/altivec8.c:87:14: sparse: sparse: undefined identifier 'disks' lib/raid6/altivec8.c:88:13: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:88:9: sparse: sparse: symbol 'p' redeclared with different type (different base types): lib/raid6/altivec8.c:88:9: sparse: int [addressable] [toplevel] p lib/raid6/altivec8.c:74:12: sparse: note: previously declared as: lib/raid6/altivec8.c:74:12: sparse: unsigned char [usertype] *[addressable] [toplevel] p lib/raid6/altivec8.c:89:13: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:89:9: sparse: sparse: symbol 'q' redeclared with different type (different base types): lib/raid6/altivec8.c:89:9: sparse: int [addressable] [toplevel] q lib/raid6/altivec8.c:74:16: sparse: note: previously declared as: lib/raid6/altivec8.c:74:16: sparse: unsigned char [usertype] *[addressable] [toplevel] q lib/raid6/altivec8.c:93:23: sparse: sparse: undefined identifier 'wp1' lib/raid6/altivec8.c:93:29: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:93:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:94:23: sparse: sparse: undefined identifier 'wp2' lib/raid6/altivec8.c:94:29: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:94:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:95:23: sparse: sparse: undefined identifier 'wp3' lib/raid6/altivec8.c:95:29: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:95:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:96:23: sparse: sparse: undefined identifier 'wp4' lib/raid6/altivec8.c:96:29: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:96:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:97:23: sparse: sparse: undefined identifier 'wp5' lib/raid6/altivec8.c:97:29: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:97:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:98:23: sparse: sparse: undefined identifier 'wp6' lib/raid6/altivec8.c:98:29: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:98:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:99:23: sparse: sparse: undefined identifier 'wp7' lib/raid6/altivec8.c:99:29: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:99:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:102:31: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:102:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:103:31: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:103:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:104:31: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:104:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:105:31: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:105:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:106:31: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:106:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:107:31: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:107:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:108:31: sparse: sparse: cannot dereference this type lib/raid6/altivec8.c:108:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec8.c:109:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec8.c:110:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec8.c:111:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec8.c:112:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec8.c:113:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec8.c:114:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec8.c:115:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec8.c:116:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec8.c:117:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec8.c:118:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec8.c:119:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec8.c:120:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec8.c:121:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec8.c:122:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec8.c:123:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec8.c:124:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec8.c:125:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec8.c:126:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec8.c:127:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec8.c:128:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec8.c:129:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec8.c:130:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec8.c:131:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec8.c:132:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec8.c:133:31: sparse: sparse: undefined identifier 'vec_and' lib/raid6/altivec8.c:133:25: sparse: sparse: symbol 'w20' has multiple initializers (originally initialized at lib/raid6/altivec8.c:117) lib/raid6/altivec8.c:134:31: sparse: sparse: undefined identifier 'vec_and' lib/raid6/altivec8.c:134:25: sparse: sparse: symbol 'w21' has multiple initializers (originally initialized at lib/raid6/altivec8.c:118) lib/raid6/altivec8.c:135:31: sparse: sparse: undefined identifier 'vec_and' lib/raid6/altivec8.c:135:25: sparse: sparse: symbol 'w22' has multiple initializers (originally initialized at lib/raid6/altivec8.c:119) -- lib/raid6/altivec4.c: note: in included file: >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:13:2: sparse: sparse: "AltiVec support not enabled" lib/raid6/altivec4.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:14:26: sparse: sparse: bad constant expression type lib/raid6/altivec4.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:14:23: sparse: sparse: bad constant expression type lib/raid6/altivec4.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:17:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:16:24: sparse: sparse: bad constant expression type lib/raid6/altivec4.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:41: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:20: sparse: sparse: bad constant expression type lib/raid6/altivec4.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:14:24: sparse: sparse: bad constant expression type lib/raid6/altivec4.c: note: in included file: /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: got pixel /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: got float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: Expected ) in function declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: got float >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: got } -- /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17097:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:2: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: got unsigned >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: Trying to use reserved word 'float' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: got unaligned_vec_float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: got char /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: got } lib/raid6/altivec4.c:41:16: sparse: sparse: two or more data types in declaration specifiers lib/raid6/altivec4.c:41:16: sparse: sparse: Trying to use reserved word 'signed' as identifier lib/raid6/altivec4.c:41:23: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:41:23: sparse: sparse: got char lib/raid6/altivec4.c:50:45: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:50:45: sparse: sparse: got SHLBYTE lib/raid6/altivec4.c:53:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec4.c:53:1: sparse: sparse: got } lib/raid6/altivec4.c:64:9: sparse: sparse: Trying to use reserved word 'return' as identifier lib/raid6/altivec4.c:64:27: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:64:27: sparse: sparse: got vec_cmpgt lib/raid6/altivec4.c:65:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec4.c:65:1: sparse: sparse: got } lib/raid6/altivec4.c:77:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:77:19: sparse: sparse: got wd0 lib/raid6/altivec4.c:78:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:78:19: sparse: sparse: got wd1 lib/raid6/altivec4.c:79:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:79:19: sparse: sparse: got wd2 lib/raid6/altivec4.c:80:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:80:19: sparse: sparse: got wd3 lib/raid6/altivec4.c:81:19: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:81:19: sparse: sparse: got x1d -- lib/raid6/altivec4.c:87:25: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:87:25: sparse: sparse: got < lib/raid6/altivec4.c:87:37: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:87:37: sparse: sparse: got += lib/raid6/altivec4.c:89:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/altivec4.c:90:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/altivec4.c:91:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/altivec4.c:92:25: sparse: sparse: Expected ) in function declarator lib/raid6/altivec4.c:92:25: sparse: sparse: got = lib/raid6/altivec4.c:92:17: sparse: sparse: Trying to use reserved word 'for' as identifier lib/raid6/altivec4.c:92:36: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:92:36: sparse: sparse: got >= lib/raid6/altivec4.c:92:44: sparse: sparse: Expected ; at end of declaration lib/raid6/altivec4.c:92:44: sparse: sparse: got -- lib/raid6/altivec4.c:94:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/altivec4.c:95:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/altivec4.c:96:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/altivec4.c:121:17: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec4.c:121:17: sparse: sparse: got } lib/raid6/altivec4.c:123:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec4.c:123:29: sparse: sparse: got * lib/raid6/altivec4.c:124:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec4.c:124:29: sparse: sparse: got * lib/raid6/altivec4.c:125:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec4.c:125:29: sparse: sparse: got * lib/raid6/altivec4.c:126:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec4.c:126:29: sparse: sparse: got * lib/raid6/altivec4.c:127:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec4.c:127:29: sparse: sparse: got * lib/raid6/altivec4.c:128:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec4.c:128:29: sparse: sparse: got * lib/raid6/altivec4.c:129:29: sparse: sparse: Expected ) in nested declarator lib/raid6/altivec4.c:129:29: sparse: sparse: got * lib/raid6/altivec4.c:130:9: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec4.c:130:9: sparse: sparse: got } lib/raid6/altivec4.c:142:1: sparse: sparse: Expected ; at the end of type declaration lib/raid6/altivec4.c:142:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:13: sparse: sparse: bad constant expression type >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697) lib/raid6/altivec4.c:83:14: sparse: sparse: undefined identifier 'disks' lib/raid6/altivec4.c:84:13: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec4.c:84:9: sparse: sparse: symbol 'p' redeclared with different type (different base types): lib/raid6/altivec4.c:84:9: sparse: int [addressable] [toplevel] p lib/raid6/altivec4.c:74:12: sparse: note: previously declared as: lib/raid6/altivec4.c:74:12: sparse: unsigned char [usertype] *[addressable] [toplevel] p lib/raid6/altivec4.c:85:13: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec4.c:85:9: sparse: sparse: symbol 'q' redeclared with different type (different base types): lib/raid6/altivec4.c:85:9: sparse: int [addressable] [toplevel] q lib/raid6/altivec4.c:74:16: sparse: note: previously declared as: lib/raid6/altivec4.c:74:16: sparse: unsigned char [usertype] *[addressable] [toplevel] q lib/raid6/altivec4.c:89:23: sparse: sparse: undefined identifier 'wp1' lib/raid6/altivec4.c:89:29: sparse: sparse: cannot dereference this type lib/raid6/altivec4.c:89:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec4.c:90:23: sparse: sparse: undefined identifier 'wp2' lib/raid6/altivec4.c:90:29: sparse: sparse: cannot dereference this type lib/raid6/altivec4.c:90:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec4.c:91:23: sparse: sparse: undefined identifier 'wp3' lib/raid6/altivec4.c:91:29: sparse: sparse: cannot dereference this type lib/raid6/altivec4.c:91:44: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec4.c:94:31: sparse: sparse: cannot dereference this type lib/raid6/altivec4.c:94:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec4.c:95:31: sparse: sparse: cannot dereference this type lib/raid6/altivec4.c:95:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec4.c:96:31: sparse: sparse: cannot dereference this type lib/raid6/altivec4.c:96:46: sparse: sparse: undefined identifier 'dptr' lib/raid6/altivec4.c:97:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:98:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:99:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:100:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:101:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec4.c:102:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec4.c:103:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec4.c:104:31: sparse: sparse: undefined identifier 'MASK' lib/raid6/altivec4.c:105:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec4.c:106:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec4.c:107:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec4.c:108:31: sparse: sparse: undefined identifier 'SHLBYTE' lib/raid6/altivec4.c:109:31: sparse: sparse: undefined identifier 'vec_and' lib/raid6/altivec4.c:109:25: sparse: sparse: symbol 'w20' has multiple initializers (originally initialized at lib/raid6/altivec4.c:101) lib/raid6/altivec4.c:110:31: sparse: sparse: undefined identifier 'vec_and' lib/raid6/altivec4.c:110:25: sparse: sparse: symbol 'w21' has multiple initializers (originally initialized at lib/raid6/altivec4.c:102) lib/raid6/altivec4.c:111:31: sparse: sparse: undefined identifier 'vec_and' lib/raid6/altivec4.c:111:25: sparse: sparse: symbol 'w22' has multiple initializers (originally initialized at lib/raid6/altivec4.c:103) lib/raid6/altivec4.c:112:31: sparse: sparse: undefined identifier 'vec_and' lib/raid6/altivec4.c:112:25: sparse: sparse: symbol 'w23' has multiple initializers (originally initialized at lib/raid6/altivec4.c:104) lib/raid6/altivec4.c:113:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:113:25: sparse: sparse: symbol 'w10' has multiple initializers (originally initialized at lib/raid6/altivec4.c:105) lib/raid6/altivec4.c:114:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:114:25: sparse: sparse: symbol 'w11' has multiple initializers (originally initialized at lib/raid6/altivec4.c:106) lib/raid6/altivec4.c:115:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:115:25: sparse: sparse: symbol 'w12' has multiple initializers (originally initialized at lib/raid6/altivec4.c:107) lib/raid6/altivec4.c:116:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:116:25: sparse: sparse: symbol 'w13' has multiple initializers (originally initialized at lib/raid6/altivec4.c:108) lib/raid6/altivec4.c:117:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:118:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:118:25: sparse: sparse: symbol 'wq1' has multiple initializers (originally initialized at lib/raid6/altivec4.c:89) lib/raid6/altivec4.c:119:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:119:25: sparse: sparse: symbol 'wq2' has multiple initializers (originally initialized at lib/raid6/altivec4.c:90) lib/raid6/altivec4.c:120:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/altivec4.c:120:25: sparse: sparse: symbol 'wq3' has multiple initializers (originally initialized at lib/raid6/altivec4.c:91) lib/raid6/altivec4.c:123:17: sparse: sparse: symbol 'unative_t' redeclared with different type (different base types): lib/raid6/altivec4.c:123:17: sparse: incomplete type *static [toplevel] unative_t lib/raid6/altivec4.c:81:9: sparse: note: previously declared as: lib/raid6/altivec4.c:81:9: sparse: int static [toplevel] unative_t lib/raid6/altivec4.c:124:17: sparse: sparse: symbol 'unative_t' redeclared with different type (different base types): lib/raid6/altivec4.c:124:17: sparse: incomplete type *static [toplevel] unative_t lib/raid6/altivec4.c:81:9: sparse: note: previously declared as: lib/raid6/altivec4.c:81:9: sparse: int static [toplevel] unative_t lib/raid6/altivec4.c:125:17: sparse: sparse: symbol 'unative_t' redeclared with different type (different base types): lib/raid6/altivec4.c:125:17: sparse: incomplete type *static [toplevel] unative_t lib/raid6/altivec4.c:81:9: sparse: note: previously declared as: lib/raid6/altivec4.c:81:9: sparse: int static [toplevel] unative_t lib/raid6/altivec4.c:126:17: sparse: sparse: symbol 'unative_t' redeclared with different type (different base types): lib/raid6/altivec4.c:126:17: sparse: incomplete type *static [toplevel] unative_t lib/raid6/altivec4.c:81:9: sparse: note: previously declared as: -- lib/raid6/vpermxor1.c: note: in included file: >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:13:2: sparse: sparse: "AltiVec support not enabled" lib/raid6/vpermxor1.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:14:26: sparse: sparse: bad constant expression type lib/raid6/vpermxor1.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:14:23: sparse: sparse: bad constant expression type lib/raid6/vpermxor1.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:17:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:16:24: sparse: sparse: bad constant expression type lib/raid6/vpermxor1.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:41: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:20: sparse: sparse: bad constant expression type lib/raid6/vpermxor1.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:14:24: sparse: sparse: bad constant expression type lib/raid6/vpermxor1.c: note: in included file: /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: got pixel /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: got float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: Expected ) in function declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: got float >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: got } -- /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17097:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:2: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: got unsigned >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: Trying to use reserved word 'float' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: got unaligned_vec_float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: got char /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: got } lib/raid6/vpermxor1.c:33:16: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor1.c:33:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor1.c:33:25: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor1.c:33:25: sparse: sparse: got char lib/raid6/vpermxor1.c:36:21: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor1.c:36:21: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor1.c:36:30: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor1.c:36:30: sparse: sparse: got char lib/raid6/vpermxor1.c:39:21: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor1.c:39:21: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor1.c:39:30: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor1.c:39:30: sparse: sparse: got char lib/raid6/vpermxor1.c:49:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor1.c:49:19: sparse: sparse: got wp0 lib/raid6/vpermxor1.c:56:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor1.c:59:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor1.c:67:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor1.c:68:30: sparse: sparse: No right hand side of '*'-expression /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:13: sparse: sparse: bad constant expression type >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697) lib/raid6/vpermxor1.c:49:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor1.c:56:17: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor1.c:56:23: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor1.c:56:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor1.c:56:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor1.c:59:25: sparse: sparse: undefined identifier 'wd0' lib/raid6/vpermxor1.c:59:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor1.c:59:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor1.c:61:25: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor1.c:61:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor1.c:64:56: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor1.c:65:25: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor1.c:65:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor1.c:67:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor1.c:67:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor1.c:67:47: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor1.c:68:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor1.c:68:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor1.c:68:47: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor1.c:55:37: sparse: sparse: undefined identifier 'unative_t' -- lib/raid6/vpermxor2.c: note: in included file: >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:13:2: sparse: sparse: "AltiVec support not enabled" lib/raid6/vpermxor2.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:14:26: sparse: sparse: bad constant expression type lib/raid6/vpermxor2.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:14:23: sparse: sparse: bad constant expression type lib/raid6/vpermxor2.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:17:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:16:24: sparse: sparse: bad constant expression type lib/raid6/vpermxor2.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:41: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:20: sparse: sparse: bad constant expression type lib/raid6/vpermxor2.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:14:24: sparse: sparse: bad constant expression type lib/raid6/vpermxor2.c: note: in included file: /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: got pixel /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: got float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: Expected ) in function declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: got float >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: got } -- /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17097:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:2: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: got unsigned >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: Trying to use reserved word 'float' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: got unaligned_vec_float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: got char /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: got } lib/raid6/vpermxor2.c:33:16: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor2.c:33:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor2.c:33:25: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor2.c:33:25: sparse: sparse: got char lib/raid6/vpermxor2.c:36:21: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor2.c:36:21: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor2.c:36:30: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor2.c:36:30: sparse: sparse: got char lib/raid6/vpermxor2.c:39:21: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor2.c:39:21: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor2.c:39:30: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor2.c:39:30: sparse: sparse: got char lib/raid6/vpermxor2.c:49:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor2.c:49:19: sparse: sparse: got wp0 lib/raid6/vpermxor2.c:50:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor2.c:50:19: sparse: sparse: got wp1 lib/raid6/vpermxor2.c:57:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor2.c:58:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor2.c:61:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor2.c:62:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor2.c:73:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor2.c:74:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor2.c:75:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor2.c:76:30: sparse: sparse: No right hand side of '*'-expression /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:13: sparse: sparse: bad constant expression type >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697) lib/raid6/vpermxor2.c:49:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:50:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:57:17: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor2.c:57:23: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor2.c:57:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:57:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:58:17: sparse: sparse: undefined identifier 'wp1' lib/raid6/vpermxor2.c:58:23: sparse: sparse: undefined identifier 'wq1' lib/raid6/vpermxor2.c:58:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:58:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:61:25: sparse: sparse: undefined identifier 'wd0' lib/raid6/vpermxor2.c:61:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:61:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:62:25: sparse: sparse: undefined identifier 'wd1' lib/raid6/vpermxor2.c:62:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:62:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:64:25: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor2.c:64:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor2.c:65:25: sparse: sparse: undefined identifier 'wp1' lib/raid6/vpermxor2.c:65:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor2.c:68:56: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor2.c:69:56: sparse: sparse: undefined identifier 'wq1' lib/raid6/vpermxor2.c:70:25: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor2.c:70:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor2.c:71:25: sparse: sparse: undefined identifier 'wq1' lib/raid6/vpermxor2.c:71:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor2.c:73:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:73:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:73:47: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor2.c:74:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:74:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:74:47: sparse: sparse: undefined identifier 'wp1' lib/raid6/vpermxor2.c:75:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:75:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:75:47: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor2.c:76:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:76:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor2.c:76:47: sparse: sparse: undefined identifier 'wq1' lib/raid6/vpermxor2.c:56:37: sparse: sparse: undefined identifier 'unative_t' -- lib/raid6/vpermxor4.c: note: in included file: >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:13:2: sparse: sparse: "AltiVec support not enabled" lib/raid6/vpermxor4.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:14:26: sparse: sparse: bad constant expression type lib/raid6/vpermxor4.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:14:23: sparse: sparse: bad constant expression type lib/raid6/vpermxor4.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:17:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:16:24: sparse: sparse: bad constant expression type lib/raid6/vpermxor4.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:41: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:20: sparse: sparse: bad constant expression type lib/raid6/vpermxor4.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:14:24: sparse: sparse: bad constant expression type lib/raid6/vpermxor4.c: note: in included file: /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: got pixel /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: got float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: Expected ) in function declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: got float >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: got } -- /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17097:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:2: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: got unsigned >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: Trying to use reserved word 'float' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: got unaligned_vec_float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: got char /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: got } lib/raid6/vpermxor4.c:33:16: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor4.c:33:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor4.c:33:25: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor4.c:33:25: sparse: sparse: got char lib/raid6/vpermxor4.c:36:21: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor4.c:36:21: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor4.c:36:30: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor4.c:36:30: sparse: sparse: got char lib/raid6/vpermxor4.c:39:21: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor4.c:39:21: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor4.c:39:30: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor4.c:39:30: sparse: sparse: got char lib/raid6/vpermxor4.c:49:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor4.c:49:19: sparse: sparse: got wp0 lib/raid6/vpermxor4.c:50:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor4.c:50:19: sparse: sparse: got wp1 lib/raid6/vpermxor4.c:51:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor4.c:51:19: sparse: sparse: got wp2 lib/raid6/vpermxor4.c:52:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor4.c:52:19: sparse: sparse: got wp3 lib/raid6/vpermxor4.c:59:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:60:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:61:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:62:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:65:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:66:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:67:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:68:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:85:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:86:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:87:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:88:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:89:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:90:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:91:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor4.c:92:30: sparse: sparse: No right hand side of '*'-expression /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:13: sparse: sparse: bad constant expression type >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697) lib/raid6/vpermxor4.c:49:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:50:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:51:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:52:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:59:17: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor4.c:59:23: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor4.c:59:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:59:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:60:17: sparse: sparse: undefined identifier 'wp1' lib/raid6/vpermxor4.c:60:23: sparse: sparse: undefined identifier 'wq1' lib/raid6/vpermxor4.c:60:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:60:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:61:17: sparse: sparse: undefined identifier 'wp2' lib/raid6/vpermxor4.c:61:23: sparse: sparse: undefined identifier 'wq2' lib/raid6/vpermxor4.c:61:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:61:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:62:17: sparse: sparse: undefined identifier 'wp3' lib/raid6/vpermxor4.c:62:23: sparse: sparse: undefined identifier 'wq3' lib/raid6/vpermxor4.c:62:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:62:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:65:25: sparse: sparse: undefined identifier 'wd0' lib/raid6/vpermxor4.c:65:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:65:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:66:25: sparse: sparse: undefined identifier 'wd1' lib/raid6/vpermxor4.c:66:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:66:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:67:25: sparse: sparse: undefined identifier 'wd2' lib/raid6/vpermxor4.c:67:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:67:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:68:25: sparse: sparse: undefined identifier 'wd3' lib/raid6/vpermxor4.c:68:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:68:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:70:25: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor4.c:70:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor4.c:71:25: sparse: sparse: undefined identifier 'wp1' lib/raid6/vpermxor4.c:71:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor4.c:72:25: sparse: sparse: undefined identifier 'wp2' lib/raid6/vpermxor4.c:72:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor4.c:73:25: sparse: sparse: undefined identifier 'wp3' lib/raid6/vpermxor4.c:73:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor4.c:76:56: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor4.c:77:56: sparse: sparse: undefined identifier 'wq1' lib/raid6/vpermxor4.c:78:56: sparse: sparse: undefined identifier 'wq2' lib/raid6/vpermxor4.c:79:56: sparse: sparse: undefined identifier 'wq3' lib/raid6/vpermxor4.c:80:25: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor4.c:80:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor4.c:81:25: sparse: sparse: undefined identifier 'wq1' lib/raid6/vpermxor4.c:81:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor4.c:82:25: sparse: sparse: undefined identifier 'wq2' lib/raid6/vpermxor4.c:82:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor4.c:83:25: sparse: sparse: undefined identifier 'wq3' lib/raid6/vpermxor4.c:83:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor4.c:85:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:85:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:85:47: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor4.c:86:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:86:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:86:47: sparse: sparse: undefined identifier 'wp1' lib/raid6/vpermxor4.c:87:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:87:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:87:47: sparse: sparse: undefined identifier 'wp2' lib/raid6/vpermxor4.c:88:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:88:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:88:47: sparse: sparse: undefined identifier 'wp3' lib/raid6/vpermxor4.c:89:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:89:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:89:47: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor4.c:90:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:90:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:90:47: sparse: sparse: undefined identifier 'wq1' lib/raid6/vpermxor4.c:91:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:91:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:91:47: sparse: sparse: undefined identifier 'wq2' lib/raid6/vpermxor4.c:92:19: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:92:36: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor4.c:92:47: sparse: sparse: undefined identifier 'wq3' -- lib/raid6/vpermxor8.c: note: in included file: >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:13:2: sparse: sparse: "AltiVec support not enabled" lib/raid6/vpermxor8.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_ptrdiff_t.h:14:26: sparse: sparse: bad constant expression type lib/raid6/vpermxor8.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_size_t.h:14:23: sparse: sparse: bad constant expression type lib/raid6/vpermxor8.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:17:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_wchar_t.h:16:24: sparse: sparse: bad constant expression type lib/raid6/vpermxor8.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:41: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_null.h:10:20: sparse: sparse: bad constant expression type lib/raid6/vpermxor8.c: note: in included file (through /opt/cross/clang-23de3862dc/lib/clang/19/include/stddef.h, /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h): >> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:15:50: sparse: sparse: not a function <noident> /opt/cross/clang-23de3862dc/lib/clang/19/include/__stddef_offsetof.h:14:24: sparse: sparse: bad constant expression type lib/raid6/vpermxor8.c: note: in included file: /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:50:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:53:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:57:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:60:26: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:64:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:68:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:71:26: sparse: sparse: got pixel /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:75:26: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:79:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:82:26: sparse: sparse: got bool /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:85:26: sparse: sparse: got float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:107:26: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:116:26: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:119:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:124:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:129:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: Expected ) in function declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:18: sparse: sparse: got float >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:144:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:146:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:163:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:169:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:175:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:202:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:207:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:217:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:222:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:227:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:232:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:242:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:247:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:252:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:257:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:267:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:272:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:277:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:282:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:345:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:386:10: sparse: sparse: got signed /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:387:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:388:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:394:10: sparse: sparse: got unsigned /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:395:10: sparse: sparse: got vec_add /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:396:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:478:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:483:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:488:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:493:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:498:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:503:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:512:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:517:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:522:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:527:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:532:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:537:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:551:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:556:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:561:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:566:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:571:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:580:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:588:1: sparse: sparse: got } -- /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17097:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17103:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17109:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17115:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17121:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17125:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17130:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17136:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17142:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17148:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17154:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17160:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17212:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17250:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17268:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17286:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17304:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17321:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17334:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17531:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17536:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17542:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17546:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17550:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17555:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17559:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17564:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17569:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17573:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17600:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17605:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17610:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17616:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17617:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17623:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17624:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17630:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17631:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17637:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17638:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17644:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17645:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17651:10: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17652:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:2: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17658:9: sparse: sparse: got vec_perm /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17659:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17717:16: sparse: sparse: got unsigned >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17718:23: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17719:25: sparse: sparse: got short /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:16: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17720:23: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17721:25: sparse: sparse: got int /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: two or more data types in declaration specifiers >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:16: sparse: sparse: Trying to use reserved word 'float' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17722:22: sparse: sparse: got unaligned_vec_float /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: two or more data types in declaration specifiers /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:35: sparse: sparse: Trying to use reserved word 'signed' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17724:42: sparse: sparse: got char /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17727:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17732:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17737:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17738:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17743:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17744:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17749:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17750:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17755:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17756:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:3: sparse: sparse: Trying to use reserved word 'return' as identifier /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: Expected ; at end of declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17761:10: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17762:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:17997:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18002:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18007:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18008:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18014:26: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18015:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18020:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18021:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18026:24: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18027:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: Expected ) in nested declarator /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18032:25: sparse: sparse: got * /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18033:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18237:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18254:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18258:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18262:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18266:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18283:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18287:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18291:1: sparse: sparse: got } /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: Expected ; at the end of type declaration /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:18296:1: sparse: sparse: got } lib/raid6/vpermxor8.c:33:16: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor8.c:33:16: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor8.c:33:25: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor8.c:33:25: sparse: sparse: got char lib/raid6/vpermxor8.c:36:21: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor8.c:36:21: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor8.c:36:30: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor8.c:36:30: sparse: sparse: got char lib/raid6/vpermxor8.c:39:21: sparse: sparse: two or more data types in declaration specifiers lib/raid6/vpermxor8.c:39:21: sparse: sparse: Trying to use reserved word 'unsigned' as identifier lib/raid6/vpermxor8.c:39:30: sparse: sparse: Expected ; at end of declaration lib/raid6/vpermxor8.c:39:30: sparse: sparse: got char lib/raid6/vpermxor8.c:49:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor8.c:49:19: sparse: sparse: got wp0 lib/raid6/vpermxor8.c:50:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor8.c:50:19: sparse: sparse: got wp1 lib/raid6/vpermxor8.c:51:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor8.c:51:19: sparse: sparse: got wp2 lib/raid6/vpermxor8.c:52:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor8.c:52:19: sparse: sparse: got wp3 lib/raid6/vpermxor8.c:53:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor8.c:53:19: sparse: sparse: got wp4 lib/raid6/vpermxor8.c:54:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor8.c:54:19: sparse: sparse: got wp5 lib/raid6/vpermxor8.c:55:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor8.c:55:19: sparse: sparse: got wp6 lib/raid6/vpermxor8.c:56:19: sparse: sparse: Expected ; at end of statement lib/raid6/vpermxor8.c:56:19: sparse: sparse: got wp7 lib/raid6/vpermxor8.c:63:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:64:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:65:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:66:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:67:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:68:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:69:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:70:42: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:73:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:74:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:75:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:76:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:77:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:78:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:79:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:80:44: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:109:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:110:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:111:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:112:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:113:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:114:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:115:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:116:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:117:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:118:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:119:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:120:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:121:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:122:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:123:30: sparse: sparse: No right hand side of '*'-expression lib/raid6/vpermxor8.c:124:30: sparse: sparse: No right hand side of '*'-expression /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10107) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10116) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10125) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10134) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10143) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10152) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:22: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:35: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:30: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:48: sparse: sparse: undefined identifier 'b0' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170:43: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10161) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10241) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10250) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10259) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10268) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10170) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10281) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10290) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:22: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:17: sparse: sparse: symbol 'b1' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:36: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:31: sparse: sparse: symbol 'b2' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:50: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10308:45: sparse: sparse: symbol 'b3' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:10299) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:13: sparse: sparse: bad constant expression type >> /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14654) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14664) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14672) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14681) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14688) /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:9: sparse: sparse: undefined identifier '__b' /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:13: sparse: sparse: bad constant expression type /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:22: sparse: sparse: invalid initializer /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14704:3: sparse: sparse: symbol '__res' has multiple initializers (originally initialized at /opt/cross/clang-23de3862dc/lib/clang/19/include/altivec.h:14697) lib/raid6/vpermxor8.c:49:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:50:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:51:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:52:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:53:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:54:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:55:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:56:9: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:63:17: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor8.c:63:23: sparse: sparse: undefined identifier 'wq0' lib/raid6/vpermxor8.c:63:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:63:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:64:17: sparse: sparse: undefined identifier 'wp1' lib/raid6/vpermxor8.c:64:23: sparse: sparse: undefined identifier 'wq1' lib/raid6/vpermxor8.c:64:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:64:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:65:17: sparse: sparse: undefined identifier 'wp2' lib/raid6/vpermxor8.c:65:23: sparse: sparse: undefined identifier 'wq2' lib/raid6/vpermxor8.c:65:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:65:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:66:17: sparse: sparse: undefined identifier 'wp3' lib/raid6/vpermxor8.c:66:23: sparse: sparse: undefined identifier 'wq3' lib/raid6/vpermxor8.c:66:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:66:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:67:17: sparse: sparse: undefined identifier 'wp4' lib/raid6/vpermxor8.c:67:23: sparse: sparse: undefined identifier 'wq4' lib/raid6/vpermxor8.c:67:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:67:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:68:17: sparse: sparse: undefined identifier 'wp5' lib/raid6/vpermxor8.c:68:23: sparse: sparse: undefined identifier 'wq5' lib/raid6/vpermxor8.c:68:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:68:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:69:17: sparse: sparse: undefined identifier 'wp6' lib/raid6/vpermxor8.c:69:23: sparse: sparse: undefined identifier 'wq6' lib/raid6/vpermxor8.c:69:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:69:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:70:17: sparse: sparse: undefined identifier 'wp7' lib/raid6/vpermxor8.c:70:23: sparse: sparse: undefined identifier 'wq7' lib/raid6/vpermxor8.c:70:31: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:70:57: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:73:25: sparse: sparse: undefined identifier 'wd0' lib/raid6/vpermxor8.c:73:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:73:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:74:25: sparse: sparse: undefined identifier 'wd1' lib/raid6/vpermxor8.c:74:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:74:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:75:25: sparse: sparse: undefined identifier 'wd2' lib/raid6/vpermxor8.c:75:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:75:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:76:25: sparse: sparse: undefined identifier 'wd3' lib/raid6/vpermxor8.c:76:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:76:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:77:25: sparse: sparse: undefined identifier 'wd4' lib/raid6/vpermxor8.c:77:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:77:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:78:25: sparse: sparse: undefined identifier 'wd5' lib/raid6/vpermxor8.c:78:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:78:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:79:25: sparse: sparse: undefined identifier 'wd6' lib/raid6/vpermxor8.c:79:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:79:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:80:25: sparse: sparse: undefined identifier 'wd7' lib/raid6/vpermxor8.c:80:33: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:80:58: sparse: sparse: undefined identifier 'unative_t' lib/raid6/vpermxor8.c:82:25: sparse: sparse: undefined identifier 'wp0' lib/raid6/vpermxor8.c:82:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor8.c:83:25: sparse: sparse: undefined identifier 'wp1' lib/raid6/vpermxor8.c:83:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor8.c:84:25: sparse: sparse: undefined identifier 'wp2' lib/raid6/vpermxor8.c:84:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor8.c:85:25: sparse: sparse: undefined identifier 'wp3' lib/raid6/vpermxor8.c:85:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor8.c:86:25: sparse: sparse: undefined identifier 'wp4' lib/raid6/vpermxor8.c:86:31: sparse: sparse: undefined identifier 'vec_xor' lib/raid6/vpermxor8.c:87:25: sparse: sparse: undefined identifier 'wp5' lib/raid6/vpermxor8.c:87:31: sparse: sparse: undefined identifier 'vec_xor' -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
> -----Original Message----- > From: Frank Li <frank.li@nxp.com> > Sent: 2024年3月5日 4:25 > To: Hongxing Zhu <hongxing.zhu@nxp.com>; Lucas Stach > <l.stach@pengutronix.de>; Lorenzo Pieralisi <lpieralisi@kernel.org>; Krzysztof > Wilczyński <kw@linux.com>; Rob Herring <robh@kernel.org>; Bjorn Helgaas > <bhelgaas@google.com>; Shawn Guo <shawnguo@kernel.org>; Sascha Hauer > <s.hauer@pengutronix.de>; Pengutronix Kernel Team <kernel@pengutronix.de>; > Fabio Estevam <festevam@gmail.com>; dl-linux-imx <linux-imx@nxp.com>; > Philipp Zabel <p.zabel@pengutronix.de>; Liam Girdwood > <lgirdwood@gmail.com>; Mark Brown <broonie@kernel.org> > Cc: linux-pci@vger.kernel.org; imx@lists.linux.dev; > linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org; > bpf@vger.kernel.org; Frank Li <frank.li@nxp.com> > Subject: [PATCH v2 6/6] PCI: imx: Config look up table(LUT) to support MSI ITS > and IOMMU for i.MX95 > > i.MX95 need config LUT to convert bpf to stream id. IOMMU and ITS use the > same stream id. Check msi-map and smmu-map and make sure the same PCI bpf > map to the same stream id. Then config LUT related registers. > > Signed-off-by: Frank Li <Frank.Li@nxp.com> > --- > drivers/pci/controller/dwc/pcie-imx.c | 175 > ++++++++++++++++++++++++++++++++++ > 1 file changed, 175 insertions(+) > > diff --git a/drivers/pci/controller/dwc/pcie-imx.c > b/drivers/pci/controller/dwc/pcie-imx.c > index 922bbc0bc1bcd..8b698e1ec3c9e 100644 > --- a/drivers/pci/controller/dwc/pcie-imx.c > +++ b/drivers/pci/controller/dwc/pcie-imx.c > @@ -55,6 +55,22 @@ > #define IMX95_PE0_GEN_CTRL_3 0x1058 > #define IMX95_PCIE_LTSSM_EN BIT(0) > > +#define IMX95_PE0_LUT_ACSCTRL 0x1008 > +#define IMX95_PEO_LUT_RWA BIT(16) > +#define IMX95_PE0_LUT_ENLOC GENMASK(4, 0) > + > +#define IMX95_PE0_LUT_DATA1 0x100c > +#define IMX95_PE0_LUT_VLD BIT(31) > +#define IMX95_PE0_LUT_DAC_ID GENMASK(10, 8) > +#define IMX95_PE0_LUT_STREAM_ID GENMASK(5, 0) > + > +#define IMX95_PE0_LUT_DATA2 0x1010 > +#define IMX95_PE0_LUT_REQID GENMASK(31, 16) > +#define IMX95_PE0_LUT_MASK GENMASK(15, 0) > + > +#define IMX95_SID_MASK GENMASK(5, 0) > +#define IMX95_MAX_LUT 32 > + > #define to_imx_pcie(x) dev_get_drvdata((x)->dev) > > enum imx_pcie_variants { > @@ -217,6 +233,159 @@ static int imx95_pcie_init_phy(struct imx_pcie > *imx_pcie) > return 0; > } > > +static int imx_pcie_update_lut(struct imx_pcie *imx_pcie, int index, > +u16 reqid, u16 mask, u8 sid) { > + struct dw_pcie *pci = imx_pcie->pci; > + struct device *dev = pci->dev; > + u32 data1, data2; > + > + if (sid >= 64) { > + dev_err(dev, "Too big stream id: %d\n", sid); > + return -EINVAL; > + } > + > + data1 = FIELD_PREP(IMX95_PE0_LUT_DAC_ID, 0); > + data1 |= FIELD_PREP(IMX95_PE0_LUT_STREAM_ID, sid); > + data1 |= IMX95_PE0_LUT_VLD; > + > + regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA1, data1); > + > + data2 = mask; > + data2 |= FIELD_PREP(IMX95_PE0_LUT_REQID, reqid); > + > + regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA2, data2); > + > + regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_ACSCTRL, index); > + > + return 0; > +} > + > +struct imx_of_map { > + u32 bdf; > + u32 phandle; > + u32 sid; > + u32 sid_len; > +}; > + > +static int imx_check_msi_and_smmmu(struct imx_pcie *imx_pcie, > + struct imx_of_map *msi_map, u32 msi_size, u32 > msi_map_mask, > + struct imx_of_map *smmu_map, u32 smmu_size, u32 > smmu_map_mask) { > + struct dw_pcie *pci = imx_pcie->pci; > + struct device *dev = pci->dev; > + int i; > + > + if (msi_map && smmu_map) { > + if (msi_size != smmu_size) > + return -EINVAL; > + if (msi_map_mask != smmu_map_mask) > + return -EINVAL; > + > + for (i = 0; i < msi_size / sizeof(*msi_map); i++) { > + if (msi_map->bdf != smmu_map->bdf) { > + dev_err(dev, "bdf setting is not match\n"); > + return -EINVAL; > + } > + if ((msi_map->sid & IMX95_SID_MASK) != smmu_map->sid) { > + dev_err(dev, "sid setting is not match\n"); > + return -EINVAL; > + } > + if ((msi_map->sid_len & IMX95_SID_MASK) != > smmu_map->sid_len) { > + dev_err(dev, "sid_len setting is not match\n"); > + return -EINVAL; > + } > + } > + } > + > + return 0; > +} > + > +/* > + * Simple static config lut according to dts settings DAC index and > +stream ID used as a match result > + * of LUT pre-allocated and used by PCIes. > + * > + * Currently stream ID from 32-64 for PCIe. > + * 32-40: first PCI bus. > + * 40-48: second PCI bus. > + * > + * DAC_ID is index of TRDC.DAC index, start from 2 at iMX95. > + * ITS [pci(2bit): streamid(6bits)] > + * pci 0 is 0 > + * pci 1 is 3 > + */ > +static int imx_pcie_config_sid(struct imx_pcie *imx_pcie) { > + struct imx_of_map *msi_map = NULL, *smmu_map = NULL, *cur; > + int i, j, lut_index, nr_map, msi_size = 0, smmu_size = 0; > + u32 msi_map_mask = 0xffff, smmu_map_mask = 0xffff; > + struct dw_pcie *pci = imx_pcie->pci; > + struct device *dev = pci->dev; > + u32 mask; > + int size; > + > + of_get_property(dev->of_node, "msi-map", &msi_size); > + if (msi_size) { > + msi_map = devm_kzalloc(dev, msi_size, GFP_KERNEL); > + if (!msi_map) > + return -ENOMEM; > + > + if (of_property_read_u32_array(dev->of_node, "msi-map", (u32 > *)msi_map, > + msi_size / sizeof(u32))) > + return -EINVAL; > + > + of_property_read_u32(dev->of_node, "msi-map-mask", > &msi_map_mask); > + } > + > + cur = msi_map; > + size = msi_size; > + mask = msi_map_mask; > + > + of_get_property(dev->of_node, "iommu-map", &smmu_size); > + if (smmu_size) { > + smmu_map = devm_kzalloc(dev, smmu_size, GFP_KERNEL); > + if (!smmu_map) > + return -ENOMEM; > + > + if (of_property_read_u32_array(dev->of_node, "iommu-map", (u32 > *)smmu_map, > + smmu_size / sizeof(u32))) > + return -EINVAL; > + > + of_property_read_u32(dev->of_node, "smmu_map_mask", > &smmu_map_mask); Refer to Documentation/devicetree/bindings/pci/pci-iommu.txt. It seems that the name of this property should be "iommu-map-mask". Best Regards Richard Zhu > + } > + > + if (imx_check_msi_and_smmmu(imx_pcie, msi_map, msi_size, > msi_map_mask, > + smmu_map, smmu_size, smmu_map_mask)) > + return -EINVAL; > + > + if (!cur) { > + cur = smmu_map; > + size = smmu_size; > + mask = smmu_map_mask; > + } > + > + nr_map = size / (sizeof(*cur)); > + > + lut_index = 0; > + for (i = 0; i < nr_map; i++) { > + for (j = 0; j < cur->sid_len; j++) { > + imx_pcie_update_lut(imx_pcie, lut_index, cur->bdf + j, mask, > + (cur->sid + j) & IMX95_SID_MASK); > + lut_index++; > + } > + cur++; > + > + if (lut_index >= IMX95_MAX_LUT) { > + dev_err(dev, "its-map/iommu-map exceed HW limiation\n"); > + return -EINVAL; > + } > + } > + > + devm_kfree(dev, smmu_map); > + devm_kfree(dev, msi_map); > + > + return 0; > +} > + > static void imx_pcie_configure_type(struct imx_pcie *imx_pcie) { > const struct imx_pcie_drvdata *drvdata = imx_pcie->drvdata; @@ -950,6 > +1119,12 @@ static int imx_pcie_host_init(struct dw_pcie_rp *pp) > goto err_phy_off; > } > > + ret = imx_pcie_config_sid(imx_pcie); > + if (ret < 0) { > + dev_err(dev, "failed to config sid:%d\n", ret); > + goto err_phy_off; > + } > + > imx_setup_phy_mpll(imx_pcie); > > return 0; > > -- > 2.34.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> -----Original Message----- > From: Frank Li <frank.li@nxp.com> > Sent: 2024年3月5日 4:25 > To: Hongxing Zhu <hongxing.zhu@nxp.com>; Lucas Stach > <l.stach@pengutronix.de>; Lorenzo Pieralisi <lpieralisi@kernel.org>; Krzysztof > Wilczyński <kw@linux.com>; Rob Herring <robh@kernel.org>; Bjorn Helgaas > <bhelgaas@google.com>; Shawn Guo <shawnguo@kernel.org>; Sascha Hauer > <s.hauer@pengutronix.de>; Pengutronix Kernel Team <kernel@pengutronix.de>; > Fabio Estevam <festevam@gmail.com>; dl-linux-imx <linux-imx@nxp.com>; > Philipp Zabel <p.zabel@pengutronix.de>; Liam Girdwood > <lgirdwood@gmail.com>; Mark Brown <broonie@kernel.org> > Cc: linux-pci@vger.kernel.org; imx@lists.linux.dev; > linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org; > bpf@vger.kernel.org; Frank Li <frank.li@nxp.com> > Subject: [PATCH v2 6/6] PCI: imx: Config look up table(LUT) to support MSI ITS > and IOMMU for i.MX95 > > i.MX95 need config LUT to convert bpf to stream id. IOMMU and ITS use the > same stream id. Check msi-map and smmu-map and make sure the same PCI bpf > map to the same stream id. Then config LUT related registers. > > Signed-off-by: Frank Li <Frank.Li@nxp.com> > --- > drivers/pci/controller/dwc/pcie-imx.c | 175 > ++++++++++++++++++++++++++++++++++ > 1 file changed, 175 insertions(+) > > diff --git a/drivers/pci/controller/dwc/pcie-imx.c > b/drivers/pci/controller/dwc/pcie-imx.c > index 922bbc0bc1bcd..8b698e1ec3c9e 100644 > --- a/drivers/pci/controller/dwc/pcie-imx.c > +++ b/drivers/pci/controller/dwc/pcie-imx.c > @@ -55,6 +55,22 @@ > #define IMX95_PE0_GEN_CTRL_3 0x1058 > #define IMX95_PCIE_LTSSM_EN BIT(0) > > +#define IMX95_PE0_LUT_ACSCTRL 0x1008 > +#define IMX95_PEO_LUT_RWA BIT(16) > +#define IMX95_PE0_LUT_ENLOC GENMASK(4, 0) > + > +#define IMX95_PE0_LUT_DATA1 0x100c > +#define IMX95_PE0_LUT_VLD BIT(31) > +#define IMX95_PE0_LUT_DAC_ID GENMASK(10, 8) > +#define IMX95_PE0_LUT_STREAM_ID GENMASK(5, 0) > + > +#define IMX95_PE0_LUT_DATA2 0x1010 > +#define IMX95_PE0_LUT_REQID GENMASK(31, 16) > +#define IMX95_PE0_LUT_MASK GENMASK(15, 0) > + > +#define IMX95_SID_MASK GENMASK(5, 0) > +#define IMX95_MAX_LUT 32 > + > #define to_imx_pcie(x) dev_get_drvdata((x)->dev) > > enum imx_pcie_variants { > @@ -217,6 +233,159 @@ static int imx95_pcie_init_phy(struct imx_pcie > *imx_pcie) > return 0; > } > > +static int imx_pcie_update_lut(struct imx_pcie *imx_pcie, int index, > +u16 reqid, u16 mask, u8 sid) { > + struct dw_pcie *pci = imx_pcie->pci; > + struct device *dev = pci->dev; > + u32 data1, data2; > + > + if (sid >= 64) { > + dev_err(dev, "Too big stream id: %d\n", sid); > + return -EINVAL; > + } > + > + data1 = FIELD_PREP(IMX95_PE0_LUT_DAC_ID, 0); > + data1 |= FIELD_PREP(IMX95_PE0_LUT_STREAM_ID, sid); > + data1 |= IMX95_PE0_LUT_VLD; > + > + regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA1, data1); > + > + data2 = mask; > + data2 |= FIELD_PREP(IMX95_PE0_LUT_REQID, reqid); > + > + regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA2, data2); > + > + regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_ACSCTRL, index); > + > + return 0; > +} > + > +struct imx_of_map { > + u32 bdf; > + u32 phandle; > + u32 sid; > + u32 sid_len; > +}; > + > +static int imx_check_msi_and_smmmu(struct imx_pcie *imx_pcie, > + struct imx_of_map *msi_map, u32 msi_size, u32 > msi_map_mask, > + struct imx_of_map *smmu_map, u32 smmu_size, u32 > smmu_map_mask) { > + struct dw_pcie *pci = imx_pcie->pci; > + struct device *dev = pci->dev; > + int i; > + > + if (msi_map && smmu_map) { > + if (msi_size != smmu_size) > + return -EINVAL; > + if (msi_map_mask != smmu_map_mask) > + return -EINVAL; > + > + for (i = 0; i < msi_size / sizeof(*msi_map); i++) { > + if (msi_map->bdf != smmu_map->bdf) { > + dev_err(dev, "bdf setting is not match\n"); > + return -EINVAL; > + } > + if ((msi_map->sid & IMX95_SID_MASK) != smmu_map->sid) { > + dev_err(dev, "sid setting is not match\n"); > + return -EINVAL; > + } > + if ((msi_map->sid_len & IMX95_SID_MASK) != > smmu_map->sid_len) { > + dev_err(dev, "sid_len setting is not match\n"); > + return -EINVAL; > + } > + } > + } > + > + return 0; > +} > + > +/* > + * Simple static config lut according to dts settings DAC index and > +stream ID used as a match result > + * of LUT pre-allocated and used by PCIes. > + * > + * Currently stream ID from 32-64 for PCIe. > + * 32-40: first PCI bus. > + * 40-48: second PCI bus. > + * > + * DAC_ID is index of TRDC.DAC index, start from 2 at iMX95. > + * ITS [pci(2bit): streamid(6bits)] > + * pci 0 is 0 > + * pci 1 is 3 > + */ > +static int imx_pcie_config_sid(struct imx_pcie *imx_pcie) { > + struct imx_of_map *msi_map = NULL, *smmu_map = NULL, *cur; > + int i, j, lut_index, nr_map, msi_size = 0, smmu_size = 0; > + u32 msi_map_mask = 0xffff, smmu_map_mask = 0xffff; > + struct dw_pcie *pci = imx_pcie->pci; > + struct device *dev = pci->dev; > + u32 mask; > + int size; > + > + of_get_property(dev->of_node, "msi-map", &msi_size); > + if (msi_size) { > + msi_map = devm_kzalloc(dev, msi_size, GFP_KERNEL); > + if (!msi_map) > + return -ENOMEM; > + > + if (of_property_read_u32_array(dev->of_node, "msi-map", (u32 > *)msi_map, > + msi_size / sizeof(u32))) > + return -EINVAL; > + > + of_property_read_u32(dev->of_node, "msi-map-mask", > &msi_map_mask); > + } > + > + cur = msi_map; > + size = msi_size; > + mask = msi_map_mask; > + > + of_get_property(dev->of_node, "iommu-map", &smmu_size); > + if (smmu_size) { > + smmu_map = devm_kzalloc(dev, smmu_size, GFP_KERNEL); > + if (!smmu_map) > + return -ENOMEM; > + > + if (of_property_read_u32_array(dev->of_node, "iommu-map", (u32 > *)smmu_map, > + smmu_size / sizeof(u32))) > + return -EINVAL; > + > + of_property_read_u32(dev->of_node, "smmu_map_mask", > &smmu_map_mask); Refer to Documentation/devicetree/bindings/pci/pci-iommu.txt. It seems that the name of this property should be "iommu-map-mask". Best Regards Richard Zhu > + } > + > + if (imx_check_msi_and_smmmu(imx_pcie, msi_map, msi_size, > msi_map_mask, > + smmu_map, smmu_size, smmu_map_mask)) > + return -EINVAL; > + > + if (!cur) { > + cur = smmu_map; > + size = smmu_size; > + mask = smmu_map_mask; > + } > + > + nr_map = size / (sizeof(*cur)); > + > + lut_index = 0; > + for (i = 0; i < nr_map; i++) { > + for (j = 0; j < cur->sid_len; j++) { > + imx_pcie_update_lut(imx_pcie, lut_index, cur->bdf + j, mask, > + (cur->sid + j) & IMX95_SID_MASK); > + lut_index++; > + } > + cur++; > + > + if (lut_index >= IMX95_MAX_LUT) { > + dev_err(dev, "its-map/iommu-map exceed HW limiation\n"); > + return -EINVAL; > + } > + } > + > + devm_kfree(dev, smmu_map); > + devm_kfree(dev, msi_map); > + > + return 0; > +} > + > static void imx_pcie_configure_type(struct imx_pcie *imx_pcie) { > const struct imx_pcie_drvdata *drvdata = imx_pcie->drvdata; @@ -950,6 > +1119,12 @@ static int imx_pcie_host_init(struct dw_pcie_rp *pp) > goto err_phy_off; > } > > + ret = imx_pcie_config_sid(imx_pcie); > + if (ret < 0) { > + dev_err(dev, "failed to config sid:%d\n", ret); > + goto err_phy_off; > + } > + > imx_setup_phy_mpll(imx_pcie); > > return 0; > > -- > 2.34.1
Hi Dimitri,
> -----Original Message-----
> From: Dimitri Sivanich <sivanich@hpe.com>
> Sent: Friday, March 22, 2024 4:51 AM
> To: Thomas Gleixner <tglx@linutronix.de>; Joerg Roedel <joro@8bytes.org>;
> Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>; Will Deacon
> <will@kernel.org>; Robin Murphy <robin.murphy@arm.com>; David
> Woodhouse <dwmw2@infradead.org>; Lu Baolu <baolu.lu@linux.intel.com>;
> Mark Rutland <mark.rutland@arm.com>; Peter Zijlstra
> <peterz@infradead.org>; Arnd Bergmann <arnd@arndb.de>; YueHaibing
> <yuehaibing@huawei.com>; iommu@lists.linux.dev; Dimitri Sivanich
> <sivanich@hpe.com>
> Cc: linux-kernel@vger.kernel.org; Steve Wahl <steve.wahl@hpe.com>;
> Anderson, Russ <russ.anderson@hpe.com>
> Subject: [PATCH v2] iommu/vt-d: Allocate DMAR fault interrupts locally
>
> The Intel IOMMU code currently tries to allocate all DMAR fault interrupt
> vectors on the boot cpu. On large systems with high DMAR counts this
> results in vector exhaustion, and most of the vectors are not initially allocated
> socket local.
>
> Instead, have a cpu on each node do the vector allocation for the DMARs on
> that node. The boot cpu still does the allocation for its node during its boot
> sequence.
>
> Signed-off-by: Dimitri Sivanich <sivanich@hpe.com>
> ---
>
> v2: per Thomas Gleixner, implement this from a DYN CPU hotplug state,
> though
> this implementation runs in CPUHP_AP_ONLINE_DYN space rather than
> CPUHP_BP_PREPARE_DYN space.
>
> drivers/iommu/amd/amd_iommu.h | 2 +-
> drivers/iommu/amd/init.c | 2 +-
> drivers/iommu/intel/dmar.c | 9 +++++++--
> drivers/iommu/irq_remapping.c | 5 ++++- drivers/iommu/irq_remapping.h |
> 2 +-
> include/linux/dmar.h | 2 +-
> 6 files changed, 15 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/iommu/amd/amd_iommu.h
> b/drivers/iommu/amd/amd_iommu.h index f482aab420f7..410c360e7e24
> 100644
> --- a/drivers/iommu/amd/amd_iommu.h
> +++ b/drivers/iommu/amd/amd_iommu.h
> @@ -33,7 +33,7 @@ int amd_iommu_prepare(void); int
> amd_iommu_enable(void); void amd_iommu_disable(void); int
> amd_iommu_reenable(int mode); -int amd_iommu_enable_faulting(void);
> +int amd_iommu_enable_faulting(unsigned int cpu);
> extern int amd_iommu_guest_ir;
> extern enum io_pgtable_fmt amd_iommu_pgtable; extern int
> amd_iommu_gpt_level; diff --git a/drivers/iommu/amd/init.c
> b/drivers/iommu/amd/init.c index e7a44929f0da..4782f690ed97 100644
> --- a/drivers/iommu/amd/init.c
> +++ b/drivers/iommu/amd/init.c
> @@ -3389,7 +3389,7 @@ int amd_iommu_reenable(int mode)
> return 0;
> }
>
> -int __init amd_iommu_enable_faulting(void)
> +int __init amd_iommu_enable_faulting(unsigned int cpu)
> {
> /* We enable MSI later when PCI is initialized */
> return 0;
> diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c index
> 36d7427b1202..7644a42f283c 100644
> --- a/drivers/iommu/intel/dmar.c
> +++ b/drivers/iommu/intel/dmar.c
> @@ -2122,7 +2122,7 @@ int dmar_set_interrupt(struct intel_iommu
> *iommu)
> return ret;
> }
>
> -int __init enable_drhd_fault_handling(void)
> +int enable_drhd_fault_handling(unsigned int cpu)
> {
> struct dmar_drhd_unit *drhd;
> struct intel_iommu *iommu;
> @@ -2132,7 +2132,12 @@ int __init enable_drhd_fault_handling(void)
> */
> for_each_iommu(iommu, drhd) {
> u32 fault_status;
> - int ret = dmar_set_interrupt(iommu);
> + int ret;
> +
> + if (iommu->irq || iommu->node != cpu_to_node(cpu))
> + continue;
If iommu->irq is set, current logic will clear any previous faults by accessing DMAR_FSTS_REG. However, the code change in this patch seems missing it.
The current logic:
int dmar_set_interrupt(struct intel_iommu *iommu)
{
int irq, ret;
/*
* Check if the fault interrupt is already initialized.
*/
if (iommu->irq)
return 0;
...
int __init enable_drhd_fault_handling(void)
{
...
for_each_iommu(iommu, drhd) {
u32 fault_status;
int ret = dmar_set_interrupt(iommu);
if (ret) {
pr_err("DRHD %Lx: failed to enable fault, interrupt, ret %d\n",
(unsigned long long)drhd->reg_base_addr, ret);
return -1;
}
/*
* Clear any previous faults.
*/
dmar_fault(iommu->irq, iommu);
fault_status = readl(iommu->reg + DMAR_FSTS_REG);
writel(fault_status, iommu->reg + DMAR_FSTS_REG);
}
...
Regards,
-Tina
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev In-Reply-To: <1711021557-58116-3-git-send-email-hengqi@linux.alibaba.com> References: <1711021557-58116-3-git-send-email-hengqi@linux.alibaba.com> TO: Heng Qi <hengqi@linux.alibaba.com> TO: netdev@vger.kernel.org TO: virtualization@lists.linux.dev TO: Jason Wang <jasowang@redhat.com> TO: "Michael S. Tsirkin" <mst@redhat.com> TO: Jakub Kicinski <kuba@kernel.org> TO: Paolo Abeni <pabeni@redhat.com> TO: Eric Dumazet <edumazet@google.com> TO: "David S. Miller" <davem@davemloft.net> TO: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Hi Heng, kernel test robot noticed the following build warnings: [auto build test WARNING on linus/master] [also build test WARNING on next-20240321] [cannot apply to v6.8] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Heng-Qi/virtio-net-fix-possible-dim-status-unrecoverable/20240321-194759 base: linus/master patch link: https://lore.kernel.org/r/1711021557-58116-3-git-send-email-hengqi%40linux.alibaba.com patch subject: [PATCH 2/2] virtio-net: reduce the CPU consumption of dim worker :::::: branch date: 16 hours ago :::::: commit date: 16 hours ago config: i386-randconfig-141-20240322 (https://download.01.org/0day-ci/archive/20240322/202403221133.J66oueZh-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403221133.J66oueZh-lkp@intel.com/ New smatch warnings: drivers/net/virtio_net.c:5031 virtnet_probe() warn: missing error code 'err' Old smatch warnings: drivers/net/virtio_net.c:1438 build_skb_from_xdp_buff() error: uninitialized symbol 'nr_frags'. drivers/net/virtio_net.c:1520 virtnet_build_xdp_buff_mrg() error: uninitialized symbol 'shinfo'. drivers/net/virtio_net.c:3943 virtnet_update_settings() error: uninitialized symbol 'virtio_cread_v'. drivers/net/virtio_net.c:4371 virtnet_config_changed_work() error: uninitialized symbol 'virtio_cread_v'. drivers/net/virtio_net.c:4375 virtnet_config_changed_work() error: uninitialized symbol 'v'. vim +/err +5031 drivers/net/virtio_net.c d8cd72f1622753 Heng Qi 2024-03-21 4831 fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4832 static int virtnet_probe(struct virtio_device *vdev) fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4833 { d7dfc5cf56b0e3 Toshiaki Makita 2018-01-17 4834 int i, err = -ENOMEM; fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4835 struct net_device *dev; fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4836 struct virtnet_info *vi; fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4837 u16 max_queue_pairs; 4959aebba8c069 Gavin Li 2022-09-14 4838 int mtu = 0; fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4839 c7114b1249fa3b Andrew Melnychenko 2022-03-28 4840 /* Find if host supports multiqueue/rss virtio_net device */ c7114b1249fa3b Andrew Melnychenko 2022-03-28 4841 max_queue_pairs = 1; c7114b1249fa3b Andrew Melnychenko 2022-03-28 4842 if (virtio_has_feature(vdev, VIRTIO_NET_F_MQ) || virtio_has_feature(vdev, VIRTIO_NET_F_RSS)) c7114b1249fa3b Andrew Melnychenko 2022-03-28 4843 max_queue_pairs = c7114b1249fa3b Andrew Melnychenko 2022-03-28 4844 virtio_cread16(vdev, offsetof(struct virtio_net_config, max_virtqueue_pairs)); 986a4f4d452dec Jason Wang 2012-12-07 4845 986a4f4d452dec Jason Wang 2012-12-07 4846 /* We need at least 2 queue's */ c7114b1249fa3b Andrew Melnychenko 2022-03-28 4847 if (max_queue_pairs < VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN || 986a4f4d452dec Jason Wang 2012-12-07 4848 max_queue_pairs > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX || 986a4f4d452dec Jason Wang 2012-12-07 4849 !virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) 986a4f4d452dec Jason Wang 2012-12-07 4850 max_queue_pairs = 1; 296f96fcfc160e Rusty Russell 2007-10-22 4851 296f96fcfc160e Rusty Russell 2007-10-22 4852 /* Allocate ourselves a network device with room for our info */ 986a4f4d452dec Jason Wang 2012-12-07 4853 dev = alloc_etherdev_mq(sizeof(struct virtnet_info), max_queue_pairs); 296f96fcfc160e Rusty Russell 2007-10-22 4854 if (!dev) 296f96fcfc160e Rusty Russell 2007-10-22 4855 return -ENOMEM; 296f96fcfc160e Rusty Russell 2007-10-22 4856 296f96fcfc160e Rusty Russell 2007-10-22 4857 /* Set up network device as normal. */ ab5bd583b92896 Xuan Zhuo 2021-02-18 4858 dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE | ab5bd583b92896 Xuan Zhuo 2021-02-18 4859 IFF_TX_SKB_NO_LINEAR; 76288b4e573e06 Stephen Hemminger 2009-01-06 4860 dev->netdev_ops = &virtnet_netdev; 296f96fcfc160e Rusty Russell 2007-10-22 4861 dev->features = NETIF_F_HIGHDMA; 3fa2a1df909482 stephen hemminger 2011-06-15 4862 7ad24ea4bf620a Wilfried Klaebe 2014-05-11 4863 dev->ethtool_ops = &virtnet_ethtool_ops; 296f96fcfc160e Rusty Russell 2007-10-22 4864 SET_NETDEV_DEV(dev, &vdev->dev); 296f96fcfc160e Rusty Russell 2007-10-22 4865 296f96fcfc160e Rusty Russell 2007-10-22 4866 /* Do we support "hardware" checksums? */ 98e778c9aa4f4f Michał Mirosław 2011-03-31 4867 if (virtio_has_feature(vdev, VIRTIO_NET_F_CSUM)) { 296f96fcfc160e Rusty Russell 2007-10-22 4868 /* This opens up the world of extra features. */ 48900cb6af4282 Jason Wang 2015-08-05 4869 dev->hw_features |= NETIF_F_HW_CSUM | NETIF_F_SG; 98e778c9aa4f4f Michał Mirosław 2011-03-31 4870 if (csum) 48900cb6af4282 Jason Wang 2015-08-05 4871 dev->features |= NETIF_F_HW_CSUM | NETIF_F_SG; 98e778c9aa4f4f Michał Mirosław 2011-03-31 4872 98e778c9aa4f4f Michał Mirosław 2011-03-31 4873 if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) { e078de03788353 David S. Miller 2017-07-03 4874 dev->hw_features |= NETIF_F_TSO 34a48579e4fb38 Rusty Russell 2008-02-04 4875 | NETIF_F_TSO_ECN | NETIF_F_TSO6; 34a48579e4fb38 Rusty Russell 2008-02-04 4876 } 5539ae9613587e Rusty Russell 2008-05-02 4877 /* Individual feature bits: what can host handle? */ 98e778c9aa4f4f Michał Mirosław 2011-03-31 4878 if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_TSO4)) 98e778c9aa4f4f Michał Mirosław 2011-03-31 4879 dev->hw_features |= NETIF_F_TSO; 98e778c9aa4f4f Michał Mirosław 2011-03-31 4880 if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_TSO6)) 98e778c9aa4f4f Michał Mirosław 2011-03-31 4881 dev->hw_features |= NETIF_F_TSO6; 98e778c9aa4f4f Michał Mirosław 2011-03-31 4882 if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN)) 98e778c9aa4f4f Michał Mirosław 2011-03-31 4883 dev->hw_features |= NETIF_F_TSO_ECN; 418044e1de3063 Andrew Melnychenko 2022-12-07 4884 if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_USO)) 418044e1de3063 Andrew Melnychenko 2022-12-07 4885 dev->hw_features |= NETIF_F_GSO_UDP_L4; 98e778c9aa4f4f Michał Mirosław 2011-03-31 4886 41f2f1273caee2 Jason Wang 2014-12-24 4887 dev->features |= NETIF_F_GSO_ROBUST; 41f2f1273caee2 Jason Wang 2014-12-24 4888 98e778c9aa4f4f Michał Mirosław 2011-03-31 4889 if (gso) e078de03788353 David S. Miller 2017-07-03 4890 dev->features |= dev->hw_features & NETIF_F_ALL_TSO; 98e778c9aa4f4f Michał Mirosław 2011-03-31 4891 /* (!csum && gso) case will be fixed by register_netdev() */ 296f96fcfc160e Rusty Russell 2007-10-22 4892 } 4f49129be6fa9b Thomas Huth 2013-08-27 4893 if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM)) 4f49129be6fa9b Thomas Huth 2013-08-27 4894 dev->features |= NETIF_F_RXCSUM; a02e8964eaf927 Willem de Bruijn 2018-12-20 4895 if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || a02e8964eaf927 Willem de Bruijn 2018-12-20 4896 virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6)) dbcf24d1538844 Jason Wang 2021-08-17 4897 dev->features |= NETIF_F_GRO_HW; cf8691cbc28659 Michael S. Tsirkin 2020-10-21 4898 if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS)) dbcf24d1538844 Jason Wang 2021-08-17 4899 dev->hw_features |= NETIF_F_GRO_HW; 296f96fcfc160e Rusty Russell 2007-10-22 4900 4fda830263c52a Jason Wang 2013-04-10 4901 dev->vlan_features = dev->features; 66c0e13ad236c7 Marek Majtyka 2023-02-01 4902 dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT; 4fda830263c52a Jason Wang 2013-04-10 4903 d0c2c9973ecd26 Jarod Wilson 2016-10-20 4904 /* MTU range: 68 - 65535 */ d0c2c9973ecd26 Jarod Wilson 2016-10-20 4905 dev->min_mtu = MIN_MTU; d0c2c9973ecd26 Jarod Wilson 2016-10-20 4906 dev->max_mtu = MAX_MTU; d0c2c9973ecd26 Jarod Wilson 2016-10-20 4907 296f96fcfc160e Rusty Russell 2007-10-22 4908 /* Configuration may specify what MAC to use. Otherwise random. */ f2edaa4ad5d513 Jakub Kicinski 2021-10-27 4909 if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) { f2edaa4ad5d513 Jakub Kicinski 2021-10-27 4910 u8 addr[ETH_ALEN]; f2edaa4ad5d513 Jakub Kicinski 2021-10-27 4911 855e0c5288177b Rusty Russell 2013-10-14 4912 virtio_cread_bytes(vdev, a586d4f6016f71 Rusty Russell 2008-02-04 4913 offsetof(struct virtio_net_config, mac), f2edaa4ad5d513 Jakub Kicinski 2021-10-27 4914 addr, ETH_ALEN); f2edaa4ad5d513 Jakub Kicinski 2021-10-27 4915 eth_hw_addr_set(dev, addr); f2edaa4ad5d513 Jakub Kicinski 2021-10-27 4916 } else { f2cedb63df1434 Danny Kukawka 2012-02-15 4917 eth_hw_addr_random(dev); 9f62d221a4b0aa Laurent Vivier 2023-01-27 4918 dev_info(&vdev->dev, "Assigned random MAC address %pM\n", 9f62d221a4b0aa Laurent Vivier 2023-01-27 4919 dev->dev_addr); f2edaa4ad5d513 Jakub Kicinski 2021-10-27 4920 } 296f96fcfc160e Rusty Russell 2007-10-22 4921 296f96fcfc160e Rusty Russell 2007-10-22 4922 /* Set up our device-specific information */ 296f96fcfc160e Rusty Russell 2007-10-22 4923 vi = netdev_priv(dev); 296f96fcfc160e Rusty Russell 2007-10-22 4924 vi->dev = dev; 296f96fcfc160e Rusty Russell 2007-10-22 4925 vi->vdev = vdev; d9d5dcc88ca5c7 Christian Borntraeger 2008-02-18 4926 vdev->priv = vi; 827da44c61419f John Stultz 2013-10-07 4927 586d17c5a01bf1 Jason Wang 2012-04-11 4928 INIT_WORK(&vi->config_work, virtnet_config_changed_work); b9f7425239a099 Jason Wang 2023-07-20 4929 INIT_WORK(&vi->rx_mode_work, virtnet_rx_mode_work); 5a159128faff15 Jason Wang 2022-07-25 4930 spin_lock_init(&vi->refill_lock); 296f96fcfc160e Rusty Russell 2007-10-22 4931 30bbf891f1b8fd Lorenzo Bianconi 2023-02-07 4932 if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) { 3f2c31d90327f2 Mark McLoughlin 2008-11-16 4933 vi->mergeable_rx_bufs = true; 30bbf891f1b8fd Lorenzo Bianconi 2023-02-07 4934 dev->xdp_features |= NETDEV_XDP_ACT_RX_SG; 30bbf891f1b8fd Lorenzo Bianconi 2023-02-07 4935 } 3f2c31d90327f2 Mark McLoughlin 2008-11-16 4936 91f41f01d2195d Andrew Melnychenko 2022-03-28 4937 if (virtio_has_feature(vdev, VIRTIO_NET_F_HASH_REPORT)) 91f41f01d2195d Andrew Melnychenko 2022-03-28 4938 vi->has_rss_hash_report = true; 91f41f01d2195d Andrew Melnychenko 2022-03-28 4939 91f41f01d2195d Andrew Melnychenko 2022-03-28 4940 if (virtio_has_feature(vdev, VIRTIO_NET_F_RSS)) c7114b1249fa3b Andrew Melnychenko 2022-03-28 4941 vi->has_rss = true; 91f41f01d2195d Andrew Melnychenko 2022-03-28 4942 91f41f01d2195d Andrew Melnychenko 2022-03-28 4943 if (vi->has_rss || vi->has_rss_hash_report) { c7114b1249fa3b Andrew Melnychenko 2022-03-28 4944 vi->rss_indir_table_size = c7114b1249fa3b Andrew Melnychenko 2022-03-28 4945 virtio_cread16(vdev, offsetof(struct virtio_net_config, c7114b1249fa3b Andrew Melnychenko 2022-03-28 4946 rss_max_indirection_table_length)); c7114b1249fa3b Andrew Melnychenko 2022-03-28 4947 vi->rss_key_size = c7114b1249fa3b Andrew Melnychenko 2022-03-28 4948 virtio_cread8(vdev, offsetof(struct virtio_net_config, rss_max_key_size)); c7114b1249fa3b Andrew Melnychenko 2022-03-28 4949 c7114b1249fa3b Andrew Melnychenko 2022-03-28 4950 vi->rss_hash_types_supported = c7114b1249fa3b Andrew Melnychenko 2022-03-28 4951 virtio_cread32(vdev, offsetof(struct virtio_net_config, supported_hash_types)); c7114b1249fa3b Andrew Melnychenko 2022-03-28 4952 vi->rss_hash_types_supported &= c7114b1249fa3b Andrew Melnychenko 2022-03-28 4953 ~(VIRTIO_NET_RSS_HASH_TYPE_IP_EX | c7114b1249fa3b Andrew Melnychenko 2022-03-28 4954 VIRTIO_NET_RSS_HASH_TYPE_TCP_EX | c7114b1249fa3b Andrew Melnychenko 2022-03-28 4955 VIRTIO_NET_RSS_HASH_TYPE_UDP_EX); c7114b1249fa3b Andrew Melnychenko 2022-03-28 4956 c7114b1249fa3b Andrew Melnychenko 2022-03-28 4957 dev->hw_features |= NETIF_F_RXHASH; c7114b1249fa3b Andrew Melnychenko 2022-03-28 4958 } 91f41f01d2195d Andrew Melnychenko 2022-03-28 4959 91f41f01d2195d Andrew Melnychenko 2022-03-28 4960 if (vi->has_rss_hash_report) 91f41f01d2195d Andrew Melnychenko 2022-03-28 4961 vi->hdr_len = sizeof(struct virtio_net_hdr_v1_hash); 91f41f01d2195d Andrew Melnychenko 2022-03-28 4962 else if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF) || d04302b334bde9 Michael S. Tsirkin 2014-10-24 4963 virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) 012873d057a449 Michael S. Tsirkin 2014-10-24 4964 vi->hdr_len = sizeof(struct virtio_net_hdr_mrg_rxbuf); 012873d057a449 Michael S. Tsirkin 2014-10-24 4965 else 012873d057a449 Michael S. Tsirkin 2014-10-24 4966 vi->hdr_len = sizeof(struct virtio_net_hdr); 012873d057a449 Michael S. Tsirkin 2014-10-24 4967 75993300d008f4 Michael S. Tsirkin 2015-07-15 4968 if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT) || 75993300d008f4 Michael S. Tsirkin 2015-07-15 4969 virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) e7428e95a06fb5 Michael S. Tsirkin 2013-07-25 4970 vi->any_header_sg = true; e7428e95a06fb5 Michael S. Tsirkin 2013-07-25 4971 986a4f4d452dec Jason Wang 2012-12-07 4972 if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) 986a4f4d452dec Jason Wang 2012-12-07 4973 vi->has_cvq = true; 986a4f4d452dec Jason Wang 2012-12-07 4974 14de9d114a82a5 Aaron Conole 2016-06-03 4975 if (virtio_has_feature(vdev, VIRTIO_NET_F_MTU)) { 14de9d114a82a5 Aaron Conole 2016-06-03 4976 mtu = virtio_cread16(vdev, 14de9d114a82a5 Aaron Conole 2016-06-03 4977 offsetof(struct virtio_net_config, 14de9d114a82a5 Aaron Conole 2016-06-03 4978 mtu)); 93a205ee98a488 Aaron Conole 2016-10-25 4979 if (mtu < dev->min_mtu) { fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4980 /* Should never trigger: MTU was previously validated fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4981 * in virtnet_validate. fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4982 */ 7934b481ab1a36 Yuval Shaia 2019-04-03 4983 dev_err(&vdev->dev, 7934b481ab1a36 Yuval Shaia 2019-04-03 4984 "device MTU appears to have changed it is now %d < %d", 7934b481ab1a36 Yuval Shaia 2019-04-03 4985 mtu, dev->min_mtu); 411ea23a76526e Dan Carpenter 2020-12-04 4986 err = -EINVAL; d7dfc5cf56b0e3 Toshiaki Makita 2018-01-17 4987 goto free; fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4988 } fe36cbe0671e86 Michael S. Tsirkin 2017-03-29 4989 d0c2c9973ecd26 Jarod Wilson 2016-10-20 4990 dev->mtu = mtu; 93a205ee98a488 Aaron Conole 2016-10-25 4991 dev->max_mtu = mtu; 14de9d114a82a5 Aaron Conole 2016-06-03 4992 } 14de9d114a82a5 Aaron Conole 2016-06-03 4993 4959aebba8c069 Gavin Li 2022-09-14 4994 virtnet_set_big_packets(vi, mtu); 4959aebba8c069 Gavin Li 2022-09-14 4995 012873d057a449 Michael S. Tsirkin 2014-10-24 4996 if (vi->any_header_sg) 012873d057a449 Michael S. Tsirkin 2014-10-24 4997 dev->needed_headroom = vi->hdr_len; 6ebbc1a6383fe7 Zhangjie \(HZ\ 2014-04-29 4998) 44900010290125 Jason Wang 2016-11-25 4999 /* Enable multiqueue by default */ 44900010290125 Jason Wang 2016-11-25 5000 if (num_online_cpus() >= max_queue_pairs) 44900010290125 Jason Wang 2016-11-25 5001 vi->curr_queue_pairs = max_queue_pairs; 44900010290125 Jason Wang 2016-11-25 5002 else 44900010290125 Jason Wang 2016-11-25 5003 vi->curr_queue_pairs = num_online_cpus(); 986a4f4d452dec Jason Wang 2012-12-07 5004 vi->max_queue_pairs = max_queue_pairs; 986a4f4d452dec Jason Wang 2012-12-07 5005 986a4f4d452dec Jason Wang 2012-12-07 5006 /* Allocate/initialize the rx/tx queues, and invoke find_vqs */ 3f9c10b0d478a3 Amit Shah 2011-12-22 5007 err = init_vqs(vi); d2a7ddda9ffb1c Michael S. Tsirkin 2009-06-12 5008 if (err) d7dfc5cf56b0e3 Toshiaki Makita 2018-01-17 5009 goto free; 296f96fcfc160e Rusty Russell 2007-10-22 5010 3014a0d54820d2 Heng Qi 2023-10-08 5011 if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_NOTF_COAL)) { 3014a0d54820d2 Heng Qi 2023-10-08 5012 vi->intr_coal_rx.max_usecs = 0; 3014a0d54820d2 Heng Qi 2023-10-08 5013 vi->intr_coal_tx.max_usecs = 0; 3014a0d54820d2 Heng Qi 2023-10-08 5014 vi->intr_coal_rx.max_packets = 0; 3014a0d54820d2 Heng Qi 2023-10-08 5015 3014a0d54820d2 Heng Qi 2023-10-08 5016 /* Keep the default values of the coalescing parameters 3014a0d54820d2 Heng Qi 2023-10-08 5017 * aligned with the default napi_tx state. 3014a0d54820d2 Heng Qi 2023-10-08 5018 */ 3014a0d54820d2 Heng Qi 2023-10-08 5019 if (vi->sq[0].napi.weight) 3014a0d54820d2 Heng Qi 2023-10-08 5020 vi->intr_coal_tx.max_packets = 1; 3014a0d54820d2 Heng Qi 2023-10-08 5021 else 3014a0d54820d2 Heng Qi 2023-10-08 5022 vi->intr_coal_tx.max_packets = 0; 3014a0d54820d2 Heng Qi 2023-10-08 5023 } 3014a0d54820d2 Heng Qi 2023-10-08 5024 d8cd72f1622753 Heng Qi 2024-03-21 5025 INIT_LIST_HEAD(&vi->coal_list); 3014a0d54820d2 Heng Qi 2023-10-08 5026 if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_VQ_NOTF_COAL)) { d8cd72f1622753 Heng Qi 2024-03-21 5027 vi->cvq_cmd_nums = 0; d8cd72f1622753 Heng Qi 2024-03-21 5028 vi->dim_loop_index = 0; d8cd72f1622753 Heng Qi 2024-03-21 5029 d8cd72f1622753 Heng Qi 2024-03-21 5030 if (virtnet_init_coal_list(vi)) d8cd72f1622753 Heng Qi 2024-03-21 @5031 goto free; d8cd72f1622753 Heng Qi 2024-03-21 5032 3014a0d54820d2 Heng Qi 2023-10-08 5033 /* The reason is the same as VIRTIO_NET_F_NOTF_COAL. */ d8cd72f1622753 Heng Qi 2024-03-21 5034 for (i = 0; i < vi->max_queue_pairs; i++) { d8cd72f1622753 Heng Qi 2024-03-21 5035 vi->rq[i].packets_in_napi = 0; 3014a0d54820d2 Heng Qi 2023-10-08 5036 if (vi->sq[i].napi.weight) 3014a0d54820d2 Heng Qi 2023-10-08 5037 vi->sq[i].intr_coal.max_packets = 1; 3014a0d54820d2 Heng Qi 2023-10-08 5038 } d8cd72f1622753 Heng Qi 2024-03-21 5039 } 3014a0d54820d2 Heng Qi 2023-10-08 5040 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Please aware that this option will cause potential security risk.
In case that any the guest component only knows one of vTPM or RTMR, and only extends one of vTPM or RTMR, but the other one only verifies the other, then the chain of trust is broken.
This solution is secure if and only if all guest components aware of coexistence, and can ensure all measurements are extended to both vTPM and RTMR.
But I am not sure if all guest components are ready today.
Since this option caused a potential risk / misuse breaking the chain of trust, I recommend we have at least one more company to endorse the runtime co-existence of vTPM and RTMR.
Also, I would like to hear the opinions from other companies.
BTW: A small comment: In EDKII, we don’t use MACRO. Please change to PCD (default false), after you get endorsement from other compony.
Thank you
Yao, Jiewen
> -----Original Message-----
> From: Dionna Amalie Glaze <dionnaglaze@google.com>
> Sent: Friday, March 22, 2024 1:47 AM
> To: qinkun Bao <qinkun@google.com>
> Cc: devel@edk2.groups.io; linux-coco@lists.linux.dev; Aktas, Erdem
> <erdemaktas@google.com>; Yao, Jiewen <jiewen.yao@intel.com>; Ard
> Biesheuvel <ardb@kernel.org>; Peter Gonda <pgonda@google.com>; James
> Bottomley <jejb@linux.ibm.com>; Gerd Hoffmann <kraxel@redhat.com>; Tom
> Lendacky <thomas.lendacky@amd.com>; Michael Roth
> <michael.roth@amd.com>
> Subject: Re: [RFC PATCH] OvmfPkg/SecurityPkg: Add build option for coexistance
> of vTPM and RTMR.
>
> On Thu, Mar 21, 2024 at 9:59 AM qinkun Bao <qinkun@google.com> wrote:
> >
> > From: Qinkun Bao <qinkun@google.com>
> >
> > The UEFI v2.10 spec defines the protocol EFI_CC_MEASUREMENT_PROTOCOL
> > to enable (for example) RTMR-based boot measurement for TDX VMs.
> > With the current UEFI spec’s “should not” wording and EDK2
> > implementation, TPM measurement in TDVF is disabled when
> > RTMR measurement is enabled.
> >
> > Mutual exclusion of the CC measurement protocol and TCG measurement
> > protocol breaks backwards compatibility, which makes adoption of RTMRs
> > challenging. A virtualized TPM device (vTPM) managed by the host VMM
> > makes boot measurements visible to the VMM operator, but this is an
> > oft-requested feature that users can choose to accept.
> >
> > The TPM has been a standard for over a decade and many existing
> > applications rely on the TPM. Both inside and outside Google,
> > we have many users that require vTPM, including features that are
> > not easily available via RTMRs (e.g. sealing using keys that the
> > guest OS cannot access).
> >
> > This patch adds a non-default build option to allow the coexistence
> > of both the CC measurement and TCG protocols. Not included is a
> > vendor-specific measured event in the CC event log that indicates
> > whether a vTPM is attached or not.
>
> Thank you very much for starting this conversation. I'll carry forward
> more context from our more senior engineers.
>
> '
> Not measuring into all possible measurement banks led to
> (CVE-2021-42299) with TPM PCR banks. Let's not repeat this problem.
> Requiring a monumental shift of all attestation-based applications to
> CC_MEASUREMENT_PROTOCOL and CEL in one step is going to make the
> technology very difficult to adopt.
> '
>
> The combination of these requirements means careful rollout of
> attestation verification policies to match the updated behavior of the
> firmware.
> The measured boot components have to be known to correctly measure
> into all available measurement protocols and register banks.
> The firmware has to be known specifically which protocols it makes available.
>
> Now, how this is done is a vendor matter for now. If there is strong
> demand for making vTPM attachment status known for folks who really
> don't want a TPM and don't trust the VMM to not attach one anyway,
> we'll need to agree that the CEL should have an entry for an RTMR0
> update detailing the combination of measurement protocols in use.
> Likewise PCR1 should have an event detailing the protocols in use if
> we want to make CC_MEASUREMENT_PROTOCOL usage configurable.
>
> Philosophizing aside that both protocols should be allowed to be
> active and that the spec should be updated to say something along the
> lines of "all measurement protocols that are active (i.e., any
> combination of EFI_CC_MEASUREMENT_PROTOCOL, EFI_TCG_PROTOCOL,
> EFI_TCG2_PROTOCOL) should have comparable events measured if any one
> protocol receives measurements. All measurement protocols that are
> active MUST measure comparable separator events if any protocol
> receives a separator event." This is crossing a spec boundary between
> USWG and TCG, so I don't know where specifically the language needs to
> go, but we need some language that implementers can use as
> justification for measuring into any found protocol and not just at
> most one.
>
> It's not lost on me that it is similarly difficult to say that all
> protocols that are discoverable need to have comparable events
> measured into them since that _also_ introduces an all-or-nothing
> migration problem, but at least that's more controllable from the
> attestation verification policy side than from the UEFI spec side.
> We're not adding new measurement protocols frequently, so we can get
> the entire boot chain ready for a new measurement protocol before it's
> made discoverable.
>
> >
> > Cc: Erdem Aktas <erdemaktas@google.com>
> > Cc: James Bottomley <jejb@linux.ibm.com>
> > Cc: Jiewen Yao <jiewen.yao@intel.com>
> > Cc: Gerd Hoffmann <kraxel@redhat.com>
> > Cc: Tom Lendacky <thomas.lendacky@amd.com>
> > Cc: Michael Roth <michael.roth@amd.com>
> > Signed-off-by: Qinkun Bao <qinkun@google.com>
> > ---
> > OvmfPkg/OvmfPkgX64.dsc | 9 ++++++++-
> > .../DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c | 12 +++++++++++-
> > .../DxeTpmMeasurementLib/DxeTpmMeasurementLib.c | 6 ++++++
> > 3 files changed, 25 insertions(+), 2 deletions(-)
> >
> > diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
> > index 56c920168d..9bcee45047 100644
> > --- a/OvmfPkg/OvmfPkgX64.dsc
> > +++ b/OvmfPkg/OvmfPkgX64.dsc
> > @@ -32,7 +32,8 @@
> > DEFINE SECURE_BOOT_ENABLE = FALSE
> > DEFINE SMM_REQUIRE = FALSE
> > DEFINE SOURCE_DEBUG_ENABLE = FALSE
> > - DEFINE CC_MEASUREMENT_ENABLE = FALSE
> > + DEFINE CC_MEASUREMENT_ENABLE = TRUE
> > + DEFINE CC_MEASUREMENT_AND_TCG2_COEXIST = FASLE
> >
> > !include OvmfPkg/Include/Dsc/OvmfTpmDefines.dsc.inc
> >
> > @@ -99,6 +100,11 @@
> > INTEL:*_*_X64_GENFW_FLAGS = --keepexceptiontable
> > !endif
> > RELEASE_*_*_GENFW_FLAGS = --zero
> > +!if $(CC_MEASUREMENT_ENABLE) == TRUE &&
> $(CC_MEASUREMENT_AND_TCG2_COEXIST) == TRUE
> > + MSFT:*_*_*_CC_FLAGS = /D
> CC_MEASUREMENT_AND_TCG2_COEXIST_FEATURE
> > + INTEL:*_*_*_CC_FLAGS = /D
> CC_MEASUREMENT_AND_TCG2_COEXIST_FEATURE
> > + GCC:*_*_*_CC_FLAGS = -D
> CC_MEASUREMENT_AND_TCG2_COEXIST_FEATURE
> > +!endif
> >
> > #
> > # Disable deprecated APIs.
> > @@ -1045,6 +1051,7 @@
> > }
> > !endif
> >
> > +
> > #
> > # TPM support
> > #
> > diff --git
> a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c
> b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c
> > index 73719f3b96..4c9bc8ab4a 100644
> > ---
> a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c
> > +++
> b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c
> > @@ -325,7 +325,12 @@ Tcg2MeasureGptTable (
> > }
> >
> > DEBUG ((DEBUG_INFO, "DxeTpm2MeasureBootHandler - Cc
> MeasureGptTable - %r\n", Status));
> > +#ifdef CC_MEASUREMENT_AND_TCG2_COEXIST_FEATURE
>
> On to the less philosophical. Thank you for starting this
> conversation. I do think that this implementation is unideal. These
> kinds of configuration decisions should be implemented in the form of
> a Pcd. Whether that's a static or dynamic Pcd is a matter of whether
> you want to do all the event design of the configuration measurement
> to MR0~PCR1 at the same time.
>
> > + }
> > + if (Tcg2Protocol != NULL) {
> > +#else
> > } else if (Tcg2Protocol != NULL) {
> > +#endif
> > //
> > // If Tcg2Protocol is installed, then Measure GPT data with this protocol.
> > //
> > @@ -493,7 +498,12 @@ Tcg2MeasurePeImage (
> > CcEvent
> > );
> > DEBUG ((DEBUG_INFO, "DxeTpm2MeasureBootHandler - Cc
> MeasurePeImage - %r\n", Status));
> > - } else if (Tcg2Protocol != NULL) {
> > +#ifdef CC_MEASUREMENT_AND_TCG2_COEXIST_FEATURE
> > + }
> > + if (Tcg2Protocol != NULL) {
> > +#else
> > + } else if (Tcg2Protocol != NULL) {
> > +#endif
> > Status = Tcg2Protocol->HashLogExtendEvent (
> > Tcg2Protocol,
> > PE_COFF_IMAGE,
> > diff --git
> a/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c
> b/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c
> > index 6f287b31fc..b1c6198b4b 100644
> > --- a/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c
> > +++
> b/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c
> > @@ -261,7 +261,11 @@ TpmMeasureAndLogData (
> > HashData,
> > HashDataLen
> > );
> > +#ifdef CC_MEASUREMENT_AND_TCG2_COEXIST_FEATURE
> > + }
> > +#else
> > } else {
> > +#endif
> > //
> > // Try to measure using Tpm20 protocol
> > //
> > @@ -287,7 +291,9 @@ TpmMeasureAndLogData (
> > HashDataLen
> > );
> > }
> > +#ifndef CC_MEASUREMENT_AND_TCG2_COEXIST_FEATURE
> > }
> > +#endif
> >
> > return Status;
> > }
> > --
> > 2.44.0.291.gc1ea87d7ee-goog
> >
>
>
> --
> -Dionna Glaze, PhD (she/her)
On Wed, 20 Mar 2024 12:31:17 +0000 "Prasad, Aravinda" <aravinda.prasad@intel.com> wrote: > > > > -----Original Message----- > > From: SeongJae Park <sj@kernel.org> > > Sent: Tuesday, March 19, 2024 10:51 AM > > To: Prasad, Aravinda <aravinda.prasad@intel.com> > > Cc: damon@lists.linux.dev; linux-mm@kvack.org; sj@kernel.org; linux- > > kernel@vger.kernel.org; s2322819@ed.ac.uk; Kumar, Sandeep4 > > <sandeep4.kumar@intel.com>; Huang, Ying <ying.huang@intel.com>; Hansen, > > Dave <dave.hansen@intel.com>; Williams, Dan J <dan.j.williams@intel.com>; > > Subramoney, Sreenivas <sreenivas.subramoney@intel.com>; Kervinen, Antti > > <antti.kervinen@intel.com>; Kanevskiy, Alexander > > <alexander.kanevskiy@intel.com> > > Subject: Re: [PATCH v2 0/3] mm/damon: Profiling enhancements for DAMON > > > > Hi Aravinda, > > > > > > Thank you for posting this new revision! > > > > I remember I told you that I don't see a high level significant problems on on the > > reply to the previous revision of this patch[1], but I show a concern now. > > Sorry for not raising this earlier, but let me explain my humble concerns before > > being even more late. > > Please find my comments below: > > > > > On Mon, 18 Mar 2024 18:58:45 +0530 Aravinda Prasad > > <aravinda.prasad@intel.com> wrote: > > > > > DAMON randomly samples one or more pages in every region and tracks > > > accesses to them using the ACCESSED bit in PTE (or PMD for 2MB pages). > > > When the region size is large (e.g., several GBs), which is common for > > > large footprint applications, detecting whether the region is accessed > > > or not completely depends on whether the pages that are actively > > > accessed in the region are picked during random sampling. > > > If such pages are not picked for sampling, DAMON fails to identify the > > > region as accessed. However, increasing the sampling rate or > > > increasing the number of regions increases CPU overheads of kdamond. > > > > DAMON uses sampling because it considers a region as accessed if a portion of > > the region that big enough to be detected via sampling is all accessed. If a region > > is having some pages that really accessed but the proportion is too small to be > > found via sampling, I think DAMON could say the overall access to the region is > > only modest and could even be ignored. In my humble opinion, this fits with the > > definition of DAMON region: A memory address range that constructed with > > pages having similar access frequency. > > Agree that DAMON considers a region as accessed if a good portion of the region > is accessed. But few points I would like to discuss: > > For large regions (say 10GB, that has 2,621,440 4K pages), sampling at PTE level > will not cover a good portion of the region. For example, default 5ms sampling > and 100ms aggregation samples only 20 4K pages in an aggregation interval. If the 20 attempts all failed at finding any single accessed 4K page, I think it roughly means less than 5% of the region is accessed within the user-specified time (aggregation interval). I would translate that as only tiny portion of the region is accessed within the user-specified time, and hence DAMON is ok to say the region is nearly not accessed. > Increasing sampling to 1 ms and aggregation to 1 second can only cover > 1000 4K pages, but results in higher CPU overheads due to frequent sampling. > Even increasing the aggregation interval to 60 seconds but sampling at 5ms can > only cover 12000 samples, but region splitting and merging happens once > in 60 seconds. At the beginning of each sampling interval, DAMON randomly picks one page per region, clear their accessed bits, wait until the sampling interval is finished, and check the accessed bits again. In other words, DAMON shows only accesses that made in last sampling interval. Increasing number of samples per aggregation interval can help DAMON knows the access frequency of regions in finer granularity, but doesn't allow DAMON see more accesses. Rather than that, if the aggregation interval is fixed (reducing sampling interval), DAMON can show even less amount of accesses. What we need here is giving the workload longer sampling time so that the workload can make access to a size of memory regions that large enough to be found by DAMON. > > In addition, this worsens when region sizes are say 100GB+. We observe that > sampling at PTE level does not help for large regions as more samples are > are required. So, decreasing/increasing the sampling or aggressions intervals > proportional to the region size is not practical as all regions are of not equal > size, we can have 100GB regions as well as many small regions (e.g., 16KB > to 1MB). IMO, it becomes worse because the minimum size of accessed memory regions that can be found by DAMON via sampling has increased together, while you didn't give more sampling time (a.k.a the time to let the workload make accesses that DAMON can show). > So tuning sampling rate and aggregation interval did not help for large > regions. Due to the mechanism of the DAMON's sampling I mentioned above, I think this is what expected. We need to increase sampling interval. > > It can also be observed that large regions cannot be avoided. Large regions > are created by merging adjacent smaller regions or at the beginning of > profiling (depending on min regions parameter which defaults to 10). > Increasing min region reduces the size of regions but increases kdamond > overheads, hence, not preferable. > > So, sampling at PTE level cannot precisely detect accesses to large regions > resulting in inaccuracies, even though it works for small regions. > From our experiments, we found that with 10% hot data in a large region > (80+GB regions in a 1TB+ footprint application), DAMON was not able to > detect a single access to that region in 95+% cases with different sample > and aggregation interval combinations. But DAMON works good for > applications with footprint <50GB where regions are typically small. > > Now consider the scenario with the proposed enhancement. With a > 100GB region, if we sample a PUD entry that covers 1GB address > space, then the default 5ms sampling and 100ms aggregation samples > 20 PUD entries that is 20 GB portion of the region. This gives a good > estimate of the portion of the region that is accessed. But the downside > is that as PUD accessed bit is set even if a small set of pages are accessed > under its subtree this can report more access as real as you noted. > > But such large regions are split into two in the next aggregation interval. > As the splitting of the regions continues, in next few aggregation intervals > many smaller regions are formed. Once smaller regions are formed, > the proposed enhancement cannot pick higher levels of the page table > tree and behaves as good as default DAMON. So, with the proposed > enhancement, larger regions are quickly split into smaller regions if they > have only small set of pages accessed. I fully agree. This is what could be a real and important benefits. > > To avoid misinterpreting region access count, I feel that the "age" of the > region is of real help and should be considered by both DAMON and the > proposed enhancement. If the age of a region is small (<10) then that > region should not be considered stable and hence should not be > considered for any memory tiering decisions. For regions with age, > say >10, can be considered as stable as they reflect the actual access > frequency. I think this is a good approach, but difficult to be used by default. I think we might be able to get the benefit without making problem at the over-reporting accesses by using the high level accessed bit check results as a hint for better quality of region split? Also, if we can allow large enough age, the random region split will eventually find the small hot regions even without high level accessed bit hint. Of course the hint could help finding it earlier. I think that was one of my comment on the first version of this patch. > > > > > > > > > This patch proposes profiling different levels of the > > > application\u2019s page table tree to detect whether a region is > > > accessed or not. This patch set is based on the observation that, when > > > the accessed bit for a page is set, the accessed bits at the higher > > > levels of the page table tree (PMD/PUD/PGD) corresponding to the path > > > of the page table walk are also set. Hence, it is efficient to check > > > the accessed bits at the higher levels of the page table tree to > > > detect whether a region is accessed or not. For example, if the access > > > bit for a PUD entry is set, then one or more pages in the 1GB PUD > > > subtree is accessed as each PUD entry covers 1GB mapping. Hence, > > > instead of sampling thousands of 4K/2M pages to detect accesses in a > > > large region, sampling at the higher level of page table tree is faster and > > efficient. > > > > Due to the above reason, I concern this could result in making DAMON monitoring > > results be inaccurately biased to report more than real accesses. > > DAMON, even without the proposed enhancement, can result in inaccuracies > for large regions, (see examples above). I think temporarily missing such tiny portion of accesses is not a critical problem. If this is a problem, the user should increase the sampling interval in my opinion. That said, as mentioned above, DAMON would better to improve its regions split mechanism. > > > > > > > > > This patch set is based on 6.8-rc5 kernel (commit: f48159f8, > > > mm-unstable > > > tree) > > > > > > Changes since v1 [1] > > > ==================== > > > > > > - Added support for 5-level page table tree > > > - Split the patch to mm infrastructure changes and DAMON enhancements > > > - Code changes as per comments on v1 > > > - Added kerneldoc comments > > > > > > [1] https://lkml.org/lkml/2023/12/15/272 > > > > > > Evaluation: > > > > > > - MASIM benchmark with 1GB, 10GB, 100GB footprint with 10% hot data > > > and 5TB with 10GB hot data. > > > - DAMON: 5ms sampling, 200ms aggregation interval. Rest all > > > parameters set to default value. > > > - DAMON+PTP: Page table profiling applied to DAMON with the above > > > parameters. > > > > > > Profiling efficiency in detecting hot data: > > > > > > Footprint 1GB 10GB 100GB 5TB > > > --------------------------------------------- > > > DAMON >90% <50% ~0% 0% > > > DAMON+PTP >90% >90% >90% >90% > > > > Sampling interval is the time interval that assumed to be large enough for the > > workload to make meaningful amount of accesses within the interval. Hence, > > meaningful amount of sampling interval depends on the workload's characteristic > > and system's memory bandwidth. > > > > Here, the size of the hot memory region is about 100MB, 1GB, 10GB, and 10GB > > for the four cases, respectively. And you set the sampling interval as 5ms. Let's > > assume the system can access, say, 50 GB per second, and hence it could be able > > to access only up to 250 MB per 5ms. So, in case of 1GB and footprint, all hot > > memory region would be accessed while DAMON is waiting for next sampling > > interval. Hence, DAMON would be able to see most accesses via sampling. But > > for 100GB footprint case, only 250MB / 10GB = about 2.5% of the hot memory > > region would be accessed between the sampling interval. DAMON cannot see > > whole accesses, and hence the precision could be low. > > > > I don't know exact memory bandwith of the system, but to detect the 10 GB hot > > region with 5ms sampling interval, the system should be able to access 2GB > > memory per millisecond, or about 2TB memory per second. I think systems of > > such memory bandwidth is not that common. > > > > I show you also explored a configuration setting the aggregation interval higher. > > But because each sampling checks only access between the sampling interval, > > that might not help in this setup. I'm wondering if you also explored increasing > > sampling interval. > > > > What we have observed that many real-world benchmarks we experimented > with do not saturate the memory bandwidth. We also experimented with > masim microbenchmark to understand the impact on memory access rate > (we inserted delay between memory access operations in do_rnd_ro() and > other functions). We see decrease in the precision as access intensity is > reduced. We have experimented with different sampling and aggregation > intervals, but that did not help much in improving precision. Again, please note that DAMON can show only accesses made between each sampling interval at a time. The important factor for expectation of DAMON's accuracy is, the balance between the memory access intensity of the workload, and the length of the sampling interval. The workload should be access intensive enough to make sufficient amount of accesses between sampling interval. The sampling interval should be long enough to allow the workload makes sufficient amount of accesses within the time interval. The fact that the workloads were not saturating the memory bandwidth is not enough to know if that means the workload was memory intensive enough, and the sampling interval was long enough. I was mentioning the memory bandwidth as only the maximum memory intensity of the system that could be achieved. > > So, what I think is it that most of the cases the precision depends on the page > (hot or cold) that is randomly picked for sampling than the sampling rate. Most > of the time only cold 4K pages are picked in a large region as they typically > account for 90% of the pages in the region and hence DAMON does not > detect any accesses at all. By profiling higher levels of the page table tree > this can be improved. Again, agreed. This is an important and grateful finding. Thank you. And again as mentioned above, I don't think we can merge this patch as is, but we could think about using the high level access bit check results as a hint to better split the regions. Indeed, DAMON's monitoring mechanism has many rooms for improvements. I also have some ideas but my time was more spent on more capabilities of DAMON/DAMOS so far. It was a bit intentional proiority setting since I got no real DAMON accuracy problem report from the production usage, and improving the accuracy will deliver the benefit to all DAMON/DAMOS features. Since an important milestone of DAMOS, namely auto-tuning, has merged into the mainline, I think I may better to spend more time on monitoring accuracy improvement. I have some immature ideas in my head. I will try to summarize and share the ideas in near future. > > > Sorry again for finding this concern not early enough. But I think we may need to > > discuss about this first. > > Absolutely no problem. Please let me know your thoughts. Thank you for patiently walking with me :) Thanks, SJ > > Regards, > Aravinda > > > > > [1] https://lkml.kernel.org/r/20231215201159.73845-1-sj@kernel.org > > > > > > Thanks, > > SJ > > > > > > > > > > CPU overheads (in billion cycles) for kdamond: > > > > > > Footprint 1GB 10GB 100GB 5TB > > > --------------------------------------------- > > > DAMON 1.15 19.53 3.52 9.55 > > > DAMON+PTP 0.83 3.20 1.27 2.55 > > > > > > A detailed explanation and evaluation can be found in the arXiv paper: > > > https://arxiv.org/pdf/2311.10275.pdf > > > > > > > > > Aravinda Prasad (3): > > > mm/damon: mm infrastructure support > > > mm/damon: profiling enhancement > > > mm/damon: documentation updates > > > > > > Documentation/mm/damon/design.rst | 42 ++++++ > > > arch/x86/include/asm/pgtable.h | 20 +++ > > > arch/x86/mm/pgtable.c | 28 +++- > > > include/linux/mmu_notifier.h | 36 +++++ > > > include/linux/pgtable.h | 79 ++++++++++ > > > mm/damon/vaddr.c | 233 ++++++++++++++++++++++++++++-- > > > 6 files changed, 424 insertions(+), 14 deletions(-) > > > > > > -- > > > 2.21.3
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: "Darrick J. Wong" <darrick.wong@oracle.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git twf-hoist head: 709c2aed7586c3ac6a9d636355c623611d5c14d1 commit: f0f93bf8ee6030bdb20d406b20b6632cac7aa8bc [568/627] iomap: dynamically allocate fsverity bioset :::::: branch date: 20 hours ago :::::: commit date: 20 hours ago config: x86_64-randconfig-161-20240321 (https://download.01.org/0day-ci/archive/20240322/202403220530.n4a9KVdg-lkp@intel.com/config) compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403220530.n4a9KVdg-lkp@intel.com/ smatch warnings: fs/iomap/buffered-io.c:364 iomap_fsverity_init_bioset() warn: missing error code 'error' vim +/error +364 fs/iomap/buffered-io.c f0f93bf8ee6030 Darrick J. Wong 2024-03-20 342 f0f93bf8ee6030 Darrick J. Wong 2024-03-20 343 static int iomap_fsverity_init_bioset(void) f0f93bf8ee6030 Darrick J. Wong 2024-03-20 344 { f0f93bf8ee6030 Darrick J. Wong 2024-03-20 345 struct bio_set *bs, *old; f0f93bf8ee6030 Darrick J. Wong 2024-03-20 346 int error; f0f93bf8ee6030 Darrick J. Wong 2024-03-20 347 f0f93bf8ee6030 Darrick J. Wong 2024-03-20 348 bs = kmalloc(sizeof(*bs), GFP_KERNEL); f0f93bf8ee6030 Darrick J. Wong 2024-03-20 349 if (!bs) f0f93bf8ee6030 Darrick J. Wong 2024-03-20 350 return -ENOMEM; f0f93bf8ee6030 Darrick J. Wong 2024-03-20 351 f0f93bf8ee6030 Darrick J. Wong 2024-03-20 352 error = bioset_init(bs, IOMAP_FSVERITY_POOL_SIZE, f0f93bf8ee6030 Darrick J. Wong 2024-03-20 353 offsetof(struct iomap_fsverity_bio, bio), f0f93bf8ee6030 Darrick J. Wong 2024-03-20 354 BIOSET_NEED_BVECS); f0f93bf8ee6030 Darrick J. Wong 2024-03-20 355 if (error) f0f93bf8ee6030 Darrick J. Wong 2024-03-20 356 goto out_exit; f0f93bf8ee6030 Darrick J. Wong 2024-03-20 357 f0f93bf8ee6030 Darrick J. Wong 2024-03-20 358 /* f0f93bf8ee6030 Darrick J. Wong 2024-03-20 359 * This has to be atomic as readaheads can race to create the f0f93bf8ee6030 Darrick J. Wong 2024-03-20 360 * bioset. If someone set the pointer before us, we drop ours. f0f93bf8ee6030 Darrick J. Wong 2024-03-20 361 */ f0f93bf8ee6030 Darrick J. Wong 2024-03-20 362 old = cmpxchg(&iomap_fsverity_bioset, NULL, bs); f0f93bf8ee6030 Darrick J. Wong 2024-03-20 363 if (old) f0f93bf8ee6030 Darrick J. Wong 2024-03-20 @364 goto out_exit; f0f93bf8ee6030 Darrick J. Wong 2024-03-20 365 f0f93bf8ee6030 Darrick J. Wong 2024-03-20 366 return 0; f0f93bf8ee6030 Darrick J. Wong 2024-03-20 367 out_exit: f0f93bf8ee6030 Darrick J. Wong 2024-03-20 368 bioset_exit(bs); f0f93bf8ee6030 Darrick J. Wong 2024-03-20 369 kfree(bs); f0f93bf8ee6030 Darrick J. Wong 2024-03-20 370 return error; f0f93bf8ee6030 Darrick J. Wong 2024-03-20 371 } a4c740bf529f43 Andrey Albershteyn 2024-03-13 372 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: cros-kernel-buildreports@googlegroups.com tree: https://android.googlesource.com/kernel/common android14-6.1 head: 24850809220d9e09bb48c47d83b971a3d247e467 commit: 8a2f432fcb4a6c2deed12afa3d2b76fcb6dc8ada [6/8] ANDROID: block: Add support for filesystem requests and small segments :::::: branch date: 4 hours ago :::::: commit date: 22 hours ago config: x86_64-randconfig-161-20240321 (https://download.01.org/0day-ci/archive/20240322/202403220441.8DiNyGzH-lkp@intel.com/config) compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project.git 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403220441.8DiNyGzH-lkp@intel.com/ New smatch warnings: block/blk.h:347 bio_may_exceed_limits() error: we previously assumed 'bio->bi_io_vec' could be null (see line 343) block/blk.h:347 bio_may_exceed_limits() error: we previously assumed 'bio->bi_io_vec' could be null (see line 343) Old smatch warnings: block/blk-mq.c:3144 blk_rq_prep_clone() error: uninitialized symbol 'bio'. vim +347 block/blk.h 83d016ac86428d Bart Van Assche 2018-01-17 312 3ad5cee5cd000d Christoph Hellwig 2020-03-24 313 ssize_t part_size_show(struct device *dev, struct device_attribute *attr, 3ad5cee5cd000d Christoph Hellwig 2020-03-24 314 char *buf); 3ad5cee5cd000d Christoph Hellwig 2020-03-24 315 ssize_t part_stat_show(struct device *dev, struct device_attribute *attr, 3ad5cee5cd000d Christoph Hellwig 2020-03-24 316 char *buf); 3ad5cee5cd000d Christoph Hellwig 2020-03-24 317 ssize_t part_inflight_show(struct device *dev, struct device_attribute *attr, 3ad5cee5cd000d Christoph Hellwig 2020-03-24 318 char *buf); 3ad5cee5cd000d Christoph Hellwig 2020-03-24 319 ssize_t part_fail_show(struct device *dev, struct device_attribute *attr, 3ad5cee5cd000d Christoph Hellwig 2020-03-24 320 char *buf); 3ad5cee5cd000d Christoph Hellwig 2020-03-24 321 ssize_t part_fail_store(struct device *dev, struct device_attribute *attr, 3ad5cee5cd000d Christoph Hellwig 2020-03-24 322 const char *buf, size_t count); 581d4e28d9195a Jens Axboe 2008-09-14 323 ssize_t part_timeout_show(struct device *, struct device_attribute *, char *); 581d4e28d9195a Jens Axboe 2008-09-14 324 ssize_t part_timeout_store(struct device *, struct device_attribute *, 581d4e28d9195a Jens Axboe 2008-09-14 325 const char *, size_t); 581d4e28d9195a Jens Axboe 2008-09-14 326 c55ddd9082f757 Christoph Hellwig 2022-07-27 327 static inline bool bio_may_exceed_limits(struct bio *bio, c55ddd9082f757 Christoph Hellwig 2022-07-27 328 struct queue_limits *lim) abd45c159df5fc Jens Axboe 2021-10-13 329 { abd45c159df5fc Jens Axboe 2021-10-13 330 switch (bio_op(bio)) { abd45c159df5fc Jens Axboe 2021-10-13 331 case REQ_OP_DISCARD: abd45c159df5fc Jens Axboe 2021-10-13 332 case REQ_OP_SECURE_ERASE: abd45c159df5fc Jens Axboe 2021-10-13 333 case REQ_OP_WRITE_ZEROES: abd45c159df5fc Jens Axboe 2021-10-13 334 return true; /* non-trivial splitting decisions */ abd45c159df5fc Jens Axboe 2021-10-13 335 default: abd45c159df5fc Jens Axboe 2021-10-13 336 break; abd45c159df5fc Jens Axboe 2021-10-13 337 } abd45c159df5fc Jens Axboe 2021-10-13 338 abd45c159df5fc Jens Axboe 2021-10-13 339 /* 8a2f432fcb4a6c Bart Van Assche 2023-06-12 340 * Check whether bio splitting should be performed. This check may 8a2f432fcb4a6c Bart Van Assche 2023-06-12 341 * trigger the bio splitting code even if splitting is not necessary. abd45c159df5fc Jens Axboe 2021-10-13 342 */ 8a2f432fcb4a6c Bart Van Assche 2023-06-12 @343 if (blk_queue_sub_page_limits(lim) && bio->bi_io_vec && 8a2f432fcb4a6c Bart Van Assche 2023-06-12 344 bio->bi_io_vec->bv_len > lim->max_segment_size) 8a2f432fcb4a6c Bart Van Assche 2023-06-12 345 return true; c55ddd9082f757 Christoph Hellwig 2022-07-27 346 return lim->chunk_sectors || bio->bi_vcnt != 1 || abd45c159df5fc Jens Axboe 2021-10-13 @347 bio->bi_io_vec->bv_len + bio->bi_io_vec->bv_offset > PAGE_SIZE; abd45c159df5fc Jens Axboe 2021-10-13 348 } abd45c159df5fc Jens Axboe 2021-10-13 349 :::::: The code at line 347 was first introduced by commit :::::: abd45c159df5fcb7ac820e2825dac85de7c01c21 block: handle fast path of bio splitting inline :::::: TO: Jens Axboe <axboe@kernel.dk> :::::: CC: Jens Axboe <axboe@kernel.dk> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Baoquan, On 21/03/2024 14:17, Baoquan He wrote: > On 03/21/24 at 05:40am, Zhijian Li (Fujitsu) wrote: >> ping >> >> >> Any comment is welcome. > > I will have a look at this from kdump side. How do you test your code? Thanks for your support. - nothing change is required for makedumpfile and crash-utils - nothing change is required for kexe-utils if you are using kexec_file_load(2) - kexec-tool needs apply below patch if you are using kexec_load(2), After the coredump is collected, crash-utils is able to inspect the device backed vmemmap memory. From 4a2f0f91cdd8b084bb4ebafdc4f71b8e2a333720 Mon Sep 17 00:00:00 2001 From: Li Zhijian <lizhijian@fujitsu.com> Date: Fri, 1 Mar 2024 13:44:36 +0800 Subject: [PATCH] consider device_backed_vmemmap dumpable Signed-off-by: Li Zhijian <lizhijian@fujitsu.com> --- kexec/arch/i386/crashdump-x86.c | 2 ++ kexec/arch/i386/kexec-x86-common.c | 3 +++ kexec/crashdump-elf.c | 2 +- kexec/kexec.h | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c index a01031e570aa..757922dc3a57 100644 --- a/kexec/arch/i386/crashdump-x86.c +++ b/kexec/arch/i386/crashdump-x86.c @@ -284,6 +284,8 @@ static int get_crash_memory_ranges(struct memory_range **range, int *ranges, type = RANGE_PRAM; } else if(memcmp(str,"Persistent Memory\n",18) == 0 ) { type = RANGE_PMEM; + } else if (memcmp(str, "Device Backed Vmemmap\n", 22)) { + type = RANGE_DEVICE_BACKED_VMEMMAP; } else if(memcmp(str,"reserved\n",9) == 0 ) { type = RANGE_RESERVED; } else if (memcmp(str, "Reserved\n", 9) == 0) { diff --git a/kexec/arch/i386/kexec-x86-common.c b/kexec/arch/i386/kexec-x86-common.c index ffc95a9e43f8..0dd76903e7fc 100644 --- a/kexec/arch/i386/kexec-x86-common.c +++ b/kexec/arch/i386/kexec-x86-common.c @@ -111,6 +111,9 @@ static int get_memory_ranges_proc_iomem(struct memory_range **range, int *ranges else if (memcmp(str, "Persistent Memory\n", 18) == 0) { type = RANGE_PMEM; } + else if (memcmp(str, "Device Backed Vmemmap\n", 22)) { + type = RANGE_DEVICE_BACKED_VMEMMAP; + } else { continue; } diff --git a/kexec/crashdump-elf.c b/kexec/crashdump-elf.c index b8bb686a17ca..98ad854e3f8d 100644 --- a/kexec/crashdump-elf.c +++ b/kexec/crashdump-elf.c @@ -199,7 +199,7 @@ int FUNC(struct kexec_info *info, * A seprate program header for Backup Region*/ for (i = 0; i < ranges; i++, range++) { unsigned long long mstart, mend; - if (range->type != RANGE_RAM) + if (range->type != RANGE_RAM || range->type != RANGE_DEVICE_BACKED_VMEMMAP) continue; mstart = range->start; mend = range->end; diff --git a/kexec/kexec.h b/kexec/kexec.h index 1004aff15945..c0481bb2727d 100644 --- a/kexec/kexec.h +++ b/kexec/kexec.h @@ -139,6 +139,7 @@ struct memory_range { #define RANGE_UNCACHED 4 #define RANGE_PMEM 6 #define RANGE_PRAM 11 +#define RANGE_DEVICE_BACKED_VMEMMAP 12 }; struct memory_ranges { -- 2.29.2 > > By the way, there's issue reported by test robot. I see, i have fixed it locally which doesn't matter for this feature(it fails in !ZONE_DEVICE) Thanks Zhijian > > Thanks > Baoquan > >> >> >> On 06/03/2024 18:28, Li Zhijian wrote: >>> Hello folks, >>> >>> Compared with the V2[1] I posted a long time ago, this time it is a >>> completely new proposal design. >>> >>> ### Background and motivate overview ### >>> --- >>> Crash dump is an important feature for troubleshooting the kernel. It is the >>> final way to chase what happened at the kernel panic, slowdown, and so on. It >>> is one of the most important tools for customer support. >>> >>> Currently, there are 2 syscalls(kexec_file_load(2) and kexec_load(2)) to >>> configure the dumpable regions. Generally, (A)iomem resources registered with >>> flags (IORESOURCE_SYSTEM_RAM | IORESOUCE_BUSY) for kexec_file_load(2) or >>> (B)iomem resources registered with "System RAM" name prefix for kexec_load(2) >>> are dumpable. >>> >>> The pmem use cases including fsdax and devdax, could map their vmemmap to >>> their own devices. In this case, these part of vmemmap will not be dumped when >>> crash happened since these regions are satisfied with neither the above (A) >>> nor (B). >>> >>> In fsdax, the vmemmap(struct page array) becomes very important, it is one of >>> the key data to find status of reverse map. Lacking of the information may >>> cause difficulty to analyze trouble around pmem (especially Filesystem-DAX). >>> That means troubleshooters are unable to check more details about pmem from >>> the dumpfile. >>> >>> ### Proposal ### >>> --- >>> In this proposal, register the device backed vmemmap as a separate resource. >>> This resource has its own new flag and name, and then teaches kexec_file_load(2) >>> and kexec_load(2) to mark it as dumpable. >>> >>> Proposed flag: IORESOURCE_DEVICE_BACKED_VMEMMAP >>> Proposed name: "Device Backed Vmemmap" >>> >>> NOTE: crash-utils also needs to adapt to this new name for kexec_load() >>> >>> With current proposal, the /proc/iomem should show as following for device >>> backed vmemmap >>> # cat /proc/iomem >>> ... >>> fffc0000-ffffffff : Reserved >>> 100000000-13fffffff : Persistent Memory >>> 100000000-10fffffff : namespace0.0 >>> 100000000-1005fffff : Device Backed Vmemmap # fsdax >>> a80000000-b7fffffff : CXL Window 0 >>> a80000000-affffffff : Persistent Memory >>> a80000000-affffffff : region1 >>> a80000000-a811fffff : namespace1.0 >>> a80000000-a811fffff : Device Backed Vmemmap # devdax >>> a81200000-abfffffff : dax1.0 >>> b80000000-c7fffffff : CXL Window 1 >>> c80000000-147fffffff : PCI Bus 0000:00 >>> c80000000-c801fffff : PCI Bus 0000:01 >>> ... >>> >>> ### Kdump service reloading ### >>> --- >>> Once the kdump service is loaded, if changes to CPUs or memory occur, >>> either by hot un/plug or off/onlining, the crash elfcorehdr should also >>> be updated. There are 2 approaches to make the reloading more efficient. >>> 1) Use udev rules to watch CPU and memory events, then reload kdump >>> 2) Enable kernel crash hotplug to automatically reload elfcorehdr (>= 6.5) >>> >>> This reloading also needed when device backed vmemmap layouts change, Similar >>> to what 1) does now, one could add the following as the first lines to the >>> RHEL udev rule file /usr/lib/udev/rules.d/98-kexec.rules: >>> >>> # namespace updated: watch daxX.Y(devdax) and pfnX.Y(fsdax) of nd >>> SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="bind", GOTO="kdump_reload" >>> SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="unbind", GOTO="kdump_reload" >>> # devdax <-> system-ram updated: watch daxX.Y of dax >>> SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="bind", GOTO="kdump_reload" >>> SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="unbind", GOTO="kdump_reload" >>> >>> Regarding 2), my idea is that it would need to call the memory_notify() in >>> devm_memremap_pages_release() and devm_memremap_pages() to trigger the crash >>> hotplug. This part is not yet mature, but it does not affect the whole feature >>> because we can still use method 1) alternatively. >>> >>> [1] https://lore.kernel.org/lkml/02066f0f-dbc0-0388-4233-8e24b6f8435b@fujitsu.com/T/ >>> -------------------------------------------- >>> changes from V2[1] >>> - new proposal design >>> >>> CC: Alison Schofield <alison.schofield@intel.com> >>> CC: Andrew Morton <akpm@linux-foundation.org> >>> CC: Baoquan He <bhe@redhat.com> >>> CC: Borislav Petkov <bp@alien8.de> >>> CC: Dan Williams <dan.j.williams@intel.com> >>> CC: Dave Hansen <dave.hansen@linux.intel.com> >>> CC: Dave Jiang <dave.jiang@intel.com> >>> CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org> >>> CC: "H. Peter Anvin" <hpa@zytor.com> >>> CC: Ingo Molnar <mingo@redhat.com> >>> CC: Ira Weiny <ira.weiny@intel.com> >>> CC: Thomas Gleixner <tglx@linutronix.de> >>> CC: Vishal Verma <vishal.l.verma@intel.com> >>> CC: linux-cxl@vger.kernel.org >>> CC: linux-mm@kvack.org >>> CC: nvdimm@lists.linux.dev >>> CC: x86@kernel.org >>> >>> Li Zhijian (7): >>> mm: memremap: register/unregister altmap region to a separate resource >>> mm: memremap: add pgmap_parent_resource() helper >>> nvdimm: pmem: assign a parent resource for vmemmap region for the >>> fsdax >>> dax: pmem: assign a parent resource for vmemmap region for the devdax >>> resource: Introduce walk device_backed_vmemmap res() helper >>> x86/crash: make device backed vmemmap dumpable for kexec_file_load >>> nvdimm: set force_raw=1 in kdump kernel >>> >>> arch/x86/kernel/crash.c | 5 +++++ >>> drivers/dax/pmem.c | 8 ++++++-- >>> drivers/nvdimm/namespace_devs.c | 3 +++ >>> drivers/nvdimm/pmem.c | 9 ++++++--- >>> include/linux/ioport.h | 4 ++++ >>> include/linux/memremap.h | 4 ++++ >>> kernel/resource.c | 13 +++++++++++++ >>> mm/memremap.c | 30 +++++++++++++++++++++++++++++- >>> 8 files changed, 70 insertions(+), 6 deletions(-) >>> > _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec
Baoquan, On 21/03/2024 14:17, Baoquan He wrote: > On 03/21/24 at 05:40am, Zhijian Li (Fujitsu) wrote: >> ping >> >> >> Any comment is welcome. > > I will have a look at this from kdump side. How do you test your code? Thanks for your support. - nothing change is required for makedumpfile and crash-utils - nothing change is required for kexe-utils if you are using kexec_file_load(2) - kexec-tool needs apply below patch if you are using kexec_load(2), After the coredump is collected, crash-utils is able to inspect the device backed vmemmap memory. From 4a2f0f91cdd8b084bb4ebafdc4f71b8e2a333720 Mon Sep 17 00:00:00 2001 From: Li Zhijian <lizhijian@fujitsu.com> Date: Fri, 1 Mar 2024 13:44:36 +0800 Subject: [PATCH] consider device_backed_vmemmap dumpable Signed-off-by: Li Zhijian <lizhijian@fujitsu.com> --- kexec/arch/i386/crashdump-x86.c | 2 ++ kexec/arch/i386/kexec-x86-common.c | 3 +++ kexec/crashdump-elf.c | 2 +- kexec/kexec.h | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c index a01031e570aa..757922dc3a57 100644 --- a/kexec/arch/i386/crashdump-x86.c +++ b/kexec/arch/i386/crashdump-x86.c @@ -284,6 +284,8 @@ static int get_crash_memory_ranges(struct memory_range **range, int *ranges, type = RANGE_PRAM; } else if(memcmp(str,"Persistent Memory\n",18) == 0 ) { type = RANGE_PMEM; + } else if (memcmp(str, "Device Backed Vmemmap\n", 22)) { + type = RANGE_DEVICE_BACKED_VMEMMAP; } else if(memcmp(str,"reserved\n",9) == 0 ) { type = RANGE_RESERVED; } else if (memcmp(str, "Reserved\n", 9) == 0) { diff --git a/kexec/arch/i386/kexec-x86-common.c b/kexec/arch/i386/kexec-x86-common.c index ffc95a9e43f8..0dd76903e7fc 100644 --- a/kexec/arch/i386/kexec-x86-common.c +++ b/kexec/arch/i386/kexec-x86-common.c @@ -111,6 +111,9 @@ static int get_memory_ranges_proc_iomem(struct memory_range **range, int *ranges else if (memcmp(str, "Persistent Memory\n", 18) == 0) { type = RANGE_PMEM; } + else if (memcmp(str, "Device Backed Vmemmap\n", 22)) { + type = RANGE_DEVICE_BACKED_VMEMMAP; + } else { continue; } diff --git a/kexec/crashdump-elf.c b/kexec/crashdump-elf.c index b8bb686a17ca..98ad854e3f8d 100644 --- a/kexec/crashdump-elf.c +++ b/kexec/crashdump-elf.c @@ -199,7 +199,7 @@ int FUNC(struct kexec_info *info, * A seprate program header for Backup Region*/ for (i = 0; i < ranges; i++, range++) { unsigned long long mstart, mend; - if (range->type != RANGE_RAM) + if (range->type != RANGE_RAM || range->type != RANGE_DEVICE_BACKED_VMEMMAP) continue; mstart = range->start; mend = range->end; diff --git a/kexec/kexec.h b/kexec/kexec.h index 1004aff15945..c0481bb2727d 100644 --- a/kexec/kexec.h +++ b/kexec/kexec.h @@ -139,6 +139,7 @@ struct memory_range { #define RANGE_UNCACHED 4 #define RANGE_PMEM 6 #define RANGE_PRAM 11 +#define RANGE_DEVICE_BACKED_VMEMMAP 12 }; struct memory_ranges { -- 2.29.2 > > By the way, there's issue reported by test robot. I see, i have fixed it locally which doesn't matter for this feature(it fails in !ZONE_DEVICE) Thanks Zhijian > > Thanks > Baoquan > >> >> >> On 06/03/2024 18:28, Li Zhijian wrote: >>> Hello folks, >>> >>> Compared with the V2[1] I posted a long time ago, this time it is a >>> completely new proposal design. >>> >>> ### Background and motivate overview ### >>> --- >>> Crash dump is an important feature for troubleshooting the kernel. It is the >>> final way to chase what happened at the kernel panic, slowdown, and so on. It >>> is one of the most important tools for customer support. >>> >>> Currently, there are 2 syscalls(kexec_file_load(2) and kexec_load(2)) to >>> configure the dumpable regions. Generally, (A)iomem resources registered with >>> flags (IORESOURCE_SYSTEM_RAM | IORESOUCE_BUSY) for kexec_file_load(2) or >>> (B)iomem resources registered with "System RAM" name prefix for kexec_load(2) >>> are dumpable. >>> >>> The pmem use cases including fsdax and devdax, could map their vmemmap to >>> their own devices. In this case, these part of vmemmap will not be dumped when >>> crash happened since these regions are satisfied with neither the above (A) >>> nor (B). >>> >>> In fsdax, the vmemmap(struct page array) becomes very important, it is one of >>> the key data to find status of reverse map. Lacking of the information may >>> cause difficulty to analyze trouble around pmem (especially Filesystem-DAX). >>> That means troubleshooters are unable to check more details about pmem from >>> the dumpfile. >>> >>> ### Proposal ### >>> --- >>> In this proposal, register the device backed vmemmap as a separate resource. >>> This resource has its own new flag and name, and then teaches kexec_file_load(2) >>> and kexec_load(2) to mark it as dumpable. >>> >>> Proposed flag: IORESOURCE_DEVICE_BACKED_VMEMMAP >>> Proposed name: "Device Backed Vmemmap" >>> >>> NOTE: crash-utils also needs to adapt to this new name for kexec_load() >>> >>> With current proposal, the /proc/iomem should show as following for device >>> backed vmemmap >>> # cat /proc/iomem >>> ... >>> fffc0000-ffffffff : Reserved >>> 100000000-13fffffff : Persistent Memory >>> 100000000-10fffffff : namespace0.0 >>> 100000000-1005fffff : Device Backed Vmemmap # fsdax >>> a80000000-b7fffffff : CXL Window 0 >>> a80000000-affffffff : Persistent Memory >>> a80000000-affffffff : region1 >>> a80000000-a811fffff : namespace1.0 >>> a80000000-a811fffff : Device Backed Vmemmap # devdax >>> a81200000-abfffffff : dax1.0 >>> b80000000-c7fffffff : CXL Window 1 >>> c80000000-147fffffff : PCI Bus 0000:00 >>> c80000000-c801fffff : PCI Bus 0000:01 >>> ... >>> >>> ### Kdump service reloading ### >>> --- >>> Once the kdump service is loaded, if changes to CPUs or memory occur, >>> either by hot un/plug or off/onlining, the crash elfcorehdr should also >>> be updated. There are 2 approaches to make the reloading more efficient. >>> 1) Use udev rules to watch CPU and memory events, then reload kdump >>> 2) Enable kernel crash hotplug to automatically reload elfcorehdr (>= 6.5) >>> >>> This reloading also needed when device backed vmemmap layouts change, Similar >>> to what 1) does now, one could add the following as the first lines to the >>> RHEL udev rule file /usr/lib/udev/rules.d/98-kexec.rules: >>> >>> # namespace updated: watch daxX.Y(devdax) and pfnX.Y(fsdax) of nd >>> SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="bind", GOTO="kdump_reload" >>> SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="unbind", GOTO="kdump_reload" >>> # devdax <-> system-ram updated: watch daxX.Y of dax >>> SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="bind", GOTO="kdump_reload" >>> SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="unbind", GOTO="kdump_reload" >>> >>> Regarding 2), my idea is that it would need to call the memory_notify() in >>> devm_memremap_pages_release() and devm_memremap_pages() to trigger the crash >>> hotplug. This part is not yet mature, but it does not affect the whole feature >>> because we can still use method 1) alternatively. >>> >>> [1] https://lore.kernel.org/lkml/02066f0f-dbc0-0388-4233-8e24b6f8435b@fujitsu.com/T/ >>> -------------------------------------------- >>> changes from V2[1] >>> - new proposal design >>> >>> CC: Alison Schofield <alison.schofield@intel.com> >>> CC: Andrew Morton <akpm@linux-foundation.org> >>> CC: Baoquan He <bhe@redhat.com> >>> CC: Borislav Petkov <bp@alien8.de> >>> CC: Dan Williams <dan.j.williams@intel.com> >>> CC: Dave Hansen <dave.hansen@linux.intel.com> >>> CC: Dave Jiang <dave.jiang@intel.com> >>> CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org> >>> CC: "H. Peter Anvin" <hpa@zytor.com> >>> CC: Ingo Molnar <mingo@redhat.com> >>> CC: Ira Weiny <ira.weiny@intel.com> >>> CC: Thomas Gleixner <tglx@linutronix.de> >>> CC: Vishal Verma <vishal.l.verma@intel.com> >>> CC: linux-cxl@vger.kernel.org >>> CC: linux-mm@kvack.org >>> CC: nvdimm@lists.linux.dev >>> CC: x86@kernel.org >>> >>> Li Zhijian (7): >>> mm: memremap: register/unregister altmap region to a separate resource >>> mm: memremap: add pgmap_parent_resource() helper >>> nvdimm: pmem: assign a parent resource for vmemmap region for the >>> fsdax >>> dax: pmem: assign a parent resource for vmemmap region for the devdax >>> resource: Introduce walk device_backed_vmemmap res() helper >>> x86/crash: make device backed vmemmap dumpable for kexec_file_load >>> nvdimm: set force_raw=1 in kdump kernel >>> >>> arch/x86/kernel/crash.c | 5 +++++ >>> drivers/dax/pmem.c | 8 ++++++-- >>> drivers/nvdimm/namespace_devs.c | 3 +++ >>> drivers/nvdimm/pmem.c | 9 ++++++--- >>> include/linux/ioport.h | 4 ++++ >>> include/linux/memremap.h | 4 ++++ >>> kernel/resource.c | 13 +++++++++++++ >>> mm/memremap.c | 30 +++++++++++++++++++++++++++++- >>> 8 files changed, 70 insertions(+), 6 deletions(-) >>> >
BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev TO: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> tree: https://github.com/intel/tdx.git guest-attest head: 7a63dba23624686145c7c0fb4b61a086cca62d6f commit: 0a65f4a9b4ccea9af194490704ca295c172a41b1 [5/6] efi/libstub: Add EFI_CC_MEASUREMENT_PROTOCOL support :::::: branch date: 8 days ago :::::: commit date: 8 days ago config: x86_64-randconfig-161-20240321 (https://download.01.org/0day-ci/archive/20240321/202403211414.2Zgm4B9N-lkp@intel.com/config) compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <error27@gmail.com> | Closes: https://lore.kernel.org/r/202403211414.2Zgm4B9N-lkp@intel.com/ New smatch warnings: drivers/firmware/efi/libstub/efi-stub-helper.c:240 tcg2_efi_measure() error: uninitialized symbol 'evt'. drivers/firmware/efi/libstub/efi-stub-helper.c:286 cc_efi_measure() error: uninitialized symbol 'evt'. Old smatch warnings: drivers/firmware/efi/libstub/efi-stub-helper.c:59 efi_parse_options() error: uninitialized symbol 'buf'. drivers/firmware/efi/libstub/efi-stub-helper.c:571 efi_load_initrd_dev_path() error: uninitialized symbol 'handle'. drivers/firmware/efi/libstub/efi-stub-helper.c:571 efi_load_initrd_dev_path() error: uninitialized symbol 'handle'. drivers/firmware/efi/libstub/efi-stub-helper.c:577 efi_load_initrd_dev_path() error: uninitialized symbol 'lf2'. drivers/firmware/efi/libstub/efi-stub-helper.c:652 efi_load_initrd() error: uninitialized symbol 'tbl'. drivers/firmware/efi/libstub/efi-stub-helper.c:695 efi_wait_for_key() error: uninitialized symbol 'timer'. drivers/firmware/efi/libstub/efi-stub-helper.c:695 efi_wait_for_key() error: uninitialized symbol 'timer'. drivers/firmware/efi/libstub/efi-stub-helper.c:703 efi_wait_for_key() error: uninitialized symbol 'index'. drivers/firmware/efi/libstub/efi-stub-helper.c:746 efi_remap_image() error: uninitialized symbol 'memattr'. vim +/evt +240 drivers/firmware/efi/libstub/efi-stub-helper.c 566331696329c2 Ilias Apalodimas 2022-09-16 221 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 222 static efi_status_t tcg2_efi_measure(efi_tcg2_protocol_t *tcg2, 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 223 unsigned long load_addr, 566331696329c2 Ilias Apalodimas 2022-09-16 224 unsigned long load_size, 566331696329c2 Ilias Apalodimas 2022-09-16 225 enum efistub_event event) 566331696329c2 Ilias Apalodimas 2022-09-16 226 { 566331696329c2 Ilias Apalodimas 2022-09-16 227 struct efi_measured_event { 566331696329c2 Ilias Apalodimas 2022-09-16 228 efi_tcg2_event_t event_data; 566331696329c2 Ilias Apalodimas 2022-09-16 229 efi_tcg2_tagged_event_t tagged_event; 566331696329c2 Ilias Apalodimas 2022-09-16 230 u8 tagged_event_data[]; 566331696329c2 Ilias Apalodimas 2022-09-16 231 } *evt; 566331696329c2 Ilias Apalodimas 2022-09-16 232 int size = sizeof(*evt) + events[event].event_data_len; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 233 efi_status_t status; 566331696329c2 Ilias Apalodimas 2022-09-16 234 566331696329c2 Ilias Apalodimas 2022-09-16 235 status = efi_bs_call(allocate_pool, EFI_LOADER_DATA, size, 566331696329c2 Ilias Apalodimas 2022-09-16 236 (void **)&evt); 566331696329c2 Ilias Apalodimas 2022-09-16 237 if (status != EFI_SUCCESS) 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 238 return status; 566331696329c2 Ilias Apalodimas 2022-09-16 239 566331696329c2 Ilias Apalodimas 2022-09-16 @240 evt->event_data = (struct efi_tcg2_event){ 566331696329c2 Ilias Apalodimas 2022-09-16 241 .event_size = size, 566331696329c2 Ilias Apalodimas 2022-09-16 242 .event_header.header_size = sizeof(evt->event_data.event_header), 566331696329c2 Ilias Apalodimas 2022-09-16 243 .event_header.header_version = EFI_TCG2_EVENT_HEADER_VERSION, 566331696329c2 Ilias Apalodimas 2022-09-16 244 .event_header.pcr_index = events[event].pcr_index, 566331696329c2 Ilias Apalodimas 2022-09-16 245 .event_header.event_type = EV_EVENT_TAG, 566331696329c2 Ilias Apalodimas 2022-09-16 246 }; 566331696329c2 Ilias Apalodimas 2022-09-16 247 566331696329c2 Ilias Apalodimas 2022-09-16 248 evt->tagged_event = (struct efi_tcg2_tagged_event){ 566331696329c2 Ilias Apalodimas 2022-09-16 249 .tagged_event_id = events[event].event_id, 566331696329c2 Ilias Apalodimas 2022-09-16 250 .tagged_event_data_size = events[event].event_data_len, 566331696329c2 Ilias Apalodimas 2022-09-16 251 }; 566331696329c2 Ilias Apalodimas 2022-09-16 252 566331696329c2 Ilias Apalodimas 2022-09-16 253 memcpy(evt->tagged_event_data, events[event].event_data, 566331696329c2 Ilias Apalodimas 2022-09-16 254 events[event].event_data_len); 566331696329c2 Ilias Apalodimas 2022-09-16 255 566331696329c2 Ilias Apalodimas 2022-09-16 256 status = efi_call_proto(tcg2, hash_log_extend_event, 0, 566331696329c2 Ilias Apalodimas 2022-09-16 257 load_addr, load_size, &evt->event_data); 566331696329c2 Ilias Apalodimas 2022-09-16 258 efi_bs_call(free_pool, evt); 566331696329c2 Ilias Apalodimas 2022-09-16 259 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 260 return status; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 261 } 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 262 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 263 static efi_status_t cc_efi_measure(efi_cc_measurement_protocol_t *cc, 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 264 unsigned long load_addr, 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 265 unsigned long load_size, 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 266 enum efistub_event event) 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 267 { 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 268 efi_cc_mr_index_t mr; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 269 efi_cc_event_t *evt; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 270 efi_status_t status; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 271 size_t size; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 272 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 273 status = efi_call_proto(cc, map_pcr_to_mr_index, events[event].pcr_index, &mr); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 274 if (status != EFI_SUCCESS) { 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 275 efi_err("CC_MEASURE: PCR to MR mapping failed\n"); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 276 return status; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 277 } 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 278 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 279 size = sizeof(*evt) + events[event].event_data_len; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 280 status = efi_bs_call(allocate_pool, EFI_LOADER_DATA, size, (void **)&evt); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 281 if (status != EFI_SUCCESS) { 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 282 efi_err("CC_MEASURE: Allocating event struct failed\n"); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 283 return status; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 284 } 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 285 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 @286 evt->event_size = size; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 287 evt->event_header.header_size = sizeof(evt->event_header); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 288 evt->event_header.header_version = EFI_CC_EVENT_HEADER_VERSION; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 289 evt->event_header.mr_index = mr; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 290 evt->event_header.event_type = EV_EVENT_TAG; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 291 memcpy(evt->event_data, events[event].event_data, events[event].event_data_len); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 292 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 293 status = efi_call_proto(cc, hash_log_extend_event, 0, load_addr, load_size, evt); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 294 efi_bs_call(free_pool, evt); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 295 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 296 return status; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 297 } 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 298 static efi_status_t efi_measure_tagged_event(unsigned long load_addr, 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 299 unsigned long load_size, 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 300 enum efistub_event event) 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 301 { 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 302 efi_guid_t tcg2_guid = EFI_TCG2_PROTOCOL_GUID; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 303 efi_guid_t cc_guid = EFI_CC_MEASUREMENT_PROTOCOL_GUID; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 304 efi_cc_measurement_protocol_t *cc = NULL; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 305 efi_tcg2_protocol_t *tcg2 = NULL; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 306 efi_status_t status; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 307 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 308 efi_bs_call(locate_protocol, &tcg2_guid, NULL, (void **)&tcg2); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 309 if (tcg2) { 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 310 status = tcg2_efi_measure(tcg2, load_addr, load_size, event); 566331696329c2 Ilias Apalodimas 2022-09-16 311 if (status != EFI_SUCCESS) 566331696329c2 Ilias Apalodimas 2022-09-16 312 goto fail; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 313 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 314 return status; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 315 } 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 316 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 317 efi_bs_call(locate_protocol, &cc_guid, NULL, (void **)&cc); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 318 if (cc) { 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 319 status = cc_efi_measure(cc, load_addr, load_size, event); 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 320 if (status != EFI_SUCCESS) 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 321 goto fail; 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 322 0a65f4a9b4ccea Kuppuswamy Sathyanarayanan 2023-06-07 323 return status; 566331696329c2 Ilias Apalodimas 2022-09-16 324 } 566331696329c2 Ilias Apalodimas 2022-09-16 325 566331696329c2 Ilias Apalodimas 2022-09-16 326 return EFI_UNSUPPORTED; 566331696329c2 Ilias Apalodimas 2022-09-16 327 fail: 566331696329c2 Ilias Apalodimas 2022-09-16 328 efi_warn("Failed to measure data for event %d: 0x%lx\n", event, status); 566331696329c2 Ilias Apalodimas 2022-09-16 329 return status; 566331696329c2 Ilias Apalodimas 2022-09-16 330 } 566331696329c2 Ilias Apalodimas 2022-09-16 331 :::::: The code at line 240 was first introduced by commit :::::: 566331696329c2f9ca0fe2a55a5dd029ac43d2d2 efi/libstub: refactor the initrd measuring functions :::::: TO: Ilias Apalodimas <ilias.apalodimas@linaro.org> :::::: CC: Ard Biesheuvel <ardb@kernel.org> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
On 03/21/24 at 05:40am, Zhijian Li (Fujitsu) wrote: > ping > > > Any comment is welcome. I will have a look at this from kdump side. How do you test your code? By the way, there's issue reported by test robot. Thanks Baoquan > > > On 06/03/2024 18:28, Li Zhijian wrote: > > Hello folks, > > > > Compared with the V2[1] I posted a long time ago, this time it is a > > completely new proposal design. > > > > ### Background and motivate overview ### > > --- > > Crash dump is an important feature for troubleshooting the kernel. It is the > > final way to chase what happened at the kernel panic, slowdown, and so on. It > > is one of the most important tools for customer support. > > > > Currently, there are 2 syscalls(kexec_file_load(2) and kexec_load(2)) to > > configure the dumpable regions. Generally, (A)iomem resources registered with > > flags (IORESOURCE_SYSTEM_RAM | IORESOUCE_BUSY) for kexec_file_load(2) or > > (B)iomem resources registered with "System RAM" name prefix for kexec_load(2) > > are dumpable. > > > > The pmem use cases including fsdax and devdax, could map their vmemmap to > > their own devices. In this case, these part of vmemmap will not be dumped when > > crash happened since these regions are satisfied with neither the above (A) > > nor (B). > > > > In fsdax, the vmemmap(struct page array) becomes very important, it is one of > > the key data to find status of reverse map. Lacking of the information may > > cause difficulty to analyze trouble around pmem (especially Filesystem-DAX). > > That means troubleshooters are unable to check more details about pmem from > > the dumpfile. > > > > ### Proposal ### > > --- > > In this proposal, register the device backed vmemmap as a separate resource. > > This resource has its own new flag and name, and then teaches kexec_file_load(2) > > and kexec_load(2) to mark it as dumpable. > > > > Proposed flag: IORESOURCE_DEVICE_BACKED_VMEMMAP > > Proposed name: "Device Backed Vmemmap" > > > > NOTE: crash-utils also needs to adapt to this new name for kexec_load() > > > > With current proposal, the /proc/iomem should show as following for device > > backed vmemmap > > # cat /proc/iomem > > ... > > fffc0000-ffffffff : Reserved > > 100000000-13fffffff : Persistent Memory > > 100000000-10fffffff : namespace0.0 > > 100000000-1005fffff : Device Backed Vmemmap # fsdax > > a80000000-b7fffffff : CXL Window 0 > > a80000000-affffffff : Persistent Memory > > a80000000-affffffff : region1 > > a80000000-a811fffff : namespace1.0 > > a80000000-a811fffff : Device Backed Vmemmap # devdax > > a81200000-abfffffff : dax1.0 > > b80000000-c7fffffff : CXL Window 1 > > c80000000-147fffffff : PCI Bus 0000:00 > > c80000000-c801fffff : PCI Bus 0000:01 > > ... > > > > ### Kdump service reloading ### > > --- > > Once the kdump service is loaded, if changes to CPUs or memory occur, > > either by hot un/plug or off/onlining, the crash elfcorehdr should also > > be updated. There are 2 approaches to make the reloading more efficient. > > 1) Use udev rules to watch CPU and memory events, then reload kdump > > 2) Enable kernel crash hotplug to automatically reload elfcorehdr (>= 6.5) > > > > This reloading also needed when device backed vmemmap layouts change, Similar > > to what 1) does now, one could add the following as the first lines to the > > RHEL udev rule file /usr/lib/udev/rules.d/98-kexec.rules: > > > > # namespace updated: watch daxX.Y(devdax) and pfnX.Y(fsdax) of nd > > SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="bind", GOTO="kdump_reload" > > SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="unbind", GOTO="kdump_reload" > > # devdax <-> system-ram updated: watch daxX.Y of dax > > SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="bind", GOTO="kdump_reload" > > SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="unbind", GOTO="kdump_reload" > > > > Regarding 2), my idea is that it would need to call the memory_notify() in > > devm_memremap_pages_release() and devm_memremap_pages() to trigger the crash > > hotplug. This part is not yet mature, but it does not affect the whole feature > > because we can still use method 1) alternatively. > > > > [1] https://lore.kernel.org/lkml/02066f0f-dbc0-0388-4233-8e24b6f8435b@fujitsu.com/T/ > > -------------------------------------------- > > changes from V2[1] > > - new proposal design > > > > CC: Alison Schofield <alison.schofield@intel.com> > > CC: Andrew Morton <akpm@linux-foundation.org> > > CC: Baoquan He <bhe@redhat.com> > > CC: Borislav Petkov <bp@alien8.de> > > CC: Dan Williams <dan.j.williams@intel.com> > > CC: Dave Hansen <dave.hansen@linux.intel.com> > > CC: Dave Jiang <dave.jiang@intel.com> > > CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > > CC: "H. Peter Anvin" <hpa@zytor.com> > > CC: Ingo Molnar <mingo@redhat.com> > > CC: Ira Weiny <ira.weiny@intel.com> > > CC: Thomas Gleixner <tglx@linutronix.de> > > CC: Vishal Verma <vishal.l.verma@intel.com> > > CC: linux-cxl@vger.kernel.org > > CC: linux-mm@kvack.org > > CC: nvdimm@lists.linux.dev > > CC: x86@kernel.org > > > > Li Zhijian (7): > > mm: memremap: register/unregister altmap region to a separate resource > > mm: memremap: add pgmap_parent_resource() helper > > nvdimm: pmem: assign a parent resource for vmemmap region for the > > fsdax > > dax: pmem: assign a parent resource for vmemmap region for the devdax > > resource: Introduce walk device_backed_vmemmap res() helper > > x86/crash: make device backed vmemmap dumpable for kexec_file_load > > nvdimm: set force_raw=1 in kdump kernel > > > > arch/x86/kernel/crash.c | 5 +++++ > > drivers/dax/pmem.c | 8 ++++++-- > > drivers/nvdimm/namespace_devs.c | 3 +++ > > drivers/nvdimm/pmem.c | 9 ++++++--- > > include/linux/ioport.h | 4 ++++ > > include/linux/memremap.h | 4 ++++ > > kernel/resource.c | 13 +++++++++++++ > > mm/memremap.c | 30 +++++++++++++++++++++++++++++- > > 8 files changed, 70 insertions(+), 6 deletions(-) > > _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec
On 03/21/24 at 05:40am, Zhijian Li (Fujitsu) wrote: > ping > > > Any comment is welcome. I will have a look at this from kdump side. How do you test your code? By the way, there's issue reported by test robot. Thanks Baoquan > > > On 06/03/2024 18:28, Li Zhijian wrote: > > Hello folks, > > > > Compared with the V2[1] I posted a long time ago, this time it is a > > completely new proposal design. > > > > ### Background and motivate overview ### > > --- > > Crash dump is an important feature for troubleshooting the kernel. It is the > > final way to chase what happened at the kernel panic, slowdown, and so on. It > > is one of the most important tools for customer support. > > > > Currently, there are 2 syscalls(kexec_file_load(2) and kexec_load(2)) to > > configure the dumpable regions. Generally, (A)iomem resources registered with > > flags (IORESOURCE_SYSTEM_RAM | IORESOUCE_BUSY) for kexec_file_load(2) or > > (B)iomem resources registered with "System RAM" name prefix for kexec_load(2) > > are dumpable. > > > > The pmem use cases including fsdax and devdax, could map their vmemmap to > > their own devices. In this case, these part of vmemmap will not be dumped when > > crash happened since these regions are satisfied with neither the above (A) > > nor (B). > > > > In fsdax, the vmemmap(struct page array) becomes very important, it is one of > > the key data to find status of reverse map. Lacking of the information may > > cause difficulty to analyze trouble around pmem (especially Filesystem-DAX). > > That means troubleshooters are unable to check more details about pmem from > > the dumpfile. > > > > ### Proposal ### > > --- > > In this proposal, register the device backed vmemmap as a separate resource. > > This resource has its own new flag and name, and then teaches kexec_file_load(2) > > and kexec_load(2) to mark it as dumpable. > > > > Proposed flag: IORESOURCE_DEVICE_BACKED_VMEMMAP > > Proposed name: "Device Backed Vmemmap" > > > > NOTE: crash-utils also needs to adapt to this new name for kexec_load() > > > > With current proposal, the /proc/iomem should show as following for device > > backed vmemmap > > # cat /proc/iomem > > ... > > fffc0000-ffffffff : Reserved > > 100000000-13fffffff : Persistent Memory > > 100000000-10fffffff : namespace0.0 > > 100000000-1005fffff : Device Backed Vmemmap # fsdax > > a80000000-b7fffffff : CXL Window 0 > > a80000000-affffffff : Persistent Memory > > a80000000-affffffff : region1 > > a80000000-a811fffff : namespace1.0 > > a80000000-a811fffff : Device Backed Vmemmap # devdax > > a81200000-abfffffff : dax1.0 > > b80000000-c7fffffff : CXL Window 1 > > c80000000-147fffffff : PCI Bus 0000:00 > > c80000000-c801fffff : PCI Bus 0000:01 > > ... > > > > ### Kdump service reloading ### > > --- > > Once the kdump service is loaded, if changes to CPUs or memory occur, > > either by hot un/plug or off/onlining, the crash elfcorehdr should also > > be updated. There are 2 approaches to make the reloading more efficient. > > 1) Use udev rules to watch CPU and memory events, then reload kdump > > 2) Enable kernel crash hotplug to automatically reload elfcorehdr (>= 6.5) > > > > This reloading also needed when device backed vmemmap layouts change, Similar > > to what 1) does now, one could add the following as the first lines to the > > RHEL udev rule file /usr/lib/udev/rules.d/98-kexec.rules: > > > > # namespace updated: watch daxX.Y(devdax) and pfnX.Y(fsdax) of nd > > SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="bind", GOTO="kdump_reload" > > SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="unbind", GOTO="kdump_reload" > > # devdax <-> system-ram updated: watch daxX.Y of dax > > SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="bind", GOTO="kdump_reload" > > SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="unbind", GOTO="kdump_reload" > > > > Regarding 2), my idea is that it would need to call the memory_notify() in > > devm_memremap_pages_release() and devm_memremap_pages() to trigger the crash > > hotplug. This part is not yet mature, but it does not affect the whole feature > > because we can still use method 1) alternatively. > > > > [1] https://lore.kernel.org/lkml/02066f0f-dbc0-0388-4233-8e24b6f8435b@fujitsu.com/T/ > > -------------------------------------------- > > changes from V2[1] > > - new proposal design > > > > CC: Alison Schofield <alison.schofield@intel.com> > > CC: Andrew Morton <akpm@linux-foundation.org> > > CC: Baoquan He <bhe@redhat.com> > > CC: Borislav Petkov <bp@alien8.de> > > CC: Dan Williams <dan.j.williams@intel.com> > > CC: Dave Hansen <dave.hansen@linux.intel.com> > > CC: Dave Jiang <dave.jiang@intel.com> > > CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > > CC: "H. Peter Anvin" <hpa@zytor.com> > > CC: Ingo Molnar <mingo@redhat.com> > > CC: Ira Weiny <ira.weiny@intel.com> > > CC: Thomas Gleixner <tglx@linutronix.de> > > CC: Vishal Verma <vishal.l.verma@intel.com> > > CC: linux-cxl@vger.kernel.org > > CC: linux-mm@kvack.org > > CC: nvdimm@lists.linux.dev > > CC: x86@kernel.org > > > > Li Zhijian (7): > > mm: memremap: register/unregister altmap region to a separate resource > > mm: memremap: add pgmap_parent_resource() helper > > nvdimm: pmem: assign a parent resource for vmemmap region for the > > fsdax > > dax: pmem: assign a parent resource for vmemmap region for the devdax > > resource: Introduce walk device_backed_vmemmap res() helper > > x86/crash: make device backed vmemmap dumpable for kexec_file_load > > nvdimm: set force_raw=1 in kdump kernel > > > > arch/x86/kernel/crash.c | 5 +++++ > > drivers/dax/pmem.c | 8 ++++++-- > > drivers/nvdimm/namespace_devs.c | 3 +++ > > drivers/nvdimm/pmem.c | 9 ++++++--- > > include/linux/ioport.h | 4 ++++ > > include/linux/memremap.h | 4 ++++ > > kernel/resource.c | 13 +++++++++++++ > > mm/memremap.c | 30 +++++++++++++++++++++++++++++- > > 8 files changed, 70 insertions(+), 6 deletions(-) > >
Hi James
Could you share your complete config after enable CONFIG_IRQ_PIPELINE? I will try to reproduce
on my side. I met similar thing before because of kernel configuration issue.
Regards
Hongzhan Chen
>-----Original Message-----
>From: Philippe Gerum <rpm@xenomai.org>
>Sent: Thursday, March 21, 2024 5:36 AM
>To: Rosenow, James <jim.rosenow@mts.com>
>Cc: xenomai@lists.linux.dev
>Subject: Re: Hang at "loading initial ramdisk ..." on Generation 11 CPU, Gen 9,
>7, and 6 work.
>
>
>"Rosenow, James" <jim.rosenow@mts.com> writes:
>
>>> > "Rosenow, James" <jim.rosenow@mts.com> writes:
>>> >
>>> > > We have a COM express carrier with an on-board SSD. The SSD has
>>> > > Ubuntu 22.04 installed on it, on top of that, I've installed the
>>> > > latest Xenomai (master) alongside the 'v6.5-dovetail-rebase' kernel
>>> > > from the linux-dovetail repository . Given that our board supports
>>> > > COM Express, we can easily swap between various processors and have
>>> > > been doing so looking for the best price/performance ratio and of
>>> > > course, low latency.
>>> > >
>>> > > I have two modules that I am currently testing, an i3-11100HE and an
>>> > > i7-
>>> > 9850HL. Since the SSD is on the base board, I'm running the exact
>>> > same version of Ubuntu, kernel and root file system regardless of the
>>> > installed processor board.
>>> > >
>>> > > The gen9 processor boots and runs the Xenomai kernel without any
>>> > > trouble at all. I'm having SMI issues but that is another subject.
>>> > > When I put the gen11 board on the carrier, it hangs at 'loading
>>> > > initial ramdisk .'. It is noteworthy that if I interrupt grub and
>>> > > select the stock 6.5.x Ubuntu kernel on either, both gen 11 and gen
>>> > > 9 boot and run fine. I've verified the Xenomai kernel runs fine on
>>> > > generation 7 and 6 CPU's as well.
>>> > >
>>> > > I've searched the web for possible reasons why Linux would hang at
>>> > > that
>>> > point; for Linux in general, it is a common thing and I've tried many,
>>> > many of the solutions that others have found to work, all to no avail.
>>> > I do not know how to get additional information on what is hanging as
>>> > there is really no context from which to proceed.
>>> > >
>>> > > I'm looking for suggestions on next steps to root cause this hang.
>>> > >
>>> > > Thanks and regards,
>>> > > Jim
>>> >
>>> > Could you boot the machine with the stock kernel that works, then
>>> > paste the output of /proc/interrupts? This may help finding out which
>>> > IRQ controller might be involved in the issue.
>>> >
>>>
>>> Hello Philippe,
>>> Here is the output of /proc/interrupts from the stock 6.5.0 kernel.
>>>
>>> $ cat /proc/interrupts
>>> CPU0 CPU1 CPU2 CPU3
>>> 0: 15 0 0 0 IO-APIC 2-edge
>>> timer
>>> 3: 0 0 0 2 IO-APIC 3-edge
>>> 4: 0 0 0 2 IO-APIC 4-edge
>>> 8: 0 0 0 0 IO-APIC 8-edge
>>> rtc0
>>> 9: 611 154 0 0 IO-APIC 9-fasteoi
>>> acpi
>>> 14: 0 0 0 0 IO-APIC 14-fasteoi
>>> INT34C6:00
>>> 16: 699 0 0 0 IO-APIC 16-fasteoi
>>> i801_smbus, intel_ish_ipc
>>> 18: 0 0 0 0 IO-APIC 18-fasteoi
>>> i2c_designware.0
>>> 27: 0 0 0 0 IO-APIC 27-fasteoi
>>> idma64.1, i2c_designware.1
>>> 29: 0 0 0 0 IO-APIC 29-fasteoi
>>> idma64.2, i2c_designware.2
>>> 30: 0 0 0 0 IO-APIC 30-fasteoi
>>> idma64.3, i2c_designware.3
>>> 31: 0 0 0 0 IO-APIC 31-fasteoi
>>> idma64.4, i2c_designware.4
>>> 32: 0 0 0 0 IO-APIC 32-fasteoi
>>> idma64.5, i2c_designware.5
>>> 126: 0 0 0 0 PCI-MSI-0000:00:0d.0
>>> 0-edge xhci_hcd
>>> 127: 0 0 0 21855 PCI-MSI-0000:00:17.0
>>> 0-edge ahci[0000:00:17.0]
>>> 128: 0 0 1 0 PCI-MSIX-0000:04:00.0
>>> 0-edge enp4s0
>>> 129: 371 0 0 35 PCI-MSIX-0000:04:00.0
>>> 1-edge enp4s0-TxRx-0
>>> 130: 36 0 0 310 PCI-MSIX-0000:04:00.0
>>> 2-edge enp4s0-TxRx-1
>>> 131: 0 36 334 0 PCI-MSIX-0000:04:00.0
>>> 3-edge enp4s0-TxRx-2
>>> 132: 0 0 285 0 PCI-MSIX-0000:04:00.0
>>> 4-edge enp4s0-TxRx-3
>>> 133: 1681 74 0 0 PCI-MSI-0000:00:14.0
>>> 0-edge xhci_hcd
>>> 134: 0 0 0 0 accel_3d-dev0
>>> accel_3d_consumer0
>>> 136: 0 0 0 0 als-dev1
>>> als_consumer1
>>> 142: 0 0 0 0 magn_3d-dev3
>>> magn_3d_consumer3
>>> 150: 49 0 0 0 PCI-MSI-0000:00:16.0
>>> 0-edge mei_me
>>> 157: 5552 319 0 0 PCI-MSI-0000:00:02.0
>>> 0-edge i915
>>> NMI: 1 0 3 3 Non-maskable
>>> interrupts
>>> LOC: 25207 348 30717 29537 Local timer interrupts
>>> SPU: 0 0 0 0 Spurious interrupts
>>> PMI: 1 0 3 3 Performance monitoring
>>> interrupts
>>> IWI: 2162 11 119 207 IRQ work interrupts
>>> RTR: 2 0 0 0 APIC ICR read retries
>>> RES: 2902 326 3213 2405 Rescheduling
>>> interrupts
>>> CAL: 46790 5794 43018 41150 Function call
>>> interrupts
>>> TLB: 273 0 258 149 TLB shootdowns
>>> TRM: 0 0 0 0 Thermal event
>>> interrupts
>>> THR: 0 0 0 0 Threshold APIC
>>> interrupts
>>> DFR: 0 0 0 0 Deferred Error APIC
>>> interrupts
>>> MCE: 0 0 0 0 Machine check
>>> exceptions
>>> MCP: 1 2 2 2 Machine check polls
>>> ERR: 2
>>> MIS: 0
>>> PIN: 0 0 0 0 Posted-interrupt
>>> notification event
>>> NPI: 0 0 0 0 Nested posted-
>>> interrupt event
>>> PIW: 0 0 0 0 Posted-interrupt
>>> wakeup event
>>>
>>> > Also, you may want to check whether enabling CONFIG_IRQ_PIPELINE
>only
>>> > (i.e. w/o CONFIG_DOVETAIL and therefore no Xenomai on top) still
>>> > causes the issue. That might help pointing the finger at either a
>>> > generic IRQ pipelining issue, or something related to the tick device
>>> instead.
>>> >
>>>
>>> I will try this today and respond as soon as I get the results.
>>> Regards,
>>> Jim
>>>
>>
>> I can confirm that the system hangs with "CONFIG_IRQ_PIPELINE=y" and
>"CONFIG_DOVETAIL is not set".
>> This is identical to the original failure.
>>
>
>Ok, so this points the finger at irq pipelining. Something may be
>missing in some irqchip driver to support this.
>
>--
>Philippe.
ping Any comment is welcome. On 06/03/2024 18:28, Li Zhijian wrote: > Hello folks, > > Compared with the V2[1] I posted a long time ago, this time it is a > completely new proposal design. > > ### Background and motivate overview ### > --- > Crash dump is an important feature for troubleshooting the kernel. It is the > final way to chase what happened at the kernel panic, slowdown, and so on. It > is one of the most important tools for customer support. > > Currently, there are 2 syscalls(kexec_file_load(2) and kexec_load(2)) to > configure the dumpable regions. Generally, (A)iomem resources registered with > flags (IORESOURCE_SYSTEM_RAM | IORESOUCE_BUSY) for kexec_file_load(2) or > (B)iomem resources registered with "System RAM" name prefix for kexec_load(2) > are dumpable. > > The pmem use cases including fsdax and devdax, could map their vmemmap to > their own devices. In this case, these part of vmemmap will not be dumped when > crash happened since these regions are satisfied with neither the above (A) > nor (B). > > In fsdax, the vmemmap(struct page array) becomes very important, it is one of > the key data to find status of reverse map. Lacking of the information may > cause difficulty to analyze trouble around pmem (especially Filesystem-DAX). > That means troubleshooters are unable to check more details about pmem from > the dumpfile. > > ### Proposal ### > --- > In this proposal, register the device backed vmemmap as a separate resource. > This resource has its own new flag and name, and then teaches kexec_file_load(2) > and kexec_load(2) to mark it as dumpable. > > Proposed flag: IORESOURCE_DEVICE_BACKED_VMEMMAP > Proposed name: "Device Backed Vmemmap" > > NOTE: crash-utils also needs to adapt to this new name for kexec_load() > > With current proposal, the /proc/iomem should show as following for device > backed vmemmap > # cat /proc/iomem > ... > fffc0000-ffffffff : Reserved > 100000000-13fffffff : Persistent Memory > 100000000-10fffffff : namespace0.0 > 100000000-1005fffff : Device Backed Vmemmap # fsdax > a80000000-b7fffffff : CXL Window 0 > a80000000-affffffff : Persistent Memory > a80000000-affffffff : region1 > a80000000-a811fffff : namespace1.0 > a80000000-a811fffff : Device Backed Vmemmap # devdax > a81200000-abfffffff : dax1.0 > b80000000-c7fffffff : CXL Window 1 > c80000000-147fffffff : PCI Bus 0000:00 > c80000000-c801fffff : PCI Bus 0000:01 > ... > > ### Kdump service reloading ### > --- > Once the kdump service is loaded, if changes to CPUs or memory occur, > either by hot un/plug or off/onlining, the crash elfcorehdr should also > be updated. There are 2 approaches to make the reloading more efficient. > 1) Use udev rules to watch CPU and memory events, then reload kdump > 2) Enable kernel crash hotplug to automatically reload elfcorehdr (>= 6.5) > > This reloading also needed when device backed vmemmap layouts change, Similar > to what 1) does now, one could add the following as the first lines to the > RHEL udev rule file /usr/lib/udev/rules.d/98-kexec.rules: > > # namespace updated: watch daxX.Y(devdax) and pfnX.Y(fsdax) of nd > SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="bind", GOTO="kdump_reload" > SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="unbind", GOTO="kdump_reload" > # devdax <-> system-ram updated: watch daxX.Y of dax > SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="bind", GOTO="kdump_reload" > SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="unbind", GOTO="kdump_reload" > > Regarding 2), my idea is that it would need to call the memory_notify() in > devm_memremap_pages_release() and devm_memremap_pages() to trigger the crash > hotplug. This part is not yet mature, but it does not affect the whole feature > because we can still use method 1) alternatively. > > [1] https://lore.kernel.org/lkml/02066f0f-dbc0-0388-4233-8e24b6f8435b@fujitsu.com/T/ > -------------------------------------------- > changes from V2[1] > - new proposal design > > CC: Alison Schofield <alison.schofield@intel.com> > CC: Andrew Morton <akpm@linux-foundation.org> > CC: Baoquan He <bhe@redhat.com> > CC: Borislav Petkov <bp@alien8.de> > CC: Dan Williams <dan.j.williams@intel.com> > CC: Dave Hansen <dave.hansen@linux.intel.com> > CC: Dave Jiang <dave.jiang@intel.com> > CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > CC: "H. Peter Anvin" <hpa@zytor.com> > CC: Ingo Molnar <mingo@redhat.com> > CC: Ira Weiny <ira.weiny@intel.com> > CC: Thomas Gleixner <tglx@linutronix.de> > CC: Vishal Verma <vishal.l.verma@intel.com> > CC: linux-cxl@vger.kernel.org > CC: linux-mm@kvack.org > CC: nvdimm@lists.linux.dev > CC: x86@kernel.org > > Li Zhijian (7): > mm: memremap: register/unregister altmap region to a separate resource > mm: memremap: add pgmap_parent_resource() helper > nvdimm: pmem: assign a parent resource for vmemmap region for the > fsdax > dax: pmem: assign a parent resource for vmemmap region for the devdax > resource: Introduce walk device_backed_vmemmap res() helper > x86/crash: make device backed vmemmap dumpable for kexec_file_load > nvdimm: set force_raw=1 in kdump kernel > > arch/x86/kernel/crash.c | 5 +++++ > drivers/dax/pmem.c | 8 ++++++-- > drivers/nvdimm/namespace_devs.c | 3 +++ > drivers/nvdimm/pmem.c | 9 ++++++--- > include/linux/ioport.h | 4 ++++ > include/linux/memremap.h | 4 ++++ > kernel/resource.c | 13 +++++++++++++ > mm/memremap.c | 30 +++++++++++++++++++++++++++++- > 8 files changed, 70 insertions(+), 6 deletions(-) > _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec
ping
Any comment is welcome.
On 06/03/2024 18:28, Li Zhijian wrote:
> Hello folks,
>
> Compared with the V2[1] I posted a long time ago, this time it is a
> completely new proposal design.
>
> ### Background and motivate overview ###
> ---
> Crash dump is an important feature for troubleshooting the kernel. It is the
> final way to chase what happened at the kernel panic, slowdown, and so on. It
> is one of the most important tools for customer support.
>
> Currently, there are 2 syscalls(kexec_file_load(2) and kexec_load(2)) to
> configure the dumpable regions. Generally, (A)iomem resources registered with
> flags (IORESOURCE_SYSTEM_RAM | IORESOUCE_BUSY) for kexec_file_load(2) or
> (B)iomem resources registered with "System RAM" name prefix for kexec_load(2)
> are dumpable.
>
> The pmem use cases including fsdax and devdax, could map their vmemmap to
> their own devices. In this case, these part of vmemmap will not be dumped when
> crash happened since these regions are satisfied with neither the above (A)
> nor (B).
>
> In fsdax, the vmemmap(struct page array) becomes very important, it is one of
> the key data to find status of reverse map. Lacking of the information may
> cause difficulty to analyze trouble around pmem (especially Filesystem-DAX).
> That means troubleshooters are unable to check more details about pmem from
> the dumpfile.
>
> ### Proposal ###
> ---
> In this proposal, register the device backed vmemmap as a separate resource.
> This resource has its own new flag and name, and then teaches kexec_file_load(2)
> and kexec_load(2) to mark it as dumpable.
>
> Proposed flag: IORESOURCE_DEVICE_BACKED_VMEMMAP
> Proposed name: "Device Backed Vmemmap"
>
> NOTE: crash-utils also needs to adapt to this new name for kexec_load()
>
> With current proposal, the /proc/iomem should show as following for device
> backed vmemmap
> # cat /proc/iomem
> ...
> fffc0000-ffffffff : Reserved
> 100000000-13fffffff : Persistent Memory
> 100000000-10fffffff : namespace0.0
> 100000000-1005fffff : Device Backed Vmemmap # fsdax
> a80000000-b7fffffff : CXL Window 0
> a80000000-affffffff : Persistent Memory
> a80000000-affffffff : region1
> a80000000-a811fffff : namespace1.0
> a80000000-a811fffff : Device Backed Vmemmap # devdax
> a81200000-abfffffff : dax1.0
> b80000000-c7fffffff : CXL Window 1
> c80000000-147fffffff : PCI Bus 0000:00
> c80000000-c801fffff : PCI Bus 0000:01
> ...
>
> ### Kdump service reloading ###
> ---
> Once the kdump service is loaded, if changes to CPUs or memory occur,
> either by hot un/plug or off/onlining, the crash elfcorehdr should also
> be updated. There are 2 approaches to make the reloading more efficient.
> 1) Use udev rules to watch CPU and memory events, then reload kdump
> 2) Enable kernel crash hotplug to automatically reload elfcorehdr (>= 6.5)
>
> This reloading also needed when device backed vmemmap layouts change, Similar
> to what 1) does now, one could add the following as the first lines to the
> RHEL udev rule file /usr/lib/udev/rules.d/98-kexec.rules:
>
> # namespace updated: watch daxX.Y(devdax) and pfnX.Y(fsdax) of nd
> SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="bind", GOTO="kdump_reload"
> SUBSYSTEM=="nd", KERNEL=="[dp][af][xn][0-9].*", ACTION=="unbind", GOTO="kdump_reload"
> # devdax <-> system-ram updated: watch daxX.Y of dax
> SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="bind", GOTO="kdump_reload"
> SUBSYSTEM=="dax", KERNEL=="dax[0-9].*", ACTION=="unbind", GOTO="kdump_reload"
>
> Regarding 2), my idea is that it would need to call the memory_notify() in
> devm_memremap_pages_release() and devm_memremap_pages() to trigger the crash
> hotplug. This part is not yet mature, but it does not affect the whole feature
> because we can still use method 1) alternatively.
>
> [1] https://lore.kernel.org/lkml/02066f0f-dbc0-0388-4233-8e24b6f8435b@fujitsu.com/T/
> --------------------------------------------
> changes from V2[1]
> - new proposal design
>
> CC: Alison Schofield <alison.schofield@intel.com>
> CC: Andrew Morton <akpm@linux-foundation.org>
> CC: Baoquan He <bhe@redhat.com>
> CC: Borislav Petkov <bp@alien8.de>
> CC: Dan Williams <dan.j.williams@intel.com>
> CC: Dave Hansen <dave.hansen@linux.intel.com>
> CC: Dave Jiang <dave.jiang@intel.com>
> CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> CC: "H. Peter Anvin" <hpa@zytor.com>
> CC: Ingo Molnar <mingo@redhat.com>
> CC: Ira Weiny <ira.weiny@intel.com>
> CC: Thomas Gleixner <tglx@linutronix.de>
> CC: Vishal Verma <vishal.l.verma@intel.com>
> CC: linux-cxl@vger.kernel.org
> CC: linux-mm@kvack.org
> CC: nvdimm@lists.linux.dev
> CC: x86@kernel.org
>
> Li Zhijian (7):
> mm: memremap: register/unregister altmap region to a separate resource
> mm: memremap: add pgmap_parent_resource() helper
> nvdimm: pmem: assign a parent resource for vmemmap region for the
> fsdax
> dax: pmem: assign a parent resource for vmemmap region for the devdax
> resource: Introduce walk device_backed_vmemmap res() helper
> x86/crash: make device backed vmemmap dumpable for kexec_file_load
> nvdimm: set force_raw=1 in kdump kernel
>
> arch/x86/kernel/crash.c | 5 +++++
> drivers/dax/pmem.c | 8 ++++++--
> drivers/nvdimm/namespace_devs.c | 3 +++
> drivers/nvdimm/pmem.c | 9 ++++++---
> include/linux/ioport.h | 4 ++++
> include/linux/memremap.h | 4 ++++
> kernel/resource.c | 13 +++++++++++++
> mm/memremap.c | 30 +++++++++++++++++++++++++++++-
> 8 files changed, 70 insertions(+), 6 deletions(-)
>
:::::: :::::: Manual check reason: "low confidence bisect report" :::::: BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev In-Reply-To: <facb7d2e23dbf5e8a411a9e9d02b7c8baab99b88.1709914259.git.bristot@kernel.org> References: <facb7d2e23dbf5e8a411a9e9d02b7c8baab99b88.1709914259.git.bristot@kernel.org> TO: Daniel Bristot de Oliveira <bristot@kernel.org> Hi Daniel, kernel test robot noticed the following build errors: [auto build test ERROR on linux/master] [also build test ERROR on v6.8 next-20240320] [cannot apply to linus/master rostedt-trace/for-next rostedt-trace/for-next-urgent acme/perf/core] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Daniel-Bristot-de-Oliveira/tools-tracing-Use-tools-build-makefiles-on-latency-collector/20240309-015731 base: linux/master patch link: https://lore.kernel.org/r/facb7d2e23dbf5e8a411a9e9d02b7c8baab99b88.1709914259.git.bristot%40kernel.org patch subject: [PATCH 3/3] tools/rtla: Use tools/build makefiles to build rtla :::::: branch date: 12 days ago :::::: commit date: 12 days ago compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240321/202403211207.MQN0DSRb-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/r/202403211207.MQN0DSRb-lkp@intel.com/ All errors (new ones prefixed by >>): /usr/bin/ld: cannot find tools/tracing/latency/fixdep-in.o: No such file or directory collect2: error: ld returned 1 exit status make[5]: *** [Makefile:50: tools/tracing/latency/fixdep] Error 1 make[4]: *** [tools/build/Makefile.include:5: fixdep] Error 2 make[3]: *** [Makefile:11: latency] Error 2 make[3]: *** Waiting for unfinished jobs.... >> /usr/bin/ld: cannot find tools/tracing/rtla/fixdep-in.o: No such file or directory collect2: error: ld returned 1 exit status make[5]: *** [Makefile:50: tools/tracing/rtla/fixdep] Error 1 make[4]: *** [tools/build/Makefile.include:5: fixdep] Error 2 make[3]: *** [Makefile:20: rtla] Error 2 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
not_report The commit message says: With this fix, it prints lots of warnings like this: WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x4 (section: .text.fixup) -> (unknown) (section: .init.text) This exactly matches the new warnings in the report, so it is an expected behavior. -----Original Message----- From: lkp <lkp@intel.com> Sent: Wednesday, March 20, 2024 00:50 To: oe-kbuild@lists.linux.dev Cc: lkp <lkp@intel.com> Subject: [linux-next:master 13710/13866] WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x4 (section: .text.fixup) -> (unknown) (section: .init.text) :::::: :::::: Manual check reason: "only scripts/mod/modpost.c file changed" :::::: BCC: lkp@intel.com CC: llvm@lists.linux.dev CC: oe-kbuild-all@lists.linux.dev CC: Linux Memory Management List <linux-mm@kvack.org> TO: Max Kellermann <max.kellermann@ionos.com> CC: Masahiro Yamada <masahiroy@kernel.org> tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: 226d3c72fcde130a99d760895ebdd20e78e02cb5 commit: 23dfd914d2bfc4c9938b0084dffd7105de231d98 [13710/13866] modpost: fix null pointer dereference :::::: branch date: 15 hours ago :::::: commit date: 23 hours ago config: arm-randconfig-004-20240319 (https://download.01.org/0day-ci/archive/20240320/202403200042.khgIljOG-lkp@intel.com/config) compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project 8f68022f8e6e54d1aeae4ed301f5a015963089b7) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240320/202403200042.khgIljOG-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/r/202403200042.khgIljOG-lkp@intel.com/ All warnings (new ones prefixed by >>, old ones prefixed by <<): WARNING: modpost: missing MODULE_DESCRIPTION() in vmlinux.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/rcu/rcutorture.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/rcu/rcuscale.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/rcu/refscale.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/time/test_udelay.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/backtracetest.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/resource_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/sysctl-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/fat/fat_test.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp437.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp855.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp857.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp861.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp862.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp866.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_ascii.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-2.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-4.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp1255.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-9.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_koi8-r.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_koi8-u.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_koi8-ru.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-centeuro.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-cyrillic.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-iceland.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-romanian.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-roman.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/bcachefs/mean_and_variance_test.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/binfmt_script.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/ext4/ext4-inode-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/jbd2/jbd2.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/cramfs/cramfs.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/hfs/hfs.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/sysv/sysv.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/ufs/ufs.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/efs/efs.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/qnx6/qnx6.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/autofs/autofs4.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/adfs/adfs.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/btrfs/btrfs.o WARNING: modpost: missing MODULE_DESCRIPTION() in crypto/algif_hash.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/kunit/kunit-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/kunit/kunit-example-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/math/rational-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/find_bit_benchmark.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_bpf.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_hash.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_ubsan.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_list_sort.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_module.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_rhashtable.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_sort.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_user_copy.o >> WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x4 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x10 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x18 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x24 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x2c (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x38 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x44 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x4c (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x58 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x60 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x6c (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x74 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_static_keys.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_static_key_base.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_uuid.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_blackhole_dev.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_free_pages.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_ref_tracker.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_objpool.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/atomic64_test.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/bitfield_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/checksum_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/list-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_linear_ranges.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_bits.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/memcpy_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/is_signed_type_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/stackinit_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/fortify_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/strscpy_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/siphash_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/bus/vexpress-config.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/phy/broadcom/phy-bcm-ns-usb3.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/pinctrl/meson/pinctrl-meson.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/pinctrl/meson/pinctrl-meson8-pmx.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpio/gpio-gw-pld.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/video/backlight/platform_lcd.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/video/fbdev/goldfishfb.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/video/fbdev/vfb.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/imx/clk-imxrt1050.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779-ipe.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779-vdec.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779-venc.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779-mfg.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779-aud.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6797-img.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6797-vdec.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt2712-apmixedsys.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt2712.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt2712-jpgdec.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt2712-vdec.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt7622-eth.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt7622-hif.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt7986-apmixed.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt7986-topckgen.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8167-img.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8167-mfgcfg.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8167-vdec.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8188-imp_iic_wrap.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-img.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-ipe.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-vpp0.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-vpp1.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-wpe.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365-apmixedsys.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365-apu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365-cam.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365-mm.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365-venc.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun20i-d1-r-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun50i-a100-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun50i-h6-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun50i-h6-r-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun4i-a10-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun8i-a23-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun8i-a83t-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun8i-h3-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun8i-de2-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/clk-gate_test.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/qcom/clk-qcom.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/qcom/lpass-gfm-sm8250.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/qcom/gcc-msm8976.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/dma/qcom/hdma.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/soc/imx/soc-imx8m.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/soc/ixp4xx/ixp4xx-npe.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/virtio/virtio.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/virtio/virtio_ring.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/reset/hisilicon/hi6220_reset.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/char/hw_random/omap-rng.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/panel/panel-auo-a030jtn01.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/panel/panel-orisetech-ota5601a.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/lontium-lt9611.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/lontium-lt9611uxc.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/sil-sii8620.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/sii9234.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/drm_panel_orientation_quirks.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/drm_mipi_dbi.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/base/regmap/regmap-kunit.o -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
[Added the correct mailing list, fsverity@lists.linux.dev]
On Thu, Mar 14, 2024 at 03:20:07AM +0000, Thorsten Glaser wrote:
> Dixi quod…
>
> >Please split the package so that the part that requires pandoc is
> >done in an arch:all build. Normally, pandoc is needed only for
> >documentation, which is often easy enough to split off in a -doc
> >binary package, which can then move to B-D-Indep and be built on
> >amd64 or whatever hosts.
>
> Looking at this in some detail, this is *only* ONE manual page.
> Splitting into a separate package for one file will not go over
> well with ftpmaster.
>
> Dear upstream, please consider keeping the manpage in something
> else, like mdoc. I would be willing to convert the manpage to
> semantic, readable mdoc for you, even.
>
> (fsverity-utils is a Build-Depends of rpm, some subpackages of
> which are necessary to build other software even in Debian.)
>
> If upstream is not willing, we could:
>
> • do this as local patch (effort updating it every time)
>
> • hack a script that converts man/fsverity.1.md to mdoc;
> this doesn’t need to be a full converter, it needs to
> just be good enough to convert this one page (effort
> one-time, but probably not much if at all when updating)
>
> • as package maintainer, run the pandoc conversion script
> and put the result into debian/fsverity.1 and install
> from there and stop B-D’ing on pandoc (needs some, but
> not much, manual effort on each update, and the package
> maintainer to have a clean sid system on which to do that)
>
> • install a dummy manpage (that maybe summarises the options
> and points the reader to
> https://manpages.debian.org/unstable/fsverity/fsverity.1.en.html
> for the full page) on architectures without pandoc (needs
> a bit of initial hacking, and to keep a whitelist of arches
> with pandoc up-to-date)
>
> bye,
> //mirabilos
I'm not sure how reasonable this request is (surely the rpm package should not
be depending on the fsverity manual page...), but to eliminate the reliance on
pandoc I've gone ahead and replaced the markdown file fsverity.1.md with a
native Linux man page fsverity.1. So, it no longer needs any conversion before
installing it.
I did not choose mdoc, as I'm not familiar with it and it seems to be a BSD-ism.
- Eric
First do some clear up. Remove unused macro and function Then update DPMAI API to support MC firmware 10.1x.x To: Vinod Koul <vkoul@kernel.org> Cc: dmaengine@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: imx@lists.linux.dev Signed-off-by: Frank Li <Frank.Li@nxp.com> --- Frank Li (4): dmaengine: fsl-dpaa2-qdma: clean up unused macro dmaengine: fsl-dpaa2-qdma: Remove unused function dpdmai_create() dmaengine: fsl-dpaa2-qdma: Add dpdmai_cmd_open dmaengine: fsl-dpaa2-qdma: Update DPDMAI interfaces to version 3 drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c | 14 ++-- drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h | 5 +- drivers/dma/fsl-dpaa2-qdma/dpdmai.c | 113 +++++++++++++------------------- drivers/dma/fsl-dpaa2-qdma/dpdmai.h | 46 ++++++------- 4 files changed, 77 insertions(+), 101 deletions(-) --- base-commit: f4385d26e50bac22f8dba08727e9a32a0ab6b9ea change-id: 20240320-dpaa2-0d861c2756de Best regards, --- Frank Li <Frank.Li@nxp.com>
> -----Original Message----- > From: Lu Baolu <baolu.lu@linux.intel.com> > Sent: Monday, January 22, 2024 7:39 AM > To: Jason Gunthorpe <jgg@ziepe.ca>; Kevin Tian <kevin.tian@intel.com>; Joerg > Roedel <joro@8bytes.org>; Will Deacon <will@kernel.org>; Robin Murphy > <robin.murphy@arm.com>; Jean-Philippe Brucker <jean-philippe@linaro.org>; > Nicolin Chen <nicolinc@nvidia.com>; Yi Liu <yi.l.liu@intel.com>; Jacob Pan > <jacob.jun.pan@linux.intel.com>; Joel Granados <j.granados@samsung.com> > Cc: iommu@lists.linux.dev; virtualization@lists.linux-foundation.org; linux- > kernel@vger.kernel.org; Lu Baolu <baolu.lu@linux.intel.com> > Subject: [PATCH v3 4/8] iommufd: Add iommufd fault object > > An iommufd fault object provides an interface for delivering I/O page > faults to user space. These objects are created and destroyed by user > space, and they can be associated with or dissociated from hardware page > table objects during page table allocation or destruction. > > User space interacts with the fault object through a file interface. This > interface offers a straightforward and efficient way for user space to > handle page faults. It allows user space to read fault messages > sequentially and respond to them by writing to the same file. The file > interface supports reading messages in poll mode, so it's recommended that > user space applications use io_uring to enhance read and write efficiency. > > A fault object can be associated with any iopf-capable iommufd_hw_pgtable > during the pgtable's allocation. All I/O page faults triggered by devices > when accessing the I/O addresses of an iommufd_hw_pgtable are routed > through the fault object to user space. Similarly, user space's responses > to these page faults are routed back to the iommu device driver through > the same fault object. > > Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> [...] > +static __poll_t iommufd_fault_fops_poll(struct file *filep, > + struct poll_table_struct *wait) > +{ > + struct iommufd_fault *fault = filep->private_data; > + __poll_t pollflags = 0; > + > + poll_wait(filep, &fault->wait_queue, wait); > + mutex_lock(&fault->mutex); > + if (!list_empty(&fault->deliver)) > + pollflags = EPOLLIN | EPOLLRDNORM; > + mutex_unlock(&fault->mutex); > + > + return pollflags; > +} > + > +static const struct file_operations iommufd_fault_fops = { > + .owner = THIS_MODULE, > + .open = nonseekable_open, > + .read = iommufd_fault_fops_read, > + .write = iommufd_fault_fops_write, > + .poll = iommufd_fault_fops_poll, > + .llseek = no_llseek, > +}; Hi I am trying to enable Qemu vSVA support on ARM with this series. I am using io_uring APIs with the fault fd to handle the page fault in the Qemu. Please find the implementation here[1]. This is still a work in progress and is based on Nicolin's latest nested Qemu branch. And I am running into a problem when we have the poll interface added for the fault fd in kernel. What I have noticed is that, -read interface works fine and I can receive struct tiommu_hwpt_pgfault data. -But once Guest handles the page faults and returns the page response, the write to fault fd never reaches the kernel. The sequence is like below, sqe = io_uring_get_sqe(ring); io_uring_prep_write(sqe, hwpt->fault_fd, resp, sizeof(*resp), 0); io_uring_sqe_set_data(sqe, resp); io_uring_submit(ring); ret = io_uring_wait_cqe(ring, &cqe); .... Please find the function here[2] The above cqe wait never returns and hardware times out without receiving page response. My understanding of io_uring default op is that it tries to issue an sqe as non-blocking first. But it looks like the above write sequence ends up in kernel poll_wait() as well.Not sure how we can avoid that for write. All works fine if I comment out the poll for the fault_fd from the kernel. But then of course Qemu ends up repeatedly reading the ring Queue for any pending page fault. It might be something I am missing in my understanding of io_uring APIs. Just thought of checking with you if you have any Qemu implementation using io_uring APIs to test this. Also appreciate any pointers in resolving this. Thanks, Shameer [1] https://github.com/hisilicon/qemu/tree/iommufd_vsmmu-02292024-vsva-wip [2] https://github.com/hisilicon/qemu/blob/2b984fb5c692a03e6f5463d005670d2e2a2c7304/hw/arm/smmuv3.c#L1310
> -----Original Message----- > From: SeongJae Park <sj@kernel.org> > Sent: Tuesday, March 19, 2024 10:51 AM > To: Prasad, Aravinda <aravinda.prasad@intel.com> > Cc: damon@lists.linux.dev; linux-mm@kvack.org; sj@kernel.org; linux- > kernel@vger.kernel.org; s2322819@ed.ac.uk; Kumar, Sandeep4 > <sandeep4.kumar@intel.com>; Huang, Ying <ying.huang@intel.com>; Hansen, > Dave <dave.hansen@intel.com>; Williams, Dan J <dan.j.williams@intel.com>; > Subramoney, Sreenivas <sreenivas.subramoney@intel.com>; Kervinen, Antti > <antti.kervinen@intel.com>; Kanevskiy, Alexander > <alexander.kanevskiy@intel.com> > Subject: Re: [PATCH v2 0/3] mm/damon: Profiling enhancements for DAMON > > Hi Aravinda, > > > Thank you for posting this new revision! > > I remember I told you that I don't see a high level significant problems on on the > reply to the previous revision of this patch[1], but I show a concern now. > Sorry for not raising this earlier, but let me explain my humble concerns before > being even more late. Please find my comments below: > > On Mon, 18 Mar 2024 18:58:45 +0530 Aravinda Prasad > <aravinda.prasad@intel.com> wrote: > > > DAMON randomly samples one or more pages in every region and tracks > > accesses to them using the ACCESSED bit in PTE (or PMD for 2MB pages). > > When the region size is large (e.g., several GBs), which is common for > > large footprint applications, detecting whether the region is accessed > > or not completely depends on whether the pages that are actively > > accessed in the region are picked during random sampling. > > If such pages are not picked for sampling, DAMON fails to identify the > > region as accessed. However, increasing the sampling rate or > > increasing the number of regions increases CPU overheads of kdamond. > > DAMON uses sampling because it considers a region as accessed if a portion of > the region that big enough to be detected via sampling is all accessed. If a region > is having some pages that really accessed but the proportion is too small to be > found via sampling, I think DAMON could say the overall access to the region is > only modest and could even be ignored. In my humble opinion, this fits with the > definition of DAMON region: A memory address range that constructed with > pages having similar access frequency. Agree that DAMON considers a region as accessed if a good portion of the region is accessed. But few points I would like to discuss: For large regions (say 10GB, that has 2,621,440 4K pages), sampling at PTE level will not cover a good portion of the region. For example, default 5ms sampling and 100ms aggregation samples only 20 4K pages in an aggregation interval. Increasing sampling to 1 ms and aggregation to 1 second can only cover 1000 4K pages, but results in higher CPU overheads due to frequent sampling. Even increasing the aggregation interval to 60 seconds but sampling at 5ms can only cover 12000 samples, but region splitting and merging happens once in 60 seconds. In addition, this worsens when region sizes are say 100GB+. We observe that sampling at PTE level does not help for large regions as more samples are are required. So, decreasing/increasing the sampling or aggressions intervals proportional to the region size is not practical as all regions are of not equal size, we can have 100GB regions as well as many small regions (e.g., 16KB to 1MB). So tuning sampling rate and aggregation interval did not help for large regions. It can also be observed that large regions cannot be avoided. Large regions are created by merging adjacent smaller regions or at the beginning of profiling (depending on min regions parameter which defaults to 10). Increasing min region reduces the size of regions but increases kdamond overheads, hence, not preferable. So, sampling at PTE level cannot precisely detect accesses to large regions resulting in inaccuracies, even though it works for small regions. From our experiments, we found that with 10% hot data in a large region (80+GB regions in a 1TB+ footprint application), DAMON was not able to detect a single access to that region in 95+% cases with different sample and aggregation interval combinations. But DAMON works good for applications with footprint <50GB where regions are typically small. Now consider the scenario with the proposed enhancement. With a 100GB region, if we sample a PUD entry that covers 1GB address space, then the default 5ms sampling and 100ms aggregation samples 20 PUD entries that is 20 GB portion of the region. This gives a good estimate of the portion of the region that is accessed. But the downside is that as PUD accessed bit is set even if a small set of pages are accessed under its subtree this can report more access as real as you noted. But such large regions are split into two in the next aggregation interval. As the splitting of the regions continues, in next few aggregation intervals many smaller regions are formed. Once smaller regions are formed, the proposed enhancement cannot pick higher levels of the page table tree and behaves as good as default DAMON. So, with the proposed enhancement, larger regions are quickly split into smaller regions if they have only small set of pages accessed. To avoid misinterpreting region access count, I feel that the "age" of the region is of real help and should be considered by both DAMON and the proposed enhancement. If the age of a region is small (<10) then that region should not be considered stable and hence should not be considered for any memory tiering decisions. For regions with age, say >10, can be considered as stable as they reflect the actual access frequency. > > > > > This patch proposes profiling different levels of the > > application\u2019s page table tree to detect whether a region is > > accessed or not. This patch set is based on the observation that, when > > the accessed bit for a page is set, the accessed bits at the higher > > levels of the page table tree (PMD/PUD/PGD) corresponding to the path > > of the page table walk are also set. Hence, it is efficient to check > > the accessed bits at the higher levels of the page table tree to > > detect whether a region is accessed or not. For example, if the access > > bit for a PUD entry is set, then one or more pages in the 1GB PUD > > subtree is accessed as each PUD entry covers 1GB mapping. Hence, > > instead of sampling thousands of 4K/2M pages to detect accesses in a > > large region, sampling at the higher level of page table tree is faster and > efficient. > > Due to the above reason, I concern this could result in making DAMON monitoring > results be inaccurately biased to report more than real accesses. DAMON, even without the proposed enhancement, can result in inaccuracies for large regions, (see examples above). > > > > > This patch set is based on 6.8-rc5 kernel (commit: f48159f8, > > mm-unstable > > tree) > > > > Changes since v1 [1] > > ==================== > > > > - Added support for 5-level page table tree > > - Split the patch to mm infrastructure changes and DAMON enhancements > > - Code changes as per comments on v1 > > - Added kerneldoc comments > > > > [1] https://lkml.org/lkml/2023/12/15/272 > > > > Evaluation: > > > > - MASIM benchmark with 1GB, 10GB, 100GB footprint with 10% hot data > > and 5TB with 10GB hot data. > > - DAMON: 5ms sampling, 200ms aggregation interval. Rest all > > parameters set to default value. > > - DAMON+PTP: Page table profiling applied to DAMON with the above > > parameters. > > > > Profiling efficiency in detecting hot data: > > > > Footprint 1GB 10GB 100GB 5TB > > --------------------------------------------- > > DAMON >90% <50% ~0% 0% > > DAMON+PTP >90% >90% >90% >90% > > Sampling interval is the time interval that assumed to be large enough for the > workload to make meaningful amount of accesses within the interval. Hence, > meaningful amount of sampling interval depends on the workload's characteristic > and system's memory bandwidth. > > Here, the size of the hot memory region is about 100MB, 1GB, 10GB, and 10GB > for the four cases, respectively. And you set the sampling interval as 5ms. Let's > assume the system can access, say, 50 GB per second, and hence it could be able > to access only up to 250 MB per 5ms. So, in case of 1GB and footprint, all hot > memory region would be accessed while DAMON is waiting for next sampling > interval. Hence, DAMON would be able to see most accesses via sampling. But > for 100GB footprint case, only 250MB / 10GB = about 2.5% of the hot memory > region would be accessed between the sampling interval. DAMON cannot see > whole accesses, and hence the precision could be low. > > I don't know exact memory bandwith of the system, but to detect the 10 GB hot > region with 5ms sampling interval, the system should be able to access 2GB > memory per millisecond, or about 2TB memory per second. I think systems of > such memory bandwidth is not that common. > > I show you also explored a configuration setting the aggregation interval higher. > But because each sampling checks only access between the sampling interval, > that might not help in this setup. I'm wondering if you also explored increasing > sampling interval. > What we have observed that many real-world benchmarks we experimented with do not saturate the memory bandwidth. We also experimented with masim microbenchmark to understand the impact on memory access rate (we inserted delay between memory access operations in do_rnd_ro() and other functions). We see decrease in the precision as access intensity is reduced. We have experimented with different sampling and aggregation intervals, but that did not help much in improving precision. So, what I think is it that most of the cases the precision depends on the page (hot or cold) that is randomly picked for sampling than the sampling rate. Most of the time only cold 4K pages are picked in a large region as they typically account for 90% of the pages in the region and hence DAMON does not detect any accesses at all. By profiling higher levels of the page table tree this can be improved. > Sorry again for finding this concern not early enough. But I think we may need to > discuss about this first. Absolutely no problem. Please let me know your thoughts. Regards, Aravinda > > [1] https://lkml.kernel.org/r/20231215201159.73845-1-sj@kernel.org > > > Thanks, > SJ > > > > > > CPU overheads (in billion cycles) for kdamond: > > > > Footprint 1GB 10GB 100GB 5TB > > --------------------------------------------- > > DAMON 1.15 19.53 3.52 9.55 > > DAMON+PTP 0.83 3.20 1.27 2.55 > > > > A detailed explanation and evaluation can be found in the arXiv paper: > > https://arxiv.org/pdf/2311.10275.pdf > > > > > > Aravinda Prasad (3): > > mm/damon: mm infrastructure support > > mm/damon: profiling enhancement > > mm/damon: documentation updates > > > > Documentation/mm/damon/design.rst | 42 ++++++ > > arch/x86/include/asm/pgtable.h | 20 +++ > > arch/x86/mm/pgtable.c | 28 +++- > > include/linux/mmu_notifier.h | 36 +++++ > > include/linux/pgtable.h | 79 ++++++++++ > > mm/damon/vaddr.c | 233 ++++++++++++++++++++++++++++-- > > 6 files changed, 424 insertions(+), 14 deletions(-) > > > > -- > > 2.21.3
>-----Original Message----- >From: Philippe Gerum <rpm@xenomai.org> >Sent: Tuesday, March 19, 2024 11:41 PM >To: Rosenow, James <jim.rosenow@mts.com> >Cc: xenomai@lists.linux.dev >Subject: Re: Hang at "loading initial ramdisk ..." on Generation 11 CPU, Gen 9, >7, and 6 work. > > >"Rosenow, James" <jim.rosenow@mts.com> writes: > >> Anyone have any advice on how to root cause this hang. >> >> The requested /proc/interrupts output is below and the system does hang >with only CONFIG_IRQ_PIPELINE enabled. >> > >I'll have a look asap this week. I also reproduced such issue and am looking into it on Gen 11 CPU. Regards Hongzhan Chen > >-- >Philippe.
Many Thanks!!!!!
On 3/19/2024 8:35 PM, Michael S. Tsirkin wrote:
> My bad I messed up my tree. I think this is ok to merge
> after the window closes, will do.
>
> On Mon, Mar 04, 2024 at 01:50:18PM +0800, Zhu, Lingshan wrote:
>> Gentle Ping
>>
>> Thanks
>> Zhu Lingshan
>>
>> On 2/27/2024 10:45 PM, Zhu Lingshan wrote:
>>> This commit applies maintainer role of Intel vDPA
>>> driver for myself.
>>>
>>> I am the author of this driver and have been contributing to
>>> it for long time, I would like to help this solution evolve
>>> in future.
>>>
>>> This driver is still under virito maintenance.
>>>
>>> Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com>
>>> ---
>>> MAINTAINERS | 6 ++++--
>>> 1 file changed, 4 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/MAINTAINERS b/MAINTAINERS
>>> index 2ecaaec6a6bf..128ec843eb19 100644
>>> --- a/MAINTAINERS
>>> +++ b/MAINTAINERS
>>> @@ -10365,8 +10365,10 @@ F: include/net/nl802154.h
>>> F: net/ieee802154/
>>> F: net/mac802154/
>>> -IFCVF VIRTIO DATA PATH ACCELERATOR
>>> -R: Zhu Lingshan <lingshan.zhu@intel.com>
>>> +Intel VIRTIO DATA PATH ACCELERATOR
>>> +M: Zhu Lingshan <lingshan.zhu@intel.com>
>>> +L: virtualization@lists.linux.dev
>>> +S: Supported
>>> F: drivers/vdpa/ifcvf/
>>> IFE PROTOCOL
> -----Original Message-----
> From: Nathan Chancellor <nathan@kernel.org>
> Sent: Tuesday, March 19, 2024 7:38 PM
> To: akpm@linux-foundation.org; Brian Cain <bcain@quicinc.com>
> Cc: ndesaulniers@google.com; morbo@google.com; justinstitt@google.com;
> linux-hexagon@vger.kernel.org; llvm@lists.linux.dev; patches@lists.linux.dev;
> stable@vger.kernel.org; Nathan Chancellor <nathan@kernel.org>
> Subject: [PATCH] hexagon: vmlinux.lds.S: Handle attributes section
>
> WARNING: This email originated from outside of Qualcomm. Please be wary
> of any links or attachments, and do not enable macros.
>
> After the linked LLVM change, the build fails with
> CONFIG_LD_ORPHAN_WARN_LEVEL="error", which happens with
> allmodconfig:
>
> ld.lld: error: vmlinux.a(init/main.o):(.hexagon.attributes) is being placed in
> '.hexagon.attributes'
>
> Handle the attributes section in a similar manner as arm and riscv by
> adding it after the primary ELF_DETAILS grouping in vmlinux.lds.S, which
> fixes the error.
>
> Cc: stable@vger.kernel.org
> Fixes: 113616ec5b64 ("hexagon: select ARCH_WANT_LD_ORPHAN_WARN")
> Link: https://github.com/llvm/llvm-
> project/commit/31f4b329c8234fab9afa59494d7f8bdaeaefeaad
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> ---
> arch/hexagon/kernel/vmlinux.lds.S | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/arch/hexagon/kernel/vmlinux.lds.S
> b/arch/hexagon/kernel/vmlinux.lds.S
> index 1140051a0c45..1150b77fa281 100644
> --- a/arch/hexagon/kernel/vmlinux.lds.S
> +++ b/arch/hexagon/kernel/vmlinux.lds.S
> @@ -63,6 +63,7 @@ SECTIONS
> STABS_DEBUG
> DWARF_DEBUG
> ELF_DETAILS
> + .hexagon.attributes 0 : { *(.hexagon.attributes) }
>
> DISCARDS
> }
>
> ---
> base-commit: e8f897f4afef0031fe618a8e94127a0934896aba
> change-id: 20240319-hexagon-handle-attributes-section-vmlinux-lds-s-
> 2a14b14799c0
>
> Best regards,
> --
> Nathan Chancellor <nathan@kernel.org>
Reviewed-by: Brian Cain <bcain@quicinc.com>
The patch titled Subject: MAINTAINERS: remove incorrect M: tag for dm-devel@lists.linux.dev has been added to the -mm mm-hotfixes-unstable branch. Its filename is maintainers-remove-incorrect-m-tag-for-dm-devel-listslinuxdev.patch This patch will shortly appear at https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/maintainers-remove-incorrect-m-tag-for-dm-devel-listslinuxdev.patch This patch will later appear in the mm-hotfixes-unstable branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next via the mm-everything branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm and is updated there every 2-3 working days ------------------------------------------------------ From: Kuan-Wei Chiu <visitorckw@gmail.com> Subject: MAINTAINERS: remove incorrect M: tag for dm-devel@lists.linux.dev Date: Wed, 20 Mar 2024 02:18:42 +0800 The dm-devel@lists.linux.dev mailing list should only be listed under the L: (List) tag in the MAINTAINERS file. However, it was incorrectly listed under both L: and M: (Maintainers) tags, which is not accurate. Remove the M: tag for dm-devel@lists.linux.dev in the MAINTAINERS file to reflect the correct categorization. Link: https://lkml.kernel.org/r/20240319181842.249547-1-visitorckw@gmail.com Signed-off-by: Kuan-Wei Chiu <visitorckw@gmail.com> Cc: Ching-Chun (Jim) Huang <jserv@ccns.ncku.edu.tw> Cc: Matthew Sakai <msakai@redhat.com> Cc: Michael Sclafani <dm-devel@lists.linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> --- MAINTAINERS | 1 - 1 file changed, 1 deletion(-) --- a/MAINTAINERS~maintainers-remove-incorrect-m-tag-for-dm-devel-listslinuxdev +++ a/MAINTAINERS @@ -6159,7 +6159,6 @@ F: include/uapi/linux/dm-*.h DEVICE-MAPPER VDO TARGET M: Matthew Sakai <msakai@redhat.com> -M: dm-devel@lists.linux.dev L: dm-devel@lists.linux.dev S: Maintained F: Documentation/admin-guide/device-mapper/vdo*.rst _ Patches currently in -mm which might be from visitorckw@gmail.com are maintainers-remove-incorrect-m-tag-for-dm-devel-listslinuxdev.patch
The dm-devel@lists.linux.dev mailing list should only be listed under the L: (List) tag in the MAINTAINERS file. However, it was incorrectly listed under both L: and M: (Maintainers) tags, which is not accurate. Remove the M: tag for dm-devel@lists.linux.dev in the MAINTAINERS file to reflect the correct categorization. Signed-off-by: Kuan-Wei Chiu <visitorckw@gmail.com> --- MAINTAINERS | 1 - 1 file changed, 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 82896c3e0559..e0a4e0def090 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -6172,7 +6172,6 @@ F: include/uapi/linux/dm-*.h DEVICE-MAPPER VDO TARGET M: Matthew Sakai <msakai@redhat.com> -M: dm-devel@lists.linux.dev L: dm-devel@lists.linux.dev S: Maintained F: Documentation/admin-guide/device-mapper/vdo*.rst -- 2.34.1
Changes in v4: - change wifi pwrseq node name to 'pwrseq' in sun50i-h616-t95.dtsi - replace vcc-pg-supply value to reg_aldo1 in &pio - Link to v3: https://lore.kernel.org/r/20240317-add-t95-axp313-support-v3-0-0d63f7c23d37@gmail.com Changes in v3: - remove underscore from wifi_pwrseq node name in sun50i-h616-t95.dtsi - fix line wrap in commit message - Link to v2: https://lore.kernel.org/r/20240317-add-t95-axp313-support-v2-0-e38032811758@gmail.com T95 is a most commonly known for being a box with a pre-installed malware. It uses Allwinner H616 and comes with NAND, and DDR3 memory. Those TV boxes usually come with common hardware: - Allwinner H616 SoC - 2/4 GB DDR3 SDRAM (Hynix H5TQ2G43BFR) - 16/32/64 GB NAND flash - microSD slot - AXP305 or AXP313 PMIC depending on board revision - 3.5mm A/V output - HDMI port - 2x USB 2.0 ports - 100M ETH using Internal PHY - LG642 Wi-Fi and BT chip (rebranded BCM43342) - 7-segment display - DC 5V barrel jack port The board contains holes hor UART header wired to &uart0. &uart1 is used by bluetooth module From the DRAM specification its operation voltage is 1.5V. To: Rob Herring <robh@kernel.org> To: Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org> To: Conor Dooley <conor+dt@kernel.org> To: Chen-Yu Tsai <wens@csie.org> To: Jernej Skrabec <jernej.skrabec@gmail.com> To: Samuel Holland <samuel@sholland.org> To: Maxime Ripard <mripard@kernel.org> Cc: devicetree@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-sunxi@lists.linux.dev Signed-off-by: Kamil Kasperski <ressetkk@gmail.com> --- Kamil Kasperski (3): dt-bindings: vendor-prefixes: add t95 string dt-bindings: arm: sunxi: add T95 AXP313 arm64: dts: allwinner: h616: add support for T95 tv boxes Documentation/devicetree/bindings/arm/sunxi.yaml | 5 + .../devicetree/bindings/vendor-prefixes.yaml | 2 + arch/arm64/boot/dts/allwinner/Makefile | 1 + arch/arm64/boot/dts/allwinner/sun50i-h616-t95.dtsi | 109 +++++++++++++++++++++ .../dts/allwinner/sun50i-h616-t95max-axp313.dts | 84 ++++++++++++++++ 5 files changed, 201 insertions(+) --- base-commit: 4138f02288333cb596885e9af03dd3ea2de845cb change-id: 20240315-add-t95-axp313-support-5f3da8996edd Best regards, -- Kamil Kasperski <ressetkk@gmail.com> _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Changes in v4: - change wifi pwrseq node name to 'pwrseq' in sun50i-h616-t95.dtsi - replace vcc-pg-supply value to reg_aldo1 in &pio - Link to v3: https://lore.kernel.org/r/20240317-add-t95-axp313-support-v3-0-0d63f7c23d37@gmail.com Changes in v3: - remove underscore from wifi_pwrseq node name in sun50i-h616-t95.dtsi - fix line wrap in commit message - Link to v2: https://lore.kernel.org/r/20240317-add-t95-axp313-support-v2-0-e38032811758@gmail.com T95 is a most commonly known for being a box with a pre-installed malware. It uses Allwinner H616 and comes with NAND, and DDR3 memory. Those TV boxes usually come with common hardware: - Allwinner H616 SoC - 2/4 GB DDR3 SDRAM (Hynix H5TQ2G43BFR) - 16/32/64 GB NAND flash - microSD slot - AXP305 or AXP313 PMIC depending on board revision - 3.5mm A/V output - HDMI port - 2x USB 2.0 ports - 100M ETH using Internal PHY - LG642 Wi-Fi and BT chip (rebranded BCM43342) - 7-segment display - DC 5V barrel jack port The board contains holes hor UART header wired to &uart0. &uart1 is used by bluetooth module From the DRAM specification its operation voltage is 1.5V. To: Rob Herring <robh@kernel.org> To: Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org> To: Conor Dooley <conor+dt@kernel.org> To: Chen-Yu Tsai <wens@csie.org> To: Jernej Skrabec <jernej.skrabec@gmail.com> To: Samuel Holland <samuel@sholland.org> To: Maxime Ripard <mripard@kernel.org> Cc: devicetree@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-sunxi@lists.linux.dev Signed-off-by: Kamil Kasperski <ressetkk@gmail.com> --- Kamil Kasperski (3): dt-bindings: vendor-prefixes: add t95 string dt-bindings: arm: sunxi: add T95 AXP313 arm64: dts: allwinner: h616: add support for T95 tv boxes Documentation/devicetree/bindings/arm/sunxi.yaml | 5 + .../devicetree/bindings/vendor-prefixes.yaml | 2 + arch/arm64/boot/dts/allwinner/Makefile | 1 + arch/arm64/boot/dts/allwinner/sun50i-h616-t95.dtsi | 109 +++++++++++++++++++++ .../dts/allwinner/sun50i-h616-t95max-axp313.dts | 84 ++++++++++++++++ 5 files changed, 201 insertions(+) --- base-commit: 4138f02288333cb596885e9af03dd3ea2de845cb change-id: 20240315-add-t95-axp313-support-5f3da8996edd Best regards, -- Kamil Kasperski <ressetkk@gmail.com>
:::::: :::::: Manual check reason: "only scripts/mod/modpost.c file changed" :::::: BCC: lkp@intel.com CC: llvm@lists.linux.dev CC: oe-kbuild-all@lists.linux.dev CC: Linux Memory Management List <linux-mm@kvack.org> TO: Max Kellermann <max.kellermann@ionos.com> CC: Masahiro Yamada <masahiroy@kernel.org> tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: 226d3c72fcde130a99d760895ebdd20e78e02cb5 commit: 23dfd914d2bfc4c9938b0084dffd7105de231d98 [13710/13866] modpost: fix null pointer dereference :::::: branch date: 15 hours ago :::::: commit date: 23 hours ago config: arm-randconfig-004-20240319 (https://download.01.org/0day-ci/archive/20240320/202403200042.khgIljOG-lkp@intel.com/config) compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project 8f68022f8e6e54d1aeae4ed301f5a015963089b7) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240320/202403200042.khgIljOG-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/r/202403200042.khgIljOG-lkp@intel.com/ All warnings (new ones prefixed by >>, old ones prefixed by <<): WARNING: modpost: missing MODULE_DESCRIPTION() in vmlinux.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/rcu/rcutorture.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/rcu/rcuscale.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/rcu/refscale.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/time/test_udelay.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/backtracetest.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/resource_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/sysctl-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/fat/fat_test.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp437.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp855.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp857.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp861.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp862.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp866.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_ascii.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-2.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-4.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_cp1255.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_iso8859-9.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_koi8-r.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_koi8-u.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/nls_koi8-ru.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-centeuro.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-cyrillic.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-iceland.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-romanian.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/nls/mac-roman.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/bcachefs/mean_and_variance_test.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/binfmt_script.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/ext4/ext4-inode-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/jbd2/jbd2.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/cramfs/cramfs.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/hfs/hfs.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/sysv/sysv.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/ufs/ufs.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/efs/efs.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/qnx6/qnx6.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/autofs/autofs4.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/adfs/adfs.o WARNING: modpost: missing MODULE_DESCRIPTION() in fs/btrfs/btrfs.o WARNING: modpost: missing MODULE_DESCRIPTION() in crypto/algif_hash.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/kunit/kunit-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/kunit/kunit-example-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/math/rational-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/find_bit_benchmark.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_bpf.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_hash.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_ubsan.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_list_sort.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_module.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_rhashtable.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_sort.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_user_copy.o >> WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x4 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x10 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x18 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x24 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x2c (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x38 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x44 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x4c (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x58 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x60 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x6c (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: lib/test_user_copy: section mismatch in reference: (unknown)+0x74 (section: .text.fixup) -> (unknown) (section: .init.text) WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_static_keys.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_static_key_base.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_uuid.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_blackhole_dev.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_free_pages.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_ref_tracker.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_objpool.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/atomic64_test.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/bitfield_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/checksum_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/list-test.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_linear_ranges.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_bits.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/memcpy_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/is_signed_type_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/stackinit_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/fortify_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/strscpy_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/siphash_kunit.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/bus/vexpress-config.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/phy/broadcom/phy-bcm-ns-usb3.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/pinctrl/meson/pinctrl-meson.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/pinctrl/meson/pinctrl-meson8-pmx.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpio/gpio-gw-pld.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/video/backlight/platform_lcd.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/video/fbdev/goldfishfb.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/video/fbdev/vfb.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/imx/clk-imxrt1050.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779-ipe.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779-vdec.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779-venc.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779-mfg.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6779-aud.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6797-img.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt6797-vdec.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt2712-apmixedsys.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt2712.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt2712-jpgdec.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt2712-vdec.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt7622-eth.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt7622-hif.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt7986-apmixed.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt7986-topckgen.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8167-img.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8167-mfgcfg.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8167-vdec.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8188-imp_iic_wrap.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-img.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-ipe.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-vpp0.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-vpp1.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8195-wpe.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365-apmixedsys.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365-apu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365-cam.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365-mm.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/mediatek/clk-mt8365-venc.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun20i-d1-r-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun50i-a100-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun50i-h6-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun50i-h6-r-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun4i-a10-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun8i-a23-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun8i-a83t-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun8i-h3-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/sunxi-ng/sun8i-de2-ccu.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/clk-gate_test.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/qcom/clk-qcom.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/qcom/lpass-gfm-sm8250.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/clk/qcom/gcc-msm8976.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/dma/qcom/hdma.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/soc/imx/soc-imx8m.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/soc/ixp4xx/ixp4xx-npe.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/virtio/virtio.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/virtio/virtio_ring.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/reset/hisilicon/hi6220_reset.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/char/hw_random/omap-rng.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/panel/panel-auo-a030jtn01.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/panel/panel-orisetech-ota5601a.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/lontium-lt9611.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/lontium-lt9611uxc.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/sil-sii8620.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/bridge/sii9234.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/drm_panel_orientation_quirks.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/gpu/drm/drm_mipi_dbi.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/base/regmap/regmap-kunit.o -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki