static irqreturn_t xpc_handle_notify_IRQ_uv(int irq, void *dev_id) { struct xpc_notify_mq_msg_uv *msg; short partid; struct xpc_partition *part; while ((msg = gru_get_next_message(xpc_notify_mq_uv->gru_mq_desc)) != NULL) { partid = msg->hdr.partid; if (partid < 0 || partid >= XP_MAX_NPARTITIONS_UV) { dev_err(xpc_part, "xpc_handle_notify_IRQ_uv() received " "invalid partid=0x%x in message\n", partid); } else { part = &xpc_partitions[partid]; if (xpc_part_ref(part)) { xpc_handle_notify_mq_msg_uv(part, msg); xpc_part_deref(part); } } gru_free_message(xpc_notify_mq_uv->gru_mq_desc, msg); } return IRQ_HANDLED; }
static int quicktest1(unsigned long arg) { struct gru_message_queue_desc mqd; void *p, *mq; unsigned long *dw; int i, ret = -EIO; char mes[GRU_CACHE_LINE_BYTES], *m; /* Need 1K cacheline aligned that does not cross page boundary */ p = kmalloc(4096, 0); if (p == NULL) return -ENOMEM; mq = ALIGNUP(p, 1024); memset(mes, 0xee, sizeof(mes)); dw = mq; gru_create_message_queue(&mqd, mq, 8 * GRU_CACHE_LINE_BYTES, 0, 0, 0); for (i = 0; i < 6; i++) { mes[8] = i; do { ret = gru_send_message_gpa(&mqd, mes, sizeof(mes)); } while (ret == MQE_CONGESTION); if (ret) break; } if (ret != MQE_QUEUE_FULL || i != 4) { // printk(KERN_DEBUG "GRU:%d quicktest1: unexpect status %d, i %d\n", ; goto done; } for (i = 0; i < 6; i++) { m = gru_get_next_message(&mqd); if (!m || m[8] != i) break; gru_free_message(&mqd, m); } if (i != 4) { // printk(KERN_DEBUG "GRU:%d quicktest2: bad message, i %d, m %p, m8 %d\n", ; goto done; } ret = 0; done: kfree(p); return ret; }
static irqreturn_t xpc_handle_activate_IRQ_uv(int irq, void *dev_id) { struct xpc_activate_mq_msghdr_uv *msg_hdr; short partid; struct xpc_partition *part; int wakeup_hb_checker = 0; int part_referenced; while (1) { msg_hdr = gru_get_next_message(xpc_activate_mq_uv->gru_mq_desc); if (msg_hdr == NULL) break; partid = msg_hdr->partid; if (partid < 0 || partid >= XP_MAX_NPARTITIONS_UV) { dev_err(xpc_part, "xpc_handle_activate_IRQ_uv() " "received invalid partid=0x%x in message\n", partid); } else { part = &xpc_partitions[partid]; part_referenced = xpc_part_ref(part); xpc_handle_activate_mq_msg_uv(part, msg_hdr, part_referenced, &wakeup_hb_checker); if (part_referenced) xpc_part_deref(part); } gru_free_message(xpc_activate_mq_uv->gru_mq_desc, msg_hdr); } if (wakeup_hb_checker) wake_up_interruptible(&xpc_activate_IRQ_wq); return IRQ_HANDLED; }