vhost: add APIs for datapath configuration
[dpdk.git] / lib / librte_eal / linuxapp / eal / eal_memalloc.c
index 3c608b3..1f553dd 100644 (file)
@@ -807,6 +807,13 @@ eal_memalloc_free_seg_bulk(struct rte_memseg **ms, int n_segs)
                struct free_walk_param wa;
                int i, walk_res;
 
+               /* if this page is marked as unfreeable, fail */
+               if (cur->flags & RTE_MEMSEG_FLAG_DO_NOT_FREE) {
+                       RTE_LOG(DEBUG, EAL, "Page is not allowed to be freed\n");
+                       ret = -1;
+                       continue;
+               }
+
                memset(&wa, 0, sizeof(wa));
 
                for (i = 0; i < (int)RTE_DIM(internal_config.hugepage_info);
@@ -877,6 +884,21 @@ sync_chunk(struct rte_memseg_list *primary_msl,
 
        diff_len = RTE_MIN(chunk_len, diff_len);
 
+       /* if we are freeing memory, notify the application */
+       if (!used) {
+               struct rte_memseg *ms;
+               void *start_va;
+               size_t len, page_sz;
+
+               ms = rte_fbarray_get(l_arr, start);
+               start_va = ms->addr;
+               page_sz = (size_t)primary_msl->page_sz;
+               len = page_sz * diff_len;
+
+               eal_memalloc_mem_event_notify(RTE_MEM_EVENT_FREE,
+                               start_va, len);
+       }
+
        for (i = 0; i < diff_len; i++) {
                struct rte_memseg *p_ms, *l_ms;
                int seg_idx = start + i;
@@ -902,6 +924,21 @@ sync_chunk(struct rte_memseg_list *primary_msl,
                }
        }
 
+       /* if we just allocated memory, notify the application */
+       if (used) {
+               struct rte_memseg *ms;
+               void *start_va;
+               size_t len, page_sz;
+
+               ms = rte_fbarray_get(l_arr, start);
+               start_va = ms->addr;
+               page_sz = (size_t)primary_msl->page_sz;
+               len = page_sz * diff_len;
+
+               eal_memalloc_mem_event_notify(RTE_MEM_EVENT_ALLOC,
+                               start_va, len);
+       }
+
        /* calculate how much we can advance until next chunk */
        diff_len = used ?
                        rte_fbarray_find_contig_used(l_arr, start) :