* Frees all outstanding items in a bucket * * Arguments: * zone The zone to free to, must be unlocked. * bucket The free/alloc bucket with items. * * Returns: * Nothing */
| 1142 | * Nothing |
| 1143 | */ |
| 1144 | static void |
| 1145 | bucket_drain(uma_zone_t zone, uma_bucket_t bucket) |
| 1146 | { |
| 1147 | int i; |
| 1148 | |
| 1149 | if (bucket->ub_cnt == 0) |
| 1150 | return; |
| 1151 | |
| 1152 | if ((zone->uz_flags & UMA_ZONE_SMR) != 0 && |
| 1153 | bucket->ub_seq != SMR_SEQ_INVALID) { |
| 1154 | smr_wait(zone->uz_smr, bucket->ub_seq); |
| 1155 | bucket->ub_seq = SMR_SEQ_INVALID; |
| 1156 | for (i = 0; i < bucket->ub_cnt; i++) |
| 1157 | item_dtor(zone, bucket->ub_bucket[i], |
| 1158 | zone->uz_size, NULL, SKIP_NONE); |
| 1159 | } |
| 1160 | if (zone->uz_fini) |
| 1161 | for (i = 0; i < bucket->ub_cnt; i++) |
| 1162 | zone->uz_fini(bucket->ub_bucket[i], zone->uz_size); |
| 1163 | zone->uz_release(zone->uz_arg, bucket->ub_bucket, bucket->ub_cnt); |
| 1164 | if (zone->uz_max_items > 0) |
| 1165 | zone_free_limit(zone, bucket->ub_cnt); |
| 1166 | #ifdef INVARIANTS |
| 1167 | bzero(bucket->ub_bucket, sizeof(void *) * bucket->ub_cnt); |
| 1168 | #endif |
| 1169 | bucket->ub_cnt = 0; |
| 1170 | } |
| 1171 | |
| 1172 | /* |
| 1173 | * Drains the per cpu caches for a zone. |
no test coverage detected