Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp1136427imm; Wed, 26 Sep 2018 12:17:59 -0700 (PDT) X-Google-Smtp-Source: ACcGV61jYGHWLvoh64n3m7Vq8qwWTFNfbv16M3tHw+fYALI+H3x5lE5vdS/ZOiOjxMAmMZr67rYB X-Received: by 2002:a17:902:d715:: with SMTP id w21-v6mr7211452ply.143.1537989479822; Wed, 26 Sep 2018 12:17:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537989479; cv=none; d=google.com; s=arc-20160816; b=MN012Td+uMvzGmPWEHsQHwctXRLlYyqKMdbN4x/5He3rbx1eh7VOZUttnfOEXj+f9d hojI+vBAvQWshHfF3LMpdkXC1HSoPAdoxB7iA1vsg3MBJFX+s0kujaKCsOSX0MANi/J/ EobPL2oxpOAy/tePMYgykjk4hUu7EmgOGSeU7S2SnKhaEKTIxJlBo6GwQGHiMNt3qq5C hgxirYYZJCdW29uXUwYdBOIjNBUG0OanCwUN6lwzZm8Uduu+MfwneSOu52HorB4RU6Y5 S5Mht95dEyIP2rIU7sb3jU3/XsZ/Z2BNuLq/SeZpQtJ5ei1qfaf7qEWY959pXWNcCC5g c17w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=HZ1qa4ZBbgNkkfC8hXurG85NsiWYXXMEGEH1/gqx8Gs=; b=KGZytFKTXsDpIgEU56dyj/Stj4arxWibQSNly7obbqhjux/xVxDwgXKw/awbi+aJex RMA6f9qMCetgd9kyE+XFrnzOC4cJnGFlWpe2+OKnFQFJyvNEsPk4u7pxIubTaEwU32ru qmZR+gSIOpcIs5G8WXeMxRnHzWD8mAgYLaBHlgYrsX+7HZvFF6N5edYoYEYh9V2Rvvrr Xmb4p4xyrdsaGsNAlY6Tmx+yUE286YvdUvLvwdedWMefCckfNTOKYd3lJbt2VdZI/Oqd 8rdislMsDx9tvdz2Z1JhwTTCd5lhZYXVox9TLaCW9v99hdd+IF6n41wdqqvRuv91BZvN KEfA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vmware.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n26-v6si5821175pgd.57.2018.09.26.12.17.44; Wed, 26 Sep 2018 12:17:59 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vmware.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727130AbeI0B3h (ORCPT + 99 others); Wed, 26 Sep 2018 21:29:37 -0400 Received: from ex13-edg-ou-002.vmware.com ([208.91.0.190]:25069 "EHLO EX13-EDG-OU-002.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726421AbeI0B3g (ORCPT ); Wed, 26 Sep 2018 21:29:36 -0400 Received: from sc9-mailhost2.vmware.com (10.113.161.72) by EX13-EDG-OU-002.vmware.com (10.113.208.156) with Microsoft SMTP Server id 15.0.1156.6; Wed, 26 Sep 2018 12:15:05 -0700 Received: from sc2-haas01-esx0118.eng.vmware.com (sc2-haas01-esx0118.eng.vmware.com [10.172.44.118]) by sc9-mailhost2.vmware.com (Postfix) with ESMTP id 69CC3B0E8E; Wed, 26 Sep 2018 15:15:09 -0400 (EDT) From: Nadav Amit To: Arnd Bergmann , CC: Xavier Deguillard , , Nadav Amit Subject: [PATCH v3 04/20] vmw_balloon: simplifying batch access Date: Wed, 26 Sep 2018 12:13:20 -0700 Message-ID: <20180926191336.101885-5-namit@vmware.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180926191336.101885-1-namit@vmware.com> References: <20180926191336.101885-1-namit@vmware.com> MIME-Version: 1.0 Content-Type: text/plain Received-SPF: None (EX13-EDG-OU-002.vmware.com: namit@vmware.com does not designate permitted sender hosts) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The use of accessors for batch entries complicates the code and makes it less readable. Remove it an instead use bit-fields. Reviewed-by: Xavier Deguillard Signed-off-by: Nadav Amit --- drivers/misc/vmw_balloon.c | 81 ++++++++++++++------------------------ 1 file changed, 30 insertions(+), 51 deletions(-) diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c index 5e5f61f207f4..7af70fc988b9 100644 --- a/drivers/misc/vmw_balloon.c +++ b/drivers/misc/vmw_balloon.c @@ -121,24 +121,6 @@ enum vmwballoon_capabilities { #define VMW_BALLOON_SUCCESS_WITH_CAPABILITIES (0x03000000) -/* Batch page description */ - -/* - * Layout of a page in the batch page: - * - * +-------------+----------+--------+ - * | | | | - * | Page number | Reserved | Status | - * | | | | - * +-------------+----------+--------+ - * 64 PAGE_SHIFT 6 0 - * - * The reserved field should be set to 0. - */ -#define VMW_BALLOON_BATCH_MAX_PAGES (PAGE_SIZE / sizeof(u64)) -#define VMW_BALLOON_BATCH_STATUS_MASK ((1UL << 5) - 1) -#define VMW_BALLOON_BATCH_PAGE_MASK (~((1UL << PAGE_SHIFT) - 1)) - #define VMW_BALLOON_CMD_WITH_TARGET_MASK \ ((1UL << VMW_BALLOON_CMD_GET_TARGET) | \ (1UL << VMW_BALLOON_CMD_LOCK) | \ @@ -161,27 +143,6 @@ static const char * const vmballoon_cmd_names[] = { [VMW_BALLOON_CMD_VMCI_DOORBELL_SET] = "doorbellSet" }; -struct vmballoon_batch_page { - u64 pages[VMW_BALLOON_BATCH_MAX_PAGES]; -}; - -static u64 vmballoon_batch_get_pa(struct vmballoon_batch_page *batch, int idx) -{ - return batch->pages[idx] & VMW_BALLOON_BATCH_PAGE_MASK; -} - -static int vmballoon_batch_get_status(struct vmballoon_batch_page *batch, - int idx) -{ - return (int)(batch->pages[idx] & VMW_BALLOON_BATCH_STATUS_MASK); -} - -static void vmballoon_batch_set_pa(struct vmballoon_batch_page *batch, int idx, - u64 pa) -{ - batch->pages[idx] = pa; -} - #ifdef CONFIG_DEBUG_FS struct vmballoon_stats { unsigned int timer; @@ -225,6 +186,19 @@ struct vmballoon_page_size { unsigned int n_refused_pages; }; +/** + * struct vmballoon_batch_entry - a batch entry for lock or unlock. + * + * @status: the status of the operation, which is written by the hypervisor. + * @reserved: reserved for future use. Must be set to zero. + * @pfn: the physical frame number of the page to be locked or unlocked. + */ +struct vmballoon_batch_entry { + u64 status : 5; + u64 reserved : PAGE_SHIFT - 5; + u64 pfn : 52; +} __packed; + struct vmballoon { struct vmballoon_page_size page_sizes[VMW_BALLOON_NUM_PAGE_SIZES]; @@ -240,7 +214,14 @@ struct vmballoon { unsigned long capabilities; - struct vmballoon_batch_page *batch_page; + /** + * @batch_page: pointer to communication batch page. + * + * When batching is used, batch_page points to a page, which holds up to + * %VMW_BALLOON_BATCH_MAX_PAGES entries for locking or unlocking. + */ + struct vmballoon_batch_entry *batch_page; + unsigned int batch_max_pages; struct page *page; @@ -568,8 +549,7 @@ static int vmballoon_lock_batched_page(struct vmballoon *b, if (locked > 0) { for (i = 0; i < num_pages; i++) { - u64 pa = vmballoon_batch_get_pa(b->batch_page, i); - struct page *p = pfn_to_page(pa >> PAGE_SHIFT); + struct page *p = pfn_to_page(b->batch_page[i].pfn); vmballoon_free_page(p, is_2m_pages); } @@ -578,12 +558,11 @@ static int vmballoon_lock_batched_page(struct vmballoon *b, } for (i = 0; i < num_pages; i++) { - u64 pa = vmballoon_batch_get_pa(b->batch_page, i); - struct page *p = pfn_to_page(pa >> PAGE_SHIFT); + struct page *p = pfn_to_page(b->batch_page[i].pfn); struct vmballoon_page_size *page_size = &b->page_sizes[is_2m_pages]; - locked = vmballoon_batch_get_status(b->batch_page, i); + locked = b->batch_page[i].status; switch (locked) { case VMW_BALLOON_SUCCESS: @@ -656,12 +635,11 @@ static int vmballoon_unlock_batched_page(struct vmballoon *b, ret = -EIO; for (i = 0; i < num_pages; i++) { - u64 pa = vmballoon_batch_get_pa(b->batch_page, i); - struct page *p = pfn_to_page(pa >> PAGE_SHIFT); + struct page *p = pfn_to_page(b->batch_page[i].pfn); struct vmballoon_page_size *page_size = &b->page_sizes[is_2m_pages]; - locked = vmballoon_batch_get_status(b->batch_page, i); + locked = b->batch_page[i].status; if (!hv_success || locked != VMW_BALLOON_SUCCESS) { /* * That page wasn't successfully unlocked by the @@ -710,8 +688,8 @@ static void vmballoon_add_page(struct vmballoon *b, int idx, struct page *p) static void vmballoon_add_batched_page(struct vmballoon *b, int idx, struct page *p) { - vmballoon_batch_set_pa(b->batch_page, idx, - (u64)page_to_pfn(p) << PAGE_SHIFT); + b->batch_page[idx] = (struct vmballoon_batch_entry) + { .pfn = page_to_pfn(p) }; } /* @@ -967,7 +945,8 @@ static void vmballoon_reset(struct vmballoon *b) if ((b->capabilities & VMW_BALLOON_BATCHED_CMDS) != 0) { b->ops = &vmballoon_batched_ops; - b->batch_max_pages = VMW_BALLOON_BATCH_MAX_PAGES; + b->batch_max_pages = PAGE_SIZE / sizeof(struct + vmballoon_batch_entry); if (!vmballoon_init_batching(b)) { /* * We failed to initialize batching, inform the monitor -- 2.17.1