Showing error 1642

User: Jiri Slaby
Error type: Invalid Pointer Dereference
Error type description: A pointer which is invalid is being dereferenced
File location: drivers/misc/sgi-gru/grutlbpurge.c
Line in file: 318
Project: Linux Kernel
Project version: 2.6.28
Tools: Smatch (1.59)
Entered: 2013-09-10 07:54:05 UTC


Source:

288                hlist_for_each_entry_rcu(mn, n, &mm->mmu_notifier_mm->list,
289                                         hlist)
290                    if (mn->ops == ops) {
291                        gru_mn = mn;
292                        break;
293                }
294                rcu_read_unlock();
295        }
296        return gru_mn;
297}
298
299struct gru_mm_struct *gru_register_mmu_notifier(void)
300{
301        struct gru_mm_struct *gms;
302        struct mmu_notifier *mn;
303
304        mn = mmu_find_ops(current->mm, &gru_mmuops);
305        if (mn) {
306                gms = container_of(mn, struct gru_mm_struct, ms_notifier);
307                atomic_inc(&gms->ms_refcnt);
308        } else {
309                gms = kzalloc(sizeof(*gms), GFP_KERNEL);
310                if (gms) {
311                        spin_lock_init(&gms->ms_asid_lock);
312                        gms->ms_notifier.ops = &gru_mmuops;
313                        atomic_set(&gms->ms_refcnt, 1);
314                        init_waitqueue_head(&gms->ms_wait_queue);
315                        __mmu_notifier_register(&gms->ms_notifier, current->mm);
316                }
317        }
318        gru_dbg(grudev, "gms %p, refcnt %d\n", gms,
319                atomic_read(&gms->ms_refcnt));
320        return gms;
321}
322
323void gru_drop_mmu_notifier(struct gru_mm_struct *gms)
324{
325        gru_dbg(grudev, "gms %p, refcnt %d, released %d\n", gms,
326                atomic_read(&gms->ms_refcnt), gms->ms_released);
327        if (atomic_dec_return(&gms->ms_refcnt) == 0) {
328                if (!gms->ms_released)
Show full sources