]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/sys-linux.c
Merge pull request #366 from pali/rtnetlink-register
[ppp.git] / pppd / sys-linux.c
index dc3b4d658de4770c32a95900d9f811b4c7fc5878..7beb977484f5ddca6859e10f79dcab039e26ea9c 100644 (file)
@@ -864,7 +864,14 @@ static int make_ppp_unit_rtnetlink(void)
     nlreq.ifli.ifid.ifdata[0].rta.rta_type = IFLA_PPP_DEV_FD;
     nlreq.ifli.ifid.ifdata[0].ppp.ppp_dev_fd = ppp_dev_fd;
 
-    resp = rtnetlink_msg("RTM_NEWLINK/NLM_F_CREATE", NULL, &nlreq, sizeof(nlreq), NULL, NULL, 0);
+    /*
+     * See kernel function ppp_nl_newlink(), which may return -EBUSY to prevent
+     * possible deadlock in kernel and ask userspace to retry request again.
+     */
+    do {
+        resp = rtnetlink_msg("RTM_NEWLINK/NLM_F_CREATE", NULL, &nlreq, sizeof(nlreq), NULL, NULL, 0);
+    } while (resp == -EBUSY);
+
     if (resp) {
         /*
          * Linux kernel versions prior to 4.7 do not support creating ppp