static void smq_destroy(struct dm_cache_policy *p) { struct smq_policy *mq = to_smq_policy(p); h_exit(&mq->hotspot_table); h_exit(&mq->table); free_bitset(mq->hotspot_hit_bits); free_bitset(mq->cache_hit_bits); space_exit(&mq->es); kfree(mq); }
int main() { pid_t pid; int status; if((pid =fork()) < 0) { printf("fork error!\n"); exit(0); } else if(pid == 0) { printf("Hello from the child process%4d!\n",getpid()); setenv("PS1","CHILD\\$",1); printf("Process%4d: I'm calling exec. \n",getpid()); execl("/bin/sh","/bin/sh","execlCheck.sh",NULL); printf("Process%4d: You should never see this because the child is already gone.\n",getpid()); } else if(pid!= -1) { printf("Hello from the parent process%4d!\n",getpid()); printf("Process%4d: The parent has forked process%d. \n",getpid(),pid); printf("Process%4d: The parent is waiting for the child to exit.\n",getpid()); wait4(pid,&status,0,NULL); h_exit(status); } return 0; }
int main(void) { pid_t pid; int status; if((pid=fork())<0) { printf("fork error!\n"); exit(0); } else if(pid==0) exit(7); if(wait(&status)!=pid) { printf("wait error!\n"); exit(0); } h_exit(status); if((pid=fork())<0) { printf("fork error!\n"); exit(0); } else if(pid==0) exit(1); if(wait(&status)!=pid) { printf("wait error!\n"); exit(0); } h_exit(status); if((pid=fork())<0) { printf("fork error!\n"); exit(0); } else if(pid==0) if(wait(&status)!=pid) { printf("wait error!\n"); exit(0); } h_exit(status); exit(0); }
static struct dm_cache_policy *smq_create(dm_cblock_t cache_size, sector_t origin_size, sector_t cache_block_size) { unsigned i; unsigned nr_sentinels_per_queue = 2u * NR_CACHE_LEVELS; unsigned total_sentinels = 2u * nr_sentinels_per_queue; struct smq_policy *mq = kzalloc(sizeof(*mq), GFP_KERNEL); if (!mq) return NULL; init_policy_functions(mq); mq->cache_size = cache_size; mq->cache_block_size = cache_block_size; calc_hotspot_params(origin_size, cache_block_size, from_cblock(cache_size), &mq->hotspot_block_size, &mq->nr_hotspot_blocks); mq->cache_blocks_per_hotspot_block = div64_u64(mq->hotspot_block_size, mq->cache_block_size); mq->hotspot_level_jump = 1u; if (space_init(&mq->es, total_sentinels + mq->nr_hotspot_blocks + from_cblock(cache_size))) { DMERR("couldn't initialize entry space"); goto bad_pool_init; } init_allocator(&mq->writeback_sentinel_alloc, &mq->es, 0, nr_sentinels_per_queue); for (i = 0; i < nr_sentinels_per_queue; i++) get_entry(&mq->writeback_sentinel_alloc, i)->sentinel = true; init_allocator(&mq->demote_sentinel_alloc, &mq->es, nr_sentinels_per_queue, total_sentinels); for (i = 0; i < nr_sentinels_per_queue; i++) get_entry(&mq->demote_sentinel_alloc, i)->sentinel = true; init_allocator(&mq->hotspot_alloc, &mq->es, total_sentinels, total_sentinels + mq->nr_hotspot_blocks); init_allocator(&mq->cache_alloc, &mq->es, total_sentinels + mq->nr_hotspot_blocks, total_sentinels + mq->nr_hotspot_blocks + from_cblock(cache_size)); mq->hotspot_hit_bits = alloc_bitset(mq->nr_hotspot_blocks); if (!mq->hotspot_hit_bits) { DMERR("couldn't allocate hotspot hit bitset"); goto bad_hotspot_hit_bits; } clear_bitset(mq->hotspot_hit_bits, mq->nr_hotspot_blocks); if (from_cblock(cache_size)) { mq->cache_hit_bits = alloc_bitset(from_cblock(cache_size)); if (!mq->cache_hit_bits) { DMERR("couldn't allocate cache hit bitset"); goto bad_cache_hit_bits; } clear_bitset(mq->cache_hit_bits, from_cblock(mq->cache_size)); } else mq->cache_hit_bits = NULL; mq->tick = 0; spin_lock_init(&mq->lock); q_init(&mq->hotspot, &mq->es, NR_HOTSPOT_LEVELS); mq->hotspot.nr_top_levels = 8; mq->hotspot.nr_in_top_levels = min(mq->nr_hotspot_blocks / NR_HOTSPOT_LEVELS, from_cblock(mq->cache_size) / mq->cache_blocks_per_hotspot_block); q_init(&mq->clean, &mq->es, NR_CACHE_LEVELS); q_init(&mq->dirty, &mq->es, NR_CACHE_LEVELS); stats_init(&mq->hotspot_stats, NR_HOTSPOT_LEVELS); stats_init(&mq->cache_stats, NR_CACHE_LEVELS); if (h_init(&mq->table, &mq->es, from_cblock(cache_size))) goto bad_alloc_table; if (h_init(&mq->hotspot_table, &mq->es, mq->nr_hotspot_blocks)) goto bad_alloc_hotspot_table; sentinels_init(mq); mq->write_promote_level = mq->read_promote_level = NR_HOTSPOT_LEVELS; mq->next_hotspot_period = jiffies; mq->next_cache_period = jiffies; return &mq->policy; bad_alloc_hotspot_table: h_exit(&mq->table); bad_alloc_table: free_bitset(mq->cache_hit_bits); bad_cache_hit_bits: free_bitset(mq->hotspot_hit_bits); bad_hotspot_hit_bits: space_exit(&mq->es); bad_pool_init: kfree(mq); return NULL; }