From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161842AbcA1E4a (ORCPT ); Wed, 27 Jan 2016 23:56:30 -0500 Received: from p3plsmtps2ded03.prod.phx3.secureserver.net ([208.109.80.60]:47690 "EHLO p3plsmtps2ded03.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161561AbcA1ExV (ORCPT ); Wed, 27 Jan 2016 23:53:21 -0500 x-originating-ip: 72.167.245.219 From: "K. Y. Srinivasan" To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, vkuznets@redhat.com, jasowang@redhat.com Cc: "K. Y. Srinivasan" Subject: [PATCH V2 12/13] Drivers: hv: vmbus: Eliminate the spin lock on the read path Date: Wed, 27 Jan 2016 22:29:44 -0800 Message-Id: <1453962585-32069-12-git-send-email-kys@microsoft.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1453962585-32069-1-git-send-email-kys@microsoft.com> References: <1453962559-32028-1-git-send-email-kys@microsoft.com> <1453962585-32069-1-git-send-email-kys@microsoft.com> X-CMAE-Envelope: MS4wfPuipNhI9MaXmCF2wREWnneAn2JvYfh/lqOdpzBhD39XKtzDo89Ds+sko+fvnb3RNVbmDSK+Iy055h0XngIgrkHNoCql6IQyCQ0SVwkuBa9XCfVoMTEK +dDys/0qGFd12IoUG0vrKMQi7p3qsMkhYsHjDlNvJX9G3OXqTyDPBPffrjG9fZxlyAl6YsBQUEBbVSBDm3/ibMfjBfukv8YyJhvgAypeELzAdP4PTYI4e7iG 6KPldCzWdTR0BaBd8D99xD0Fiu6d6LAYs+QTYqgWjf0Vxut/5868Vdx9jvWPNes2auU5AnFRnWuzLKndSIGS5L8FbYDFE1vR2paGMpTELrT8pOJenhgM+HTm WgmkRrzGHGDmJSccmyNfqsvbxRl2wPVhZEsJ8JxspmLH5JKGmWo0v8YqymMkx9+XAbKixsl9 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The function hv_ringbuffer_read() is called always on a pre-assigned CPU. Each chnnel is bound to a specific CPU and this function is always called on the CPU the channel is bound. There is no need to acquire the spin lock; get rid of this overhead. Signed-off-by: K. Y. Srinivasan --- drivers/hv/ring_buffer.c | 18 +++++------------- 1 files changed, 5 insertions(+), 13 deletions(-) diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index b53702c..1145f3b 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c @@ -388,7 +388,6 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, u32 bytes_avail_toread; u32 next_read_location = 0; u64 prev_indices = 0; - unsigned long flags; struct vmpacket_descriptor desc; u32 offset; u32 packetlen; @@ -397,7 +396,6 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, if (buflen <= 0) return -EINVAL; - spin_lock_irqsave(&inring_info->ring_lock, flags); *buffer_actual_len = 0; *requestid = 0; @@ -412,7 +410,7 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, * No error is set when there is even no header, drivers are * supposed to analyze buffer_actual_len. */ - goto out_unlock; + return ret; } next_read_location = hv_get_next_read_location(inring_info); @@ -425,15 +423,11 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, *buffer_actual_len = packetlen; *requestid = desc.trans_id; - if (bytes_avail_toread < packetlen + offset) { - ret = -EAGAIN; - goto out_unlock; - } + if (bytes_avail_toread < packetlen + offset) + return -EAGAIN; - if (packetlen > buflen) { - ret = -ENOBUFS; - goto out_unlock; - } + if (packetlen > buflen) + return -ENOBUFS; next_read_location = hv_get_next_readlocation_withoffset(inring_info, offset); @@ -460,7 +454,5 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, *signal = hv_need_to_signal_on_read(bytes_avail_towrite, inring_info); -out_unlock: - spin_unlock_irqrestore(&inring_info->ring_lock, flags); return ret; } -- 1.7.4.1