Linus, please pull from
git://git.kernel.org/pub/scm/linux/kernel/git/drzeus/mmc.git for-linus
to receive the following updates:
drivers/mmc/host/au1xmmc.c | 54 ++++++++++++++++++++++++++++++++++---------
drivers/mmc/host/pxamci.c | 2 +-
drivers/mmc/host/s3cmci.c | 50 +++++++++++++++++++++++++---------------
3 files changed, 74 insertions(+), 32 deletions(-)
Ben Dooks (2):
s3cmci: fixes for section mismatch warnings
s3cmci: ensure host stopped on machine shutdown
Karl Beldan (1):
pxamci: trivial fix of DMA alignment register bit clearing
Manuel Lauss (1):
au1xmmc: suspend/resume implementation
--
-- Pierre Ossman
Linux kernel, MMC maintainer http://www.kernel.org
rdesktop, core developer http://www.rdesktop.org
WARNING: This correspondence is being monitored by the
Swedish government. Make sure your server uses encryption
for SMTP traffic and consider using PGP for end-to-end
encryption.
On Sat, 19 Jul 2008 01:59:11 +0200
Pierre Ossman <[email protected]> wrote:
> Linus, please pull from
>
> git://git.kernel.org/pub/scm/linux/kernel/git/drzeus/mmc.git for-linus
>
Since you haven't pulled yet, I've updated the list of patches to the
following set:
MAINTAINERS | 5 +-
drivers/mmc/card/mmc_test.c | 225 ++++++++++++++++++++++++++++++++++++++++++-
drivers/mmc/card/queue.c | 97 ++++++-------------
drivers/mmc/host/au1xmmc.c | 54 ++++++++---
drivers/mmc/host/pxamci.c | 2 +-
drivers/mmc/host/s3cmci.c | 50 ++++++----
drivers/mmc/host/sdhci.c | 167 ++++++++++++++------------------
drivers/mmc/host/sdhci.h | 7 +-
include/linux/scatterlist.h | 38 +++++++
lib/scatterlist.c | 176 +++++++++++++++++++++++++---------
10 files changed, 573 insertions(+), 248 deletions(-)
Ben Dooks (2):
s3cmci: fixes for section mismatch warnings
s3cmci: ensure host stopped on machine shutdown
Karl Beldan (1):
pxamci: trivial fix of DMA alignment register bit clearing
Manuel Lauss (1):
au1xmmc: suspend/resume implementation
Pierre Ossman (8):
mmc_test: highmem tests
mmc_test: test oversized sg lists
sdhci: add warnings for bad buffers in ADMA path
sdhci: fix bad warning from commit c8b3e02
mmc_block: bounce buffer highmem support
mmc: Remove Russell as primecell mci maintainer
mmc_test: print message when attaching to card
sdhci: highmem capable PIO routines
Tejun Heo (1):
sg: reimplement sg mapping iterator
--
-- Pierre Ossman
Linux kernel, MMC maintainer http://www.kernel.org
rdesktop, core developer http://www.rdesktop.org
WARNING: This correspondence is being monitored by the
Swedish government. Make sure your server uses encryption
for SMTP traffic and consider using PGP for end-to-end
encryption.
On Wed, 23 Jul 2008, Pierre Ossman wrote:
>
> include/linux/scatterlist.h | 38 +++++++
> lib/scatterlist.c | 176 +++++++++++++++++++++++++---------
>
> Tejun Heo (1):
> sg: reimplement sg mapping iterator
I'd really have been a lot happier about this one if it had had a few
Acked-by's from people like Jens and James.
But I pulled, and pushed out. I think Jens is on vacation, but I'm adding
him to the cc anyway.
Linus
On Wed, 2008-07-23 at 12:08 -0700, Linus Torvalds wrote:
>
> On Wed, 23 Jul 2008, Pierre Ossman wrote:
> >
> > include/linux/scatterlist.h | 38 +++++++
> > lib/scatterlist.c | 176 +++++++++++++++++++++++++---------
> >
> > Tejun Heo (1):
> > sg: reimplement sg mapping iterator
>
> I'd really have been a lot happier about this one if it had had a few
> Acked-by's from people like Jens and James.
>
> But I pulled, and pushed out. I think Jens is on vacation, but I'm adding
> him to the cc anyway.
I was on the cc list, just not really paying attention. Anyway, I've
copied tomo who did the previous scatterlist work. It actually looks
fine to me other than a technical API violation: kunmap_atomic is
supposed to be called on the page virtual address without offset. I
think this is irrelevant since all implementations look to mask out the
offset bits anyway.
James
---
>From 137d3edb48425f82a6a4226b664f90ed5e42eea5 Mon Sep 17 00:00:00 2001
From: Tejun Heo <[email protected]>
Date: Sat, 19 Jul 2008 23:03:35 +0900
Subject: sg: reimplement sg mapping iterator
This is alternative implementation of sg content iterator introduced
by commit 83e7d317... from Pierre Ossman in next-20080716. As there's
already an sg iterator which iterates over sg entries themselves, name
this sg_mapping_iterator.
Slightly edited description from the original implementation follows.
Iteration over a sg list is not that trivial when you take into
account that memory pages might have to be mapped before being used.
Unfortunately, that means that some parts of the kernel restrict
themselves to directly accesible memory just to not have to deal with
the mess.
This patch adds a simple iterator system that allows any code to
easily traverse an sg list and not have to deal with all the details.
The user can decide to consume part of the iteration. Also, iteration
can be stopped and resumed later if releasing the kmap between
iteration steps is necessary. These features are useful to implement
piecemeal sg copying for interrupt drive PIO for example.
Signed-off-by: Tejun Heo <[email protected]>
Signed-off-by: Pierre Ossman <[email protected]>
---
include/linux/scatterlist.h | 38 +++++++++
lib/scatterlist.c | 176 +++++++++++++++++++++++++++++++-----------
2 files changed, 168 insertions(+), 46 deletions(-)
diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h
index 71fc813..e599698 100644
--- a/include/linux/scatterlist.h
+++ b/include/linux/scatterlist.h
@@ -224,4 +224,42 @@ size_t sg_copy_to_buffer(struct scatterlist *sgl, unsigned int nents,
*/
#define SG_MAX_SINGLE_ALLOC (PAGE_SIZE / sizeof(struct scatterlist))
+
+/*
+ * Mapping sg iterator
+ *
+ * Iterates over sg entries mapping page-by-page. On each successful
+ * iteration, @miter->page points to the mapped page and
+ * @miter->length bytes of data can be accessed at @miter->addr. As
+ * long as an interation is enclosed between start and stop, the user
+ * is free to choose control structure and when to stop.
+ *
+ * @miter->consumed is set to @miter->length on each iteration. It
+ * can be adjusted if the user can't consume all the bytes in one go.
+ * Also, a stopped iteration can be resumed by calling next on it.
+ * This is useful when iteration needs to release all resources and
+ * continue later (e.g. at the next interrupt).
+ */
+
+#define SG_MITER_ATOMIC (1 << 0) /* use kmap_atomic */
+
+struct sg_mapping_iter {
+ /* the following three fields can be accessed directly */
+ struct page *page; /* currently mapped page */
+ void *addr; /* pointer to the mapped area */
+ size_t length; /* length of the mapped area */
+ size_t consumed; /* number of consumed bytes */
+
+ /* these are internal states, keep away */
+ struct scatterlist *__sg; /* current entry */
+ unsigned int __nents; /* nr of remaining entries */
+ unsigned int __offset; /* offset within sg */
+ unsigned int __flags;
+};
+
+void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl,
+ unsigned int nents, unsigned int flags);
+bool sg_miter_next(struct sg_mapping_iter *miter);
+void sg_miter_stop(struct sg_mapping_iter *miter);
+
#endif /* _LINUX_SCATTERLIST_H */
diff --git a/lib/scatterlist.c b/lib/scatterlist.c
index b80c211..876ba6d 100644
--- a/lib/scatterlist.c
+++ b/lib/scatterlist.c
@@ -295,6 +295,117 @@ int sg_alloc_table(struct sg_table *table, unsigned int nents, gfp_t gfp_mask)
EXPORT_SYMBOL(sg_alloc_table);
/**
+ * sg_miter_start - start mapping iteration over a sg list
+ * @miter: sg mapping iter to be started
+ * @sgl: sg list to iterate over
+ * @nents: number of sg entries
+ *
+ * Description:
+ * Starts mapping iterator @miter.
+ *
+ * Context:
+ * Don't care.
+ */
+void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl,
+ unsigned int nents, unsigned int flags)
+{
+ memset(miter, 0, sizeof(struct sg_mapping_iter));
+
+ miter->__sg = sgl;
+ miter->__nents = nents;
+ miter->__offset = 0;
+ miter->__flags = flags;
+}
+EXPORT_SYMBOL(sg_miter_start);
+
+/**
+ * sg_miter_next - proceed mapping iterator to the next mapping
+ * @miter: sg mapping iter to proceed
+ *
+ * Description:
+ * Proceeds @miter@ to the next mapping. @miter@ should have been
+ * started using sg_miter_start(). On successful return,
+ * @miter@->page, @miter@->addr and @miter@->length point to the
+ * current mapping.
+ *
+ * Context:
+ * IRQ disabled if SG_MITER_ATOMIC. IRQ must stay disabled till
+ * @miter@ is stopped. May sleep if !SG_MITER_ATOMIC.
+ *
+ * Returns:
+ * true if @miter contains the next mapping. false if end of sg
+ * list is reached.
+ */
+bool sg_miter_next(struct sg_mapping_iter *miter)
+{
+ unsigned int off, len;
+
+ /* check for end and drop resources from the last iteration */
+ if (!miter->__nents)
+ return false;
+
+ sg_miter_stop(miter);
+
+ /* get to the next sg if necessary. __offset is adjusted by stop */
+ if (miter->__offset == miter->__sg->length && --miter->__nents) {
+ miter->__sg = sg_next(miter->__sg);
+ miter->__offset = 0;
+ }
+
+ /* map the next page */
+ off = miter->__sg->offset + miter->__offset;
+ len = miter->__sg->length - miter->__offset;
+
+ miter->page = nth_page(sg_page(miter->__sg), off >> PAGE_SHIFT);
+ off &= ~PAGE_MASK;
+ miter->length = min_t(unsigned int, len, PAGE_SIZE - off);
+ miter->consumed = miter->length;
+
+ if (miter->__flags & SG_MITER_ATOMIC)
+ miter->addr = kmap_atomic(miter->page, KM_BIO_SRC_IRQ) + off;
+ else
+ miter->addr = kmap(miter->page) + off;
+
+ return true;
+}
+EXPORT_SYMBOL(sg_miter_next);
+
+/**
+ * sg_miter_stop - stop mapping iteration
+ * @miter: sg mapping iter to be stopped
+ *
+ * Description:
+ * Stops mapping iterator @miter. @miter should have been started
+ * started using sg_miter_start(). A stopped iteration can be
+ * resumed by calling sg_miter_next() on it. This is useful when
+ * resources (kmap) need to be released during iteration.
+ *
+ * Context:
+ * IRQ disabled if the SG_MITER_ATOMIC is set. Don't care otherwise.
+ */
+void sg_miter_stop(struct sg_mapping_iter *miter)
+{
+ WARN_ON(miter->consumed > miter->length);
+
+ /* drop resources from the last iteration */
+ if (miter->addr) {
+ miter->__offset += miter->consumed;
+
+ if (miter->__flags & SG_MITER_ATOMIC) {
+ WARN_ON(!irqs_disabled());
+ kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ);
+ } else
+ kunmap(miter->addr);
+
+ miter->page = NULL;
+ miter->addr = NULL;
+ miter->length = 0;
+ miter->consumed = 0;
+ }
+}
+EXPORT_SYMBOL(sg_miter_stop);
+
+/**
* sg_copy_buffer - Copy data between a linear buffer and an SG list
* @sgl: The SG list
* @nents: Number of SG entries
@@ -309,56 +420,29 @@ EXPORT_SYMBOL(sg_alloc_table);
static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
void *buf, size_t buflen, int to_buffer)
{
- struct scatterlist *sg;
- size_t buf_off = 0;
- int i;
-
- WARN_ON(!irqs_disabled());
-
- for_each_sg(sgl, sg, nents, i) {
- struct page *page;
- int n = 0;
- unsigned int sg_off = sg->offset;
- unsigned int sg_copy = sg->length;
-
- if (sg_copy > buflen)
- sg_copy = buflen;
- buflen -= sg_copy;
-
- while (sg_copy > 0) {
- unsigned int page_copy;
- void *p;
-
- page_copy = PAGE_SIZE - sg_off;
- if (page_copy > sg_copy)
- page_copy = sg_copy;
-
- page = nth_page(sg_page(sg), n);
- p = kmap_atomic(page, KM_BIO_SRC_IRQ);
-
- if (to_buffer)
- memcpy(buf + buf_off, p + sg_off, page_copy);
- else {
- memcpy(p + sg_off, buf + buf_off, page_copy);
- flush_kernel_dcache_page(page);
- }
-
- kunmap_atomic(p, KM_BIO_SRC_IRQ);
-
- buf_off += page_copy;
- sg_off += page_copy;
- if (sg_off == PAGE_SIZE) {
- sg_off = 0;
- n++;
- }
- sg_copy -= page_copy;
+ unsigned int offset = 0;
+ struct sg_mapping_iter miter;
+
+ sg_miter_start(&miter, sgl, nents, SG_MITER_ATOMIC);
+
+ while (sg_miter_next(&miter) && offset < buflen) {
+ unsigned int len;
+
+ len = min(miter.length, buflen - offset);
+
+ if (to_buffer)
+ memcpy(buf + offset, miter.addr, len);
+ else {
+ memcpy(miter.addr, buf + offset, len);
+ flush_kernel_dcache_page(miter.page);
}
- if (!buflen)
- break;
+ offset += len;
}
- return buf_off;
+ sg_miter_stop(&miter);
+
+ return offset;
}
/**
--
1.5.5.1
On Wed, 23 Jul 2008 12:08:01 -0700 (PDT)
Linus Torvalds <[email protected]> wrote:
>
>
> On Wed, 23 Jul 2008, Pierre Ossman wrote:
> >
> > include/linux/scatterlist.h | 38 +++++++
> > lib/scatterlist.c | 176 +++++++++++++++++++++++++---------
> >
> > Tejun Heo (1):
> > sg: reimplement sg mapping iterator
>
> I'd really have been a lot happier about this one if it had had a few
> Acked-by's from people like Jens and James.
>
> But I pulled, and pushed out. I think Jens is on vacation, but I'm adding
> him to the cc anyway.
Yeah, I was hoping to get Jens' input on this aswell, but this fixes
problems in the sdhci driver so it was pushed in the hope that he won't
NAK it too badly when he gets back.
(James just got casually poked, but I wasn't even aware he was a
suitable person for this. lib/ and kernel/ are generally a bit
problematic when it comes to determining maintainer :/)
Rgds
--
-- Pierre Ossman
Linux kernel, MMC maintainer http://www.kernel.org
rdesktop, core developer http://www.rdesktop.org
WARNING: This correspondence is being monitored by the
Swedish government. Make sure your server uses encryption
for SMTP traffic and consider using PGP for end-to-end
encryption.
On Wed, Jul 23 2008, Pierre Ossman wrote:
> On Wed, 23 Jul 2008 12:08:01 -0700 (PDT)
> Linus Torvalds <[email protected]> wrote:
>
> >
> >
> > On Wed, 23 Jul 2008, Pierre Ossman wrote:
> > >
> > > include/linux/scatterlist.h | 38 +++++++
> > > lib/scatterlist.c | 176 +++++++++++++++++++++++++---------
> > >
> > > Tejun Heo (1):
> > > sg: reimplement sg mapping iterator
> >
> > I'd really have been a lot happier about this one if it had had a few
> > Acked-by's from people like Jens and James.
> >
> > But I pulled, and pushed out. I think Jens is on vacation, but I'm adding
> > him to the cc anyway.
>
> Yeah, I was hoping to get Jens' input on this aswell, but this fixes
> problems in the sdhci driver so it was pushed in the hope that he won't
> NAK it too badly when he gets back.
>
> (James just got casually poked, but I wasn't even aware he was a
> suitable person for this. lib/ and kernel/ are generally a bit
> problematic when it comes to determining maintainer :/)
(still pretty much off line, though not completely without internet
anymore :-)
The scatterlist iter commit looks sane to me. It's too late for an ack,
but I have reviewed it now.
--
Jens Axboe
On Wed, 23 Jul 2008 23:43:50 +0200
Pierre Ossman <[email protected]> wrote:
> On Wed, 23 Jul 2008 12:08:01 -0700 (PDT)
> Linus Torvalds <[email protected]> wrote:
>
> >
> >
> > On Wed, 23 Jul 2008, Pierre Ossman wrote:
> > >
> > > include/linux/scatterlist.h | 38 +++++++
> > > lib/scatterlist.c | 176 +++++++++++++++++++++++++---------
> > >
> > > Tejun Heo (1):
> > > sg: reimplement sg mapping iterator
> >
> > I'd really have been a lot happier about this one if it had had a few
> > Acked-by's from people like Jens and James.
> >
> > But I pulled, and pushed out. I think Jens is on vacation, but I'm adding
> > him to the cc anyway.
>
> Yeah, I was hoping to get Jens' input on this aswell, but this fixes
> problems in the sdhci driver so it was pushed in the hope that he won't
> NAK it too badly when he gets back.
>
> (James just got casually poked, but I wasn't even aware he was a
> suitable person for this. lib/ and kernel/ are generally a bit
> problematic when it comes to determining maintainer :/)
I think that you can see that James pushed the old sg buffer helper
functions from the git log (because it was invented for SCSI drivers).
Anyway, the new helper functions look fine though I'm too late for
reviewing it.