X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fsys-linux.c;h=7beb977484f5ddca6859e10f79dcab039e26ea9c;hb=76016e1b948b7d9675b4e0750d1f943d96d9523b;hp=dc3b4d658de4770c32a95900d9f811b4c7fc5878;hpb=112286259164339ab4531de5fb3b048a82b1e491;p=ppp.git diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c index dc3b4d6..7beb977 100644 --- a/pppd/sys-linux.c +++ b/pppd/sys-linux.c @@ -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