Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 320270
b: refs/heads/master
c: 1c20f2d
h: refs/heads/master
v: v3
  • Loading branch information
Alex Elder authored and Alex Elder committed Jun 6, 2012
1 parent f0fae35 commit 9be6a95
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1bfd89f4e6e1adc6a782d94aa5d4c53be1e404d7
refs/heads/master: 1c20f2d26795803fc4f5155fe4fca5717a5944b6
61 changes: 34 additions & 27 deletions trunk/net/ceph/messenger.c
Original file line number Diff line number Diff line change
Expand Up @@ -1655,9 +1655,8 @@ static int read_partial_message_section(struct ceph_connection *con,
return 1;
}

static struct ceph_msg *ceph_alloc_msg(struct ceph_connection *con,
struct ceph_msg_header *hdr,
int *skip);
static bool ceph_con_in_msg_alloc(struct ceph_connection *con,
struct ceph_msg_header *hdr);


static int read_partial_message_pages(struct ceph_connection *con,
Expand Down Expand Up @@ -1740,7 +1739,6 @@ static int read_partial_message(struct ceph_connection *con)
int ret;
unsigned front_len, middle_len, data_len;
bool do_datacrc = !con->msgr->nocrc;
int skip;
u64 seq;
u32 crc;

Expand Down Expand Up @@ -1793,9 +1791,7 @@ static int read_partial_message(struct ceph_connection *con)
if (!con->in_msg) {
dout("got hdr type %d front %d data %d\n", con->in_hdr.type,
con->in_hdr.front_len, con->in_hdr.data_len);
skip = 0;
con->in_msg = ceph_alloc_msg(con, &con->in_hdr, &skip);
if (skip) {
if (ceph_con_in_msg_alloc(con, &con->in_hdr)) {
/* skip this message */
dout("alloc_msg said skip message\n");
BUG_ON(con->in_msg);
Expand Down Expand Up @@ -2577,46 +2573,57 @@ static int ceph_alloc_middle(struct ceph_connection *con, struct ceph_msg *msg)
}

/*
* Generic message allocator, for incoming messages.
* Allocate a message for receiving an incoming message on a
* connection, and save the result in con->in_msg. Uses the
* connection's private alloc_msg op if available.
*
* Returns true if the message should be skipped, false otherwise.
* If true is returned (skip message), con->in_msg will be NULL.
* If false is returned, con->in_msg will contain a pointer to the
* newly-allocated message, or NULL in case of memory exhaustion.
*/
static struct ceph_msg *ceph_alloc_msg(struct ceph_connection *con,
struct ceph_msg_header *hdr,
int *skip)
static bool ceph_con_in_msg_alloc(struct ceph_connection *con,
struct ceph_msg_header *hdr)
{
int type = le16_to_cpu(hdr->type);
int front_len = le32_to_cpu(hdr->front_len);
int middle_len = le32_to_cpu(hdr->middle_len);
struct ceph_msg *msg = NULL;
int ret;

BUG_ON(con->in_msg != NULL);

if (con->ops->alloc_msg) {
int skip = 0;

mutex_unlock(&con->mutex);
msg = con->ops->alloc_msg(con, hdr, skip);
con->in_msg = con->ops->alloc_msg(con, hdr, &skip);
mutex_lock(&con->mutex);
if (!msg || *skip)
return NULL;
if (skip)
con->in_msg = NULL;

if (!con->in_msg)
return skip != 0;
}
if (!msg) {
*skip = 0;
msg = ceph_msg_new(type, front_len, GFP_NOFS, false);
if (!msg) {
if (!con->in_msg) {
con->in_msg = ceph_msg_new(type, front_len, GFP_NOFS, false);
if (!con->in_msg) {
pr_err("unable to allocate msg type %d len %d\n",
type, front_len);
return NULL;
return false;
}
msg->page_alignment = le16_to_cpu(hdr->data_off);
con->in_msg->page_alignment = le16_to_cpu(hdr->data_off);
}
memcpy(&msg->hdr, &con->in_hdr, sizeof(con->in_hdr));
memcpy(&con->in_msg->hdr, &con->in_hdr, sizeof(con->in_hdr));

if (middle_len && !msg->middle) {
ret = ceph_alloc_middle(con, msg);
if (middle_len && !con->in_msg->middle) {
ret = ceph_alloc_middle(con, con->in_msg);
if (ret < 0) {
ceph_msg_put(msg);
return NULL;
ceph_msg_put(con->in_msg);
con->in_msg = NULL;
}
}

return msg;
return false;
}


Expand Down
3 changes: 3 additions & 0 deletions trunk/net/ceph/mon_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,7 @@ static struct ceph_msg *get_generic_reply(struct ceph_connection *con,
m = NULL;
} else {
dout("get_generic_reply %lld got %p\n", tid, req->reply);
*skip = 0;
m = ceph_msg_get(req->reply);
/*
* we don't need to track the connection reading into
Expand Down Expand Up @@ -982,6 +983,8 @@ static struct ceph_msg *mon_alloc_msg(struct ceph_connection *con,
case CEPH_MSG_MDS_MAP:
case CEPH_MSG_OSD_MAP:
m = ceph_msg_new(type, front_len, GFP_NOFS, false);
if (!m)
return NULL; /* ENOMEM--return skip == 0 */
break;
}

Expand Down
1 change: 1 addition & 0 deletions trunk/net/ceph/osd_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -2077,6 +2077,7 @@ static struct ceph_msg *alloc_msg(struct ceph_connection *con,
int type = le16_to_cpu(hdr->type);
int front = le32_to_cpu(hdr->front_len);

*skip = 0;
switch (type) {
case CEPH_MSG_OSD_MAP:
case CEPH_MSG_WATCH_NOTIFY:
Expand Down

0 comments on commit 9be6a95

Please sign in to comment.