USB: core: Add hub_get() and hub_put() routines
authorAlan Stern <stern@rowland.harvard.edu>
Fri, 15 Mar 2024 17:04:50 +0000 (13:04 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 26 Mar 2024 14:02:12 +0000 (15:02 +0100)
Create hub_get() and hub_put() routines to encapsulate the kref_get()
and kref_put() calls in hub.c.  The new routines will be used by the
next patch in this series.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Link: https://lore.kernel.org/r/604da420-ae8a-4a9e-91a4-2d511ff404fb@rowland.harvard.edu
Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/core/hub.c
drivers/usb/core/hub.h

index 3ee8455585b6be66e2312e17f922b57cc4385801..9446660e231bb3f9a79b5cdf1503b13377539227 100644 (file)
@@ -130,7 +130,6 @@ EXPORT_SYMBOL_GPL(ehci_cf_port_reset_rwsem);
 #define HUB_DEBOUNCE_STEP        25
 #define HUB_DEBOUNCE_STABLE     100
 
-static void hub_release(struct kref *kref);
 static int usb_reset_and_verify_device(struct usb_device *udev);
 static int hub_port_disable(struct usb_hub *hub, int port1, int set_state);
 static bool hub_port_warm_reset_required(struct usb_hub *hub, int port1,
@@ -720,14 +719,14 @@ static void kick_hub_wq(struct usb_hub *hub)
         */
        intf = to_usb_interface(hub->intfdev);
        usb_autopm_get_interface_no_resume(intf);
-       kref_get(&hub->kref);
+       hub_get(hub);
 
        if (queue_work(hub_wq, &hub->events))
                return;
 
        /* the work has already been scheduled */
        usb_autopm_put_interface_async(intf);
-       kref_put(&hub->kref, hub_release);
+       hub_put(hub);
 }
 
 void usb_kick_hub_wq(struct usb_device *hdev)
@@ -1095,7 +1094,7 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
                        goto init2;
                goto init3;
        }
-       kref_get(&hub->kref);
+       hub_get(hub);
 
        /* The superspeed hub except for root hub has to use Hub Depth
         * value as an offset into the route string to locate the bits
@@ -1343,7 +1342,7 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
                device_unlock(&hdev->dev);
        }
 
-       kref_put(&hub->kref, hub_release);
+       hub_put(hub);
 }
 
 /* Implement the continuations for the delays above */
@@ -1759,6 +1758,16 @@ static void hub_release(struct kref *kref)
        kfree(hub);
 }
 
+void hub_get(struct usb_hub *hub)
+{
+       kref_get(&hub->kref);
+}
+
+void hub_put(struct usb_hub *hub)
+{
+       kref_put(&hub->kref, hub_release);
+}
+
 static unsigned highspeed_hubs;
 
 static void hub_disconnect(struct usb_interface *intf)
@@ -1807,7 +1816,7 @@ static void hub_disconnect(struct usb_interface *intf)
 
        onboard_hub_destroy_pdevs(&hub->onboard_hub_devs);
 
-       kref_put(&hub->kref, hub_release);
+       hub_put(hub);
 }
 
 static bool hub_descriptor_is_sane(struct usb_host_interface *desc)
@@ -5934,7 +5943,7 @@ out_hdev_lock:
 
        /* Balance the stuff in kick_hub_wq() and allow autosuspend */
        usb_autopm_put_interface(intf);
-       kref_put(&hub->kref, hub_release);
+       hub_put(hub);
 
        kcov_remote_stop();
 }
index 43ce21c96a511455b17bea7274354a743b54af10..183b69dc295547ecb5165e9866c6f89f3ffb1bfc 100644 (file)
@@ -129,6 +129,8 @@ extern void usb_hub_remove_port_device(struct usb_hub *hub,
 extern int usb_hub_set_port_power(struct usb_device *hdev, struct usb_hub *hub,
                int port1, bool set);
 extern struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev);
+extern void hub_get(struct usb_hub *hub);
+extern void hub_put(struct usb_hub *hub);
 extern int hub_port_debounce(struct usb_hub *hub, int port1,
                bool must_be_connected);
 extern int usb_clear_port_feature(struct usb_device *hdev,