pub trait HotplugOps: Send { /// Plug device, usually called when hot plug device in device_add. fn plug(&mut self, dev: &Arc<Mutex<dyn PciDevOps>>) -> Result<()>; /// Unplug device request, usually called when hot unplug device in device_del. /// Only send unplug request to the guest OS, without actually removing the device. fn unplug_request(&mut self, dev: &Arc<Mutex<dyn PciDevOps>>) -> Result<()>; /// Remove the device. fn unplug(&mut self, dev: &Arc<Mutex<dyn PciDevOps>>) -> Result<()>;}
fn do_unplug(&mut self, offset: usize, end: usize, old_ctl: u16) { let cap_offset = self.config.ext_cap_offset; // Only care the write config about slot control if !ranges_overlap( offset, end, (cap_offset + PCI_EXP_SLTCTL) as usize, (cap_offset + PCI_EXP_SLTCTL + 2) as usize, ) { return; } let status = le_read_u16(&self.config.config, (cap_offset + PCI_EXP_SLTSTA) as usize).unwrap(); let val = le_read_u16(&self.config.config, offset).unwrap(); // Only unplug device when the slot is on // Don't unplug when slot is off for guest OS overwrite the off status before slot on. if (status & PCI_EXP_SLTSTA_PDS != 0) && (val as u16 & PCI_EXP_SLTCTL_PCC == PCI_EXP_SLTCTL_PCC) && (val as u16 & PCI_EXP_SLTCTL_PWR_IND_OFF == PCI_EXP_SLTCTL_PWR_IND_OFF) && (old_ctl & PCI_EXP_SLTCTL_PCC != PCI_EXP_SLTCTL_PCC || old_ctl & PCI_EXP_SLTCTL_PWR_IND_OFF != PCI_EXP_SLTCTL_PWR_IND_OFF) { self.remove_devices(); if let Err(e) = self.update_register_status() { error!("{}", e.display_chain()); error!("Failed to update register status"); } } self.hotplug_command_completed(); self.hotplug_event_notify();}
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。