Re: Fwd: Re: [rdma-core PATCH] providers/rxe: Replace '%' with '&' in check_qp_queue_full()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2022/1/20 13:08, Bob Pearson wrote:
> On 1/18/22 03:02, yangx.jy@xxxxxxxxxxx wrote:
>> CC: linux-rdma mail list
>>
>> On 2022/1/14 4:51, Bob Pearson wrote:
>>> The way these queues work they can only hold 2^n - 1 entries. The reason for this is
>>> to distinguish empty and full. If you let the last entry be written then producer would advance to equal consumer which is the initial empty condition. So a queue which can hold 1 entry has to have two slots (n=1) but can only hold one entry. It begins with
>> Hi Bob,
>>
>> Thanks for your detailed example.
>>> prod = cons = 0 and is empty and is*not*  full
> full = (cons == ((prod + 1) % 2)) = (0 == 1) = false
> empty = (prod == cons) == (0 == 0) = true
>>> Adding one entry gives
>>>
>>> slot[0] = value, prod = 1, cons = 0 and is full and not empty
> full = (cons == ((prod + 1) % 2)) = (0 == 0) = true
> empty = (prod == cons) == (0 == 1) = false
>>> After reading this value
>>>
>>> slot[0] = old value, prod = cons = 1 and queue is empty again.
> full = (cons == ((prod + 1) % 2)) = (1 == 0) = false
> empty = (prod == cons) = (1 == 1) = true
>>> Writing a new value
>>>
>>> slot[1] = new value, slot[0] = old value, prod = 0 and cons = 1 and queue is full again.
> full = (cons == ((prod + 1) % 2)) = (1 == (0 + 1) % 2) = true
> empty = (prod == cons) = (0 == 1) = false
>
> and x % 2^N is the same as x&  (2^N - 1) or x&  index_mask.
Hi Bob,

Agreed.  either x % 2^N or x & (2^N - 1) is fine, but we use the wrong x 
% (2^N - 1) here.

>>> The expression full = (cons == ((qp->cur_index + 1) % q->index_mask)) is correct.
> Actually you are correct. If you look at queue_full() it uses
> full = (cons == (prod + 1)&  q->index_mask) and queue_empty() uses
> empty = (prod == cons) *but*
> check_qp_queue_full() uses
> full = (cons == ((qp->cur_index + 1) % q->index_mask)) with % instead of&.
> I was so used to looking at the first two I missed the error in the last one.
>
> % should be&  like the others.
I will update the commit message and send v2 patch.

Thanks lot.

Best Regards,
Xiao Yang
> Bob
>
>




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux