Date: Wed, 20 Oct 2004 12:10:01 -0700 (PDT) From: Doug Ambrisko <ambrisko@ambrisko.com> To: current@freebsd.org Subject: lio_listio fixes and adding kqueue notification patch Message-ID: <200410201910.i9KJA1wQ017232@ambrisko.com>
next in thread | raw e-mail | index | archive | help
Here's a patch to fix some lio_listio bugs and add kqueue support to it. BTW kqueue & aio_read/write is broken and that seems to have happened during the locking changes. I could use some more testers for the signal causes. http://www.ambrisko.com/doug/listio_kqueue/listio_kqueue.patch The summary is: kqueue changes: - kqueue locking removed/broke knote_remove (transformed into knlist_clear??) which no longer deletes and clean up the the knotes so they are left hanging around and can break the next transfer since they are already triggered etc. - add knlist_delete to restore knote_remove functionality to totally take it of the system. When you do an aio_return (which implies aio_free_entry) the kevent can never trigger again since the context is lost. - hack, remove the mtx_assert in knlist_empty so it can be used to see if there are kqueue's on an aio task. aio (mostly lio_listio) changes: - add kqueue support to lio_listio - fixed semantic race conditions in which tracking operations were not being compared to total number of requests. The existing code compared the finished to the count that the listio task had got submitted so far and not to the actually number of tasks that will be submitted. - aio_physwakeup did not account for jobs being split across the fast path (aio_qphysio) and the work queue (aio_daemon). This would result in jobs claiming to be done before they were. - fix another condition in which we notify the process (via signals or kqueue) the total job is done before moving the final task to the done queue. - make aio_daemon signal notification code paths use process signal so we don't send a kqueue task a signal! This check lives in process_signal so we just use that. - Don't knote or signal based on a single aio task complete if it belongs to listio job and only notify a listio if the job is complete. - Make it a failure to do an aio I/O op on raw disk bigger then the max I/O size of that driver. - use knlist_empty to see if there are aio task. Added some guards to prevent panic due to SLIST ops on an emply list. A review of this would be great with suggestions on things to change so we can get this into the tree. Thanks, Doug A.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200410201910.i9KJA1wQ017232>