Re: utrace comments

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

 



On Sun, Apr 29, 2007 at 09:02:13PM -0700, Roland McGrath wrote:
> I'm sorry I've taken so long to reply to your review comments.
> I won't dwell on that, and just dive into the discussion.
> 
> > --- linux-2.6/include/asm-i386/thread_info.h.utrace-ptrace-compat
> > +++ linux-2.6/include/asm-i386/thread_info.h
> > @@ -135,13 +135,13 @@ static inline struct thread_info *curren
> >  #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
> >  #define TIF_SINGLESTEP		4	/* restore singlestep on return to user mode */
> >  #define TIF_IRET		5	/* return with iret */
> > -#define TIF_SYSCALL_EMU		6	/* syscall emulation active */
> >  #define TIF_SYSCALL_AUDIT	7	/* syscall auditing active */
> >  #define TIF_SECCOMP		8	/* secure computing */
> >  #define TIF_RESTORE_SIGMASK	9	/* restore signal mask in do_signal() */
> >  #define TIF_MEMDIE		16
> >  #define TIF_DEBUG		17	/* uses debug registers */
> >  #define TIF_IO_BITMAP		18	/* uses I/O bitmap */
> > +#define TIF_FORCED_TF		19	/* true if TF in eflags artificially */
> > 
> > 	I think it would make a lot of sense if you simply reused the
> > 	existing flag number instead of leaving a hole.
> 
> You mean renumber 7,8,9 down to 6,7,8?  I guess there's no reason not to
> do that, I was just not changing values I didn't need to.  AFAIK the
> only thing that matters about these value is the bits < 16 that there
> and the bits >= 16 likewise, for _TIF_ALLWORK_MASK to work right.

No need to renumber.  You remove TIF_SYSCALL_EMU which is six,
so the newly added TIF_FORCED_TF could reuse that bit.

> > +/***
> > + *** These are the exported entry points for tracing engines to use.
> > + ***/
> > 
> > 	This is not a standard comment format.  It should be:
> 
> Ok.  The intention was to clearly set off those declarations from others.
> It appears the thing other linux/*.h files do for this is:
> 
> /**************************************************************************
>  * These are the exported entry points for tracing engines to use.
>  **************************************************************************/

Not really that much.  Prefered would be just a normal comment which
would stick out if the actual comments were kerneldoc in the source files.

> > 	Please don't put such long comments in headerfiles.  They should be
> > 	part of the kerneldoc comments near the actual function body so
> > 	we can extract them and autogenerate real documentation for it.
> > 	A big thanks for the huge amount of comments, btw - they're just
> > 	in the wrong place ;-)
> 
> Ok.  The kerneldoc stuff is new and strange to me, and I've never
> personally experienced its benefical features.  But I've read
> Documentation/kernel-doc-nano-HOWTO.txt now and I will try to convert all
> my documentary comments to that style.

Thanks.  If you need some help ping me or Randy.

> 
> >  	Please try consolidate all the compat code in a single #ifdef block,
> > 	preferably at the end of the file.
> 
> I did it this way to put each compat_foo near foo so it makes sense in
> context, and it's easy to remember to update it in parallel if you change
> foo.  Is it really better to move them all to an undifferentiated cluster
> at the end?

That's the normal approach.  If it's big enough it might even make
sense to give it a file of it's own to have the compat code totally
separate.  But IIRC there wasn't a whole lot of compat code in utrace.

> > 	Please don't do this kind of conditional mess.  It leads to really
> > 	ugly code like this (later in the patch):
> > 
> > #ifdef ARCH_HAS_SINGLE_STEP
> > 	if (! ARCH_HAS_SINGLE_STEP)
> > #endif
> > 		WARN_ON(flags & UTRACE_ACTION_SINGLESTEP);
> > #ifdef ARCH_HAS_BLOCK_STEP
> > 	if (! ARCH_HAS_BLOCK_STEP)
> > #endif
> > 		WARN_ON(flags & UTRACE_ACTION_BLOCKSTEP);
> > 
> > 	Instead make it a
> > 
> > 		arch_has_single_step()
> > 
> > 	which must be defined by every architecture as a boolean value, with
> > 	fixes like that the code above will become a lot more readable:
> > 
> > 	WARN_ON(!arch_has_single_step() && (flags & UTRACE_ACTION_SINGLESTEP));
> > 	WARN_ON(!arch_has_block_step() && (flags & UTRACE_ACTION_BLOCKSTEP));
> 
> I agree it's come out ugly.  The reason I complicated it was an attempt
> to make the answer testable in #if when it's constant at compile time.
> My thinking is there will be situations where you want to avoid building
> in some useless dead code and just "if (0)" is not sufficient.  But
> primarily I was thinking of avoiding building extra fancy code in lieu
> of single-step on machines/configurations where single-step is always
> available, and the current #if's don't help with that.  How about if an
> asm-arch/tracehook.h either declares arch_has_single_step or else it
> #define's one of two things and in a single place I'll add:
> 
> 	#ifdef ARCH_ALWAYS_HAS_SINGLE_STEP
> 	#define arch_has_single_step()	1
> 	#elif defined ARCH_NEVER_HAS_SINGLE_STEP
> 	#define arch_has_single_step()	0
> 	#endif

Current gcc (since 3.<something>) can optimize away code under if-branches
that are determinable at compile time, so having each architecture
define a (possible trivial) arch_has_single_step() should be fine.

Btw, is there a fundamental reason why an architecture would not support
single-stepping except for a transition period of porting, i.e. are there
real hardware limitation in any of our ports?

> > 	The coding style here is wrong .  The else should be on the line
> > 	of the closing brace.  
> 
> I can ordinarily ignore syntax, but this is an abomination in the sight
> of the Lord and always will be.  Fortunately, it's far from being 100%
> consistently used in the kernel already.  People are welcome to change
> the code after I submit it, but I just can't make myself write it that
> way, sorry.

It's used pretty consistant in core code not written by you, which
looks similarly horrible.  Please try to fit a consistant style.

> 
> [wrt utrace_regset_copy*]
> > 	This function is far too large to inline it.  Please move it out
> > 	of line.
> 
> The reason these functions are inlines is that some of their arguments
> are always constants, so they get inlined into not a whole lot more than
> the inlined memcpy.  Having these interfaces makes it a whole lot easier
> to write the machine regset code, which needs pretty simple code, but
> with constant arithmetic that's easy to louse up doing it by hand.  As
> real functions they would just be more code that always had some runtime
> arithmetic and tests it didn't need.

Needs comments in the code explaining it.

> > 	if ((tsk->utrace_flags & UTRACE_EVENT_SIGNAL_ALL) &&
> > 	    (tsk->utrace_flags & (UTRACE_ACTION_SINGLESTEP |
> > 	                          UTRACE_ACTION_BLOCKSTEP)))
> > 
> > 	Also I'm not sure why you're doing this kind of test,
> > 	as you could do a
> > 
> > 	if (current->utrace_flags & (UTRACE_EVENT_SIGNAL_ALL|
> > 			UTRACE_ACTION_SINGLESTEP|UTRACE_ACTION_BLOCKSTEP))
> 
> No, that's not equivalent.  UTRACE_EVENT_SIGNAL_ALL is not just one bit,
> but a mask of several bits.  

> > +#define REPORT(callback, ...) do { \
> > +	u32 ret = (*rcu_dereference(engine->ops)->callback) \
> > +		(engine, tsk, ##__VA_ARGS__); \
> > +	action = update_action(tsk, utrace, engine, ret); \
> > +	} while (0)
> > 
> > 	I don not think these kinds of macros are a very good idea.
> > 	Just opencode the two lines of code instead of a single
> > 	macro.
> 
> I don't agree that duplicating intricate boilerplate code is a good
> idea.  I will see if I can formulate macros more similar to those common
> in the kernel that don't increase error-prone manual duplication much.

It's just a few uses and expands to two lines of code, so avoiding
the macro probably is a good idea.

> > +const struct utrace_regset_view utrace_ppc32_view = {
> > +	.name = "ppc", .e_machine = EM_PPC,
> > +	.regsets = ppc32_regsets,
> > +	.n = sizeof ppc32_regsets / sizeof ppc32_regsets[0],
> > +};
> > +EXPORT_SYMBOL_GPL(utrace_ppc32_view);
> > +#endif
> > 
> > 	Who would be using this from modular code?
> > 	I see this is for all views, but I'd rather move the
> > 	accessor out of line than exporting all them if we
> > 	really have legitimate modular users.
> 
> utrace_native_view is expected to be the only user of the *_view symbols.
> I inlined it because on single-arch platforms it's just a constant return
> and I didn't want to add another useless call frame.  I admit this is undue
> microoptimization.  Perhaps utrace_native_view should just be non-inlined
> and exported.

Yeah, the latter probably makes sense.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux