[dpdk-dev] [PATCH] cast used->idx to volatile

Xie, Huawei huawei.xie at intel.com
Wed Apr 1 16:40:17 CEST 2015


On 4/1/2015 3:51 PM, Thomas Monjalon wrote:
> 2015-03-30 15:56, Xie, Huawei:
>> On 3/30/2015 5:21 PM, Linhaifeng wrote:
>>> On 2015/3/24 18:06, Xie, Huawei wrote:
>>>> On 3/24/2015 3:44 PM, Linhaifeng wrote:
>>>>> On 2015/3/24 9:53, Xie, Huawei wrote:
>>>>>> On 3/24/2015 9:00 AM, Linhaifeng wrote:
>>>>>>> On 2015/3/23 20:54, Xie, Huawei wrote:
>>>>>>>> We have compiler barrier before and an external function call behind, so we don't need volatile  here.
>>>>>>>> Do you meet issue?
>>>>>>>>
>>>>>>> Tx_q is sometimes stopped when we use virtio_net. Because vhost thought there are no buffers in tx_q and virtio_net
>>>>>>> though vhost haven't handle all packets so we have to restart VM to restore work.
>>>>>>>
>>>>>>> The status in VM is:
>>>>>>> Mar 18 17:11:10 linux-b2ij kernel: [46337.246687] net eth7: virtnet_poll
>>>>>>> Mar 18 17:11:10 linux-b2ij kernel: [46337.246690] net eth7: receive_buf
>>>>>>> Mar 18 17:11:10 linux-b2ij kernel: [46337.246693] net eth7: vi->num=239
>>>>>>> Mar 18 17:11:10 linux-b2ij kernel: [46337.246695] net eth7: svq:avail->idx=52939 used->idx=52939 num_free=18 num_added=0 svq->last_used_idx=52820
>>>>>>> Mar 18 17:11:10 linux-b2ij kernel: [46337.246699] net eth7: rvq:avail->idx=36215 used->idx=35977 num_free=18 num_added=0 rvq->last_used_idx=35977
>>>>>>> Mar 18 17:11:11 linux-b2ij kernel: [46337.901038] net eth7: dev_queue_xmit, qdisc->flags=4, qdisc->state deactiveed=0
>>>>>>> Mar 18 17:11:12 linux-b2ij kernel: [46337.901042] net eth7: dev_queue_xmit, txq->state=1, stopped=1
>>>>>>>
>>>>>>> Why compiler barrier not take effect in our case? Is compiler barrier depended on -O3 option? We use -O2 option.
>>>>>> compiler barrier always works regardless of the optimization option.
>>>>>> I don't get your story, but the key thing is, do you check the asm code?
>>>>>> If called from outside as an API, how is it possible it is optimized?
>>>>>> there is only one update to used->idx in that function.
>>>>> Do you mean rte_vhost_enqueue_burst also not need cast used->idx to volatile ? Why not remove it?
>>>> I checked the code. Seems we can remove. That is another issue.
>>>> For your issue, you meet problem, and submit this this patch, but i am a
>>>> bit confused it is the root cause. Do you check the asm code that
>>>> volatile is optimized?
>>>>
>>> I had wrote a demo try to find out the different between rte_compiler_barrier and volatile.
>>> It seems no any effect on rte_compiler_barrier().
>> Haifeng:
>>
>> I think it doesn't make too much sense to use volatile for local variables.
>>
>> In our rte_vhost_dequeue_burst, there is one memory write to the
>> used->idx, and there is compiler barrier to keep the order.
>> Besides, as an API, how could that memory write to be optimized as
>> register access?
>>
>> Even if you call rte_vhost_dequeue_burst in the same src file, which
>> means in the same translation unit, there is function call after which
>> has side effect, it still couldn't be optimized.
>>
>> Anyway, could we directly check the asm code of rte_vhost_dequeue_burst
>> to see whether it is optimized?
> Conclusion is not clear. Is this patch rejected?
>
>
>
so far we have no evidence the code has error so will temporarily reject it.


More information about the dev mailing list