Hello all. My original response just went to Gustavo and Walter because I'm not much of a kernel hacker these days; it was mainly observations that may or may not have been helpful and I'm not a regular list contributor. Looks like I shouldn't have been so shy!
On Fri, Oct 20, 2017 at 06:54:05PM +0200, walter harms wrote: > > ... > > >> From the code below i can see: y=x+1 Perhaps that can be used. > > > > So are you proposing to use two arguments instead of three? > > > > re_sort_routes(nr_node, 0); > > I am not sure, i would wait a bit and see if what improves readability. > as Kevin Dawson pointed out: this is a sort here. > Maybe there a nice way to do something like that (i do not know): > > case 3: > re_sort_routes(nr_node, 1,2) > case 2: > re_sort_routes(nr_node, 0,1) > case 1: > break; Nearly - you left out one of the calls to re_sort_routes. I include my original mail here, as it explains it better: > Hi Walter and Gustavo. > > I've just left this response for the two of you, as it's a long time since > I've been fiddling in the kernel and I don't know much of the current > ideology regarding how people want their coding done. > > I also only have a passing knowledge of NetRom, but I do recall some of the > principles like routes and their quality. > > On Fri, Oct 20, 2017 at 10:57:10AM +0200, walter harms wrote: > > > > Am 19.10.2017 19:27, schrieb Gustavo A. R. Silva: > > > Code refactoring in order to make the code easier to read and maintain. > > ... > > [ Gustavo ] > > > +/* re-sort the routes in quality order. */ > > > +static inline void re_sort_routes(struct nr_node *nr_node, int ix_x, int > > > ix_y) > > I'm curious as to why re_sort_routes() is declared inline. Its use below > hardly gains any efficiency from saving function calls; as well, it's extra > code space taken. > > > > + if (nr_node->which == ix_x) > > > + nr_node->which = ix_y; > > > + else if (nr_node->which == ix_y) > > > + nr_node->which = ix_x; > > I suspect this can be simplified too, but I don't know what the possible > values for ->which might be in any particular route case. > > ... > > [ Walter ] > > From the code below i can see: y=x+1 Perhaps that can be used. > > ... > > > /* Now re-sort the routes in quality order */ > > > switch (nr_node->count) { > > > case 3: > > > re_sort_routes(nr_node, 0, 1); > > > re_sort_routes(nr_node, 1, 2); > > > /* fall through */ > > > case 2: > > > re_sort_routes(nr_node, 0, 1); > > > case 1: > > > break; > > > } > > Yes, it can and it makes sense to do so. The algorithm is an unrolled > bubblesort for up to 3 routes. If 3 is as far as it will ever go (and given > that's all the original function allowed for), it's not unjustified in > leaving it that way. Anything more and I'd be suggesting it be made a loop. > > > kernel.h has a swap() macro. so you can > > swap(nr_node->routes[x],nr_node->routes[y]); > > I presume the swap() macro handles arbitrary types - structs and not just > ints. If the aim is to improve readability of the code, it helps. > > I hope I'm not completely out of line in suggesting this. As I say, it's > been quite a while since I've dabbled in the kernel (although I did start > back in the 1970s on Unix...). > > Thanks, > Kevin