PVS Studio reports: /usr/src/sys/kern/kern_conf.c:627:1: warning: V649 There are two 'if' statements with identical conditional expressions. The first 'if' statement contains function return. This means that the second 'if' statement is senseless. Check lines: 616, 627. > if (devsw->d_flags & D_INIT) > return (0); if (devsw->d_flags & D_NEEDGIANT) { dev_unlock(); dsw2 = malloc(sizeof *dsw2, M_DEVT, (flags & MAKEDEV_NOWAIT) ? M_NOWAIT : M_WAITOK); dev_lock(); if (dsw2 == NULL && !(devsw->d_flags & D_INIT)) return (ENOMEM); } else dsw2 = NULL; > if (devsw->d_flags & D_INIT) { > if (dsw2 != NULL) > cdevsw_free_devlocked(dsw2); > return (0); } This code appeared in base r177301.
The D_INIT flag might be set by another thread while we unlocked dev_mtx in the D_NEEDGIANT block. This is a common kernel pattern, unlock, do sleepable resource allocation, relock, and then recheck the original condition which might be invalidated by other thread meantime.
Thank you for very nice explanation Kostic! I'll try to remember this pattern in the future.