I would propose these two apis.
/*
* fetches an event from the driver event queue. NULL means that queue
* is empty. Can sleep if needed. The memory for cxl_event is allocated
* by module being called. Hence it can be potentially be larger then
* sizeof(struct cxl_event). Multiple calls to this should return same
* pointer untill ack_event is called.
*/
struct cxl_event * fetch_event(struct cxl_context * ctx);
/*
* Returns and acknowledge the struct cxl_event * back to the driver
* which can then free it or maybe put it back in a kmem_cache. This
* should be called once we have completely returned the current
* struct cxl_event from the readcall
*/
void ack_event(struct cxl_context * ctx, struct cxl_event *);