From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id A002A5F38 for ; Thu, 27 Sep 2018 16:04:55 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Sep 2018 07:04:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,310,1534834800"; d="scan'208";a="95372102" Received: from aburakov-mobl1.ger.corp.intel.com (HELO [10.237.220.55]) ([10.237.220.55]) by orsmga002.jf.intel.com with ESMTP; 27 Sep 2018 07:04:45 -0700 To: Alejandro Lucero Cc: dev , "Mcnamara, John" , marko.kovacevic@intel.com, laszlo.madarassy@ericsson.com, laszlo.vadkerti@ericsson.com, andras.kovacs@ericsson.com, winnie.tian@ericsson.com, daniel.andrasi@ericsson.com, janos.kobor@ericsson.com, geza.koblo@ericsson.com, srinath.mannam@broadcom.com, scott.branden@broadcom.com, Ajit Khaparde , "Wiles, Keith" , Bruce Richardson , Thomas Monjalon , Shreyansh Jain , Shahaf Shuler , Andrew Rybchenko References: <0b8c2280-f627-87b2-0768-0a4b26b69186@intel.com> From: "Burakov, Anatoly" Message-ID: Date: Thu, 27 Sep 2018 15:04:44 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Subject: Re: [dpdk-dev] [PATCH v6 04/21] mem: do not check for invalid socket ID X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 27 Sep 2018 14:04:56 -0000 On 27-Sep-18 2:42 PM, Alejandro Lucero wrote: > > > On Thu, Sep 27, 2018 at 2:22 PM Burakov, Anatoly > > wrote: > > On 27-Sep-18 2:14 PM, Alejandro Lucero wrote: > > On Thu, Sep 27, 2018 at 11:41 AM Anatoly Burakov > > > > wrote: > > > >> We will be assigning "invalid" socket ID's to external heap, and > >> malloc will now be able to verify if a supplied socket ID is in > >> fact a valid one, rendering parameter checks for sockets > >> obsolete. > >> > >> This changes the semantics of what we understand by "socket ID", > >> so document the change in the release notes. > >> > >> Signed-off-by: Anatoly Burakov > > >> --- > >>   doc/guides/rel_notes/release_18_11.rst     | 7 +++++++ > >>   lib/librte_eal/common/eal_common_memzone.c | 8 +++++--- > >>   lib/librte_eal/common/malloc_heap.c        | 2 +- > >>   lib/librte_eal/common/rte_malloc.c         | 4 ---- > >>   4 files changed, 13 insertions(+), 8 deletions(-) > >> > >> diff --git a/doc/guides/rel_notes/release_18_11.rst > >> b/doc/guides/rel_notes/release_18_11.rst > >> index 5fc71e208..6ee236302 100644 > >> --- a/doc/guides/rel_notes/release_18_11.rst > >> +++ b/doc/guides/rel_notes/release_18_11.rst > >> @@ -98,6 +98,13 @@ API Changes > >>       users of memseg-walk-related functions, as they will now > have to skip > >>       externally allocated segments in most cases if the intent > is to only > >> iterate > >>       over internal DPDK memory. > >> +  - ``socket_id`` parameter across the entire DPDK has gained > additional > >> +    meaning, as some socket ID's will now be representing > externally > >> allocated > >> +    memory. No changes will be required for existing code as > backwards > >> +    compatibility will be kept, and those who do not use this > feature > >> will not > >> +    see these extra socket ID's. Any new API's must not check > socket ID > >> +    parameters themselves, and must instead leave it to the memory > >> subsystem to > >> +    decide whether socket ID is a valid one. > >> > >>   ABI Changes > >>   ----------- > >> diff --git a/lib/librte_eal/common/eal_common_memzone.c > >> b/lib/librte_eal/common/eal_common_memzone.c > >> index 7300fe05d..b7081afbf 100644 > >> --- a/lib/librte_eal/common/eal_common_memzone.c > >> +++ b/lib/librte_eal/common/eal_common_memzone.c > >> @@ -120,13 +120,15 @@ > memzone_reserve_aligned_thread_unsafe(const char > >> *name, size_t len, > >>                  return NULL; > >>          } > >> > >> -       if ((socket_id != SOCKET_ID_ANY) && > >> -           (socket_id >= RTE_MAX_NUMA_NODES || socket_id < 0)) { > >> +       if ((socket_id != SOCKET_ID_ANY) && socket_id < 0) { > >> > > > > Should not it be better to use RTE_MAX_HEAP instead of removing > the check? > > First of all, maximum number of heaps should not concern the rest of > the > code - this is purely internal detail of rte_malloc. > > > In a previous patch you say that: > > "Switch over all parts of EAL to use heap ID instead of NUMA node > ID to identify heaps. Heap ID for DPDK-internal heaps is NUMA > node's index within the detected NUMA node list. Heap ID for > external heaps will be order of their creation." > > If I understand this right, heaps linked to physical sockets get a heap > ID, and then external heaps will get IDs starting from the higher > socket/heap ID + 1. Yes and no. Socket ID is an externally visible identification of "where to allocate from" (a heap). Heap ID is used internally. Normally, there is a 1:1 correspondence of NUMA node to heap ID, but there may be cases where e.g. only NUMA nodes 0 and 7 are detected, so you'll have socket 0 and 7 as valid socket ID's. However, these socket ID's will be internally resolved into heap ID's 0 and 1, not 0 and 7. So, in *most* cases, socket ID for an internal heap is equivalent to its heap ID, but it is by accident. Heap ID is an internal identifier used by the malloc heap, and it is not visible externally - it is only known to malloc itself. Even memzone knows nothing about heap ID's - only socket ID's. > So, assuming RTE_MAX_HEAPS is really the maximum number of allowed heaps > (which does not seem so reading your next paragraph), it would be a good > sanity check to use RTE_MAX_HEAPS for the socket id. > > More importantly, socket ID is completely independent from number of > heaps. Socket ID is incremented each time a new heap is created, and > they are not reused. If you create and destroy a heap 100 times - > you'll > get 100 different socket ID's, even though max number of heaps is less > than that. > > > I do not understand this. It is true there is no check regarding > RTE_MAX_HEAPS when creating new heaps, There is one :) RTE_MAX_HEAPS is length of malloc heaps array (shared in memory). If we cannot find a vacant spot in heaps array, the heap will not be created. However, *socket ID* is indeed limited only to INT_MAX. Socket ID is not heap ID - socket ID is an externally visible identifier. Multiple socket ID's can resolve to the same heap ID. For example, if you create and destroy a heap 5 times one after the other, you'll get 5 different socket ID's, but all of them would have pointed to the same heap ID (but not at the same time). So, semantically speaking, heap ID isn't really "an ID" as such, it's an index into heap array. Unlike socket ID, it has no meaning. > then nor sure what the limit > refers to. And then there is code like dumping heaps info or getting > info from the heap based on socket id that will not work. It is probably unclear because the ordering of this patchset is not ideal (and i'm not sure how to make it any better). The code for dumping or getting heap info's accepts socket ID, but it translates it into heap ID, because that's what malloc uses internally to differentiate between the heaps. Heap ID is there to break dependency between NUMA node ID and position in the malloc heap array. -- Thanks, Anatoly