Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
infiniband
hw
cxgb4
id_table.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2011 Chelsio Communications. All rights reserved.
3
*
4
* This software is available to you under a choice of one of two
5
* licenses. You may choose to be licensed under the terms of the GNU
6
* General Public License (GPL) Version 2, available from the file
7
* COPYING in the main directory of this source tree, or the
8
* OpenIB.org BSD license below:
9
*
10
* Redistribution and use in source and binary forms, with or
11
* without modification, are permitted provided that the following
12
* conditions are met:
13
*
14
* - Redistributions of source code must retain the above
15
* copyright notice, this list of conditions and the following
16
* disclaimer.
17
*
18
* - Redistributions in binary form must reproduce the above
19
* copyright notice, this list of conditions and the following
20
* disclaimer in the documentation and/or other materials
21
* provided with the distribution.
22
*
23
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
* SOFTWARE.
31
*/
32
#include <linux/kernel.h>
33
#include <linux/random.h>
34
#include "
iw_cxgb4.h
"
35
36
#define RANDOM_SKIP 16
37
38
/*
39
* Trivial bitmap-based allocator. If the random flag is set, the
40
* allocator is designed to:
41
* - pseudo-randomize the id returned such that it is not trivially predictable.
42
* - avoid reuse of recently used id (at the expense of predictability)
43
*/
44
u32
c4iw_id_alloc
(
struct
c4iw_id_table
*alloc)
45
{
46
unsigned
long
flags
;
47
u32
obj;
48
49
spin_lock_irqsave
(&alloc->
lock
, flags);
50
51
obj =
find_next_zero_bit
(alloc->
table
, alloc->
max
, alloc->
last
);
52
if
(obj >= alloc->
max
)
53
obj =
find_first_zero_bit
(alloc->
table
, alloc->
max
);
54
55
if
(obj < alloc->
max
) {
56
if
(alloc->
flags
&
C4IW_ID_TABLE_F_RANDOM
)
57
alloc->
last
+=
random32
() %
RANDOM_SKIP
;
58
else
59
alloc->
last
= obj + 1;
60
if
(alloc->
last
>= alloc->
max
)
61
alloc->
last
= 0;
62
set_bit
(obj, alloc->
table
);
63
obj += alloc->
start
;
64
}
else
65
obj = -1;
66
67
spin_unlock_irqrestore(&alloc->
lock
, flags);
68
return
obj;
69
}
70
71
void
c4iw_id_free
(
struct
c4iw_id_table
*alloc,
u32
obj)
72
{
73
unsigned
long
flags
;
74
75
obj -= alloc->
start
;
76
BUG_ON
((
int
)obj < 0);
77
78
spin_lock_irqsave
(&alloc->
lock
, flags);
79
clear_bit
(obj, alloc->
table
);
80
spin_unlock_irqrestore(&alloc->
lock
, flags);
81
}
82
83
int
c4iw_id_table_alloc
(
struct
c4iw_id_table
*alloc,
u32
start
,
u32
num,
84
u32
reserved
,
u32
flags
)
85
{
86
int
i
;
87
88
alloc->
start
=
start
;
89
alloc->
flags
=
flags
;
90
if
(flags &
C4IW_ID_TABLE_F_RANDOM
)
91
alloc->
last
=
random32
() %
RANDOM_SKIP
;
92
else
93
alloc->
last
= 0;
94
alloc->
max
= num;
95
spin_lock_init
(&alloc->
lock
);
96
alloc->
table
=
kmalloc
(
BITS_TO_LONGS
(num) *
sizeof
(
long
),
97
GFP_KERNEL
);
98
if
(!alloc->
table
)
99
return
-
ENOMEM
;
100
101
bitmap_zero(alloc->
table
, num);
102
if
(!(alloc->
flags
&
C4IW_ID_TABLE_F_EMPTY
))
103
for
(i = 0; i <
reserved
; ++
i
)
104
set_bit
(i, alloc->
table
);
105
106
return
0;
107
}
108
109
void
c4iw_id_table_free
(
struct
c4iw_id_table
*alloc)
110
{
111
kfree
(alloc->
table
);
112
}
Generated on Thu Jan 10 2013 13:37:24 for Linux Kernel by
1.8.2