Re: [PATCH] libceph: encapsulate connection kvec operations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ah, nice cleanup.

Reviewed-by: Sage Weil <sage@xxxxxxxxxxxx>

On Tue, 28 Feb 2012, Alex Elder wrote:

> Encapsulate the operation of adding a new chunk of data to the next
> open slot in a ceph_connection's out_kvec array.  Also add a "reset"
> operation to make subsequent add operations start at the beginning
> of the array again.
> 
> Use these routines throughout, avoiding duplicate code and ensuring
> all calls are handled consistently.
> 
> Signed-off-by: Alex Elder <elder@xxxxxxxxxxxxx>
> ---
>  net/ceph/messenger.c |  117
> ++++++++++++++++++++++++--------------------------
>  1 files changed, 56 insertions(+), 61 deletions(-)
> 
> diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
> index 2404a5a..03868cd 100644
> --- a/net/ceph/messenger.c
> +++ b/net/ceph/messenger.c
> @@ -465,14 +465,35 @@ static u32 get_global_seq(struct ceph_messenger *msgr,
> u32 gt)
>  	return ret;
>  }
> 
> +static void ceph_con_out_kvec_reset(struct ceph_connection *con)
> +{
> +	con->out_kvec_left = 0;
> +	con->out_kvec_bytes = 0;
> +	con->out_kvec_cur = &con->out_kvec[0];
> +}
> +
> +static void ceph_con_out_kvec_add(struct ceph_connection *con,
> +				size_t size, void *data)
> +{
> +	int index;
> +
> +	index = con->out_kvec_left;
> +	BUG_ON(index >= ARRAY_SIZE(con->out_kvec));
> +
> +	con->out_kvec[index].iov_len = size;
> +	con->out_kvec[index].iov_base = data;
> +	con->out_kvec_left++;
> +	con->out_kvec_bytes += size;
> +}
> 
>  /*
>   * Prepare footer for currently outgoing message, and finish things
>   * off.  Assumes out_kvec* are already valid.. we just add on to the end.
>   */
> -static void prepare_write_message_footer(struct ceph_connection *con, int v)
> +static void prepare_write_message_footer(struct ceph_connection *con)
>  {
>  	struct ceph_msg *m = con->out_msg;
> +	int v = con->out_kvec_left;
> 
>  	dout("prepare_write_message_footer %p\n", con);
>  	con->out_kvec_is_msg = true;
> @@ -490,9 +511,8 @@ static void prepare_write_message_footer(struct
> ceph_connection *con, int v)
>  static void prepare_write_message(struct ceph_connection *con)
>  {
>  	struct ceph_msg *m;
> -	int v = 0;
> 
> -	con->out_kvec_bytes = 0;
> +	ceph_con_out_kvec_reset(con);
>  	con->out_kvec_is_msg = true;
>  	con->out_msg_done = false;
> 
> @@ -500,16 +520,13 @@ static void prepare_write_message(struct ceph_connection
> *con)
>  	 * TCP packet that's a good thing. */
>  	if (con->in_seq > con->in_seq_acked) {
>  		con->in_seq_acked = con->in_seq;
> -		con->out_kvec[v].iov_base = &tag_ack;
> -		con->out_kvec[v++].iov_len = 1;
> +		ceph_con_out_kvec_add(con, sizeof tag_ack, &tag_ack);
>  		con->out_temp_ack = cpu_to_le64(con->in_seq_acked);
> -		con->out_kvec[v].iov_base = &con->out_temp_ack;
> -		con->out_kvec[v++].iov_len = sizeof(con->out_temp_ack);
> -		con->out_kvec_bytes = 1 + sizeof(con->out_temp_ack);
> +		ceph_con_out_kvec_add(con, sizeof con->out_temp_ack,
> +			&con->out_temp_ack);
>  	}
> 
> -	m = list_first_entry(&con->out_queue,
> -		       struct ceph_msg, list_head);
> +	m = list_first_entry(&con->out_queue, struct ceph_msg, list_head);
>  	con->out_msg = m;
> 
>  	/* put message on sent list */
> @@ -533,17 +550,13 @@ static void prepare_write_message(struct ceph_connection
> *con)
>  	BUG_ON(le32_to_cpu(m->hdr.front_len) != m->front.iov_len);
> 
>  	/* tag + hdr + front + middle */
> -	con->out_kvec[v].iov_base = &tag_msg;
> -	con->out_kvec[v++].iov_len = 1;
> -	con->out_kvec[v].iov_base = &m->hdr;
> -	con->out_kvec[v++].iov_len = sizeof(m->hdr);
> -	con->out_kvec[v++] = m->front;
> +	ceph_con_out_kvec_add(con, sizeof tag_msg, &tag_msg);
> +	ceph_con_out_kvec_add(con, sizeof m->hdr, &m->hdr);
> +	ceph_con_out_kvec_add(con, m->front.iov_len, m->front.iov_base);
> +
>  	if (m->middle)
> -		con->out_kvec[v++] = m->middle->vec;
> -	con->out_kvec_left = v;
> -	con->out_kvec_bytes += 1 + sizeof(m->hdr) + m->front.iov_len +
> -		(m->middle ? m->middle->vec.iov_len : 0);
> -	con->out_kvec_cur = con->out_kvec;
> +		ceph_con_out_kvec_add(con, m->middle->vec.iov_len,
> +			m->middle->vec.iov_base);
> 
>  	/* fill in crc (except data pages), footer */
>  	con->out_msg->hdr.crc =
> @@ -576,7 +589,7 @@ static void prepare_write_message(struct ceph_connection
> *con)
>  		con->out_more = 1;  /* data + footer will follow */
>  	} else {
>  		/* no, queue up footer too and be done */
> -		prepare_write_message_footer(con, v);
> +		prepare_write_message_footer(con);
>  	}
> 
>  	set_bit(WRITE_PENDING, &con->state);
> @@ -591,14 +604,14 @@ static void prepare_write_ack(struct ceph_connection
> *con)
>  	     con->in_seq_acked, con->in_seq);
>  	con->in_seq_acked = con->in_seq;
> 
> -	con->out_kvec[0].iov_base = &tag_ack;
> -	con->out_kvec[0].iov_len = 1;
> +	ceph_con_out_kvec_reset(con);
> +
> +	ceph_con_out_kvec_add(con, sizeof tag_ack, &tag_ack);
> +
>  	con->out_temp_ack = cpu_to_le64(con->in_seq_acked);
> -	con->out_kvec[1].iov_base = &con->out_temp_ack;
> -	con->out_kvec[1].iov_len = sizeof(con->out_temp_ack);
> -	con->out_kvec_left = 2;
> -	con->out_kvec_bytes = 1 + sizeof(con->out_temp_ack);
> -	con->out_kvec_cur = con->out_kvec;
> +	ceph_con_out_kvec_add(con, sizeof con->out_temp_ack,
> +				&con->out_temp_ack);
> +
>  	con->out_more = 1;  /* more will follow.. eventually.. */
>  	set_bit(WRITE_PENDING, &con->state);
>  }
> @@ -609,11 +622,8 @@ static void prepare_write_ack(struct ceph_connection
> *con)
>  static void prepare_write_keepalive(struct ceph_connection *con)
>  {
>  	dout("prepare_write_keepalive %p\n", con);
> -	con->out_kvec[0].iov_base = &tag_keepalive;
> -	con->out_kvec[0].iov_len = 1;
> -	con->out_kvec_left = 1;
> -	con->out_kvec_bytes = 1;
> -	con->out_kvec_cur = con->out_kvec;
> +	ceph_con_out_kvec_reset(con);
> +	ceph_con_out_kvec_add(con, sizeof tag_keepalive, &tag_keepalive);
>  	set_bit(WRITE_PENDING, &con->state);
>  }
> 
> @@ -642,12 +652,9 @@ static int prepare_connect_authorizer(struct
> ceph_connection *con)
>  	con->out_connect.authorizer_protocol = cpu_to_le32(auth_protocol);
>  	con->out_connect.authorizer_len = cpu_to_le32(auth_len);
> 
> -	if (auth_len) {
> -		con->out_kvec[con->out_kvec_left].iov_base = auth_buf;
> -		con->out_kvec[con->out_kvec_left].iov_len = auth_len;
> -		con->out_kvec_left++;
> -		con->out_kvec_bytes += auth_len;
> -	}
> +	if (auth_len)
> +		ceph_con_out_kvec_add(con, auth_len, auth_buf);
> +
>  	return 0;
>  }
> 
> @@ -657,15 +664,11 @@ static int prepare_connect_authorizer(struct
> ceph_connection *con)
>  static void prepare_write_banner(struct ceph_messenger *msgr,
>  				 struct ceph_connection *con)
>  {
> -	int len = strlen(CEPH_BANNER);
> +	ceph_con_out_kvec_reset(con);
> +	ceph_con_out_kvec_add(con, strlen(CEPH_BANNER), CEPH_BANNER);
> +	ceph_con_out_kvec_add(con, sizeof msgr->my_enc_addr,
> +					&msgr->my_enc_addr);
> 
> -	con->out_kvec[0].iov_base = CEPH_BANNER;
> -	con->out_kvec[0].iov_len = len;
> -	con->out_kvec[1].iov_base = &msgr->my_enc_addr;
> -	con->out_kvec[1].iov_len = sizeof(msgr->my_enc_addr);
> -	con->out_kvec_left = 2;
> -	con->out_kvec_bytes = len + sizeof(msgr->my_enc_addr);
> -	con->out_kvec_cur = con->out_kvec;
>  	con->out_more = 0;
>  	set_bit(WRITE_PENDING, &con->state);
>  }
> @@ -703,22 +706,16 @@ static int prepare_write_connect(struct ceph_messenger
> *msgr,
> 
>  	if (include_banner)
>  		prepare_write_banner(msgr, con);
> -	else {
> -		con->out_kvec_left = 0;
> -		con->out_kvec_bytes = 0;
> -	}
> -	con->out_kvec[con->out_kvec_left].iov_base = &con->out_connect;
> -	con->out_kvec[con->out_kvec_left].iov_len = sizeof(con->out_connect);
> -	con->out_kvec_left++;
> -	con->out_kvec_bytes += sizeof(con->out_connect);
> -	con->out_kvec_cur = con->out_kvec;
> +	else
> +		ceph_con_out_kvec_reset(con);
> +	ceph_con_out_kvec_add(con, sizeof con->out_connect,
> &con->out_connect);
> +
>  	con->out_more = 0;
>  	set_bit(WRITE_PENDING, &con->state);
> 
>  	return prepare_connect_authorizer(con);
>  }
> 
> -
>  /*
>   * write as much of pending kvecs to the socket as we can.
>   *  1 -> done
> @@ -915,10 +912,8 @@ static int write_partial_msg_pages(struct ceph_connection
> *con)
>  	/* prepare and queue up footer, too */
>  	if (!crc)
>  		con->out_msg->footer.flags |= CEPH_MSG_FOOTER_NOCRC;
> -	con->out_kvec_bytes = 0;
> -	con->out_kvec_left = 0;
> -	con->out_kvec_cur = con->out_kvec;
> -	prepare_write_message_footer(con, 0);
> +	ceph_con_out_kvec_reset(con);
> +	prepare_write_message_footer(con);
>  	ret = 1;
>  out:
>  	return ret;
> -- 
> 1.7.5.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux