public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
From: Jens Axboe <axboe@suse.de>
To: James Bottomley <James.Bottomley@SteelEye.com>
Cc: SCSI Mailing List <linux-scsi@vger.kernel.org>, g.liakhovetski@gmx.de
Subject: Re: [PATCH] dc395x: Fix support for highmem
Date: Wed, 16 Mar 2005 17:04:47 +0100	[thread overview]
Message-ID: <20050316160447.GU7842@suse.de> (raw)
In-Reply-To: <1110986016.5771.3.camel@mulgrave>

On Wed, Mar 16 2005, James Bottomley wrote:
> On Wed, 2005-03-16 at 08:58 +0100, Jens Axboe wrote:
> > Guys, who reviewed this? It looks completely bogus, using kmap() for tha
> > entire sg list is just wrong and can deadlock easily. The proper way is
> > of course to skip the virtual address requirement and dma map the sg
> > array properly.
> 
> I suppose ultimately, the responsibility is mine.
> 
> The problem with this particular card (at least as I read the comments
> in the driver) is that most of the time, it can actually do DMA on its
> own.  However, when something unexpected occurs (Like a SCSI device
> disconnections), the DMA engine halts and the last pieces of data have
> to be read in manually using PIO.

Ah, that is very similar to IDE in fact. Not lovely :-)

> I agree the kmap is inefficient.  The efficient alternative is to do
> dma_map_sg() and use kmap_atomic() in the interrupt routine where we do
> the PIO cleanup---I'm afraid I just passed on explaining how to do
> this ... unless you care to do the honours ?

The kmap() isn't just inefficient, it's a problem to iterate over the sg
list and kmap all the pages. That is illegal.

But it's not so tricky to get right, if the punting just happens in the
isr. Basically just iterate over every sg entry left ala:

        for (i = start; i < sg_entries; i++) {
                unsigned long flags;
                char *ptr;

                local_irq_save(flags);
                ptr = kmap_atomic(sg->page, KM_BIO_SRC_IRQ);

                /* transfer to/from ptr + sg->offset, sg->length bytes */

                kunmap_atomic(ptr, KM_BIO_SRC_IRQ);
                local_irq_restore(flags);
        }

I _think_ the sg->length field is universally called so, you should not
use sg->dma_length/sg_dma_len() or sg_dma_address(), as we are outside
the work of the iommu at this point.

-- 
Jens Axboe


  reply	other threads:[~2005-03-16 16:04 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <200503160209.j2G29cAf010870@hera.kernel.org>
2005-03-16  7:58 ` [PATCH] dc395x: Fix support for highmem Jens Axboe
2005-03-16 15:13   ` James Bottomley
2005-03-16 16:04     ` Jens Axboe [this message]
2005-03-16 16:48       ` Matthew Wilcox
2005-03-16 16:53         ` Jens Axboe
2005-03-16 17:02           ` Christoph Hellwig
2005-03-16 17:04             ` Jens Axboe
2005-03-16 18:44               ` Mike Christie
2005-03-16 18:53                 ` iSCSI and scatterlists Matthew Wilcox
2005-03-16 19:59                   ` Dmitry Yusupov
2005-03-16 18:53                 ` [PATCH] dc395x: Fix support for highmem Jens Axboe
2005-03-20  9:14               ` Christoph Hellwig
2005-03-20 20:51                 ` Guennadi Liakhovetski
2005-03-21  7:55                   ` Jens Axboe
     [not found]                     ` <7044.1111398919@www16.gmx.net>
2005-03-21 10:38                       ` gl
2005-03-21 10:44                         ` Jens Axboe
2005-03-21 11:00                           ` gl
2005-03-30 21:22                             ` Guennadi Liakhovetski
2005-03-30 22:13                               ` James Bottomley
2005-03-31  8:58                                 ` gl
2005-04-09 22:48                                   ` Guennadi Liakhovetski
2005-04-21 21:49                                     ` Guennadi Liakhovetski
2005-04-22 11:36                                       ` Jens Axboe
2005-04-23  9:35                                         ` Guennadi Liakhovetski
2005-04-23 10:06                                           ` Guennadi Liakhovetski
2005-04-23 19:01                                             ` James Bottomley
2005-04-24  0:22                                               ` Guennadi Liakhovetski
2005-04-24 14:31                                                 ` Guennadi Liakhovetski
2005-04-24 22:11                                                 ` James Bottomley
2005-04-25 19:56                                                   ` Guennadi Liakhovetski
2005-03-16 20:24       ` Guennadi Liakhovetski
2005-03-17  7:40         ` Jens Axboe
     [not found]           ` <22734.1111050528@www13.gmx.net>
2005-03-17  9:41             ` gl
2005-03-17 10:08               ` Jens Axboe
2005-03-17 10:56                 ` gl
2005-03-17 20:51                   ` Guennadi Liakhovetski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050316160447.GU7842@suse.de \
    --to=axboe@suse.de \
    --cc=James.Bottomley@SteelEye.com \
    --cc=g.liakhovetski@gmx.de \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox