Lines Matching refs:ringp

125 mac_soft_ring_worker_wakeup(mac_soft_ring_t *ringp)
127 ASSERT(MUTEX_HELD(&ringp->s_ring_lock));
128 if (!(ringp->s_ring_state & S_RING_PROC) &&
129 !(ringp->s_ring_state & S_RING_BLANK) &&
130 (ringp->s_ring_tid == NULL)) {
131 if (ringp->s_ring_wait != 0) {
132 ringp->s_ring_tid =
133 timeout(mac_soft_ring_fire, ringp,
134 ringp->s_ring_wait);
137 cv_signal(&ringp->s_ring_async);
154 mac_soft_ring_t *ringp;
158 ringp = kmem_cache_alloc(mac_soft_ring_cache, KM_SLEEP);
175 bzero(ringp, sizeof (mac_soft_ring_t));
176 (void) strncpy(ringp->s_ring_name, name, S_RING_NAMELEN + 1);
177 ringp->s_ring_name[S_RING_NAMELEN] = '\0';
178 mutex_init(&ringp->s_ring_lock, NULL, MUTEX_DEFAULT, NULL);
179 ringp->s_ring_notify_cb_info.mcbi_lockp = &ringp->s_ring_lock;
181 ringp->s_ring_type = type;
182 ringp->s_ring_wait = MSEC_TO_TICK(wait);
183 ringp->s_ring_mcip = mcip;
184 ringp->s_ring_set = mac_srs;
191 ADD_SOFTRING_TO_SET(mac_srs, ringp);
198 ringp->s_ring_cpuid = ringp->s_ring_cpuid_save = -1;
199 ringp->s_ring_worker = thread_create(NULL, 0,
200 mac_soft_ring_worker, ringp, 0, &p0, TS_RUN, pri);
202 ringp->s_ring_drain_func = mac_tx_soft_ring_drain;
203 ringp->s_ring_tx_arg1 = x_arg1;
204 ringp->s_ring_tx_arg2 = x_arg2;
205 ringp->s_ring_tx_max_q_cnt = mac_tx_soft_ring_max_q_cnt;
206 ringp->s_ring_tx_hiwat =
215 ringp;
218 ringp->s_ring_drain_func = mac_rx_soft_ring_drain;
219 ringp->s_ring_rx_func = rx_func;
220 ringp->s_ring_rx_arg1 = x_arg1;
221 ringp->s_ring_rx_arg2 = x_arg2;
223 ringp->s_ring_type |= ST_RING_WORKER_ONLY;
226 (void) mac_soft_ring_bind(ringp, cpuid);
228 mac_soft_ring_stat_create(ringp);
230 return (ringp);
259 mac_soft_ring_bind(mac_soft_ring_t *ringp, processorid_t cpuid)
268 mac_soft_ring_t *, ringp);
276 mutex_enter(&ringp->s_ring_lock);
277 ringp->s_ring_state |= S_RING_BOUND;
278 if (ringp->s_ring_cpuid != -1)
280 ringp->s_ring_cpuid = cpuid;
281 mutex_exit(&ringp->s_ring_lock);
284 thread_affinity_clear(ringp->s_ring_worker);
287 ringp, processorid_t, cpuid);
289 thread_affinity_set(ringp->s_ring_worker, cpuid);
300 mac_soft_ring_unbind(mac_soft_ring_t *ringp)
304 mutex_enter(&ringp->s_ring_lock);
305 if (!(ringp->s_ring_state & S_RING_BOUND)) {
306 ASSERT(ringp->s_ring_cpuid == -1);
307 mutex_exit(&ringp->s_ring_lock);
311 ringp->s_ring_cpuid = -1;
312 ringp->s_ring_state &= ~S_RING_BOUND;
313 thread_affinity_clear(ringp->s_ring_worker);
314 mutex_exit(&ringp->s_ring_lock);
324 mac_soft_ring_t *ringp = arg;
326 mutex_enter(&ringp->s_ring_lock);
327 if (ringp->s_ring_tid == 0) {
328 mutex_exit(&ringp->s_ring_lock);
332 ringp->s_ring_tid = 0;
334 if (!(ringp->s_ring_state & S_RING_PROC)) {
335 cv_signal(&ringp->s_ring_async);
337 mutex_exit(&ringp->s_ring_lock);
351 mac_rx_soft_ring_drain(mac_soft_ring_t *ringp)
360 mac_soft_ring_set_t *mac_srs = ringp->s_ring_set;
362 ringp->s_ring_run = curthread;
363 ASSERT(mutex_owned(&ringp->s_ring_lock));
364 ASSERT(!(ringp->s_ring_state & S_RING_PROC));
366 if ((tid = ringp->s_ring_tid) != 0)
367 ringp->s_ring_tid = 0;
369 ringp->s_ring_state |= S_RING_PROC;
371 proc = ringp->s_ring_rx_func;
372 arg1 = ringp->s_ring_rx_arg1;
373 arg2 = ringp->s_ring_rx_arg2;
375 while ((ringp->s_ring_first != NULL) &&
376 !(ringp->s_ring_state & S_RING_PAUSE)) {
377 mp = ringp->s_ring_first;
378 ringp->s_ring_first = NULL;
379 ringp->s_ring_last = NULL;
380 cnt = ringp->s_ring_count;
381 ringp->s_ring_count = 0;
382 sz = ringp->s_ring_size;
383 ringp->s_ring_size = 0;
384 mutex_exit(&ringp->s_ring_lock);
407 mutex_enter(&ringp->s_ring_lock);
409 ringp->s_ring_state &= ~S_RING_PROC;
410 if (ringp->s_ring_state & S_RING_CLIENT_WAIT)
411 cv_signal(&ringp->s_ring_client_cv);
412 ringp->s_ring_run = NULL;
424 mac_soft_ring_worker(mac_soft_ring_t *ringp)
426 kmutex_t *lock = &ringp->s_ring_lock;
427 kcondvar_t *async = &ringp->s_ring_async;
428 mac_soft_ring_set_t *srs = ringp->s_ring_set;
435 while (((ringp->s_ring_first == NULL ||
436 (ringp->s_ring_state & (S_RING_BLOCK|S_RING_BLANK))) &&
437 !(ringp->s_ring_state & S_RING_PAUSE)) ||
438 (ringp->s_ring_state & S_RING_PROC)) {
449 if (ringp->s_ring_state & S_RING_PAUSE)
452 ringp->s_ring_drain_func(ringp);
459 ringp->s_ring_state |= S_RING_QUIESCE_DONE;
460 if (!(ringp->s_ring_state & S_RING_CONDEMNED)) {
464 while (!(ringp->s_ring_state &
466 cv_wait(&ringp->s_ring_async, &ringp->s_ring_lock);
471 if (ringp->s_ring_state & S_RING_RESTART) {
472 ASSERT(!(ringp->s_ring_state & S_RING_CONDEMNED));
473 ringp->s_ring_state &= ~(S_RING_RESTART |
480 ASSERT(ringp->s_ring_state & S_RING_CONDEMNED);
481 ringp->s_ring_state |= S_RING_CONDEMNED_DONE;
503 mac_soft_ring_t *ringp = (mac_soft_ring_t *)arg;
504 mutex_enter(&ringp->s_ring_lock);
505 ringp->s_ring_state &= ~S_RING_BLANK;
506 if (ringp->s_ring_first != NULL)
507 mac_soft_ring_worker_wakeup(ringp);
508 mutex_exit(&ringp->s_ring_lock);
514 mac_soft_ring_t *ringp = (mac_soft_ring_t *)arg;
520 mutex_enter(&ringp->s_ring_lock);
521 if (!(ringp->s_ring_state & S_RING_PROC)) {
522 ringp->s_ring_state |= S_RING_BLANK;
525 mutex_exit(&ringp->s_ring_lock);
538 mac_soft_ring_poll(mac_soft_ring_t *ringp, int bytes_to_pickup)
544 mac_soft_ring_set_t *mac_srs = ringp->s_ring_set;
548 mutex_enter(&ringp->s_ring_lock);
549 head = tail = mp = ringp->s_ring_first;
551 mutex_exit(&ringp->s_ring_lock);
555 if (ringp->s_ring_size <= bytes_to_pickup) {
556 head = ringp->s_ring_first;
557 ringp->s_ring_first = NULL;
558 ringp->s_ring_last = NULL;
559 cnt = ringp->s_ring_count;
560 ringp->s_ring_count = 0;
561 sz = ringp->s_ring_size;
562 ringp->s_ring_size = 0;
570 ringp->s_ring_count -= cnt;
571 ringp->s_ring_size -= sz;
574 ringp->s_ring_first = NULL;
575 ringp->s_ring_last = NULL;
576 ASSERT(ringp->s_ring_count == 0);
578 ringp->s_ring_first = mp;
582 mutex_exit(&ringp->s_ring_lock);
648 mac_tx_soft_ring_drain(mac_soft_ring_t *ringp)
656 mac_soft_ring_set_t *mac_srs = ringp->s_ring_set;
659 ringp->s_ring_run = curthread;
660 ASSERT(mutex_owned(&ringp->s_ring_lock));
661 ASSERT(!(ringp->s_ring_state & S_RING_PROC));
663 ringp->s_ring_state |= S_RING_PROC;
664 arg1 = ringp->s_ring_tx_arg1;
665 arg2 = ringp->s_ring_tx_arg2;
667 while (ringp->s_ring_first != NULL) {
668 mp = ringp->s_ring_first;
669 tail = ringp->s_ring_last;
670 saved_pkt_count = ringp->s_ring_count;
671 saved_size = ringp->s_ring_size;
672 ringp->s_ring_first = NULL;
673 ringp->s_ring_last = NULL;
674 ringp->s_ring_count = 0;
675 ringp->s_ring_size = 0;
676 mutex_exit(&ringp->s_ring_lock);
680 mutex_enter(&ringp->s_ring_lock);
683 tail->b_next = ringp->s_ring_first;
684 ringp->s_ring_first = mp;
685 ringp->s_ring_count +=
687 ringp->s_ring_size += (saved_size - stats.mts_obytes);
688 if (ringp->s_ring_last == NULL)
689 ringp->s_ring_last = tail;
691 if (ringp->s_ring_tx_woken_up) {
692 ringp->s_ring_tx_woken_up = B_FALSE;
694 ringp->s_ring_state |= S_RING_BLOCK;
695 ringp->s_st_stat.mts_blockcnt++;
698 ringp->s_ring_state &= ~S_RING_PROC;
699 ringp->s_ring_run = NULL;
702 ringp->s_ring_tx_woken_up = B_FALSE;
704 SOFTRING_TX_STATS_UPDATE(ringp, &stats);
708 if (ringp->s_ring_count == 0 && ringp->s_ring_state &
710 mac_client_impl_t *mcip = ringp->s_ring_mcip;
713 if (ringp->s_ring_state &
717 ringp->s_ring_state &=
719 mutex_exit(&ringp->s_ring_lock);
721 mac_tx_invoke_callbacks(mcip, (mac_tx_cookie_t)ringp);
730 mutex_enter(&ringp->s_ring_lock);
732 ringp->s_ring_state &= ~S_RING_PROC;
733 ringp->s_ring_run = NULL;