Fusselbär
Makefile Voyeur
Mit dem neuen Beta Release 375.10 gibt es nun Einstellungen gegen das Tearing ForceCompositionPipeline und ForceFullCompositionPipeline direkt in den nvidia-settings:
https://devtalk.nvidia.com/default/topic/972585/linux-solaris-and-freebsd-driver-375-10-beta-
Leider ist das compilern unter FreeBSD ein bisschen trickreich, weil die nvidia-settings in der Version 375.10 nach dem nvml.h Header aus dem GPU Deployment Kit verlangen, was es leider nicht nativ für FreeBSD gibt. Experimente mit dem implantieren einer Linux Version in compat habe ich dann doch nicht gewagt.
Aber: ich hab es auch so hinbekommen, ohne den nvml.h Header aus dem GPU Deployment Kit:
Das ist der Patch:
https://devtalk.nvidia.com/default/topic/972585/linux-solaris-and-freebsd-driver-375-10-beta-
Leider ist das compilern unter FreeBSD ein bisschen trickreich, weil die nvidia-settings in der Version 375.10 nach dem nvml.h Header aus dem GPU Deployment Kit verlangen, was es leider nicht nativ für FreeBSD gibt. Experimente mit dem implantieren einer Linux Version in compat habe ich dann doch nicht gewagt.
Aber: ich hab es auch so hinbekommen, ohne den nvml.h Header aus dem GPU Deployment Kit:
Das ist der Patch:
Code:
--- src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c.orig 2016-10-21 15:05:26 UTC
+++ src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c
@@ -33,7 +33,9 @@
#include "NVCtrlLib.h"
-#include "nvml.h"
+#ifdef NVML_AVAILABLE
+
+#include <nvml.h>
#define MAX_NVML_STR_LEN 64
@@ -126,12 +128,14 @@ static void printNvmlError(nvmlReturn_t
"operating system/cgroups");
break;
- default:
+ case NVML_ERROR_UNKNOWN:
nv_error_msg("An internal driver error occurred");
break;
}
}
+#endif // NVML_AVAILABLE
+
/*
* Loads and initializes the NVML library
@@ -139,6 +143,8 @@ static void printNvmlError(nvmlReturn_t
ReturnStatus NvCtrlInitNvml(void)
{
+#ifdef NVML_AVAILABLE
+
if (!__isNvmlLoaded) {
nvmlReturn_t ret = nvmlInit();
if (ret != NVML_SUCCESS) {
@@ -152,6 +158,10 @@ ReturnStatus NvCtrlInitNvml(void)
__nvmlUsers++;
return NvCtrlSuccess;
+
+#else
+ return NvCtrlMissingExtension;
+#endif
}
@@ -162,6 +172,8 @@ ReturnStatus NvCtrlInitNvml(void)
ReturnStatus NvCtrlDestroyNvml(void)
{
+#ifdef NVML_AVAILABLE
+
if (__isNvmlLoaded) {
__nvmlUsers--;
if (__nvmlUsers == 0) {
@@ -174,6 +186,10 @@ ReturnStatus NvCtrlDestroyNvml(void)
}
}
return NvCtrlSuccess;
+
+#else
+ return NvCtrlMissingExtension;
+#endif
}
@@ -184,37 +200,26 @@ ReturnStatus NvCtrlDestroyNvml(void)
* XXX Needed while using NV-CONTROL as fallback during the migration process
*/
-static Bool matchNvCtrlWithNvmlIds(const NvCtrlAttributePrivateHandle *h,
- int nvmlGpuCount,
+#ifdef NVML_AVAILABLE
+
+static void matchNvCtrlWithNvmlIds(const NvCtrlAttributePrivateHandle *h,
+ int deviceCount,
unsigned int **idsDictionary)
{
char nvmlUUID[MAX_NVML_STR_LEN];
char *nvctrlUUID = NULL;
nvmlDevice_t device;
int i, j;
- int nvctrlGpuCount = 0;
- ReturnStatus ret;
- /* Get the gpu count returned by NV-CONTROL.
- * If there is mismatch between count returned by NVML and NV-CONTROL
- * return early.
- */
- ret = XNVCTRLQueryTargetCount(h->dpy, NV_CTRL_TARGET_TYPE_GPU,
- &nvctrlGpuCount);
-
- if ((ret != NvCtrlSuccess) || (nvctrlGpuCount != nvmlGpuCount)) {
- return FALSE;
- }
-
- *idsDictionary = nvalloc(nvmlGpuCount * sizeof(unsigned int));
+ *idsDictionary = nvalloc(deviceCount * sizeof(unsigned int));
/* Fallback case is to use same id either for NV-CONTROL and NVML */
- for (i = 0; i < nvmlGpuCount; i++) {
+ for (i = 0; i < deviceCount; i++) {
(*idsDictionary)[i] = i;
}
if (h->nv != NULL) {
- for (i = 0; i < nvctrlGpuCount; i++) {
+ for (i = 0; i < deviceCount; i++) {
/* Get GPU UUID through NV-CONTROL */
if (!XNVCTRLQueryTargetStringAttribute(h->dpy,
NV_CTRL_TARGET_TYPE_GPU,
@@ -229,7 +234,7 @@ static Bool matchNvCtrlWithNvmlIds(const
}
/* Look for the same UUID through NVML */
- for (j = 0; j < nvmlGpuCount; j++) {
+ for (j = 0; j < deviceCount; j++) {
if (NVML_SUCCESS != nvmlDeviceGetHandleByIndex(j, &device)) {
continue;
}
@@ -249,9 +254,10 @@ static Bool matchNvCtrlWithNvmlIds(const
XFree(nvctrlUUID);
}
}
- return TRUE;
}
+#endif // NVML_AVAILABLE
+
/*
@@ -261,6 +267,8 @@ static Bool matchNvCtrlWithNvmlIds(const
NvCtrlNvmlAttributes *NvCtrlInitNvmlAttributes(NvCtrlAttributePrivateHandle *h)
{
+#ifdef NVML_AVAILABLE
+
NvCtrlNvmlAttributes *nvml = NULL;
unsigned int count;
unsigned int *nvctrlToNvmlId;
@@ -292,9 +300,7 @@ NvCtrlNvmlAttributes *NvCtrlInitNvmlAttr
}
/* Fill the NV-CONTROL to NVML IDs dictionary */
- if (!matchNvCtrlWithNvmlIds(h, count, &nvctrlToNvmlId)) {
- goto fail;
- }
+ matchNvCtrlWithNvmlIds(h, count, &nvctrlToNvmlId);
/*
* Fill 'sensorCountPerGPU', 'coolerCountPerGPU' and properly set
@@ -360,6 +366,10 @@ NvCtrlNvmlAttributes *NvCtrlInitNvmlAttr
free(nvml->coolerCountPerGPU);
free(nvml);
return NULL;
+
+#else
+ return NULL;
+#endif
}
@@ -370,6 +380,8 @@ NvCtrlNvmlAttributes *NvCtrlInitNvmlAttr
void NvCtrlNvmlAttributesClose(NvCtrlAttributePrivateHandle *h)
{
+#ifdef NVML_AVAILABLE
+
/* Check parameters */
if (h == NULL || h->nvml == NULL) {
return;
@@ -379,6 +391,8 @@ void NvCtrlNvmlAttributesClose(NvCtrlAtt
free(h->nvml->coolerCountPerGPU);
free(h->nvml);
h->nvml = NULL;
+
+#endif
}
@@ -390,6 +404,8 @@ void NvCtrlNvmlAttributesClose(NvCtrlAtt
ReturnStatus NvCtrlNvmlQueryTargetCount(const CtrlTarget *ctrl_target,
int target_type, int *val)
{
+#ifdef NVML_AVAILABLE
+
const NvCtrlAttributePrivateHandle *h = getPrivateHandleConst(ctrl_target);
if (!__isNvmlLoaded) {
@@ -422,6 +438,10 @@ ReturnStatus NvCtrlNvmlQueryTargetCount(
}
return NvCtrlSuccess;
+
+#else
+ return NvCtrlMissingExtension;
+#endif
}
@@ -430,7 +450,7 @@ ReturnStatus NvCtrlNvmlQueryTargetCount(
* Get NVML String Attribute Values
*/
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus NvCtrlNvmlGetGPUStringAttribute(const CtrlTarget *ctrl_target,
int attr, char **ptr)
@@ -492,16 +512,17 @@ static ReturnStatus NvCtrlNvmlGetGPUStri
return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus NvCtrlNvmlGetStringAttribute(const CtrlTarget *ctrl_target,
int attr, char **ptr)
{
+#ifdef NVML_AVAILABLE
+
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
-#ifdef NVML_EXPERIMENTAL
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -532,7 +553,7 @@ ReturnStatus NvCtrlNvmlGetStringAttribut
}
#else
- return NvCtrlNotSupported;
+ return NvCtrlMissingExtension;
#endif
}
@@ -542,7 +563,7 @@ ReturnStatus NvCtrlNvmlGetStringAttribut
* Set NVML String Attribute Values
*/
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus NvCtrlNvmlSetGPUStringAttribute(CtrlTarget *ctrl_target,
int attr, const char *ptr)
@@ -583,16 +604,17 @@ static ReturnStatus NvCtrlNvmlSetGPUStri
return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus NvCtrlNvmlSetStringAttribute(CtrlTarget *ctrl_target,
int attr, const char *ptr)
{
+#ifdef NVML_AVAILABLE
+
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
-#ifdef NVML_EXPERIMENTAL
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -624,7 +646,7 @@ ReturnStatus NvCtrlNvmlSetStringAttribut
}
#else
- return NvCtrlNotSupported;
+ return NvCtrlMissingExtension;
#endif
}
@@ -634,6 +656,8 @@ ReturnStatus NvCtrlNvmlSetStringAttribut
* Get NVML Attribute Values
*/
+#ifdef NVML_AVAILABLE
+
static ReturnStatus NvCtrlNvmlGetGPUAttribute(const CtrlTarget *ctrl_target,
int attr, int64_t *val)
{
@@ -649,7 +673,6 @@ static ReturnStatus NvCtrlNvmlGetGPUAttr
ret = nvmlDeviceGetHandleByIndex(h->nvml->deviceIdx, &device);
if (ret == NVML_SUCCESS) {
switch (attr) {
-#ifdef NVML_EXPERIMENTAL
case NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY:
case NV_CTRL_USED_DEDICATED_GPU_MEMORY:
{
@@ -714,17 +737,7 @@ static ReturnStatus NvCtrlNvmlGetGPUAttr
case NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH:
ret = nvmlDeviceGetMaxPcieLinkWidth(device, &res);
break;
-#else
- case NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY:
- case NV_CTRL_USED_DEDICATED_GPU_MEMORY:
- case NV_CTRL_PCI_DOMAIN:
- case NV_CTRL_PCI_BUS:
- case NV_CTRL_PCI_DEVICE:
- case NV_CTRL_PCI_FUNCTION:
- case NV_CTRL_PCI_ID:
- case NV_CTRL_GPU_PCIE_GENERATION:
- case NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH:
-#endif // NVML_EXPERIMENTAL
+
case NV_CTRL_VIDEO_RAM:
case NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH:
case NV_CTRL_GPU_PCIE_MAX_LINK_SPEED:
@@ -790,14 +803,6 @@ static ReturnStatus NvCtrlNvmlGetGPUAttr
*/
return NvCtrlNotSupported;
- case NV_CTRL_ATTR_NVML_GPU_VIRTUALIZATION_MODE:
- {
- nvmlGpuVirtualizationMode_t mode;
- ret = nvmlDeviceGetVirtualizationMode(device, &mode);
- res = mode;
- }
- break;
-
default:
/* Did we forget to handle a GPU integer attribute? */
nv_warning_msg("Unhandled integer attribute %s (%d) of GPU "
@@ -817,8 +822,6 @@ static ReturnStatus NvCtrlNvmlGetGPUAttr
return NvCtrlNotSupported;
}
-#ifdef NVML_EXPERIMENTAL
-
static int getThermalCoolerId(const NvCtrlAttributePrivateHandle *h,
unsigned int thermalCoolerCount,
const unsigned int *thermalCoolerCountPerGPU)
@@ -953,11 +956,14 @@ static ReturnStatus NvCtrlNvmlGetCoolerA
printNvmlError(ret);
return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+
+#endif // NVML_AVAILABLE
ReturnStatus NvCtrlNvmlGetAttribute(const CtrlTarget *ctrl_target,
int attr, int64_t *val)
{
+#ifdef NVML_AVAILABLE
+
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
@@ -972,19 +978,17 @@ ReturnStatus NvCtrlNvmlGetAttribute(cons
switch (NvCtrlGetTargetType(ctrl_target)) {
case GPU_TARGET:
return NvCtrlNvmlGetGPUAttribute(ctrl_target, attr, val);
-#ifdef NVML_EXPERIMENTAL
case THERMAL_SENSOR_TARGET:
return NvCtrlNvmlGetThermalAttribute(ctrl_target, attr, val);
case COOLER_TARGET:
return NvCtrlNvmlGetCoolerAttribute(ctrl_target, attr, val);
-#else
- case THERMAL_SENSOR_TARGET:
- case COOLER_TARGET:
- return NvCtrlNotSupported;
-#endif
default:
return NvCtrlBadHandle;
}
+
+#else
+ return NvCtrlMissingExtension;
+#endif
}
@@ -993,7 +997,7 @@ ReturnStatus NvCtrlNvmlGetAttribute(cons
* Set NVML Attribute Values
*/
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus NvCtrlNvmlSetGPUAttribute(CtrlTarget *ctrl_target,
int attr, int index, int val)
@@ -1093,16 +1097,17 @@ static ReturnStatus NvCtrlNvmlSetCoolerA
return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus NvCtrlNvmlSetAttribute(CtrlTarget *ctrl_target, int attr,
int index, int val)
{
+#ifdef NVML_AVAILABLE
+
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
-#ifdef NVML_EXPERIMENTAL
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1128,7 +1133,7 @@ ReturnStatus NvCtrlNvmlSetAttribute(Ctrl
}
#else
- return NvCtrlNotSupported;
+ return NvCtrlMissingExtension;
#endif
}
@@ -1138,7 +1143,7 @@ ReturnStatus NvCtrlNvmlSetAttribute(Ctrl
* Get NVML Binary Attribute Values
*/
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus
NvCtrlNvmlGetGPUBinaryAttribute(const CtrlTarget *ctrl_target,
@@ -1187,17 +1192,18 @@ NvCtrlNvmlGetGPUBinaryAttribute(const Ct
return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus
NvCtrlNvmlGetBinaryAttribute(const CtrlTarget *ctrl_target,
int attr, unsigned char **data, int *len)
{
+#ifdef NVML_AVAILABLE
+
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
-#ifdef NVML_EXPERIMENTAL
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1231,7 +1237,7 @@ NvCtrlNvmlGetBinaryAttribute(const CtrlT
}
#else
- return NvCtrlNotSupported;
+ return NvCtrlMissingExtension;
#endif
}
@@ -1241,7 +1247,7 @@ NvCtrlNvmlGetBinaryAttribute(const CtrlT
* Get NVML Valid String Attribute Values
*/
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus
NvCtrlNvmlGetGPUValidStringAttributeValues(int attr,
@@ -1273,19 +1279,20 @@ NvCtrlNvmlGetGPUValidStringAttributeValu
return NvCtrlSuccess;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus
NvCtrlNvmlGetValidStringAttributeValues(const CtrlTarget *ctrl_target,
int attr,
CtrlAttributeValidValues *val)
{
+#ifdef NVML_AVAILABLE
+ ReturnStatus ret;
+
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
-#ifdef NVML_EXPERIMENTAL
- ReturnStatus ret;
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1332,7 +1339,7 @@ NvCtrlNvmlGetValidStringAttributeValues(
return ret;
#else
- return NvCtrlNotSupported;
+ return NvCtrlMissingExtension;
#endif
}
@@ -1342,7 +1349,7 @@ NvCtrlNvmlGetValidStringAttributeValues(
* Get NVML Valid Attribute Values
*/
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus
NvCtrlNvmlGetGPUValidAttributeValues(const CtrlTarget *ctrl_target, int attr,
@@ -1547,19 +1554,20 @@ NvCtrlNvmlGetCoolerValidAttributeValues(
return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus
NvCtrlNvmlGetValidAttributeValues(const CtrlTarget *ctrl_target,
int attr,
CtrlAttributeValidValues *val)
{
+#ifdef NVML_AVAILABLE
+ ReturnStatus ret;
+
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
-#ifdef NVML_EXPERIMENTAL
- ReturnStatus ret;
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1613,7 +1621,7 @@ NvCtrlNvmlGetValidAttributeValues(const
return ret;
#else
- return NvCtrlNotSupported;
+ return NvCtrlMissingExtension;
#endif
}