[pso] [Tema5][Linux]End Request

Razvan Deaconescu razvand at cs.pub.ro
Sun Jun 24 23:20:40 EEST 2007


sorin gsmcreation wrote:
> Salut!
> 
> In functia de transfer a requesturilor, as vrea sa nu
> completez imediat requestul venit din userspace,
> deoarece as vrea sa o prelucrez cu ajutorul schedule
> work:
> 
> if (write)
> {
> INIT_WORK (&write_work, write_work_handler, info);
> schedule_work (&write_work);
> }
> else
> {
> INIT_WORK (&read_work, read_work_handler, info);
> schedule_work (&read_work);
> }
> 
> Info este de tipul unei structuri care incapsuleaza si
> request-ul curent.
> Daca pun end_request(req, 1) in write_work_handler sau
> read_work_handler, se ajunge la deadlock. Singura
> varianta care merge este end_request(req, 1) chiar
> dupa acest if-else. Care ar fi solutia sa pot apela
> end_request(req, 1) mai tarziu totusi?

De ce nu faci prelucrare la nivel de bio? Nu trebuie sa inregistrezi o 
rutina de tratare a unei cereri (request), ci poti inregistra o rutina 
de tratare a unui bio. In felul acesta, driver-ul tau va opera, prin 
intermediul rutinei propuse, asupra unui singur bio (pe rand).

Faci acest lucru in partea de initializare a discului in felul urmator:

---
         dev->queue = blk_alloc_queue (GFP_KERNEL);
         if (dev->queue == NULL) {
                 printk (KERN_ERR "cannot allocate block device queue\n");
                 return -ENOMEM;
         }
         blk_queue_make_request (dev->queue, my_bio_request_fun);
---

unde my_bio_request_fun are signatura:
int my_bio_request_fun (request_queue_t *q, struct bio *bio);

Gasesti informatii suplimentare in LDD 3rd Edition 
(http://lwn.net/Kernel/LDD3/) capitolul 16 (Block Drivers), pagina 489, 
sectiunea 'Doing without a request queue'

Am adaugat si in sectiunea temei aceasta precizare: 
http://cs.pub.ro/~pso/index.php?section=Teme&file=05.%20Software%20RAID#Precizari_Linux

Razvan


More information about the pso mailing list