From patchwork Sat Dec 3 02:14:11 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniele Di Proietto X-Patchwork-Id: 702225 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tVvtJ1D0Sz9t0m for ; Sat, 3 Dec 2016 13:22:16 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 90BD1BEA; Sat, 3 Dec 2016 02:15:00 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 2A3D2B93 for ; Sat, 3 Dec 2016 02:14:52 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from EX13-EDG-OU-002.vmware.com (ex13-edg-ou-002.vmware.com [208.91.0.190]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id C1723141 for ; Sat, 3 Dec 2016 02:14:51 +0000 (UTC) Received: from sc9-mailhost3.vmware.com (10.113.161.73) by EX13-EDG-OU-002.vmware.com (10.113.208.156) with Microsoft SMTP Server id 15.0.1156.6; Fri, 2 Dec 2016 18:14:03 -0800 Received: from sc9-mailhost1.vmware.com (htb-1n-eng-dhcp161.eng.vmware.com [10.33.74.161]) by sc9-mailhost3.vmware.com (Postfix) with ESMTP id CD5C54061E; Fri, 2 Dec 2016 18:14:42 -0800 (PST) From: Daniele Di Proietto To: Date: Fri, 2 Dec 2016 18:14:11 -0800 Message-ID: <20161203021418.103114-13-diproiettod@vmware.com> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20161203021418.103114-1-diproiettod@vmware.com> References: <20161203021418.103114-1-diproiettod@vmware.com> MIME-Version: 1.0 Received-SPF: None (EX13-EDG-OU-002.vmware.com: diproiettod@vmware.com does not designate permitted sender hosts) X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Ilya Maximets , Daniele Di Proietto Subject: [ovs-dev] [PATCH v2 12/19] ovs-numa: New ovs_numa_dump_contains_core() function. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org It will be used by a future commit. struct ovs_numa_dump now uses an hmap instead of a list to make ovs_numa_dump_contains_core() more efficient. Signed-off-by: Daniele Di Proietto --- lib/ovs-numa.c | 26 +++++++++++++++++++++++--- lib/ovs-numa.h | 10 ++++++---- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/lib/ovs-numa.c b/lib/ovs-numa.c index e1e7068..ff041be 100644 --- a/lib/ovs-numa.c +++ b/lib/ovs-numa.c @@ -494,7 +494,7 @@ ovs_numa_dump_cores_on_numa(int numa_id) struct ovs_numa_dump *dump = xmalloc(sizeof *dump); struct numa_node *numa = get_numa_by_numa_id(numa_id); - ovs_list_init(&dump->dump); + hmap_init(&dump->dump); if (numa) { struct cpu_core *core; @@ -504,13 +504,31 @@ ovs_numa_dump_cores_on_numa(int numa_id) info->numa_id = numa->numa_id; info->core_id = core->core_id; - ovs_list_insert(&dump->dump, &info->list_node); + hmap_insert(&dump->dump, &info->hmap_node, + hash_2words(info->numa_id, info->core_id)); } } return dump; } + +bool +ovs_numa_dump_contains_core(const struct ovs_numa_dump *dump, + int numa_id, unsigned core_id) +{ + struct ovs_numa_info *core; + + HMAP_FOR_EACH_WITH_HASH(core, hmap_node, hash_2words(numa_id, core_id), + &dump->dump) { + if (core->core_id == core_id && core->numa_id == numa_id) { + return true; + } + } + + return false; +} + void ovs_numa_dump_destroy(struct ovs_numa_dump *dump) { @@ -520,10 +538,12 @@ ovs_numa_dump_destroy(struct ovs_numa_dump *dump) return; } - LIST_FOR_EACH_POP (iter, list_node, &dump->dump) { + HMAP_FOR_EACH_POP (iter, hmap_node, &dump->dump) { free(iter); } + hmap_destroy(&dump->dump); + free(dump); } diff --git a/lib/ovs-numa.h b/lib/ovs-numa.h index be836b2..c0eae07 100644 --- a/lib/ovs-numa.h +++ b/lib/ovs-numa.h @@ -21,19 +21,19 @@ #include #include "compiler.h" -#include "openvswitch/list.h" +#include "openvswitch/hmap.h" #define OVS_CORE_UNSPEC INT_MAX #define OVS_NUMA_UNSPEC INT_MAX /* Dump of a list of 'struct ovs_numa_info'. */ struct ovs_numa_dump { - struct ovs_list dump; + struct hmap dump; }; /* A numa_id - core_id pair. */ struct ovs_numa_info { - struct ovs_list list_node; + struct hmap_node hmap_node; int numa_id; unsigned core_id; }; @@ -54,10 +54,12 @@ unsigned ovs_numa_get_unpinned_core_any(void); unsigned ovs_numa_get_unpinned_core_on_numa(int numa_id); void ovs_numa_unpin_core(unsigned core_id); struct ovs_numa_dump *ovs_numa_dump_cores_on_numa(int numa_id); +bool ovs_numa_dump_contains_core(const struct ovs_numa_dump *, + int numa_id, unsigned core_id); void ovs_numa_dump_destroy(struct ovs_numa_dump *); int ovs_numa_thread_setaffinity_core(unsigned core_id); #define FOR_EACH_CORE_ON_NUMA(ITER, DUMP) \ - LIST_FOR_EACH((ITER), list_node, &(DUMP)->dump) + HMAP_FOR_EACH((ITER), hmap_node, &(DUMP)->dump) #endif /* ovs-numa.h */