From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751990AbdKDUNJ (ORCPT ); Sat, 4 Nov 2017 16:13:09 -0400 Received: from mout.web.de ([217.72.192.78]:59733 "EHLO mout.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751442AbdKDUNH (ORCPT ); Sat, 4 Nov 2017 16:13:07 -0400 To: linux-usb@vger.kernel.org, Alan Stern , Eugene Korenevsky , Geert Uytterhoeven , Greg Kroah-Hartman , =?UTF-8?B?R8O8bnRlciBSw7Zjaw==?= , Jaejoong Kim , Johan Hovold , Jonathan Corbet , Mathias Nyman , Mauro Carvalho Chehab From: SF Markus Elfring Subject: [PATCH] USB: core: Improve unlocking of a mutex in two functions Cc: LKML , kernel-janitors@vger.kernel.org Message-ID: <0ff5f74e-ae23-5c97-8998-0e598ceae96b@users.sourceforge.net> Date: Sat, 4 Nov 2017 21:12:04 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:maVcje5oJH6N3WhqTN7rhJPdIYXJpR905AKfgNXNT8pxtMYU+GK 8wAlfMw1I/Z0ZyMIieDB2Urjqlcpr9y1il77m655ru+4LBZKmbEiBOrKlrF3uqAhRVgUdmQ LHP1LyMH+N/TiPicT9+QDzNOrrtyRbkka/hYcoh+hmPfx4pQ5e9EYlxKzsuEDiVGvKkF3b0 +EcxKKLu5Zh5XRAVqsMdw== X-UI-Out-Filterresults: notjunk:1;V01:K0:Uxx/I68ZrTM=:/0wLA4yYgZ4fHFTAuu4NT7 N3up81kdQL972tYwNQ6FA2EH/VSQv5h1pk0yZLfdrMJukLhX1z6C75n5iB0zRslSi02nePe1c 2WrqtxWtQsqpVRTIG8xc8YudzJzCTzDYvKVvakCjhUDEzrujPuJsJfqOcDAXrzPOkl/X/z/68 wa0KFa17keIs+YG8HBI6WxascCl2dPO/8hFS2EqTLXdpnCP1lcCcjoA5DmD/wxGehLoXrmIMM uY1GK6hIuXwOwfFnqEjNMbX7d5qELbbHkMwHNj3hpJFsbDyF3nBQYEm0v4ZOJ/ou5/MH408pJ LjY+M6ZVHfKUc9eu0EZHfRrH+kQjXQpgS8QZJiX3rylPWM0aAOpea/jgbqHGTt+cRuCeoN00q z+75nNM7SHTs1IFUviJBYWh0xUO6mpX344hG0n8Pgcag9/hSfetogPVZfHUONTzYg71RaqJAw fk/mv4VOIYxjJNQvorirJfGHpl9S9e25Ve8JdCGfZ4DLnwIe1cACdW80rU82VjoFKwDzzzf1i Xybdu3s3gerss1xCCwlTN4kN/3YdpN9jkGjypfhOXY/kXZXt9LrDMTQhnSNK7RBQ58tN2dJPO 0UtQM9ooYOFNfS+Jcrj4ZRNNOqXPzv2Zc5ENrHlxPvQebKRPLh/YrY1ZG5TS0udPkFhgvAyFU LwgqfQqou++kf/qRnrxqAtIIXeyPLg2T51+rHdhCHQ5DGQX5Obbav75JPECCwD2b0rWQRY0lo jFcTAm+T2SRaX2uoJA8kHryaQcUqQgKlUAdaTi3vjid+jSlgCafCwHt2FeP1+JFDEopAVBzym fhgx9nWbiRVIsJ+1fFFXGWVd+lZtvl2MF8UmiC2j+RatxxQQso= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Markus Elfring Date: Sat, 4 Nov 2017 21:00:46 +0100 * Add jump targets so that a call of the function "mutex_unlock" is stored only twice in these function implementations. * Replace five calls by goto statements. This issue was detected by using the Coccinelle software. Signed-off-by: Markus Elfring --- drivers/usb/core/hub.c | 8 ++++---- drivers/usb/core/message.c | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 196a0a5540ed..8f3067c2015c 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -5518,8 +5518,7 @@ static int usb_reset_and_verify_device(struct usb_device *udev) dev_warn(&udev->dev, "Busted HC? Not enough HCD resources for " "old configuration.\n"); - mutex_unlock(hcd->bandwidth_mutex); - goto re_enumerate; + goto unlock; } ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), USB_REQ_SET_CONFIGURATION, 0, @@ -5529,8 +5528,7 @@ static int usb_reset_and_verify_device(struct usb_device *udev) dev_err(&udev->dev, "can't restore configuration #%d (error=%d)\n", udev->actconfig->desc.bConfigurationValue, ret); - mutex_unlock(hcd->bandwidth_mutex); - goto re_enumerate; + goto unlock; } mutex_unlock(hcd->bandwidth_mutex); usb_set_device_state(udev, USB_STATE_CONFIGURED); @@ -5583,6 +5581,8 @@ static int usb_reset_and_verify_device(struct usb_device *udev) udev->bos = bos; return 0; +unlock: + mutex_unlock(hcd->bandwidth_mutex); re_enumerate: usb_release_bos_descriptor(udev); udev->bos = bos; diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 371a07d874a3..fe8e36cc7def 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -1321,8 +1321,8 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) */ if (usb_disable_lpm(dev)) { dev_err(&iface->dev, "%s Failed to disable LPM\n.", __func__); - mutex_unlock(hcd->bandwidth_mutex); - return -ENOMEM; + ret = -ENOMEM; + goto unlock; } /* Changing alt-setting also frees any allocated streams */ for (i = 0; i < iface->cur_altsetting->desc.bNumEndpoints; i++) @@ -1332,9 +1332,7 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) if (ret < 0) { dev_info(&dev->dev, "Not enough bandwidth for altsetting %d\n", alternate); - usb_enable_lpm(dev); - mutex_unlock(hcd->bandwidth_mutex); - return ret; + goto enable_lpm; } if (dev->quirks & USB_QUIRK_NO_SET_INTF) @@ -1355,9 +1353,7 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) } else if (ret < 0) { /* Re-instate the old alt setting */ usb_hcd_alloc_bandwidth(dev, NULL, alt, iface->cur_altsetting); - usb_enable_lpm(dev); - mutex_unlock(hcd->bandwidth_mutex); - return ret; + goto enable_lpm; } mutex_unlock(hcd->bandwidth_mutex); @@ -1413,6 +1409,12 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) create_intf_ep_devs(iface); } return 0; + +enable_lpm: + usb_enable_lpm(dev); +unlock: + mutex_unlock(hcd->bandwidth_mutex); + return ret; } EXPORT_SYMBOL_GPL(usb_set_interface); -- 2.15.0