[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
Description: OpenPGP public key
Attachment:
OpenPGP_signature
Description: OpenPGP digital signature
|