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 ---