Print this page
XXXX introduce drv_sectohz


  93 {
  94         mutex_init(&devfsadm_lock, NULL, MUTEX_DEFAULT, NULL);
  95         cv_init(&devfsadm_cv, NULL, CV_DEFAULT, NULL);
  96 }
  97 
  98 void
  99 sdev_devfsadm_lockdestroy(void)
 100 {
 101         mutex_destroy(&devfsadm_lock);
 102         cv_destroy(&devfsadm_cv);
 103 }
 104 
 105 /*
 106  * Wait for node to be created
 107  */
 108 int
 109 sdev_wait4lookup(struct sdev_node *dv, int cmd)
 110 {
 111         clock_t expire;
 112         clock_t rv;
 113         clock_t wakeup = drv_usectohz(2 * 1000000);
 114         int rval = ENOENT;
 115         int is_lookup = (cmd == SDEV_LOOKUP);
 116 
 117         ASSERT(cmd == SDEV_LOOKUP || cmd == SDEV_READDIR);
 118         ASSERT(MUTEX_HELD(&dv->sdev_lookup_lock));
 119 
 120         /* tick value at which wait expires */
 121         expire = ddi_get_lbolt() +
 122             drv_usectohz(dev_node_wait_timeout * 1000000);
 123 
 124         sdcmn_err6(("wait4lookup %s %s, %ld %d\n",
 125             is_lookup ? "lookup" : "readdir",
 126             dv->sdev_name, expire - ddi_get_lbolt(), dv->sdev_state));
 127 
 128         if (SDEV_IS_LGWAITING(dv)) {
 129                 /* devfsadm nodes */
 130                 while (DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state) &&
 131                     !sdev_devfsadm_revoked()) {
 132                         /* wait 2 sec and check devfsadm completion */
 133                         rv = cv_reltimedwait_sig(&dv->sdev_lookup_cv,
 134                             &dv->sdev_lookup_lock, wakeup, TR_CLOCK_TICK);
 135 
 136                         if (is_lookup && (rv > 0)) {
 137                                 /* was this node constructed ? */
 138                                 if (dv->sdev_state == SDEV_READY) {
 139                                         rval = 0;
 140                                 }
 141                                 sdcmn_err6(("%s: wait done, %screated %d\n",
 142                                     dv->sdev_name, rval ? "not " : "",


 217                         cmn_err(CE_WARN, "unable to start devfsadm - "
 218                             "sysevent error %d\n", se_err);
 219                         break;
 220                 }
 221         }
 222 
 223         sysevent_free(ev);
 224         return (se_err);
 225 }
 226 
 227 static int
 228 sdev_open_upcall_door()
 229 {
 230         int error;
 231         clock_t rv;
 232         clock_t expire;
 233 
 234         ASSERT(sdev_upcall_door == NULL);
 235 
 236         /* timeout expires this many ticks in the future */
 237         expire = ddi_get_lbolt() + drv_usectohz(dev_devfsadm_startup * 1000000);
 238 
 239         if (sdev_door_upcall_filename == NULL) {
 240                 if ((error = sdev_start_devfsadmd()) != 0) {
 241                         return (error);
 242                 }
 243 
 244                 /* wait for devfsadmd start */
 245                 mutex_enter(&devfsadm_lock);
 246                 while (sdev_door_upcall_filename == NULL) {
 247                         sdcmn_err6(("waiting for dev_door creation, %ld\n",
 248                             expire - ddi_get_lbolt()));
 249                         rv = cv_timedwait_sig(&devfsadm_cv, &devfsadm_lock,
 250                             expire);
 251                         sdcmn_err6(("dev_door wait rv %ld\n", rv));
 252                         if (rv <= 0) {
 253                                 sdcmn_err6(("devfsadmd startup error\n"));
 254                                 mutex_exit(&devfsadm_lock);
 255                                 return (EBADF);
 256                         }
 257                 }




  93 {
  94         mutex_init(&devfsadm_lock, NULL, MUTEX_DEFAULT, NULL);
  95         cv_init(&devfsadm_cv, NULL, CV_DEFAULT, NULL);
  96 }
  97 
  98 void
  99 sdev_devfsadm_lockdestroy(void)
 100 {
 101         mutex_destroy(&devfsadm_lock);
 102         cv_destroy(&devfsadm_cv);
 103 }
 104 
 105 /*
 106  * Wait for node to be created
 107  */
 108 int
 109 sdev_wait4lookup(struct sdev_node *dv, int cmd)
 110 {
 111         clock_t expire;
 112         clock_t rv;
 113         clock_t wakeup = drv_sectohz(2);
 114         int rval = ENOENT;
 115         int is_lookup = (cmd == SDEV_LOOKUP);
 116 
 117         ASSERT(cmd == SDEV_LOOKUP || cmd == SDEV_READDIR);
 118         ASSERT(MUTEX_HELD(&dv->sdev_lookup_lock));
 119 
 120         /* tick value at which wait expires */
 121         expire = ddi_get_lbolt() +
 122             drv_sectohz(dev_node_wait_timeout);
 123 
 124         sdcmn_err6(("wait4lookup %s %s, %ld %d\n",
 125             is_lookup ? "lookup" : "readdir",
 126             dv->sdev_name, expire - ddi_get_lbolt(), dv->sdev_state));
 127 
 128         if (SDEV_IS_LGWAITING(dv)) {
 129                 /* devfsadm nodes */
 130                 while (DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state) &&
 131                     !sdev_devfsadm_revoked()) {
 132                         /* wait 2 sec and check devfsadm completion */
 133                         rv = cv_reltimedwait_sig(&dv->sdev_lookup_cv,
 134                             &dv->sdev_lookup_lock, wakeup, TR_CLOCK_TICK);
 135 
 136                         if (is_lookup && (rv > 0)) {
 137                                 /* was this node constructed ? */
 138                                 if (dv->sdev_state == SDEV_READY) {
 139                                         rval = 0;
 140                                 }
 141                                 sdcmn_err6(("%s: wait done, %screated %d\n",
 142                                     dv->sdev_name, rval ? "not " : "",


 217                         cmn_err(CE_WARN, "unable to start devfsadm - "
 218                             "sysevent error %d\n", se_err);
 219                         break;
 220                 }
 221         }
 222 
 223         sysevent_free(ev);
 224         return (se_err);
 225 }
 226 
 227 static int
 228 sdev_open_upcall_door()
 229 {
 230         int error;
 231         clock_t rv;
 232         clock_t expire;
 233 
 234         ASSERT(sdev_upcall_door == NULL);
 235 
 236         /* timeout expires this many ticks in the future */
 237         expire = ddi_get_lbolt() + drv_sectohz(dev_devfsadm_startup);
 238 
 239         if (sdev_door_upcall_filename == NULL) {
 240                 if ((error = sdev_start_devfsadmd()) != 0) {
 241                         return (error);
 242                 }
 243 
 244                 /* wait for devfsadmd start */
 245                 mutex_enter(&devfsadm_lock);
 246                 while (sdev_door_upcall_filename == NULL) {
 247                         sdcmn_err6(("waiting for dev_door creation, %ld\n",
 248                             expire - ddi_get_lbolt()));
 249                         rv = cv_timedwait_sig(&devfsadm_cv, &devfsadm_lock,
 250                             expire);
 251                         sdcmn_err6(("dev_door wait rv %ld\n", rv));
 252                         if (rv <= 0) {
 253                                 sdcmn_err6(("devfsadmd startup error\n"));
 254                                 mutex_exit(&devfsadm_lock);
 255                                 return (EBADF);
 256                         }
 257                 }