Re: [PATCH 1/3] Add a coding style document for loader, and also add scripts/Lindent

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

 



Just a week ago David posted xorg coding style as a guideline (http://www.x.org/wiki/CodingStyle). It differs from this one especially in the indentation width. So if we change the indent width to 4 spaces then I agree. 

(Or we could just use tabs everywhere and let everybody to use his own size for display purposes...)

Also we shouldn't be converting/indenting whole C files at once. It makes git blame useless and that is the reason we haven't done it ages ago.

Martin

----- "Peter Jones" <pjones@xxxxxxxxxx> wrote:

> This patch adds a coding style document to this directory so that
> people
> creating new files in here - or fixing old ones - will know what to
> do.
> 
> It's not perfect, but it's better than what we've got right now.
> ---
>  docs/CodingStyleForC |  824
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>  scripts/Lindent      |   18 ++
>  2 files changed, 842 insertions(+), 0 deletions(-)
>  create mode 100644 docs/CodingStyleForC
>  create mode 100755 scripts/Lindent
> 
> diff --git a/docs/CodingStyleForC b/docs/CodingStyleForC
> new file mode 100644
> index 0000000..8bb3723
> --- /dev/null
> +++ b/docs/CodingStyleForC
> @@ -0,0 +1,824 @@
> +
> +		Linux kernel coding style
> +
> +This is a short document describing the preferred coding style for
> the
> +linux kernel.  Coding style is very personal, and I won't _force_ my
> +views on anybody, but this is what goes for anything that I have to
> be
> +able to maintain, and I'd prefer it for most other things too. 
> Please
> +at least consider the points made here.
> +
> +First off, I'd suggest printing out a copy of the GNU coding
> standards,
> +and NOT read it.  Burn them, it's a great symbolic gesture.
> +
> +Anyway, here goes:
> +
> +
> +	 	Chapter 1: Indentation
> +
> +Tabs are 8 characters, and thus indentations are also 8 characters.
> +There are heretic movements that try to make indentations 4 (or even
> 2!)
> +characters deep, and that is akin to trying to define the value of PI
> to
> +be 3.
> +
> +Rationale: The whole idea behind indentation is to clearly define
> where
> +a block of control starts and ends.  Especially when you've been
> looking
> +at your screen for 20 straight hours, you'll find it a lot easier to
> see
> +how the indentation works if you have large indentations.
> +
> +Now, some people will claim that having 8-character indentations
> makes
> +the code move too far to the right, and makes it hard to read on a
> +80-character terminal screen.  The answer to that is that if you
> need
> +more than 3 levels of indentation, you're screwed anyway, and should
> fix
> +your program.
> +
> +In short, 8-char indents make things easier to read, and have the
> added
> +benefit of warning you when you're nesting your functions too deep.
> +Heed that warning.
> +
> +The preferred way to ease multiple indentation levels in a switch
> statement is
> +to align the "switch" and its subordinate "case" labels in the same
> column
> +instead of "double-indenting" the "case" labels.  E.g.:
> +
> +	switch (suffix) {
> +	case 'G':
> +	case 'g':
> +		mem <<= 30;
> +		break;
> +	case 'M':
> +	case 'm':
> +		mem <<= 20;
> +		break;
> +	case 'K':
> +	case 'k':
> +		mem <<= 10;
> +		/* fall through */
> +	default:
> +		break;
> +	}
> +
> +
> +Don't put multiple statements on a single line unless you have
> +something to hide:
> +
> +	if (condition) do_this;
> +	  do_something_everytime;
> +
> +Don't put multiple assignments on a single line either.  Kernel
> coding style
> +is super simple.  Avoid tricky expressions.
> +
> +Outside of comments, documentation and except in Kconfig, spaces are
> never
> +used for indentation, and the above example is deliberately broken.
> +
> +Get a decent editor and don't leave whitespace at the end of lines.
> +
> +
> +		Chapter 2: Breaking long lines and strings
> +
> +Coding style is all about readability and maintainability using
> commonly
> +available tools.
> +
> +The limit on the length of lines is 80 columns and this is a
> strongly
> +preferred limit.
> +
> +Statements longer than 80 columns will be broken into sensible
> chunks.
> +Descendants are always substantially shorter than the parent and are
> placed
> +substantially to the right. The same applies to function headers with
> a long
> +argument list. Long strings are as well broken into shorter strings.
> The
> +only exception to this is where exceeding 80 columns significantly
> increases
> +readability and does not hide information.
> +
> +void fun(int a, int b, int c)
> +{
> +	if (condition)
> +		printk(KERN_WARNING "Warning this is a long printk with "
> +						"3 parameters a: %u b: %u "
> +						"c: %u \n", a, b, c);
> +	else
> +		next_statement;
> +}
> +
> +		Chapter 3: Placing Braces and Spaces
> +
> +The other issue that always comes up in C styling is the placement
> of
> +braces.  Unlike the indent size, there are few technical reasons to
> +choose one placement strategy over the other, but the preferred way,
> as
> +shown to us by the prophets Kernighan and Ritchie, is to put the
> opening
> +brace last on the line, and put the closing brace first, thusly:
> +
> +	if (x is true) {
> +		we do y
> +	}
> +
> +This applies to all non-function statement blocks (if, switch, for,
> +while, do).  E.g.:
> +
> +	switch (action) {
> +	case KOBJ_ADD:
> +		return "add";
> +	case KOBJ_REMOVE:
> +		return "remove";
> +	case KOBJ_CHANGE:
> +		return "change";
> +	default:
> +		return NULL;
> +	}
> +
> +However, there is one special case, namely functions: they have the
> +opening brace at the beginning of the next line, thus:
> +
> +	int function(int x)
> +	{
> +		body of function
> +	}
> +
> +Heretic people all over the world have claimed that this
> inconsistency
> +is ...  well ...  inconsistent, but all right-thinking people know
> that
> +(a) K&R are _right_ and (b) K&R are right.  Besides, functions are
> +special anyway (you can't nest them in C).
> +
> +Note that the closing brace is empty on a line of its own, _except_
> in
> +the cases where it is followed by a continuation of the same
> statement,
> +ie a "while" in a do-statement or an "else" in an if-statement, like
> +this:
> +
> +	do {
> +		body of do-loop
> +	} while (condition);
> +
> +and
> +
> +	if (x == y) {
> +		..
> +	} else if (x > y) {
> +		...
> +	} else {
> +		....
> +	}
> +
> +Rationale: K&R.
> +
> +Also, note that this brace-placement also minimizes the number of
> empty
> +(or almost empty) lines, without any loss of readability.  Thus, as
> the
> +supply of new-lines on your screen is not a renewable resource
> (think
> +25-line terminal screens here), you have more empty lines to put
> +comments on.
> +
> +Do not unnecessarily use braces where a single statement will do.
> +
> +if (condition)
> +	action();
> +
> +This does not apply if one branch of a conditional statement is a
> single
> +statement. Use braces in both branches.
> +
> +if (condition) {
> +	do_this();
> +	do_that();
> +} else {
> +	otherwise();
> +}
> +
> +		3.1:  Spaces
> +
> +Linux kernel style for use of spaces depends (mostly) on
> +function-versus-keyword usage.  Use a space after (most) keywords. 
> The
> +notable exceptions are sizeof, typeof, alignof, and __attribute__,
> which look
> +somewhat like functions (and are usually used with parentheses in
> Linux,
> +although they are not required in the language, as in: "sizeof info"
> after
> +"struct fileinfo info;" is declared).
> +
> +So use a space after these keywords:
> +	if, switch, case, for, do, while
> +but not with sizeof, typeof, alignof, or __attribute__.  E.g.,
> +	s = sizeof(struct file);
> +
> +Do not add spaces around (inside) parenthesized expressions.  This
> example is
> +*bad*:
> +
> +	s = sizeof( struct file );
> +
> +When declaring pointer data or a function that returns a pointer
> type, the
> +preferred use of '*' is adjacent to the data name or function name
> and not
> +adjacent to the type name.  Examples:
> +
> +	char *linux_banner;
> +	unsigned long long memparse(char *ptr, char **retptr);
> +	char *match_strdup(substring_t *s);
> +
> +Use one space around (on each side of) most binary and ternary
> operators,
> +such as any of these:
> +
> +	=  +  -  <  >  *  /  %  |  &  ^  <=  >=  ==  !=  ?  :
> +
> +but no space after unary operators:
> +	&  *  +  -  ~  !  sizeof  typeof  alignof  __attribute__  defined
> +
> +no space before the postfix increment & decrement unary operators:
> +	++  --
> +
> +no space after the prefix increment & decrement unary operators:
> +	++  --
> +
> +and no space around the '.' and "->" structure member operators.
> +
> +Do not leave trailing whitespace at the ends of lines.  Some editors
> with
> +"smart" indentation will insert whitespace at the beginning of new
> lines as
> +appropriate, so you can start typing the next line of code right
> away.
> +However, some such editors do not remove the whitespace if you end up
> not
> +putting a line of code there, such as if you leave a blank line.  As
> a result,
> +you end up with lines containing trailing whitespace.
> +
> +Git will warn you about patches that introduce trailing whitespace,
> and can
> +optionally strip the trailing whitespace for you; however, if
> applying a series
> +of patches, this may make later patches in the series fail by
> changing their
> +context lines.
> +
> +
> +		Chapter 4: Naming
> +
> +C is a Spartan language, and so should your naming be.  Unlike
> Modula-2
> +and Pascal programmers, C programmers do not use cute names like
> +ThisVariableIsATemporaryCounter.  A C programmer would call that
> +variable "tmp", which is much easier to write, and not the least
> more
> +difficult to understand.
> +
> +HOWEVER, while mixed-case names are frowned upon, descriptive names
> for
> +global variables are a must.  To call a global function "foo" is a
> +shooting offense.
> +
> +GLOBAL variables (to be used only if you _really_ need them) need to
> +have descriptive names, as do global functions.  If you have a
> function
> +that counts the number of active users, you should call that
> +"count_active_users()" or similar, you should _not_ call it
> "cntusr()".
> +
> +Encoding the type of a function into the name (so-called Hungarian
> +notation) is brain damaged - the compiler knows the types anyway and
> can
> +check those, and it only confuses the programmer.  No wonder
> MicroSoft
> +makes buggy programs.
> +
> +LOCAL variable names should be short, and to the point.  If you have
> +some random integer loop counter, it should probably be called "i".
> +Calling it "loop_counter" is non-productive, if there is no chance of
> it
> +being mis-understood.  Similarly, "tmp" can be just about any type
> of
> +variable that is used to hold a temporary value.
> +
> +If you are afraid to mix up your local variable names, you have
> another
> +problem, which is called the function-growth-hormone-imbalance
> syndrome.
> +See chapter 6 (Functions).
> +
> +
> +		Chapter 5: Typedefs
> +
> +Please don't use things like "vps_t".
> +
> +It's a _mistake_ to use typedef for structures and pointers. When you
> see a
> +
> +	vps_t a;
> +
> +in the source, what does it mean?
> +
> +In contrast, if it says
> +
> +	struct virtual_container *a;
> +
> +you can actually tell what "a" is.
> +
> +Lots of people think that typedefs "help readability". Not so. They
> are
> +useful only for:
> +
> + (a) totally opaque objects (where the typedef is actively used to
> _hide_
> +     what the object is).
> +
> +     Example: "pte_t" etc. opaque objects that you can only access
> using
> +     the proper accessor functions.
> +
> +     NOTE! Opaqueness and "accessor functions" are not good in
> themselves.
> +     The reason we have them for things like pte_t etc. is that
> there
> +     really is absolutely _zero_ portably accessible information
> there.
> +
> + (b) Clear integer types, where the abstraction _helps_ avoid
> confusion
> +     whether it is "int" or "long".
> +
> +     u8/u16/u32 are perfectly fine typedefs, although they fit into
> +     category (d) better than here.
> +
> +     NOTE! Again - there needs to be a _reason_ for this. If
> something is
> +     "unsigned long", then there's no reason to do
> +
> +	typedef unsigned long myflags_t;
> +
> +     but if there is a clear reason for why it under certain
> circumstances
> +     might be an "unsigned int" and under other configurations might
> be
> +     "unsigned long", then by all means go ahead and use a typedef.
> +
> + (c) when you use sparse to literally create a _new_ type for
> +     type-checking.
> +
> + (d) New types which are identical to standard C99 types, in certain
> +     exceptional circumstances.
> +
> +     Although it would only take a short amount of time for the eyes
> and
> +     brain to become accustomed to the standard types like
> 'uint32_t',
> +     some people object to their use anyway.
> +
> +     Therefore, the Linux-specific 'u8/u16/u32/u64' types and their
> +     signed equivalents which are identical to standard types are
> +     permitted -- although they are not mandatory in new code of
> your
> +     own.
> +
> +     When editing existing code which already uses one or the other
> set
> +     of types, you should conform to the existing choices in that
> code.
> +
> + (e) Types safe for use in userspace.
> +
> +     In certain structures which are visible to userspace, we cannot
> +     require C99 types and cannot use the 'u32' form above. Thus, we
> +     use __u32 and similar types in all structures which are shared
> +     with userspace.
> +
> +Maybe there are other cases too, but the rule should basically be to
> NEVER
> +EVER use a typedef unless you can clearly match one of those rules.
> +
> +In general, a pointer, or a struct that has elements that can
> reasonably
> +be directly accessed should _never_ be a typedef.
> +
> +
> +		Chapter 6: Functions
> +
> +Functions should be short and sweet, and do just one thing.  They
> should
> +fit on one or two screenfuls of text (the ISO/ANSI screen size is
> 80x24,
> +as we all know), and do one thing and do that well.
> +
> +The maximum length of a function is inversely proportional to the
> +complexity and indentation level of that function.  So, if you have
> a
> +conceptually simple function that is just one long (but simple)
> +case-statement, where you have to do lots of small things for a lot
> of
> +different cases, it's OK to have a longer function.
> +
> +However, if you have a complex function, and you suspect that a
> +less-than-gifted first-year high-school student might not even
> +understand what the function is all about, you should adhere to the
> +maximum limits all the more closely.  Use helper functions with
> +descriptive names (you can ask the compiler to in-line them if you
> think
> +it's performance-critical, and it will probably do a better job of
> it
> +than you would have done).
> +
> +Another measure of the function is the number of local variables. 
> They
> +shouldn't exceed 5-10, or you're doing something wrong.  Re-think
> the
> +function, and split it into smaller pieces.  A human brain can
> +generally easily keep track of about 7 different things, anything
> more
> +and it gets confused.  You know you're brilliant, but maybe you'd
> like
> +to understand what you did 2 weeks from now.
> +
> +In source files, separate functions with one blank line.  If the
> function is
> +exported, the EXPORT* macro for it should follow immediately after
> the closing
> +function brace line.  E.g.:
> +
> +int system_is_up(void)
> +{
> +	return system_state == SYSTEM_RUNNING;
> +}
> +EXPORT_SYMBOL(system_is_up);
> +
> +In function prototypes, include parameter names with their data
> types.
> +Although this is not required by the C language, it is preferred in
> Linux
> +because it is a simple way to add valuable information for the
> reader.
> +
> +
> +		Chapter 7: Centralized exiting of functions
> +
> +Albeit deprecated by some people, the equivalent of the goto
> statement is
> +used frequently by compilers in form of the unconditional jump
> instruction.
> +
> +The goto statement comes in handy when a function exits from
> multiple
> +locations and some common work such as cleanup has to be done.
> +
> +The rationale is:
> +
> +- unconditional statements are easier to understand and follow
> +- nesting is reduced
> +- errors by not updating individual exit points when making
> +    modifications are prevented
> +- saves the compiler work to optimize redundant code away ;)
> +
> +int fun(int a)
> +{
> +	int result = 0;
> +	char *buffer = kmalloc(SIZE);
> +
> +	if (buffer == NULL)
> +		return -ENOMEM;
> +
> +	if (condition1) {
> +		while (loop1) {
> +			...
> +		}
> +		result = 1;
> +		goto out;
> +	}
> +	...
> +out:
> +	kfree(buffer);
> +	return result;
> +}
> +
> +		Chapter 8: Commenting
> +
> +Comments are good, but there is also a danger of over-commenting. 
> NEVER
> +try to explain HOW your code works in a comment: it's much better to
> +write the code so that the _working_ is obvious, and it's a waste of
> +time to explain badly written code.
> +
> +Generally, you want your comments to tell WHAT your code does, not
> HOW.
> +Also, try to avoid putting comments inside a function body: if the
> +function is so complex that you need to separately comment parts of
> it,
> +you should probably go back to chapter 6 for a while.  You can make
> +small comments to note or warn about something particularly clever
> (or
> +ugly), but try to avoid excess.  Instead, put the comments at the
> head
> +of the function, telling people what it does, and possibly WHY it
> does
> +it.
> +
> +When commenting the kernel API functions, please use the kernel-doc
> format.
> +See the files Documentation/kernel-doc-nano-HOWTO.txt and
> scripts/kernel-doc
> +for details.
> +
> +Linux style for comments is the C89 "/* ... */" style.
> +Don't use C99-style "// ..." comments.
> +
> +The preferred style for long (multi-line) comments is:
> +
> +	/*
> +	 * This is the preferred style for multi-line
> +	 * comments in the Linux kernel source code.
> +	 * Please use it consistently.
> +	 *
> +	 * Description:  A column of asterisks on the left side,
> +	 * with beginning and ending almost-blank lines.
> +	 */
> +
> +It's also important to comment data, whether they are basic types or
> derived
> +types.  To this end, use just one data declaration per line (no
> commas for
> +multiple data declarations).  This leaves you room for a small
> comment on each
> +item, explaining its use.
> +
> +
> +		Chapter 9: You've made a mess of it
> +
> +That's OK, we all do.  You've probably been told by your long-time
> Unix
> +user helper that "GNU emacs" automatically formats the C sources for
> +you, and you've noticed that yes, it does do that, but the defaults
> it
> +uses are less than desirable (in fact, they are worse than random
> +typing - an infinite number of monkeys typing into GNU emacs would
> never
> +make a good program).
> +
> +So, you can either get rid of GNU emacs, or change it to use saner
> +values.  To do the latter, you can stick the following in your .emacs
> file:
> +
> +(defun c-lineup-arglist-tabs-only (ignored)
> +  "Line up argument lists by tabs, not spaces"
> +  (let* ((anchor (c-langelem-pos c-syntactic-element))
> +	 (column (c-langelem-2nd-pos c-syntactic-element))
> +	 (offset (- (1+ column) anchor))
> +	 (steps (floor offset c-basic-offset)))
> +    (* (max steps 1)
> +       c-basic-offset)))
> +
> +(add-hook 'c-mode-common-hook
> +          (lambda ()
> +            ;; Add kernel style
> +            (c-add-style
> +             "linux-tabs-only"
> +             '("linux" (c-offsets-alist
> +                        (arglist-cont-nonempty
> +                         c-lineup-gcc-asm-reg
> +                         c-lineup-arglist-tabs-only))))))
> +
> +(add-hook 'c-mode-hook
> +          (lambda ()
> +            (let ((filename (buffer-file-name)))
> +              ;; Enable kernel mode for the appropriate files
> +              (when (and filename
> +                         (string-match (expand-file-name
> "~/src/linux-trees")
> +                                       filename))
> +                (setq indent-tabs-mode t)
> +                (c-set-style "linux-tabs-only")))))
> +
> +This will make emacs go better with the kernel coding style for C
> +files below ~/src/linux-trees.
> +
> +But even if you fail in getting emacs to do sane formatting, not
> +everything is lost: use "indent".
> +
> +Now, again, GNU indent has the same brain-dead settings that GNU
> emacs
> +has, which is why you need to give it a few command line options.
> +However, that's not too bad, because even the makers of GNU indent
> +recognize the authority of K&R (the GNU people aren't evil, they are
> +just severely misguided in this matter), so you just give indent the
> +options "-kr -i8" (stands for "K&R, 8 character indents"), or use
> +"scripts/Lindent", which indents in the latest style.
> +
> +"indent" has a lot of options, and especially when it comes to
> comment
> +re-formatting you may want to take a look at the man page.  But
> +remember: "indent" is not a fix for bad programming.
> +
> +
> +		Chapter 10: Kconfig configuration files
> +
> +For all of the Kconfig* configuration files throughout the source
> tree,
> +the indentation is somewhat different.  Lines under a "config"
> definition
> +are indented with one tab, while help text is indented an additional
> two
> +spaces.  Example:
> +
> +config AUDIT
> +	bool "Auditing support"
> +	depends on NET
> +	help
> +	  Enable auditing infrastructure that can be used with another
> +	  kernel subsystem, such as SELinux (which requires this for
> +	  logging of avc messages output).  Does not do system-call
> +	  auditing without CONFIG_AUDITSYSCALL.
> +
> +Features that might still be considered unstable should be defined
> as
> +dependent on "EXPERIMENTAL":
> +
> +config SLUB
> +	depends on EXPERIMENTAL && !ARCH_USES_SLAB_PAGE_STRUCT
> +	bool "SLUB (Unqueued Allocator)"
> +	...
> +
> +while seriously dangerous features (such as write support for
> certain
> +filesystems) should advertise this prominently in their prompt
> string:
> +
> +config ADFS_FS_RW
> +	bool "ADFS write support (DANGEROUS)"
> +	depends on ADFS_FS
> +	...
> +
> +For full documentation on the configuration files, see the file
> +Documentation/kbuild/kconfig-language.txt.
> +
> +
> +		Chapter 11: Data structures
> +
> +Data structures that have visibility outside the single-threaded
> +environment they are created and destroyed in should always have
> +reference counts.  In the kernel, garbage collection doesn't exist
> (and
> +outside the kernel garbage collection is slow and inefficient),
> which
> +means that you absolutely _have_ to reference count all your uses.
> +
> +Reference counting means that you can avoid locking, and allows
> multiple
> +users to have access to the data structure in parallel - and not
> having
> +to worry about the structure suddenly going away from under them
> just
> +because they slept or did something else for a while.
> +
> +Note that locking is _not_ a replacement for reference counting.
> +Locking is used to keep data structures coherent, while reference
> +counting is a memory management technique.  Usually both are needed,
> and
> +they are not to be confused with each other.
> +
> +Many data structures can indeed have two levels of reference
> counting,
> +when there are users of different "classes".  The subclass count
> counts
> +the number of subclass users, and decrements the global count just
> once
> +when the subclass count goes to zero.
> +
> +Examples of this kind of "multi-level-reference-counting" can be
> found in
> +memory management ("struct mm_struct": mm_users and mm_count), and
> in
> +filesystem code ("struct super_block": s_count and s_active).
> +
> +Remember: if another thread can find your data structure, and you
> don't
> +have a reference count on it, you almost certainly have a bug.
> +
> +
> +		Chapter 12: Macros, Enums and RTL
> +
> +Names of macros defining constants and labels in enums are
> capitalized.
> +
> +#define CONSTANT 0x12345
> +
> +Enums are preferred when defining several related constants.
> +
> +CAPITALIZED macro names are appreciated but macros resembling
> functions
> +may be named in lower case.
> +
> +Generally, inline functions are preferable to macros resembling
> functions.
> +
> +Macros with multiple statements should be enclosed in a do - while
> block:
> +
> +#define macrofun(a, b, c) 			\
> +	do {					\
> +		if (a == 5)			\
> +			do_this(b, c);		\
> +	} while (0)
> +
> +Things to avoid when using macros:
> +
> +1) macros that affect control flow:
> +
> +#define FOO(x)					\
> +	do {					\
> +		if (blah(x) < 0)		\
> +			return -EBUGGERED;	\
> +	} while(0)
> +
> +is a _very_ bad idea.  It looks like a function call but exits the
> "calling"
> +function; don't break the internal parsers of those who will read the
> code.
> +
> +2) macros that depend on having a local variable with a magic name:
> +
> +#define FOO(val) bar(index, val)
> +
> +might look like a good thing, but it's confusing as hell when one
> reads the
> +code and it's prone to breakage from seemingly innocent changes.
> +
> +3) macros with arguments that are used as l-values: FOO(x) = y; will
> +bite you if somebody e.g. turns FOO into an inline function.
> +
> +4) forgetting about precedence: macros defining constants using
> expressions
> +must enclose the expression in parentheses. Beware of similar issues
> with
> +macros using parameters.
> +
> +#define CONSTANT 0x4000
> +#define CONSTEXP (CONSTANT | 3)
> +
> +The cpp manual deals with macros exhaustively. The gcc internals
> manual also
> +covers RTL which is used frequently with assembly language in the
> kernel.
> +
> +
> +		Chapter 13: Printing kernel messages
> +
> +Kernel developers like to be seen as literate. Do mind the spelling
> +of kernel messages to make a good impression. Do not use crippled
> +words like "dont"; use "do not" or "don't" instead.  Make the
> messages
> +concise, clear, and unambiguous.
> +
> +Kernel messages do not have to be terminated with a period.
> +
> +Printing numbers in parentheses (%d) adds no value and should be
> avoided.
> +
> +There are a number of driver model diagnostic macros in
> <linux/device.h>
> +which you should use to make sure messages are matched to the right
> device
> +and driver, and are tagged with the right level:  dev_err(),
> dev_warn(),
> +dev_info(), and so forth.  For messages that aren't associated with
> a
> +particular device, <linux/kernel.h> defines pr_debug() and
> pr_info().
> +
> +Coming up with good debugging messages can be quite a challenge; and
> once
> +you have them, they can be a huge help for remote troubleshooting. 
> Such
> +messages should be compiled out when the DEBUG symbol is not defined
> (that
> +is, by default they are not included).  When you use dev_dbg() or
> pr_debug(),
> +that's automatic.  Many subsystems have Kconfig options to turn on
> -DDEBUG.
> +A related convention uses VERBOSE_DEBUG to add dev_vdbg() messages to
> the
> +ones already enabled by DEBUG.
> +
> +
> +		Chapter 14: Allocating memory
> +
> +The kernel provides the following general purpose memory allocators:
> +kmalloc(), kzalloc(), kcalloc(), and vmalloc().  Please refer to the
> API
> +documentation for further information about them.
> +
> +The preferred form for passing a size of a struct is the following:
> +
> +	p = kmalloc(sizeof(*p), ...);
> +
> +The alternative form where struct name is spelled out hurts
> readability and
> +introduces an opportunity for a bug when the pointer variable type is
> changed
> +but the corresponding sizeof that is passed to a memory allocator is
> not.
> +
> +Casting the return value which is a void pointer is redundant. The
> conversion
> +from void pointer to any other pointer type is guaranteed by the C
> programming
> +language.
> +
> +
> +		Chapter 15: The inline disease
> +
> +There appears to be a common misperception that gcc has a magic "make
> me
> +faster" speedup option called "inline". While the use of inlines can
> be
> +appropriate (for example as a means of replacing macros, see Chapter
> 12), it
> +very often is not. Abundant use of the inline keyword leads to a much
> bigger
> +kernel, which in turn slows the system as a whole down, due to a
> bigger
> +icache footprint for the CPU and simply because there is less memory
> +available for the pagecache. Just think about it; a pagecache miss
> causes a
> +disk seek, which easily takes 5 milliseconds. There are a LOT of cpu
> cycles
> +that can go into these 5 milliseconds.
> +
> +A reasonable rule of thumb is to not put inline at functions that
> have more
> +than 3 lines of code in them. An exception to this rule are the cases
> where
> +a parameter is known to be a compiletime constant, and as a result of
> this
> +constantness you *know* the compiler will be able to optimize most of
> your
> +function away at compile time. For a good example of this later case,
> see
> +the kmalloc() inline function.
> +
> +Often people argue that adding inline to functions that are static
> and used
> +only once is always a win since there is no space tradeoff. While
> this is
> +technically correct, gcc is capable of inlining these automatically
> without
> +help, and the maintenance issue of removing the inline when a second
> user
> +appears outweighs the potential value of the hint that tells gcc to
> do
> +something it would have done anyway.
> +
> +
> +		Chapter 16: Function return values and names
> +
> +Functions can return values of many different kinds, and one of the
> +most common is a value indicating whether the function succeeded or
> +failed.  Such a value can be represented as an error-code integer
> +(-Exxx = failure, 0 = success) or a "succeeded" boolean (0 =
> failure,
> +non-zero = success).
> +
> +Mixing up these two sorts of representations is a fertile source of
> +difficult-to-find bugs.  If the C language included a strong
> distinction
> +between integers and booleans then the compiler would find these
> mistakes
> +for us... but it doesn't.  To help prevent such bugs, always follow
> this
> +convention:
> +
> +	If the name of a function is an action or an imperative command,
> +	the function should return an error-code integer.  If the name
> +	is a predicate, the function should return a "succeeded" boolean.
> +
> +For example, "add work" is a command, and the add_work() function
> returns 0
> +for success or -EBUSY for failure.  In the same way, "PCI device
> present" is
> +a predicate, and the pci_dev_present() function returns 1 if it
> succeeds in
> +finding a matching device or 0 if it doesn't.
> +
> +All EXPORTed functions must respect this convention, and so should
> all
> +public functions.  Private (static) functions need not, but it is
> +recommended that they do.
> +
> +Functions whose return value is the actual result of a computation,
> rather
> +than an indication of whether the computation succeeded, are not
> subject to
> +this rule.  Generally they indicate failure by returning some
> out-of-range
> +result.  Typical examples would be functions that return pointers;
> they use
> +NULL or the ERR_PTR mechanism to report failure.
> +
> +
> +		Chapter 17:  Don't re-invent the kernel macros
> +
> +The header file include/linux/kernel.h contains a number of macros
> that
> +you should use, rather than explicitly coding some variant of them
> yourself.
> +For example, if you need to calculate the length of an array, take
> advantage
> +of the macro
> +
> +  #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
> +
> +Similarly, if you need to calculate the size of some structure
> member, use
> +
> +  #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
> +
> +There are also min() and max() macros that do strict type checking if
> you
> +need them.  Feel free to peruse that header file to see what else is
> already
> +defined that you shouldn't reproduce in your code.
> +
> +
> +		Chapter 18:  Editor modelines and other cruft
> +
> +Some editors can interpret configuration information embedded in
> source files,
> +indicated with special markers.  For example, emacs interprets lines
> marked
> +like this:
> +
> +-*- mode: c -*-
> +
> +Or like this:
> +
> +/*
> +Local Variables:
> +compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
> +End:
> +*/
> +
> +Vim interprets markers that look like this:
> +
> +/* vim:set sw=8 noet */
> +
> +Do not include any of these in source files.  People have their own
> personal
> +editor configurations, and your source files should not override
> them.  This
> +includes markers for indentation and mode configuration.  People may
> use their
> +own custom mode, or may have some other magic method for making
> indentation
> +work correctly.
> +
> +
> +
> +		Appendix I: References
> +
> +The C Programming Language, Second Edition
> +by Brian W. Kernighan and Dennis M. Ritchie.
> +Prentice Hall, Inc., 1988.
> +ISBN 0-13-110362-8 (paperback), 0-13-110370-9 (hardback).
> +URL: http://cm.bell-labs.com/cm/cs/cbook/
> +
> +The Practice of Programming
> +by Brian W. Kernighan and Rob Pike.
> +Addison-Wesley, Inc., 1999.
> +ISBN 0-201-61586-X.
> +URL: http://cm.bell-labs.com/cm/cs/tpop/
> +
> +GNU manuals - where in compliance with K&R and this text - for cpp,
> gcc,
> +gcc internals and indent, all available from
> http://www.gnu.org/manual/
> +
> +WG14 is the international standardization working group for the
> programming
> +language C, URL: http://www.open-std.org/JTC1/SC22/WG14/
> +
> +Kernel CodingStyle, by greg@xxxxxxxxx at OLS 2002:
> +http://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/
> +
> +--
> +Last updated on 2007-July-13.
> +
> diff --git a/scripts/Lindent b/scripts/Lindent
> new file mode 100755
> index 0000000..9c4b3e2
> --- /dev/null
> +++ b/scripts/Lindent
> @@ -0,0 +1,18 @@
> +#!/bin/sh
> +PARAM="-npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cp1"
> +RES=`indent --version`
> +V1=`echo $RES | cut -d' ' -f3 | cut -d'.' -f1`
> +V2=`echo $RES | cut -d' ' -f3 | cut -d'.' -f2`
> +V3=`echo $RES | cut -d' ' -f3 | cut -d'.' -f3`
> +if [ $V1 -gt 2 ]; then
> +  PARAM="$PARAM -il0"
> +elif [ $V1 -eq 2 ]; then
> +  if [ $V2 -gt 2 ]; then
> +    PARAM="$PARAM -il0";
> +  elif [ $V2 -eq 2 ]; then
> +    if [ $V3 -ge 10 ]; then
> +      PARAM="$PARAM -il0"
> +    fi
> +  fi
> +fi
> +indent $PARAM "$@"
> -- 
> 1.6.5.2
> 
> _______________________________________________
> Anaconda-devel-list mailing list
> Anaconda-devel-list@xxxxxxxxxx
> https://www.redhat.com/mailman/listinfo/anaconda-devel-list

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux