ndctl: Revert "ndctl: Create ndctl udev rules for dirty shutdown"
BZ: 1637624
commit 5c67ce4d0b6a678c52f35a6a1e2dd14983076a19
Author: Dan Williams <dan.j.williams@intel.com>
Date: Thu Sep 27 17:41:53 2018 -0700
ndctl: Revert "ndctl: Create ndctl udev rules for dirty shutdown"
Environments that choose to implement dirty-shutdown mitigation can use
'list --dimm --health nmemX' to retrieve the dirty-shutdown count, or
the new 'nmemX/nfit/dirty_shutdown' attribute in sysfs. The kernel
otherwise takes no default action on that counter rolling. If the
platform advertises support for "Memory Controller Flush to NVDIMM
Durability on Power Loss Capable" then the default Linux policy is to
trust that designation.
Otherwise this usage of libndctl enumeration apis in the udev path
causes the entire udev queue to backup behind libnvdimm sub-system
initialization:
INFO: task systemd-udevd:1554 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
systemd-udevd D 0 1554 1544 0x80000004
Call Trace:
? __schedule+0x25d/0x870
schedule+0x28/0x80
async_synchronize_cookie_domain+0x96/0x140
? finish_wait+0x80/0x80
nvdimm_bus_check_dimm_count+0x31/0xa0 [libnvdimm]
acpi_nfit_register_dimms+0x4b5/0x800 [nfit]
acpi_nfit_init+0xca6/0x1300 [nfit]
? acpi_nfit_add+0x197/0x210 [nfit]
acpi_nfit_add+0x197/0x210 [nfit]
acpi_device_probe+0x48/0x110
Cc: Keith Busch <keith.busch@intel.com>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
diff -uprN ndctl-62/.gitignore ndctl-62.new/.gitignore
--- ndctl-62/.gitignore 2018-08-13 20:06:33.000000000 -0400
+++ ndctl-62.new/.gitignore 2018-10-09 11:55:10.410374923 -0400
@@ -25,7 +25,6 @@ daxctl/lib/libdaxctl.pc
*.a
ndctl/lib/libndctl.pc
ndctl/ndctl
-ndctl/ndctl-udev
rhel/
sles/ndctl.spec
util/log.lo
diff -uprN ndctl-62/Makefile.am ndctl-62.new/Makefile.am
--- ndctl-62/Makefile.am 2018-08-13 20:06:33.000000000 -0400
+++ ndctl-62.new/Makefile.am 2018-10-09 11:55:10.410374923 -0400
@@ -42,9 +42,6 @@ bashcompletiondir = $(BASH_COMPLETION_DI
dist_bashcompletion_DATA = contrib/ndctl
endif
-udevrulesdir = $(UDEVDIR)/rules.d
-dist_udevrules_DATA = contrib/80-ndctl.rules
-
noinst_LIBRARIES = libccan.a
libccan_a_SOURCES = \
ccan/str/str.h \
diff -uprN ndctl-62/configure.ac ndctl-62.new/configure.ac
--- ndctl-62/configure.ac 2018-08-13 20:06:33.000000000 -0400
+++ ndctl-62.new/configure.ac 2018-10-09 11:58:18.412932195 -0400
@@ -169,9 +169,6 @@ AC_ARG_WITH([tmpfilesdir],
[tmpfilesdir=$withval],
[tmpfilesdir="/run"])
-UDEVDIR="$(pkg-config udev --variable=udevdir)"
-AC_SUBST([UDEVDIR])
-
my_CFLAGS="\
-D DEF_CONF_FILE='\"${sysconfdir}/ndctl/monitor.conf\"' \
-D DEF_TMPFS_DIR='\"${tmpfilesdir}/ndctl\"' \
diff -uprN ndctl-62/configure.ac.orig ndctl-62.new/configure.ac.orig
--- ndctl-62/configure.ac.orig 1969-12-31 19:00:00.000000000 -0500
+++ ndctl-62.new/configure.ac.orig 2018-10-09 11:54:00.000000000 -0400
@@ -0,0 +1,223 @@
+AC_PREREQ(2.60)
+m4_include([version.m4])
+AC_INIT([ndctl],
+ GIT_VERSION,
+ [linux-nvdimm@lists.01.org],
+ [ndctl],
+ [https://github.com/pmem/ndctl])
+AC_CONFIG_SRCDIR([ndctl/lib/libndctl.c])
+AC_CONFIG_AUX_DIR([build-aux])
+AM_INIT_AUTOMAKE([
+ check-news
+ foreign
+ 1.11
+ -Wall
+ -Wno-portability
+ silent-rules
+ tar-pax
+ no-dist-gzip
+ dist-xz
+ subdir-objects
+])
+AC_PROG_CC_STDC
+AC_USE_SYSTEM_EXTENSIONS
+AC_SYS_LARGEFILE
+AC_CONFIG_MACRO_DIR([m4])
+AM_SILENT_RULES([yes])
+LT_INIT([
+ disable-static
+ pic-only
+])
+AC_PREFIX_DEFAULT([/usr])
+
+AC_PROG_SED
+AC_PROG_MKDIR_P
+
+AC_ARG_ENABLE([docs],
+ AS_HELP_STRING([--disable-docs],
+ [disable documentation build @<:@default=enabled@:>@]),
+ [], enable_docs=yes)
+AS_IF([test "x$enable_docs" = "xyes"], [
+ AC_DEFINE(ENABLE_DOCS, [1], [Documentation / man pages.])
+])
+AM_CONDITIONAL([ENABLE_DOCS], [test "x$enable_docs" = "xyes"])
+
+AC_ARG_ENABLE([asciidoctor],
+ AS_HELP_STRING([--enable-asciidoctor],
+ [use asciidoctor for documentation build]),
+ [], enable_asciidoctor=no)
+AM_CONDITIONAL([USE_ASCIIDOCTOR], [test "x$enable_asciidoctor" = "xyes"])
+if test "x$enable_asciidoctor" = "xyes"; then
+ asciidoc="asciidoctor"
+else
+ asciidoc="asciidoc"
+fi
+AC_CHECK_PROG(ASCIIDOC, [$asciidoc], [$(which $asciidoc)], [missing])
+if test "x$ASCIIDOC" = xmissing -a "x$enable_docs" = "xyes"; then
+ AC_MSG_ERROR([$asciidoc needed to build documentation])
+fi
+AC_SUBST([ASCIIDOC])
+
+if test x"$asciidoc" = x"asciidoc"; then
+AC_CHECK_PROG(XMLTO, [xmlto], [$(which xmlto)], [missing])
+if test "x$XMLTO" = xmissing -a "x$enable_docs" = "xyes"; then
+ AC_MSG_ERROR([xmlto needed to build documentation])
+fi
+AC_SUBST([XMLTO])
+fi
+
+AC_C_TYPEOF
+AC_DEFINE([HAVE_STATEMENT_EXPR], 1, [Define to 1 if you have statement expressions.])
+
+AC_C_BIGENDIAN(
+ AC_DEFINE(HAVE_BIG_ENDIAN, 1, [Define to 1 if big-endian-arch]),
+ AC_DEFINE(HAVE_LITTLE_ENDIAN, 1, [Define to 1 if little-endian-arch]),
+ [], [])
+
+AC_ARG_ENABLE([logging],
+ AS_HELP_STRING([--disable-logging], [disable system logging @<:@default=enabled@:>@]),
+ [], enable_logging=yes)
+AS_IF([test "x$enable_logging" = "xyes"], [
+ AC_DEFINE(ENABLE_LOGGING, [1], [System logging.])
+])
+
+AC_ARG_ENABLE([debug],
+ AS_HELP_STRING([--enable-debug], [enable debug messages @<:@default=disabled@:>@]),
+ [], [enable_debug=no])
+AS_IF([test "x$enable_debug" = "xyes"], [
+ AC_DEFINE(ENABLE_DEBUG, [1], [Debug messages.])
+])
+
+AC_ARG_ENABLE([destructive],
+ AS_HELP_STRING([--enable-destructive], [enable destructive functional tests @<:@default=disabled@:>@]),
+ [], [enable_destructive=no])
+AS_IF([test "x$enable_destructive" = "xyes"],
+ [AC_DEFINE([ENABLE_DESTRUCTIVE], [1], [destructive functional tests support])])
+AM_CONDITIONAL([ENABLE_DESTRUCTIVE], [test "x$enable_destructive" = "xyes"])
+
+AC_ARG_ENABLE([test],
+ AS_HELP_STRING([--enable-test], [enable ndctl test command @<:@default=disabled@:>@]),
+ [], [enable_test=$enable_destructive])
+AS_IF([test "x$enable_test" = "xyes"],
+ [AC_DEFINE([ENABLE_TEST], [1], [ndctl test support])])
+AM_CONDITIONAL([ENABLE_TEST], [test "x$enable_test" = "xyes"])
+
+AC_CHECK_DECLS([BUS_MCEERR_AR], [enable_bus_mc_err=yes], [], [[#include <signal.h>]])
+AC_CHECK_DECLS([MAP_SYNC], [enable_map_sync=yes], [], [[#include <linux/mman.h>]])
+
+AS_IF([test "x$enable_bus_mc_err" = "xyes" -a "x$enable_map_sync" = "xyes"],
+ [AC_DEFINE([ENABLE_POISON], [1], [ndctl test poison support])])
+AM_CONDITIONAL([ENABLE_POISON],
+ [test "x$enable_bus_mc_err" = "xyes" -a "x$enable_map_sync" = "xyes"])
+
+PKG_CHECK_MODULES([KMOD], [libkmod])
+PKG_CHECK_MODULES([UUID], [uuid])
+PKG_CHECK_MODULES([JSON], [json-c])
+
+AC_ARG_WITH([bash-completion-dir],
+ AS_HELP_STRING([--with-bash-completion-dir[=PATH]],
+ [Install the bash auto-completion script in this directory. @<:@default=yes@:>@]),
+ [],
+ [with_bash_completion_dir=yes])
+
+if test "x$with_bash_completion_dir" = "xyes"; then
+ PKG_CHECK_MODULES([BASH_COMPLETION], [bash-completion >= 2.0],
+ [BASH_COMPLETION_DIR="`pkg-config --variable=completionsdir bash-completion`"],
+ [BASH_COMPLETION_DIR="$datadir/bash-completion/completions"])
+else
+ BASH_COMPLETION_DIR="$with_bash_completion_dir"
+fi
+
+AC_SUBST([BASH_COMPLETION_DIR])
+AM_CONDITIONAL([ENABLE_BASH_COMPLETION],[test "x$with_bash_completion_dir" != "xno"])
+
+AC_ARG_ENABLE([local],
+ AS_HELP_STRING([--disable-local], [build against kernel ndctl.h @<:@default=system@:>@]),
+ [], [enable_local=yes])
+
+AC_CHECK_HEADERS_ONCE([linux/version.h])
+
+AC_CHECK_FUNCS([ \
+ __secure_getenv \
+ secure_getenv\
+])
+
+PKG_PROG_PKG_CONFIG
+AC_ARG_WITH([systemd-unit-dir],
+ AS_HELP_STRING([--with-systemd-unit-dir[=DIR]],
+ [Directory for systemd service files]),
+ [],
+ [with_systemd_unit_dir=yes])
+
+if test "x$with_systemd_unit_dir" = "xyes"; then
+ def_systemd_unit_dir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)
+ if test "x$def_systemd_unit_dir" = "x"; then
+ AC_MSG_ERROR([systemd support requested but pkg-config unable to query systemd package])
+ with_systemd_unit_dir=no
+ else
+ with_systemd_unit_dir="$def_systemd_unit_dir"
+ fi
+fi
+
+AS_IF([test "x$with_systemd_unit_dir" != "xno"],
+ [AC_SUBST([systemd_unitdir], [$with_systemd_unit_dir])])
+AM_CONDITIONAL([ENABLE_SYSTEMD_UNIT_DIR], [test "x$with_systemd_unit_dir" != "xno"])
+
+AC_ARG_WITH([tmpfilesdir],
+ [AS_HELP_STRING([--with-tmpfilesdir=DIR], [Directory for temporary runtime files])],
+ [tmpfilesdir=$withval],
+ [tmpfilesdir="/run"])
+
+my_CFLAGS="\
+-D DEF_CONF_FILE='\"${sysconfdir}/ndctl/monitor.conf\"' \
+-D DEF_TMPFS_DIR='\"${tmpfilesdir}/ndctl\"' \
+-Wall \
+-Wchar-subscripts \
+-Wformat-security \
+-Wmissing-declarations \
+-Wmissing-prototypes \
+-Wnested-externs \
+-Wpointer-arith \
+-Wshadow \
+-Wsign-compare \
+-Wstrict-prototypes \
+-Wtype-limits \
+-Wmaybe-uninitialized \
+-Wdeclaration-after-statement \
+-Wunused-result \
+-D_FORTIFY_SOURCE=2 \
+-O2
+"
+AC_SUBST([my_CFLAGS])
+
+AC_CONFIG_HEADERS(config.h)
+AC_CONFIG_FILES([
+ Makefile
+ daxctl/lib/Makefile
+ ndctl/lib/Makefile
+ ndctl/Makefile
+ daxctl/Makefile
+ test/Makefile
+ Documentation/ndctl/Makefile
+ Documentation/daxctl/Makefile
+])
+
+AC_OUTPUT
+AC_MSG_RESULT([
+ $PACKAGE $VERSION
+ =====
+
+ prefix: ${prefix}
+ sysconfdir: ${sysconfdir}
+ libdir: ${libdir}
+ includedir: ${includedir}
+ systemd-unit-dir: ${systemd_unitdir}
+ tmpfilesdir: ${tmpfilesdir}
+
+ compiler: ${CC}
+ cflags: ${CFLAGS}
+ ldflags: ${LDFLAGS}
+
+ logging: ${enable_logging}
+ debug: ${enable_debug}
+])
diff -uprN ndctl-62/contrib/80-ndctl.rules ndctl-62.new/contrib/80-ndctl.rules
--- ndctl-62/contrib/80-ndctl.rules 2018-08-13 20:06:33.000000000 -0400
+++ ndctl-62.new/contrib/80-ndctl.rules 1969-12-31 19:00:00.000000000 -0500
@@ -1,3 +0,0 @@
-# do not edit this file, it will be overwritten on update
-
-ACTION=="add", KERNEL=="nmem*", RUN+="ndctl-udev $kernel"
diff -uprN ndctl-62/ndctl/Makefile.am ndctl-62.new/ndctl/Makefile.am
--- ndctl-62/ndctl/Makefile.am 2018-08-13 20:06:33.000000000 -0400
+++ ndctl-62.new/ndctl/Makefile.am 2018-10-09 11:55:10.411374926 -0400
@@ -51,8 +51,3 @@ EXTRA_DIST += $(monitor_config_file)
if ENABLE_SYSTEMD_UNIT_DIR
systemd_unit_DATA = ndctl-monitor.service
endif
-
-ndctl_udevdir = $(UDEVDIR)
-ndctl_udev_PROGRAMS = ndctl-udev
-ndctl_udev_SOURCES = ndctl-udev.c
-ndctl_udev_LDADD = lib/libndctl.la
diff -uprN ndctl-62/ndctl/ndctl-udev.c ndctl-62.new/ndctl/ndctl-udev.c
--- ndctl-62/ndctl/ndctl-udev.c 2018-08-13 20:06:33.000000000 -0400
+++ ndctl-62.new/ndctl/ndctl-udev.c 1969-12-31 19:00:00.000000000 -0500
@@ -1,150 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright(c) 2018 Intel Corporation. All rights reserved. */
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <ndctl/libndctl.h>
-
-/**
- * mkdir_p
- *
- * Copied from util-linux lib/fileutils.c
- */
-static int mkdir_p(const char *path, mode_t mode)
-{
- char *p, *dir;
- int rc = 0;
-
- if (!path || !*path)
- return -EINVAL;
-
- dir = p = strdup(path);
- if (!dir)
- return -ENOMEM;
-
- if (*p == '/')
- p++;
-
- while (p && *p) {
- char *e = strchr(p, '/');
- if (e)
- *e = '\0';
- if (*p) {
- rc = mkdir(dir, mode);
- if (rc && errno != EEXIST)
- break;
- rc = 0;
- }
- if (!e)
- break;
- *e = '/';
- p = e + 1;
- }
-
- free(dir);
- return rc;
-}
-
-static struct ndctl_dimm *find_dimm(struct ndctl_ctx *ctx, const char *devname)
-{
- struct ndctl_bus *bus;
- struct ndctl_dimm *dimm;
-
- ndctl_bus_foreach(ctx, bus) {
- ndctl_dimm_foreach(bus, dimm) {
- if (strcmp(ndctl_dimm_get_devname(dimm), devname) == 0)
- return dimm;
- }
- }
- return NULL;
-}
-
-static void ack_shutdown(struct ndctl_dimm *dimm)
-{
- struct ndctl_cmd *cmd;
-
- cmd = ndctl_dimm_cmd_new_ack_shutdown_count(dimm);
- if (!cmd)
- return;
- ndctl_cmd_submit(cmd);
- ndctl_cmd_unref(cmd);
-}
-
-static void save_unsafe_shutdown_count(struct ndctl_dimm *dimm,
- const char *devname)
-{
- char *path, *usc, count[16];
- unsigned int shutdown;
- struct ndctl_cmd *cmd;
- int fd;
-
- cmd = ndctl_dimm_cmd_new_smart(dimm);
- if (!cmd)
- return;
-
- if (ndctl_cmd_submit(cmd))
- goto unref_cmd;
-
- shutdown = ndctl_cmd_smart_get_shutdown_count(cmd);
- if (shutdown == UINT_MAX)
- goto unref_cmd;
-
- if (asprintf(&path, DEF_TMPFS_DIR "/%s", devname) < 0)
- goto unref_cmd;
-
- if (mkdir_p(path, 0755))
- goto free_path;
-
- if (asprintf(&usc, "%s/usc", path) < 0)
- goto free_path;
-
- fd = open(usc, O_WRONLY | O_CREAT, 0644);
- if (fd < 0)
- goto free_usc;
-
- if (snprintf(count, sizeof(count), "%u\n", shutdown) < 0)
- goto close_fd;
-
- if (write(fd, count, strlen(count)) < 0)
- goto close_fd;
-
- close_fd:
- close(fd);
- free_usc:
- free(usc);
- free_path:
- free(path);
- unref_cmd:
- ndctl_cmd_unref(cmd);
-}
-
-int main(int argc, char *argv[])
-{
- struct ndctl_ctx *ctx;
- struct ndctl_dimm *dimm = NULL;
- const char *devname;
-
- if (argc < 2)
- return EINVAL;
-
- devname = argv[1];
- if (ndctl_new(&ctx))
- return ENOMEM;
-
- dimm = find_dimm(ctx, devname);
- if (!dimm)
- return ENODEV;
-
- ack_shutdown(dimm);
- save_unsafe_shutdown_count(dimm, devname);
-
- ndctl_unref(ctx);
- return 0;
-}
diff -uprN ndctl-62/ndctl.spec.in ndctl-62.new/ndctl.spec.in
--- ndctl-62/ndctl.spec.in 2018-08-13 20:06:33.000000000 -0400
+++ ndctl-62.new/ndctl.spec.in 2018-10-09 11:55:10.411374926 -0400
@@ -110,7 +110,6 @@ make check
%postun -n DAX_LNAME -p /sbin/ldconfig
%define bashcompdir %(pkg-config --variable=completionsdir bash-completion)
-%define udevdir %(pkg-config --variable=udevdir udev)
%files
%defattr(-,root,root)
@@ -120,8 +119,6 @@ make check
%{bashcompdir}/
%{_sysconfdir}/ndctl/monitor.conf
%{_unitdir}/ndctl-monitor.service
-%{_udevrulesdir}/80-ndctl.rules
-%{udevdir}/ndctl-udev
%files -n daxctl
%defattr(-,root,root)