Tag Archives: kernel

My two commits to the Linux Kernel

Four years ago I had nothing to do and started to read some pieces of the kernel code. I read about the BLK, a feature that kernel developers have been trying to remove the last years (I’m not sure if they have finished). My small contribution to that task was this two patches that I sent at the end of 2007.  It’s not a big thing but it required some understanding of the kernel internals or I would have broken something 🙂

commit 1

commit 2

 

BLK or the Big Kernel Lock is a basic locking mechanism introduced in the kernel when SMP support was included. It’s a global lock, lock_kernel() and unlock_kernel() are the functions to use it. This lock is bad because is global, if the networking code wants to protect something calls it. If the filesystem code wants to protect other fs related data calls it too. Two unrelated data structures are protected and two code paths are blocked without any sense. Was an easy implementation in the first years of SMP support, but it had been spreading without control. In the last years, kernel developers have been trying to remove it. New kernel code has independent locks and block the data structures, so unrelated code paths are not blocked.

 

Post to Twitter

Netlink Echo (ex Netlink ping): Un ejemplo para entender Netlink

Hice un upgrade de mi viejo módulo de Netlink ping. Primero lo renombré a Netlink Echo que encaja mejor a lo que hace. Después le hice unos cambios por que la API de netlink del kernel cambió desde la primera vez que lo armé con kernel 2.4. Está probado con el kernel 2.6.31 y funciona sin problemas.

Lo que publico acá es un módulo de kernel y su respectiva herramienta de userspace. La idea es mandar un mensaje de texto al kernel y que el kernel devuelva el mismo mensaje. Por eso el nombre Netlink Echo.

Netlink es un mecanismo que provee el kernel para comunicarse con él. Distintos subsitemas del kernel (Networkin en general, Udev, SCSI, etc) lo usan para que podamos configurarlos y pasarle parámetros. Netlink es un tipo de socket y se utilizan las mismas funciones que en otro tipos de socket: connect, bind(), send(), recv().

Les dejo el link del ejemplo en GitHUB, espero que les sirva. Más informacion “man 7 netlink”.

Post to Twitter

Tail calls, GCC y Linux.

Estaba mirando un post en Lwn.net que hablaba de Tail Calls y un problema con Linux, así que me puse a investigar el tema. Ésto requiere un poco de conocimiento de la ABI de Unix, que en todo caso lo resumiré en otro post, si es posible.

Tail call es una llamada a una función, que se realiza al final de la función invocante, la cual suele ser optimizada en tiempo y espacio usando el stack frame de esta. Algo asi como:

int calc(int a){
   .
   .
   .

return func(a);

}

Reservar el stack frame para func() desperdicia tiempo y espacio. Aprovechando que el de calc() ya no va a ser utilizado. GCC lo deja a disposición de func().

Esta optimización es problemática en Linux, principalmente en system calls, por lo que es evitada con un hack que básicamente mete código nulo entre el fin de la función y el tail call:

asmlinkage long sys_open(const char __user *filename, int flags, int mode)
{
        long ret;

        if (force_o_largefile())
                flags |= O_LARGEFILE;

        ret = do_sys_open(AT_FDCWD, filename, flags, mode);
        /* avoid REGPARM breakage on x86: */
        prevent_tail_call(ret);
        return ret;
}

Los system calls tienen la etiqueta asmlinkage que indica que al GCC que esa función tiene todos sus argumentos en el stack.

Post to Twitter