> From: Nicolin Chen <nicolinc@xxxxxxxxxx> > Sent: Tuesday, February 14, 2023 7:00 PM > > On Fri, Feb 10, 2023 at 02:11:23AM +0000, Tian, Kevin wrote: > > > My confusion is that we have different flows between detach/attach > > and replace. > > > > today with separate detach+attach we have following flow: > > > > Remove device from current hwpt; > > if (last_device in hwpt) { > > Remove hwpt domain from current iopt; > > if (last_device in group) > > detach group from hwpt domain; > > } > > > > if (first device in group) { > > attach group to new hwpt domain; > > if (first_device in hwpt) > > Add hwpt domain to new iopt; > > Add device to new hwpt; > > > > but replace flow is different on the detach part: > > > > if (first device in group) { > > replace group's domain from current hwpt to new hwpt; > > if (first_device in hwpt) > > Add hwpt domain to new iopt; > > } > > > > Remove device from old hwpt; > > if (last_device in old hwpt) > > Remove hwpt domain from old iopt; > > > > Add device to new hwpt; > > > > I'm yet to figure out whether we have sufficient lock protection to > > prevent other paths from using old iopt/hwpt to find the device > > which is already attached to a different domain. > > With Jason's new series, the detach() routine is lighter now. > > I wonder if it'd be safer now to do the detach() call after > iommu_group_replace_domain()? > yes, looks so.