[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Re: [PATCH] Mini-OS events handling cleanup



Hi Grzegorz,

I've made a few coding-style comments inline.

-- 
Horms                                           
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/

On Wed, 5 Jul 2006 11:22:20 +0100, Grzegorz Milos wrote:
> 
> --Apple-Mail-3--158434814
> Content-Transfer-Encoding: 7bit
> Content-Type: text/plain;
>       charset=US-ASCII;
>       format=flowed
> 
> Hello Keir, could you apply the following cleanup patch?
> 
> Cheers
> Gregor
> 
> 
> --Apple-Mail-3--158434814
> Content-Transfer-Encoding: 7bit
> Content-Type: application/octet-stream; x-unix-mode=0644;
>       name="minios.events.patch"
> Content-Disposition: attachment;
>       filename=minios.events.patch
> 
> # HG changeset patch
> # User gm281@xxxxxxxxxxxxxxxxxx
> # Node ID ef01229d6344d7ff1c8970512fdb812445ec3430
> # Parent  c3d6610fc0f0510a09bd3d6c63a4e8a3f78312cc
> Mini-OS: Events handling cleaned up. The interface extended to provide void* 
> pointer to handlers.
> 
> Signed-off-by: Steven Smith <sos22@xxxxxxxxx>
> Signed-off-by: Grzegorz Milos <gm281@xxxxxxxxx>
> 
> diff -r c3d6610fc0f0 -r ef01229d6344 extras/mini-os/console/xencons_ring.c
> --- a/extras/mini-os/console/xencons_ring.c   Wed Jul  5 10:06:14 2006
> +++ b/extras/mini-os/console/xencons_ring.c   Wed Jul  5 10:20:15 2006
> @@ -53,7 +53,7 @@
> 
> 
> 
> -static void handle_input(int port, struct pt_regs *regs)
> +static void handle_input(int port, struct pt_regs *regs, void *ign)
> {
>       struct xencons_interface *intf = xencons_interface();
>       XENCONS_RING_IDX cons, prod;
> @@ -83,7 +83,8 @@
>       if (!start_info.console_evtchn)
>               return 0;
> 
> -     err = bind_evtchn(start_info.console_evtchn, handle_input);
> +     err = bind_evtchn(start_info.console_evtchn, handle_input,
> +                       NULL);

Could you move the NULL ont the same line as bind_evtchn( ?

>       if (err <= 0) {
>               printk("XEN console request chn bind failed %i\n", err);
>               return err;
> diff -r c3d6610fc0f0 -r ef01229d6344 extras/mini-os/events.c
> --- a/extras/mini-os/events.c Wed Jul  5 10:06:14 2006
> +++ b/extras/mini-os/events.c Wed Jul  5 10:20:15 2006
> @@ -22,9 +22,18 @@
> #include <events.h>
> #include <lib.h>
> 
> +#define NR_EVS 1024
> +
> +/* this represents a event handler. Chaining or sharing is not allowed */
> +typedef struct _ev_action_t {
> +     void (*handler)(int, struct pt_regs *, void *);
> +     void *data;
> +    u32 count;
> +} ev_action_t;
> +

Tabs and spaces are used inconsistently in the above structure definition.

> static ev_action_t ev_actions[NR_EVS];
> -void default_handler(int port, struct pt_regs *regs);
> +void default_handler(int port, struct pt_regs *regs, void *data);
> 
> 
> /*
> @@ -35,42 +44,33 @@
>     ev_action_t  *action;
>     if (port >= NR_EVS) {
>         printk("Port number too large: %d\n", port);
> -        goto out;
> +             goto out;
>     }
> 
>     action = &ev_actions[port];
>     action->count++;
> 
> -    if (!action->handler)
> -    {
> -        printk("Spurious event on port %d\n", port);
> -        goto out;
> -    }
> -    
> -    if (action->status & EVS_DISABLED)
> -    {
> -        printk("Event on port %d disabled\n", port);
> -        goto out;
> -    }
> -    
>     /* call the handler */
> -    action->handler(port, regs);
> -    
> +     action->handler(port, regs, action->data);
> +
>  out:
>       clear_evtchn(port);
> +
>     return 1;
> 
> }
> 
> -int bind_evtchn( u32 port, void (*handler)(int, struct pt_regs *) )
> +int bind_evtchn( u32 port, void (*handler)(int, struct pt_regs *, void *),
> +                              void *data )
> {
>       if(ev_actions[port].handler != default_handler)
>         printk("WARN: Handler for port %d already registered, replacing\n",
>                               port);
> 
> +     ev_actions[port].data = data;
> +     wmb();
>       ev_actions[port].handler = handler;
> -     ev_actions[port].status &= ~EVS_DISABLED;         
> - 
> +
>       /* Finally unmask the port */
>       unmask_evtchn(port);
> 
> @@ -82,13 +82,14 @@
>       if (ev_actions[port].handler == default_handler)
>               printk("WARN: No handler for port %d when unbinding\n", port);
>       ev_actions[port].handler = default_handler;
> -     ev_actions[port].status |= EVS_DISABLED;
> +     wmb();
> +     ev_actions[port].data = NULL;
> }

I'm not expert here, but the wmb() additions seem a bit odd.
Are the neccessary?

> 
> -int bind_virq( u32 virq, void (*handler)(int, struct pt_regs *) )
> +int bind_virq( u32 virq, void (*handler)(int, struct pt_regs *, void *data),
> +                        void *data)
> {
>       evtchn_op_t op;
> -     int ret = 0;
> 
>       /* Try to bind the virq to a port */
>       op.cmd = EVTCHNOP_bind_virq;
> @@ -97,13 +98,11 @@
> 
>       if ( HYPERVISOR_event_channel_op(&op) != 0 )
>       {
> -             ret = 1;
>               printk("Failed to bind virtual IRQ %d\n", virq);
> -             goto out;
> +             return 1;
>     }
> -    bind_evtchn(op.u.bind_virq.port, handler);       
> -out:
> -     return ret;
> +    bind_evtchn(op.u.bind_virq.port, handler, data);
> +     return 0;
> }
> 
> void unbind_virq( u32 port )
> @@ -137,13 +136,38 @@
> #endif
>     /* inintialise event handler */
>     for ( i = 0; i < NR_EVS; i++ )
> -    {
> -        ev_actions[i].status  = EVS_DISABLED;
> +     {
>         ev_actions[i].handler = default_handler;
>         mask_evtchn(i);
>     }
> }
> 
> -void default_handler(int port, struct pt_regs *regs) {
> +void default_handler(int port, struct pt_regs *regs, void *ignore)
> +{
>     printk("[Port %d] - event received\n", port);
> }
> +
> +/* Unfortunate confusion of terminology: the port is unbound as far
> +   as Xen is concerned, but we automatically bind a handler to it
> +   from inside mini-os. */
> +int evtchn_alloc_unbound(void (*handler)(int, struct pt_regs *regs,
> +                                                                             
>  void *data),
> +                                              void *data)
> +{
> +     u32 port;
> +     evtchn_op_t op;
> +     int err;
> +
> +     op.cmd = EVTCHNOP_alloc_unbound;
> +     op.u.alloc_unbound.dom = DOMID_SELF;
> +     op.u.alloc_unbound.remote_dom = 0;
> +
> +     err = HYPERVISOR_event_channel_op(&op);
> +     if (err) {
> +             printk("Failed to alloc unbound evtchn: %d.\n", err);
> +             return -1;
> +     }
> +     port = op.u.alloc_unbound.port;
> +     bind_evtchn(port, handler, data);
> +     return port;
> +}
> diff -r c3d6610fc0f0 -r ef01229d6344 extras/mini-os/include/events.h
> --- a/extras/mini-os/include/events.h Wed Jul  5 10:06:14 2006
> +++ b/extras/mini-os/include/events.h Wed Jul  5 10:20:15 2006
> @@ -22,28 +22,18 @@
> #include<traps.h>
> #include <xen/event_channel.h>
> 
> -#define NR_EVS 1024
> -
> -/* ev handler status */
> -#define EVS_INPROGRESS       1       /* Event handler active - do not enter! 
> */
> -#define EVS_DISABLED 2       /* Event disabled - do not enter! */
> -#define EVS_PENDING      4   /* Event pending - replay on enable */
> -#define EVS_REPLAY       8   /* Event has been replayed but not acked yet */
> -
> -/* this represents a event handler. Chaining or sharing is not allowed */
> -typedef struct _ev_action_t {
> -     void (*handler)(int, struct pt_regs *);
> -    unsigned int status;             /* IRQ status */
> -    u32 count;
> -} ev_action_t;
> -
> /* prototypes */
> int do_event(u32 port, struct pt_regs *regs);
> -int bind_virq( u32 virq, void (*handler)(int, struct pt_regs *) );
> -int bind_evtchn( u32 virq, void (*handler)(int, struct pt_regs *) );
> +int bind_virq( u32 virq, void (*handler)(int, struct pt_regs *, void *data),
> +                        void *data);
> +int bind_evtchn( u32 virq, void (*handler)(int, struct pt_regs *, void 
> *data),
> +                              void *data );
> void unbind_evtchn( u32 port );
> void init_events(void);
> void unbind_virq( u32 port );
> +int evtchn_alloc_unbound(void (*handler)(int, struct pt_regs *regs,
> +                                                                             
>  void *data),
> +                                              void *data);
> 
> static inline int notify_remote_via_evtchn(int port)
> {
> diff -r c3d6610fc0f0 -r ef01229d6344 extras/mini-os/include/lib.h
> --- a/extras/mini-os/include/lib.h    Wed Jul  5 10:06:14 2006
> +++ b/extras/mini-os/include/lib.h    Wed Jul  5 10:20:15 2006
> @@ -89,6 +89,7 @@
> char  *strchr(const char *s, int c);
> char  *strstr(const char *s1, const char *s2);
> char * strcat(char * dest, const char * src);
> +char  *strdup(const char *s);

Is this strdup addition related to the rest of the patch?

> #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
> @@ -98,6 +99,18 @@
>     size_t iov_len;
> };
> 
> +#define ASSERT(x)                                              \
> +do {                                                           \
> +     if (!(x)) {                                                \
> +             printk("ASSERTION FAILED: %s at %s:%d.\n",             \
> +                        # x ,                                           \
> +                        __FILE__,                                       \
> +                        __LINE__);                                      \

Could the above 4 lines be merged into one or two?
Also, is the do {} while(0) blocl neccessary if evertthing is
inside an if() { } block ?


> +        BUG();                                                 \
> +     }                                                          \
> +} while(0)
> 
> +/* Consistency check as much as possible. */
> +void sanity_check(void);
> 
> #endif /* _LIB_H_ */
> diff -r c3d6610fc0f0 -r ef01229d6344 extras/mini-os/lib/string.c
> --- a/extras/mini-os/lib/string.c     Wed Jul  5 10:06:14 2006
> +++ b/extras/mini-os/lib/string.c     Wed Jul  5 10:20:15 2006
> @@ -23,6 +23,7 @@
> #include <os.h>
> #include <types.h>
> #include <lib.h>
> +#include <xmalloc.h>
> 
> int memcmp(const void * cs,const void * ct,size_t count)
> {
> @@ -156,4 +157,13 @@
>         return NULL;
> }
> 
> +char *strdup(const char *x)
> +{
> +    int l = strlen(x);
> +    char *res = malloc(l + 1);
> +     if (!res) return NULL;
> +    memcpy(res, x, l + 1);
> +    return res;
> +}
> +
> #endif

Again, strdup.

> diff -r c3d6610fc0f0 -r ef01229d6344 extras/mini-os/time.c
> --- a/extras/mini-os/time.c   Wed Jul  5 10:06:14 2006
> +++ b/extras/mini-os/time.c   Wed Jul  5 10:20:15 2006
> @@ -215,7 +215,7 @@
> /*
>  * Just a dummy 
>  */
> -static void timer_handler(int ev, struct pt_regs *regs)
> +static void timer_handler(int ev, struct pt_regs *regs, void *ign)
> {
>     static int i;
> 
> @@ -233,5 +233,5 @@
> void init_time(void)
> {
>     printk("Initialising timer interface\n");
> -    bind_virq(VIRQ_TIMER, &timer_handler);
> -}
> +    bind_virq(VIRQ_TIMER, &timer_handler, NULL);
> +}
> diff -r c3d6610fc0f0 -r ef01229d6344 extras/mini-os/xenbus/xenbus.c
> --- a/extras/mini-os/xenbus/xenbus.c  Wed Jul  5 10:06:14 2006
> +++ b/extras/mini-os/xenbus/xenbus.c  Wed Jul  5 10:20:15 2006
> @@ -112,7 +112,7 @@
>     }
> }
> 
> -static void xenbus_evtchn_handler(int port, struct pt_regs *regs)
> +static void xenbus_evtchn_handler(int port, struct pt_regs *regs, void *ign)
> {
>     wake_up(&xb_waitq);
> }
> @@ -174,7 +174,8 @@
>     create_thread("xenstore", xenbus_thread_func, NULL);
>     DEBUG("buf at %p.\n", xenstore_buf);
>     err = bind_evtchn(start_info.store_evtchn,
> -                   xenbus_evtchn_handler);
> +                   xenbus_evtchn_handler,
> +              NULL);

Again, could the NULL be appended to the previous line?

>     DEBUG("xenbus on irq %d\n", err);
> }
> 
> 
> --Apple-Mail-3--158434814
> Content-Type: text/plain; charset="us-ascii"
> MIME-Version: 1.0
> Content-Transfer-Encoding: 7bit
> Content-Disposition: inline
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
> 
> --Apple-Mail-3--158434814--
> 
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.