net: do corking at mars_send_mref()

This commit is contained in:
Thomas Schoebel-Theuer 2017-04-12 09:56:40 +02:00 committed by Thomas Schoebel-Theuer
parent 5b2cad9f6e
commit 9ed1d12ed9
3 changed files with 7 additions and 5 deletions

View File

@ -782,6 +782,7 @@ static int sender_thread(void *data)
struct mref_object *mref;
int min_nr;
int max_nr;
bool cork;
// timeouting is a rather expensive operation, don't do it too often
if (do_timeout) {
@ -828,6 +829,7 @@ static int sender_thread(void *data)
}
list_del_init(tmp);
// notice: hash_head remains in its list!
cork = !list_empty(&output->mref_list);
traced_unlock(&output->lock, flags);
mref_a = container_of(tmp, struct client_mref_aspect, io_head);
@ -873,7 +875,7 @@ static int sender_thread(void *data)
// notice: hash_head is already there!
spin_unlock(&output->lock);
status = mars_send_mref(&ch->socket, mref);
status = mars_send_mref(&ch->socket, mref, cork);
if (unlikely(status < 0)) {
_hash_insert(output, mref_a);
do_timeout = true;

View File

@ -1150,7 +1150,7 @@ const struct meta mars_cmd_meta[] = {
EXPORT_SYMBOL_GPL(mars_cmd_meta);
int mars_send_mref(struct mars_socket *msock, struct mref_object *mref)
int mars_send_mref(struct mars_socket *msock, struct mref_object *mref, bool cork)
{
struct mars_cmd cmd = {
.cmd_code = CMD_MREF,
@ -1169,12 +1169,12 @@ int mars_send_mref(struct mars_socket *msock, struct mref_object *mref)
goto done;
seq = 0;
status = desc_send_struct(msock, mref, mars_mref_meta, cmd.cmd_code & CMD_FLAG_HAS_DATA);
status = desc_send_struct(msock, mref, mars_mref_meta, cork || cmd.cmd_code & CMD_FLAG_HAS_DATA);
if (status < 0)
goto done;
if (cmd.cmd_code & CMD_FLAG_HAS_DATA) {
status = mars_send_raw(msock, mref->ref_data, mref->ref_len, false);
status = mars_send_raw(msock, mref->ref_data, mref->ref_len, cork);
}
done:
return status;

View File

@ -144,7 +144,7 @@ extern int _mars_recv_struct(struct mars_socket *msock, void *data, const struct
extern int mars_send_dent_list(struct mars_socket *msock, struct list_head *anchor);
extern int mars_recv_dent_list(struct mars_socket *msock, struct list_head *anchor);
extern int mars_send_mref(struct mars_socket *msock, struct mref_object *mref);
extern int mars_send_mref(struct mars_socket *msock, struct mref_object *mref, bool cork);
extern int mars_recv_mref(struct mars_socket *msock, struct mref_object *mref, struct mars_cmd *cmd);
extern int mars_send_cb(struct mars_socket *msock, struct mref_object *mref);
extern int mars_recv_cb(struct mars_socket *msock, struct mref_object *mref, struct mars_cmd *cmd);