From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org,
Dominique Martinet <dominique.martinet@cea.fr>,
Jun Piao <piaojun@huawei.com>,
Matthew Wilcox <willy@infradead.org>, Greg Kurz <groug@kaod.org>,
Sasha Levin <sashal@kernel.org>
Subject: [PATCH 4.19 10/72] 9p: add a per-client fcall kmem_cache
Date: Tue, 2 Jul 2019 10:01:11 +0200 [thread overview]
Message-ID: <20190702080125.107936681@linuxfoundation.org> (raw)
In-Reply-To: <20190702080124.564652899@linuxfoundation.org>
[ Upstream commit 91a76be37ff89795526c452a6799576b03bec501 ]
Having a specific cache for the fcall allocations helps speed up
end-to-end latency.
The caches will automatically be merged if there are multiple caches
of items with the same size so we do not need to try to share a cache
between different clients of the same size.
Since the msize is negotiated with the server, only allocate the cache
after that negotiation has happened - previous allocations or
allocations of different sizes (e.g. zero-copy fcall) are made with
kmalloc directly.
Some figures on two beefy VMs with Connect-IB (sriov) / trans=rdma,
with ior running 32 processes in parallel doing small 32 bytes IOs:
- no alloc (4.18-rc7 request cache): 65.4k req/s
- non-power of two alloc, no patch: 61.6k req/s
- power of two alloc, no patch: 62.2k req/s
- non-power of two alloc, with patch: 64.7k req/s
- power of two alloc, with patch: 65.1k req/s
Link: http://lkml.kernel.org/r/1532943263-24378-2-git-send-email-asmadeus@codewreck.org
Signed-off-by: Dominique Martinet <dominique.martinet@cea.fr>
Acked-by: Jun Piao <piaojun@huawei.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Greg Kurz <groug@kaod.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
include/net/9p/9p.h | 4 ++++
include/net/9p/client.h | 1 +
net/9p/client.c | 37 ++++++++++++++++++++++++++++++++-----
3 files changed, 37 insertions(+), 5 deletions(-)
diff --git a/include/net/9p/9p.h b/include/net/9p/9p.h
index b8eb51a661e5..4ab293f574e0 100644
--- a/include/net/9p/9p.h
+++ b/include/net/9p/9p.h
@@ -336,6 +336,9 @@ enum p9_qid_t {
#define P9_NOFID (u32)(~0)
#define P9_MAXWELEM 16
+/* Minimal header size: size[4] type[1] tag[2] */
+#define P9_HDRSZ 7
+
/* ample room for Twrite/Rread header */
#define P9_IOHDRSZ 24
@@ -558,6 +561,7 @@ struct p9_fcall {
size_t offset;
size_t capacity;
+ struct kmem_cache *cache;
u8 *sdata;
};
diff --git a/include/net/9p/client.h b/include/net/9p/client.h
index c2671d40bb6b..735f3979d559 100644
--- a/include/net/9p/client.h
+++ b/include/net/9p/client.h
@@ -123,6 +123,7 @@ struct p9_client {
struct p9_trans_module *trans_mod;
enum p9_trans_status status;
void *trans;
+ struct kmem_cache *fcall_cache;
union {
struct {
diff --git a/net/9p/client.c b/net/9p/client.c
index 83e39fef58e1..7ef54719c6f7 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -237,9 +237,16 @@ static int parse_opts(char *opts, struct p9_client *clnt)
return ret;
}
-static int p9_fcall_init(struct p9_fcall *fc, int alloc_msize)
+static int p9_fcall_init(struct p9_client *c, struct p9_fcall *fc,
+ int alloc_msize)
{
- fc->sdata = kmalloc(alloc_msize, GFP_NOFS);
+ if (likely(c->fcall_cache) && alloc_msize == c->msize) {
+ fc->sdata = kmem_cache_alloc(c->fcall_cache, GFP_NOFS);
+ fc->cache = c->fcall_cache;
+ } else {
+ fc->sdata = kmalloc(alloc_msize, GFP_NOFS);
+ fc->cache = NULL;
+ }
if (!fc->sdata)
return -ENOMEM;
fc->capacity = alloc_msize;
@@ -248,7 +255,16 @@ static int p9_fcall_init(struct p9_fcall *fc, int alloc_msize)
void p9_fcall_fini(struct p9_fcall *fc)
{
- kfree(fc->sdata);
+ /* sdata can be NULL for interrupted requests in trans_rdma,
+ * and kmem_cache_free does not do NULL-check for us
+ */
+ if (unlikely(!fc->sdata))
+ return;
+
+ if (fc->cache)
+ kmem_cache_free(fc->cache, fc->sdata);
+ else
+ kfree(fc->sdata);
}
EXPORT_SYMBOL(p9_fcall_fini);
@@ -273,9 +289,9 @@ p9_tag_alloc(struct p9_client *c, int8_t type, unsigned int max_size)
if (!req)
return NULL;
- if (p9_fcall_init(&req->tc, alloc_msize))
+ if (p9_fcall_init(c, &req->tc, alloc_msize))
goto free_req;
- if (p9_fcall_init(&req->rc, alloc_msize))
+ if (p9_fcall_init(c, &req->rc, alloc_msize))
goto free;
p9pdu_reset(&req->tc);
@@ -965,6 +981,7 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
clnt->trans_mod = NULL;
clnt->trans = NULL;
+ clnt->fcall_cache = NULL;
client_id = utsname()->nodename;
memcpy(clnt->name, client_id, strlen(client_id) + 1);
@@ -1008,6 +1025,15 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
if (err)
goto close_trans;
+ /* P9_HDRSZ + 4 is the smallest packet header we can have that is
+ * followed by data accessed from userspace by read
+ */
+ clnt->fcall_cache =
+ kmem_cache_create_usercopy("9p-fcall-cache", clnt->msize,
+ 0, 0, P9_HDRSZ + 4,
+ clnt->msize - (P9_HDRSZ + 4),
+ NULL);
+
return clnt;
close_trans:
@@ -1039,6 +1065,7 @@ void p9_client_destroy(struct p9_client *clnt)
p9_tag_cleanup(clnt);
+ kmem_cache_destroy(clnt->fcall_cache);
kfree(clnt);
}
EXPORT_SYMBOL(p9_client_destroy);
--
2.20.1
next prev parent reply other threads:[~2019-07-02 8:15 UTC|newest]
Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-02 8:01 [PATCH 4.19 00/72] 4.19.57-stable review Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 01/72] perf ui helpline: Use strlcpy() as a shorter form of strncpy() + explicit set nul Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 02/72] perf help: Remove needless use of strncpy() Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 03/72] perf header: Fix unchecked usage " Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 04/72] arm64: Dont unconditionally add -Wno-psabi to KBUILD_CFLAGS Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 05/72] Revert "x86/uaccess, ftrace: Fix ftrace_likely_update() vs. SMAP" Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 06/72] IB/hfi1: Close PSM sdma_progress sleep window Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 07/72] 9p/xen: fix check for xenbus_read error in front_probe Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 08/72] 9p: Use a slab for allocating requests Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 09/72] 9p: embed fcall in req to round down buffer allocs Greg Kroah-Hartman
2019-07-02 8:01 ` Greg Kroah-Hartman [this message]
2019-07-02 8:01 ` [PATCH 4.19 11/72] 9p: rename p9_free_req() function Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 12/72] 9p: Add refcount to p9_req_t Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 13/72] 9p/rdma: do not disconnect on down_interruptible EAGAIN Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 14/72] 9p: Rename req to rreq in trans_fd Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 15/72] 9p: acl: fix uninitialized iattr access Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 16/72] 9p/rdma: remove useless check in cm_event_handler Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 17/72] 9p: p9dirent_read: check network-provided name length Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 18/72] 9p: potential NULL dereference Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 19/72] 9p/trans_fd: abort p9_read_work if req status changed Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 20/72] 9p/trans_fd: put worker reqs on destroy Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 21/72] net/9p: include trans_common.h to fix missing prototype warning Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 22/72] qmi_wwan: Fix out-of-bounds read Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 23/72] Revert "usb: dwc3: gadget: Clear req->needs_extra_trb flag on cleanup" Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 24/72] usb: dwc3: gadget: combine unaligned and zero flags Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 25/72] usb: dwc3: gadget: track number of TRBs per request Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 26/72] usb: dwc3: gadget: use num_trbs when skipping TRBs on ->dequeue() Greg Kroah-Hartman
2019-07-03 2:03 ` Sasha Levin
2019-07-03 7:20 ` Greg Kroah-Hartman
2019-07-03 19:59 ` Sasha Levin
2019-07-02 8:01 ` [PATCH 4.19 27/72] usb: dwc3: gadget: extract dwc3_gadget_ep_skip_trbs() Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 28/72] usb: dwc3: gadget: introduce cancelled_list Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 29/72] usb: dwc3: gadget: move requests to cancelled_list Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 30/72] usb: dwc3: gadget: remove wait_end_transfer Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 31/72] usb: dwc3: gadget: Clear req->needs_extra_trb flag on cleanup Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 32/72] fs/proc/array.c: allow reporting eip/esp for all coredumping threads Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 33/72] mm/mempolicy.c: fix an incorrect rebind node in mpol_rebind_nodemask Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 34/72] fs/binfmt_flat.c: make load_flat_shared_library() work Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 35/72] clk: socfpga: stratix10: fix divider entry for the emac clocks Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 36/72] mm: soft-offline: return -EBUSY if set_hwpoison_free_buddy_page() fails Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 37/72] mm: hugetlb: soft-offline: dissolve_free_huge_page() return zero on !PageHuge Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 38/72] mm/page_idle.c: fix oops because end_pfn is larger than max_pfn Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 39/72] dm log writes: make sure super sector log updates are written in order Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 40/72] scsi: vmw_pscsi: Fix use-after-free in pvscsi_queue_lck() Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 41/72] x86/speculation: Allow guests to use SSBD even if host does not Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 42/72] x86/microcode: Fix the microcode load on CPU hotplug for real Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 43/72] x86/resctrl: Prevent possible overrun during bitmap operations Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 44/72] KVM: x86/mmu: Allocate PAE root array when using SVMs 32-bit NPT Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 45/72] NFS/flexfiles: Use the correct TCP timeout for flexfiles I/O Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 46/72] cpu/speculation: Warn on unsupported mitigations= parameter Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 47/72] SUNRPC: Clean up initialisation of the struct rpc_rqst Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 48/72] irqchip/mips-gic: Use the correct local interrupt map registers Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 49/72] eeprom: at24: fix unexpected timeout under high load Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 50/72] af_packet: Block execution of tasks waiting for transmit to complete in AF_PACKET Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 51/72] bonding: Always enable vlan tx offload Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 52/72] ipv4: Use return value of inet_iif() for __raw_v4_lookup in the while loop Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 53/72] net/packet: fix memory leak in packet_set_ring() Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 54/72] net: remove duplicate fetch in sock_getsockopt Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 55/72] net: stmmac: fixed new system time seconds value calculation Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 56/72] net: stmmac: set IC bit when transmitting frames with HW timestamp Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 57/72] sctp: change to hold sk after auth shkey is created successfully Greg Kroah-Hartman
2019-07-02 8:01 ` [PATCH 4.19 58/72] team: Always enable vlan tx offload Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 59/72] tipc: change to use register_pernet_device Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 60/72] tipc: check msg->req data len in tipc_nl_compat_bearer_disable Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 61/72] tun: wake up waitqueues after IFF_UP is set Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 62/72] bpf: simplify definition of BPF_FIB_LOOKUP related flags Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 63/72] bpf: lpm_trie: check left child of last leftmost node for NULL Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 64/72] bpf: fix nested bpf tracepoints with per-cpu data Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 65/72] bpf: fix unconnected udp hooks Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 66/72] bpf: udp: Avoid calling reuseports bpf_prog from udp_gro Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 67/72] bpf: udp: ipv6: Avoid running reuseports bpf_prog from __udp6_lib_err Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 68/72] arm64: futex: Avoid copying out uninitialised stack in failed cmpxchg() Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 69/72] bpf, arm64: use more scalable stadd over ldxr / stxr loop in xadd Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 70/72] futex: Update comments and docs about return values of arch futex code Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 71/72] RDMA: Directly cast the sockaddr union to sockaddr Greg Kroah-Hartman
2019-07-02 8:02 ` [PATCH 4.19 72/72] tipc: pass tunnel dev as NULL to udp_tunnel(6)_xmit_skb Greg Kroah-Hartman
2019-07-02 12:32 ` [PATCH 4.19 00/72] 4.19.57-stable review kernelci.org bot
2019-07-02 16:54 ` Naresh Kamboju
2019-07-02 20:23 ` Guenter Roeck
2019-07-03 14:46 ` Greg Kroah-Hartman
2019-07-02 21:08 ` Kelsey Skunberg
2019-07-02 22:52 ` shuah
2019-07-03 10:21 ` Jon Hunter
2019-07-03 10:21 ` Jon Hunter
2019-07-04 5:29 ` Bharath Vedartham
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190702080125.107936681@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=dominique.martinet@cea.fr \
--cc=groug@kaod.org \
--cc=linux-kernel@vger.kernel.org \
--cc=piaojun@huawei.com \
--cc=sashal@kernel.org \
--cc=stable@vger.kernel.org \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.