Hello community,

here is the log from the commit of package util-linux for openSUSE:Factory 
checked in at 2017-12-29 18:46:28
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/util-linux (Old)
 and      /work/SRC/openSUSE:Factory/.util-linux.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "util-linux"

Fri Dec 29 18:46:28 2017 rev:223 rq:558203 version:2.31

Changes:
--------
--- /work/SRC/openSUSE:Factory/util-linux/python-libmount.changes       
2017-10-06 10:53:38.602302247 +0200
+++ /work/SRC/openSUSE:Factory/.util-linux.new/python-libmount.changes  
2017-12-29 18:46:38.226520805 +0100
@@ -1,0 +2,50 @@
+Mon Dec 18 15:30:56 CET 2017 - sbra...@suse.com
+
+- Update bash completion conflict to cover rfkill file conflict.
+
+-------------------------------------------------------------------
+Mon Dec  4 17:28:04 CET 2017 - sbra...@suse.com
+
+- lsmem: Add support for zone awareness (bsc#1065471, FATE#324252,
+  util-linux-lsmem-memory-zone-1.patch,
+  util-linux-lsmem-memory-zone-2.patch,
+  util-linux-lsmem-memory-zone-3.patch).
+- Drop util-linux-losetup-Add-support-for-setting-logical-blocksize.patch.
+  Different implementations exists in the new kernel, and it has
+  a conflicting implementation in util-linux.
+
+-------------------------------------------------------------------
+Mon Nov 20 17:29:11 CET 2017 - sbra...@suse.com
+
+- Update to version 2.31:
+  * New utilities: uuidparse, rfkill.
+  * su has been refactored and extended to create pseudo terminal
+    (new option --pty, CVE-2016-2779, bsc#968674). This new
+    EXPERIMENTAL feature provides better isolation between root's
+    terminal and an unprivileged su.
+  * libuuid: Improved to match 
+  * libuuid, uuidgen: support hash-based UUIDs v3 (md5) and v5
+    (sha1) as specified by RFC-4122. Provide UUID templates for
+    dns, url, oid, or x500.
+  * libblkid: Extended support for DM-integrity, HPE (aka
+    extended-XFS) and UBI superblock. New API to hide already
+    detected signatures.
+  * libfdisk: New API to modify grain, make possible to completely
+    disable dialog driven partitioning.
+  * libsmartcols: New API to move columns.
+  * column: --table-header-repeat to repeat table headers.
+  * libfdisk: Use BLKPG ioctls to inform the kernel about changes.
+  * fdisk: Improved ^C and ^D behavior.
+  * cfdisk: Dialog to resize partition.
+  * look: Follow the WORDLIST environment variable.
+  * losetup: Added support for --sector-size (FATE#319010).
+  * script: Follow the usual semantics for stop/continue signals.
+  * setpriv: New command line options --ambient-caps and
+    --init-groups.
+  * hwclock: Reduce system shutdown times, log --systz when using
+    libaudit.
+  * Other bug fixes.
+- Drop upstreamed util-linux-use-tinfow.patch.
+- Refreshed make-sure-sbin-resp-usr-sbin-are-in-PATH.diff.
+
+-------------------------------------------------------------------
util-linux-systemd.changes: same change
util-linux.changes: same change

Old:
----
  util-linux-2.30.1.tar.sign
  util-linux-2.30.1.tar.xz
  util-linux-losetup-Add-support-for-setting-logical-blocksize.patch
  util-linux-use-tinfow.patch

New:
----
  util-linux-2.31.tar.sign
  util-linux-2.31.tar.xz
  util-linux-lsmem-memory-zone-1.patch
  util-linux-lsmem-memory-zone-2.patch
  util-linux-lsmem-memory-zone-3.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-libmount.spec ++++++
--- /var/tmp/diff_new_pack.DpyWaJ/_old  2017-12-29 18:46:40.081987910 +0100
+++ /var/tmp/diff_new_pack.DpyWaJ/_new  2017-12-29 18:46:40.085986762 +0100
@@ -116,7 +116,7 @@
 %endif
 %endif
 #END SECOND STAGE DEPENDENCIES
-Version:        2.30.1
+Version:        2.31
 Release:        0
 # util-linux is a base package and uuidd pre-requiring pwdutils pulls
 # that into the core build cycle.  pwdutils also pulls in the whole
@@ -125,7 +125,7 @@
 # these tools as well
 #!BuildIgnore:  pwdutils
 Url:            https://www.kernel.org/pub/linux/utils/util-linux/
-Source:         
https://www.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-%{version}.tar.xz
+Source:         
https://www.kernel.org/pub/linux/utils/util-linux/v%{version}/util-linux-%{version}.tar.xz
 Source1:        util-linux-rpmlintrc
 Source4:        raw.service
 Source5:        etc.raw
@@ -135,7 +135,7 @@
 Source9:        remote.pamd
 Source10:       su.pamd
 Source11:       su.default
-Source12:       
https://www.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-%{version}.tar.sign
+Source12:       
https://www.kernel.org/pub/linux/utils/util-linux/v%{version}/util-linux-%{version}.tar.sign
 Source13:       %{_name}.keyring
 Source14:       runuser.pamd
 # klogconsole, http://opensuse.github.com/kiwi, 7.02.25, git 859dc050
@@ -155,10 +155,12 @@
 ##
 # PATCH-EXTEND-UPSTREAM: Let `su' handle /sbin and /usr/sbin in path
 Patch0:         make-sure-sbin-resp-usr-sbin-are-in-PATH.diff
-# PATCH-FEATURE-SLE 
util-linux-losetup-Add-support-for-setting-logical-blocksize.patch bsc931634 
FATE319010 h...@suse.de -- Add support for setting logical blocksizes.
-Patch1:         
util-linux-losetup-Add-support-for-setting-logical-blocksize.patch
-# PATCH-FIX-UPSTREAM util-linux-use-tinfow.patch bsc#1056171 sbra...@suse.com 
-- Link against tinfow instead of tinfo.
-Patch2:         util-linux-use-tinfow.patch
+# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-1.patch bsc1065471 
FATE324252 sbra...@suse.com -- lsmem: Add support for zone awareness.
+Patch1:         util-linux-lsmem-memory-zone-1.patch
+# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-2.patch bsc1065471 
FATE324252 sbra...@suse.com -- lsmem: Add support for zone awareness.
+Patch2:         util-linux-lsmem-memory-zone-2.patch
+# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-3.patch bsc1065471 
FATE324252 sbra...@suse.com -- lsmem: Add support for zone awareness.
+Patch3:         util-linux-lsmem-memory-zone-3.patch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 #
 %if %build_util_linux
@@ -173,10 +175,13 @@
 Recommends:     %{name}-lang = %{version}
 Provides:       eject = 2.1.0-166.8
 Provides:       login = 4.0-33.7
+Provides:       rfkill = 0.5-8.6
 # File conflict of eject (up to 12.3 and SLE11).
 Obsoletes:      eject < 2.1.0-166.8
 # File conflict of login (up to 12.1 and SLE11).
 Obsoletes:      login < 4.0-33.7
+# File confluct (man page) of rfkill (up to Leap 15 and SLE 15).
+Obsoletes:      rfkill < 0.5-8.6
 # File conflict of su and kill (up to 12.3 and SLE11).
 # It should be coreutils < 8.21-4, but coreutils provide Release-less symbol.
 Conflicts:      coreutils < 8.21
@@ -184,8 +189,8 @@
 # File conflict of sulogin and utmpdump (up to 12.3 and SLE11).
 Conflicts:      sysvinit-tools < 2.88+-87
 %endif
-# File conflicts of completion files with <= Leap 42.1 and <= SLE12 SP1 (fixed 
by SLE12 Update, boo#977259#c3).
-Conflicts:      bash-completion <= 2.1-10
+# rfkill conflicts of completion files with <= Leap 42.3 and < SLE15.
+Conflicts:      bash-completion <= 2.7-1.3
 # The preset is provided by the presets branding package since 0.4 
(bsc#1012850) and since 12.2 in SLE (boo#1029775)
 Conflicts:      systemd-presets-branding < 12.2
 # bnc#805684:
@@ -213,12 +218,6 @@
 Recommends:     time
 Recommends:     which
 #
-%if 0%{?suse_version} < 1330
-# Using Conflicts as 
util-linux-losetup-Add-support-for-setting-logical-blocksize
-# now uses bit 5 of lo_flags with meaning LO_FLAGS_BLOCKSIZE bsc#966891
-#
-Conflicts:      kernel < 4.4
-%endif
 %else
 %if %build_python_libmount
 %else
@@ -418,11 +417,9 @@
 %prep
 %setup -q -n %{_name}-%{version} -b 40
 %patch0 -p1
-%if 0%{?suse_version} < 1330
-# logical block size support in loop does not exist in Tumbleweed and upstream 
kernel yet
 %patch1 -p1
-%endif
 %patch2 -p1
+%patch3 -p1
 #
 # setctsid
 cp -p %{S:22} %{S:23} .
@@ -557,6 +554,8 @@
   --disable-silent-rules \
   --localstatedir=/run \
   --docdir=%{_docdir}/%{_name} \
+  --disable-makeinstall-chown \
+  --disable-makeinstall-setuid \
   --with-audit \
   --with-btrfs \
   --with-gnu-ld \
@@ -993,6 +992,7 @@
 %{_bindir}/rename
 %{_bindir}/renice
 %{_bindir}/rev
+%{_bindir}/rfkill
 %{_bindir}/script
 %{_bindir}/scriptreplay
 %{_bindir}/setarch
@@ -1005,6 +1005,7 @@
 %{_bindir}/mountpoint
 %{_bindir}/utmpdump
 %{_bindir}/uuidgen
+%{_bindir}/uuidparse
 %{_bindir}/uname26
 %ifnarch ppc ppc64
 %{_bindir}/chrp-addnote
@@ -1108,6 +1109,7 @@
 %{_mandir}/man1/utmpdump.1.gz
 %{_mandir}/man1/runuser.1.gz
 %{_mandir}/man1/uuidgen.1.gz
+%{_mandir}/man1/uuidparse.1.gz
 %{_mandir}/man5/fstab.5.gz
 %{_mandir}/man5/terminal-colors.d.5.gz
 %{_mandir}/man8/addpart.8.gz
@@ -1142,6 +1144,7 @@
 %{_mandir}/man8/fsfreeze.8.gz
 %{_mandir}/man8/swaplabel.8.gz
 %{_mandir}/man8/readprofile.8.gz
+%{_mandir}/man8/rfkill.8.gz
 %{_mandir}/man8/chcpu.8.gz
 %ifnarch ppc ppc64
 %{_mandir}/man8/mkzimage_cmdline.8.gz

util-linux-systemd.spec: same change
++++++ util-linux.spec ++++++
--- /var/tmp/diff_new_pack.DpyWaJ/_old  2017-12-29 18:46:40.161964940 +0100
+++ /var/tmp/diff_new_pack.DpyWaJ/_new  2017-12-29 18:46:40.161964940 +0100
@@ -116,7 +116,7 @@
 %endif
 %endif
 #END SECOND STAGE DEPENDENCIES
-Version:        2.30.1
+Version:        2.31
 Release:        0
 # util-linux is a base package and uuidd pre-requiring pwdutils pulls
 # that into the core build cycle.  pwdutils also pulls in the whole
@@ -125,7 +125,7 @@
 # these tools as well
 #!BuildIgnore:  pwdutils
 Url:            https://www.kernel.org/pub/linux/utils/util-linux/
-Source:         
https://www.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-%{version}.tar.xz
+Source:         
https://www.kernel.org/pub/linux/utils/util-linux/v%{version}/util-linux-%{version}.tar.xz
 Source1:        util-linux-rpmlintrc
 Source4:        raw.service
 Source5:        etc.raw
@@ -135,7 +135,7 @@
 Source9:        remote.pamd
 Source10:       su.pamd
 Source11:       su.default
-Source12:       
https://www.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-%{version}.tar.sign
+Source12:       
https://www.kernel.org/pub/linux/utils/util-linux/v%{version}/util-linux-%{version}.tar.sign
 Source13:       %{_name}.keyring
 Source14:       runuser.pamd
 # klogconsole, http://opensuse.github.com/kiwi, 7.02.25, git 859dc050
@@ -155,10 +155,12 @@
 ##
 # PATCH-EXTEND-UPSTREAM: Let `su' handle /sbin and /usr/sbin in path
 Patch0:         make-sure-sbin-resp-usr-sbin-are-in-PATH.diff
-# PATCH-FEATURE-SLE 
util-linux-losetup-Add-support-for-setting-logical-blocksize.patch bsc931634 
FATE319010 h...@suse.de -- Add support for setting logical blocksizes.
-Patch1:         
util-linux-losetup-Add-support-for-setting-logical-blocksize.patch
-# PATCH-FIX-UPSTREAM util-linux-use-tinfow.patch bsc#1056171 sbra...@suse.com 
-- Link against tinfow instead of tinfo.
-Patch2:         util-linux-use-tinfow.patch
+# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-1.patch bsc1065471 
FATE324252 sbra...@suse.com -- lsmem: Add support for zone awareness.
+Patch1:         util-linux-lsmem-memory-zone-1.patch
+# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-2.patch bsc1065471 
FATE324252 sbra...@suse.com -- lsmem: Add support for zone awareness.
+Patch2:         util-linux-lsmem-memory-zone-2.patch
+# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-3.patch bsc1065471 
FATE324252 sbra...@suse.com -- lsmem: Add support for zone awareness.
+Patch3:         util-linux-lsmem-memory-zone-3.patch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 #
 %if %build_util_linux
@@ -173,10 +175,13 @@
 Recommends:     %{name}-lang = %{version}
 Provides:       eject = 2.1.0-166.8
 Provides:       login = 4.0-33.7
+Provides:       rfkill = 0.5-8.6
 # File conflict of eject (up to 12.3 and SLE11).
 Obsoletes:      eject < 2.1.0-166.8
 # File conflict of login (up to 12.1 and SLE11).
 Obsoletes:      login < 4.0-33.7
+# File confluct (man page) of rfkill (up to Leap 15 and SLE 15).
+Obsoletes:      rfkill < 0.5-8.6
 # File conflict of su and kill (up to 12.3 and SLE11).
 # It should be coreutils < 8.21-4, but coreutils provide Release-less symbol.
 Conflicts:      coreutils < 8.21
@@ -184,8 +189,8 @@
 # File conflict of sulogin and utmpdump (up to 12.3 and SLE11).
 Conflicts:      sysvinit-tools < 2.88+-87
 %endif
-# File conflicts of completion files with <= Leap 42.1 and <= SLE12 SP1 (fixed 
by SLE12 Update, boo#977259#c3).
-Conflicts:      bash-completion <= 2.1-10
+# rfkill conflicts of completion files with <= Leap 42.3 and < SLE15.
+Conflicts:      bash-completion <= 2.7-1.3
 # The preset is provided by the presets branding package since 0.4 
(bsc#1012850) and since 12.2 in SLE (boo#1029775)
 Conflicts:      systemd-presets-branding < 12.2
 # bnc#805684:
@@ -213,12 +218,6 @@
 Recommends:     time
 Recommends:     which
 #
-%if 0%{?suse_version} < 1330
-# Using Conflicts as 
util-linux-losetup-Add-support-for-setting-logical-blocksize
-# now uses bit 5 of lo_flags with meaning LO_FLAGS_BLOCKSIZE bsc#966891
-#
-Conflicts:      kernel < 4.4
-%endif
 %else
 %if %build_python_libmount
 %else
@@ -418,11 +417,9 @@
 %prep
 %setup -q -n %{_name}-%{version} -b 40
 %patch0 -p1
-%if 0%{?suse_version} < 1330
-# logical block size support in loop does not exist in Tumbleweed and upstream 
kernel yet
 %patch1 -p1
-%endif
 %patch2 -p1
+%patch3 -p1
 #
 # setctsid
 cp -p %{S:22} %{S:23} .
@@ -557,6 +554,8 @@
   --disable-silent-rules \
   --localstatedir=/run \
   --docdir=%{_docdir}/%{_name} \
+  --disable-makeinstall-chown \
+  --disable-makeinstall-setuid \
   --with-audit \
   --with-btrfs \
   --with-gnu-ld \
@@ -993,6 +992,7 @@
 %{_bindir}/rename
 %{_bindir}/renice
 %{_bindir}/rev
+%{_bindir}/rfkill
 %{_bindir}/script
 %{_bindir}/scriptreplay
 %{_bindir}/setarch
@@ -1005,6 +1005,7 @@
 %{_bindir}/mountpoint
 %{_bindir}/utmpdump
 %{_bindir}/uuidgen
+%{_bindir}/uuidparse
 %{_bindir}/uname26
 %ifnarch ppc ppc64
 %{_bindir}/chrp-addnote
@@ -1108,6 +1109,7 @@
 %{_mandir}/man1/utmpdump.1.gz
 %{_mandir}/man1/runuser.1.gz
 %{_mandir}/man1/uuidgen.1.gz
+%{_mandir}/man1/uuidparse.1.gz
 %{_mandir}/man5/fstab.5.gz
 %{_mandir}/man5/terminal-colors.d.5.gz
 %{_mandir}/man8/addpart.8.gz
@@ -1142,6 +1144,7 @@
 %{_mandir}/man8/fsfreeze.8.gz
 %{_mandir}/man8/swaplabel.8.gz
 %{_mandir}/man8/readprofile.8.gz
+%{_mandir}/man8/rfkill.8.gz
 %{_mandir}/man8/chcpu.8.gz
 %ifnarch ppc ppc64
 %{_mandir}/man8/mkzimage_cmdline.8.gz

++++++ make-sure-sbin-resp-usr-sbin-are-in-PATH.diff ++++++
--- /var/tmp/diff_new_pack.DpyWaJ/_old  2017-12-29 18:46:40.273932782 +0100
+++ /var/tmp/diff_new_pack.DpyWaJ/_new  2017-12-29 18:46:40.277931635 +0100
@@ -1,7 +1,9 @@
---- a/login-utils/su-common.c
-+++ b/login-utils/su-common.c
-@@ -523,6 +523,117 @@ set_path(const struct passwd* pw)
-     err (EXIT_FAILURE,  _("failed to set the %s environment variable"), 
"PATH");
+Index: util-linux-2.31/login-utils/su-common.c
+===================================================================
+--- util-linux-2.31.orig/login-utils/su-common.c
++++ util-linux-2.31/login-utils/su-common.c
+@@ -944,6 +944,117 @@ static void setenv_path(const struct pas
+               err(EXIT_FAILURE, _("failed to set the PATH environment 
variable"));
  }
  
 +/* Add or clear /sbin and /usr/sbin for the su command
@@ -115,29 +117,29 @@
 +  return ret;
 +}
 +
- /* Update `environ' for the new shell based on PW, with SHELL being
-    the value for the SHELL environment variable.  */
+ static void modify_environment(struct su_context *su, const char *shell)
+ {
+       const struct passwd *pw = su->pwd;
+@@ -982,6 +1093,22 @@ static void modify_environment(struct su
  
-@@ -560,6 +671,22 @@ modify_environment (const struct passwd *pw, const char 
*shell)
-             xsetenv ("SHELL", shell, 1);
-         if (getlogindefs_bool ("ALWAYS_SET_PATH", 0))
-           set_path(pw);
-+        else
-+          {
-+            char const *path = getenv ("PATH");
-+            char *new = NULL;
-+
-+            if (pw->pw_uid)
-+              new = clearsbin (path);
-+            else
-+              new = addsbin (path);
-+
-+            if (new)
+               if (getlogindefs_bool("ALWAYS_SET_PATH", 0))
+                       setenv_path(pw);
++              else
 +              {
-+                xsetenv ("PATH", new, 1);
-+                free (new);
++                      char const *path = getenv ("PATH");
++                      char *new = NULL;
++
++                      if (pw->pw_uid)
++                              new = clearsbin (path);
++                      else
++                              new = addsbin (path);
++
++                      if (new)
++                      {
++                              xsetenv ("PATH", new, 1);
++                              free (new);
++                      }
 +              }
-+          }
  
-           if (pw->pw_uid)
-             {
+               if (pw->pw_uid) {
+                       xsetenv("USER", pw->pw_name, 1);

++++++ util-linux-2.30.1.tar.xz -> util-linux-2.31.tar.xz ++++++
++++ 506207 lines of diff (skipped)

++++++ util-linux-lsmem-memory-zone-1.patch ++++++
>From 60a7e9e94e49215b1e6ac6e33b69c3bd0a426b5e Mon Sep 17 00:00:00 2001
From: Gerald Schaefer <gerald.schae...@de.ibm.com>
Date: Wed, 27 Sep 2017 19:44:44 +0200
Subject: [PATCH 1/3] lsmem/chmem: add memory zone awareness

With this patch, valid memory zones can be shown with lsmem, and chmem can
set memory online/offline in a specific memory zone, if allowed by the
kernel. The valid memory zones are read from the "valid_zones" sysfs
attribute, and setting memory online to a specific zone is done by
echoing "online_kernel" or "online_movable" to the "state" sysfs
attribute, in addition to the previous "online".

This patch also changes the default behavior of chmem, when setting memory
online without specifying a memory zone. If valid, memory will be set
online to the zone Movable. This zone is preferable for memory hotplug, as
it makes memory offline much more likely to succeed.

Signed-off-by: Gerald Schaefer <gerald.schae...@de.ibm.com>
---
 sys-utils/chmem.8 |  19 ++++++++
 sys-utils/chmem.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 sys-utils/lsmem.1 |   4 +-
 sys-utils/lsmem.c |  98 ++++++++++++++++++++++++++++++++++++++-
 4 files changed, 246 insertions(+), 11 deletions(-)

diff --git a/sys-utils/chmem.8 b/sys-utils/chmem.8
index a116bc9e7..dae7413d4 100644
--- a/sys-utils/chmem.8
+++ b/sys-utils/chmem.8
@@ -5,6 +5,7 @@ chmem \- configure memory
 .B chmem
 .RB [ \-h "] [" \-V "] [" \-v "] [" \-e | \-d "]"
 [\fISIZE\fP|\fIRANGE\fP|\fB\-b\fP \fIBLOCKRANGE\fP]
+[-z ZONE]
 .SH DESCRIPTION
 The chmem command sets a particular size or range of memory online or offline.
 .
@@ -25,6 +26,19 @@ and <last> is the number of the last memory block in the 
memory
 range. Alternatively a single block can be specified. \fIBLOCKRANGE\fP requires
 the \fB--blocks\fP option.
 .
+.IP "\(hy" 2
+Specify \fIZONE\fP as the name of a memory zone, as shown in the output of the
+\fBlsmem -o +ZONES\fP command. The output shows one or more valid memory zones
+for each memory range. If multiple zones are shown, then the memory range
+currently belongs to the first zone. By default, chmem will set memory online
+to the zone Movable, if this is among the valid zones. This default can be
+changed by specifying the \fB--zone\fP option with another valid zone.
+For memory ballooning, it is recommended to select the zone Movable for memory
+online and offline, if possible. Memory in this zone is much more likely to be
+able to be offlined again, but it cannot be used for arbitrary kernel
+allocations, only for migratable pages (e.g. anonymous and page cache pages).
+Use the \fB\-\-help\fR option to see all available zones.
+.
 .PP
 \fISIZE\fP and \fIRANGE\fP must be aligned to the Linux memory block size, as
 shown in the output of the \fBlsmem\fP command.
@@ -51,6 +65,11 @@ Set the specified \fIRANGE\fP, \fISIZE\fP, or 
\fIBLOCKRANGE\fP of memory offline
 .BR \-e ", " \-\-enable
 Set the specified \fIRANGE\fP, \fISIZE\fP, or \fIBLOCKRANGE\fP of memory 
online.
 .TP
+.BR \-z ", " \-\-zone
+Select the memory \fIZONE\fP where to set the specified \fIRANGE\fP, 
\fISIZE\fP,
+or \fIBLOCKRANGE\fP of memory online or offline. By default, memory will be set
+online to the zone Movable, if possible.
+.TP
 .BR \-h ", " \-\-help
 Print a short help text, then exit.
 .TP
diff --git a/sys-utils/chmem.c b/sys-utils/chmem.c
index d9bc95cc1..2f0680de8 100644
--- a/sys-utils/chmem.c
+++ b/sys-utils/chmem.c
@@ -49,6 +49,7 @@ struct chmem_desc {
        unsigned int    use_blocks : 1;
        unsigned int    is_size    : 1;
        unsigned int    verbose    : 1;
+       unsigned int    have_zones : 1;
 };
 
 enum {
@@ -57,6 +58,38 @@ enum {
        CMD_NONE
 };
 
+enum zone_id {
+       ZONE_DMA = 0,
+       ZONE_DMA32,
+       ZONE_NORMAL,
+       ZONE_HIGHMEM,
+       ZONE_MOVABLE,
+       ZONE_DEVICE,
+};
+
+static char *zone_names[] = {
+       [ZONE_DMA]      = "DMA",
+       [ZONE_DMA32]    = "DMA32",
+       [ZONE_NORMAL]   = "Normal",
+       [ZONE_HIGHMEM]  = "Highmem",
+       [ZONE_MOVABLE]  = "Movable",
+       [ZONE_DEVICE]   = "Device",
+};
+
+/*
+ * name must be null-terminated
+ */
+static int zone_name_to_id(const char *name)
+{
+       size_t i;
+
+       for (i = 0; i < ARRAY_SIZE(zone_names); i++) {
+               if (!strcasecmp(name, zone_names[i]))
+                       return i;
+       }
+       return -1;
+}
+
 static void idxtostr(struct chmem_desc *desc, uint64_t idx, char *buf, size_t 
bufsz)
 {
        uint64_t start, end;
@@ -68,22 +101,49 @@ static void idxtostr(struct chmem_desc *desc, uint64_t 
idx, char *buf, size_t bu
                 idx, start, end);
 }
 
-static int chmem_size(struct chmem_desc *desc, int enable)
+static int chmem_size(struct chmem_desc *desc, int enable, int zone_id)
 {
        char *name, *onoff, line[BUFSIZ], str[BUFSIZ];
        uint64_t size, index;
+       const char *zn;
        int i, rc;
 
        size = desc->size;
        onoff = enable ? "online" : "offline";
        i = enable ? 0 : desc->ndirs - 1;
 
+       if (enable && zone_id >= 0) {
+               if (zone_id == ZONE_MOVABLE)
+                       onoff = "online_movable";
+               else
+                       onoff = "online_kernel";
+       }
+
        for (; i >= 0 && i < desc->ndirs && size; i += enable ? 1 : -1) {
                name = desc->dirs[i]->d_name;
                index = strtou64_or_err(name + 6, _("Failed to parse index"));
                path_read_str(line, sizeof(line), _PATH_SYS_MEMORY "/%s/state", 
name);
-               if (strcmp(onoff, line) == 0)
+               if (strncmp(onoff, line, 6) == 0)
                        continue;
+
+               if (desc->have_zones) {
+                       path_read_str(line, sizeof(line),
+                                     _PATH_SYS_MEMORY "/%s/valid_zones", name);
+                       if (zone_id >= 0) {
+                               zn = zone_names[zone_id];
+                               if (enable && !strcasestr(line, zn))
+                                       continue;
+                               if (!enable && strncasecmp(line, zn, 
strlen(zn)))
+                                       continue;
+                       } else if (enable) {
+                               /* By default, use zone Movable for online, if 
valid */
+                               if (strcasestr(line, zone_names[ZONE_MOVABLE]))
+                                       onoff = "online_movable";
+                               else
+                                       onoff = "online";
+                       }
+               }
+
                idxtostr(desc, index, str, sizeof(str));
                rc = path_write_str(onoff, _PATH_SYS_MEMORY"/%s/state", name);
                if (rc == -1 && desc->verbose) {
@@ -115,15 +175,23 @@ static int chmem_size(struct chmem_desc *desc, int enable)
        return size == 0 ? 0 : size == desc->size ? -1 : 1;
 }
 
-static int chmem_range(struct chmem_desc *desc, int enable)
+static int chmem_range(struct chmem_desc *desc, int enable, int zone_id)
 {
        char *name, *onoff, line[BUFSIZ], str[BUFSIZ];
        uint64_t index, todo;
+       const char *zn;
        int i, rc;
 
        todo = desc->end - desc->start + 1;
        onoff = enable ? "online" : "offline";
 
+       if (enable && zone_id >= 0) {
+               if (zone_id == ZONE_MOVABLE)
+                       onoff = "online_movable";
+               else
+                       onoff = "online_kernel";
+       }
+
        for (i = 0; i < desc->ndirs; i++) {
                name = desc->dirs[i]->d_name;
                index = strtou64_or_err(name + 6, _("Failed to parse index"));
@@ -133,7 +201,7 @@ static int chmem_range(struct chmem_desc *desc, int enable)
                        break;
                idxtostr(desc, index, str, sizeof(str));
                path_read_str(line, sizeof(line), _PATH_SYS_MEMORY "/%s/state", 
name);
-               if (strcmp(onoff, line) == 0) {
+               if (strncmp(onoff, line, 6) == 0) {
                        if (desc->verbose && enable)
                                fprintf(stdout, _("%s already enabled\n"), str);
                        else if (desc->verbose && !enable)
@@ -141,6 +209,29 @@ static int chmem_range(struct chmem_desc *desc, int enable)
                        todo--;
                        continue;
                }
+
+               if (desc->have_zones) {
+                       path_read_str(line, sizeof(line),
+                                     _PATH_SYS_MEMORY "/%s/valid_zones", name);
+                       if (zone_id >= 0) {
+                               zn = zone_names[zone_id];
+                               if (enable && !strcasestr(line, zn)) {
+                                       warnx(_("%s enable failed: Zone 
mismatch"), str);
+                                       continue;
+                               }
+                               if (!enable && strncasecmp(line, zn, 
strlen(zn))) {
+                                       warnx(_("%s disable failed: Zone 
mismatch"), str);
+                                       continue;
+                               }
+                       } else if (enable) {
+                               /* By default, use zone Movable for online, if 
valid */
+                               if (strcasestr(line, zone_names[ZONE_MOVABLE]))
+                                       onoff = "online_movable";
+                               else
+                                       onoff = "online";
+                       }
+               }
+
                rc = path_write_str(onoff, _PATH_SYS_MEMORY"/%s/state", name);
                if (rc == -1) {
                        if (enable)
@@ -237,6 +328,8 @@ static void parse_parameter(struct chmem_desc *desc, char 
*param)
 static void __attribute__((__noreturn__)) usage(void)
 {
        FILE *out = stdout;
+       unsigned int i;
+
        fputs(USAGE_HEADER, out);
        fprintf(out, _(" %s [options] [SIZE|RANGE|BLOCKRANGE]\n"), 
program_invocation_short_name);
 
@@ -247,6 +340,14 @@ static void __attribute__((__noreturn__)) usage(void)
        fputs(_(" -e, --enable   enable memory\n"), out);
        fputs(_(" -d, --disable  disable memory\n"), out);
        fputs(_(" -b, --blocks   use memory blocks\n"), out);
+       fputs(_(" -z, --zone     select memory zone ("), out);
+       for (i = 0; i < ARRAY_SIZE(zone_names); i++) {
+               fputs(zone_names[i], out);
+               if (i < ARRAY_SIZE(zone_names) - 1)
+                       fputc('|', out);
+       }
+       fputs(")\n", out);
+
        fputs(_(" -v, --verbose  verbose output\n"), out);
        fputs(USAGE_SEPARATOR, out);
        printf(USAGE_HELP_OPTIONS(16));
@@ -259,7 +360,8 @@ static void __attribute__((__noreturn__)) usage(void)
 int main(int argc, char **argv)
 {
        struct chmem_desc _desc = { }, *desc = &_desc;
-       int cmd = CMD_NONE;
+       int cmd = CMD_NONE, zone_id = -1;
+       char *zone = NULL;
        int c, rc;
 
        static const struct option longopts[] = {
@@ -269,6 +371,7 @@ int main(int argc, char **argv)
                {"help",        no_argument,            NULL, 'h'},
                {"verbose",     no_argument,            NULL, 'v'},
                {"version",     no_argument,            NULL, 'V'},
+               {"zone",        required_argument,      NULL, 'z'},
                {NULL,          0,                      NULL, 0}
        };
 
@@ -285,7 +388,7 @@ int main(int argc, char **argv)
 
        read_info(desc);
 
-       while ((c = getopt_long(argc, argv, "bdehvV", longopts, NULL)) != -1) {
+       while ((c = getopt_long(argc, argv, "bdehvVz:", longopts, NULL)) != -1) 
{
 
                err_exclusive_options(c, longopts, excl, excl_st);
 
@@ -308,6 +411,9 @@ int main(int argc, char **argv)
                case 'V':
                        printf(UTIL_LINUX_VERSION);
                        return EXIT_SUCCESS;
+               case 'z':
+                       zone = xstrdup(optarg);
+                       break;
                default:
                        errtryhelp(EXIT_FAILURE);
                }
@@ -320,10 +426,24 @@ int main(int argc, char **argv)
 
        parse_parameter(desc, argv[optind]);
 
+       /* The valid_zones sysfs attribute was introduced with kernel 3.18 */
+       if (path_exist(_PATH_SYS_MEMORY "/memory0/valid_zones"))
+               desc->have_zones = 1;
+       else if (zone)
+               warnx(_("zone ignored, no valid_zones sysfs attribute 
present"));
+
+       if (zone && desc->have_zones) {
+               zone_id = zone_name_to_id(zone);
+               if (zone_id == -1) {
+                       warnx(_("unknown memory zone: %s"), zone);
+                       errtryhelp(EXIT_FAILURE);
+               }
+       }
+
        if (desc->is_size)
-               rc = chmem_size(desc, cmd == CMD_MEMORY_ENABLE ? 1 : 0);
+               rc = chmem_size(desc, cmd == CMD_MEMORY_ENABLE ? 1 : 0, 
zone_id);
        else
-               rc = chmem_range(desc, cmd == CMD_MEMORY_ENABLE ? 1 : 0);
+               rc = chmem_range(desc, cmd == CMD_MEMORY_ENABLE ? 1 : 0, 
zone_id);
 
        return rc == 0 ? EXIT_SUCCESS :
                rc < 0 ? EXIT_FAILURE : CHMEM_EXIT_SOMEOK;
diff --git a/sys-utils/lsmem.1 b/sys-utils/lsmem.1
index be2862d94..e7df50a4e 100644
--- a/sys-utils/lsmem.1
+++ b/sys-utils/lsmem.1
@@ -41,12 +41,12 @@ Do not print a header line.
 .BR \-o , " \-\-output " \fIlist\fP
 Specify which output columns to print.  Use \fB\-\-help\fR
 to get a list of all supported columns.
+The default list of columns may be extended if \fIlist\fP is
+specified in the format \fB+\fIlist\fP (e.g. \fBlsmem \-o +NODE\fP).
 .TP
 .BR \-P , " \-\-pairs"
 Produce output in the form of key="value" pairs.
 All potentially unsafe characters are hex-escaped (\\x<code>).
-The default list of columns may be extended if \fIlist\fP is
-specified in the format \fB+\fIlist\fP (e.g. \fBlsmem \-o +NODE\fP).
 .TP
 .BR \-r , " \-\-raw"
 Produce output in raw format.  All potentially unsafe characters are 
hex-escaped
diff --git a/sys-utils/lsmem.c b/sys-utils/lsmem.c
index aeffd29dd..1d26579fd 100644
--- a/sys-utils/lsmem.c
+++ b/sys-utils/lsmem.c
@@ -42,11 +42,25 @@
 #define MEMORY_STATE_GOING_OFFLINE     2
 #define MEMORY_STATE_UNKNOWN           3
 
+enum zone_id {
+       ZONE_DMA = 0,
+       ZONE_DMA32,
+       ZONE_NORMAL,
+       ZONE_HIGHMEM,
+       ZONE_MOVABLE,
+       ZONE_DEVICE,
+       ZONE_NONE,
+       ZONE_UNKNOWN,
+       MAX_NR_ZONES,
+};
+
 struct memory_block {
        uint64_t        index;
        uint64_t        count;
        int             state;
        int             node;
+       int             nr_zones;
+       int             zones[MAX_NR_ZONES];
        unsigned int    removable:1;
 };
 
@@ -72,7 +86,9 @@ struct lsmem {
                                want_state : 1,
                                want_removable : 1,
                                want_summary : 1,
-                               want_table : 1;
+                               want_table : 1,
+                               want_zones : 1,
+                               have_zones : 1;
 };
 
 enum {
@@ -82,6 +98,18 @@ enum {
        COL_REMOVABLE,
        COL_BLOCK,
        COL_NODE,
+       COL_ZONES,
+};
+
+static char *zone_names[] = {
+       [ZONE_DMA]      = "DMA",
+       [ZONE_DMA32]    = "DMA32",
+       [ZONE_NORMAL]   = "Normal",
+       [ZONE_HIGHMEM]  = "Highmem",
+       [ZONE_MOVABLE]  = "Movable",
+       [ZONE_DEVICE]   = "Device",
+       [ZONE_NONE]     = "None",       /* block contains more than one zone, 
can't be offlined */
+       [ZONE_UNKNOWN]  = "Unknown",
 };
 
 /* column names */
@@ -102,6 +130,7 @@ static struct coldesc coldescs[] = {
        [COL_REMOVABLE] = { "REMOVABLE", 0, SCOLS_FL_RIGHT, N_("memory is 
removable")},
        [COL_BLOCK]     = { "BLOCK", 0, SCOLS_FL_RIGHT, N_("memory block number 
or blocks range")},
        [COL_NODE]      = { "NODE", 0, SCOLS_FL_RIGHT, N_("numa node of 
memory")},
+       [COL_ZONES]     = { "ZONES", 0, SCOLS_FL_RIGHT, N_("valid zones for the 
memory range")},
 };
 
 /* columns[] array specifies all currently wanted output column. The columns
@@ -120,6 +149,20 @@ static inline size_t err_columns_index(size_t arysz, 
size_t idx)
        return idx;
 }
 
+/*
+ * name must be null-terminated
+ */
+static int zone_name_to_id(const char *name)
+{
+       size_t i;
+
+       for (i = 0; i < ARRAY_SIZE(zone_names); i++) {
+               if (!strcasecmp(name, zone_names[i]))
+                       return i;
+       }
+       return ZONE_UNKNOWN;
+}
+
 #define add_column(ary, n, id) \
                ((ary)[ err_columns_index(ARRAY_SIZE(ary), (n)) ] = (id))
 
@@ -214,6 +257,25 @@ static void add_scols_line(struct lsmem *lsmem, struct 
memory_block *blk)
                        else
                                str = xstrdup("-");
                        break;
+               case COL_ZONES:
+                       if (lsmem->have_zones) {
+                               char valid_zones[BUFSIZ];
+                               int j, zone_id;
+
+                               valid_zones[0] = '\0';
+                               for (j = 0; j < blk->nr_zones; j++) {
+                                       zone_id = blk->zones[j];
+                                       if (strlen(valid_zones) +
+                                           strlen(zone_names[zone_id]) > 
BUFSIZ - 2)
+                                               break;
+                                       strcat(valid_zones, 
zone_names[zone_id]);
+                                       if (j + 1 < blk->nr_zones)
+                                               strcat(valid_zones, "/");
+                               }
+                               str = xstrdup(valid_zones);
+                       } else
+                               str = xstrdup("-");
+                       break;
                }
 
                if (str && scols_line_refer_data(line, i, str) != 0)
@@ -272,7 +334,9 @@ static int memory_block_get_node(char *name)
 static void memory_block_read_attrs(struct lsmem *lsmem, char *name,
                                    struct memory_block *blk)
 {
+       char *token = NULL;
        char line[BUFSIZ];
+       int i;
 
        blk->count = 1;
        blk->index = strtoumax(name + 6, NULL, 10); /* get <num> of 
"memory<num>" */
@@ -287,11 +351,26 @@ static void memory_block_read_attrs(struct lsmem *lsmem, 
char *name,
                blk->state = MEMORY_STATE_GOING_OFFLINE;
        if (lsmem->have_nodes)
                blk->node = memory_block_get_node(name);
+
+       blk->nr_zones = 0;
+       if (lsmem->have_zones) {
+               path_read_str(line, sizeof(line), _PATH_SYS_MEMORY"/%s/%s", 
name,
+                             "valid_zones");
+               token = strtok(line, " ");
+       }
+       for (i = 0; i < MAX_NR_ZONES; i++) {
+               if (token) {
+                       blk->zones[i] = zone_name_to_id(token);
+                       blk->nr_zones++;
+                       token = strtok(NULL, " ");
+               }
+       }
 }
 
 static int is_mergeable(struct lsmem *lsmem, struct memory_block *blk)
 {
        struct memory_block *curr;
+       int i;
 
        if (!lsmem->nblocks)
                return 0;
@@ -308,6 +387,15 @@ static int is_mergeable(struct lsmem *lsmem, struct 
memory_block *blk)
                if (curr->node != blk->node)
                        return 0;
        }
+       if (lsmem->want_zones && lsmem->have_zones) {
+               if (curr->nr_zones != blk->nr_zones)
+                       return 0;
+               for (i = 0; i < curr->nr_zones; i++) {
+                       if (curr->zones[i] == ZONE_UNKNOWN ||
+                           curr->zones[i] != blk->zones[i])
+                               return 0;
+               }
+       }
        return 1;
 }
 
@@ -362,6 +450,12 @@ static void read_basic_info(struct lsmem *lsmem)
 
        if (memory_block_get_node(lsmem->dirs[0]->d_name) != -1)
                lsmem->have_nodes = 1;
+
+       /* The valid_zones sysfs attribute was introduced with kernel 3.18 */
+       if (path_exist(_PATH_SYS_MEMORY "/memory0/valid_zones"))
+               lsmem->have_zones = 1;
+       else if (lsmem->want_zones)
+               warnx(_("Cannot read zones, no valid_zones sysfs attribute 
present"));
 }
 
 static void __attribute__((__noreturn__)) usage(void)
@@ -553,6 +647,8 @@ int main(int argc, char **argv)
                lsmem->want_node = 1;
        if (has_column(COL_REMOVABLE))
                lsmem->want_removable = 1;
+       if (has_column(COL_ZONES))
+               lsmem->want_zones = 1;
 
        /*
         * Read data and print output
-- 
2.15.0

++++++ util-linux-lsmem-memory-zone-2.patch ++++++
>From 0a4320f5e785e82337c3a657c55651004e3fd08d Mon Sep 17 00:00:00 2001
From: Gerald Schaefer <gerald.schae...@de.ibm.com>
Date: Wed, 27 Sep 2017 19:44:45 +0200
Subject: [PATCH 2/3] tests/lsmem: update lsmem test with ZONES column

The existing s390 and x86_64 dumps already contain the valid_zones sysfs
attribute, so just add a new "lsmem -o +ZONES" test command and update
the expected results.

Signed-off-by: Gerald Schaefer <gerald.schae...@de.ibm.com>
---
 tests/expected/lsmem/lsmem-s390-zvm-6g | 21 ++++++++++++++++++
 tests/expected/lsmem/lsmem-x86_64-16g  | 39 ++++++++++++++++++++++++++++++++++
 tests/ts/lsmem/lsmem                   |  1 +
 3 files changed, 61 insertions(+)

diff --git a/tests/expected/lsmem/lsmem-s390-zvm-6g 
b/tests/expected/lsmem/lsmem-s390-zvm-6g
index 05af40d4d..9f4c805ad 100644
--- a/tests/expected/lsmem/lsmem-s390-zvm-6g
+++ b/tests/expected/lsmem/lsmem-s390-zvm-6g
@@ -106,3 +106,24 @@ $ lsmem --json --output 
RANGE,SIZE,STATE,REMOVABLE,BLOCK,NODE
       {"range": "0x0000000140000000-0x000000017fffffff", "size": "1G", 
"state": "offline", "removable": "-", "block": "20-23", "node": "0"}
    ]
 }
+
+---
+
+$ lsmem -o +ZONES
+RANGE                                  SIZE   STATE REMOVABLE BLOCK          
ZONES
+0x0000000000000000-0x000000006fffffff  1.8G  online       yes   0-6            
DMA
+0x0000000070000000-0x000000007fffffff  256M  online        no     7     
DMA/Normal
+0x0000000080000000-0x000000009fffffff  512M  online       yes   8-9         
Normal
+0x00000000a0000000-0x00000000bfffffff  512M  online        no 10-11         
Normal
+0x00000000c0000000-0x00000000dfffffff  512M  online       yes 12-13         
Normal
+0x00000000e0000000-0x00000000efffffff  256M offline         -    14         
Normal
+0x00000000f0000000-0x00000000ffffffff  256M  online       yes    15         
Normal
+0x0000000100000000-0x000000010fffffff  256M  online        no    16         
Normal
+0x0000000110000000-0x000000011fffffff  256M  online        no    17 
Normal/Movable
+0x0000000120000000-0x000000012fffffff  256M  online       yes    18 
Movable/Normal
+0x0000000130000000-0x000000013fffffff  256M  online       yes    19        
Movable
+0x0000000140000000-0x000000017fffffff    1G offline         - 20-23        
Movable
+
+Memory block size:       256M
+Total online memory:     4.8G
+Total offline memory:    1.3G
diff --git a/tests/expected/lsmem/lsmem-x86_64-16g 
b/tests/expected/lsmem/lsmem-x86_64-16g
index 14d7d84f6..40316a584 100644
--- a/tests/expected/lsmem/lsmem-x86_64-16g
+++ b/tests/expected/lsmem/lsmem-x86_64-16g
@@ -269,3 +269,42 @@ $ lsmem --json --output 
RANGE,SIZE,STATE,REMOVABLE,BLOCK,NODE
       {"range": "0x0000000438000000-0x000000043fffffff", "size": "128M", 
"state": "online", "removable": "no", "block": "135", "node": "0"}
    ]
 }
+
+---
+
+$ lsmem -o +ZONES
+RANGE                                  SIZE  STATE REMOVABLE   BLOCK  ZONES
+0x0000000000000000-0x0000000007ffffff  128M online        no       0   None
+0x0000000008000000-0x0000000037ffffff  768M online       yes     1-6  DMA32
+0x0000000038000000-0x000000003fffffff  128M online        no       7  DMA32
+0x0000000040000000-0x0000000077ffffff  896M online       yes    8-14  DMA32
+0x0000000078000000-0x000000007fffffff  128M online        no      15  DMA32
+0x0000000080000000-0x00000000afffffff  768M online       yes   16-21  DMA32
+0x00000000b0000000-0x00000000bfffffff  256M online        no   22-23  DMA32
+0x0000000100000000-0x00000001a7ffffff  2.6G online        no   32-52 Normal
+0x00000001a8000000-0x00000001afffffff  128M online       yes      53 Normal
+0x00000001b0000000-0x00000001bfffffff  256M online        no   54-55 Normal
+0x00000001c0000000-0x00000001ffffffff    1G online       yes   56-63 Normal
+0x0000000200000000-0x0000000207ffffff  128M online        no      64 Normal
+0x0000000208000000-0x000000021fffffff  384M online       yes   65-67 Normal
+0x0000000220000000-0x0000000237ffffff  384M online        no   68-70 Normal
+0x0000000238000000-0x0000000277ffffff    1G online       yes   71-78 Normal
+0x0000000278000000-0x000000028fffffff  384M online        no   79-81 Normal
+0x0000000290000000-0x0000000297ffffff  128M online       yes      82 Normal
+0x0000000298000000-0x00000002a7ffffff  256M online        no   83-84 Normal
+0x00000002a8000000-0x00000002c7ffffff  512M online       yes   85-88 Normal
+0x00000002c8000000-0x00000002dfffffff  384M online        no   89-91 Normal
+0x00000002e0000000-0x00000002efffffff  256M online       yes   92-93 Normal
+0x00000002f0000000-0x000000034fffffff  1.5G online        no  94-105 Normal
+0x0000000350000000-0x0000000357ffffff  128M online       yes     106 Normal
+0x0000000358000000-0x000000036fffffff  384M online        no 107-109 Normal
+0x0000000370000000-0x0000000377ffffff  128M online       yes     110 Normal
+0x0000000378000000-0x00000003c7ffffff  1.3G online        no 111-120 Normal
+0x00000003c8000000-0x00000003e7ffffff  512M online       yes 121-124 Normal
+0x00000003e8000000-0x000000042fffffff  1.1G online        no 125-133 Normal
+0x0000000430000000-0x0000000437ffffff  128M online       yes     134 Normal
+0x0000000438000000-0x000000043fffffff  128M online        no     135   None
+
+Memory block size:       128M
+Total online memory:      16G
+Total offline memory:      0B
diff --git a/tests/ts/lsmem/lsmem b/tests/ts/lsmem/lsmem
index 79c0523b9..b1313773e 100755
--- a/tests/ts/lsmem/lsmem
+++ b/tests/ts/lsmem/lsmem
@@ -49,6 +49,7 @@ for dump in $(ls $TS_SELF/dumps/*.tar.bz2 | sort); do
        do_lsmem --all --output $LSCOLUMNS
        do_lsmem --raw --output $LSCOLUMNS
        do_lsmem --json --output $LSCOLUMNS
+       do_lsmem -o +ZONES
 
        ts_finalize_subtest
 done
-- 
2.15.0

++++++ util-linux-lsmem-memory-zone-3.patch ++++++
>From afee3f204247fbc8e4cfaa1698f3d98762544dd8 Mon Sep 17 00:00:00 2001
From: Andre Wild <w...@linux.vnet.ibm.com>
Date: Wed, 27 Sep 2017 19:44:46 +0200
Subject: [PATCH 3/3] lsmem/chmem: add memory zone awareness to bash-completion

This patch extends the valid --output values with ZONES for the
lsmem bash-completion, and adds the --zone option for the chmem
bash-completion.

Signed-off-by: Andre Wild <w...@linux.vnet.ibm.com>
Signed-off-by: Gerald Schaefer <gerald.schae...@de.ibm.com>
---
 bash-completion/chmem | 1 +
 bash-completion/lsmem | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/bash-completion/chmem b/bash-completion/chmem
index 00b870dbd..3e3af87ac 100644
--- a/bash-completion/chmem
+++ b/bash-completion/chmem
@@ -16,6 +16,7 @@ _chmem_module()
                                --disable
                                --blocks
                                --verbose
+                               --zone
                                --help
                                --version
                        "
diff --git a/bash-completion/lsmem b/bash-completion/lsmem
index 8f7a46ec3..9aa124569 100644
--- a/bash-completion/lsmem
+++ b/bash-completion/lsmem
@@ -9,7 +9,7 @@ _lsmem_module()
                        local prefix realcur OUTPUT_ALL OUTPUT
                        realcur="${cur##*,}"
                        prefix="${cur%$realcur}"
-                       OUTPUT_ALL='RANGE SIZE STATE REMOVABLE BLOCK NODE'
+                       OUTPUT_ALL='RANGE SIZE STATE REMOVABLE BLOCK NODE ZONES'
                        for WORD in $OUTPUT_ALL; do
                                if ! [[ $prefix == *"$WORD"* ]]; then
                                        OUTPUT="$WORD ${OUTPUT:-""}"
-- 
2.15.0


Reply via email to