Re: [PATCH 2.4] the perils of kunmap_atomic

From: Nigel Cunningham
Date: Tue Oct 26 2004 - 18:53:18 EST


Hi again.

On Wed, 2004-10-27 at 09:31, Jeff Garzik wrote:
> kunmap_atomic() violates the Principle of Least Surprise in a nasty way.
> kmap(), kunmap(), and kmap_atomic() all take struct page* to
> reference the memory location. kunmap_atomic() is the oddball of the
> three, and takes a kernel address.
>
> Ignoring the driver-related bugs that are present due to
> kunmap_atomic()'s weirdness, there also appears to be a big in the
> !CONFIG_HIGHMEM implementation in 2.4.x.
>
> (Bart is poking through some of the 2.6.x-related kunmap_atomic slip-ups)
>
> Anyway, what do people think about the attached patch to 2.4.x? I'm
> surprised it has gone unnoticed until now.
>
> Jeff

On second thoughts, I think it's a bad idea to change the macro - in 2.6
at least. There are lots of uses of kunmap_atomic, and most of them do
the right thing. It's only inattentive people like me that need to fix
their code. :>

It would be good, though, to have kunmap_atomic warn on invalid
parameters (want a patch for that?)

Nigel

>
> ______________________________________________________________________
> ===== include/linux/highmem.h 1.12 vs edited =====
> --- 1.12/include/linux/highmem.h 2003-06-30 20:18:42 -04:00
> +++ edited/include/linux/highmem.h 2004-10-26 19:26:14 -04:00
> @@ -70,7 +70,7 @@
> #define kunmap(page) do { } while (0)
>
> #define kmap_atomic(page,idx) kmap(page)
> -#define kunmap_atomic(page,idx) kunmap(page)
> +#define kunmap_atomic(addr,idx) kunmap(virt_to_page(addr))
>
> #define bh_kmap(bh) ((bh)->b_data)
> #define bh_kunmap(bh) do { } while (0)
--
Nigel Cunningham
Pastoral Worker
Christian Reformed Church of Tuggeranong
PO Box 1004, Tuggeranong, ACT 2901

Everyone lives by faith. Some people just don't believe it.
Want proof? Try to prove that the theory of evolution is true.

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