Lines Matching refs:cache_seg

8 static inline struct pcache_segment_info *get_seg_info_addr(struct pcache_cache_segment *cache_seg)  in get_seg_info_addr()  argument
11 u32 seg_id = cache_seg->segment.seg_id; in get_seg_info_addr()
14 seg_addr = CACHE_DEV_SEGMENT(cache_seg->cache->cache_dev, seg_id); in get_seg_info_addr()
15 seg_info_addr = seg_addr + PCACHE_SEG_INFO_SIZE * cache_seg->info_index; in get_seg_info_addr()
20 static void cache_seg_info_write(struct pcache_cache_segment *cache_seg) in cache_seg_info_write() argument
23 struct pcache_segment_info *seg_info = &cache_seg->cache_seg_info; in cache_seg_info_write()
25 mutex_lock(&cache_seg->info_lock); in cache_seg_info_write()
29 cache_seg->info_index = (cache_seg->info_index + 1) % PCACHE_META_INDEX_MAX; in cache_seg_info_write()
31 seg_info_addr = get_seg_info_addr(cache_seg); in cache_seg_info_write()
34 mutex_unlock(&cache_seg->info_lock); in cache_seg_info_write()
37 static int cache_seg_info_load(struct pcache_cache_segment *cache_seg) in cache_seg_info_load() argument
40 struct pcache_cache_dev *cache_dev = cache_seg->cache->cache_dev; in cache_seg_info_load()
42 u32 seg_id = cache_seg->segment.seg_id; in cache_seg_info_load()
47 mutex_lock(&cache_seg->info_lock); in cache_seg_info_load()
51 &cache_seg->cache_seg_info); in cache_seg_info_load()
60 cache_seg->info_index = in cache_seg_info_load()
64 mutex_unlock(&cache_seg->info_lock); in cache_seg_info_load()
68 cache_seg->segment.seg_id, ret); in cache_seg_info_load()
72 static int cache_seg_ctrl_load(struct pcache_cache_segment *cache_seg) in cache_seg_ctrl_load() argument
74 struct pcache_cache_seg_ctrl *cache_seg_ctrl = cache_seg->cache_seg_ctrl; in cache_seg_ctrl_load()
88 cache_seg->gen = 0; in cache_seg_ctrl_load()
89 cache_seg->gen_seq = 0; in cache_seg_ctrl_load()
90 cache_seg->gen_index = 0; in cache_seg_ctrl_load()
94 cache_seg->gen = cache_seg_gen.gen; in cache_seg_ctrl_load()
95 cache_seg->gen_seq = cache_seg_gen.header.seq; in cache_seg_ctrl_load()
96 cache_seg->gen_index = (cache_seg_gen_addr - cache_seg_ctrl->gen); in cache_seg_ctrl_load()
102 … inline struct pcache_cache_seg_gen *get_cache_seg_gen_addr(struct pcache_cache_segment *cache_seg) in get_cache_seg_gen_addr() argument
104 struct pcache_cache_seg_ctrl *cache_seg_ctrl = cache_seg->cache_seg_ctrl; in get_cache_seg_gen_addr()
106 return (cache_seg_ctrl->gen + cache_seg->gen_index); in get_cache_seg_gen_addr()
126 static void cache_seg_ctrl_write(struct pcache_cache_segment *cache_seg) in cache_seg_ctrl_write() argument
130 cache_seg_gen.gen = cache_seg->gen; in cache_seg_ctrl_write()
131 cache_seg_gen.header.seq = ++cache_seg->gen_seq; in cache_seg_ctrl_write()
135 cache_seg->gen_index = (cache_seg->gen_index + 1) % PCACHE_META_INDEX_MAX; in cache_seg_ctrl_write()
137 …memcpy_flushcache(get_cache_seg_gen_addr(cache_seg), &cache_seg_gen, sizeof(struct pcache_cache_se… in cache_seg_ctrl_write()
141 static void cache_seg_ctrl_init(struct pcache_cache_segment *cache_seg) in cache_seg_ctrl_init() argument
143 cache_seg->gen = 0; in cache_seg_ctrl_init()
144 cache_seg->gen_seq = 0; in cache_seg_ctrl_init()
145 cache_seg->gen_index = 0; in cache_seg_ctrl_init()
146 cache_seg_ctrl_write(cache_seg); in cache_seg_ctrl_init()
149 static int cache_seg_meta_load(struct pcache_cache_segment *cache_seg) in cache_seg_meta_load() argument
153 ret = cache_seg_info_load(cache_seg); in cache_seg_meta_load()
157 ret = cache_seg_ctrl_load(cache_seg); in cache_seg_meta_load()
175 void cache_seg_set_next_seg(struct pcache_cache_segment *cache_seg, u32 seg_id) in cache_seg_set_next_seg() argument
177 cache_seg->cache_seg_info.flags |= PCACHE_SEG_INFO_FLAGS_HAS_NEXT; in cache_seg_set_next_seg()
178 cache_seg->cache_seg_info.next_seg = seg_id; in cache_seg_set_next_seg()
179 cache_seg_info_write(cache_seg); in cache_seg_set_next_seg()
186 struct pcache_cache_segment *cache_seg = &cache->segments[cache_seg_id]; in cache_seg_init() local
188 struct pcache_segment *segment = &cache_seg->segment; in cache_seg_init()
191 cache_seg->cache = cache; in cache_seg_init()
192 cache_seg->cache_seg_id = cache_seg_id; in cache_seg_init()
193 spin_lock_init(&cache_seg->gen_lock); in cache_seg_init()
194 atomic_set(&cache_seg->refs, 0); in cache_seg_init()
195 mutex_init(&cache_seg->info_lock); in cache_seg_init()
201 seg_options.seg_info = &cache_seg->cache_seg_info; in cache_seg_init()
204 cache_seg->cache_seg_ctrl = CACHE_DEV_SEGMENT(cache_dev, seg_id) + PCACHE_CACHE_SEG_CTRL_OFF; in cache_seg_init()
211 cache_seg_ctrl_init(cache_seg); in cache_seg_init()
213 cache_seg->info_index = 0; in cache_seg_init()
214 cache_seg_info_write(cache_seg); in cache_seg_init()
220 ret = cache_seg_meta_load(cache_seg); in cache_seg_init()
241 struct pcache_cache_segment *cache_seg; in get_cache_segment() local
266 cache_seg = &cache->segments[seg_id]; in get_cache_segment()
267 cache_seg->cache_seg_id = seg_id; in get_cache_segment()
269 return cache_seg; in get_cache_segment()
272 static void cache_seg_gen_increase(struct pcache_cache_segment *cache_seg) in cache_seg_gen_increase() argument
274 spin_lock(&cache_seg->gen_lock); in cache_seg_gen_increase()
275 cache_seg->gen++; in cache_seg_gen_increase()
276 spin_unlock(&cache_seg->gen_lock); in cache_seg_gen_increase()
278 cache_seg_ctrl_write(cache_seg); in cache_seg_gen_increase()
281 void cache_seg_get(struct pcache_cache_segment *cache_seg) in cache_seg_get() argument
283 atomic_inc(&cache_seg->refs); in cache_seg_get()
286 static void cache_seg_invalidate(struct pcache_cache_segment *cache_seg) in cache_seg_invalidate() argument
290 cache = cache_seg->cache; in cache_seg_invalidate()
291 cache_seg_gen_increase(cache_seg); in cache_seg_invalidate()
296 __clear_bit(cache_seg->cache_seg_id, cache->seg_map); in cache_seg_invalidate()
304 void cache_seg_put(struct pcache_cache_segment *cache_seg) in cache_seg_put() argument
306 if (atomic_dec_and_test(&cache_seg->refs)) in cache_seg_put()
307 cache_seg_invalidate(cache_seg); in cache_seg_put()