davep@gapos.bt.co.uk (Dave Parkinson) (11/29/90)
re: The printer problem I highlighted earlier - with my machine always crashing whenever I attempted to print large files on my DeskJet 500. I've done some more investigation and herewith the result... Possible reason: The timing of the printer and that of the pr_char() routine in printer.c are such that the pr_char() routine only manages to print a maximum of one character per call - BUSY is being dropped just as the function decides to return, and raises a new interrupt. This is then waiting to be serviced as soon as the printer interrupt is re-enabled. Reason I think so: Debugging code revealed the max of 1-char per intrpt in the do{}while loop. Adding a few lines at the start so that the code does several reads & tests of the status port before returning on busy cured the problem - it gives BUSY time to go away. (With this I got a maximum o/p of about 94 chars in one go from the loop). An alternative cure was hardware based. My Zenith machine supports three operating speeds: SLOW FAST SMART. Naturally I always run it on FAST. Picking SLOW or SMART cured the problem. (With SMART the machine automatically slows down for I/O operations). Source Code Fix: Other than the simple patch mentioned above (which is just papering over the cracks) I haven't been able to determine why the kernel crashes. Perhaps someone more familiar with the code can pin-point the problem. As far as I can see the lpr_int() routine doesn't re-enable interrupts (for the printer) until the iret of restart(). One other route would appear to be through the pr_restart() routine that is called from the clock interrupt handler. In this case there is some re-entrancy in the kernel code. One thing is clear - until the print buffer (16k) is full, the printer interrupt routine is being called for each character that is output rather than a few times for each block of characters that are output. ie It is hogging the processor and nothing else is likely to get a look in until the printer pauses for breath. I've tried some code in pr_char() to check for possible stack overflow, but this doesn't report any problems. This may be because the crash occurs before the message can be printed! I'll be glad of any pointers/suggestions. David Parkinson