static atomic_t bytes_that_can_be_written = ATOMIC_INIT(0); #define WRITE_POSSIBLE (atomic_read(&bytes_that_can_be_written) != 0) ssize_t driver_write(struct file *instance, const char __user *buffer, size_t max_bytes_to_write, loff_t *offset) { size_t to_copy, not_copied; char kernelmem[128]; // Größe anpassen if (!WRITE_POSSIBLE && (instance->f_flags & O_NONBLOCK)) { // Hardware oder Treiber sind nicht bereit, die Daten zu // schreiben und der Zugriff erfolgt im NON_BLOCKING-Mode return -EAGAIN; } if (wait_event_interruptible(wq_write,WRITE_POSSIBLE)) { // während des Schlafens durch ein Signal unterbrochen return -ERESTARTSYS; } to_copy = min((size_t)atomic_read(&bytes_that_can_be_written), max_bytes_to_write); not_copied = copy_from_user(kernelmem, buffer, to_copy); // Kernel darf jetzt Daten in die Hardware schreiben atomic_sub(to_copy - not_copied, &bytes_that_can_be_written); return to_copy - not_copied; }