Accepting request 548188 from home:sbrabec:branches:util-linux-1065471
- 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. OBS-URL: https://build.opensuse.org/request/show/548188 OBS-URL: https://build.opensuse.org/package/show/Base:System/util-linux?expand=0&rev=354
This commit is contained in:
parent
5c789a611b
commit
8d036d9bf7
@ -1,3 +1,14 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Dec 4 17:28:04 CET 2017 - sbrabec@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 - sbrabec@suse.com
|
Mon Nov 20 17:29:11 CET 2017 - sbrabec@suse.com
|
||||||
|
|
||||||
@ -22,6 +33,7 @@ Mon Nov 20 17:29:11 CET 2017 - sbrabec@suse.com
|
|||||||
* fdisk: Improved ^C and ^D behavior.
|
* fdisk: Improved ^C and ^D behavior.
|
||||||
* cfdisk: Dialog to resize partition.
|
* cfdisk: Dialog to resize partition.
|
||||||
* look: Follow the WORDLIST environment variable.
|
* look: Follow the WORDLIST environment variable.
|
||||||
|
* losetup: Added support for --sector-size (FATE#319010).
|
||||||
* script: Follow the usual semantics for stop/continue signals.
|
* script: Follow the usual semantics for stop/continue signals.
|
||||||
* setpriv: New command line options --ambient-caps and
|
* setpriv: New command line options --ambient-caps and
|
||||||
--init-groups.
|
--init-groups.
|
||||||
|
@ -73,7 +73,7 @@ Name: python-libmount
|
|||||||
%endif
|
%endif
|
||||||
Summary: %main_summary
|
Summary: %main_summary
|
||||||
License: GPL-2.0+
|
License: GPL-2.0+
|
||||||
Group: %group_pl
|
Group: %main_group
|
||||||
BuildRequires: audit-devel
|
BuildRequires: audit-devel
|
||||||
BuildRequires: bc
|
BuildRequires: bc
|
||||||
BuildRequires: binutils-devel
|
BuildRequires: binutils-devel
|
||||||
@ -155,8 +155,12 @@ Source51: blkid.conf
|
|||||||
##
|
##
|
||||||
# PATCH-EXTEND-UPSTREAM: Let `su' handle /sbin and /usr/sbin in path
|
# PATCH-EXTEND-UPSTREAM: Let `su' handle /sbin and /usr/sbin in path
|
||||||
Patch0: make-sure-sbin-resp-usr-sbin-are-in-PATH.diff
|
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 hare@suse.de -- Add support for setting logical blocksizes.
|
# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-1.patch bsc1065471 FATE324252 sbrabec@suse.com -- lsmem: Add support for zone awareness.
|
||||||
Patch1: util-linux-losetup-Add-support-for-setting-logical-blocksize.patch
|
Patch1: util-linux-lsmem-memory-zone-1.patch
|
||||||
|
# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-2.patch bsc1065471 FATE324252 sbrabec@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 sbrabec@suse.com -- lsmem: Add support for zone awareness.
|
||||||
|
Patch3: util-linux-lsmem-memory-zone-3.patch
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
#
|
#
|
||||||
%if %build_util_linux
|
%if %build_util_linux
|
||||||
@ -214,12 +218,6 @@ Recommends: adjtimex
|
|||||||
Recommends: time
|
Recommends: time
|
||||||
Recommends: which
|
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
|
%else
|
||||||
%if %build_python_libmount
|
%if %build_python_libmount
|
||||||
%else
|
%else
|
||||||
@ -406,7 +404,6 @@ SMP systems.
|
|||||||
%if %build_util_linux
|
%if %build_util_linux
|
||||||
%package -n python-libmount
|
%package -n python-libmount
|
||||||
Summary: %summary_pl
|
Summary: %summary_pl
|
||||||
License: GPL-2.0+
|
|
||||||
Group: %group_pl
|
Group: %group_pl
|
||||||
|
|
||||||
%description -n python-libmount
|
%description -n python-libmount
|
||||||
@ -420,10 +417,9 @@ library.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q -n %{_name}-%{version} -b 40
|
%setup -q -n %{_name}-%{version} -b 40
|
||||||
%patch0 -p1
|
%patch0 -p1
|
||||||
%if 0%{?suse_version} < 1330
|
|
||||||
# logical block size support in loop does not exist in Tumbleweed and upstream kernel yet
|
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
%endif
|
%patch2 -p1
|
||||||
|
%patch3 -p1
|
||||||
#
|
#
|
||||||
# setctsid
|
# setctsid
|
||||||
cp -p %{S:22} %{S:23} .
|
cp -p %{S:22} %{S:23} .
|
||||||
|
@ -1,156 +0,0 @@
|
|||||||
From a60cc5c2eeaad7ea5ea0c4a74cc4af5e2dc3f6c2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ruediger Meier <ruediger.meier@ga-group.nl>
|
|
||||||
Date: Tue, 4 Apr 2017 16:29:58 +0200
|
|
||||||
Subject: [PATCH]
|
|
||||||
util-linux-losetup-Add-support-for-setting-logical-blocksize.patch
|
|
||||||
|
|
||||||
Signed-off-by: Ruediger Meier <ruediger.meier@ga-group.nl>
|
|
||||||
---
|
|
||||||
include/loopdev.h | 5 ++++-
|
|
||||||
lib/loopdev.c | 20 ++++++++++++++++++++
|
|
||||||
sys-utils/losetup.c | 19 +++++++++++++++----
|
|
||||||
3 files changed, 39 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/loopdev.h b/include/loopdev.h
|
|
||||||
index 953d2db..7c783bf 100644
|
|
||||||
--- a/include/loopdev.h
|
|
||||||
+++ b/include/loopdev.h
|
|
||||||
@@ -41,6 +41,7 @@ enum {
|
|
||||||
LO_FLAGS_AUTOCLEAR = 4, /* kernel >= 2.6.25 */
|
|
||||||
LO_FLAGS_PARTSCAN = 8, /* kernel >= 3.2 */
|
|
||||||
LO_FLAGS_DIRECT_IO = 16, /* kernel >= 4.2 */
|
|
||||||
+ LO_FLAGS_BLOCKSIZE = 32, /* Tentative */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define LO_NAME_SIZE 64
|
|
||||||
@@ -120,7 +121,8 @@ enum {
|
|
||||||
LOOPDEV_FL_NOIOCTL = (1 << 6),
|
|
||||||
LOOPDEV_FL_DEVSUBDIR = (1 << 7),
|
|
||||||
LOOPDEV_FL_CONTROL = (1 << 8), /* system with /dev/loop-control */
|
|
||||||
- LOOPDEV_FL_SIZELIMIT = (1 << 9)
|
|
||||||
+ LOOPDEV_FL_SIZELIMIT = (1 << 9),
|
|
||||||
+ LOOPDEV_FL_BLOCKSIZE = (1 << 10)
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -173,6 +175,7 @@ int loopcxt_set_offset(struct loopdev_cxt *lc, uint64_t offset);
|
|
||||||
int loopcxt_set_sizelimit(struct loopdev_cxt *lc, uint64_t sizelimit);
|
|
||||||
int loopcxt_set_flags(struct loopdev_cxt *lc, uint32_t flags);
|
|
||||||
int loopcxt_set_backing_file(struct loopdev_cxt *lc, const char *filename);
|
|
||||||
+int loopcxt_set_blocksize(struct loopdev_cxt *lc, uint64_t blocksize);
|
|
||||||
|
|
||||||
extern char *loopcxt_get_backing_file(struct loopdev_cxt *lc);
|
|
||||||
extern int loopcxt_get_backing_devno(struct loopdev_cxt *lc, dev_t *devno);
|
|
||||||
diff --git a/lib/loopdev.c b/lib/loopdev.c
|
|
||||||
index fd4f166..b85e2ce 100644
|
|
||||||
--- a/lib/loopdev.c
|
|
||||||
+++ b/lib/loopdev.c
|
|
||||||
@@ -1115,6 +1115,26 @@ int loopcxt_set_backing_file(struct loopdev_cxt *lc, const char *filename)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
+ * @lc: context
|
|
||||||
+ * @blocksize: logical blocksize for the device
|
|
||||||
+ *
|
|
||||||
+ * The setting is removed by loopcxt_set_device() loopcxt_next()!
|
|
||||||
+ *
|
|
||||||
+ * Returns: 0 on success, <0 on error.
|
|
||||||
+ */
|
|
||||||
+int loopcxt_set_blocksize(struct loopdev_cxt *lc, uint64_t blocksize)
|
|
||||||
+{
|
|
||||||
+ if (!lc)
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ lc->info.lo_init[0] = blocksize;
|
|
||||||
+ lc->info.lo_flags |= LO_FLAGS_BLOCKSIZE;
|
|
||||||
+
|
|
||||||
+ DBG(CXT, ul_debugobj(lc, "set blocksize=%llu", (long long unsigned int)lc->info.lo_init[0]));
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
* In kernels prior to v3.9, if the offset or sizelimit options
|
|
||||||
* are used, the block device's size won't be synced automatically.
|
|
||||||
* blockdev --getsize64 and filesystems will use the backing
|
|
||||||
diff --git a/sys-utils/losetup.c b/sys-utils/losetup.c
|
|
||||||
index 2218d3b..d8f1bfa 100644
|
|
||||||
--- a/sys-utils/losetup.c
|
|
||||||
+++ b/sys-utils/losetup.c
|
|
||||||
@@ -399,6 +399,7 @@ static void usage(FILE *out)
|
|
||||||
fputs(USAGE_SEPARATOR, out);
|
|
||||||
fputs(_(" -o, --offset <num> start at offset <num> into file\n"), out);
|
|
||||||
fputs(_(" --sizelimit <num> device is limited to <num> bytes of the file\n"), out);
|
|
||||||
+ fputs(_(" --logical-blocksize <size> set the logical block size to <size>\n"), out);
|
|
||||||
fputs(_(" -P, --partscan create a partitioned loop device\n"), out);
|
|
||||||
fputs(_(" -r, --read-only set up a read-only loop device\n"), out);
|
|
||||||
fputs(_(" --direct-io[=<on|off>] open backing file with O_DIRECT\n"), out);
|
|
||||||
@@ -448,7 +449,8 @@ static void warn_size(const char *filename, uint64_t size)
|
|
||||||
|
|
||||||
static int create_loop(struct loopdev_cxt *lc,
|
|
||||||
int nooverlap, int lo_flags, int flags,
|
|
||||||
- const char *file, uint64_t offset, uint64_t sizelimit)
|
|
||||||
+ const char *file, uint64_t offset, uint64_t sizelimit,
|
|
||||||
+ uint64_t blocksize)
|
|
||||||
{
|
|
||||||
int hasdev = loopcxt_has_device(lc);
|
|
||||||
int rc = 0;
|
|
||||||
@@ -534,6 +536,8 @@ static int create_loop(struct loopdev_cxt *lc,
|
|
||||||
loopcxt_set_offset(lc, offset);
|
|
||||||
if (flags & LOOPDEV_FL_SIZELIMIT)
|
|
||||||
loopcxt_set_sizelimit(lc, sizelimit);
|
|
||||||
+ if (flags & LOOPDEV_FL_BLOCKSIZE)
|
|
||||||
+ loopcxt_set_blocksize(lc, blocksize);
|
|
||||||
if (lo_flags)
|
|
||||||
loopcxt_set_flags(lc, lo_flags);
|
|
||||||
if ((rc = loopcxt_set_backing_file(lc, file))) {
|
|
||||||
@@ -562,7 +566,7 @@ int main(int argc, char **argv)
|
|
||||||
struct loopdev_cxt lc;
|
|
||||||
int act = 0, flags = 0, no_overlap = 0, c;
|
|
||||||
char *file = NULL;
|
|
||||||
- uint64_t offset = 0, sizelimit = 0;
|
|
||||||
+ uint64_t offset = 0, sizelimit = 0, blocksize = 0;
|
|
||||||
int res = 0, showdev = 0, lo_flags = 0;
|
|
||||||
char *outarg = NULL;
|
|
||||||
int list = 0;
|
|
||||||
@@ -572,7 +576,8 @@ int main(int argc, char **argv)
|
|
||||||
OPT_SIZELIMIT = CHAR_MAX + 1,
|
|
||||||
OPT_SHOW,
|
|
||||||
OPT_RAW,
|
|
||||||
- OPT_DIO
|
|
||||||
+ OPT_DIO,
|
|
||||||
+ OPT_BLOCKSIZE,
|
|
||||||
};
|
|
||||||
static const struct option longopts[] = {
|
|
||||||
{ "all", no_argument, NULL, 'a' },
|
|
||||||
@@ -585,6 +590,7 @@ int main(int argc, char **argv)
|
|
||||||
{ "associated", required_argument, NULL, 'j' },
|
|
||||||
{ "json", no_argument, NULL, 'J' },
|
|
||||||
{ "list", no_argument, NULL, 'l' },
|
|
||||||
+ { "logical-blocksize", required_argument, NULL, OPT_BLOCKSIZE },
|
|
||||||
{ "noheadings", no_argument, NULL, 'n' },
|
|
||||||
{ "offset", required_argument, NULL, 'o' },
|
|
||||||
{ "output", required_argument, NULL, 'O' },
|
|
||||||
@@ -658,6 +664,10 @@ int main(int argc, char **argv)
|
|
||||||
act = A_SHOW;
|
|
||||||
file = optarg;
|
|
||||||
break;
|
|
||||||
+ case OPT_BLOCKSIZE:
|
|
||||||
+ blocksize = strtosize_or_err(optarg, _("failed to parse logical block size"));
|
|
||||||
+ flags |= LOOPDEV_FL_BLOCKSIZE;
|
|
||||||
+ break;
|
|
||||||
case 'l':
|
|
||||||
list = 1;
|
|
||||||
break;
|
|
||||||
@@ -790,7 +800,8 @@ int main(int argc, char **argv)
|
|
||||||
|
|
||||||
switch (act) {
|
|
||||||
case A_CREATE:
|
|
||||||
- res = create_loop(&lc, no_overlap, lo_flags, flags, file, offset, sizelimit);
|
|
||||||
+ res = create_loop(&lc, no_overlap, lo_flags, flags, file, offset,
|
|
||||||
+ sizelimit, blocksize);
|
|
||||||
if (res == 0) {
|
|
||||||
if (showdev)
|
|
||||||
printf("%s\n", loopcxt_get_device(&lc));
|
|
||||||
--
|
|
||||||
1.8.5.6
|
|
||||||
|
|
536
util-linux-lsmem-memory-zone-1.patch
Normal file
536
util-linux-lsmem-memory-zone-1.patch
Normal file
@ -0,0 +1,536 @@
|
|||||||
|
From 60a7e9e94e49215b1e6ac6e33b69c3bd0a426b5e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gerald Schaefer <gerald.schaefer@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.schaefer@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
|
||||||
|
|
107
util-linux-lsmem-memory-zone-2.patch
Normal file
107
util-linux-lsmem-memory-zone-2.patch
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
From 0a4320f5e785e82337c3a657c55651004e3fd08d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gerald Schaefer <gerald.schaefer@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.schaefer@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
|
||||||
|
|
44
util-linux-lsmem-memory-zone-3.patch
Normal file
44
util-linux-lsmem-memory-zone-3.patch
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
From afee3f204247fbc8e4cfaa1698f3d98762544dd8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andre Wild <wild@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 <wild@linux.vnet.ibm.com>
|
||||||
|
Signed-off-by: Gerald Schaefer <gerald.schaefer@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
|
||||||
|
|
@ -1,3 +1,14 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Dec 4 17:28:04 CET 2017 - sbrabec@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 - sbrabec@suse.com
|
Mon Nov 20 17:29:11 CET 2017 - sbrabec@suse.com
|
||||||
|
|
||||||
@ -22,6 +33,7 @@ Mon Nov 20 17:29:11 CET 2017 - sbrabec@suse.com
|
|||||||
* fdisk: Improved ^C and ^D behavior.
|
* fdisk: Improved ^C and ^D behavior.
|
||||||
* cfdisk: Dialog to resize partition.
|
* cfdisk: Dialog to resize partition.
|
||||||
* look: Follow the WORDLIST environment variable.
|
* look: Follow the WORDLIST environment variable.
|
||||||
|
* losetup: Added support for --sector-size (FATE#319010).
|
||||||
* script: Follow the usual semantics for stop/continue signals.
|
* script: Follow the usual semantics for stop/continue signals.
|
||||||
* setpriv: New command line options --ambient-caps and
|
* setpriv: New command line options --ambient-caps and
|
||||||
--init-groups.
|
--init-groups.
|
||||||
|
@ -155,8 +155,12 @@ Source51: blkid.conf
|
|||||||
##
|
##
|
||||||
# PATCH-EXTEND-UPSTREAM: Let `su' handle /sbin and /usr/sbin in path
|
# PATCH-EXTEND-UPSTREAM: Let `su' handle /sbin and /usr/sbin in path
|
||||||
Patch0: make-sure-sbin-resp-usr-sbin-are-in-PATH.diff
|
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 hare@suse.de -- Add support for setting logical blocksizes.
|
# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-1.patch bsc1065471 FATE324252 sbrabec@suse.com -- lsmem: Add support for zone awareness.
|
||||||
Patch1: util-linux-losetup-Add-support-for-setting-logical-blocksize.patch
|
Patch1: util-linux-lsmem-memory-zone-1.patch
|
||||||
|
# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-2.patch bsc1065471 FATE324252 sbrabec@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 sbrabec@suse.com -- lsmem: Add support for zone awareness.
|
||||||
|
Patch3: util-linux-lsmem-memory-zone-3.patch
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
#
|
#
|
||||||
%if %build_util_linux
|
%if %build_util_linux
|
||||||
@ -214,12 +218,6 @@ Recommends: adjtimex
|
|||||||
Recommends: time
|
Recommends: time
|
||||||
Recommends: which
|
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
|
%else
|
||||||
%if %build_python_libmount
|
%if %build_python_libmount
|
||||||
%else
|
%else
|
||||||
@ -419,10 +417,9 @@ library.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q -n %{_name}-%{version} -b 40
|
%setup -q -n %{_name}-%{version} -b 40
|
||||||
%patch0 -p1
|
%patch0 -p1
|
||||||
%if 0%{?suse_version} < 1330
|
|
||||||
# logical block size support in loop does not exist in Tumbleweed and upstream kernel yet
|
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
%endif
|
%patch2 -p1
|
||||||
|
%patch3 -p1
|
||||||
#
|
#
|
||||||
# setctsid
|
# setctsid
|
||||||
cp -p %{S:22} %{S:23} .
|
cp -p %{S:22} %{S:23} .
|
||||||
|
@ -1,3 +1,14 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Dec 4 17:28:04 CET 2017 - sbrabec@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 - sbrabec@suse.com
|
Mon Nov 20 17:29:11 CET 2017 - sbrabec@suse.com
|
||||||
|
|
||||||
@ -22,6 +33,7 @@ Mon Nov 20 17:29:11 CET 2017 - sbrabec@suse.com
|
|||||||
* fdisk: Improved ^C and ^D behavior.
|
* fdisk: Improved ^C and ^D behavior.
|
||||||
* cfdisk: Dialog to resize partition.
|
* cfdisk: Dialog to resize partition.
|
||||||
* look: Follow the WORDLIST environment variable.
|
* look: Follow the WORDLIST environment variable.
|
||||||
|
* losetup: Added support for --sector-size (FATE#319010).
|
||||||
* script: Follow the usual semantics for stop/continue signals.
|
* script: Follow the usual semantics for stop/continue signals.
|
||||||
* setpriv: New command line options --ambient-caps and
|
* setpriv: New command line options --ambient-caps and
|
||||||
--init-groups.
|
--init-groups.
|
||||||
|
@ -155,8 +155,12 @@ Source51: blkid.conf
|
|||||||
##
|
##
|
||||||
# PATCH-EXTEND-UPSTREAM: Let `su' handle /sbin and /usr/sbin in path
|
# PATCH-EXTEND-UPSTREAM: Let `su' handle /sbin and /usr/sbin in path
|
||||||
Patch0: make-sure-sbin-resp-usr-sbin-are-in-PATH.diff
|
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 hare@suse.de -- Add support for setting logical blocksizes.
|
# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-1.patch bsc1065471 FATE324252 sbrabec@suse.com -- lsmem: Add support for zone awareness.
|
||||||
Patch1: util-linux-losetup-Add-support-for-setting-logical-blocksize.patch
|
Patch1: util-linux-lsmem-memory-zone-1.patch
|
||||||
|
# PATCH-FEATURE-UPSTREAM util-linux-lsmem-memory-zone-2.patch bsc1065471 FATE324252 sbrabec@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 sbrabec@suse.com -- lsmem: Add support for zone awareness.
|
||||||
|
Patch3: util-linux-lsmem-memory-zone-3.patch
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
#
|
#
|
||||||
%if %build_util_linux
|
%if %build_util_linux
|
||||||
@ -214,12 +218,6 @@ Recommends: adjtimex
|
|||||||
Recommends: time
|
Recommends: time
|
||||||
Recommends: which
|
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
|
%else
|
||||||
%if %build_python_libmount
|
%if %build_python_libmount
|
||||||
%else
|
%else
|
||||||
@ -419,10 +417,9 @@ library.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q -n %{_name}-%{version} -b 40
|
%setup -q -n %{_name}-%{version} -b 40
|
||||||
%patch0 -p1
|
%patch0 -p1
|
||||||
%if 0%{?suse_version} < 1330
|
|
||||||
# logical block size support in loop does not exist in Tumbleweed and upstream kernel yet
|
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
%endif
|
%patch2 -p1
|
||||||
|
%patch3 -p1
|
||||||
#
|
#
|
||||||
# setctsid
|
# setctsid
|
||||||
cp -p %{S:22} %{S:23} .
|
cp -p %{S:22} %{S:23} .
|
||||||
|
Loading…
Reference in New Issue
Block a user