Thread (6 messages) flat view 6 messages, 3 authors, 2021-01-25

Re: [PATCH net v5] net: lapb: Add locking to the lapb module

From: Xie He <hidden>
Date: 2021-01-24 11:20:32
Also in: lkml

On Sat, Jan 23, 2021 at 8:45 PM Jakub Kicinski [off-list ref] wrote:
quoted
quoted
@@ -178,11 +182,23 @@ int lapb_unregister(struct net_device *dev)
            goto out;
    lapb_put(lapb);

+   /* Wait for other refs to "lapb" to drop */
+   while (refcount_read(&lapb->refcnt) > 2)
+           ;
Tight loop like this is a little scary, perhaps add a small
usleep_range() here?
OK, sure. I'll add a usleep_range(1, 10) here.
quoted
quoted
-int lapb_disconnect_request(struct net_device *dev)
+static int __lapb_disconnect_request(struct lapb_cb *lapb)
 {
-   struct lapb_cb *lapb = lapb_devtostruct(dev);
-   int rc = LAPB_BADTOKEN;
-
-   if (!lapb)
-           goto out;
-
    switch (lapb->state) {
    case LAPB_STATE_0:
-           rc = LAPB_NOTCONNECTED;
-           goto out_put;
+           return LAPB_NOTCONNECTED;

    case LAPB_STATE_1:
            lapb_dbg(1, "(%p) S1 TX DISC(1)\n", lapb->dev);
@@ -310,12 +328,10 @@ int lapb_disconnect_request(struct net_device
*dev)
            lapb_send_control(lapb, LAPB_DISC, LAPB_POLLON, LAPB_COMMAND);
            lapb->state = LAPB_STATE_0;
            lapb_start_t1timer(lapb);
-           rc = LAPB_NOTCONNECTED;
-           goto out_put;
+           return LAPB_NOTCONNECTED;

    case LAPB_STATE_2:
-           rc = LAPB_OK;
-           goto out_put;
+           return LAPB_OK;
    }

    lapb_clear_queues(lapb);
@@ -328,8 +344,22 @@ int lapb_disconnect_request(struct net_device
*dev)
    lapb_dbg(1, "(%p) S3 DISC(1)\n", lapb->dev);
    lapb_dbg(0, "(%p) S3 -> S2\n", lapb->dev);

-   rc = LAPB_OK;
-out_put:
+   return LAPB_OK;
+}
Since this is a fix for net, I'd advise against converting the goto
into direct returns (as much as I generally like such conversion).
This part is actually splitting "lapb_disconnect_request" into two
functions - a "__lapb_disconnect_request" without locking, and a
"lapb_disconnect_request" which provides the locking and calls
"__lapb_disconnect_request". The splitting is necessary for
"lapb_device_event" to directly call "__lapb_disconnect_request" with
the lock already held. After the splitting, the "out_put" tag would
actually be in the caller function so there's nowhere we can "goto".
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help