Note:
a) the memarea is oriented towards the application layer, which could
provides 'region-based memory management' [1] function.
 
Judging from the API, this library would rather provide
an interface to a generic allocator over a fixed memory extent,
because it offers freeing of specific elements, and thus must track them.
So it's more than RBMM. Is this intended?
It's a very interesting RFC anyway, just trying to understand the scope.

b) the eal library also provide memory zone/heap management, but these
are tied to huge pages management.
[...]
+ * The memarea is a collection of allocated objects that can be efficiently
+ * alloc or free all at once, the main feature are as follows:
+ *   a) it facilitate alloc and free of memory with low overhead.
+ *   [...]
+ *   c) it supports MT-safe as long as it's specified at creation time.

These two bullets seem to add the most value compared to DPDK heap API.
DPDK heap overhead is at least 64 bytes per allocation (sizeof malloc_elem),
so I assume memarea aims at a large number of small elements.
 
+struct rte_memarea_param {
+       char name[RTE_MEMAREA_NAMESIZE]; /**< Name of memarea */
+       enum rte_memarea_source source;  /**< Memory source of memarea */
+       uint64_t size;                   /**< Size (byte) of memarea */

Is it an upper limit or a guaranteed size?
It probably depends on the source: guaranteed for USER_ADDR,
upper limit for SYSAPI (or it would be no different from USER_ADDR),
not sure about USER_MEMAREA.

Do you envision memarea as always limited?
Generic allocators usually have means of adding extents,
even if this one doesn't currently.

Nit: size is uint64_t here but uint32_t in rte_memarea_allloc().
Should be size_t in both places.
 
+       uint32_t align;                  /**< Align of allocated object */
+       /** Indicates whether the memarea should be MT-safe */
+       bool mt_safe;
+       /** Indicates whether the memarea is visible to multiple process.
+        * If the memory source is RTE_MEMAREA_SOURCE_USER_ADDR, this filed
+        * depends on user settings and must be set.
+        * If the memory source is RTE_MEMAREA_SOURCE_SYSAPI or
+        * RTE_MEMAREA_SOURCE_USER_MEMAREA, this filed does not need to be set.
+        */
+       bool mp_visible;
+       /** User provided address, this field is valid only when source
+        * is set to RTE_MEMAREA_SOURCE_USER_ADDR.
+        */
+       void *user_addr;
+       /** User provided memarea, this field is valid only when source
+        * is set to RTE_MEMAREA_SOURCE_MEMAREA.
+        */
+       struct rte_memarea *user_memarea;

Jerin already suggested a union here.
I'll add another reason to do so: if in the future there will be new memarea types
that require new options, one pointer-sized field can be used to pass anything
without breaking the ABI once this structure becomes stable.
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Update memory's refcnt.
+ *
+ * Update one memory region's refcnt.
+ *
+ * @param ma
+ *   The pointer of memarea.
+ * @param ptr
+ *   The pointer of memory region which need be updated refcnt.
+ * @param value
+ *   The value which need be updated.
+ *   Note: it could be negative.
+ *
+ * @return
+ *   0 on success. Otherwise negative value is returned.
+ */
+__rte_experimental
+int rte_memarea_refcnt_update(struct rte_memarea *ma, void *ptr, int16_t value);

If this function only updates the refcnt, an API to inspect the refcnt is missing.
Furthermore, in this case refcnt is just a value attached to every object,
what is the benefit compared to simply storing it in the object?

If this function also frees "ptr" when refcnt reaches zero,
missing is a way for the user to know that it did.
What happens if refcnt > 1 on rte_memarea_free()?

I don't think refcnt belongs to this library.
A principal objection: memarea is for freeing all objects at once,
refcnt is for releasing objects one-by-one when they're not used.
Technical issues I foresee: refcnt can be atomic (and require alignment) or not,
16 bits may be too few (rte_flow_action_handle ref'd by thousands of rte_flow).
Refcnt could be optional per memarea, but it seems like another complication.