From patchwork Wed Nov 22 08:06:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "He, Hongbo" X-Patchwork-Id: 10069885 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D78EB60353 for ; Wed, 22 Nov 2017 08:06:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CA50228236 for ; Wed, 22 Nov 2017 08:06:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BDE1E294EC; Wed, 22 Nov 2017 08:06:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 8BF5628236 for ; Wed, 22 Nov 2017 08:06:50 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 280266E5EE; Wed, 22 Nov 2017 08:06:49 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org X-Greylist: delayed 8982 seconds by postgrey-1.35 at gabe; Wed, 22 Nov 2017 08:06:47 UTC Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0077.outbound.protection.outlook.com [104.47.41.77]) by gabe.freedesktop.org (Postfix) with ESMTPS id 352E66E5E0; Wed, 22 Nov 2017 08:06:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=zyOVx7ccMomZlkjQLzec7pPAlxAk35D5bZYwvNmE9rA=; b=AGy9d5k3krfw1heQPXewVltLZc9OgRGOtOPIv41pNy5GcZfVf0vcRUxDJNYuypuYGOmaUWSISOK7nrJ8PoEDfduptSHF0p20UO2xxtw/3npiTzcGccuerCAepaur+61nEQ+0XrYqCJPoBWZZEadlyHjKnZpQDEq7kKXNlNcwvlQ= Received: from SN1PR12CA0034.namprd12.prod.outlook.com (10.162.96.172) by DM5PR12MB1451.namprd12.prod.outlook.com (10.172.38.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.239.5; Wed, 22 Nov 2017 08:06:45 +0000 Received: from DM3NAM03FT023.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e49::209) by SN1PR12CA0034.outlook.office365.com (2a01:111:e400:5174::44) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.239.5 via Frontend Transport; Wed, 22 Nov 2017 08:06:45 +0000 Authentication-Results: spf=none (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; lists.freedesktop.org; dkim=none (message not signed) header.d=none;lists.freedesktop.org; dmarc=permerror action=none header.from=amd.com; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) Received: from SATLEXCHOV02.amd.com (165.204.84.17) by DM3NAM03FT023.mail.protection.outlook.com (10.152.82.205) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.20.239.4 via Frontend Transport; Wed, 22 Nov 2017 08:06:45 +0000 Received: from roger-build-server.amd.com (10.34.1.3) by SATLEXCHOV02.amd.com (10.181.40.72) with Microsoft SMTP Server id 14.3.361.1; Wed, 22 Nov 2017 02:06:42 -0600 From: Roger He To: , Subject: [PATCH 1/5] drm/ttm: add page order in page pool Date: Wed, 22 Nov 2017 16:06:33 +0800 Message-ID: <1511337997-26698-1-git-send-email-Hongbo.He@amd.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:165.204.84.17; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(39860400002)(346002)(376002)(2980300002)(428002)(189002)(199003)(86362001)(50226002)(101416001)(4326008)(189998001)(50466002)(68736007)(72206003)(478600001)(450100002)(53936002)(5003940100001)(105586002)(77096006)(106466001)(97736004)(48376002)(53416004)(54906003)(316002)(110136005)(6666003)(50986999)(16586007)(81166006)(81156014)(36756003)(8676002)(8936002)(305945005)(2906002)(47776003)(5660300001)(104016004)(356003); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR12MB1451; H:SATLEXCHOV02.amd.com; FPR:; SPF:None; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; DM3NAM03FT023; 1:XGEoqrG2xtLQWkRTDwiJFU11OI7IvJdT9lY+OynSnpomd28TPGhtloAnDyJ8eol0HcHdxsLuRzCcksZk29EfD9q4HSo4oxGxj5hJCHJZ2J5zS8eHa0oegJmlBiH8zOK/ X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5da6f643-227b-4083-3165-08d5317ff93d X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600022)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603258); SRVR:DM5PR12MB1451; X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1451; 3:DrPLLrP8l3gfLgZa0dNBt4GBOjgYCNQXqyeQh5Ld1yWYQnUOH91rCRQ9oWqbdipxOXDTzWsAvaHdAL6SiJuPYFa2/Y2pgHwI6hcyxOVF3aSJjJ1nF5PPL8dV+gkd0eWW92YBF3cGQNw6Q9yW0saoy8PSUad/1K/bb6XHUZSbazItzHrsmK5YdGUmvDKuwduBXT7TQam/2IfW+gdkPOT2eo3DzNoZImtcJ94Gi8quMUpyLLKh8C5U9DU4ZerdXHW5985ZdEU2UqegOOJuM4ANoe4TEiXmZP6rxqphF2n0Nf4k1JRHKyl2eSjGtWmMxclNJ5Fq55xUqNyKRqOlKfyQssDWHY6MucKdfjtNAN2/M/g=; 25:eP+0vIVbMGRN1DfYAcdgmYxwATyEvPggPgmlal+emWkLPtEeraZ2IC+PajlDo5Zylr1R75x0reCH4wjmS6ZsmLVeBYIgvBYr3dzmmb6KmkPP3Qtwsf6bd3/OJXbNoFEFBHbv1KAfUKUi+liOijrYbwCMXGQxAUUj96feCpdElWL6mZtvi45tQqb3jcAm6Ylw85FO+82zTPcQ4JMK9POSnZCcuWoJQvHWDDYNaG3Gu3KBFuoiIrskfKvvIxLnRdvJBxfaQApOchp5mD9HcV+rOCIlHrJVqhZu1nETHuaktRYbJ35UEq/q9NJeyHo7G7pCYaKvP55nbhN9qNMQwOZWmw== X-MS-TrafficTypeDiagnostic: DM5PR12MB1451: X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1451; 31:CQrFGoW7Pl6nSB98oAOWGM20ZgWzshI2/l7BVHlJzfYBn3YbC+JvTn6jWFDOZ1zrtN63w/XDZiYGEi64RkqRKn//GXfJLkQ/EFgskOtFqRc+ktf1iCnaWAchUiK5mX7xz99vLg+fP9jDq4YXkG3/QOFsNqhL/VgdlRWrlbSlSyJqaiwC8VmZTirJw6ilQNs2B8i1Bpre4MWEvOinbGzs0/nCn/jmHeERyRCtvEDzgpQ=; 20:BO4xccsW7Jryyi0JsqSi8/bdQ1YHoYJb2FmxNcKLz9DOTUvFa65N1LCKnfhJ8sIzVTh4C6VJuftKgChZEFZnZ6CQsmXwnnh/rq/maGznPleeyIahAa3IwQRtB9Bs24R+1rbN9rat3m8zTl/SbQaAGk2aGW5hoaC9FGnsRocMavhAu88Mdkh7d9mrgwPlddWfHbZNbNAyiRtBM5+aUZrs8aXu8OkrWBJZkWBOwKwn4BvEPt/j6YMjwj5WAcAKd8nbQdbbbERjb1K2re/I1TzOtwP4K9eFRdJWGCmMzDAIWd1xN6x5gwhCTaZl0ruMC7gTrhKSxAVaaSwOZMRxtF8101Qmvjn47qF3CWYmckWLomKKLVKnRIIYgC10CqR/avLfyyMqmfeKK9/rM1jrq4N5w3a7qnjvEgIFkoxmFsdDXt8O2ru088pb5FShM0UIq01NWLcAFlPjRCdqTmdaqEvLAYP27c47IpRPWZ7dWq7aVs4+dOyzy3VqSZN5A4S4hYEK X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(100000703101)(100105400095)(10201501046)(3231022)(3002001)(93006095)(93003095)(6055026)(6041248)(20161123558100)(20161123560025)(20161123564025)(20161123562025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DM5PR12MB1451; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DM5PR12MB1451; X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1451; 4:CLZP/o7iItHhUuI8wN5lgQr7yGymAM7Xc5uwtYB3hevhwsmoNtfEAnIsGWtYZjnnG6GI79+3xj/38mEgBk63Xxa96dgBjzvMymMgVklNQbwXsqijjJqmhrNlQovOtjpW1aNemWkdIdQhZV5tCofsF7+/arfJxjJTl7xAV50DQ29PW7r24ENDdZaRNOEOqbTOkKDhmsIHiGE3ZTl1Og4BHmzZahQh56V1BWvisCbWe2rO845uNU0ZIwmbt1moOzwTRcnGgD+DMWRix10I7CWD+EDO7UtDGOIWnYPB4rGiLdKYLJQx6nMBl7+nHnsVLTB8 X-Forefront-PRVS: 0499DAF22A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM5PR12MB1451; 23:pLeVBnPYhbCgLcAPyOfRVOQY49khdfBi+vkWh94wT?= =?us-ascii?Q?s39AwKGp/CpQUl+qnGMW7HP8ssP+ooBxov7rTZctedapcMvqdAiFLLPc139h?= =?us-ascii?Q?ft2IFVUSinc3gsErrYtP6Zgyf/DXp4btHlomtkGPji1/kGmkMf1IoyVO9m6e?= =?us-ascii?Q?eRyyJMS4Fmz5CuzIYoEUPc0g6UZyQQPf8gRoVE3iNFhArm/xYDgk6ztInLTH?= =?us-ascii?Q?ow8EV0UIN/Hqn5Bn5HrlaUVI64MoZgLqbzcxR/CCIjz1TB+USehnMogr9b6g?= =?us-ascii?Q?t1TjvEBRV0kUkqOQ34LnhsvAvqoFsM7IWseIQxau88GHAV8KpscWPqdirb5M?= =?us-ascii?Q?7efMv942WjyionmIyuoeYFdxgzmp5QsJJA62aUaOJ0PqQk4SKuPX/GFBRiRr?= =?us-ascii?Q?QBvG3W9ggDy7tYeqMUrtFrfmk8Ew6rTlkSO5xLuYauQzSZTRfWZ6mPLx6GIz?= =?us-ascii?Q?ltRaR0xfgVMUz7VHrzNc/UfLxstl17/wUHTtyP3XBlSFxUHd4Eg1tVUWOeCh?= =?us-ascii?Q?lh056de4DsU0d6M6l7qW5N6Ya+Va3r4Y6HL0yyCLJJZJgJ9ge2Rk3LB58kVV?= =?us-ascii?Q?qmUIiyr4jXmau1gkiL/8Vi0s9esZKsuzPTp+BVYZQ9uUg8/zapUWxgfa8ywA?= =?us-ascii?Q?xAQj6cb7ENlRRCZY1yeZPGZEMRabfMy/hCFlaNltPA8yVeFSCrumYQRBSyXo?= =?us-ascii?Q?gmk8hHgAl7K9J/5AHJJV6CBfPSOQM3opHsagG7wO7y9SCQlF1I6G9A2+p8MO?= =?us-ascii?Q?mVGXq6i0+SebX/C03wvfmpGqEs3Su5trkqro5P0wG5euA5KzootG5NWE1MyM?= =?us-ascii?Q?UV+RPJKJnPHkh0SNOxhwidqPaRcxblUJMWV3eFGef1vdwlKk4nTdu/0g2iqj?= =?us-ascii?Q?0EE2nsCAAtdhA3cHQbMvVl6GORJO9FLua2m8Rq0NxNPhaCPTwxekbhdJX0cR?= =?us-ascii?Q?3uygGBBZVgelQBQkGQRVXxK8ZYNHTnXiebd/PE3k84bXRJo8nHw6M16jcnDJ?= =?us-ascii?Q?5/5buuXJ9BVlQJNgTipfLs2dixrVSw0uEmQOnbaMhTHUw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1451; 6:6gGSTv75t/hz+W3UL43pwEzlEisBkM0c8ZRNwyVmVXPcqfTNzjnoMo3G1KThA3fLexv2A0pzTKHVDin/08JdJcjR91EtDCKMwDmLA7+HgI4SB/UfII7TZqQbcvx7TkfkpOO4EHSOUJaQ7shhh/w4QLhR9Ee0QqPBcqxO/J4CtwjdP4dhQpSdF+HJQk01WTZ9CeXkkbf6teUILFXgSyYPNibT2qpg7u3pLsz5BaevoqNXVqWxzc7kAb9JRt6W4kVXHeiJj7O9dkNAi2AEQKv95ic7eGN/n+MPvEswru6dvIp65nfWGeWlL+osVBppW7sNFkh2ak1sxQLyO1A7X4nHWbufA6a6NefJ3x6Q/34A8rI=; 5:6CTlQ9/1IA2wKhhPQGDaQATEYSIn2yWaPwLYOlY2HcDUcgBu059SwiaUTTNLqSFPRT54IzBM/vnddm3qhpOWaPEl6u5BsCJtkmwRjreZwG0oB1b7b1oC+ZpUCz3HkwB2PTn2cKY4EwWhiQIAb4mj2g0tBlgoiyuC2pJwcW3PmlM=; 24:udxHBixwvY7QgrPq6Iye3TSC/5DyndQP1ZJs2hwo8e16B4ZDVuuU2cNK/iV1F8UVUsjk8ZvpA9h113FyEm4YlIMcTWIBfr7xx1eEI4Kkh9c=; 7:8hPyF8d8l5WTHpIZWwbdA24Hl3HRugJY2WJalrbyr5jYJsygkWGyzY2mxiDWxEm6yJXQxDOro14eVZCYZxostvtYQVi28OhezZ96uSiicMaUeX6JG10JEw9VqjtLMFgrJchc4BCoStKx12zqmMJ3d35KR3yGKEJ4fAEHoCsqBGJys0H5AnbpINNjPnb7O25JquZuTRKQtOSJPKDq9r9gKvyOIUUAp8mKmkvMOSfCLp7WjDITGcm31XEwrwoeiraZ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1451; 20:IRngi1UNcmeyXt8ovvcRluX7GuD2ZJgO/miQuEp60A/rfTIZO3TlEEnPsn2YttFUwBoghOAz43wf3MQJwhh1DACEnuCf8F2x070veD3SMTQdvEUi5FFyzZqMbqlPGzlskDIWwU25lszpWD0Ed9+fFJi8XqalVj47MQaUOayH+tbacHAUJ1C5opP5sC7XC5qAEYDrFY5WKwtrbghKi2w/eBVsiWsHLu+lHNIShXH3RtbPAaeNPkrLBOfI3rpbWBHp X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Nov 2017 08:06:45.3687 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5da6f643-227b-4083-3165-08d5317ff93d X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXCHOV02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB1451 Cc: Roger He , Christian.Koenig@amd.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP to indicate page order for each element in the pool Change-Id: Ic609925ca5d2a5d4ad49d6becf505388ce3624cf Signed-off-by: Roger He --- drivers/gpu/drm/ttm/ttm_page_alloc.c | 42 ++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index 7385785..2db551f 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c @@ -84,6 +84,7 @@ struct ttm_page_pool { char *name; unsigned long nfrees; unsigned long nrefills; + unsigned int order; }; /** @@ -415,6 +416,7 @@ ttm_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) struct ttm_page_pool *pool; int shrink_pages = sc->nr_to_scan; unsigned long freed = 0; + unsigned int nr_free_pool; if (!mutex_trylock(&lock)) return SHRINK_STOP; @@ -424,10 +426,15 @@ ttm_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) unsigned nr_free = shrink_pages; if (shrink_pages == 0) break; + pool = &_manager->pools[(i + pool_offset)%NUM_POOLS]; /* OK to use static buffer since global mutex is held. */ - shrink_pages = ttm_page_pool_free(pool, nr_free, true); - freed += nr_free - shrink_pages; + nr_free_pool = (nr_free >> pool->order); + if (nr_free_pool == 0) + continue; + + shrink_pages = ttm_page_pool_free(pool, nr_free_pool, true); + freed += ((nr_free_pool - shrink_pages) << pool->order); } mutex_unlock(&lock); return freed; @@ -439,9 +446,12 @@ ttm_pool_shrink_count(struct shrinker *shrink, struct shrink_control *sc) { unsigned i; unsigned long count = 0; + struct ttm_page_pool *pool; - for (i = 0; i < NUM_POOLS; ++i) - count += _manager->pools[i].npages; + for (i = 0; i < NUM_POOLS; ++i) { + pool = &_manager->pools[i]; + count += (pool->npages << pool->order); + } return count; } @@ -935,7 +945,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, } static void ttm_page_pool_init_locked(struct ttm_page_pool *pool, gfp_t flags, - char *name) + char *name, unsigned int order) { spin_lock_init(&pool->lock); pool->fill_lock = false; @@ -943,8 +953,18 @@ static void ttm_page_pool_init_locked(struct ttm_page_pool *pool, gfp_t flags, pool->npages = pool->nfrees = 0; pool->gfp_flags = flags; pool->name = name; + pool->order = order; } +/** + * Actually if TRANSPARENT_HUGEPAGE not enabled, we will not use + * wc_pool_huge and uc_pool_huge, so no matter whatever the page + * order are for those two pools + */ +#ifndef CONFIG_TRANSPARENT_HUGEPAGE +#define HPAGE_PMD_ORDER 9 +#endif + int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages) { int ret; @@ -955,23 +975,23 @@ int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages) _manager = kzalloc(sizeof(*_manager), GFP_KERNEL); - ttm_page_pool_init_locked(&_manager->wc_pool, GFP_HIGHUSER, "wc"); + ttm_page_pool_init_locked(&_manager->wc_pool, GFP_HIGHUSER, "wc", 0); - ttm_page_pool_init_locked(&_manager->uc_pool, GFP_HIGHUSER, "uc"); + ttm_page_pool_init_locked(&_manager->uc_pool, GFP_HIGHUSER, "uc", 0); ttm_page_pool_init_locked(&_manager->wc_pool_dma32, - GFP_USER | GFP_DMA32, "wc dma"); + GFP_USER | GFP_DMA32, "wc dma", 0); ttm_page_pool_init_locked(&_manager->uc_pool_dma32, - GFP_USER | GFP_DMA32, "uc dma"); + GFP_USER | GFP_DMA32, "uc dma", 0); ttm_page_pool_init_locked(&_manager->wc_pool_huge, GFP_TRANSHUGE & ~(__GFP_MOVABLE | __GFP_COMP), - "wc huge"); + "wc huge", HPAGE_PMD_ORDER); ttm_page_pool_init_locked(&_manager->uc_pool_huge, GFP_TRANSHUGE & ~(__GFP_MOVABLE | __GFP_COMP) - , "uc huge"); + , "uc huge", HPAGE_PMD_ORDER); _manager->options.max_size = max_pages; _manager->options.small = SMALL_ALLOCATION;