Lines Matching defs:pool_p

122 	ddi_irm_pool_t	*pool_p;
132 for (pool_p = list_head(&irm_pools_list); pool_p;
133 pool_p = list_next(&irm_pools_list, pool_p))
134 pool_p->ipool_thread = thread_create(NULL, 0,
135 irm_balance_thread, pool_p, 0, &p0, TS_RUN, minclsyspri);
158 ddi_irm_pool_t *pool_p;
178 pool_p = kmem_zalloc(sizeof (ddi_irm_pool_t), KM_SLEEP);
179 pool_p->ipool_owner = dip;
180 pool_p->ipool_policy = irm_default_policy;
181 pool_p->ipool_types = paramsp->iparams_types;
182 pool_p->ipool_totsz = paramsp->iparams_total;
183 pool_p->ipool_defsz = MIN(DDI_MAX_MSIX_ALLOC, MAX(DDI_MIN_MSIX_ALLOC,
185 list_create(&pool_p->ipool_req_list, sizeof (ddi_irm_req_t),
187 list_create(&pool_p->ipool_scratch_list, sizeof (ddi_irm_req_t),
189 cv_init(&pool_p->ipool_cv, NULL, CV_DRIVER, NULL);
190 mutex_init(&pool_p->ipool_lock, NULL, MUTEX_DRIVER, NULL);
191 mutex_init(&pool_p->ipool_navail_lock, NULL, MUTEX_DRIVER, NULL);
195 list_insert_tail(&irm_pools_list, pool_p);
200 pool_p->ipool_thread = thread_create(NULL, 0,
201 irm_balance_thread, pool_p, 0, &p0, TS_RUN, minclsyspri);
203 *pool_retp = pool_p;
216 ndi_irm_resize_pool(ddi_irm_pool_t *pool_p, uint_t new_size)
220 ASSERT(pool_p != NULL);
222 DDI_INTR_IRMDBG((CE_CONT, "ndi_irm_resize_pool: pool_p %p"
224 (void *)pool_p, pool_p->ipool_totsz, new_size));
226 if (pool_p == NULL)
233 mutex_enter(&pool_p->ipool_lock);
241 if ((pool_p->ipool_totsz < new_size) ||
242 (pool_p->ipool_resno <= new_size)) {
244 pool_p->ipool_totsz = new_size;
246 pool_p->ipool_defsz = MIN(DDI_MAX_MSIX_ALLOC,
249 if (pool_p->ipool_reqno > pool_p->ipool_resno)
250 i_ddi_irm_enqueue(pool_p, B_FALSE);
251 mutex_exit(&pool_p->ipool_lock);
255 DDI_INTR_IRMDBG((CE_CONT, "ndi_irm_resize_pool: pool_p %p"
256 " needs a rebalance operation\n", (void *)pool_p));
262 prev_size = pool_p->ipool_totsz;
264 pool_p->ipool_totsz = new_size;
266 i_ddi_irm_enqueue(pool_p, B_TRUE);
272 if (pool_p->ipool_resno > new_size) { /* rebalance failed */
274 pool_p->ipool_totsz = prev_size;
276 i_ddi_irm_enqueue(pool_p, B_FALSE);
277 mutex_exit(&pool_p->ipool_lock);
281 pool_p->ipool_defsz = MIN(DDI_MAX_MSIX_ALLOC,
283 mutex_exit(&pool_p->ipool_lock);
284 DDI_INTR_IRMDBG((CE_CONT, "ndi_irm_resize_pool: pool_p %p"
286 (void *)pool_p, prev_size, pool_p->ipool_totsz));
298 ndi_irm_destroy(ddi_irm_pool_t *pool_p)
300 ASSERT(pool_p != NULL);
301 ASSERT(pool_p->ipool_resno == 0);
303 DDI_INTR_IRMDBG((CE_CONT, "ndi_irm_destroy: pool_p %p\n",
304 (void *)pool_p));
307 if (pool_p == NULL)
311 if (pool_p->ipool_resno != 0)
316 list_remove(&irm_pools_list, pool_p);
320 mutex_enter(&pool_p->ipool_lock);
321 if (pool_p->ipool_thread &&
322 (pool_p->ipool_flags & DDI_IRM_FLAG_ACTIVE)) {
323 pool_p->ipool_flags |= DDI_IRM_FLAG_EXIT;
324 cv_signal(&pool_p->ipool_cv);
325 mutex_exit(&pool_p->ipool_lock);
326 thread_join(pool_p->ipool_thread->t_did);
328 mutex_exit(&pool_p->ipool_lock);
331 cv_destroy(&pool_p->ipool_cv);
332 mutex_destroy(&pool_p->ipool_lock);
333 mutex_destroy(&pool_p->ipool_navail_lock);
334 list_destroy(&pool_p->ipool_req_list);
335 list_destroy(&pool_p->ipool_scratch_list);
336 kmem_free(pool_p, sizeof (ddi_irm_pool_t));
355 ddi_irm_pool_t *pool_p;
378 if ((pool_p = i_ddi_intr_get_pool(dip, type)) == NULL) {
389 MIN(count, i_ddi_intr_get_limit(dip, type, pool_p));
391 npartial = MIN(nreq, pool_p->ipool_defsz);
397 req_p->ireq_pool_p = pool_p;
404 mutex_enter(&pool_p->ipool_lock);
407 if ((pool_p->ipool_minno + nmin) > pool_p->ipool_totsz) {
410 mutex_exit(&pool_p->ipool_lock);
416 pool_p->ipool_reqno += nreq;
417 pool_p->ipool_minno += nmin;
418 i_ddi_irm_insertion_sort(&pool_p->ipool_req_list, req_p);
432 if ((!irm_flag || (pool_p->ipool_flags & DDI_IRM_FLAG_ACTIVE)) &&
433 ((pool_p->ipool_resno + nreq) <= pool_p->ipool_totsz)) {
437 pool_p->ipool_resno += nreq;
442 ((pool_p->ipool_resno + npartial) <= pool_p->ipool_totsz)) {
446 pool_p->ipool_resno += npartial;
449 i_ddi_irm_enqueue(pool_p, B_FALSE);
455 i_ddi_irm_enqueue(pool_p, B_TRUE);
463 pool_p->ipool_reqno -= nreq;
464 pool_p->ipool_minno -= nmin;
465 list_remove(&pool_p->ipool_req_list, req_p);
466 mutex_exit(&pool_p->ipool_lock);
472 mutex_exit(&pool_p->ipool_lock);
488 ddi_irm_pool_t *pool_p;
520 if ((pool_p = req_p->ireq_pool_p) == NULL) {
526 if (nreq > i_ddi_intr_get_limit(dip, type, pool_p)) {
532 mutex_enter(&pool_p->ipool_lock);
554 pool_p->ipool_reqno -= req_p->ireq_nreq;
555 pool_p->ipool_reqno += nreq;
557 pool_p->ipool_minno -= req_p->ireq_navail;
558 pool_p->ipool_resno -= req_p->ireq_navail;
559 pool_p->ipool_minno += nreq;
560 pool_p->ipool_resno += nreq;
566 list_remove(&pool_p->ipool_req_list, req_p);
567 i_ddi_irm_insertion_sort(&pool_p->ipool_req_list, req_p);
570 i_ddi_irm_enqueue(pool_p, B_FALSE);
574 mutex_exit(&pool_p->ipool_lock);
594 ddi_irm_pool_t *pool_p = req_p->ireq_pool_p;
598 ASSERT(MUTEX_HELD(&pool_p->ipool_lock));
604 if ((pool_p->ipool_minno + count) > pool_p->ipool_totsz) {
611 pool_p->ipool_reqno += count;
612 pool_p->ipool_minno += count;
615 if ((pool_p->ipool_resno + count) <= pool_p->ipool_totsz) {
618 pool_p->ipool_resno += count;
623 if ((pool_p->ipool_flags & DDI_IRM_FLAG_ACTIVE) == 0) {
624 pool_p->ipool_reqno -= count;
625 pool_p->ipool_minno -= count;
633 new_req.ireq_pool_p = pool_p;
636 i_ddi_irm_insertion_sort(&pool_p->ipool_req_list, &new_req);
639 i_ddi_irm_enqueue(pool_p, B_TRUE);
645 pool_p->ipool_reqno -= delta;
646 pool_p->ipool_minno -= delta;
649 list_remove(&pool_p->ipool_req_list, req_p);
650 list_remove(&pool_p->ipool_req_list, &new_req);
651 i_ddi_irm_insertion_sort(&pool_p->ipool_req_list, req_p);
665 ddi_irm_pool_t *pool_p;
687 pool_p = req_p->ireq_pool_p;
688 mutex_enter(&pool_p->ipool_lock);
692 pool_p->ipool_minno -= nmin;
693 pool_p->ipool_reqno -= req_p->ireq_nreq;
694 pool_p->ipool_resno -= req_p->ireq_navail;
695 list_remove(&pool_p->ipool_req_list, req_p);
698 i_ddi_irm_enqueue(pool_p, B_FALSE);
701 mutex_exit(&pool_p->ipool_lock);
726 ddi_irm_pool_t *pool_p;
747 pool_p = req_p->ireq_pool_p;
748 mutex_enter(&pool_p->ipool_lock);
757 pool_p->ipool_minno -= (req_p->ireq_nreq - 1);
763 i_ddi_irm_enqueue(pool_p, B_FALSE);
768 nreq = MIN(req_p->ireq_nreq, pool_p->ipool_defsz);
777 pool_p->ipool_reqno -= req_p->ireq_nreq;
778 pool_p->ipool_reqno += nreq;
780 pool_p->ipool_minno -= 1;
781 pool_p->ipool_minno += nreq;
783 pool_p->ipool_minno -= req_p->ireq_nreq;
784 pool_p->ipool_minno += nreq;
789 list_remove(&pool_p->ipool_req_list, req_p);
790 i_ddi_irm_insertion_sort(&pool_p->ipool_req_list, req_p);
793 i_ddi_irm_enqueue(pool_p, B_TRUE);
800 mutex_exit(&pool_p->ipool_lock);
831 irm_balance_thread(ddi_irm_pool_t *pool_p)
835 DDI_INTR_IRMDBG((CE_CONT, "irm_balance_thread: pool_p %p\n",
836 (void *)pool_p));
839 mutex_enter(&pool_p->ipool_lock);
842 if (pool_p->ipool_reqno > pool_p->ipool_resno)
843 i_ddi_irm_balance(pool_p);
846 pool_p->ipool_flags |= DDI_IRM_FLAG_ACTIVE;
860 !(pool_p->ipool_flags & DDI_IRM_FLAG_WAITERS) &&
861 !(pool_p->ipool_flags & DDI_IRM_FLAG_EXIT)) {
862 (void) cv_reltimedwait(&pool_p->ipool_cv,
863 &pool_p->ipool_lock, interval, TR_CLOCK_TICK);
867 if (pool_p->ipool_flags & DDI_IRM_FLAG_EXIT) {
870 mutex_exit(&pool_p->ipool_lock);
875 i_ddi_irm_balance(pool_p);
878 if (pool_p->ipool_flags & DDI_IRM_FLAG_WAITERS) {
879 cv_broadcast(&pool_p->ipool_cv);
880 pool_p->ipool_flags &= ~(DDI_IRM_FLAG_WAITERS);
884 pool_p->ipool_flags &= ~(DDI_IRM_FLAG_QUEUED);
887 cv_wait(&pool_p->ipool_cv, &pool_p->ipool_lock);
901 i_ddi_irm_balance(ddi_irm_pool_t *pool_p)
910 ASSERT(pool_p != NULL);
911 ASSERT(MUTEX_HELD(&pool_p->ipool_lock));
913 DDI_INTR_IRMDBG((CE_CONT, "i_ddi_irm_balance: pool_p %p\n",
914 (void *)pool_p));
917 if ((pool_p->ipool_reqno == pool_p->ipool_resno)) {
919 if ((pool_p->ipool_reqno == pool_p->ipool_resno) && !irm_debug_size) {
927 if (irm_debug_size > pool_p->ipool_minno) {
930 debug_totsz = pool_p->ipool_totsz;
931 pool_p->ipool_totsz = irm_debug_size;
936 debug_policy = pool_p->ipool_policy;
937 pool_p->ipool_policy = irm_debug_policy;
942 mutex_enter(&pool_p->ipool_navail_lock);
948 for (req_p = list_head(&pool_p->ipool_req_list); req_p;
949 req_p = list_next(&pool_p->ipool_req_list, req_p)) {
951 pool_p->ipool_resno -= req_p->ireq_navail;
954 pool_p->ipool_resno += req_p->ireq_navail;
955 list_insert_tail(&pool_p->ipool_scratch_list, req_p);
960 i_ddi_irm_reduce(pool_p);
963 mutex_exit(&pool_p->ipool_navail_lock);
972 req_p = list_head(&pool_p->ipool_scratch_list);
975 (i_ddi_irm_notify(pool_p, req_p) != DDI_SUCCESS)) {
976 list_remove(&pool_p->ipool_scratch_list, req_p);
977 mutex_enter(&pool_p->ipool_navail_lock);
978 i_ddi_irm_reduce(pool_p);
979 mutex_exit(&pool_p->ipool_navail_lock);
980 req_p = list_head(&pool_p->ipool_scratch_list);
982 req_p = list_next(&pool_p->ipool_scratch_list, req_p);
991 while (req_p = list_remove_head(&pool_p->ipool_scratch_list)) {
993 (void) i_ddi_irm_notify(pool_p, req_p);
999 pool_p->ipool_totsz = debug_totsz;
1001 pool_p->ipool_policy = debug_policy;
1011 i_ddi_irm_reduce(ddi_irm_pool_t *pool_p)
1015 ASSERT(pool_p != NULL);
1016 ASSERT(MUTEX_HELD(&pool_p->ipool_lock));
1017 ASSERT(DDI_IRM_POLICY_VALID(pool_p->ipool_policy));
1019 DDI_INTR_IRMDBG((CE_CONT, "i_ddi_irm_reduce: pool_p %p\n",
1020 (void *)pool_p));
1023 if ((imbalance = pool_p->ipool_resno - pool_p->ipool_totsz) <= 0)
1030 if (i_ddi_irm_reduce_by_policy(pool_p, imbalance, pool_p->ipool_policy)
1037 imbalance = pool_p->ipool_resno - pool_p->ipool_totsz;
1041 i_ddi_irm_reduce_new(pool_p, imbalance);
1053 i_ddi_irm_enqueue(ddi_irm_pool_t *pool_p, boolean_t wait_flag)
1055 ASSERT(pool_p != NULL);
1056 ASSERT(MUTEX_HELD(&pool_p->ipool_lock));
1058 DDI_INTR_IRMDBG((CE_CONT, "i_ddi_irm_enqueue: pool_p %p wait_flag %d\n",
1059 (void *)pool_p, (int)wait_flag));
1063 if ((pool_p->ipool_reqno == pool_p->ipool_resno)) {
1065 if ((pool_p->ipool_reqno == pool_p->ipool_resno) && !irm_debug_size) {
1080 pool_p->ipool_flags |= DDI_IRM_FLAG_WAITERS;
1082 if (wait_flag || !(pool_p->ipool_flags & DDI_IRM_FLAG_QUEUED)) {
1083 pool_p->ipool_flags |= DDI_IRM_FLAG_QUEUED;
1084 cv_signal(&pool_p->ipool_cv);
1090 cv_wait(&pool_p->ipool_cv, &pool_p->ipool_lock);
1118 i_ddi_irm_reduce_by_policy(ddi_irm_pool_t *pool_p, int imbalance, int policy)
1120 ASSERT(pool_p != NULL);
1122 ASSERT(MUTEX_HELD(&pool_p->ipool_lock));
1125 list_t *slist_p = &pool_p->ipool_scratch_list;
1128 uint_t pool_defsz = pool_p->ipool_defsz;
1159 pool_p->ipool_resno -= imbalance;
1162 pool_p->ipool_resno -= max_redu;
1191 i_ddi_irm_reduce_new(ddi_irm_pool_t *pool_p, int imbalance)
1195 ASSERT(pool_p != NULL);
1197 ASSERT(MUTEX_HELD(&pool_p->ipool_lock));
1200 "i_ddi_irm_reduce_new: pool_p %p imbalance %d\n",
1201 (void *)pool_p, imbalance));
1203 for (req_p = list_head(&pool_p->ipool_scratch_list); req_p;
1204 req_p = list_next(&pool_p->ipool_scratch_list, req_p)) {
1208 pool_p->ipool_resno -= imbalance;
1232 ddi_irm_pool_t *pool_p;
1241 ((pool_p = req_p->ireq_pool_p) != NULL) &&
1242 (pool_p->ipool_types & type)) {
1243 return (pool_p);
1251 &hdl, (void *)&pool_p) == DDI_SUCCESS)
1252 return (pool_p);
1283 i_ddi_irm_notify(ddi_irm_pool_t *pool_p, ddi_irm_req_t *req_p)
1290 DDI_INTR_IRMDBG((CE_CONT, "i_ddi_irm_notify: pool_p %p req_p %p\n",
1291 (void *)pool_p, (void *)req_p));
1336 pool_p->ipool_resno += (nintrs - req_p->ireq_navail);
1357 ddi_irm_pool_t *pool_p;
1364 ((pool_p = i_ddi_intr_get_pool(dip, type)) != NULL)) {
1365 mutex_enter(&pool_p->ipool_lock);
1366 i_ddi_irm_enqueue(pool_p, wait_flag);
1367 mutex_exit(&pool_p->ipool_lock);