<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-IN" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Hi Dmitry<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">My answer for your reply<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal">You unmap memory, but you do not maintain DPDK memory management structures,<br>
that is, DPDK does not know that this page is no longer usable.<br>
Probably this is the reason for the crash.<br>
You could print regions you're unmapping and the segfault address to confirm.<o:p></o:p></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">[Uma] :  Yes we are unmapping the entire range hoping all are free inside DPDK and DPDK heaps never use these pages.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Suppose we have 400 pages total free_hp, we want only 252 pages , so we reduce nr_pages to 252.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">So we assume 253 to 400 inside DPDK are free as we nr_pages are made by my application as 252.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">ms_idx = rte_fbarray_find_next_n_free(arr, 0, 2); -> 253 comes<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">ms_check_idx = rte_fbarray_find_next_n_free(arr, 0, RTE_PTR_DIFF(RTE_PTR_ADD(msl->base_va, msl->len), addr)/msl->page_sz); -> 253 comes (should be same as above)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">ms_next_idx =  rte_fbarray_find_next_used(arr, ms_idx); -> This comes -1 as NO USED page is there (<0)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Hence we call unmap like -> munmap(addr, RTE_PTR_DIFF(RTE_PTR_ADD(msl->base_va, msl->len), addr));<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="mso-fareast-language:EN-US">Please let us know how to check in DPDK free heaps or FBARRAY that these pages we are freeing are really safe ? (253 to 400 unwanted pages by our application, other than above 3 checks)<o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="mso-fareast-language:EN-US">If it’s not safe to free, how to inform DPDK to free those pages in FBARRAY and also clean up its heap list so that it never crashes !!<o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">We are suspecting this code below  hits NULL crash or invalid address reference for us<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">static struct malloc_elem *<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">find_suitable_element(struct malloc_heap *heap, size_t size,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                unsigned int flags, size_t align, size_t bound, bool contig)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">        size_t idx;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">        struct malloc_elem *elem, *alt_elem = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="mso-fareast-language:EN-US">        for (idx = malloc_elem_free_list_index(size);<o:p></o:p></span></b></p>
<p class="MsoNormal"><b><span style="mso-fareast-language:EN-US">                        idx < RTE_HEAP_NUM_FREELISTS; idx++) {<o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                <b>
for (elem = LIST_FIRST(&heap->free_head[idx]);   -> We are suspecting elem is invalid address and hence crashed !!!!<o:p></o:p></b></span></p>
<p class="MsoNormal"><b><span style="mso-fareast-language:EN-US">                                !!elem; elem = LIST_NEXT(elem, free_list)) {<o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                        if (malloc_elem_can_hold(elem, size, align, bound,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">                                        contig)) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Thanks<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Umakiran<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">Dmitry Kozlyuk <dmitry.kozliuk@gmail.com><br>
<b>Date: </b>Thursday, 22 September 2022 at 2:31 PM<br>
<b>To: </b>Umakiran Godavarthi (ugodavar) <ugodavar@cisco.com><br>
<b>Cc: </b>anatoly.burakov@intel.com <anatoly.burakov@intel.com>, dev@dpdk.org <dev@dpdk.org>, stephen@networkplumber.org <stephen@networkplumber.org><br>
<b>Subject: </b>Re: DPDK 19.11.5 Legacy Memory Design Query<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal">Hi Umakiran,<br>
<br>
> From: Umakiran Godavarthi (ugodavar) <ugodavar@cisco.com><br>
> Date: Wednesday, 14 September 2022 at 1:00 PM<br>
[...]<br>
>   1.  Then we go to DPDK Memory segment list walkthrough and for each FBARRAY , we find the used pages by DPDK and unmap the remaining pages by below code (Idea is to free the huge pages taken by DPDK process virtual memory) -> Free_HP will be 0 then, as
 X pages are used by DPDK and all unnecessary pages are freed in this step)<br>
> Sample Code of 4 :<br>
> <br>
>               rte_memseg_list_walk_thread_unsafe(dpdk_find_and_free_unused, NULL); ->DPDK_FIND_AND_FREE_UNUSED is called for each Memory segment list (FBARRAY pointer is derived from MSL like below)<br>
> <br>
>               dpdk_find_and_free_unused(const struct rte_memseg_list *msl,<br>
>                                           void *arg UNUSED)<br>
>                {<br>
>                       Int ms_idx;<br>
>                        arr = (struct rte_fbarray *) &msl->memseg_arr;<br>
> <br>
>                         /*<br>
>                          * use size of 2 instead of 1 to find the next free slot but<br>
>                         * not hole.<br>
>                         */<br>
>                      ms_idx = rte_fbarray_find_next_n_free(arr, 0, 2);<br>
> <br>
>                      if (ms_idx >= 0) {<br>
>                          addr = RTE_PTR_ADD(msl->base_va, ms_idx * msl->page_sz);<br>
>                             munmap(addr, RTE_PTR_DIFF(RTE_PTR_ADD(msl->base_va, msl->len), addr));<br>
>                       }<br>
>                }<br>
<br>
You unmap memory, but you do not maintain DPDK memory management structures,<br>
that is, DPDK does not know that this page is no longer usable.<br>
Probably this is the reason for the crash.<br>
You could print regions you're unmapping and the segfault address to confirm.<o:p></o:p></p>
</div>
</div>
</body>
</html>