mirror of https://gitee.com/openkylin/linux.git
locking/lockdep: Change type of the element field in circular_queue
The element field is an array in struct circular_queue to keep track of locks in the search. Making it the same type as the locks avoids type cast. Also fix a typo and elaborate the comment above struct circular_queue. No functional change. Signed-off-by: Yuyang Du <duyuyang@gmail.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: frederic@kernel.org Cc: ming.lei@redhat.com Cc: will.deacon@arm.com Link: https://lkml.kernel.org/r/20190506081939.74287-13-duyuyang@gmail.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
31a490e5c5
commit
aa4807719e
|
@ -1262,13 +1262,17 @@ static int add_lock_to_list(struct lock_class *this,
|
|||
#define CQ_MASK (MAX_CIRCULAR_QUEUE_SIZE-1)
|
||||
|
||||
/*
|
||||
* The circular_queue and helpers is used to implement the
|
||||
* breadth-first search(BFS)algorithem, by which we can build
|
||||
* the shortest path from the next lock to be acquired to the
|
||||
* previous held lock if there is a circular between them.
|
||||
* The circular_queue and helpers are used to implement graph
|
||||
* breadth-first search (BFS) algorithm, by which we can determine
|
||||
* whether there is a path from a lock to another. In deadlock checks,
|
||||
* a path from the next lock to be acquired to a previous held lock
|
||||
* indicates that adding the <prev> -> <next> lock dependency will
|
||||
* produce a circle in the graph. Breadth-first search instead of
|
||||
* depth-first search is used in order to find the shortest (circular)
|
||||
* path.
|
||||
*/
|
||||
struct circular_queue {
|
||||
unsigned long element[MAX_CIRCULAR_QUEUE_SIZE];
|
||||
struct lock_list *element[MAX_CIRCULAR_QUEUE_SIZE];
|
||||
unsigned int front, rear;
|
||||
};
|
||||
|
||||
|
@ -1294,7 +1298,7 @@ static inline int __cq_full(struct circular_queue *cq)
|
|||
return ((cq->rear + 1) & CQ_MASK) == cq->front;
|
||||
}
|
||||
|
||||
static inline int __cq_enqueue(struct circular_queue *cq, unsigned long elem)
|
||||
static inline int __cq_enqueue(struct circular_queue *cq, struct lock_list *elem)
|
||||
{
|
||||
if (__cq_full(cq))
|
||||
return -1;
|
||||
|
@ -1304,7 +1308,7 @@ static inline int __cq_enqueue(struct circular_queue *cq, unsigned long elem)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int __cq_dequeue(struct circular_queue *cq, unsigned long *elem)
|
||||
static inline int __cq_dequeue(struct circular_queue *cq, struct lock_list **elem)
|
||||
{
|
||||
if (__cq_empty(cq))
|
||||
return -1;
|
||||
|
@ -1382,12 +1386,12 @@ static int __bfs(struct lock_list *source_entry,
|
|||
goto exit;
|
||||
|
||||
__cq_init(cq);
|
||||
__cq_enqueue(cq, (unsigned long)source_entry);
|
||||
__cq_enqueue(cq, source_entry);
|
||||
|
||||
while (!__cq_empty(cq)) {
|
||||
struct lock_list *lock;
|
||||
|
||||
__cq_dequeue(cq, (unsigned long *)&lock);
|
||||
__cq_dequeue(cq, &lock);
|
||||
|
||||
if (!lock->class) {
|
||||
ret = -2;
|
||||
|
@ -1411,7 +1415,7 @@ static int __bfs(struct lock_list *source_entry,
|
|||
goto exit;
|
||||
}
|
||||
|
||||
if (__cq_enqueue(cq, (unsigned long)entry)) {
|
||||
if (__cq_enqueue(cq, entry)) {
|
||||
ret = -1;
|
||||
goto exit;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue