sbitmap.c (b78beea038a3087df63bba7adaacb476a8ca95af) | sbitmap.c (661d4f55a79483aee4970a76e3bd9d4cdc74ac79) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2016 Facebook 4 * Copyright (C) 2013-2014 Jens Axboe 5 */ 6 7#include <linux/sched.h> 8#include <linux/random.h> 9#include <linux/sbitmap.h> 10#include <linux/seq_file.h> 11 12/* 13 * See if we have deferred clears that we can batch move 14 */ 15static inline bool sbitmap_deferred_clear(struct sbitmap_word *map) 16{ 17 unsigned long mask, val; | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2016 Facebook 4 * Copyright (C) 2013-2014 Jens Axboe 5 */ 6 7#include <linux/sched.h> 8#include <linux/random.h> 9#include <linux/sbitmap.h> 10#include <linux/seq_file.h> 11 12/* 13 * See if we have deferred clears that we can batch move 14 */ 15static inline bool sbitmap_deferred_clear(struct sbitmap_word *map) 16{ 17 unsigned long mask, val; |
18 bool ret = false; 19 unsigned long flags; | |
20 | 18 |
21 spin_lock_irqsave(&map->swap_lock, flags); | 19 if (!READ_ONCE(map->cleared)) 20 return false; |
22 | 21 |
23 if (!map->cleared) 24 goto out_unlock; 25 | |
26 /* 27 * First get a stable cleared mask, setting the old mask to 0. 28 */ 29 mask = xchg(&map->cleared, 0); 30 31 /* 32 * Now clear the masked bits in our free word 33 */ 34 do { 35 val = map->word; 36 } while (cmpxchg(&map->word, val, val & ~mask) != val); 37 | 22 /* 23 * First get a stable cleared mask, setting the old mask to 0. 24 */ 25 mask = xchg(&map->cleared, 0); 26 27 /* 28 * Now clear the masked bits in our free word 29 */ 30 do { 31 val = map->word; 32 } while (cmpxchg(&map->word, val, val & ~mask) != val); 33 |
38 ret = true; 39out_unlock: 40 spin_unlock_irqrestore(&map->swap_lock, flags); 41 return ret; | 34 return true; |
42} 43 44int sbitmap_init_node(struct sbitmap *sb, unsigned int depth, int shift, 45 gfp_t flags, int node) 46{ 47 unsigned int bits_per_word; 48 unsigned int i; 49 --- 25 unchanged lines hidden (view full) --- 75 76 sb->map = kcalloc_node(sb->map_nr, sizeof(*sb->map), flags, node); 77 if (!sb->map) 78 return -ENOMEM; 79 80 for (i = 0; i < sb->map_nr; i++) { 81 sb->map[i].depth = min(depth, bits_per_word); 82 depth -= sb->map[i].depth; | 35} 36 37int sbitmap_init_node(struct sbitmap *sb, unsigned int depth, int shift, 38 gfp_t flags, int node) 39{ 40 unsigned int bits_per_word; 41 unsigned int i; 42 --- 25 unchanged lines hidden (view full) --- 68 69 sb->map = kcalloc_node(sb->map_nr, sizeof(*sb->map), flags, node); 70 if (!sb->map) 71 return -ENOMEM; 72 73 for (i = 0; i < sb->map_nr; i++) { 74 sb->map[i].depth = min(depth, bits_per_word); 75 depth -= sb->map[i].depth; |
83 spin_lock_init(&sb->map[i].swap_lock); | |
84 } 85 return 0; 86} 87EXPORT_SYMBOL_GPL(sbitmap_init_node); 88 89void sbitmap_resize(struct sbitmap *sb, unsigned int depth) 90{ 91 unsigned int bits_per_word = 1U << sb->shift; --- 601 unchanged lines hidden --- | 76 } 77 return 0; 78} 79EXPORT_SYMBOL_GPL(sbitmap_init_node); 80 81void sbitmap_resize(struct sbitmap *sb, unsigned int depth) 82{ 83 unsigned int bits_per_word = 1U << sb->shift; --- 601 unchanged lines hidden --- |