struct request and rq->buffer question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

In Linux Device Drivers, chapter 16 about Block Devices, page 12-13, a
simple block device request() method is presented:

static void sbull_request(request_queue_t *q)
{
    struct request *req;
    while ((req = elv_next_request(q)) != NULL) {
        struct sbull_dev *dev = req->rq_disk->private_data;
        if (! blk_fs_request(req)) {
        	printk (KERN_NOTICE "Skip non-fs request\n");
        	end_request(req, 0);
        	continue;
        }

	sbull_transfer(dev, req->sector, req->current_nr_sectors,
                       req->buffer, rq_data_dir(req));
        end_request(req, 1);
    }
}

This method uses the rq->buffer field of the struct request to get the
location of the information to be written (or the location at which
information read from the device should be stored).

>From by understanding, this field is updated at each
end_request() by blk_recalc_rq_sectors(), so that at each iteration of
the loop, rq->buffer will be different. Is that correct ?

blk_recalc_rq_sectors() uses bio_data() to compute the address at which
the data should be read/written. But this bio_data() uses
page_address(), which only works if the page is in ZONE_NORMAL, not in
ZONE_HIGHMEM. This fact is highlighted in <linux/bio.h> :

/*
 * various member access, note that bio_data should of course not be used
 * on highmem page vectors
 */

So, who is doing the bounce buffering of the bio page when it's stored
in ZONE_HIGHMEM ? Is it safe for a block driver to blindly use
rq->buffer without knowing if the bio's page is in HIGHMEM or not ?

Thanks,

Thomas
-- 
Thomas Petazzoni, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux