Re: [PATCH 23/34] AMD IOMMU: add functions to find IOMMU deviceresources

From: Andrew Morton
Date: Thu Jul 10 2008 - 20:06:01 EST


On Thu, 10 Jul 2008 18:46:44 +0200 Joerg Roedel <joerg.roedel@xxxxxxx> wrote:

> > > +static struct protection_domain *domain_for_device(u16 devid)
> > > +{
> > > + struct protection_domain *dom;
> > > + unsigned long flags;
> > > +
> > > + read_lock_irqsave(&amd_iommu_devtable_lock, flags);
> >
> > Why is this cheerfully undocumented lock irq-safe? Is it ever taken from
> > IRQ context?
>
> This function is called from the dma-mapping path. As far as I know the
> DMA mapping functions can be called from interrupt context.
>
> >
> > > + dom = amd_iommu_pd_table[devid];
> > > + read_unlock_irqrestore(&amd_iommu_devtable_lock, flags);
> > > +
> > > + return dom;
> > > +}
> >
> > The locking in this function makes no sense. We drop the lock then return
> > a value which the caller cannot use in a race-free fashion, because the
> > lock is no longer held.
>
> The lock only protects the protection domain table (and the device
> table) itself. It does not protect the values the pointers in that list
> point to. In this case its also not racy because a value to that list is
> only written once and then never changed again (currently). If this
> changes in the future (and it will) I will change the locking too. This
> will also need reference counting for 'struct protection_domain' which
> is not implemented yet.

So no locking is needed in this function.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/