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
nexedi
linux
Commits
a9a677ac
Commit
a9a677ac
authored
Jun 12, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge penguin:v2.5/linux
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
4c6924d4
f39fc866
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
77 additions
and
48 deletions
+77
-48
drivers/block/ll_rw_blk.c
drivers/block/ll_rw_blk.c
+68
-39
drivers/ide/tcq.c
drivers/ide/tcq.c
+1
-1
include/linux/blkdev.h
include/linux/blkdev.h
+7
-7
include/sound/ac97_codec.h
include/sound/ac97_codec.h
+1
-1
No files found.
drivers/block/ll_rw_blk.c
View file @
a9a677ac
...
...
@@ -49,6 +49,9 @@ extern int mac_floppy_init(void);
*/
static
kmem_cache_t
*
request_cachep
;
/*
* plug management
*/
static
struct
list_head
blk_plug_list
;
static
spinlock_t
blk_plug_lock
__cacheline_aligned_in_smp
=
SPIN_LOCK_UNLOCKED
;
...
...
@@ -296,6 +299,27 @@ void blk_queue_assign_lock(request_queue_t *q, spinlock_t *lock)
q
->
queue_lock
=
lock
;
}
/**
* blk_queue_find_tag - find a request by its tag and queue
*
* @q: The request queue for the device
* @tag: The tag of the request
*
* Notes:
* Should be used when a device returns a tag and you want to match
* it with a request.
*
* no locks need be held.
**/
struct
request
*
blk_queue_find_tag
(
request_queue_t
*
q
,
int
tag
)
{
struct
blk_queue_tag
*
bqt
=
q
->
queue_tags
;
if
(
unlikely
(
bqt
==
NULL
||
bqt
->
max_depth
<
tag
))
return
NULL
;
return
bqt
->
tag_index
[
tag
];
}
/**
* blk_queue_free_tags - release tag maintenance info
* @q: the request queue for the device
...
...
@@ -429,10 +453,12 @@ void blk_queue_end_tag(request_queue_t *q, struct request *rq)
* Description:
* This can either be used as a stand-alone helper, or possibly be
* assigned as the queue &prep_rq_fn (in which case &struct request
* automagically gets a tag assigned). Note that this function assumes
* that only REQ_CMD requests can be queued! The request will also be
* removed from the request queue, so it's the drivers responsibility to
* readd it if it should need to be restarted for some reason.
* automagically gets a tag assigned). Note that this function
* assumes that any type of request can be queued! if this is not
* true for your device, you must check the request type before
* calling this function. The request will also be removed from
* the request queue, so it's the drivers responsibility to readd
* it if it should need to be restarted for some reason.
*
* Notes:
* queue lock must be held.
...
...
@@ -443,8 +469,12 @@ int blk_queue_start_tag(request_queue_t *q, struct request *rq)
unsigned
long
*
map
=
bqt
->
tag_map
;
int
tag
=
0
;
if
(
unlikely
(
!
(
rq
->
flags
&
REQ_CMD
)))
return
1
;
if
(
unlikely
((
rq
->
flags
&
REQ_QUEUED
)))
{
printk
(
KERN_ERR
"request %p for device [02%x:02%x] already tagged %d"
,
rq
,
major
(
rq
->
rq_dev
),
minor
(
rq
->
rq_dev
),
rq
->
tag
);
BUG
();
}
for
(
map
=
bqt
->
tag_map
;
*
map
==
-
1UL
;
map
++
)
{
tag
+=
BLK_TAGS_PER_LONG
;
...
...
@@ -794,33 +824,40 @@ static int ll_merge_requests_fn(request_queue_t *q, struct request *req,
* force the transfer to start only after we have put all the requests
* on the list.
*
* This is called with interrupts off and no requests on the queue
.
*
(and with the request spinlock acquired)
* This is called with interrupts off and no requests on the queue
and
*
with the queue lock held.
*/
void
blk_plug_device
(
request_queue_t
*
q
)
{
/*
* common case
*/
if
(
!
elv_queue_empty
(
q
))
return
;
if
(
!
test_and_set_bit
(
QUEUE_FLAG_PLUGGED
,
&
q
->
queue_flags
))
{
if
(
!
blk_queue_plugged
(
q
))
{
spin_lock
(
&
blk_plug_lock
);
list_add_tail
(
&
q
->
plug_list
,
&
blk_plug_list
);
spin_unlock
(
&
blk_plug_lock
);
}
}
/*
* remove the queue from the plugged list, if present. called with
* queue lock held and interrupts disabled.
*/
inline
int
blk_remove_plug
(
request_queue_t
*
q
)
{
if
(
blk_queue_plugged
(
q
))
{
spin_lock
(
&
blk_plug_lock
);
list_del_init
(
&
q
->
plug_list
);
spin_unlock
(
&
blk_plug_lock
);
return
1
;
}
return
0
;
}
/*
* remove the plug and let it rip..
*/
static
inline
void
__generic_unplug_device
(
request_queue_t
*
q
)
{
/*
* not plugged
*/
if
(
!
test_and_clear_bit
(
QUEUE_FLAG_PLUGGED
,
&
q
->
queue_flags
))
if
(
!
blk_remove_plug
(
q
))
return
;
if
(
test_bit
(
QUEUE_FLAG_STOPPED
,
&
q
->
queue_flags
))
...
...
@@ -848,11 +885,10 @@ static inline void __generic_unplug_device(request_queue_t *q)
void
generic_unplug_device
(
void
*
data
)
{
request_queue_t
*
q
=
data
;
unsigned
long
flags
;
spin_lock_irq
save
(
q
->
queue_lock
,
flags
);
spin_lock_irq
(
q
->
queue_lock
);
__generic_unplug_device
(
q
);
spin_unlock_irq
restore
(
q
->
queue_lock
,
flags
);
spin_unlock_irq
(
q
->
queue_lock
);
}
/**
...
...
@@ -895,17 +931,9 @@ void blk_stop_queue(request_queue_t *q)
unsigned
long
flags
;
spin_lock_irqsave
(
q
->
queue_lock
,
flags
);
/*
* remove from the plugged list, queue must not be called.
*/
if
(
test_and_clear_bit
(
QUEUE_FLAG_PLUGGED
,
&
q
->
queue_flags
))
{
spin_lock
(
&
blk_plug_lock
);
list_del
(
&
q
->
plug_list
);
spin_unlock
(
&
blk_plug_lock
);
}
blk_remove_plug
(
q
);
spin_unlock_irqrestore
(
q
->
queue_lock
,
flags
);
set_bit
(
QUEUE_FLAG_STOPPED
,
&
q
->
queue_flags
);
}
...
...
@@ -941,12 +969,7 @@ void blk_run_queues(void)
while
(
!
list_empty
(
&
local_plug_list
))
{
request_queue_t
*
q
=
blk_plug_entry
(
local_plug_list
.
next
);
BUG_ON
(
test_bit
(
QUEUE_FLAG_STOPPED
,
&
q
->
queue_flags
));
spin_lock_irq
(
q
->
queue_lock
);
list_del
(
&
q
->
plug_list
);
__generic_unplug_device
(
q
);
spin_unlock_irq
(
q
->
queue_lock
);
q
->
unplug_fn
(
q
);
}
}
...
...
@@ -1089,6 +1112,7 @@ int blk_init_queue(request_queue_t *q, request_fn_proc *rfn, spinlock_t *lock)
q
->
front_merge_fn
=
ll_front_merge_fn
;
q
->
merge_requests_fn
=
ll_merge_requests_fn
;
q
->
prep_rq_fn
=
NULL
;
q
->
unplug_fn
=
generic_unplug_device
;
q
->
queue_flags
=
(
1
<<
QUEUE_FLAG_CLUSTER
);
q
->
queue_lock
=
lock
;
...
...
@@ -1386,10 +1410,12 @@ static int __make_request(request_queue_t *q, struct bio *bio)
req
=
NULL
;
insert_here
=
q
->
queue_head
.
prev
;
if
(
blk_queue_empty
(
q
)
||
barrier
)
{
if
(
blk_queue_empty
(
q
))
{
blk_plug_device
(
q
);
goto
get_rq
;
}
if
(
barrier
)
goto
get_rq
;
el_ret
=
elv_merge
(
q
,
&
req
,
bio
);
switch
(
el_ret
)
{
...
...
@@ -2011,6 +2037,8 @@ EXPORT_SYMBOL(blk_queue_bounce_limit);
EXPORT_SYMBOL
(
generic_make_request
);
EXPORT_SYMBOL
(
blkdev_release_request
);
EXPORT_SYMBOL
(
generic_unplug_device
);
EXPORT_SYMBOL
(
blk_plug_device
);
EXPORT_SYMBOL
(
blk_remove_plug
);
EXPORT_SYMBOL
(
blk_attempt_remerge
);
EXPORT_SYMBOL
(
blk_max_low_pfn
);
EXPORT_SYMBOL
(
blk_max_pfn
);
...
...
@@ -2032,6 +2060,7 @@ EXPORT_SYMBOL(blk_put_request);
EXPORT_SYMBOL
(
blk_queue_prep_rq
);
EXPORT_SYMBOL
(
blk_queue_find_tag
);
EXPORT_SYMBOL
(
blk_queue_init_tags
);
EXPORT_SYMBOL
(
blk_queue_free_tags
);
EXPORT_SYMBOL
(
blk_queue_start_tag
);
...
...
drivers/ide/tcq.c
View file @
a9a677ac
...
...
@@ -291,7 +291,7 @@ static ide_startstop_t service(struct ata_device *drive, struct request *rq)
TCQ_PRINTK
(
"%s: stat %x, feat %x
\n
"
,
__FUNCTION__
,
stat
,
feat
);
rq
=
blk_queue_
tag_request
(
&
drive
->
queue
,
tag
);
rq
=
blk_queue_
find_tag
(
&
drive
->
queue
,
tag
);
if
(
!
rq
)
{
printk
(
KERN_ERR
"%s: missing request for tag %d
\n
"
,
__FUNCTION__
,
tag
);
return
ide_stopped
;
...
...
include/linux/blkdev.h
View file @
a9a677ac
...
...
@@ -113,7 +113,7 @@ typedef void (request_fn_proc) (request_queue_t *q);
typedef
request_queue_t
*
(
queue_proc
)
(
kdev_t
dev
);
typedef
int
(
make_request_fn
)
(
request_queue_t
*
q
,
struct
bio
*
bio
);
typedef
int
(
prep_rq_fn
)
(
request_queue_t
*
,
struct
request
*
);
typedef
void
(
unplug_
device_
fn
)
(
void
*
q
);
typedef
void
(
unplug_fn
)
(
void
*
q
);
enum
blk_queue_state
{
Queue_down
,
...
...
@@ -157,6 +157,7 @@ struct request_queue
merge_requests_fn
*
merge_requests_fn
;
make_request_fn
*
make_request_fn
;
prep_rq_fn
*
prep_rq_fn
;
unplug_fn
*
unplug_fn
;
struct
backing_dev_info
backing_dev_info
;
...
...
@@ -206,13 +207,11 @@ struct request_queue
#define RQ_SCSI_DONE 0xfffe
#define RQ_SCSI_DISCONNECTING 0xffe0
#define QUEUE_FLAG_PLUGGED 0
/* queue is plugged */
#define QUEUE_FLAG_CLUSTER 1
/* cluster several segments into 1 */
#define QUEUE_FLAG_QUEUED 2
/* uses generic tag queueing */
#define QUEUE_FLAG_STOPPED 3
/* queue is stopped */
#define QUEUE_FLAG_CLUSTER 0
/* cluster several segments into 1 */
#define QUEUE_FLAG_QUEUED 1
/* uses generic tag queueing */
#define QUEUE_FLAG_STOPPED 2
/* queue is stopped */
#define blk_queue_plugged(q) test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags)
#define blk_mark_plugged(q) set_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags)
#define blk_queue_plugged(q) !list_empty(&(q)->plug_list)
#define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags)
#define blk_queue_empty(q) elv_queue_empty(q)
#define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist)
...
...
@@ -292,6 +291,7 @@ extern void blk_attempt_remerge(request_queue_t *, struct request *);
extern
struct
request
*
blk_get_request
(
request_queue_t
*
,
int
,
int
);
extern
void
blk_put_request
(
struct
request
*
);
extern
void
blk_plug_device
(
request_queue_t
*
);
extern
int
blk_remove_plug
(
request_queue_t
*
);
extern
void
blk_recount_segments
(
request_queue_t
*
,
struct
bio
*
);
extern
inline
int
blk_phys_contig_segment
(
request_queue_t
*
q
,
struct
bio
*
,
struct
bio
*
);
extern
inline
int
blk_hw_contig_segment
(
request_queue_t
*
q
,
struct
bio
*
,
struct
bio
*
);
...
...
include/sound/ac97_codec.h
View file @
a9a677ac
...
...
@@ -160,7 +160,7 @@ struct _snd_ac97 {
unsigned
int
rates_mic_adc
;
unsigned
int
spdif_status
;
unsigned
short
regs
[
0x80
];
/* register cache */
unsigned
long
reg_accessed
[
0x80
/
BITS_PER_LONG
]
;
/* bit flags */
bitmap_member
(
reg_accessed
,
0x80
)
;
/* bit flags */
union
{
/* vendor specific code */
struct
{
unsigned
short
unchained
[
3
];
// 0 = C34, 1 = C79, 2 = C69
...
...
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