Commit ca768b66 authored by Stefan Weinhuber's avatar Stefan Weinhuber Committed by Martin Schwidefsky

[S390] vmlogrdr: purge after recording is switched off

If automatic purge is enabled for a vmlogrdr device, old records are
purged before an IUCV recording service is switched on or off. If z/VM
generates a large number of records between purging and switching the
recording service off, these records remain queued, and may have a
negative performance impact on the z/VM system. To avoid this problem,
we need to purge the records after recording is switched off.
Signed-off-by: default avatarStefan Weinhuber <wein@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 16d2ce27
...@@ -249,9 +249,7 @@ static int vmlogrdr_recording(struct vmlogrdr_priv_t * logptr, ...@@ -249,9 +249,7 @@ static int vmlogrdr_recording(struct vmlogrdr_priv_t * logptr,
char cp_command[80]; char cp_command[80];
char cp_response[160]; char cp_response[160];
char *onoff, *qid_string; char *onoff, *qid_string;
int rc;
memset(cp_command, 0x00, sizeof(cp_command));
memset(cp_response, 0x00, sizeof(cp_response));
onoff = ((action == 1) ? "ON" : "OFF"); onoff = ((action == 1) ? "ON" : "OFF");
qid_string = ((recording_class_AB == 1) ? " QID * " : ""); qid_string = ((recording_class_AB == 1) ? " QID * " : "");
...@@ -263,13 +261,13 @@ static int vmlogrdr_recording(struct vmlogrdr_priv_t * logptr, ...@@ -263,13 +261,13 @@ static int vmlogrdr_recording(struct vmlogrdr_priv_t * logptr,
* can't be switched on as long as records are on the queue. * can't be switched on as long as records are on the queue.
* Doing both at the same time doesn't work. * Doing both at the same time doesn't work.
*/ */
if (purge && (action == 1)) {
if (purge) { memset(cp_command, 0x00, sizeof(cp_command));
memset(cp_response, 0x00, sizeof(cp_response));
snprintf(cp_command, sizeof(cp_command), snprintf(cp_command, sizeof(cp_command),
"RECORDING %s PURGE %s", "RECORDING %s PURGE %s",
logptr->recording_name, logptr->recording_name,
qid_string); qid_string);
cpcmd(cp_command, cp_response, sizeof(cp_response), NULL); cpcmd(cp_command, cp_response, sizeof(cp_response), NULL);
} }
...@@ -279,7 +277,6 @@ static int vmlogrdr_recording(struct vmlogrdr_priv_t * logptr, ...@@ -279,7 +277,6 @@ static int vmlogrdr_recording(struct vmlogrdr_priv_t * logptr,
logptr->recording_name, logptr->recording_name,
onoff, onoff,
qid_string); qid_string);
cpcmd(cp_command, cp_response, sizeof(cp_response), NULL); cpcmd(cp_command, cp_response, sizeof(cp_response), NULL);
/* The recording command will usually answer with 'Command complete' /* The recording command will usually answer with 'Command complete'
* on success, but when the specific service was never connected * on success, but when the specific service was never connected
...@@ -288,10 +285,25 @@ static int vmlogrdr_recording(struct vmlogrdr_priv_t * logptr, ...@@ -288,10 +285,25 @@ static int vmlogrdr_recording(struct vmlogrdr_priv_t * logptr,
* 'Command complete'. So I use strstr rather then the strncmp. * 'Command complete'. So I use strstr rather then the strncmp.
*/ */
if (strstr(cp_response,"Command complete")) if (strstr(cp_response,"Command complete"))
return 0; rc = 0;
else else
return -EIO; rc = -EIO;
/*
* If we turn recording off, we have to purge any remaining records
* afterwards, as a large number of queued records may impact z/VM
* performance.
*/
if (purge && (action == 0)) {
memset(cp_command, 0x00, sizeof(cp_command));
memset(cp_response, 0x00, sizeof(cp_response));
snprintf(cp_command, sizeof(cp_command),
"RECORDING %s PURGE %s",
logptr->recording_name,
qid_string);
cpcmd(cp_command, cp_response, sizeof(cp_response), NULL);
}
return rc;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment