/* Ajith - Syntax Higlighter - End ----------------------------------------------- */

## 2.27.2012

### Inserting a Node in Doubly Linked List

Previous Article: Doubly Linked List                                           Next Article: Deletion of a Node from Doubly Linked List.

Insertion of a Node
Before we discuss about how to insert a NODE let us discuss few rules to follow at the time of insertion.

• Check the location into which the user want to insert a new NODE. The possible locations where an user can insert a new node is in the range of 1 <= loc <= (length of list)+1. Let us say the length of the list is 10 & the user want to insert at location 12 (sounds stupid).

• As we know we can traverse Bi-Directional in case of Doubly Linked Lists so we have to take care of PREV and NEXT variables in the NODE structure. We should also update the neighboring Nodes which are affected by this operation. If not we might break up the List somewhere or the other by creating a BROKEN LIST.

We have following scenarios in the case of insertion of a NODE.
• Adding a Node at the start of the Empty List
•  Figure 1: Empty List and the newNode we want to add
As shown in Figure-1 we have a Empty List with LENGTH set to 0 and FIRST pointing to NULL. Let us add newNode at Location 1.
In newNode - NEXT and  PREV points to NULL as we don't have any other Nodes in the List.
Increment the LENGTH variable in HEAD once insertion is successful to maintain the count of number of Nodes in the List.
Pseudocode:
HEAD->FIRST = newNode

newNode->PREV = NULL

newNode->NEXT = NULL

increment(HEAD->LENGTH)
Output:
 Figure 2: After adding newNode in Empty List. (Changes in BLUE)

## 2.25.2012

### Implementation of Doubly Linked List in C

In computer science, a doubly linked list is a linked data structure that consists of a set of sequentially linked records called Nodes. Each Node contains two fields, called Links, that are references to the Previous and to the Next Node in the sequence of Nodes as well as field named Data.
For every Linked List we have something called Head which marks the starting of a list. So we have two main structures namely
• Node

Why we need a new structure for HEAD variable ?
Just for convenience I decided to have HEAD its own structure. You can even use the Node structure.

Node
Every Node in a Doubly Linked List has three main members namely
• PREV
• DATA
• NEXT
As their names say
• PREV - holds the memory location of the Previous Node in the List. If there are none we point towards NULL. For the First Node in the List PREV points to NULL.
• NEXT - holds the memory location of the Next Node in the List. If there are none we point towards NULL. For the Last Node in the List NEXT points to NULL.
• DATA - In simple words it holds Data. In our case it holds the memory location to the actual data to be held by the Node.
typedef struct node
{
struct node *prev;
void        *data;
struct node *next;
}NODE;

• LENGTH - holds the count of number of Nodes in the List.
• FIRST - hold the memory location of the first Node in the List. If the List is EMPTY it points to NULL.
typedef struct head
{
unsigned int length;
struct node  *first;
}HEAD;

NOTE: Our Head structure doesn't contain any pointer to the Tail of the List. Eventhough its a best way to include a pointer to Tail Node we decided to cover that implementation in Circular Doubly Linked List.

## 2.12.2012

### Notification Chains in Linux Kernel - Part 03

Continuation after PART-2.

Notifying Events on a Chain
Notifications are generated with notifier_call_chain. This function simply invokes, in order of priority, all the callback routines registered against the chain. Note that callback routines are executed in the context of the process that calls notifier_call_chain. A callback routine could, however, be implemented so that it queues the notification somewhere and wakes up a process that will look at it.

NOTE: Similar to register and unregister functions we don't directly call notifier_call_chain function as we have wrapper functions for respective chains.
 <kernel/notifier.c>

58 static int __kprobes notifier_call_chain(struct notifier_block **nl,
59                     unsigned long val, void *v,
60                     int nr_to_call, int *nr_calls)
61 {
62     int ret = NOTIFY_DONE;
63     struct notifier_block *nb, *next_nb;
64
65     nb = rcu_dereference(*nl);
66
67     while (nb && nr_to_call) {
68         next_nb = rcu_dereference(nb->next);
69         ret = nb->notifier_call(nb, val, v);
.
76         nb = next_nb;
77         nr_to_call--;
78     }
79     return ret;
80 }
• nl

• val
Event type. The chain itself identifies a class of events; val unequivocally identifies an event type (i.e., NETDEV_REGISTER).

• v
Input parameter that can be used by the handlers registered by the various clients. This can be used in different ways under different circumstances. For instance, when a new network device is registered with the kernel, the associated notification uses v to identify the net_device data structure.

• nr_to_call
Number of notifier functions to be called. Don't care value of this parameter is -1.

• nr_calls
Records the number of notifications sent. Don't care value of this field is NULL.

## 1.17.2012

### Notification Chains in Linux Kernel - Part 02

Continuation after PART-1.

Check the PART-3

Blocking Notifier chains
A blocking notifier chain runs in the process context. The calls in the notification list could be blocked as it runs in the process context. Notifications that are not highly time critical could use blocking notifier chains.

Linux modules use blocking notifier chains to inform the modules on a change in QOS value or the addition of a new device.
<kernel/notifier.c>

187         struct notifier_block *n)
188 {
.
199     down_write(&nh->rwsem);
201     up_write(&nh->rwsem);
202     return ret;
203 }
204 EXPORT_SYMBOL_GPL(blocking_notifier_chain_register)
.
217         struct notifier_block *n)
218 {
.
229     down_write(&nh->rwsem);
231     up_write(&nh->rwsem);
232     return ret;
233 }
234 EXPORT_SYMBOL_GPL(blocking_notifier_chain_unregister);

## 1.16.2012

### Notification Chains in Linux Kernel - Part 01

Linux is a monolithic kernel. Its subsystems or modules help to keep the kernel light by being flexible enough to load and unload at runtime. In most cases, the kernel modules are interconnected to one another. An event captured by a certain module might be of interest to another module.

Typically, communication systems implement request-reply messaging, or polling. In such models, a program that receives a request will have to send the data available since the last transaction. Such methods sometimes require high bandwidth or they waste polling cycles.

To fulfill the need for interaction, Linux uses so called notification chains. These notifier chains work in a Publish-Subscribe model. This model is more effective when compared to polling or the request-reply model.

For each notification chain there is a passive side (the notified) and an active side (the notifier), as in the so-called publish-and-subscribe model:
• The notified are the subsystems that ask to be notified about the event and that provide a callback function to invoke.
• The notifier is the subsystem that experiences an event and calls the callback function.
NOTE: All the code samples are taken from Linux 2.6.24 kernel.

struct notifier_block
The elements of the notification chain's list are of type notifier_block:
<include/linux/notifier.h>

50 struct notifier_block {
51     int (*notifier_call)
(struct notifier_block *, unsigned long, void *);
52     struct notifier_block *next;
53     int priority;
54 };

• notifier_call - function to execute.
• next - used to link together the elements of the list.
• priority - the priority of the function. Functions with higher priority are executed first. But in practice, almost all registrations leave the priority out of the notifier_block definition, which means it gets the default value of 0 and execution order ends up depending only on the registration order (i.e., it is a semirandom order).
The notifier_block data structure is a simple linked list of function pointers. The function pointers are registered with ‘functions’ that are to be called when an event occurs. Each module needs to maintain a notifier list. The functions are registered to this notification list. The notification module (publisher) maintains a list head that is used to manage and traverse the notifier block list. The function that subscribes to a module is added to the head of the module’s list by using the register_xxxxxx_notifier API and deletion from the list is done using unregister_xxxxxx_notifier.