[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/3] tools/libs/evtchn: decouple more from mini-os
On 11.01.22 20:56, Andrew Cooper wrote: On 11/01/2022 15:03, Juergen Gross wrote:diff --git a/tools/libs/evtchn/minios.c b/tools/libs/evtchn/minios.c index e5dfdc5ef5..c3a5ce3b98 100644 --- a/tools/libs/evtchn/minios.c +++ b/tools/libs/evtchn/minios.c @@ -38,29 +38,40 @@#include "private.h" -extern void minios_evtchn_close_fd(int fd);+LIST_HEAD(port_list, port_info); + +struct port_info { + LIST_ENTRY(port_info) list; + evtchn_port_t port; + bool pending; + bool bound; +};extern struct wait_queue_head event_queue;Yuck. This should come from minios's evtchn header, rather than being extern'd like this, but lets consider that future cleanup work. I think I should do that rather sooner than later. +int minios_evtchn_close_fd(int fd);You don't need this forward declaration, because nothing in this file calls minios_evtchn_close_fd(). The extern should simply be deleted, and it removes a hunk from your later xen.git series. Without it I get a build error due to no prototype defined. @@ -69,18 +80,54 @@ static void port_dealloc(struct evtchn_port_info *port_info) free(port_info); }+int minios_evtchn_close_fd(int fd)+{ + struct port_info *port_info, *tmp; + struct file *file = get_file_from_fd(fd); + struct port_list *port_list = file->dev;Looking at this, the file_ops don't need to have the C ABI. The single caller already needs access to the file structure, so could pass both file and fd in to the ops->close() function. Thoughts? If we do this for close(), we should do it for all callbacks. I think we don't need fd at all in the callbacks, so switching to file seems to be the way to go. + + LIST_FOREACH_SAFE(port_info, port_list, list, tmp) + port_dealloc(port_info); + free(port_list); + + return 0; +} + +static struct file_ops evtchn_ops = {This wants to become const, when alloc_file_type() has been appropriately const'd. Yes. + .name = "evtchn", + .close = minios_evtchn_close_fd, + .select_rd = select_read_flag, +}; + /* * XENEVTCHN_NO_CLOEXEC is being ignored, as there is no exec() call supported * in Mini-OS. */ int osdep_evtchn_open(xenevtchn_handle *xce, unsigned int flags) { - int fd = alloc_fd(FTYPE_EVTCHN); + int fd; + struct file *file; + struct port_list *list; + static unsigned int ftype_evtchn;- if ( fd == -1 )+ if ( !ftype_evtchn ) + ftype_evtchn = alloc_file_type(&evtchn_ops);Hmm. MiniOS doesn't appear to support __attribute__((constructor)) but this would be an ideal candidate. It would remove a non-threadsafe singleton from a (largely unrelated) codepath. Should be very simple to add to MiniOS. See Xen's init_constructors(), and add CONSTRUCTORS to the linker file. I'll look into this. @@ -134,42 +171,43 @@ int xenevtchn_notify(xenevtchn_handle *xce, evtchn_port_t port)static void evtchn_handler(evtchn_port_t port, struct pt_regs *regs, void *data){ - int fd = (int)(intptr_t)data; - struct evtchn_port_info *port_info; + xenevtchn_handle *xce = data; + struct file *file = get_file_from_fd(xce->fd); + struct port_info *port_info; + struct port_list *port_list;- assert(files[fd].type == FTYPE_EVTCHN);+ assert(file); + port_list = file->dev; mask_evtchn(port); - LIST_FOREACH(port_info, &files[fd].evtchn.ports, list) + LIST_FOREACH(port_info, port_list, list) { if ( port_info->port == port ) goto found; }- printk("Unknown port for handle %d\n", fd);+ printk("Unknown port for handle %d\n", xce->fd);As you're editing this line anyway, it really wants to become "Unknown port %d for handle %d\n". Okay. Juergen Attachment:
OpenPGP_0xB0DE9DD628BF132F.asc Attachment:
OpenPGP_signature
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |