mirror of
				https://github.com/kata-containers/kata-containers.git
				synced 2025-10-31 09:26:52 +00:00 
			
		
		
		
	agent: create pci root Bus Path for arm64
port https://github.com/kata-containers/agent/pull/860 here. Fixes: #1059 Signed-off-by: Jianyong Wu <jianyong.wu@arm.com>
This commit is contained in:
		| @@ -21,6 +21,7 @@ signal-hook = "0.1.9" | |||||||
| scan_fmt = "0.2.3" | scan_fmt = "0.2.3" | ||||||
| scopeguard = "1.0.0" | scopeguard = "1.0.0" | ||||||
| regex = "1" | regex = "1" | ||||||
|  |  | ||||||
| # slog: | # slog: | ||||||
| # - Dynamic keys required to allow HashMap keys to be slog::Serialized. | # - Dynamic keys required to allow HashMap keys to be slog::Serialized. | ||||||
| # - The 'max_*' features allow changing the log level at runtime | # - The 'max_*' features allow changing the log level at runtime | ||||||
|   | |||||||
| @@ -5,8 +5,10 @@ | |||||||
|  |  | ||||||
| /// Linux ABI related constants. | /// Linux ABI related constants. | ||||||
|  |  | ||||||
| pub const SYSFS_DIR: &str = "/sys"; | #[cfg(target_arch = "aarch64")] | ||||||
|  | use std::fs; | ||||||
|  |  | ||||||
|  | pub const SYSFS_DIR: &str = "/sys"; | ||||||
| pub const SYSFS_PCI_BUS_PREFIX: &str = "/sys/bus/pci/devices"; | pub const SYSFS_PCI_BUS_PREFIX: &str = "/sys/bus/pci/devices"; | ||||||
| pub const SYSFS_PCI_BUS_RESCAN_FILE: &str = "/sys/bus/pci/rescan"; | pub const SYSFS_PCI_BUS_RESCAN_FILE: &str = "/sys/bus/pci/rescan"; | ||||||
| #[cfg(any( | #[cfg(any( | ||||||
| @@ -15,9 +17,46 @@ pub const SYSFS_PCI_BUS_RESCAN_FILE: &str = "/sys/bus/pci/rescan"; | |||||||
|     target_arch = "x86_64", |     target_arch = "x86_64", | ||||||
|     target_arch = "x86" |     target_arch = "x86" | ||||||
| ))] | ))] | ||||||
| pub const PCI_ROOT_BUS_PATH: &str = "/devices/pci0000:00"; | pub fn create_pci_root_bus_path() -> String { | ||||||
|  |     String::from("/devices/pci0000:00") | ||||||
|  | } | ||||||
|  |  | ||||||
| #[cfg(target_arch = "aarch64")] | #[cfg(target_arch = "aarch64")] | ||||||
| pub const PCI_ROOT_BUS_PATH: &str = "/devices/platform/4010000000.pcie/pci0000:00"; | pub fn create_pci_root_bus_path() -> String { | ||||||
|  |     let ret = String::from("/devices/platform/4010000000.pcie/pci0000:00"); | ||||||
|  |  | ||||||
|  |     let mut sysfs_dir = String::from(SYSFS_DIR); | ||||||
|  |     let mut start_root_bus_path = String::from("/devices/platform/"); | ||||||
|  |     let end_root_bus_path = String::from("/pci0000:00"); | ||||||
|  |  | ||||||
|  |     sysfs_dir.push_str(&start_root_bus_path); | ||||||
|  |     let entries = match fs::read_dir(sysfs_dir) { | ||||||
|  |         Ok(e) => e, | ||||||
|  |         Err(_) => return ret, | ||||||
|  |     }; | ||||||
|  |     for entry in entries { | ||||||
|  |         let pathname = match entry { | ||||||
|  |             Ok(p) => p.path(), | ||||||
|  |             Err(_) => return ret, | ||||||
|  |         }; | ||||||
|  |         let dir_name = match pathname.file_name() { | ||||||
|  |             Some(p) => p.to_str(), | ||||||
|  |             None => return ret, | ||||||
|  |         }; | ||||||
|  |         let dir_name = match dir_name { | ||||||
|  |             Some(p) => p, | ||||||
|  |             None => return ret, | ||||||
|  |         }; | ||||||
|  |         let dir_name = String::from(dir_name); | ||||||
|  |         if dir_name.ends_with(".pcie") { | ||||||
|  |             start_root_bus_path.push_str(&dir_name); | ||||||
|  |             start_root_bus_path.push_str(&end_root_bus_path); | ||||||
|  |             return start_root_bus_path; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ret | ||||||
|  | } | ||||||
|  |  | ||||||
| pub const SYSFS_CPU_ONLINE_PATH: &str = "/sys/devices/system/cpu"; | pub const SYSFS_CPU_ONLINE_PATH: &str = "/sys/devices/system/cpu"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -48,13 +48,16 @@ impl Uevent { | |||||||
|  |  | ||||||
|     // Check whether this is a block device hot-add event. |     // Check whether this is a block device hot-add event. | ||||||
|     fn is_block_add_event(&self) -> bool { |     fn is_block_add_event(&self) -> bool { | ||||||
|  |         let pci_root_bus_path = create_pci_root_bus_path(); | ||||||
|         self.action == U_EVENT_ACTION_ADD |         self.action == U_EVENT_ACTION_ADD | ||||||
|             && self.subsystem == "block" |             && self.subsystem == "block" | ||||||
|             && self.devpath.starts_with(PCI_ROOT_BUS_PATH) |             && self.devpath.starts_with(&pci_root_bus_path) | ||||||
|             && self.devname != "" |             && self.devname != "" | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn handle_block_add_event(&self, sandbox: &Arc<Mutex<Sandbox>>) { |     fn handle_block_add_event(&self, sandbox: &Arc<Mutex<Sandbox>>) { | ||||||
|  |         let pci_root_bus_path = create_pci_root_bus_path(); | ||||||
|  |  | ||||||
|         // Keep the same lock order as device::get_device_name(), otherwise it may cause deadlock. |         // Keep the same lock order as device::get_device_name(), otherwise it may cause deadlock. | ||||||
|         let mut w = GLOBAL_DEVICE_WATCHER.lock().unwrap(); |         let mut w = GLOBAL_DEVICE_WATCHER.lock().unwrap(); | ||||||
|         let mut sb = sandbox.lock().unwrap(); |         let mut sb = sandbox.lock().unwrap(); | ||||||
| @@ -69,7 +72,7 @@ impl Uevent { | |||||||
|         let empties: Vec<_> = w |         let empties: Vec<_> = w | ||||||
|             .iter() |             .iter() | ||||||
|             .filter(|(dev_addr, _)| { |             .filter(|(dev_addr, _)| { | ||||||
|                 let pci_p = format!("{}/{}", PCI_ROOT_BUS_PATH, *dev_addr); |                 let pci_p = format!("{}/{}", pci_root_bus_path, *dev_addr); | ||||||
|  |  | ||||||
|                 // blk block device |                 // blk block device | ||||||
|                 devpath.starts_with(pci_p.as_str()) || |                 devpath.starts_with(pci_p.as_str()) || | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user