Changeset 82cbf8c6 in mainline for kernel/generic/src/lib/ra.c
- Timestamp:
- 2017-10-08T19:37:24Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2fd26bb
- Parents:
- 81b9d3e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/lib/ra.c
r81b9d3e r82cbf8c6 50 50 #include <panic.h> 51 51 #include <adt/list.h> 52 #include <adt/hash.h> 52 53 #include <adt/hash_table.h> 53 54 #include <align.h> … … 57 58 static slab_cache_t *ra_segment_cache; 58 59 59 #define USED_BUCKETS 1024 60 61 static size_t used_hash(sysarg_t *key) 62 { 63 return ((*key >> 2) & (USED_BUCKETS - 1)); 64 } 65 66 static bool used_compare(sysarg_t *key, size_t keys, link_t *item) 67 { 68 ra_segment_t *seg; 69 70 seg = hash_table_get_instance(item, ra_segment_t, fu_link); 71 return seg->base == *key; 72 } 73 74 static hash_table_operations_t used_ops = { 60 /** Return the hash of the key stored in the item */ 61 static size_t used_hash(const ht_link_t *item) 62 { 63 ra_segment_t *seg = hash_table_get_inst(item, ra_segment_t, uh_link); 64 return hash_mix(seg->base); 65 } 66 67 /** Return the hash of the key */ 68 static size_t used_key_hash(void *key) 69 { 70 uintptr_t *base = (uintptr_t *) key; 71 return hash_mix(*base); 72 } 73 74 /** Return true if the key is equal to the item's lookup key */ 75 static bool used_key_equal(void *key, const ht_link_t *item) 76 { 77 uintptr_t *base = (sysarg_t *) key; 78 ra_segment_t *seg = hash_table_get_inst(item, ra_segment_t, uh_link); 79 return seg->base == *base; 80 } 81 82 static hash_table_ops_t used_ops = { 75 83 .hash = used_hash, 76 . compare = used_compare,77 . remove_callback = NULL,84 .key_hash = used_key_hash, 85 .key_equal = used_key_equal 78 86 }; 79 87 … … 97 105 98 106 link_initialize(&seg->segment_link); 99 link_initialize(&seg->f u_link);107 link_initialize(&seg->fl_link); 100 108 101 109 seg->base = base; … … 160 168 list_initialize(&span->segments); 161 169 162 hash_table_create(&span->used, USED_BUCKETS, 1, &used_ops);170 hash_table_create(&span->used, 0, 0, &used_ops); 163 171 164 172 for (i = 0; i <= span->max_order; i++) … … 171 179 172 180 /* Insert the first segment into the respective free list. */ 173 list_append(&seg->f u_link, &span->free[span->max_order]);181 list_append(&seg->fl_link, &span->free[span->max_order]); 174 182 175 183 return span; … … 232 240 /* Take the first segment from the free list. */ 233 241 seg = list_get_instance(list_first(&span->free[order]), 234 ra_segment_t, f u_link);242 ra_segment_t, fl_link); 235 243 236 244 assert(seg->flags & RA_SEGMENT_FREE); … … 274 282 &seg->segment_link); 275 283 pred_order = fnzb(ra_segment_size_get(pred)); 276 list_append(&pred->f u_link, &span->free[pred_order]);284 list_append(&pred->fl_link, &span->free[pred_order]); 277 285 } 278 286 if (succ) { … … 282 290 &seg->segment_link); 283 291 succ_order = fnzb(ra_segment_size_get(succ)); 284 list_append(&succ->f u_link, &span->free[succ_order]);292 list_append(&succ->fl_link, &span->free[succ_order]); 285 293 } 286 294 287 295 /* Now remove the found segment from the free list. */ 288 list_remove(&seg->f u_link);296 list_remove(&seg->fl_link); 289 297 seg->base = newbase; 290 298 seg->flags &= ~RA_SEGMENT_FREE; 291 299 292 300 /* Hash-in the segment into the used hash. */ 293 sysarg_t key = seg->base; 294 hash_table_insert(&span->used, &key, &seg->fu_link); 301 hash_table_insert(&span->used, &seg->uh_link); 295 302 296 303 *base = newbase; … … 304 311 { 305 312 sysarg_t key = base; 306 link_t *link;313 ht_link_t *link; 307 314 ra_segment_t *seg; 308 315 ra_segment_t *pred; … … 318 325 PRIxn ", size=%" PRIdn ").", base, size); 319 326 } 320 seg = hash_table_get_inst ance(link, ra_segment_t, fu_link);327 seg = hash_table_get_inst(link, ra_segment_t, uh_link); 321 328 322 329 /* 323 330 * Hash out the segment. 324 331 */ 325 hash_table_remove (&span->used, &key, 1);332 hash_table_remove_item(&span->used, link); 326 333 327 334 assert(!(seg->flags & RA_SEGMENT_FREE)); … … 333 340 */ 334 341 if (list_first(&span->segments) != &seg->segment_link) { 335 pred = hash_table_get_inst ance(seg->segment_link.prev,342 pred = hash_table_get_inst(seg->segment_link.prev, 336 343 ra_segment_t, segment_link); 337 344 … … 345 352 * away. 346 353 */ 347 list_remove(&pred->f u_link);354 list_remove(&pred->fl_link); 348 355 list_remove(&pred->segment_link); 349 356 seg->base = pred->base; … … 355 362 * Check whether the segment can be coalesced with its right neighbor. 356 363 */ 357 succ = hash_table_get_inst ance(seg->segment_link.next, ra_segment_t,364 succ = hash_table_get_inst(seg->segment_link.next, ra_segment_t, 358 365 segment_link); 359 366 assert(succ->base > seg->base); … … 364 371 * and throw it away. 365 372 */ 366 list_remove(&succ->f u_link);373 list_remove(&succ->fl_link); 367 374 list_remove(&succ->segment_link); 368 375 ra_segment_destroy(succ); … … 372 379 seg->flags |= RA_SEGMENT_FREE; 373 380 order = fnzb(ra_segment_size_get(seg)); 374 list_append(&seg->f u_link, &span->free[order]);381 list_append(&seg->fl_link, &span->free[order]); 375 382 } 376 383
Note:
See TracChangeset
for help on using the changeset viewer.