From patchwork Sat Oct 10 20:00:56 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Hurley X-Patchwork-Id: 528653 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id D34CE140DAC for ; Sun, 11 Oct 2015 07:02:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752909AbbJJUCn (ORCPT ); Sat, 10 Oct 2015 16:02:43 -0400 Received: from mail-qg0-f43.google.com ([209.85.192.43]:34118 "EHLO mail-qg0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752536AbbJJUB3 (ORCPT ); Sat, 10 Oct 2015 16:01:29 -0400 Received: by qgez77 with SMTP id z77so95056684qge.1 for ; Sat, 10 Oct 2015 13:01:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZrPBIU1eU7/JFNGMEnY3LnwHPrKFK7VyBtAngM59bnw=; b=Mef/Dnmd9YOnB7KAa1BiipTdniMSeWwLsvIEFCd1qz3IfOO/H8svR+9dC/fMjhtorm SsxmJliJxjDhmzS5xz7Raeqccp1wiPOEYphIFVtxjlVJHpZ7xeViLsUmts65gI1i/ROf YUcpQvElc8wYOcX/3L3zwNikOn6yZyDh7L4lULVVShp54a9WBKRFQgRSaxStpjtHaE2X fPczbii4XltjckA1SxNjjPriuTnbkL0S07XGVOADFIu9F4YG9xQ0D10xG2J73EQ6Z1Gs 0oMvKxCXFNr6xCp4C8/pMGGRwYpm0s/WgFqREetR8IUoXMOzJ3KkcL5YltnRJXwTpkH+ DPXg== X-Gm-Message-State: ALoCoQlO8e0K7hCpe1wnCgUOEB0UWQkrNBJebFZArwdpHxQTpojSDFvcHaHcqnr0JcKxJgmRiz46 X-Received: by 10.140.39.10 with SMTP id u10mr11628470qgu.19.1444507288364; Sat, 10 Oct 2015 13:01:28 -0700 (PDT) Received: from thor.lan (c-24-61-92-208.hsd1.nh.comcast.net. [24.61.92.208]) by smtp.gmail.com with ESMTPSA id 128sm3537536qhe.9.2015.10.10.13.01.27 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 10 Oct 2015 13:01:27 -0700 (PDT) From: Peter Hurley To: Greg Kroah-Hartman Cc: Jiri Slaby , Alan Cox , David Laight , Arnd Bergmann , linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, netdev@vger.kernel.org, David Miller , Peter Hurley Subject: [PATCH 6/7] tty: r3964: Replace/remove bogus tty lock use Date: Sat, 10 Oct 2015 16:00:56 -0400 Message-Id: <1444507257-7513-7-git-send-email-peter@hurleysoftware.com> X-Mailer: git-send-email 2.6.1 In-Reply-To: <1444507257-7513-1-git-send-email-peter@hurleysoftware.com> References: <1444507257-7513-1-git-send-email-peter@hurleysoftware.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The tty lock is strictly for serializing tty lifetime events (open/close/hangup), and not for line discipline serialization. The tty core already provides serialization of concurrent writes to the same tty, and line discipline lifetime management (by ldisc references), so pinning the tty via tty_lock() is unnecessary and counter-productive; remove tty lock use. However, the line discipline is responsible for serializing reads (if required by the line discipline); add read_lock mutex to serialize calls of r3964_read(). Signed-off-by: Peter Hurley --- drivers/tty/n_r3964.c | 20 +++++++++++++------- include/linux/n_r3964.h | 5 +++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/tty/n_r3964.c b/drivers/tty/n_r3964.c index 6fdef92..3451114 100644 --- a/drivers/tty/n_r3964.c +++ b/drivers/tty/n_r3964.c @@ -978,6 +978,7 @@ static int r3964_open(struct tty_struct *tty) } spin_lock_init(&pInfo->lock); + mutex_init(&pInfo->read_lock); pInfo->tty = tty; pInfo->priority = R3964_MASTER; pInfo->rx_first = pInfo->rx_last = NULL; @@ -1063,7 +1064,16 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file, TRACE_L("read()"); - tty_lock(tty); + /* + * Internal serialization of reads. + */ + if (file->f_flags & O_NONBLOCK) { + if (!mutex_trylock(&pInfo->read_lock)) + return -EAGAIN; + } else { + if (mutex_lock_interruptible(&pInfo->read_lock)) + return -ERESTARTSYS; + } pClient = findClient(pInfo, task_pid(current)); if (pClient) { @@ -1075,7 +1085,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file, goto unlock; } /* block until there is a message: */ - wait_event_interruptible_tty(tty, tty->read_wait, + wait_event_interruptible(tty->read_wait, (pMsg = remove_msg(pInfo, pClient))); } @@ -1105,7 +1115,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file, } ret = -EPERM; unlock: - tty_unlock(tty); + mutex_unlock(&pInfo->read_lock); return ret; } @@ -1154,8 +1164,6 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file, pHeader->locks = 0; pHeader->owner = NULL; - tty_lock(tty); - pClient = findClient(pInfo, task_pid(current)); if (pClient) { pHeader->owner = pClient; @@ -1173,8 +1181,6 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file, add_tx_queue(pInfo, pHeader); trigger_transmit(pInfo); - tty_unlock(tty); - return 0; } diff --git a/include/linux/n_r3964.h b/include/linux/n_r3964.h index e9adb42..90a803a 100644 --- a/include/linux/n_r3964.h +++ b/include/linux/n_r3964.h @@ -161,8 +161,9 @@ struct r3964_info { unsigned char last_rx; unsigned char bcc; unsigned int blocks_in_rx_queue; - - + + struct mutex read_lock; /* serialize r3964_read */ + struct r3964_client_info *firstClient; unsigned int state; unsigned int flags;