Print this page
XXXX cpudrv attach error handling is leaky

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/cpudrv.c
          +++ new/usr/src/uts/common/io/cpudrv.c
↓ open down ↓ 306 lines elided ↑ open up ↑
 307  307                          return (DDI_FAILURE);
 308  308                  }
 309  309  
 310  310                  /*
 311  311                   * Taskq is used to dispatch routine to monitor CPU
 312  312                   * activities.
 313  313                   */
 314  314                  cpudsp->cpudrv_pm.tq = ddi_taskq_create(dip,
 315  315                      "cpudrv_monitor", CPUDRV_TASKQ_THREADS,
 316  316                      TASKQ_DEFAULTPRI, 0);
      317 +                if (cpudsp->cpudrv_pm.tq == NULL) {
      318 +                        cpudrv_enabled = B_FALSE;
      319 +                        cpudrv_free(cpudsp);
      320 +                        ddi_soft_state_free(cpudrv_state, instance);
      321 +                        return (DDI_FAILURE);
      322 +                }
 317  323  
 318  324                  mutex_init(&cpudsp->cpudrv_pm.timeout_lock, NULL,
 319  325                      MUTEX_DRIVER, NULL);
 320  326                  cv_init(&cpudsp->cpudrv_pm.timeout_cv, NULL,
 321  327                      CV_DEFAULT, NULL);
 322  328  
 323  329                  /*
 324  330                   * Driver needs to assume that CPU is running at
 325  331                   * unknown speed at DDI_ATTACH and switch it to the
 326  332                   * needed speed. We assume that initial needed speed
↓ open down ↓ 14 lines elided ↑ open up ↑
 341  347                   * unknown speed and moves CPU to top speed when it
 342  348                   * has been initialized.
 343  349                   */
 344  350                  CPUDRV_MONITOR_INIT(cpudsp);
 345  351                  mutex_exit(&cpudsp->lock);
 346  352  
 347  353                  if (!cpudrv_mach_init(cpudsp)) {
 348  354                          cmn_err(CE_WARN, "cpudrv_attach: instance %d: "
 349  355                              "cpudrv_mach_init failed", instance);
 350  356                          cpudrv_enabled = B_FALSE;
      357 +                        ddi_taskq_destroy(cpudsp->cpudrv_pm.tq);
 351  358                          cpudrv_free(cpudsp);
 352  359                          ddi_soft_state_free(cpudrv_state, instance);
 353  360                          return (DDI_FAILURE);
 354  361                  }
 355  362  
 356  363                  CPUDRV_INSTALL_MAX_CHANGE_HANDLER(cpudsp);
 357  364  
 358  365                  (void) ddi_prop_update_int(DDI_DEV_T_NONE, dip,
 359  366                      DDI_NO_AUTODETACH, 1);
 360  367                  ddi_report_dev(dip);
↓ open down ↓ 845 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX