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 13 Jan 2022, at 21:51, Bob Pearson <rpearsonhpe@xxxxxxxxx> wrote:
> 
> On 1/10/22 20:22, yangx.jy@xxxxxxxxxxx wrote:
>> On 2022/1/11 9:41, Xiao Yang wrote:
>>> The expression "cons == ((qp->cur_index + 1) % q->index_mask)" mistakenly
>>> assumes the queue is full when qp->cur_index is equal to "maximum - 1"
>>> (maximum is correct).
>> Hi All,
>> 
>> The commit message seems inappropriate so I will resend this patch.
>> 
>> Best Regards,
>> Xiao Yang
>>> For example:
>>> If cons and qp->cur_index are 0 and q->index_mask is 1, check_qp_queue_full()
>>> reports ENOSPC.
>>> 
>>> Fixes: 1a894ca10105 ("Providers/rxe: Implement ibv_create_qp_ex verb")
>>> Signed-off-by: Xiao Yang <yangx.jy@xxxxxxxxxxx>
>>> ---
>>> providers/rxe/rxe_queue.h | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>> 
>>> diff --git a/providers/rxe/rxe_queue.h b/providers/rxe/rxe_queue.h
>>> index 6de8140c..708e76ac 100644
>>> --- a/providers/rxe/rxe_queue.h
>>> +++ b/providers/rxe/rxe_queue.h
>>> @@ -205,7 +205,7 @@ static inline int check_qp_queue_full(struct rxe_qp *qp)
>>> 	if (qp->err)
>>> 		goto err;
>>> 
>>> -	if (cons == ((qp->cur_index + 1) % q->index_mask))
>>> +	if (cons == ((qp->cur_index + 1) & q->index_mask))
>>> 		qp->err = ENOSPC;
>>> err:
>>> 	return qp->err;
> 
> The way these queues work they can only hold 2^n - 1 entries. The reason for this is
> to distinguish empty and full.

You can simply mitigate that by having free-running counters, right?


Thxs, Håkon

> 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
> 
> prod = cons = 0 and is empty and is *not* full
> 
> Adding one entry gives
> 
> slot[0] = value, prod = 1, cons = 0 and is full and not empty
> 
> After reading this value
> 
> slot[0] = old value, prod = cons = 1 and queue is empty again.
> 
> Writing a new value
> 
> slot[1] = new value, slot[0] = old value, prod = 0 and cons = 1 and queue is full again.
> 
> The expression full = (cons == ((qp->cur_index + 1) % q->index_mask)) is correct.
> 
> Please do not make this change.
> 
> 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