[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/9] AMD/IOMMU: re-work locking around sending of commands
On 09.06.2021 12:53, Andrew Cooper wrote: > On 09/06/2021 10:27, Jan Beulich wrote: >> It appears unhelpful to me for flush_command_buffer() to block all >> progress elsewhere for the given IOMMU by holding its lock while >> waiting for command completion. Unless the lock is already held, >> acquire it in send_iommu_command(). Release it in all cases in >> flush_command_buffer(), before actually starting the wait loop. >> >> Some of the involved functions did/do get called with the lock already >> held: For amd_iommu_flush_intremap() we can simply move the locking >> inside. For amd_iommu_flush_device() and amd_iommu_flush_all_caches() >> the lock now gets dropped in the course of the function's operation. >> >> Where touching function headers anyway, also adjust types used to be >> better in line with our coding style and, where applicable, the >> functions' callers. >> >> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> >> Reviewed-by: Paul Durrant <paul@xxxxxxx> > > Honestly, I'm -2 to this. It is horrible obfuscation of the logic. > > I agree with the premise of not holding the lock when we don't need to, > but moving the lock/unlocks into different functions makes it impossible > to follow. (Also, the static analysers are going to scream at this > patch, and rightfully so IMO.) Just to make it explicit - the immediate goal isn't so much to shrink the locked regions as much as possible, but first of all to avoid spin-waiting in flush_command_buffer() while holding the lock (and having IRQs off). > send_iommu_command() is static, as is flush_command_buffer(), so there > is no need to split the locking like this AFAICT. > > Instead, each amd_iommu_flush_* external accessor knows exactly what it > is doing, and whether a wait descriptor is wanted. > flush_command_buffer() wants merging into send_iommu_command() as a > "bool wait" parameter, at which point the locking and unlocking moves > entirely into send_iommu_command() with no pointer games. Then I can only guess you didn't look closely at the pci_amd_iommu.c part of the change? You may rest assured that I wouldn't have taken the chosen route if there was a reasonable alternative (within the current overall code structure). In fact I had tried first with what you suggest, and had to make it the way it was posted because of the requirements of these callers. I'm also pretty certain Paul wouldn't have given his R-b if there was this simple an alternative. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |