muvarov replied on github web page:

platform/linux-generic/odp_pool.c
@@ -232,19 +237,40 @@ static void init_buffers(pool_t *pool)
        uint32_t mask;
        int type;
        uint32_t seg_size;
+       uint64_t page_size = 0;
+       int skipped_blocks = 0;
+
+       if (odp_shm_info(pool->shm, &shm_info) == 0)
+               page_size = shm_info.page_size;


Comment:
@Bill-Fischofer-Linaro  odp_pool_lookup() works in any thread. shm look up also 
can get that memory. Destroy path also has look up and destroy. So I think 
simple ABORT() here is good.

> Matias Elo(matiaselo) wrote:
> OK, I'll add an abort branch.


>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>> This is happening within `odp_pool_create()`, which is creating the 
>> `odp_pool_t`, so other threads don't have that handle with which to call 
>> `odp_pool_destroy()`. 
>> 
>> The only way `odp_shm_info()` can fail is if it's passed an unknown 
>> `odp_shm_t` handle, which is not the case here. 
>> 
>> I have no objection to adding an `else ODP_ABORT()` here, however.


>>> muvarov wrote
>>> actually it can.  it can return -1 for some reasons. And pool_create() and 
>>> pool_destroy() from different threads for the same time, will make shm 
>>> invalid before init_buffers(). But that is corner case and programmable 
>>> error :)
>>> 
>>> But it works. My point was a little bit different. In my understanding 
>>> assuming that odp api function will fail is not correct in places like 
>>> that. That works like work around - what we will do if call will fail. 
>>> Instead of that you should force platform to implement this api call in 
>>> correct way. Especially if it's reference implementation. I would prefer 
>>> ODP_ABORT() if call fails as that is not expected here.


>>>> Matias Elo(matiaselo) wrote:
>>>> As Bill noted, if odp_shm_info() could somehow fail, nothing would still 
>>>> brake.


>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>> @muvarov In the unlikely (impossible in the case of the current 
>>>>> linux-generic implementation) event of this call failing, `page_size` 
>>>>> will be left at the initialized default 0 value, which means we won't 
>>>>> skip any buffers since 0 is less than `FIRST_HP_SIZE`. No no error here.


>>>>>> muvarov wrote
>>>>>> if call fails it has to be an error? result in that case is not 
>>>>>> predictable?


>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>> As you noted there can be at most N crossings with the original pool 
>>>>>>> size ('num'). Now, to compensate for the skipped buffers the pool size 
>>>>>>> is in practice increased by 'num_extra'. When the original pool size is 
>>>>>>> large enough the extra buffers may again cross page boundary. 
>>>>>>> 
>>>>>>> Currently, a single buffer is 8KB, so a single 2MB page can hold max 
>>>>>>> 256 buffers. With a pool size of 64K or larger the extra buffers will 
>>>>>>> cross page boundary again.
>>>>>>> 
>>>>>>> Using 2x multiplication here is overkill. I'll update the patch and 
>>>>>>> calculate the exact number of required extra buffers.


>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>> The dpdk drivers only support huge page memory, so packets crossing 4K 
>>>>>>>> page boundaries isn't a problem.


>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>> The blocks are contiguous so you're computing how many of them can 
>>>>>>>>> fit in a 2M huge page. Since blocks aren't themselves larger than a 
>>>>>>>>> huge page I don't see what's wrong with my analysis.


>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>> Fair enough. I agree these sort of considerations should be 
>>>>>>>>>> transparent to the application. This will complicate the sort of 
>>>>>>>>>> index-juggling that VPP does (see PR #200). We'll have to consider 
>>>>>>>>>> this in the discussions planned for Monday's ARCH call.


>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>> I'd call it huge pages if that's the problem you're trying to 
>>>>>>>>>>> address. Any jumbo packet is going to cross a 4K boundary if it 
>>>>>>>>>>> isn't segmented. I assume that isn't a problem?


>>>>>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>>>>>> Yes, I'm referring to all page sizes >= 2MB, so the same operation 
>>>>>>>>>>>> is also done with 1GB pages. I was struggling to figure out a good 
>>>>>>>>>>>> name for this define, so all ideas are welcome.


>>>>>>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>>>>>>> Currently this is required for the dpdk pmd drivers only, but 
>>>>>>>>>>>>> if/when we are adding support for more drivers this issue is 
>>>>>>>>>>>>> likely to re-emerge. IMHO the applications shouldn't have to know 
>>>>>>>>>>>>> about this, so I wouldn't add a new parameter.


>>>>>>>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>>>>>>>> Also the extra buffers can cross page boundaries.


>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>> Why the `2 *` factor here? The number of block size "page" 
>>>>>>>>>>>>>>> crossings is going to be limited to the rounded up number of 
>>>>>>>>>>>>>>> pages:
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>> <--------------------------> "n" pages in size
>>>>>>>>>>>>>>> ---+--------+--- ... ---+---- There can be at most n crossings,
>>>>>>>>>>>>>>>                               (n - 1) if block happily starts 
>>>>>>>>>>>>>>> on a page boundary.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> ```


>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>> Shouldn't this processing be an `odp_pool_param_t` option? 
>>>>>>>>>>>>>>>> Doing this unconditionally because "some NICs" may have 
>>>>>>>>>>>>>>>> problems seems unnecessary.


>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>> This is somewhat confusing terminology. Pages are typically 
>>>>>>>>>>>>>>>>> 4K in size. It seems you're referring to huge pages here. How 
>>>>>>>>>>>>>>>>> about systems that configured 1GB huge pages?


https://github.com/Linaro/odp/pull/223#discussion_r143715724
updated_at 2017-10-10 12:46:42

Reply via email to