| 138 | } |
| 139 | |
| 140 | uint16_t |
| 141 | sw_event_dequeue_burst(void *port, struct rte_event *ev, uint16_t num, |
| 142 | uint64_t wait) |
| 143 | { |
| 144 | RTE_SET_USED(wait); |
| 145 | struct sw_port *p = (void *)port; |
| 146 | struct rte_event_ring *ring = p->cq_worker_ring; |
| 147 | |
| 148 | /* check that all previous dequeues have been released */ |
| 149 | if (p->implicit_release) { |
| 150 | struct sw_evdev *sw = (void *)p->sw; |
| 151 | uint32_t credit_update_quanta = sw->credit_update_quanta; |
| 152 | uint16_t out_rels = p->outstanding_releases; |
| 153 | uint16_t i; |
| 154 | for (i = 0; i < out_rels; i++) |
| 155 | sw_event_release(p, i); |
| 156 | |
| 157 | /* Replenish credits if enough releases are performed */ |
| 158 | if (p->inflight_credits >= credit_update_quanta * 2) { |
| 159 | rte_atomic32_sub(&sw->inflights, credit_update_quanta); |
| 160 | p->inflight_credits -= credit_update_quanta; |
| 161 | } |
| 162 | } |
| 163 | |
| 164 | /* returns number of events actually dequeued */ |
| 165 | uint16_t ndeq = rte_event_ring_dequeue_burst(ring, ev, num, NULL); |
| 166 | if (unlikely(ndeq == 0)) { |
| 167 | p->zero_polls++; |
| 168 | p->total_polls++; |
| 169 | goto end; |
| 170 | } |
| 171 | |
| 172 | p->outstanding_releases += ndeq; |
| 173 | p->last_dequeue_burst_sz = ndeq; |
| 174 | p->last_dequeue_ticks = rte_get_timer_cycles(); |
| 175 | p->poll_buckets[(ndeq - 1) >> SW_DEQ_STAT_BUCKET_SHIFT]++; |
| 176 | p->total_polls++; |
| 177 | |
| 178 | end: |
| 179 | return ndeq; |
| 180 | } |
| 181 | |
| 182 | uint16_t |
| 183 | sw_event_dequeue(void *port, struct rte_event *ev, uint64_t wait) |
no test coverage detected