From patchwork Wed Jun 3 14:11:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 11585723 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id EE435618 for ; Wed, 3 Jun 2020 14:13:15 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id AE13B20738 for ; Wed, 3 Jun 2020 14:13:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=amazon.com header.i=@amazon.com header.b="SDzcABIn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AE13B20738 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=amazon.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id D47BE8E0009; Wed, 3 Jun 2020 10:13:14 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id CD1DD8E0006; Wed, 3 Jun 2020 10:13:14 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B995D8E0009; Wed, 3 Jun 2020 10:13:14 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0066.hostedemail.com [216.40.44.66]) by kanga.kvack.org (Postfix) with ESMTP id 9E82F8E0006 for ; Wed, 3 Jun 2020 10:13:14 -0400 (EDT) Received: from smtpin30.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 5590E31ECC for ; Wed, 3 Jun 2020 14:13:14 +0000 (UTC) X-FDA: 76888092708.30.alley47_5664bc0ca951a Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin30.hostedemail.com (Postfix) with ESMTP id 32FDE1801F1C9 for ; Wed, 3 Jun 2020 14:13:14 +0000 (UTC) X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,prvs=416e8e2f5=sjpark@amazon.com,,RULES_HIT:30003:30012:30054:30064:30070,0,RBL:72.21.196.25:@amazon.com:.lbl8.mailshell.net-62.18.0.100 66.10.201.10,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fp,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:32,LUA_SUMMARY:none X-HE-Tag: alley47_5664bc0ca951a X-Filterd-Recvd-Size: 12430 Received: from smtp-fw-2101.amazon.com (smtp-fw-2101.amazon.com [72.21.196.25]) by imf18.hostedemail.com (Postfix) with ESMTP for ; Wed, 3 Jun 2020 14:13:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.com; i=@amazon.com; q=dns/txt; s=amazon201209; t=1591193594; x=1622729594; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=RSeCraCWvQ2SO2B882JJ9QFVdUoepG0Yn3yCcaEeubE=; b=SDzcABInoP5yGDG1J9ZUfOmKkiMkC4KqMsw1hXaQG5VBImXUt75zuxFj boOKK9s2eUXu/xfK+vu0kh/WH5PQn1I9gIZ5WPH/Wptrw4QjYsXpMkHaj VXRRdEWHueub5eWqt+jrWCnj/GfIDhsIw1eWg6/2kmfhD+Hq21AwrtC3S c=; IronPort-SDR: lbCK1x6wFLNRjmzwSvqq5e+tt5rawN8U5ina3oNFDCOa80uKD5HnO/IEUkkG4ueE+oQ2VNQ7j0 UoSoZmc49sAQ== X-IronPort-AV: E=Sophos;i="5.73,467,1583193600"; d="scan'208";a="34278974" Received: from iad12-co-svc-p1-lb1-vlan2.amazon.com (HELO email-inbound-relay-2b-55156cd4.us-west-2.amazon.com) ([10.43.8.2]) by smtp-border-fw-out-2101.iad2.amazon.com with ESMTP; 03 Jun 2020 14:12:58 +0000 Received: from EX13MTAUEA002.ant.amazon.com (pdx4-ws-svc-p6-lb7-vlan2.pdx.amazon.com [10.170.41.162]) by email-inbound-relay-2b-55156cd4.us-west-2.amazon.com (Postfix) with ESMTPS id 0ECCAA2370; Wed, 3 Jun 2020 14:12:56 +0000 (UTC) Received: from EX13D31EUA001.ant.amazon.com (10.43.165.15) by EX13MTAUEA002.ant.amazon.com (10.43.61.77) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 3 Jun 2020 14:12:55 +0000 Received: from u886c93fd17d25d.ant.amazon.com (10.43.160.90) by EX13D31EUA001.ant.amazon.com (10.43.165.15) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 3 Jun 2020 14:12:39 +0000 From: SeongJae Park To: CC: SeongJae Park , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [RFC v2 2/9] mm/damon: Clean up code using 'struct damon_addr_range' Date: Wed, 3 Jun 2020 16:11:28 +0200 Message-ID: <20200603141135.10575-3-sjpark@amazon.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200603141135.10575-1-sjpark@amazon.com> References: <20200603141135.10575-1-sjpark@amazon.com> MIME-Version: 1.0 X-Originating-IP: [10.43.160.90] X-ClientProxiedBy: EX13D45UWB002.ant.amazon.com (10.43.161.78) To EX13D31EUA001.ant.amazon.com (10.43.165.15) X-Rspamd-Queue-Id: 32FDE1801F1C9 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam01 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: From: SeongJae Park There are unnecessarily duplicated code in DAMON, that can be eliminated by using the new struct, 'damon_addr_range'. This commit cleans up the DAMON code in the way. Signed-off-by: SeongJae Park --- mm/damon-test.h | 36 ++++++++++++++++++------------------ mm/damon.c | 46 ++++++++++++++++++++-------------------------- 2 files changed, 38 insertions(+), 44 deletions(-) diff --git a/mm/damon-test.h b/mm/damon-test.h index 9dd2061502cb..6d01f0e782d5 100644 --- a/mm/damon-test.h +++ b/mm/damon-test.h @@ -177,7 +177,7 @@ static void damon_test_set_recording(struct kunit *test) */ static void damon_test_three_regions_in_vmas(struct kunit *test) { - struct region regions[3] = {0,}; + struct damon_addr_range regions[3] = {0,}; /* 10-20-25, 200-210-220, 300-305, 307-330 */ struct vm_area_struct vmas[] = { (struct vm_area_struct) {.vm_start = 10, .vm_end = 20}, @@ -331,7 +331,7 @@ static struct damon_region *__nth_region_of(struct damon_task *t, int idx) */ static void damon_do_test_apply_three_regions(struct kunit *test, unsigned long *regions, int nr_regions, - struct region *three_regions, + struct damon_addr_range *three_regions, unsigned long *expected, int nr_expected) { struct damon_task *t; @@ -369,10 +369,10 @@ static void damon_test_apply_three_regions1(struct kunit *test) unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59, 70, 80, 80, 90, 90, 100}; /* 5-27, 45-55, 73-104 */ - struct region new_three_regions[3] = { - (struct region){.start = 5, .end = 27}, - (struct region){.start = 45, .end = 55}, - (struct region){.start = 73, .end = 104} }; + struct damon_addr_range new_three_regions[3] = { + (struct damon_addr_range){.start = 5, .end = 27}, + (struct damon_addr_range){.start = 45, .end = 55}, + (struct damon_addr_range){.start = 73, .end = 104} }; /* 5-20-27, 45-55, 73-80-90-104 */ unsigned long expected[] = {5, 20, 20, 27, 45, 55, 73, 80, 80, 90, 90, 104}; @@ -391,10 +391,10 @@ static void damon_test_apply_three_regions2(struct kunit *test) unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59, 70, 80, 80, 90, 90, 100}; /* 5-27, 56-57, 65-104 */ - struct region new_three_regions[3] = { - (struct region){.start = 5, .end = 27}, - (struct region){.start = 56, .end = 57}, - (struct region){.start = 65, .end = 104} }; + struct damon_addr_range new_three_regions[3] = { + (struct damon_addr_range){.start = 5, .end = 27}, + (struct damon_addr_range){.start = 56, .end = 57}, + (struct damon_addr_range){.start = 65, .end = 104} }; /* 5-20-27, 56-57, 65-80-90-104 */ unsigned long expected[] = {5, 20, 20, 27, 56, 57, 65, 80, 80, 90, 90, 104}; @@ -415,10 +415,10 @@ static void damon_test_apply_three_regions3(struct kunit *test) unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59, 70, 80, 80, 90, 90, 100}; /* 5-27, 61-63, 65-104 */ - struct region new_three_regions[3] = { - (struct region){.start = 5, .end = 27}, - (struct region){.start = 61, .end = 63}, - (struct region){.start = 65, .end = 104} }; + struct damon_addr_range new_three_regions[3] = { + (struct damon_addr_range){.start = 5, .end = 27}, + (struct damon_addr_range){.start = 61, .end = 63}, + (struct damon_addr_range){.start = 65, .end = 104} }; /* 5-20-27, 61-63, 65-80-90-104 */ unsigned long expected[] = {5, 20, 20, 27, 61, 63, 65, 80, 80, 90, 90, 104}; @@ -440,10 +440,10 @@ static void damon_test_apply_three_regions4(struct kunit *test) unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59, 70, 80, 80, 90, 90, 100}; /* 5-7, 30-32, 65-68 */ - struct region new_three_regions[3] = { - (struct region){.start = 5, .end = 7}, - (struct region){.start = 30, .end = 32}, - (struct region){.start = 65, .end = 68} }; + struct damon_addr_range new_three_regions[3] = { + (struct damon_addr_range){.start = 5, .end = 7}, + (struct damon_addr_range){.start = 30, .end = 32}, + (struct damon_addr_range){.start = 65, .end = 68} }; /* expect 5-7, 30-32, 65-68 */ unsigned long expected[] = {5, 7, 30, 32, 65, 68}; diff --git a/mm/damon.c b/mm/damon.c index a9676b804b0b..f6dd34425185 100644 --- a/mm/damon.c +++ b/mm/damon.c @@ -301,19 +301,15 @@ static int damon_split_region_evenly(struct damon_ctx *ctx, return 0; } -struct region { - unsigned long start; - unsigned long end; -}; - -static unsigned long sz_region(struct region *r) +static unsigned long sz_range(struct damon_addr_range *r) { return r->end - r->start; } -static void swap_regions(struct region *r1, struct region *r2) +static void swap_ranges(struct damon_addr_range *r1, + struct damon_addr_range *r2) { - struct region tmp; + struct damon_addr_range tmp; tmp = *r1; *r1 = *r2; @@ -324,7 +320,7 @@ static void swap_regions(struct region *r1, struct region *r2) * Find three regions separated by two biggest unmapped regions * * vma the head vma of the target address space - * regions an array of three 'struct region's that results will be saved + * regions an array of three address ranges that results will be saved * * This function receives an address space and finds three regions in it which * separated by the two biggest unmapped regions in the space. Please refer to @@ -334,9 +330,9 @@ static void swap_regions(struct region *r1, struct region *r2) * Returns 0 if success, or negative error code otherwise. */ static int damon_three_regions_in_vmas(struct vm_area_struct *vma, - struct region regions[3]) + struct damon_addr_range regions[3]) { - struct region gap = {0}, first_gap = {0}, second_gap = {0}; + struct damon_addr_range gap = {0}, first_gap = {0}, second_gap = {0}; struct vm_area_struct *last_vma = NULL; unsigned long start = 0; @@ -349,20 +345,20 @@ static int damon_three_regions_in_vmas(struct vm_area_struct *vma, } gap.start = last_vma->vm_end; gap.end = vma->vm_start; - if (sz_region(&gap) > sz_region(&second_gap)) { - swap_regions(&gap, &second_gap); - if (sz_region(&second_gap) > sz_region(&first_gap)) - swap_regions(&second_gap, &first_gap); + if (sz_range(&gap) > sz_range(&second_gap)) { + swap_ranges(&gap, &second_gap); + if (sz_range(&second_gap) > sz_range(&first_gap)) + swap_ranges(&second_gap, &first_gap); } last_vma = vma; } - if (!sz_region(&second_gap) || !sz_region(&first_gap)) + if (!sz_range(&second_gap) || !sz_range(&first_gap)) return -EINVAL; /* Sort the two biggest gaps by address */ if (first_gap.start > second_gap.start) - swap_regions(&first_gap, &second_gap); + swap_ranges(&first_gap, &second_gap); /* Store the result */ regions[0].start = ALIGN(start, MIN_REGION); @@ -381,7 +377,7 @@ static int damon_three_regions_in_vmas(struct vm_area_struct *vma, * Returns 0 on success, negative error code otherwise. */ static int damon_three_regions_of(struct damon_task *t, - struct region regions[3]) + struct damon_addr_range regions[3]) { struct mm_struct *mm; int rc; @@ -443,7 +439,7 @@ static int damon_three_regions_of(struct damon_task *t, static void damon_init_regions_of(struct damon_ctx *c, struct damon_task *t) { struct damon_region *r, *m = NULL; - struct region regions[3]; + struct damon_addr_range regions[3]; int i; if (damon_three_regions_of(t, regions)) { @@ -977,13 +973,11 @@ static bool kdamond_need_update_regions(struct damon_ctx *ctx) } /* - * Check whether regions are intersecting - * - * Note that this function checks 'struct damon_region' and 'struct region'. + * Check whether a region is intersecting an address range * * Returns true if it is. */ -static bool damon_intersect(struct damon_region *r, struct region *re) +static bool damon_intersect(struct damon_region *r, struct damon_addr_range *re) { return !(r->ar.end <= re->start || re->end <= r->ar.start); } @@ -995,7 +989,7 @@ static bool damon_intersect(struct damon_region *r, struct region *re) * bregions the three big regions of the task */ static void damon_apply_three_regions(struct damon_ctx *ctx, - struct damon_task *t, struct region bregions[3]) + struct damon_task *t, struct damon_addr_range bregions[3]) { struct damon_region *r, *next; unsigned int i = 0; @@ -1014,7 +1008,7 @@ static void damon_apply_three_regions(struct damon_ctx *ctx, for (i = 0; i < 3; i++) { struct damon_region *first = NULL, *last; struct damon_region *newr; - struct region *br; + struct damon_addr_range *br; br = &bregions[i]; /* Get the first and last regions which intersects with br */ @@ -1047,7 +1041,7 @@ static void damon_apply_three_regions(struct damon_ctx *ctx, */ static void kdamond_update_regions(struct damon_ctx *ctx) { - struct region three_regions[3]; + struct damon_addr_range three_regions[3]; struct damon_task *t; damon_for_each_task(t, ctx) {