Messages in this thread | | | Date | Thu, 31 Oct 2019 15:51:27 +0100 | From | Christoph Hellwig <> | Subject | Re: [RFC] nvmet: Always remove processed AER elements from list |
| |
On Wed, Oct 30, 2019 at 04:24:18PM +0100, Daniel Wagner wrote: > All async events are enqueued via nvmet_add_async_event() which > updates the ctrl->async_event_cmds[] array and additionally an struct > nvmet_async_event is added to the ctrl->async_events list. > > Under normal operations the nvmet_async_event_work() updates again the > ctrl->async_event_cmds and removes the corresponding struct > nvmet_async_event from the list again. Though nvmet_sq_destroy() could > be called which calles nvmet_async_events_free() which only updates > the ctrl->async_event_cmds[] array. > > Add a new function nvmet_async_events_process() which processes the > async events and updates both array and the list. With this we avoid > having two places where the array and list are modified.
I don't think this patch is correct. We can have AEN commands pending that aren't used - that is the host sent the command, but the target did not have even event yet. That means the command sits in async_event_cmds, but there is no entry in >async_events for it yet.
That being said I think what we want is to do the loop in your new nvmet_async_events_free first, but after that still call the loop in the existing nvmet_async_events_free after that. That ensures we first flush out everything in ->async_events, and then also return any potential remaining entry.
| |