mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 10:09:10 +02:00
Documentation: adopt new coding style of type-aware kmalloc-family
Update the documentation to reflect new type-aware kmalloc-family as
suggested in commit 2932ba8d9c ("slab: Introduce kmalloc_obj()
and family")
ptr = kmalloc(sizeof(*ptr), gfp);
-> ptr = kmalloc_obj(*ptr, gfp);
ptr = kmalloc(sizeof(struct some_obj_name), gfp);
-> ptr = kmalloc_obj(*ptr, gfp);
ptr = kzalloc(sizeof(*ptr), gfp);
-> ptr = kzalloc_obj(*ptr, gfp);
ptr = kmalloc_array(count, sizeof(*ptr), gfp);
-> ptr = kmalloc_objs(*ptr, count, gfp);
ptr = kcalloc(count, sizeof(*ptr), gfp);
-> ptr = kzalloc_objs(*ptr, count, gfp);
Signed-off-by: Manuel Ebner <manuelebner@mailbox.org>
Acked-by: SeongJae Park <sj@kernel.org>
Acked-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Message-ID: <20260429071445.309733-2-manuelebner@mailbox.org>
This commit is contained in:
parent
e5ebf6278d
commit
7c6d969d53
|
|
@ -40,7 +40,7 @@ kref_init as so::
|
||||||
|
|
||||||
struct my_data *data;
|
struct my_data *data;
|
||||||
|
|
||||||
data = kmalloc(sizeof(*data), GFP_KERNEL);
|
data = kmalloc_obj(*data);
|
||||||
if (!data)
|
if (!data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
kref_init(&data->refcount);
|
kref_init(&data->refcount);
|
||||||
|
|
@ -100,7 +100,7 @@ thread to process::
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
struct my_data *data;
|
struct my_data *data;
|
||||||
struct task_struct *task;
|
struct task_struct *task;
|
||||||
data = kmalloc(sizeof(*data), GFP_KERNEL);
|
data = kmalloc_obj(*data);
|
||||||
if (!data)
|
if (!data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
kref_init(&data->refcount);
|
kref_init(&data->refcount);
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,7 @@ list:
|
||||||
|
|
||||||
/* State 1 */
|
/* State 1 */
|
||||||
|
|
||||||
grock = kzalloc(sizeof(*grock), GFP_KERNEL);
|
grock = kzalloc_obj(*grock);
|
||||||
if (!grock)
|
if (!grock)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
grock->name = "Grock";
|
grock->name = "Grock";
|
||||||
|
|
@ -123,7 +123,7 @@ list:
|
||||||
|
|
||||||
/* State 2 */
|
/* State 2 */
|
||||||
|
|
||||||
dimitri = kzalloc(sizeof(*dimitri), GFP_KERNEL);
|
dimitri = kzalloc_obj(*dimitri);
|
||||||
if (!dimitri)
|
if (!dimitri)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
dimitri->name = "Dimitri";
|
dimitri->name = "Dimitri";
|
||||||
|
|
|
||||||
|
|
@ -87,8 +87,8 @@ a message and a callback function to the API and return immediately).
|
||||||
struct async_pkt ap;
|
struct async_pkt ap;
|
||||||
struct sync_pkt sp;
|
struct sync_pkt sp;
|
||||||
|
|
||||||
dc_sync = kzalloc(sizeof(*dc_sync), GFP_KERNEL);
|
dc_sync = kzalloc_obj(*dc_sync);
|
||||||
dc_async = kzalloc(sizeof(*dc_async), GFP_KERNEL);
|
dc_async = kzalloc_obj(*dc_async);
|
||||||
|
|
||||||
/* Populate non-blocking mode client */
|
/* Populate non-blocking mode client */
|
||||||
dc_async->cl.dev = &pdev->dev;
|
dc_async->cl.dev = &pdev->dev;
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ Example:
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
my_fh = kzalloc(sizeof(*my_fh), GFP_KERNEL);
|
my_fh = kzalloc_obj(*my_fh);
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -442,7 +442,7 @@ to protect the cache and all the objects within it. Here's the code::
|
||||||
{
|
{
|
||||||
struct object *obj;
|
struct object *obj;
|
||||||
|
|
||||||
if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
|
if ((obj = kmalloc_obj(*obj)) == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
strscpy(obj->name, name, sizeof(obj->name));
|
strscpy(obj->name, name, sizeof(obj->name));
|
||||||
|
|
@ -517,7 +517,7 @@ which are taken away, and the ``+`` are lines which are added.
|
||||||
struct object *obj;
|
struct object *obj;
|
||||||
+ unsigned long flags;
|
+ unsigned long flags;
|
||||||
|
|
||||||
if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
|
if ((obj = kmalloc_obj(*obj)) == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@@ -63,30 +64,33 @@
|
@@ -63,30 +64,33 @@
|
||||||
obj->id = id;
|
obj->id = id;
|
||||||
|
|
|
||||||
|
|
@ -498,7 +498,7 @@ allocating memory. Thus, on a non-PREEMPT_RT kernel the following code
|
||||||
works perfectly::
|
works perfectly::
|
||||||
|
|
||||||
raw_spin_lock(&lock);
|
raw_spin_lock(&lock);
|
||||||
p = kmalloc(sizeof(*p), GFP_ATOMIC);
|
p = kmalloc_obj(*p, GFP_ATOMIC);
|
||||||
|
|
||||||
But this code fails on PREEMPT_RT kernels because the memory allocator is
|
But this code fails on PREEMPT_RT kernels because the memory allocator is
|
||||||
fully preemptible and therefore cannot be invoked from truly atomic
|
fully preemptible and therefore cannot be invoked from truly atomic
|
||||||
|
|
@ -507,7 +507,7 @@ while holding normal non-raw spinlocks because they do not disable
|
||||||
preemption on PREEMPT_RT kernels::
|
preemption on PREEMPT_RT kernels::
|
||||||
|
|
||||||
spin_lock(&lock);
|
spin_lock(&lock);
|
||||||
p = kmalloc(sizeof(*p), GFP_ATOMIC);
|
p = kmalloc_obj(*p, GFP_ATOMIC);
|
||||||
|
|
||||||
|
|
||||||
bit spinlocks
|
bit spinlocks
|
||||||
|
|
|
||||||
|
|
@ -936,7 +936,7 @@ used.
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
The kernel provides the following general purpose memory allocators:
|
The kernel provides the following general purpose memory allocators:
|
||||||
kmalloc(), kzalloc(), kmalloc_array(), kcalloc(), vmalloc(), and
|
kmalloc(), kzalloc(), kmalloc_objs(), kzalloc_objs(), vmalloc(), and
|
||||||
vzalloc(). Please refer to the API documentation for further information
|
vzalloc(). Please refer to the API documentation for further information
|
||||||
about them. :ref:`Documentation/core-api/memory-allocation.rst
|
about them. :ref:`Documentation/core-api/memory-allocation.rst
|
||||||
<memory_allocation>`
|
<memory_allocation>`
|
||||||
|
|
@ -945,7 +945,7 @@ The preferred form for passing a size of a struct is the following:
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
p = kmalloc(sizeof(*p), ...);
|
p = kmalloc_obj(*p, ...);
|
||||||
|
|
||||||
The alternative form where struct name is spelled out hurts readability and
|
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
|
introduces an opportunity for a bug when the pointer variable type is changed
|
||||||
|
|
@ -959,13 +959,13 @@ The preferred form for allocating an array is the following:
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
p = kmalloc_array(n, sizeof(...), ...);
|
p = kmalloc_objs(*ptr, n, ...);
|
||||||
|
|
||||||
The preferred form for allocating a zeroed array is the following:
|
The preferred form for allocating a zeroed array is the following:
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
p = kcalloc(n, sizeof(...), ...);
|
p = kzalloc_objs(*ptr, n, ...);
|
||||||
|
|
||||||
Both forms check for overflow on the allocation size n * sizeof(...),
|
Both forms check for overflow on the allocation size n * sizeof(...),
|
||||||
and return NULL if that occurred.
|
and return NULL if that occurred.
|
||||||
|
|
|
||||||
|
|
@ -266,7 +266,7 @@ to details explained in the following section.
|
||||||
....
|
....
|
||||||
|
|
||||||
/* allocate a chip-specific data with zero filled */
|
/* allocate a chip-specific data with zero filled */
|
||||||
chip = kzalloc(sizeof(*chip), GFP_KERNEL);
|
chip = kzalloc_obj(*chip);
|
||||||
if (chip == NULL)
|
if (chip == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
@ -628,7 +628,7 @@ After allocating a card instance via :c:func:`snd_card_new()`
|
||||||
err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
|
err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
|
||||||
0, &card);
|
0, &card);
|
||||||
.....
|
.....
|
||||||
chip = kzalloc(sizeof(*chip), GFP_KERNEL);
|
chip = kzalloc_obj(*chip);
|
||||||
|
|
||||||
The chip record should have the field to hold the card pointer at least,
|
The chip record should have the field to hold the card pointer at least,
|
||||||
|
|
||||||
|
|
@ -747,7 +747,7 @@ destructor and PCI entries. Example code is shown first, below::
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
chip = kzalloc(sizeof(*chip), GFP_KERNEL);
|
chip = kzalloc_obj(*chip);
|
||||||
if (chip == NULL) {
|
if (chip == NULL) {
|
||||||
pci_disable_device(pci);
|
pci_disable_device(pci);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
@ -1737,7 +1737,7 @@ callback::
|
||||||
{
|
{
|
||||||
struct my_pcm_data *data;
|
struct my_pcm_data *data;
|
||||||
....
|
....
|
||||||
data = kmalloc(sizeof(*data), GFP_KERNEL);
|
data = kmalloc_obj(*data);
|
||||||
substream->runtime->private_data = data;
|
substream->runtime->private_data = data;
|
||||||
....
|
....
|
||||||
}
|
}
|
||||||
|
|
@ -3301,7 +3301,7 @@ You can then pass any pointer value to the ``private_data``. If you
|
||||||
assign private data, you should define a destructor, too. The
|
assign private data, you should define a destructor, too. The
|
||||||
destructor function is set in the ``private_free`` field::
|
destructor function is set in the ``private_free`` field::
|
||||||
|
|
||||||
struct mydata *p = kmalloc(sizeof(*p), GFP_KERNEL);
|
struct mydata *p = kmalloc_obj(*p);
|
||||||
hw->private_data = p;
|
hw->private_data = p;
|
||||||
hw->private_free = mydata_free;
|
hw->private_free = mydata_free;
|
||||||
|
|
||||||
|
|
@ -3833,7 +3833,7 @@ chip data individually::
|
||||||
err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
|
err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
|
||||||
0, &card);
|
0, &card);
|
||||||
....
|
....
|
||||||
chip = kzalloc(sizeof(*chip), GFP_KERNEL);
|
chip = kzalloc_obj(*chip);
|
||||||
....
|
....
|
||||||
card->private_data = chip;
|
card->private_data = chip;
|
||||||
....
|
....
|
||||||
|
|
|
||||||
|
|
@ -249,7 +249,7 @@ And SOC-specific utility code might look something like::
|
||||||
{
|
{
|
||||||
struct mysoc_spi_data *pdata2;
|
struct mysoc_spi_data *pdata2;
|
||||||
|
|
||||||
pdata2 = kmalloc(sizeof *pdata2, GFP_KERNEL);
|
pdata2 = kmalloc_obj(*pdata2);
|
||||||
*pdata2 = pdata;
|
*pdata2 = pdata;
|
||||||
...
|
...
|
||||||
if (n == 2) {
|
if (n == 2) {
|
||||||
|
|
@ -373,7 +373,7 @@ a bus (appearing under /sys/class/spi_master).
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
/* get memory for driver's per-chip state */
|
/* get memory for driver's per-chip state */
|
||||||
chip = kzalloc(sizeof *chip, GFP_KERNEL);
|
chip = kzalloc(*chip);
|
||||||
if (!chip)
|
if (!chip)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
spi_set_drvdata(spi, chip);
|
spi_set_drvdata(spi, chip);
|
||||||
|
|
|
||||||
|
|
@ -462,7 +462,7 @@ e tutti gli oggetti che contiene. Ecco il codice::
|
||||||
{
|
{
|
||||||
struct object *obj;
|
struct object *obj;
|
||||||
|
|
||||||
if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
|
if ((obj = kmalloc_obj(*obj)) == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
strscpy(obj->name, name, sizeof(obj->name));
|
strscpy(obj->name, name, sizeof(obj->name));
|
||||||
|
|
@ -537,7 +537,7 @@ sono quelle rimosse, mentre quelle ``+`` sono quelle aggiunte.
|
||||||
struct object *obj;
|
struct object *obj;
|
||||||
+ unsigned long flags;
|
+ unsigned long flags;
|
||||||
|
|
||||||
if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
|
if ((obj = kmalloc_obj(*obj)) == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@@ -63,30 +64,33 @@
|
@@ -63,30 +64,33 @@
|
||||||
obj->id = id;
|
obj->id = id;
|
||||||
|
|
|
||||||
|
|
@ -488,7 +488,7 @@ o rwlock_t. Per esempio, la sezione critica non deve fare allocazioni di
|
||||||
memoria. Su un kernel non-PREEMPT_RT il seguente codice funziona perfettamente::
|
memoria. Su un kernel non-PREEMPT_RT il seguente codice funziona perfettamente::
|
||||||
|
|
||||||
raw_spin_lock(&lock);
|
raw_spin_lock(&lock);
|
||||||
p = kmalloc(sizeof(*p), GFP_ATOMIC);
|
p = kmalloc_obj(*p, GFP_ATOMIC);
|
||||||
|
|
||||||
Ma lo stesso codice non funziona su un kernel PREEMPT_RT perché l'allocatore di
|
Ma lo stesso codice non funziona su un kernel PREEMPT_RT perché l'allocatore di
|
||||||
memoria può essere oggetto di prelazione e quindi non può essere chiamato in un
|
memoria può essere oggetto di prelazione e quindi non può essere chiamato in un
|
||||||
|
|
@ -497,7 +497,7 @@ trattiene un blocco *non-raw* perché non disabilitano la prelazione sui kernel
|
||||||
PREEMPT_RT::
|
PREEMPT_RT::
|
||||||
|
|
||||||
spin_lock(&lock);
|
spin_lock(&lock);
|
||||||
p = kmalloc(sizeof(*p), GFP_ATOMIC);
|
p = kmalloc_obj(*p, GFP_ATOMIC);
|
||||||
|
|
||||||
|
|
||||||
bit spinlocks
|
bit spinlocks
|
||||||
|
|
|
||||||
|
|
@ -943,7 +943,7 @@ Il modo preferito per passare la dimensione di una struttura è il seguente:
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
p = kmalloc(sizeof(*p), ...);
|
p = kmalloc_obj(*p, ...);
|
||||||
|
|
||||||
La forma alternativa, dove il nome della struttura viene scritto interamente,
|
La forma alternativa, dove il nome della struttura viene scritto interamente,
|
||||||
peggiora la leggibilità e introduce possibili bachi quando il tipo di
|
peggiora la leggibilità e introduce possibili bachi quando il tipo di
|
||||||
|
|
|
||||||
|
|
@ -955,7 +955,7 @@ La forma preferida para pasar el tamaño de una estructura es la siguiente:
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
p = kmalloc(sizeof(*p), ...);
|
p = kmalloc_obj(*p, ...);
|
||||||
|
|
||||||
La forma alternativa donde se deletrea el nombre de la estructura perjudica
|
La forma alternativa donde se deletrea el nombre de la estructura perjudica
|
||||||
la legibilidad, y presenta una oportunidad para un error cuando se cambia
|
la legibilidad, y presenta una oportunidad para un error cuando se cambia
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ kref可以出现在数据结构体中的任何地方。
|
||||||
|
|
||||||
struct my_data *data;
|
struct my_data *data;
|
||||||
|
|
||||||
data = kmalloc(sizeof(*data), GFP_KERNEL);
|
data = kmalloc_obj(*data);
|
||||||
if (!data)
|
if (!data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
kref_init(&data->refcount);
|
kref_init(&data->refcount);
|
||||||
|
|
@ -106,7 +106,7 @@ Kref规则
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
struct my_data *data;
|
struct my_data *data;
|
||||||
struct task_struct *task;
|
struct task_struct *task;
|
||||||
data = kmalloc(sizeof(*data), GFP_KERNEL);
|
data = kmalloc_obj(*data);
|
||||||
if (!data)
|
if (!data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
kref_init(&data->refcount);
|
kref_init(&data->refcount);
|
||||||
|
|
|
||||||
|
|
@ -813,7 +813,7 @@ Documentation/translations/zh_CN/core-api/memory-allocation.rst 。
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
p = kmalloc(sizeof(*p), ...);
|
p = kmalloc_obj(*p, ...);
|
||||||
|
|
||||||
另外一种传递方式中,sizeof 的操作数是结构体的名字,这样会降低可读性,并且可能
|
另外一种传递方式中,sizeof 的操作数是结构体的名字,这样会降低可读性,并且可能
|
||||||
会引入 bug。有可能指针变量类型被改变时,而对应的传递给内存分配函数的 sizeof
|
会引入 bug。有可能指针变量类型被改变时,而对应的传递给内存分配函数的 sizeof
|
||||||
|
|
|
||||||
|
|
@ -799,7 +799,7 @@ int my_open(struct file *file)
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
my_fh = kzalloc(sizeof(*my_fh), GFP_KERNEL);
|
my_fh = kzalloc_obj(*my_fh);
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -827,7 +827,7 @@ Documentation/translations/zh_CN/core-api/memory-allocation.rst 。
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
p = kmalloc(sizeof(*p), ...);
|
p = kmalloc_obj(*p, ...);
|
||||||
|
|
||||||
另外一種傳遞方式中,sizeof 的操作數是結構體的名字,這樣會降低可讀性,並且可能
|
另外一種傳遞方式中,sizeof 的操作數是結構體的名字,這樣會降低可讀性,並且可能
|
||||||
會引入 bug。有可能指針變量類型被改變時,而對應的傳遞給內存分配函數的 sizeof
|
會引入 bug。有可能指針變量類型被改變時,而對應的傳遞給內存分配函數的 sizeof
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user