asynchronous request procesisng in ram based block dev driver

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

 



hi
i have written a very simple ram based block device driver
processing request asynchronously

wherein
in request function -- dequeue the req from req queue and add it to the linked list
then in the function triggered by timer
handle each req from the linked list
then blk_end_requets is called upon completion of request .


what i guess is prob is in calculating page_address from bv->bv_page
pl guide me the correct way ..i m not able to come out of this prob .....


pl help
(i have to send code coz otherwise i wont be able to tell my problem )

but my program hangs doing nothing ....will u pl see my code once highlighted lines are the ones of some use ..

static void blkdev_req_fn(struct request_queue *q)
{
        struct request *req;
    
        unsigned long flags;
        struct filtered_request * my_req=NULL;
        while((req = elv_next_request(q)) != NULL){
            
                if(!blk_fs_request(req)){
                        printk(KERN_ALERT"this is not read write type request");
                       end_request(req, 0);
                        continue;
                }

                blkdev_dequeue_request(req);
                my_req = (struct filtered_request*)kzalloc(sizeof(struct filtered_request),GFP_KERNEL);
                my_req->req=req;
                INIT_LIST_HEAD(&(my_req->link));
                spin_lock_irqsave(&(frqp->lock),flags);
                list_add_tail(&(my_req->link),&(frqp->queue_head));
                spin_unlock_irqrestore(&(frqp->lock),flags);

        }
        return;
}



static void set_timer_req_process(void)
{

/*Function to initialize timer*/
        init_timer(&timer);
        timer.function=handle_timer;
        t.frqp=frqp;
        t.dev_struct=dev_struct;
        timer.data="" long)(&t);
        timer.expires=jiffies+(1*HZ);
        add_timer(&timer);
}





static void handle_timer(unsigned long data)
{
        struct filtered_request *pos;
        struct request* my_req= NULL;
        struct bio_vec *bv=NULL;
        struct req_iterator iter;
        char *buffer = NULL;
        char *buffer_start = NULL;
        unsigned long offset,nrbytes=0;
        unsigned long  flags,flags2;

        struct filtered_request_queue *frqp;
        struct temp* tp = (struct temp*)data;
        struct blkdev_device *dev;
        frqp=tp->frqp;
        dev = tp->dev_struct;

        spin_lock_irqsave(&(frqp->
lock),flags);
        if(!list_empty(&(frqp->queue_head)))
        {
                 list_for_each_entry(pos,&(frqp->queue_head),link)
                {
                        my_req = pos->req;
                        blk_dump_rq_flags(my_req, "\nBEFORENIDHI");
                        rq_for_each_segment(bv, my_req, iter)
                        {
                                //local_irq_save(flags2);
                                //buffer_start=kmap_atomic(bv->bv_page,KM_BIO_SRC_IRQ);
                                buffer_start=(char*)page_address(bv->bv_page);
                                buffer = buffer_start+bv->bv_offset;
                                offset  = (my_req->sector)<<9;
                                nrbytes = bv->bv_len;
                                if(rq_data_dir(my_req)){
                                // Write request
                                memcpy(dev->buffer+offset,buffer,nrbytes);
                                }else {                 //Read request
                                     memcpy(buffer,dev->buffer+offset,nrbytes);
                                }

                                my_req->sector += (bv->bv_len) >> 9;
                                //kunmap_atomic(bv->bv_page,KM_BIO_SRC_IRQ);
                                //local_irq_restore(flags2);

                        }//rq_for_each
                        blk_dump_rq_flags(my_req, "\nAFTERNIDHI");
                        blk_end_request(my_req,0,my_req->nr_sectors<<9);
                      
                }

        }//!list_empty 
        spin_unlock_irqrestore(&(frqp->lock),flags);


}//function









--


--
Thanks & Regards
Nidhi

[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