On Tue, Jun 30, 2020 at 12:08:03PM +0200, Martin Pieuchot wrote:
> On 29/06/20(Mon) 11:59, Vitaliy Makkoveev wrote:
> > [...] 
> > I reworked tool for reproduce. Now I avoided fork()/exec() route and it
> > takes couple of minutes to take panic on 4 cores. Also some screenshots
> > attached.
> 
> Setting kern.pool_debug=2 makes the race reproducible in seconds.
> 
> Could you turn this test into something committable in regress/?  We can
> link it to the build once a fix is committed.
> 

We have 3 races with cloned interfaces:
1. if_clone_create() vs if_clone_create()
2. if_clone_destroy() vs if_clone_destroy()
3. if_clone_destroy() vs the rest of stack

It makes sences to commit unified test to regress/, so I suggest to wait
a little.

> > #include <sys/socket.h>
> > #include <sys/ioctl.h>
> > #include <net/if.h>
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <err.h>
> > #include <errno.h>
> > #include <pthread.h>
> > #include <string.h>
> > #include <unistd.h>
> > 
> > static struct ifreq ifr;
> > 
> > static void *clone_create(void *arg)
> > {
> >     int s;
> > 
> >     if((s=socket(AF_INET, SOCK_DGRAM, 0))<0)
> >             err(1, "socket()");
> >     while(1){
> >             if(ioctl(s, SIOCIFCREATE, &ifr)<0)
> >                     if(errno==EINVAL)
> >                             exit(1);
> >     }
> > 
> >     return NULL;
> > }
> > 
> > static void *clone_destroy(void *arg)
> > {
> >     int s;
> > 
> >     if((s=socket(AF_INET, SOCK_DGRAM, 0))<0)
> >             err(1, "socket()");
> >     while(1){
> >             if(ioctl(s, SIOCIFDESTROY, &ifr)<0)
> >                     if(errno==EINVAL)
> >                             exit(1);
> >     }
> > 
> >     return NULL;
> > }
> > 
> > int main(int argc, char *argv[])
> > {
> >     pthread_t thr;
> >     int i;
> > 
> >     if(argc!=2){
> >             fprintf(stderr, "usage: %s ifname\n", getprogname());
> >             return 1;
> >     }
> > 
> >     if(getuid()!=0){
> >             fprintf(stderr, "should be root\n");
> >             return 1;
> >     }
> > 
> >     memset(&ifr, 0, sizeof(ifr));
> >     strlcpy(ifr.ifr_name, argv[1], sizeof(ifr.ifr_name));
> > 
> >     for(i=0; i<8*4; ++i){
> >             if(pthread_create(&thr, NULL, clone_create, NULL)!=0)
> >                     errx(1, "pthread_create(clone_create)");
> >     }
> > 
> >     clone_destroy(NULL);
> > 
> >     return 0;
> > }
> > 
> > ---- cut end ----
> 
> 
> 
> 
> 

Reply via email to