Re: [PATCH RFC v5 4/6] iommu/arm-smmu-v3: Support shared SIDs in insert/remove_master

From: Peng Fan

Date: Thu Oct 08 2026 - 10:02:59 EST


On Wed, Oct 07, 2026 at 06:02:03PM -0700, Nicolin Chen wrote:
>On Tue, Oct 06, 2026 at 08:19:10PM +0800, Peng Fan (OSS) wrote:
>> @@ -4193,17 +4213,31 @@ static void arm_smmu_remove_master(struct arm_smmu_master *master)
>> return;
>>
>> mutex_lock(&smmu->streams_mutex);
>> - for (i = 0; i < master->num_streams; i++) {
>> - int j;
>> + if (!list_empty(&master->shared_masters_elm)) {
>> + struct arm_smmu_stream *stream = master->streams[0];
>>
>> - /* Skip duplicated SID pointers already freed */
>> - for (j = 0; j < i; j++)
>> - if (master->streams[j] == master->streams[i])
>> - break;
>> - if (j < i)
>> - continue;
>> - rb_erase(&master->streams[i]->node, &smmu->streams);
>> - kfree(master->streams[i]);
>> + list_del_init(&master->shared_masters_elm);
>> + if (list_is_singular(&stream->shared_masters)) {
>> + struct arm_smmu_master *last;
>> +
>> + last = list_first_entry(&stream->shared_masters,
>> + struct arm_smmu_master,
>> + shared_masters_elm);
>> + list_del_init(&last->shared_masters_elm);
>> + }
>
>This doesn't look right: it still needs the for loop and also needs
>to compare master with stream->master:

My bad. Thanks for sharing the code. I will take care in V6.

Thanks
Peng
>
> if (!list_empty(&stream->shared_masters)) {
> struct arm_smmu_master *next;
>
> list_del_init(&master->shared_masters_elm);
> next = list_first_entry(&stream->shared_masters,
> struct arm_smmu_master,
> shared_masters_elm);
> if (stream->master == master)
> stream->master = next;
> if (list_is_singular(&stream->shared_masters))
> list_del_init(&next->shared_masters_elm);
> continue;
> }
> rb_erase(&stream->node, &smmu->streams);
> kfree(stream);
>
>Nicolin
>