From: Alex Elder <elder@dreamhost.com>
To: ceph-devel@vger.kernel.org
Subject: [PATCH] ceph: use a shared zero page rather than one per messenger
Date: Tue, 28 Feb 2012 19:06:22 -0800 [thread overview]
Message-ID: <4F4D962E.7020304@dreamhost.com> (raw)
Each messenger allocates a page to be used when writing zeroes
out in the event of error or other abnormal condition. Just
allocate one at initialization time and have them all share it.
Signed-off-by: Alex Elder <elder@dreamhost.com>
---
include/linux/ceph/messenger.h | 1 -
net/ceph/messenger.c | 45
+++++++++++++++++++++++++++------------
2 files changed, 31 insertions(+), 15 deletions(-)
diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h
index ffbeb2c..6b5af5f 100644
--- a/include/linux/ceph/messenger.h
+++ b/include/linux/ceph/messenger.h
@@ -54,7 +54,6 @@ struct ceph_connection_operations {
struct ceph_messenger {
struct ceph_entity_inst inst; /* my name+address */
struct ceph_entity_addr my_enc_addr;
- struct page *zero_page; /* used in certain error cases */
bool nocrc;
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index ad5b708..068cb7e 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -52,6 +52,9 @@ static char addr_str[MAX_ADDR_STR][MAX_ADDR_STR_LEN];
static DEFINE_SPINLOCK(addr_str_lock);
static int last_addr_str;
+static struct page *zero_page; /* used in certain error cases */
+static void *zero_page_address; /* kernel virtual addr of zero_page */
+
const char *ceph_pr_addr(const struct sockaddr_storage *ss)
{
int i;
@@ -99,18 +102,43 @@ struct workqueue_struct *ceph_msgr_wq;
int ceph_msgr_init(void)
{
+ BUG_ON(zero_page != NULL);
+ zero_page = __page_cache_alloc(GFP_KERNEL | __GFP_ZERO);
+ if (!zero_page) {
+ pr_err("msgr_init failed to alloc zero_page\n");
+ return -ENOMEM;
+ }
+ BUG_ON(zero_page_address != NULL);
+ zero_page_address = kmap(zero_page);
+
ceph_msgr_wq = alloc_workqueue("ceph-msgr", WQ_NON_REENTRANT, 0);
if (!ceph_msgr_wq) {
pr_err("msgr_init failed to create workqueue\n");
+
+ zero_page_address = NULL;
+ kunmap(zero_page);
+ __free_page(zero_page);
+ zero_page = NULL;
+
return -ENOMEM;
}
+
return 0;
}
EXPORT_SYMBOL(ceph_msgr_init);
void ceph_msgr_exit(void)
{
+ BUG_ON(ceph_msgr_wq == NULL);
destroy_workqueue(ceph_msgr_wq);
+
+ BUG_ON(zero_page_address == NULL);
+ zero_page_address = NULL;
+
+ BUG_ON(zero_page == NULL);
+ kunmap(zero_page);
+ __free_page(zero_page);
+ zero_page = NULL;
}
EXPORT_SYMBOL(ceph_msgr_exit);
@@ -835,9 +863,9 @@ static int write_partial_msg_pages(struct
ceph_connection *con)
max_write = bv->bv_len;
#endif
} else {
- page = con->msgr->zero_page;
+ page = zero_page;
if (crc)
- kaddr = page_address(con->msgr->zero_page);
+ kaddr = zero_page_address;
}
len = min_t(int, max_write - con->out_msg_pos.page_pos,
total_max_write);
@@ -908,7 +936,7 @@ static int write_partial_skip(struct ceph_connection
*con)
while (con->out_skip > 0) {
struct kvec iov = {
- .iov_base = page_address(con->msgr->zero_page),
+ .iov_base = zero_page_address,
.iov_len = min(con->out_skip, (int)PAGE_CACHE_SIZE)
};
@@ -2216,15 +2244,6 @@ struct ceph_messenger
*ceph_messenger_create(struct ceph_entity_addr *myaddr,
spin_lock_init(&msgr->global_seq_lock);
- /* the zero page is needed if a request is "canceled" while the message
- * is being written over the socket */
- msgr->zero_page = __page_cache_alloc(GFP_KERNEL | __GFP_ZERO);
- if (!msgr->zero_page) {
- kfree(msgr);
- return ERR_PTR(-ENOMEM);
- }
- kmap(msgr->zero_page);
-
if (myaddr)
msgr->inst.addr = *myaddr;
@@ -2241,8 +2260,6 @@ EXPORT_SYMBOL(ceph_messenger_create);
void ceph_messenger_destroy(struct ceph_messenger *msgr)
{
dout("destroy %p\n", msgr);
- kunmap(msgr->zero_page);
- __free_page(msgr->zero_page);
kfree(msgr);
dout("destroyed messenger %p\n", msgr);
}
--
1.7.5.4
next reply other threads:[~2012-02-29 3:06 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-29 3:06 Alex Elder [this message]
2012-02-29 4:18 ` [PATCH] ceph: use a shared zero page rather than one per messenger Christoph Hellwig
2012-02-29 17:40 ` [PATCH, v2] " Alex Elder
2012-03-02 19:21 ` Sage Weil
2012-03-02 23:14 ` Alex Elder
2012-03-03 3:43 ` Alex Elder
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=4F4D962E.7020304@dreamhost.com \
--to=elder@dreamhost.com \
--cc=ceph-devel@vger.kernel.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.