Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
1bbfc20d
Commit
1bbfc20d
authored
Sep 29, 2009
by
Ralf Baechle
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MIPS: VPE: Get rid of BKL.
Signed-off-by:
Ralf Baechle
<
ralf@linux-mips.org
>
parent
c0648e02
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
50 additions
and
42 deletions
+50
-42
arch/mips/kernel/rtlx.c
arch/mips/kernel/rtlx.c
+4
-11
arch/mips/kernel/vpe.c
arch/mips/kernel/vpe.c
+46
-31
No files found.
arch/mips/kernel/rtlx.c
View file @
1bbfc20d
...
...
@@ -72,8 +72,9 @@ static void rtlx_dispatch(void)
*/
static
irqreturn_t
rtlx_interrupt
(
int
irq
,
void
*
dev_id
)
{
unsigned
int
vpeflags
;
unsigned
long
flags
;
int
i
;
unsigned
int
flags
,
vpeflags
;
/* Ought not to be strictly necessary for SMTC builds */
local_irq_save
(
flags
);
...
...
@@ -392,20 +393,12 @@ ssize_t rtlx_write(int index, const void __user *buffer, size_t count)
static
int
file_open
(
struct
inode
*
inode
,
struct
file
*
filp
)
{
int
minor
=
iminor
(
inode
);
int
err
;
lock_kernel
();
err
=
rtlx_open
(
minor
,
(
filp
->
f_flags
&
O_NONBLOCK
)
?
0
:
1
);
unlock_kernel
();
return
err
;
return
rtlx_open
(
iminor
(
inode
),
(
filp
->
f_flags
&
O_NONBLOCK
)
?
0
:
1
);
}
static
int
file_release
(
struct
inode
*
inode
,
struct
file
*
filp
)
{
int
minor
=
iminor
(
inode
);
return
rtlx_release
(
minor
);
return
rtlx_release
(
iminor
(
inode
));
}
static
unsigned
int
file_poll
(
struct
file
*
file
,
poll_table
*
wait
)
...
...
arch/mips/kernel/vpe.c
View file @
1bbfc20d
...
...
@@ -144,13 +144,14 @@ struct tc {
};
struct
{
/* Virtual processing elements */
struct
list_head
vpe_list
;
/* Thread contexts */
struct
list_head
tc_list
;
spinlock_t
vpe_list_lock
;
struct
list_head
vpe_list
;
/* Virtual processing elements */
spinlock_t
tc_list_lock
;
struct
list_head
tc_list
;
/* Thread contexts */
}
vpecontrol
=
{
.
vpe_list_lock
=
SPIN_LOCK_UNLOCKED
,
.
vpe_list
=
LIST_HEAD_INIT
(
vpecontrol
.
vpe_list
),
.
tc_list_lock
=
SPIN_LOCK_UNLOCKED
,
.
tc_list
=
LIST_HEAD_INIT
(
vpecontrol
.
tc_list
)
};
...
...
@@ -159,28 +160,38 @@ static void release_progmem(void *ptr);
/* get the vpe associated with this minor */
static
struct
vpe
*
get_vpe
(
int
minor
)
{
struct
vpe
*
v
;
struct
vpe
*
res
,
*
v
;
if
(
!
cpu_has_mipsmt
)
return
NULL
;
res
=
NULL
;
spin_lock
(
&
vpecontrol
.
vpe_list_lock
);
list_for_each_entry
(
v
,
&
vpecontrol
.
vpe_list
,
list
)
{
if
(
v
->
minor
==
minor
)
return
v
;
if
(
v
->
minor
==
minor
)
{
res
=
v
;
break
;
}
}
spin_unlock
(
&
vpecontrol
.
vpe_list_lock
);
return
NULL
;
return
res
;
}
/* get the vpe associated with this minor */
static
struct
tc
*
get_tc
(
int
index
)
{
struct
tc
*
t
;
struct
tc
*
res
,
*
t
;
res
=
NULL
;
spin_lock
(
&
vpecontrol
.
tc_list_lock
);
list_for_each_entry
(
t
,
&
vpecontrol
.
tc_list
,
list
)
{
if
(
t
->
index
==
index
)
return
t
;
if
(
t
->
index
==
index
)
{
res
=
t
;
break
;
}
}
spin_unlock
(
&
vpecontrol
.
tc_list_lock
);
return
NULL
;
}
...
...
@@ -190,15 +201,17 @@ static struct vpe *alloc_vpe(int minor)
{
struct
vpe
*
v
;
if
((
v
=
kzalloc
(
sizeof
(
struct
vpe
),
GFP_KERNEL
))
==
NULL
)
{
if
((
v
=
kzalloc
(
sizeof
(
struct
vpe
),
GFP_KERNEL
))
==
NULL
)
return
NULL
;
}
INIT_LIST_HEAD
(
&
v
->
tc
);
spin_lock
(
&
vpecontrol
.
vpe_list_lock
);
list_add_tail
(
&
v
->
list
,
&
vpecontrol
.
vpe_list
);
spin_unlock
(
&
vpecontrol
.
vpe_list_lock
);
INIT_LIST_HEAD
(
&
v
->
notify
);
v
->
minor
=
minor
;
return
v
;
}
...
...
@@ -212,7 +225,10 @@ static struct tc *alloc_tc(int index)
INIT_LIST_HEAD
(
&
tc
->
tc
);
tc
->
index
=
index
;
spin_lock
(
&
vpecontrol
.
tc_list_lock
);
list_add_tail
(
&
tc
->
list
,
&
vpecontrol
.
tc_list
);
spin_unlock
(
&
vpecontrol
.
tc_list_lock
);
out:
return
tc
;
...
...
@@ -227,7 +243,7 @@ static void release_vpe(struct vpe *v)
kfree
(
v
);
}
static
void
dump_mtregs
(
void
)
static
void
__maybe_unused
dump_mtregs
(
void
)
{
unsigned
long
val
;
...
...
@@ -1048,20 +1064,19 @@ static int vpe_open(struct inode *inode, struct file *filp)
enum
vpe_state
state
;
struct
vpe_notifications
*
not
;
struct
vpe
*
v
;
int
ret
,
err
=
0
;
int
ret
;
lock_kernel
();
if
(
minor
!=
iminor
(
inode
))
{
/* assume only 1 device at the moment. */
pr
intk
(
KERN_WARNING
"VPE loader: only vpe1 is supported
\n
"
);
err
=
-
ENODEV
;
goto
out
;
pr
_warning
(
"VPE loader: only vpe1 is supported
\n
"
);
return
-
ENODEV
;
}
if
((
v
=
get_vpe
(
tclimit
))
==
NULL
)
{
pr
intk
(
KERN_WARNING
"VPE loader: unable to get vpe
\n
"
);
err
=
-
ENODEV
;
goto
out
;
pr
_warning
(
"VPE loader: unable to get vpe
\n
"
);
return
-
ENODEV
;
}
state
=
xchg
(
&
v
->
state
,
VPE_STATE_INUSE
);
...
...
@@ -1101,8 +1116,8 @@ static int vpe_open(struct inode *inode, struct file *filp)
v
->
shared_ptr
=
NULL
;
v
->
__start
=
0
;
out:
unlock_kernel
();
return
0
;
}
...
...
@@ -1594,14 +1609,14 @@ static void __exit vpe_module_exit(void)
{
struct
vpe
*
v
,
*
n
;
device_del
(
&
vpe_device
);
unregister_chrdev
(
major
,
module_name
);
/* No locking needed here */
list_for_each_entry_safe
(
v
,
n
,
&
vpecontrol
.
vpe_list
,
list
)
{
if
(
v
->
state
!=
VPE_STATE_UNUSED
)
{
if
(
v
->
state
!=
VPE_STATE_UNUSED
)
release_vpe
(
v
);
}
}
device_del
(
&
vpe_device
);
unregister_chrdev
(
major
,
module_name
);
}
module_init
(
vpe_module_init
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment