X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fsys-linux.c;h=7beb977484f5ddca6859e10f79dcab039e26ea9c;hb=089687fbcc6524809ae9f4b2f8145fe3c2a91147;hp=dc3b4d658de4770c32a95900d9f811b4c7fc5878;hpb=87640b7b5ceb562146a1c4b820c7e151ff078eec;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