On Wed, Dec 30, 2020 at 03:36:35PM -0600, David Lechner wrote: > On 12/25/20 6:15 PM, William Breathitt Gray wrote: > > > diff --git a/include/uapi/linux/counter.h b/include/uapi/linux/counter.h > > new file mode 100644 > > index 000000000000..7585dc9db19d > > --- /dev/null > > +++ b/include/uapi/linux/counter.h > > @@ -0,0 +1,123 @@ > > +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ > > +/* > > + * Userspace ABI for Counter character devices > > + * Copyright (C) 2020 William Breathitt Gray > > + */ > > +#ifndef _UAPI_COUNTER_H_ > > +#define _UAPI_COUNTER_H_ > > + > > +#include <linux/ioctl.h> > > +#include <linux/types.h> > > + > > +/* Component type definitions */ > > +enum counter_component_type { > > + COUNTER_COMPONENT_NONE, > > + COUNTER_COMPONENT_SIGNAL, > > + COUNTER_COMPONENT_COUNT, > > + COUNTER_COMPONENT_FUNCTION, > > + COUNTER_COMPONENT_SYNAPSE_ACTION, > > + COUNTER_COMPONENT_EXTENSION, > > +}; > > + > > +/* Component scope definitions */ > > +enum counter_scope { > > Do we need COUNTER_SCOPE_NONE to go with COUNTER_COMPONENT_NONE? COUNTER_COMPONENT_NONE alone should be fine because it already indicates that the 'component' member of the struct counter_watch is to be ignored (i.e. type, scope, etc. will not be evaluated and that section of code is bypassed). > > + COUNTER_SCOPE_DEVICE, > > + COUNTER_SCOPE_SIGNAL, > > + COUNTER_SCOPE_COUNT, > > +}; > > + > > +/** > > + * struct counter_component - Counter component identification > > + * @type: component type (Count, extension, etc.) > > Instead of "Count, extension, etc.", it could be more helpful > to say one of enum counter_component_type. Ack. > > + * @scope: component scope (Device, Count, or Signal) > > Same here. @scope must be one of enum counter_scope. Ack. > > + * @parent: parent component identification number > > + * @id: component identification number > > It could be helpful to say that these id numbers match > the X/Y/Z in the sysfs paths as described in the sysfs > ABI. Ack. > > + */ > > +struct counter_component { > > + __u8 type; > > + __u8 scope; > > + __u8 parent; > > + __u8 id; > > +}; > > + > > +/* Event type definitions */ > > +enum counter_event_type { > > + COUNTER_EVENT_OVERFLOW, > > + COUNTER_EVENT_UNDERFLOW, > > + COUNTER_EVENT_OVERFLOW_UNDERFLOW, > > + COUNTER_EVENT_THRESHOLD, > > + COUNTER_EVENT_INDEX, > > +}; > > + > > +/** > > + * struct counter_watch - Counter component watch configuration > > + * @component: component to watch when event triggers > > + * @event: event that triggers > > It would be helpful to say that @event must be one of > enum counter_event_type. Ack. > > + * @channel: event channel > > It would be useful to say that @channel should be 0 unless > a component has more than one event of the same type. I'll make this clearer. > > + */ > > +struct counter_watch { > > + struct counter_component component; > > + __u8 event; > > + __u8 channel; > > +}; > > + > > +/* ioctl commands */ > > +#define COUNTER_CLEAR_WATCHES_IOCTL _IO(0x3E, 0x00) > > +#define COUNTER_ADD_WATCH_IOCTL _IOW(0x3E, 0x01, struct counter_watch) > > +#define COUNTER_LOAD_WATCHES_IOCTL _IO(0x3E, 0x02) > > + > > +/** > > + * struct counter_event - Counter event data > > + * @timestamp: best estimate of time of event occurrence, in nanoseconds > > + * @value: component value > > + * @watch: component watch configuration > > + * @errno: system error number > > + */ > > +struct counter_event { > > + __aligned_u64 timestamp; > > + __aligned_u64 value; > > + struct counter_watch watch; > > + __u8 errno; > > There are error codes larger than 255. Probably better > make this __u32. Are error codes larger than 255 actually useful in this case? I noticed the exit() function will only return the least significant byte of status to the parent: https://man7.org/linux/man-pages/man3/exit.3.html William Breathitt Gray
Attachment:
signature.asc
Description: PGP signature