2002-09-24 21:04:57

by Luben Tuikov

[permalink] [raw]
Subject: struct page question

Is it possible to build a struct page *page, where
page_address(page) == some virtual address (not high mem of course)?

The reason I want to do this is so that I can pass it to
generic_make_request(), having only a pointer to a buffer
and size to a buffer, and the fact that not all devices
have request_fn() exposed (e.g. md).

Apparently I cannot just set b_data and b_size, b_page
also has to be set and it also seems that it will
not work if page_address(b_page) != b_data...

Thanks,
--
Luben


2002-09-25 07:29:35

by Jens Axboe

[permalink] [raw]
Subject: Re: struct page question

On Tue, Sep 24 2002, Luben Tuikov wrote:
> Is it possible to build a struct page *page, where
> page_address(page) == some virtual address (not high mem of course)?
>
> The reason I want to do this is so that I can pass it to
> generic_make_request(), having only a pointer to a buffer
> and size to a buffer, and the fact that not all devices
> have request_fn() exposed (e.g. md).
>
> Apparently I cannot just set b_data and b_size, b_page
> also has to be set and it also seems that it will
> not work if page_address(b_page) != b_data...

bh->b_page = virt_to_page(va);
bh->b_data = va;

--
Jens Axboe

2002-09-25 20:51:46

by Luben Tuikov

[permalink] [raw]
Subject: Re: struct page question

Jens Axboe wrote:
>
> > Apparently I cannot just set b_data and b_size, b_page
> > also has to be set and it also seems that it will
> > not work if page_address(b_page) != b_data...
>
> bh->b_page = virt_to_page(va);
> bh->b_data = va;

Thanks Jens again.

My doubts are that va might not point to page->virtual,
but may point ``in the middle'' of the page, in which case
md will cough up since it does the page_address(b_page) != b_data
then BUG()...

I.e. I cannot guarantee about where va points (just that it is NOT
highmem).

--
Luben

2002-09-26 05:28:10

by Jens Axboe

[permalink] [raw]
Subject: Re: struct page question

On Wed, Sep 25 2002, Luben Tuikov wrote:
> Jens Axboe wrote:
> >
> > > Apparently I cannot just set b_data and b_size, b_page
> > > also has to be set and it also seems that it will
> > > not work if page_address(b_page) != b_data...
> >
> > bh->b_page = virt_to_page(va);
> > bh->b_data = va;
>
> Thanks Jens again.
>
> My doubts are that va might not point to page->virtual,
> but may point ``in the middle'' of the page, in which case
> md will cough up since it does the page_address(b_page) != b_data
> then BUG()...

It's quite legal for b_data to point to somewhere in the middle of the
page. See usage of bh_offset(). What coughs up and where?

--
Jens Axboe