On 21/09/2021 12:43, Fernand Sieber wrote:
        do {

I didn't follow the full logic of this change yet ...

                llq->val = READ_ONCE(cmdq->q.llq.val);
-               if (!queue_full(llq))
+               if (!queue_has_space(llq, n))

But is the polarity really correct? That is, if we don't have space, then exit with success (the function to check for space).

                        break;

+               /*
+                * We must return here even if there's no space, because the 
producer
+                * having moved forward could mean that the last thread 
observing the
+                * SMMU progress has allocated space in the cmdq and moved on, 
leaving
+                * us in this waiting loop with no other thread updating
+                * llq->state->val.

what is llq->state->val?

+                */
+               if (llq->prod != prod)
+                       return -EAGAIN;
+
                ret = queue_poll(&qp);

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

Reply via email to