[LINUX] Seitenfragmente

Ursprünglich ist es Teil des Quellcodes des Linux-Kernels, daher wird es als GPLv2 behandelt (Anerkennung, dass es sein sollte).

https://www.kernel.org/doc/html/latest/index.html

Licensing documentation

The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.

https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing

https://www.kernel.org/doc/html/latest/vm/page_frags.html


Page fragments

A page fragment is an arbitrary-length arbitrary-offset area of memory which resides within a 0 or higher order compound page. Multiple fragments within that page are individually refcounted, in the page’s reference counter.

Ein Seitenfragment ist ein Speicherbereich beliebiger Länge mit beliebigem Versatz und existiert auf einer zusammengesetzten Seite von 0 oder mehr. Mehrere Fragmente werden einzeln referenziert und im Seitenreferenzzähler gezählt.

The page_frag functions, page_frag_alloc and page_frag_free, provide a simple allocation framework for page fragments. This is used by the network stack and network device drivers to provide a backing region of memory for use as either an sk_buff->head, or to be used in the “frags” portion of skb_shared_info.

Die page_flag-Funktionen von page_frag_alloc und page_frag_free bieten ein einfaches Zuordnungsframework für Seitenfragmente. Dies wird von Netzwerkstapeln und Netzwerkgerätetreibern verwendet, um einen Sicherungsbereich für sk_buff-> head bereitzustellen. Es wird auch in der Position "frags" von skb_shared_info verwendet.

In order to make use of the page fragment APIs a backing page fragment cache is needed. This provides a central point for the fragment allocation and tracks allows multiple calls to make use of a cached page. The advantage to doing this is that multiple calls to get_page can be avoided which can be expensive at allocation time. However due to the nature of this caching it is required that any calls to the cache be protected by either a per-cpu limitation, or a per-cpu limitation and forcing interrupts to be disabled when executing the fragment allocation.

Für die Verwendung der Seitenfragment-API ist ein Backing-Page-Fragment-Cache erforderlich. Es bietet eine zentrale Position für die Fragmentzuweisung und stellt zwischengespeicherte Seiten in mehreren Aufrufen zur Verfügung. Dies hat den Vorteil, dass Sie mehrere Aufrufe von get_page vermeiden können. Es ist sehr kostspielig, die Zeit zu sichern. Aufgrund der Art dieses Caches müssen Aufrufe des Caches den Cache entweder durch CPU-Grenzwerte oder durch CPU-Grenzwerte schützen und Interrupts bei der Fragmentzuweisung zwangsweise deaktivieren.

The network stack uses two separate caches per CPU to handle fragment allocation. The netdev_alloc_cache is used by callers making use of the __netdev_alloc_frag and __netdev_alloc_skb calls. The napi_alloc_cache is used by callers of the __napi_alloc_frag and __napi_alloc_skb calls. The main difference between these two calls is the context in which they may be called. The “netdev” prefixed functions are usable in any context as these functions will disable interrupts, while the “napi” prefixed functions are only usable within the softirq context.

Der Netzwerkstapel verwendet zwei verschiedene Caches für jede CPU, um die Fragmentzuordnung zu steuern. netdrv_alloc_cache wird von Anrufern verwendet, deren Anrufer __netdev_alloc_frag oder __net_dev_alloc_skg aufrufen. napi_alloc_cache wird vom Anrufer verwendet, wenn er __napi_alloc_frag und __napi_alloc_skb aufruft. Der Hauptunterschied zwischen den beiden Aufrufen ist der Kontext, in dem sie aufgerufen werden. Die Präfixfunktion "netdev" deaktiviert Interrupts und kann in jedem Kontext verwendet werden. Andererseits ist die Präfixfunktion [napi] nur im softirq-Kontext verfügbar.

Many network device drivers use a similar methodology for allocating page fragments, but the page fragments are cached at the ring or descriptor level. In order to enable these cases it is necessary to provide a generic way of tearing down a page cache. For this reason __page_frag_cache_drain was implemented. It allows for freeing multiple references from a single page via a single call. The advantage to doing this is that it allows for cleaning up the multiple references that were added to a page in order to avoid calling get_page per allocation.

Viele Netzwerkgerätetreiber verwenden eine ähnliche Methode zum Zuweisen von Seitenfragmenten. Das Seitenflaggen wird jedoch auf Link- oder Deskriptorebene zwischengespeichert. Damit diese Fälle wirksam werden, müssen Sie ein allgemeines Mittel zum Zerstören des Seitencaches bereitstellen.

Aus diesem Grund wurde __pagE_frag_cache_drain eingeführt. Sie können mit einem einzigen Aufruf mehrere Referenzen von einer einzelnen Seite freigeben. Dies hat den Vorteil, dass Sie get_page für die Zuweisung nicht aufrufen, sodass Sie mehrere der Seite hinzugefügte Verweise bereinigen können.

Alexander Duyck, Nov 29, 2016.

Recommended Posts

Seitenfragmente
Seitenverarbeitungsklasse
Python-Referenzseite