add task 13
This commit is contained in:
parent
d595cdf771
commit
1136d7dd57
1 changed files with 113 additions and 0 deletions
113
README.md
113
README.md
|
@ -302,6 +302,119 @@ plus que ça :
|
||||||
|
|
||||||
* [Chapitre 11, Linux Device Drivers, 3rd Edition](https://lwn.net/Kernel/LDD3/)
|
* [Chapitre 11, Linux Device Drivers, 3rd Edition](https://lwn.net/Kernel/LDD3/)
|
||||||
|
|
||||||
|
### Tache 13
|
||||||
|
|
||||||
|
Il faut mettre un constructeur de manière exceptionnel. Cela permet de l'afficher séparemment dans le fichier `/proc/slabinfo`, sinon Linux va optimiser ça en le regroupant avec un autre cache.
|
||||||
|
|
||||||
|
Voici le patch :
|
||||||
|
```diff
|
||||||
|
From 4b55e26775647e71c86164aed41d82beeb17febe Mon Sep 17 00:00:00 2001
|
||||||
|
From: rick <rick@gnous.eu>
|
||||||
|
Date: Sun, 4 Feb 2024 23:02:32 +0100
|
||||||
|
Subject: [PATCH] add task 13
|
||||||
|
|
||||||
|
---
|
||||||
|
task_12/list.c | 28 ++++++++++++++++++++++++----
|
||||||
|
1 file changed, 24 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/task_12/list.c b/task_12/list.c
|
||||||
|
index b5fa8fa..a7989be 100644
|
||||||
|
--- a/task_12/list.c
|
||||||
|
+++ b/task_12/list.c
|
||||||
|
@@ -4,6 +4,7 @@
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/list.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
+#include <linux/slab.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
|
||||||
|
#define NAME_SIZE 20
|
||||||
|
@@ -16,11 +17,13 @@ struct identity {
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct list_head identity_list;
|
||||||
|
+static struct kmem_cache *cache;
|
||||||
|
|
||||||
|
static int identity_create(char *name, int id)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
- struct identity *new = kmalloc(sizeof(*new), GFP_KERNEL);
|
||||||
|
+ struct identity *new = (struct identity *)kmem_cache_alloc(cache,
|
||||||
|
+ GFP_KERNEL);
|
||||||
|
|
||||||
|
if (!new) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
@@ -63,15 +66,31 @@ static void identity_destroy(int id)
|
||||||
|
|
||||||
|
if (tmp) {
|
||||||
|
list_del(&tmp->list);
|
||||||
|
- kfree(tmp);
|
||||||
|
+ kmem_cache_free(cache, tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * juste pour pouvoir être dans le slabinfo, sinon Linux le fusionne avec un
|
||||||
|
+ * autre qui a des propriétés similaires.
|
||||||
|
+ */
|
||||||
|
+static void my_constructor(void *ptr)
|
||||||
|
+{
|
||||||
|
+ memset(ptr, 0, sizeof(struct identity));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int __init my_init(void)
|
||||||
|
{
|
||||||
|
struct identity *temp;
|
||||||
|
|
||||||
|
pr_info("Coucou le gens !!!!\n");
|
||||||
|
+ cache =
|
||||||
|
+ kmem_cache_create("eudyptula_identity", sizeof(struct identity), 0,
|
||||||
|
+ SLAB_HWCACHE_ALIGN, my_constructor);
|
||||||
|
+
|
||||||
|
+ if (!cache)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
INIT_LIST_HEAD(&identity_list);
|
||||||
|
|
||||||
|
if (identity_create("Alice", 1))
|
||||||
|
@@ -86,8 +105,8 @@ static int __init my_init(void)
|
||||||
|
temp = identity_find(3);
|
||||||
|
if (!temp)
|
||||||
|
pr_info("id 3 not found\n");
|
||||||
|
- else
|
||||||
|
- pr_info("id 3 = %s\n", temp->name);
|
||||||
|
+ else
|
||||||
|
+ pr_info("id 3 = %s\n", temp->name);
|
||||||
|
|
||||||
|
temp = identity_find(42);
|
||||||
|
if (!temp)
|
||||||
|
@@ -103,6 +122,7 @@ static int __init my_init(void)
|
||||||
|
|
||||||
|
static void __exit my_exit(void)
|
||||||
|
{
|
||||||
|
+ kmem_cache_destroy(cache);
|
||||||
|
pr_info("Tschuss !!!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
```
|
||||||
|
|
||||||
|
Et la sortie :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
insmod list.ko
|
||||||
|
grep eud /proc/slabinfo
|
||||||
|
# eudyptula_identity 64 64 64 64 1 : tunables 0 0 0 : slabdata 1 1 0
|
||||||
|
dmesg
|
||||||
|
# [1246412.478052] Coucou le gens !!!!
|
||||||
|
# [1246412.478108] id 3 = Dave
|
||||||
|
# [1246412.478112] id 42 not found
|
||||||
|
# [1246450.284783] Tschuss !!!
|
||||||
|
```
|
||||||
|
|
||||||
|
* [Chapitre 8, Linux Device Drivers, 3rd Edition](https://lwn.net/Kernel/LDD3/)
|
||||||
|
|
||||||
## Informations diverses
|
## Informations diverses
|
||||||
|
|
||||||
Je liste dans cette section quelques informations que j'ai pu découvrir en
|
Je liste dans cette section quelques informations que j'ai pu découvrir en
|
||||||
|
|
Loading…
Reference in a new issue