From: Andreas Gruenbacher Date: Thu, 24 Mar 2011 20:17:52 +0000 (+0100) Subject: drbd: Preallocate one page per drbd_socket as a send buffer X-Git-Tag: v3.8-rc1~78^2~18^2~326 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5a87d920f38fcafb790ddd03f0d8d1db56b268a8;p=profile%2Fivi%2Fkernel-x86-ivi.git drbd: Preallocate one page per drbd_socket as a send buffer Signed-off-by: Philipp Reisner Signed-off-by: Lars Ellenberg --- diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 932ba03..9f1f0f5 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -556,27 +556,6 @@ struct p_delay_probe93 { #define DRBD_SOCKET_BUFFER_SIZE 4096 -union p_polymorph { - struct p_header header; - struct p_handshake handshake; - struct p_data data; - struct p_block_ack block_ack; - struct p_barrier barrier; - struct p_barrier_ack barrier_ack; - struct p_rs_param_89 rs_param_89; - struct p_rs_param_95 rs_param_95; - struct p_protocol protocol; - struct p_sizes sizes; - struct p_uuids uuids; - struct p_state state; - struct p_req_state req_state; - struct p_req_state_reply req_state_reply; - struct p_block_req block_req; - struct p_delay_probe93 delay_probe93; - struct p_rs_uuid rs_uuid; - struct p_block_desc block_desc; -} __packed; - /**********************************************************************/ enum drbd_thread_state { NONE, @@ -804,7 +783,7 @@ struct drbd_socket { struct socket *socket; /* this way we get our * send/receive buffers off the stack */ - union p_polymorph sbuf; + void *sbuf; void *rbuf; }; diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 004a8ce..16ec6c3 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -800,7 +800,7 @@ int drbd_send_sync_param(struct drbd_conf *mdev) enum drbd_packet cmd = apv >= 89 ? P_SYNC_PARAM89 : P_SYNC_PARAM; - p = &mdev->tconn->data.sbuf.rs_param_95; + p = mdev->tconn->data.sbuf; /* initialize verify_alg and csums_alg */ memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX); @@ -2277,11 +2277,15 @@ static int drbd_alloc_socket(struct drbd_socket *socket) socket->rbuf = (void *) __get_free_page(GFP_KERNEL); if (!socket->rbuf) return -ENOMEM; + socket->sbuf = (void *) __get_free_page(GFP_KERNEL); + if (!socket->sbuf) + return -ENOMEM; return 0; } static void drbd_free_socket(struct drbd_socket *socket) { + free_page((unsigned long) socket->sbuf); free_page((unsigned long) socket->rbuf); } diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 59e5a50..e75eb27 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -736,7 +736,7 @@ out: static int drbd_send_fp(struct drbd_tconn *tconn, struct socket *sock, enum drbd_packet cmd) { - struct p_header *h = &tconn->data.sbuf.header; + struct p_header *h = tconn->data.sbuf; return !_conn_send_cmd(tconn, 0, sock, cmd, h, sizeof(*h), 0); } @@ -4138,7 +4138,7 @@ static int drbd_disconnected(int vnr, void *p, void *data) static int drbd_send_handshake(struct drbd_tconn *tconn) { /* ASSERT current == mdev->tconn->receiver ... */ - struct p_handshake *p = &tconn->data.sbuf.handshake; + struct p_handshake *p = tconn->data.sbuf; int err; if (mutex_lock_interruptible(&tconn->data.mutex)) { diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 185cd25..cbbc5c7 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -1193,7 +1193,7 @@ int w_send_barrier(struct drbd_work *w, int cancel) { struct drbd_tl_epoch *b = container_of(w, struct drbd_tl_epoch, w); struct drbd_conf *mdev = w->mdev; - struct p_barrier *p = &mdev->tconn->data.sbuf.barrier; + struct p_barrier *p = mdev->tconn->data.sbuf; int err = 0; /* really avoid racing with tl_clear. w.cb may have been referenced