summaryrefslogtreecommitdiffstats
path: root/sys/geom/geom_io.c
Commit message (Collapse)AuthorAgeFilesLines
* Correct bioq_disksort so that bioq_insert_tail() offers barrier semantic.gibbs2010-09-021-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add the BIO_ORDERED flag for struct bio and update bio clients to use it. The barrier semantics of bioq_insert_tail() were broken in two ways: o In bioq_disksort(), an added bio could be inserted at the head of the queue, even when a barrier was present, if the sort key for the new entry was less than that of the last queued barrier bio. o The last_offset used to generate the sort key for newly queued bios did not stay at the position of the barrier until either the barrier was de-queued, or a new barrier (which updates last_offset) was queued. When a barrier is in effect, we know that the disk will pass through the barrier position just before the "blocked bios" are released, so using the barrier's offset for last_offset is the optimal choice. sys/geom/sched/subr_disk.c: sys/kern/subr_disk.c: o Update last_offset in bioq_insert_tail(). o Only update last_offset in bioq_remove() if the removed bio is at the head of the queue (typically due to a call via bioq_takefirst()) and no barrier is active. o In bioq_disksort(), if we have a barrier (insert_point is non-NULL), set prev to the barrier and cur to it's next element. Now that last_offset is kept at the barrier position, this change isn't strictly necessary, but since we have to take a decision branch anyway, it does avoid one, no-op, loop iteration in the while loop that immediately follows. o In bioq_disksort(), bypass the normal sort for bios with the BIO_ORDERED attribute and instead insert them into the queue with bioq_insert_tail(). bioq_insert_tail() not only gives the desired command order during insertion, but also provides barrier semantics so that commands disksorted in the future cannot pass the just enqueued transaction. sys/sys/bio.h: Add BIO_ORDERED as bit 4 of the bio_flags field in struct bio. sys/cam/ata/ata_da.c: sys/cam/scsi/scsi_da.c Use an ordered command for SCSI/ATA-NCQ commands issued in response to bios with the BIO_ORDERED flag set. sys/cam/scsi/scsi_da.c Use an ordered tag when issuing a synchronize cache command. Wrap some lines to 80 columns. sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c sys/geom/geom_io.c Mark bios with the BIO_FLUSH command as BIO_ORDERED. Sponsored by: Spectra Logic Corporation MFC after: 1 month
* Untangle g_print_bio(), silencing Coverity.trasz2010-06-101-8/+7
| | | | | Found with: Coverity Prevent CID: 3566, 3567
* g_io_check: respond to zero pp->mediasize with ENXIOavg2010-04-151-2/+2
| | | | | | | | Previsouly this condition was reported with EIO by bio_offset > mediasize check. Perhaps that check should be extended to bio_offset+bio_length > mediasize. MFC after: 1 week
* Do not fetch precise time of request start when stats collection disabled.mav2010-03-241-1/+4
| | | | Reviewed by: pjd, phk
* Call wakeup() only for the first request on the queue.mav2009-12-301-2/+8
|
* MFp4:mav2009-09-061-2/+2
| | | | | | Remove msleep() timeout from g_io_schedule_up/down(). It works fine without it, saving few percents of CPU on high request rates without need to rearm callout twice per request.
* Make gjournal work with kernel compiled with "options DIAGNOSTIC".trasz2009-06-301-8/+15
| | | | | | | Previously, it would panic immediately. Reviewed by: pjd Approved by: re (kib)
* As discussed in the devsummit, introduce two fields in theluigi2009-06-111-0/+75
| | | | | | | struct bio to store classification information, and a hook for classifier functions that can be called by g_io_request(). This code is from Fabio Checconi as part of his GSOC work.
* Just a fixup for a KTRACE message I stumbled upon many moons ago.sbruno2008-09-181-1/+1
| | | | | Reviewed by: Scott Long MFC after: 2 days
* Don't limit BIO_DELETE requests to MAXPHYS, they perform no dataphk2007-12-161-3/+2
| | | | transfers, so they are not subject to the VM system limitation.
* Save stack only when KTR_GEOM is both compiled into the kernel and enabledpjd2007-10-261-5/+5
| | | | | | | in debug.ktr.mask. Because saving stack is very expensive, it's better only to do it when one really wants to. Reported by: Dan Nelson
* Implement g_delete_data() similar to g_read_data() and g_write_data().pjd2007-05-051-0/+22
| | | | OK'ed by: phk
* Use pause() rather than tsleep() on stack variables and function pointers.jhb2007-02-271-1/+1
|
* Use tsleep() rather than msleep() with a NULL mtx parameter.jhb2007-02-231-1/+1
|
* We expect 'bio_data != NULL' for BIO_{READ,WRITE,GETATTR}, but forpjd2007-01-281-2/+7
| | | | | | BIO_{DELETE,FLUSH} we expect 'bio_data == NULL'. Reviewed by: phk
* Add a new I/O request - BIO_FLUSH, which basically tells providers below topjd2006-10-311-1/+29
| | | | | | | flush their caches. For now will mostly be used by disks to flush their write cache. Sponsored by: home.pl
* Add g_duplicate_bio() function which does the same thing what g_clone_bio()pjd2006-06-051-0/+25
| | | | is doing, but g_duplicate_bio() allocates new bio with M_WAITOK flag.
* Fix a typo.ru2006-03-131-1/+1
|
* Assert proper use of bio_caller1, bio_caller2, bio_cflags, bio_driver1,pjd2006-03-011-0/+23
| | | | | | bio_driver2 and bio_pflags fields. Reviewed by: phk
* - Add a new simple facility for marking the current thread as being in ajhb2005-09-151-30/+7
| | | | | | | | | | | | | state where sleeping on a sleep queue is not allowed. The facility doesn't support recursion but uses a simple private per-thread flag (TDP_NOSLEEPING). The sleepq_add() function will panic if the flag is set and INVARIANTS is enabled. - Use this new facility to replace the g_xup and g_xdown mutexes that were (ab)used to achieve similar behavior. - Disallow sleeping in interrupt threads when invoking interrupt handlers. MFC after: 1 week Reviewed by: phk
* Use KTR to log allocations and destructions of bios.pjd2005-08-291-0/+36
| | | | This should hopefully allow to track down "duplicate free of g_bio" panics.
* By design I left a tiny race in updating the I/O statistics based onphk2005-07-251-8/+14
| | | | | | | | | | | | the assumption that performance was more important that beancounter quality statistics. As it transpires the microoptimization is not measurable in the real world and the inconsistent statistics confuse users, so revert the decision. MT6 candidate: possibly MT5 candidate: possibly
* Add KTR_GEOM, which allows tracing of basic GEOM I/O events occuringrwatson2004-10-211-0/+26
| | | | | | in the g_up and g_down threads. Each time a bio is propelled up and down the stack, an event is generating showing the provider, offset, and length, as well as thread wakeup and work status information.
* Trace information about a buffer while we still control it.ups2004-10-111-2/+3
| | | | | Reviewed by: phk Approved by: sam (mentor)
* Don't set the BIO_ONQUEUE debugging flag until we actually put the biophk2004-10-061-1/+1
| | | | onto a queue. This made the ENOMEM handling an instant panic.
* Protect the start/end counts on consumers and providers with the up/downphk2004-09-281-28/+40
| | | | | | | mutexes. Make it possible to also protect the disk statistics (at a minor cost in performance) by setting bit 2 of kern.geom.collectstats.
* - Set maximum request size to MAXPHYS (128kB), instead of DFLPHYS (64kB).pjd2004-09-281-4/+6
| | | | | | - Set minimum request size to sectorsize, instead of 512 bytes. Approved by: phk (some time ago)
* Add more KASSERTS and checks.phk2004-08-301-0/+21
|
* Introduce g_alloc_bio() as a waiting variant of g_new_bio().phk2004-08-271-3/+12
| | | | | | | Use in places where we can sleep and where we previously failed to check for a NULL pointer. MT5 candidate.
* When sending request once again because of ENOMEM, reset bio_childrenpjd2004-08-111-0/+2
| | | | | | | | | | and bio_inbed fields to 0. Without this change we can end up with I/O leakage in some rare situations. I tested this change by putting failure probability mechanism simlar to this used in NOP class into g_clone_bio(9) function, so it was able to return NULL with the given probability. Discussed with: phk
* The g_up and g_down threads use a local 'mymutex' mutex to allow WITNESSrwatson2004-06-261-0/+16
| | | | | | | | to warn about attempts to sleep in the I/O path. This change pushes the definition and use of 'mymutex' behind #ifdef WITNESS to avoid the cost in non-debugging cases. This results in a clear .22% performance win for 512 byte and 1k I/O tests on my SMP test box. Not much, but every bit counts.
* Make the sysctl kern.geom.collectstats more granular.phk2004-06-091-8/+8
| | | | | | | | | Bit 0 controls statistics collection on GEOM providers. Bit 1 controls statistics collection on GEOM consumers. Default value is 1. Prodded by: scottl
* Calculate bio_completed properly or die!pjd2004-04-041-0/+3
| | | | Approved by: phk
* Added g_print_bio() function to print informations about given bio.pjd2004-02-111-0/+34
| | | | Approved by: phk, scottl (mentor)
* Bring back the geom_bioqueues, they _are_ a good idea.phk2004-01-281-0/+27
| | | | ATA will uses these RSN.
* Correct usage of mtx_init() API. This is not a functional change sincetruckman2003-12-071-2/+2
| | | | | | the code happened to work because MTX_DEF and NULL are both defined as 0. Reviewed by: phk
* Forgotten commit: If a provider has zero sectorsize, it is anphk2003-10-221-6/+3
| | | | | | indication of lack of media. Tripped up: peter
* Remove KASSERT check for negative bio_offsets, add "normal" EIOphk2003-10-191-1/+3
| | | | error return for same.
* Allow our bio tools to be used for local bio-chopping by not mandatingphk2003-10-061-2/+7
| | | | | a bio_from value. bio_to is still mandated (mostly for debuggign) and shall be copied from the parent bio.
* Add more KASSERTS().phk2003-09-261-0/+6
|
* Reorder a couple of KASSERTS to give more sensible messages.phk2003-09-111-2/+2
| | | | Found by: GEOM 101 class of '03
* In case we encounter a zero sectorsize provider in g_io_check(), failphk2003-08-131-0/+6
| | | | the request with a printf rather than a divide by zero error.
* Sleep on "-" in our normal state to simplify debugging.phk2003-06-181-2/+2
|
* Use __FBSDID().obrien2003-06-111-2/+2
| | | | Approved by: phk
* Hide the "ENOMEM" notice messages behind bootverbose. They are stillphk2003-05-071-1/+2
| | | | | | a valuable debugging tool for certain kinds of problems. Approved by: re/scottl
* Use an uma-zone for allocation bio requests.phk2003-05-021-13/+10
|
* Back out all the stuff that didn't belong in the last commit.phk2003-05-021-7/+1
|
* Use g_slice_spoiled() rather than g_std_spoiled().phk2003-05-021-1/+7
| | | | Remember to free the buffer we got from g_read_data().
* Time has run from the "run GEOM in userland" harness, and the new regressionphk2003-04-131-9/+0
| | | | | | | test is built to test GEOM as running in the kernel. This commit is basically "unifdef -D_KERNEL" to remove the mainly #include related code to support the userland-harness.
* Retire the experimental bio_taskqueue(), it was not quite as usable asphk2003-04-121-27/+0
| | | | | hoped. It can be revived from here, should other drivers be able to use it.
OpenPOWER on IntegriCloud