lkml.org 
[lkml]   [2002]   [Sep]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: 2.5 Problem Status Report
    On Wed, Sep 11 2002, Jens Axboe wrote:
    > On Wed, Sep 11 2002, Oleg Drokin wrote:
    > > Hello!
    > >
    > > On Wed, Sep 11, 2002 at 09:38:25AM +0200, Ingo Molnar wrote:
    > >
    > > > > I have preemption disabled.
    > > > nevertheless please print out preempt_count() in sched.c - since the big
    > > > IRQ cleanups we use the preemption count even if preemption is disabled.
    > > > this way we'll know what kind of problem happened - a stuck softirq count,
    > > > a stuck hardirq count or an underflow?
    > >
    > > You was exactly right. preemption count is -1. I inserted chack in
    > > dec_preempt_count() and here is updated correct stacktrace. Seems
    > > like ide_unmap_buffer is called with some bogus data or something like
    > > that. Also I guess the bug is only visible with debug highmem = ON and
    > > highmem enabled.
    >
    > ok I see the bug. it's due to the imbalanced nature of ide_map_buffer()
    > vs ide_unmap_buffer(). i'll cook up a fix right away.

    Oleg,

    Does this make it work?

    --- drivers/ide/ide-disk.c~ 2002-09-11 12:27:47.000000000 +0200
    +++ drivers/ide/ide-disk.c 2002-09-11 12:28:17.000000000 +0200
    @@ -175,7 +175,7 @@
    drive->name, rq->sector, rq->sector+nsect-1,
    (unsigned long) rq->buffer+(nsect<<9), rq->nr_sectors-nsect);
    #endif
    - ide_unmap_buffer(to, &flags);
    + ide_unmap_buffer(rq, to, &flags);
    rq->sector += nsect;
    rq->errors = 0;
    i = (rq->nr_sectors -= nsect);
    @@ -226,7 +226,7 @@
    unsigned long flags;
    char *to = ide_map_buffer(rq, &flags);
    taskfile_output_data(drive, to, SECTOR_WORDS);
    - ide_unmap_buffer(to, &flags);
    + ide_unmap_buffer(rq, to, &flags);
    if (HWGROUP(drive)->handler != NULL)
    BUG();
    ide_set_handler(drive, &write_intr, WAIT_CMD, NULL);
    @@ -302,7 +302,7 @@
    * re-entering us on the last transfer.
    */
    taskfile_output_data(drive, buffer, nsect<<7);
    - ide_unmap_buffer(buffer, &flags);
    + ide_unmap_buffer(rq, buffer, &flags);
    } while (mcount);

    return 0;
    @@ -688,7 +688,7 @@
    BUG();
    ide_set_handler(drive, &write_intr, WAIT_CMD, NULL);
    taskfile_output_data(drive, buffer, SECTOR_WORDS);
    - ide_unmap_buffer(buffer, &flags);
    + ide_unmap_buffer(rq, buffer, &flags);
    }
    return ide_started;
    }
    --- drivers/ide/ide-taskfile.c~ 2002-09-11 12:27:51.000000000 +0200
    +++ drivers/ide/ide-taskfile.c 2002-09-11 12:28:25.000000000 +0200
    @@ -60,7 +60,7 @@
    #endif

    #define task_map_rq(rq, flags) ide_map_buffer((rq), (flags))
    -#define task_unmap_rq(rq, buf, flags) ide_unmap_buffer((buf), (flags))
    +#define task_unmap_rq(rq, buf, flags) ide_unmap_buffer((rq), (buf), (flags))

    inline u32 task_read_24 (ide_drive_t *drive)
    {
    --- include/linux/ide.h~ 2002-09-11 12:27:14.000000000 +0200
    +++ include/linux/ide.h 2002-09-11 12:27:29.000000000 +0200
    @@ -597,9 +597,10 @@
    return rq->buffer + task_rq_offset(rq);
    }

    -extern inline void ide_unmap_buffer(char *buffer, unsigned long *flags)
    +extern inline void ide_unmap_buffer(struct request *rq, char *buffer, unsigned long *flags)
    {
    - bio_kunmap_irq(buffer, flags);
    + if (rq->bio)
    + bio_kunmap_irq(buffer, flags);
    }

    /*
    --
    Jens Axboe

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:28    [W:0.038 / U:0.648 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site