On Mon, Apr 11, 2011 at 9:22 AM, Adam Hoka <[email protected]> wrote: > On Sun, 10 Apr 2011 18:08:33 -0400 > Venkatesh Srinivas <[email protected]> wrote: > >> static int >> dmirror_strategy(dm_table_entry_t *table_en, struct buf *bp) >> { >> struct bio *bio; >> struct dmirror_pdev *pdev; >> struct dmirror_dev *dmcfg; >> struct dmirror_write_group *wg; >> struct dmirror_write_tx *tx; >> int ndevs; >> int i; >> >> dmcfg = table_en->target_config; >> >> switch (bp->b_cmd) { >> case (BUF_CMD_READ): >> pdev = dmirror_read_pick(dmcfg, &bp->b_bio1); >> if (pdev == NULL) { >> bp->b_flags |= B_ERROR | B_INVAL; >> bp->b_resid = 0; >> biodone(&bp->b_bio1); >> break; >> } >> >> disk_issue_read(dmcfg, pdev, &bp->b_bio1); >> break; >> case (BUF_CMD_WRITE): >> /* Allocate a write group */ >> wg = kmalloc(sizeof(struct dmirror_write_group), M_DMIRROR_WG, >> M_WAITOK); >> dmirror_wg_ctor(dmcfg, &bp->b_bio1, wg); >> >> /* Allocate one transaction per device */ >> for (i = 0; i < ndevs; i++) { >> tx = kmalloc(sizeof(struct dmirror_write_tx), >> M_DMIRROR_TX, M_WAITOK); >> dmirror_write_tx_ctor(wg, tx); >> >> } >> >> /* Setup transactions */ >> >> /* Issue requests */ >> // do some stuff, then call vn_strategy() on each tx->bio >> >> break; >> case (BUF_CMD_FLUSH): >> default: >> break; >> } >> } >> > > A bit off topic, but I dont think its a good idea to allocate memory > during I/O. :-)
Heh, totally agree there. We have an interface called MPIPE (very similar to NetBSD's pool(9)) that would allow us to reserve some transactions/groups for write-path I/O. I believe that is what the dm crypt target does. I think that'd be okay for this. -- vs
