accel_decompress Subroutine

Zweck

Dekomprimiert Daten mithilfe einer hardwarebeschleunigten Speicherdekomprimierung oder einer langsameren Softwaredekomprimierung, wenn kein Hardwarebeschleuniger verfügbar ist

Syntax

#include <sys/types.h>

#include <sys/vminfo.h>


int accel_decompress (void *c_buf, size_t c_len,
void *uc buf, size_t *uc_lenp, int flags);

Beschreibung

Bei einem Zeiger auf einen Puffer mit zu dekomprimierenden Daten (Parameter c_buf ) gibt die Subroutine accel_decompress die dekomprimierten Daten in dem Puffer zurück, auf den der Parameter uc_buf verweist.

Die Komprimierungssubroutine sollte mit dem Parameter uc_lenp aufgerufen werden, der auf die Gesamtgröße des Parameters uc_buf initialisiert wird. Nach erfolgreicher Rückgabe wird der Parameter uc_lenp mit der Größe der komprimierten Daten im Parameter uc_buf aktualisiert. Für diese Subroutine gelten die folgenden Einschränkungen:
  • Der Parameter uc_buf und der Parameter c_buf überschneiden sich nicht. Eine Überlappung führt zu einem Fehler.
  • Die Parameter uc_buf und c_buf müssen mindestens an einer 128-Byte-Grenze ausgerichtet werden. Für das beste Ergebnis müssen die Parameter uc_buf und c_buf an einer 4096-Byte-Grenze ausgerichtet werden.
  • Die Parameter c_len und * uc_lenp sind auf maximal 1044480 Byte pro Subroutinenaufruf begrenzt, wenn Puffer an einer 4096-Byte-Grenze ausgerichtet sind. Für Puffer, die nicht an einer 4096-Byte-Grenze, aber an einer 128-Byte-Grenze ausgerichtet sind, sind die Parameter c_len und * uc_lenp auf 1040384 Byte pro Subroutinenaufruf und jeden Ausrichtungsabstand von einer 4096-Byte-Grenze begrenzt.

  • Die Parameter uc_lenp und c_len müssen ein Vielfaches von 8 Byte sein.
  • Die Zuordnung von Dateisegmenten mit der Funktion shmat () und der Funktion mmap () ist nicht zulässig. Die Zuordnung von Nicht-Dateisegmenten mit der Funktion shmat () und der Funktion mmap () ist jedoch zulässig (z. B.MMAP_ANONYMOUS).
  • Der Aufrufende ist für die Bereitstellung eines ausreichend großen uc_buf-Moduls verantwortlich.

Die Subroutine verwendet den Algorithmus 842, um die Daten zu dekomprimieren. Der komprimierte Puffer enthält eine zyklische Blockprüfung (Cyclic Redundancy Check-CRC), die von der Subroutine accel_compress () hinzugefügt wird, die anhand der nicht komprimierten Daten überprüft wird. Wenn in dem System, das für die Dekomprimierung verwendet wird, kein Hardwarebeschleuniger verfügbar ist, verwendet der Aufruf die Methode der Softwaredekomprimierung. Die Subroutine unterstützt sowohl 32 -Bit-als auch 64-Bit-Anwendungen.

Hardwarebeschleuniger sind eine begrenzte Ressource auf jedem System und Sie müssen darauf achten, die Beschleuniger nicht zu überfordern. Wenn Sie einen großen Pool von Threads haben, die alle um einige der verfügbaren Akzeleratoren konkurrieren, können Sie am Ende eine schlechtere Leistung erzielen als mit reiner Softwaredekomprimierung.

Parameter

Element Beschreibung
c_buf Zeiger auf Eingabepuffer mit zu dekomprimierenden Daten.
Länge Länge der komprimierten Daten im Parameter c_buf .
uc_buf Zeiger auf Puffer, der mit dekomprimierten Daten geschrieben wurde.
uc_lenp Zeiger auf Ein-/Ausgabeparameter. Bei Eingabe ist der Parameter uc_lenp die verfügbare Gesamtgröße im Parameter uc_buf und beim Exit ist der Parameter uc_lenp die Anzahl der Byte, die in den Parameter uc_buf geschrieben werden.
Flags Für künftige Verwendung reserviert. Dieser Parameter muss auf null gesetzt werden.

Ausführungsumgebung

Die Subroutine accel_decompress kann nur aus der Prozessumgebung aufgerufen werden.

Rückgabewerte

Element Beschreibung
0 Erfolg
1 Fehler. Bei einem Fehler wird die globale Variable errno wie folgt gesetzt:
EFAULT
Fehler beim Zugriff auf den Speicher, auf den der Parameter c_lenp verweist, oder Zugriffsfehler im Quellen-oder Zielpuffer.
EINVAL
Fehler aufgrund einer der folgenden Bedingungen:
  • Die Parameter uc_buf und c_buf weisen eine falsche Ausrichtung auf.
  • Die Parameter uc_buf und c_buf überschneiden sich.
  • Der Parameter uc_lenp oder c_len ist kein Vielfaches von 8.
  • Der Parameter uc_buf, c_buf oder c_lenp ist NULL.
  • Es konnte keine Liste der Seiten des Parameters uc_buf oder c_buf erstellt werden, die an die Beschleunigerhardware übergeben werden sollen.
  • Die Parameter uc_buf oder c_buf befinden sich in einer Datei.
  • Der Parameter Flags ist ein Wert ungleich null.
ENOMEM
In der Subroutine konnte kein Speicher zugeordnet werden.
EFBIG
Der Parameter uc_lenp oder c_len überschreitet 1.044.480 Byte.
EIO
Der Firmware-Aufruf ist fehlgeschlagen oder die Accelerator-Hardware hat einen Fehler unbekannten Typs zurückgegeben. Dies kann Fehler enthalten, die durch falsche Eingabeargumente für die Subroutine accel_decompress () verursacht wurden.
BESCHÄDIGT
Die komprimierten Daten sind ungültig oder entsprechen nicht dem eingebetteten CRC.
ENOSPC
Der Ausgabepuffer ist zu klein, um alle dekomprimierten Daten aufzunehmen.