From 66d819dc82080e9dba609b3bfff45c14d7c3ba3c Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Fri, 3 Nov 2017 10:58:33 +0100 Subject: [PATCH] lsmem: make --split optional, follow output by default Let's keep lsmem backwardly compatible (<=v2.30) and create ranges according to the output columns by default. This default behavior may be modified by --split command line option. Upstream: http://github.com/karelzak/util-linux/commit/96cbe362c034305e5f12a912b4247b3321420ee7 Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1496421 Signed-off-by: Karel Zak --- sys-utils/lsmem.1 | 14 ++++++-------- sys-utils/lsmem.c | 49 ++++++++++++++++++++++++++++++------------------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/sys-utils/lsmem.1 b/sys-utils/lsmem.1 index 3f5cd7d4b..bfe312bfc 100644 --- a/sys-utils/lsmem.1 +++ b/sys-utils/lsmem.1 @@ -16,14 +16,12 @@ Always explicitly define expected columns by using the \fB\-\-output\fR option together with a columns list in environments where a stable output is required. The \fBlsmem\fP command lists a new memory range always when the current memory -block distinguish from the previous block by STATE, REMOVABLE, NODE or ZONES -attribute. This default behavior is possible to override by the -\fB\-\-split\fR option (e.g. \fBlsmem \-\-split=STATE,ZONES\fR). The special -word "none" may be used to ignore all differences between memory blocks and to -create as large as possible continuous ranges. The opposite semantic is -\fB\-\-all\fR to list individual memory blocks. The default split policy is -subject to change. Always explicitly use \fB\-\-split\fR in environments where -a stable output is required. +block distinguish from the previous block by some output column. This default +behavior is possible to override by the \fB\-\-split\fR option (e.g. \fBlsmem +\-\-split=ZONES\fR). The special word "none" may be used to ignore all +differences between memory blocks and to create as large as possible continuous +ranges. The opposite semantic is \fB\-\-all\fR to list individual memory +blocks. Note that some output columns may provide inaccurate information if a split policy forces \fBlsmem\fP to ignore diffrences in some attributes. For example if you diff --git a/sys-utils/lsmem.c b/sys-utils/lsmem.c index 34a2847af..aaf7374fc 100644 --- a/sys-utils/lsmem.c +++ b/sys-utils/lsmem.c @@ -202,6 +202,32 @@ static inline void reset_split_policy(struct lsmem *l, int enable) l->split_by_zones = enable; } +static void set_split_policy(struct lsmem *l, int cols[], size_t ncols) +{ + size_t i; + + reset_split_policy(l, 0); + + for (i = 0; i < ncols; i++) { + switch (cols[i]) { + case COL_STATE: + l->split_by_state = 1; + break; + case COL_NODE: + l->split_by_node = 1; + break; + case COL_REMOVABLE: + l->split_by_removable = 1; + break; + case COL_ZONES: + l->split_by_zones = 1; + break; + default: + break; + } + } +} + static void add_scols_line(struct lsmem *lsmem, struct memory_block *blk) { size_t i; @@ -638,32 +664,17 @@ int main(int argc, char **argv) int split[ARRAY_SIZE(coldescs)] = { 0 }; static size_t nsplits = 0; - reset_split_policy(lsmem, 0); /* disable all */ - if (strcasecmp(splitarg, "none") == 0) ; else if (string_add_to_idarray(splitarg, split, ARRAY_SIZE(split), (int *) &nsplits, column_name_to_id) < 0) return EXIT_FAILURE; - for (i = 0; i < nsplits; i++) { - switch (split[i]) { - case COL_STATE: - lsmem->split_by_state = 1; - break; - case COL_NODE: - lsmem->split_by_node = 1; - break; - case COL_REMOVABLE: - lsmem->split_by_removable = 1; - break; - case COL_ZONES: - lsmem->split_by_zones = 1; - break; - } - } + set_split_policy(lsmem, split, nsplits); + } else - reset_split_policy(lsmem, 1); /* enable all */ + /* follow output columns */ + set_split_policy(lsmem, columns, ncolumns); /* * Read data and print output -- 2.13.6