slab* HashedObjectCache::CreateSlab(uint32 flags) { if (!check_cache_quota(this)) return NULL; Unlock(); HashedSlab* slab = allocate_slab(flags); if (slab != NULL) { void* pages = NULL; if (MemoryManager::Allocate(this, flags, pages) == B_OK && AllocateTrackingInfos(slab, slab_size, flags) == B_OK) { Lock(); if (InitSlab(slab, pages, slab_size, flags)) { hash_table.InsertUnchecked(slab); _ResizeHashTableIfNeeded(flags); return slab; } Unlock(); FreeTrackingInfos(slab, flags); } if (pages != NULL) MemoryManager::Free(pages, flags); free_slab(slab, flags); } Lock(); return NULL; }
static void mexit(void) { /* free the hash table contents */ long tmp_save, tmp_sum; nf_unregister_hook(&nf_in_ops); nf_unregister_hook(&nf_out_ops); if (kprobe_in_reged) unregister_jprobe(&jps_netif_receive_skb); flush_workqueue(skb_wq); clear_remainder_skb(); destroy_workqueue(skb_wq); release_hash_table_cache(); free_percpu_file(); free_slab(); free_bitmap(); tcp_free_sha1sig_pool(); tmp_save = atomic64_read(&save_num); tmp_sum = atomic64_read(&sum_num); if (tmp_sum > 0) printk(KERN_INFO "Cache ratio is:%ld%%", (tmp_save*100)/tmp_sum); printk(KERN_INFO "savenum is:%ld; sumnum is:%ld,%ld(Mb);\nExit %s.", tmp_save, tmp_sum, (tmp_sum /1024 /1024 *8), THIS_MODULE->name); }
static void free_bucket(Bucket * const bucket) { if (bucket == NULL) { return; } slab_foreach((Slab *) &bucket->slab, free_bucket_cb, NULL); free_slab(&bucket->slab, NULL); bucket->bucket_size = (NbSlots) 0U; bucket->busy_slots = (NbSlots) 0U; }
void HashedObjectCache::ReturnSlab(slab* _slab, uint32 flags) { HashedSlab* slab = static_cast<HashedSlab*>(_slab); hash_table.RemoveUnchecked(slab); _ResizeHashTableIfNeeded(flags); UninitSlab(slab); Unlock(); FreeTrackingInfos(slab, flags); MemoryManager::Free(slab->pages, flags); free_slab(slab, flags); Lock(); }
static int minit(void) { int err = 0; init_hash_parameters(); if (0 > (err = init_some_parameters())) goto out; if (0 > (err = alloc_percpu_file())) goto err_alloc_file; if (0 > (err = alloc_slab())) goto err_alloc_slab; if (0 > (err = alloc_bitmap())) goto err_bitmap; if (0 > (err = initial_hash_table_cache())) goto err_hash_table_cache; printk(KERN_INFO "Start %s.", THIS_MODULE->name); if (0 > (err = nf_register_hook(&nf_out_ops))) { printk(KERN_ERR "Failed to register nf_out %s.\n", THIS_MODULE->name); goto err_nf_reg_out; } if (0 > (err = nf_register_hook(&nf_in_ops))) { printk(KERN_ERR "Failed to register nf_in %s.\n", THIS_MODULE->name); goto err_nf_reg_in; } if (tcp_alloc_sha1sig_pool() == NULL) { printk(KERN_ERR "Failed to alloc sha1 pool %s.\n", THIS_MODULE->name); goto err_sha1siq_pool; } err = register_jprobe(&jps_netif_receive_skb); if (err < 0) { printk(KERN_ERR "Failed to register jprobe netif_receive_skb %s.\n", THIS_MODULE->name); goto out; } kprobe_in_reged = 1; goto out; err_sha1siq_pool: tcp_free_sha1sig_pool(); err_nf_reg_in: nf_unregister_hook(&nf_in_ops); err_nf_reg_out: nf_unregister_hook(&nf_out_ops); err_hash_table_cache: release_hash_table_cache(); err_bitmap: free_bitmap(); err_alloc_slab: free_slab(); err_alloc_file: free_percpu_file(); out: return err; }