From patchwork Mon Mar 4 18:12:01 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Elder X-Patchwork-Id: 2213711 Return-Path: X-Original-To: patchwork-ceph-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id E648DDF2F2 for ; Mon, 4 Mar 2013 18:12:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757003Ab3CDSMD (ORCPT ); Mon, 4 Mar 2013 13:12:03 -0500 Received: from mail-ia0-f177.google.com ([209.85.210.177]:36173 "EHLO mail-ia0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754493Ab3CDSMC (ORCPT ); Mon, 4 Mar 2013 13:12:02 -0500 Received: by mail-ia0-f177.google.com with SMTP id o25so4924841iad.8 for ; Mon, 04 Mar 2013 10:12:01 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding :x-gm-message-state; bh=5cSho0D9uf9plUC+CceC7qFATHvUbDK6s10x8Ks2qdo=; b=int319Wm8TvythXsw1Wg9gfG2IqWp6KzeEfhlKbYBeHKtpB3I1vckElA8J0lPS+Rcs U4fCunQafo3c7pNBF58doLgiNxWOPUdcumlEmaFwVNyeXrPYN4gPPRycbG7PbXYKOap1 pLoCUrpdKl5Rqck3DXetWi066S1KH2qBY5DuG+3IQBveyU6rDV4o7rb6tyCFwIHtIT4v W4erZNDM1WK3opYHgijfrzJ8FTb1nQG+42px6XEqTV1ZOrVw73HCQUhV3FAgsF2esDdi l2F9rtak0GIvgRVHGcNu0CiWfPssNTwzduHjwjJ3HkFk3AfQ/hzPwryAUhCcbFTYE3nY 2Omw== X-Received: by 10.50.87.196 with SMTP id ba4mr3296336igb.20.1362420720903; Mon, 04 Mar 2013 10:12:00 -0800 (PST) Received: from [172.22.22.4] (c-71-195-31-37.hsd1.mn.comcast.net. [71.195.31.37]) by mx.google.com with ESMTPS id wo8sm11789699igb.6.2013.03.04.10.11.58 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 04 Mar 2013 10:11:59 -0800 (PST) Message-ID: <5134E3F1.70008@inktank.com> Date: Mon, 04 Mar 2013 12:12:01 -0600 From: Alex Elder User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130221 Thunderbird/17.0.3 MIME-Version: 1.0 To: ceph-devel@vger.kernel.org Subject: [PATCH 1/3] libceph: drop mutex while allocating a message References: <5134E25E.4030701@inktank.com> <5134E3AD.4080906@inktank.com> In-Reply-To: <5134E3AD.4080906@inktank.com> X-Gm-Message-State: ALoCoQlNcH26ZJQ2PREwTwNWBXQCbI/9I/h+YaEBBkYcwlO7IzrUJBNYWrQnRwvTv9akJCKpdqeQ Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org In ceph_con_in_msg_alloc(), if no alloc_msg method is defined for a connection a new message is allocated with ceph_msg_new(). Drop the mutex before making this call, and make sure we're still connected when we get it back again. This is preparing for the next patch, which ensures all connections define an alloc_msg method, and then handles them all the same way. Signed-off-by: Alex Elder Reviewed-by: Greg Farnum --- net/ceph/messenger.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) mutex_lock(&con->mutex); @@ -2838,12 +2837,19 @@ static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip) } } if (!con->in_msg) { - con->in_msg = ceph_msg_new(type, front_len, GFP_NOFS, false); - if (!con->in_msg) { + mutex_unlock(&con->mutex); + msg = ceph_msg_new(type, front_len, GFP_NOFS, false); + mutex_lock(&con->mutex); + if (!msg) { pr_err("unable to allocate msg type %d len %d\n", type, front_len); return -ENOMEM; } + if (con->state != CON_STATE_OPEN) { + ceph_msg_put(msg); + return -EAGAIN; + } + con->in_msg = msg; con->in_msg->con = con->ops->get(con); BUG_ON(con->in_msg->con == NULL); con->in_msg->page_alignment = le16_to_cpu(hdr->data_off); diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 0f9933a..6ec6051 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -2807,13 +2807,12 @@ static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip) 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; int ret = 0; BUG_ON(con->in_msg != NULL); if (con->ops->alloc_msg) { - struct ceph_msg *msg; - mutex_unlock(&con->mutex); msg = con->ops->alloc_msg(con, hdr, skip);