From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id C6D6154AE for ; Thu, 1 Nov 2018 11:38:50 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Nov 2018 03:38:49 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,451,1534834800"; d="scan'208";a="246158520" Received: from aburakov-mobl1.ger.corp.intel.com (HELO [10.237.220.72]) ([10.237.220.72]) by orsmga004.jf.intel.com with ESMTP; 01 Nov 2018 03:38:48 -0700 To: Alejandro Lucero , dev@dpdk.org References: <20181031172931.11894-1-alejandro.lucero@netronome.com> <20181031172931.11894-7-alejandro.lucero@netronome.com> From: "Burakov, Anatoly" Message-ID: Date: Thu, 1 Nov 2018 10:38:48 +0000 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: <20181031172931.11894-7-alejandro.lucero@netronome.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Subject: Re: [dpdk-dev] [PATCH 6/7] mem: add safe and unsafe versions for checking DMA mask 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, 01 Nov 2018 10:38:51 -0000 On 31-Oct-18 5:29 PM, Alejandro Lucero wrote: > During memory initialization calling rte_mem_check_dma_mask > leads to a deadlock because memory_hotplug_lock is locked by a > writer, the current code in execution, and rte_memseg_walk > tries to lock as a reader. > > This patch adds safe and unsafe versions for invoking the final > function specifying if the memory_hotplug_lock needs to be > acquired, this is for the safe version, or not, the unsafe one. > PMDs should use the safe version and just internal EAL memory > code should use the unsafe one. > > Fixes: 223b7f1d5ef6 ("mem: add function for checking memseg IOVA") > > Signed-off-by: Alejandro Lucero > --- I don't think _safe and _unsafe are good names. _unsafe implies something might blow up, which isn't the case :) I think following the naming convention established by other functions (rte_mem_check_dma_mask and rte_mem_check_dma_mask_thread_unsafe) is better. User/driver code is only supposed to use rte_mem_check_dma_mask safe version anyway, so there's no need to differentiate between the two if the other one is never supposed to be used. > drivers/net/nfp/nfp_net.c | 2 +- > lib/librte_eal/common/eal_common_memory.c | 24 +++++++++++++++--- > lib/librte_eal/common/include/rte_memory.h | 29 +++++++++++++++++++--- > lib/librte_eal/common/malloc_heap.c | 2 +- > lib/librte_eal/rte_eal_version.map | 3 ++- > 5 files changed, 51 insertions(+), 9 deletions(-) > <...> > -/* check memsegs iovas are within a range based on dma mask */ > -int __rte_experimental rte_mem_check_dma_mask(uint8_t maskbits); > +/** > + * * @warning Here and in other places - same issue with extra star. > + * @b EXPERIMENTAL: this API may change without prior notice > + * > + * Check memsegs iovas are within a range based on dma mask. The comments make it seem like the parameter is an actual DMA mask, rather than DMA mask *width*. In fact, you seem to have tripped yourself up on that already :) Suggested rewording: Check if all currently allocated memory segments are compliant with supplied DMA address width. > + * > + * @param maskbits > + * Address width to check against. > + */ > +int __rte_experimental rte_mem_check_dma_mask_safe(uint8_t maskbits); > + > +/** > + * * @warning > + * @b EXPERIMENTAL: this API may change without prior notice > + * > + * Check memsegs iovas are within a range based on dma mask without acquiring > + * memory_hotplug_lock first. > + * > + * This function is just for EAL core memory internal use. Drivers should > + * use the previous safe one. This is IMO too detailed. Suggested rewording: Check if all currently allocated memory segments are compliant with supplied DMA address width. @warning This function is not thread-safe and is for internal use only. > + * > + * @param maskbits > + * Address width to check against. > + */ > +int __rte_experimental rte_mem_check_dma_mask_unsafe(uint8_t maskbits); > > /** > * * @warning > * @b EXPERIMENTAL: this API may change without prior notice > * > * Set dma mask to use once memory initialization is done. > - * Previous function rte_mem_check_dma_mask can not be used > + * Previous functions rte_mem_check_dma_mask_safe/unsafe can not be used > * safely until memory has been initialized. > */ > void __rte_experimental rte_mem_set_dma_mask(uint8_t maskbits); > diff --git a/lib/librte_eal/common/malloc_heap.c b/lib/librte_eal/common/malloc_heap.c > index 711622f19..dd8b983e7 100644 > --- a/lib/librte_eal/common/malloc_heap.c > +++ b/lib/librte_eal/common/malloc_heap.c > @@ -335,7 +335,7 @@ alloc_pages_on_heap(struct malloc_heap *heap, uint64_t pg_sz, size_t elt_size, > * executed. For 2) implies the new memory can not be added. > */ > if (mcfg->dma_maskbits) { > - if (rte_mem_check_dma_mask(mcfg->dma_maskbits)) { > + if (rte_mem_check_dma_mask_unsafe(mcfg->dma_maskbits)) { > /* Currently this can only happen if IOMMU is enabled > * with RTE_ARCH_X86. It is not safe to use this memory > * so returning an error here. > diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map > index ae24b5c73..f863903b6 100644 > --- a/lib/librte_eal/rte_eal_version.map > +++ b/lib/librte_eal/rte_eal_version.map > @@ -296,7 +296,8 @@ EXPERIMENTAL { > rte_devargs_remove; > rte_devargs_type_count; > rte_mem_check_dma_mask; > - rte_mem_set_dma_mask; > + rte_mem_set_dma_mask_safe; > + rte_mem_set_dma_mask_unsafe; Again, alphabet :) > rte_eal_cleanup; > rte_fbarray_attach; > rte_fbarray_destroy; > -- Thanks, Anatoly