From patchwork Mon Jan 27 13:28:32 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerhard Heift X-Patchwork-Id: 3542251 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id F3937C02DC for ; Mon, 27 Jan 2014 13:29:32 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 434D32013A for ; Mon, 27 Jan 2014 13:29:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 984E120125 for ; Mon, 27 Jan 2014 13:29:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753873AbaA0N3M (ORCPT ); Mon, 27 Jan 2014 08:29:12 -0500 Received: from mail-ee0-f42.google.com ([74.125.83.42]:48495 "EHLO mail-ee0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753842AbaA0N3J (ORCPT ); Mon, 27 Jan 2014 08:29:09 -0500 Received: by mail-ee0-f42.google.com with SMTP id e49so2271684eek.1 for ; Mon, 27 Jan 2014 05:29:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=CKF7RK/0zRrrJyZnK28mntq9+aj607NQ/jZXSoZlA5Y=; b=FXy7tJUt2g5d163qkP9xOzu2J5a1/Jx1T99vr40fIHrBstYNf4VmPr9Dud786hNPS5 GwW6/UeoM3FlVWr6LA1voppBjcdmfsMYaQOcp7F56WeX/vx/vwrIxwLZVkTRazrWaQlU 8M5ROQHLuKar6RyLtdL3SomWdZeRgRSNE629piW8rzsu8ZC7ewUzo68v92lUlOa7RBgi 7QBWJfLvDnLmJ9ZHdkDTRTNgYEHMZMD2UmOJtgweOGY/aMXyxn/5VPeub8+cqu3SGAxQ kn6ZHqAnmVdT6NFL3hTdgbRRMky4imEtB6GUbWX95ztNobrD0+a6lBlhFSu7NJBxSmHr Z2hQ== X-Gm-Message-State: ALoCoQm9IoTw9RjNd05f7oMIjizeZfaiG23ev2JJm8oY+TbP5CcLGhw1P00n90OuQQeecCVp3eGl X-Received: by 10.15.99.201 with SMTP id bl49mr25056292eeb.53.1390829348697; Mon, 27 Jan 2014 05:29:08 -0800 (PST) Received: from localhost (host-115-115.kawo1.rwth-aachen.de. [134.130.115.115]) by mx.google.com with ESMTPSA id a8sm36673792eeo.3.2014.01.27.05.29.07 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 27 Jan 2014 05:29:07 -0800 (PST) From: Gerhard Heift To: linux-btrfs@vger.kernel.org Subject: [PATCH RFCv2 6/6] btrfs: in tree_search extent buffer lifetime Date: Mon, 27 Jan 2014 14:28:32 +0100 Message-Id: <1390829312-814-7-git-send-email-Gerhard@Heift.Name> X-Mailer: git-send-email 1.8.5.3 In-Reply-To: <1390829312-814-1-git-send-email-Gerhard@Heift.Name> References: <1390829312-814-1-git-send-email-Gerhard@Heift.Name> Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Instead of allocting and releasing a buffer for each leaf, which will be visited during a search, allocate (and expand) a buffer for the whole search. This saves a few allocations and deallocations during larger searchs, which visits more leafs. Signed-off-by: Gerhard Heift --- fs/btrfs/ioctl.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 38403e6..ec7d759 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -1852,6 +1852,8 @@ static noinline int copy_to_sk(struct btrfs_root *root, struct btrfs_ioctl_search_key *sk, size_t buf_size, char __user *buf, + size_t *content_buffer_size, + char **content_buffer, unsigned long *sk_offset, int *num_found) { @@ -1865,9 +1867,6 @@ static noinline int copy_to_sk(struct btrfs_root *root, int slot; int ret = 0; - char *content_buffer = NULL; - unsigned long content_buffer_size = 0; - leaf = path->nodes[0]; slot = path->slots[0]; nritems = btrfs_header_nritems(leaf); @@ -1917,28 +1916,28 @@ static noinline int copy_to_sk(struct btrfs_root *root, if (item_len) { /* resize internal buffer if needed */ - if (content_buffer_size < item_len) { - kfree(content_buffer); + if (*content_buffer_size < item_len) { + kfree(*content_buffer); - content_buffer_size = + *content_buffer_size = ALIGN(item_len, PAGE_SIZE); - content_buffer = kmalloc_track_caller( - content_buffer_size, GFP_KERNEL); + *content_buffer = kmalloc_track_caller( + *content_buffer_size, GFP_KERNEL); - if (!content_buffer) { - content_buffer_size = 0; + if (!*content_buffer) { + *content_buffer_size = 0; ret = -ENOMEM; goto err; } } /* copy the item */ - read_extent_buffer(leaf, content_buffer, + read_extent_buffer(leaf, *content_buffer, item_off, item_len); if (copy_to_user(buf + *sk_offset, - content_buffer, item_len)) { + *content_buffer, item_len)) { ret = -EFAULT; goto err; } @@ -1976,8 +1975,6 @@ err: -ENOMEM: could not allocate memory for a temporary extent buffer -EFAULT: could not copy extent buffer back to userspace */ - kfree(content_buffer); - return ret; } @@ -1995,6 +1992,9 @@ static noinline int search_ioctl(struct inode *inode, int num_found = 0; unsigned long sk_offset = 0; + char *content_buffer = NULL; + size_t content_buffer_size = 0; + if (buf_size < sizeof(struct btrfs_ioctl_search_header)) return -EOVERFLOW; @@ -2035,6 +2035,7 @@ static noinline int search_ioctl(struct inode *inode, goto err; } ret = copy_to_sk(root, path, &key, sk, buf_size, buf, + &content_buffer_size, &content_buffer, &sk_offset, &num_found); btrfs_release_path(path); @@ -2045,6 +2046,8 @@ static noinline int search_ioctl(struct inode *inode, if (ret > 0) ret = 0; err: + kfree(content_buffer); + sk->nr_items = num_found; btrfs_free_path(path); return ret;