lsmem: Fix splitting by zones
This commit is contained in:
parent
f34ebac3fe
commit
f188fd2ae0
@ -154,6 +154,24 @@ enum ZoneId {
|
|||||||
MaxNrZones,
|
MaxNrZones,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl FromStr for ZoneId {
|
||||||
|
type Err = ();
|
||||||
|
|
||||||
|
fn from_str(input: &str) -> Result<ZoneId, Self::Err> {
|
||||||
|
match input.to_lowercase().as_str() {
|
||||||
|
"dma" => Ok(ZoneId::ZoneDma),
|
||||||
|
"dma32" => Ok(ZoneId::ZoneDma32),
|
||||||
|
"normal" => Ok(ZoneId::ZoneNormal),
|
||||||
|
"highmem" => Ok(ZoneId::ZoneHighmem),
|
||||||
|
"movable" => Ok(ZoneId::ZoneMovable),
|
||||||
|
"device" => Ok(ZoneId::ZoneDevice),
|
||||||
|
"none" => Ok(ZoneId::ZoneNone),
|
||||||
|
"unknown" => Ok(ZoneId::ZoneUnknown),
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Clone)]
|
#[derive(PartialEq, Clone)]
|
||||||
enum MemoryState {
|
enum MemoryState {
|
||||||
Online,
|
Online,
|
||||||
@ -251,7 +269,7 @@ struct Options {
|
|||||||
split_by_removable: bool,
|
split_by_removable: bool,
|
||||||
split_by_state: bool,
|
split_by_state: bool,
|
||||||
split_by_zones: bool,
|
split_by_zones: bool,
|
||||||
/// Default to PATH_SYS_MEMORY, but a prefix can be appended
|
/// Default to PATH_SYS_MEMORY, but a prefix can be prepended
|
||||||
sysmem: String,
|
sysmem: String,
|
||||||
|
|
||||||
// Set by read_info
|
// Set by read_info
|
||||||
@ -338,7 +356,7 @@ fn read_info(lsmem: &mut Lsmem, opts: &mut Options) {
|
|||||||
|
|
||||||
let mut p = path.clone();
|
let mut p = path.clone();
|
||||||
p.push(PATH_SUB_VALID_ZONES);
|
p.push(PATH_SUB_VALID_ZONES);
|
||||||
if fs::read_dir(p).is_ok() {
|
if fs::read(&p).is_ok() {
|
||||||
opts.have_zones = true;
|
opts.have_zones = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,7 +419,6 @@ fn is_mergeable(lsmem: &Lsmem, opts: &Options, blk: &MemoryBlock) -> bool {
|
|||||||
if curr_block.nr_zones != blk.nr_zones {
|
if curr_block.nr_zones != blk.nr_zones {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for i in 0..curr_block.nr_zones {
|
for i in 0..curr_block.nr_zones {
|
||||||
if curr_block.zones[i] == ZoneId::ZoneUnknown || curr_block.zones[i] != blk.zones[i] {
|
if curr_block.zones[i] == ZoneId::ZoneUnknown || curr_block.zones[i] != blk.zones[i] {
|
||||||
return false;
|
return false;
|
||||||
@ -446,18 +463,16 @@ fn memory_block_read_attrs(opts: &Options, path: &PathBuf) -> MemoryBlock {
|
|||||||
|
|
||||||
blk.nr_zones = 0;
|
blk.nr_zones = 0;
|
||||||
if opts.have_zones {
|
if opts.have_zones {
|
||||||
if let Ok(raw_content) = read_file_content::<String>(Path::new(&format!(
|
let vz_path = path.join(PATH_SUB_VALID_ZONES);
|
||||||
"{}/{}",
|
if let Ok(raw_content) = read_file_content::<String>(Path::new(&vz_path)) {
|
||||||
opts.sysmem.clone(),
|
|
||||||
PATH_SUB_VALID_ZONES
|
|
||||||
))) {
|
|
||||||
let zone_toks = raw_content.split(' ').collect::<Vec<&str>>();
|
let zone_toks = raw_content.split(' ').collect::<Vec<&str>>();
|
||||||
for (i, zone_tok) in zone_toks
|
for (i, zone_tok) in zone_toks
|
||||||
.iter()
|
.iter()
|
||||||
|
.map(|tok| tok.to_lowercase())
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.take(std::cmp::min(zone_toks.len(), ZoneId::MaxNrZones as usize))
|
.take(std::cmp::min(zone_toks.len(), ZoneId::MaxNrZones as usize))
|
||||||
{
|
{
|
||||||
blk.zones[i] = serde_json::from_str(zone_tok).unwrap();
|
blk.zones[i] = ZoneId::from_str(&zone_tok).unwrap();
|
||||||
blk.nr_zones += 1;
|
blk.nr_zones += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -691,7 +706,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
|
|||||||
let split_columns = matches
|
let split_columns = matches
|
||||||
.get_many::<String>(options::SPLIT)
|
.get_many::<String>(options::SPLIT)
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
.map(|c| c.to_owned())
|
.map(|c| c.to_uppercase())
|
||||||
.collect::<Vec<String>>();
|
.collect::<Vec<String>>();
|
||||||
opts.split_by_node = split_columns.contains(&Column::Node.get_name().to_string());
|
opts.split_by_node = split_columns.contains(&Column::Node.get_name().to_string());
|
||||||
opts.split_by_removable = split_columns.contains(&Column::Removable.get_name().to_string());
|
opts.split_by_removable = split_columns.contains(&Column::Removable.get_name().to_string());
|
||||||
|
@ -130,11 +130,10 @@ fn test_split_state() {
|
|||||||
sysroot_test_with_args("test_lsmem_split_state.expected", &["-S", "state"]);
|
sysroot_test_with_args("test_lsmem_split_state.expected", &["-S", "state"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FAILS, COMMENT FOR NOW - TODO
|
#[test]
|
||||||
// #[test]
|
fn test_split_zones() {
|
||||||
// fn test_split_zones() {
|
sysroot_test_with_args("test_lsmem_split_zones.expected", &["-S", "zones"]);
|
||||||
// sysroot_test_with_args("test_lsmem_split_zones.expected", &["-S", "zones"]);
|
}
|
||||||
// }
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_table() {
|
fn test_table() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user