All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
To: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	punit.agrawal-5wv7dgnIgG8@public.gmane.org,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
	thunder.leizhen-hv44wF8Li93QT0dZR+AlfA@public.gmane.org
Subject: Re: [PATCH v5 09/19] iommu/arm-smmu: Consolidate stream map entry state
Date: Thu, 1 Sep 2016 19:45:51 +0100	[thread overview]
Message-ID: <6d3209ff-51ad-30ca-867b-ce62105e6699@arm.com> (raw)
In-Reply-To: <20160901183257.GT6721-5wv7dgnIgG8@public.gmane.org>

On 01/09/16 19:32, Will Deacon wrote:
> On Tue, Aug 23, 2016 at 08:05:20PM +0100, Robin Murphy wrote:
>> In order to consider SMR masking, we really want to be able to validate
>> ID/mask pairs against existing SMR contents to prevent stream match
>> conflicts, which at best would cause transactions to fault unexpectedly,
>> and at worst lead to silent unpredictable behaviour. With our SMMU
>> instance data holding only an allocator bitmap, and the SMR values
>> themselves scattered across master configs hanging off devices which we
>> may have no way of finding, there's essentially no way short of digging
>> everything back out of the hardware. Similarly, the thought of power
>> management ops to support suspend/resume faces the exact same problem.
>>
>> By massaging the software state into a closer shape to the underlying
>> hardware, everything comes together quite nicely; the allocator and the
>> high-level view of the data become a single centralised state which we
>> can easily keep track of, and to which any updates can be validated in
>> full before being synchronised to the hardware itself.
>>
>> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
>> ---
>>  drivers/iommu/arm-smmu.c | 147 +++++++++++++++++++++++++++--------------------
>>  1 file changed, 86 insertions(+), 61 deletions(-)
> 
> [...]
> 
>> +static int arm_smmu_master_alloc_smes(struct arm_smmu_device *smmu,
>> +				      struct arm_smmu_master_cfg *cfg)
>> +{
>> +	struct arm_smmu_smr *smrs = smmu->smrs;
>> +	int i, idx;
>>  
>>  	/* Allocate the SMRs on the SMMU */
>>  	for (i = 0; i < cfg->num_streamids; ++i) {
>> -		int idx = __arm_smmu_alloc_bitmap(smmu->smr_map, 0,
>> -						  smmu->num_mapping_groups);
>> +		if (cfg->smendx[i] >= 0)
>> +			return -EEXIST;
>> +
>> +		/* ...except on stream indexing hardware, of course */
>> +		if (!smrs) {
>> +			cfg->smendx[i] = cfg->streamids[i];
>> +			continue;
>> +		}
>> +
>> +		idx = arm_smmu_alloc_smr(smmu);
>>  		if (idx < 0) {
>>  			dev_err(smmu->dev, "failed to allocate free SMR\n");
>>  			goto err_free_smrs;
>>  		}
>> +		cfg->smendx[i] = idx;
>>  
>> -		smrs[i] = (struct arm_smmu_smr) {
>> -			.idx	= idx,
>> -			.mask	= 0, /* We don't currently share SMRs */
>> -			.id	= cfg->streamids[i],
>> -		};
>> +		smrs[idx].id = cfg->streamids[i];
>> +		smrs[idx].mask = 0; /* We don't currently share SMRs */
>>  	}
>>  
>> +	if (!smrs)
>> +		return 0;
>> +
>>  	/* It worked! Now, poke the actual hardware */
>> -	for (i = 0; i < cfg->num_streamids; ++i) {
>> -		u32 reg = SMR_VALID | smrs[i].id << SMR_ID_SHIFT |
>> -			  smrs[i].mask << SMR_MASK_SHIFT;
>> -		writel_relaxed(reg, gr0_base + ARM_SMMU_GR0_SMR(smrs[i].idx));
>> -	}
>> +	for (i = 0; i < cfg->num_streamids; ++i)
>> +		arm_smmu_write_smr(smmu, cfg->smendx[i]);
>>  
>> -	cfg->smrs = smrs;
>>  	return 0;
>>  
>>  err_free_smrs:
>> -	while (--i >= 0)
>> -		__arm_smmu_free_bitmap(smmu->smr_map, smrs[i].idx);
>> -	kfree(smrs);
>> +	while (i--) {
>> +		arm_smmu_free_smr(smmu, cfg->smendx[i]);
>> +		cfg->smendx[i] = INVALID_SMENDX;
>> +	}
> 
> Hmm, don't you have an off-by-one here? At least, looking at the final
> code, we branch to out_err from within the for_each_cfg_sme loop, but
> before we've incremented smmu->s2crs[idx].count, so the arm_smmu_free_smr
> will erroneously decrement that.

Given that s2crs only doesn't exist until patch 10, and s2crs->count
doesn't exist until patch 14, I'd have to say pick one of:

a) no

b) ¯\_(ツ)_/¯

Robin.

> 
> Will
> 

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

  parent reply	other threads:[~2016-09-01 18:45 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-23 19:05 [PATCH v5 00/19] Generic DT bindings for PCI IOMMUs and ARM SMMU Robin Murphy
     [not found] ` <cover.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-08-23 19:05   ` [PATCH v5 01/19] Docs: dt: add PCI IOMMU map bindings Robin Murphy
2016-08-23 19:05   ` [PATCH v5 02/19] of/irq: Break out msi-map lookup (again) Robin Murphy
2016-08-23 19:05   ` [PATCH v5 03/19] iommu/of: Handle iommu-map property for PCI Robin Murphy
     [not found]     ` <93909648835867008b21cb688a1d7db238d3641a.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-08-31 15:43       ` Will Deacon
2016-08-23 19:05   ` [PATCH v5 04/19] iommu/of: Introduce iommu_fwspec Robin Murphy
     [not found]     ` <3e8eaf4fd65833fecc62828214aee81f6ca6c190.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-08-31 17:28       ` Will Deacon
     [not found]         ` <20160831172856.GI29505-5wv7dgnIgG8@public.gmane.org>
2016-09-01 12:07           ` Robin Murphy
     [not found]             ` <900f3dcb-217c-4fb3-2f7d-15572f31a0c0-5wv7dgnIgG8@public.gmane.org>
2016-09-01 12:31               ` Will Deacon
     [not found]                 ` <20160901123158.GE6721-5wv7dgnIgG8@public.gmane.org>
2016-09-01 13:25                   ` Robin Murphy
2016-08-23 19:05   ` [PATCH v5 05/19] iommu/arm-smmu: Implement of_xlate() for SMMUv3 Robin Murphy
     [not found]     ` <6088007f60a24b36a3bf965b62521f99cd908019.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-09-01 17:06       ` Will Deacon
     [not found]         ` <20160901170604.GP6721-5wv7dgnIgG8@public.gmane.org>
2016-09-01 17:40           ` Robin Murphy
2016-08-23 19:05   ` [PATCH v5 06/19] iommu/arm-smmu: Support non-PCI devices with SMMUv3 Robin Murphy
     [not found]     ` <207d0ae38c5b01b7cf7e48231a4d01bac453b57c.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-09-01 17:08       ` Will Deacon
2016-08-23 19:05   ` [PATCH v5 07/19] iommu/arm-smmu: Set PRIVCFG in stage 1 STEs Robin Murphy
     [not found]     ` <1cda9861ce3ede6c2de9c6c4f2294549808b421b.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-09-01 17:19       ` Will Deacon
2016-08-23 19:05   ` [PATCH v5 08/19] iommu/arm-smmu: Handle stream IDs more dynamically Robin Murphy
     [not found]     ` <36f71a07fbc6037ca664bdcc540650f893081dd1.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-09-01 18:17       ` Will Deacon
2016-08-23 19:05   ` [PATCH v5 09/19] iommu/arm-smmu: Consolidate stream map entry state Robin Murphy
     [not found]     ` <26fcf7d3138816b9546a3dcc2bbbc2f229f34c91.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-09-01 18:32       ` Will Deacon
     [not found]         ` <20160901183257.GT6721-5wv7dgnIgG8@public.gmane.org>
2016-09-01 18:45           ` Robin Murphy [this message]
     [not found]             ` <6d3209ff-51ad-30ca-867b-ce62105e6699-5wv7dgnIgG8@public.gmane.org>
2016-09-01 18:54               ` Will Deacon
2016-08-23 19:05   ` [PATCH v5 10/19] iommu/arm-smmu: Keep track of S2CR state Robin Murphy
     [not found]     ` <e086741acfd0959671d184203ef758c824c8d7da.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-09-01 18:42       ` Will Deacon
     [not found]         ` <20160901184259.GU6721-5wv7dgnIgG8@public.gmane.org>
2016-09-01 19:00           ` Robin Murphy
2016-08-23 19:05   ` [PATCH v5 11/19] iommu/arm-smmu: Refactor mmu-masters handling Robin Murphy
     [not found]     ` <00301aa60323bb94588d078f2962feea0cb45c72.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-09-01 18:47       ` Will Deacon
2016-08-23 19:05   ` [PATCH v5 12/19] iommu/arm-smmu: Streamline SMMU data lookups Robin Murphy
2016-08-23 19:05   ` [PATCH v5 13/19] iommu/arm-smmu: Add a stream map entry iterator Robin Murphy
2016-08-23 19:05   ` [PATCH v5 14/19] iommu/arm-smmu: Intelligent SMR allocation Robin Murphy
     [not found]     ` <693b7fdd58be254297eb43ac8f5e035beb5226b2.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-09-01 15:17       ` Lorenzo Pieralisi
2016-09-01 17:59         ` Robin Murphy
2016-08-23 19:05   ` [PATCH v5 15/19] iommu/arm-smmu: Convert to iommu_fwspec Robin Murphy
     [not found]     ` <221f668d606abdfb4d6ee6da2c5f568c57ceccdd.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-09-01 18:53       ` Will Deacon
2016-08-23 19:05   ` [PATCH v5 16/19] Docs: dt: document ARM SMMU generic binding usage Robin Murphy
     [not found]     ` <b4f0eca93ac944c3430297b97c703e1bc54846d7.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-08-29 15:44       ` Rob Herring
2016-08-23 19:05   ` [PATCH v5 17/19] iommu/arm-smmu: Wire up generic configuration support Robin Murphy
     [not found]     ` <4439250e01ac071bae8f03a5ccf107ed7ddc0b49.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-09-01 19:02       ` Will Deacon
2016-08-23 19:05   ` [PATCH v5 18/19] iommu/arm-smmu: Set domain geometry Robin Murphy
     [not found]     ` <d6cedec16fe96a081ea2f9f27378dd1a6f406c72.1471975357.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-08-31 21:00       ` Auger Eric
2016-08-23 19:15   ` [PATCH v5 00/19] Generic DT bindings for PCI IOMMUs and ARM SMMU Robin Murphy
2016-08-23 19:15     ` Robin Murphy
     [not found]     ` <3a9a9369-d8cd-66f4-9344-965c80894bb6-5wv7dgnIgG8@public.gmane.org>
2016-09-01  3:49       ` Anup Patel
2016-09-01  3:49         ` Anup Patel
     [not found]         ` <CAALAos-OzPG=+aU8eKEZtx6EFXytPXq09k3QweHvtYCD=mN0mQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-09-01 10:10           ` Robin Murphy
2016-09-01 10:10             ` Robin Murphy
2016-09-01 15:22   ` Lorenzo Pieralisi
2016-09-01 19:05   ` Will Deacon
2016-08-23 19:05 ` [PATCH v5 19/19] iommu/dma: Add support for mapping MSIs Robin Murphy
2016-08-23 19:05   ` Robin Murphy
2016-08-24  8:16   ` Thomas Gleixner
2016-08-24  8:16     ` Thomas Gleixner
2016-08-24 10:06     ` Robin Murphy
2016-08-24 10:06       ` Robin Murphy
2016-08-25 22:25   ` Auger Eric
2016-08-25 22:25     ` Auger Eric
2016-08-26  1:17     ` Robin Murphy
2016-08-26  1:17       ` Robin Murphy
2016-08-31 20:51       ` Auger Eric
2016-08-31 20:51         ` Auger Eric

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6d3209ff-51ad-30ca-867b-ce62105e6699@arm.com \
    --to=robin.murphy-5wv7dgnigg8@public.gmane.org \
    --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=punit.agrawal-5wv7dgnIgG8@public.gmane.org \
    --cc=thunder.leizhen-hv44wF8Li93QT0dZR+AlfA@public.gmane.org \
    --cc=will.deacon-5wv7dgnIgG8@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.