Loading kernel/lockdep.c +15 −43 Original line number Original line Diff line number Diff line Loading @@ -2057,31 +2057,39 @@ static int exclusive_bit(int new_bit) return state | (dir ^ 2); return state | (dir ^ 2); } } typedef int (*check_usage_f)(struct task_struct *, struct held_lock *, enum lock_usage_bit bit, const char *name); static int static int mark_lock_irq_used_in(struct task_struct *curr, struct held_lock *this, mark_lock_irq_write(struct task_struct *curr, struct held_lock *this, int new_bit) int new_bit) { { const char *name = state_name(new_bit); const char *name = state_name(new_bit); const char *rname = state_rname(new_bit); const char *rname = state_rname(new_bit); int excl_bit = exclusive_bit(new_bit); int excl_bit = exclusive_bit(new_bit); int dir = new_bit & 2; check_usage_f usage = dir ? check_usage_backwards : check_usage_forwards; if (!valid_state(curr, this, new_bit, excl_bit)) if (!valid_state(curr, this, new_bit, excl_bit)) return 0; return 0; if (!valid_state(curr, this, new_bit, excl_bit + 1)) if (!valid_state(curr, this, new_bit, excl_bit + 1)) return 0; return 0; /* /* * just marked it hardirq-safe, check that this lock * just marked it hardirq-safe, check that this lock * took no hardirq-unsafe lock in the past: * took no hardirq-unsafe lock in the past: */ */ if (!check_usage_forwards(curr, this, excl_bit, name)) if (!usage(curr, this, excl_bit, name)) return 0; return 0; #if STRICT_READ_CHECKS #if STRICT_READ_CHECKS /* /* * just marked it hardirq-safe, check that this lock * just marked it hardirq-safe, check that this lock * took no hardirq-unsafe-read lock in the past: * took no hardirq-unsafe-read lock in the past: */ */ if (!check_usage_forwards(curr, this, excl_bit + 1, rname)) if (!usage(curr, this, excl_bit + 1, rname)) return 0; return 0; #endif #endif if (state_verbose(new_bit, hlock_class(this))) if (state_verbose(new_bit, hlock_class(this))) Loading Loading @@ -2125,40 +2133,6 @@ mark_lock_irq_read(struct task_struct *curr, struct held_lock *this, return 1; return 1; } } static int mark_lock_irq_enabled(struct task_struct *curr, struct held_lock *this, int new_bit) { const char *name = state_name(new_bit); const char *rname = state_rname(new_bit); int excl_bit = exclusive_bit(new_bit); if (!valid_state(curr, this, new_bit, excl_bit)) return 0; if (!valid_state(curr, this, new_bit, excl_bit + 1)) return 0; /* * just marked it hardirq-unsafe, check that no hardirq-safe * lock in the system ever took it in the past: */ if (!check_usage_backwards(curr, this, excl_bit, name)) return 0; #if STRICT_READ_CHECKS /* * just marked it hardirq-unsafe, check that no * hardirq-safe-read lock in the system ever took * it in the past: */ if (!check_usage_backwards(curr, this, excl_bit + 1, rname)) return 0; #endif if (state_verbose(new_bit, hlock_class(this))) return 2; return 1; } static int mark_lock_irq(struct task_struct *curr, struct held_lock *this, static int mark_lock_irq(struct task_struct *curr, struct held_lock *this, enum lock_usage_bit new_bit) enum lock_usage_bit new_bit) { { Loading @@ -2168,7 +2142,10 @@ static int mark_lock_irq(struct task_struct *curr, struct held_lock *this, case LOCK_USED_IN_HARDIRQ: case LOCK_USED_IN_HARDIRQ: case LOCK_USED_IN_SOFTIRQ: case LOCK_USED_IN_SOFTIRQ: case LOCK_USED_IN_RECLAIM_FS: case LOCK_USED_IN_RECLAIM_FS: return mark_lock_irq_used_in(curr, this, new_bit); case LOCK_ENABLED_HARDIRQ: case LOCK_ENABLED_SOFTIRQ: case LOCK_ENABLED_RECLAIM_FS: return mark_lock_irq_write(curr, this, new_bit); case LOCK_USED_IN_HARDIRQ_READ: case LOCK_USED_IN_HARDIRQ_READ: case LOCK_USED_IN_SOFTIRQ_READ: case LOCK_USED_IN_SOFTIRQ_READ: Loading @@ -2178,11 +2155,6 @@ static int mark_lock_irq(struct task_struct *curr, struct held_lock *this, case LOCK_ENABLED_RECLAIM_FS_READ: case LOCK_ENABLED_RECLAIM_FS_READ: return mark_lock_irq_read(curr, this, new_bit); return mark_lock_irq_read(curr, this, new_bit); case LOCK_ENABLED_HARDIRQ: case LOCK_ENABLED_SOFTIRQ: case LOCK_ENABLED_RECLAIM_FS: return mark_lock_irq_enabled(curr, this, new_bit); default: default: WARN_ON(1); WARN_ON(1); break; break; Loading Loading
kernel/lockdep.c +15 −43 Original line number Original line Diff line number Diff line Loading @@ -2057,31 +2057,39 @@ static int exclusive_bit(int new_bit) return state | (dir ^ 2); return state | (dir ^ 2); } } typedef int (*check_usage_f)(struct task_struct *, struct held_lock *, enum lock_usage_bit bit, const char *name); static int static int mark_lock_irq_used_in(struct task_struct *curr, struct held_lock *this, mark_lock_irq_write(struct task_struct *curr, struct held_lock *this, int new_bit) int new_bit) { { const char *name = state_name(new_bit); const char *name = state_name(new_bit); const char *rname = state_rname(new_bit); const char *rname = state_rname(new_bit); int excl_bit = exclusive_bit(new_bit); int excl_bit = exclusive_bit(new_bit); int dir = new_bit & 2; check_usage_f usage = dir ? check_usage_backwards : check_usage_forwards; if (!valid_state(curr, this, new_bit, excl_bit)) if (!valid_state(curr, this, new_bit, excl_bit)) return 0; return 0; if (!valid_state(curr, this, new_bit, excl_bit + 1)) if (!valid_state(curr, this, new_bit, excl_bit + 1)) return 0; return 0; /* /* * just marked it hardirq-safe, check that this lock * just marked it hardirq-safe, check that this lock * took no hardirq-unsafe lock in the past: * took no hardirq-unsafe lock in the past: */ */ if (!check_usage_forwards(curr, this, excl_bit, name)) if (!usage(curr, this, excl_bit, name)) return 0; return 0; #if STRICT_READ_CHECKS #if STRICT_READ_CHECKS /* /* * just marked it hardirq-safe, check that this lock * just marked it hardirq-safe, check that this lock * took no hardirq-unsafe-read lock in the past: * took no hardirq-unsafe-read lock in the past: */ */ if (!check_usage_forwards(curr, this, excl_bit + 1, rname)) if (!usage(curr, this, excl_bit + 1, rname)) return 0; return 0; #endif #endif if (state_verbose(new_bit, hlock_class(this))) if (state_verbose(new_bit, hlock_class(this))) Loading Loading @@ -2125,40 +2133,6 @@ mark_lock_irq_read(struct task_struct *curr, struct held_lock *this, return 1; return 1; } } static int mark_lock_irq_enabled(struct task_struct *curr, struct held_lock *this, int new_bit) { const char *name = state_name(new_bit); const char *rname = state_rname(new_bit); int excl_bit = exclusive_bit(new_bit); if (!valid_state(curr, this, new_bit, excl_bit)) return 0; if (!valid_state(curr, this, new_bit, excl_bit + 1)) return 0; /* * just marked it hardirq-unsafe, check that no hardirq-safe * lock in the system ever took it in the past: */ if (!check_usage_backwards(curr, this, excl_bit, name)) return 0; #if STRICT_READ_CHECKS /* * just marked it hardirq-unsafe, check that no * hardirq-safe-read lock in the system ever took * it in the past: */ if (!check_usage_backwards(curr, this, excl_bit + 1, rname)) return 0; #endif if (state_verbose(new_bit, hlock_class(this))) return 2; return 1; } static int mark_lock_irq(struct task_struct *curr, struct held_lock *this, static int mark_lock_irq(struct task_struct *curr, struct held_lock *this, enum lock_usage_bit new_bit) enum lock_usage_bit new_bit) { { Loading @@ -2168,7 +2142,10 @@ static int mark_lock_irq(struct task_struct *curr, struct held_lock *this, case LOCK_USED_IN_HARDIRQ: case LOCK_USED_IN_HARDIRQ: case LOCK_USED_IN_SOFTIRQ: case LOCK_USED_IN_SOFTIRQ: case LOCK_USED_IN_RECLAIM_FS: case LOCK_USED_IN_RECLAIM_FS: return mark_lock_irq_used_in(curr, this, new_bit); case LOCK_ENABLED_HARDIRQ: case LOCK_ENABLED_SOFTIRQ: case LOCK_ENABLED_RECLAIM_FS: return mark_lock_irq_write(curr, this, new_bit); case LOCK_USED_IN_HARDIRQ_READ: case LOCK_USED_IN_HARDIRQ_READ: case LOCK_USED_IN_SOFTIRQ_READ: case LOCK_USED_IN_SOFTIRQ_READ: Loading @@ -2178,11 +2155,6 @@ static int mark_lock_irq(struct task_struct *curr, struct held_lock *this, case LOCK_ENABLED_RECLAIM_FS_READ: case LOCK_ENABLED_RECLAIM_FS_READ: return mark_lock_irq_read(curr, this, new_bit); return mark_lock_irq_read(curr, this, new_bit); case LOCK_ENABLED_HARDIRQ: case LOCK_ENABLED_SOFTIRQ: case LOCK_ENABLED_RECLAIM_FS: return mark_lock_irq_enabled(curr, this, new_bit); default: default: WARN_ON(1); WARN_ON(1); break; break; Loading