Iovectorized version of previous patch. Alloca + memcpy is still there, but only for lib_event_data structure, not for led_body.
Regards, Honza Steven Dake wrote: > This patch looks pretty good but it copies via alloca+memcpy the entire > event data buffer which doesn't change. Is it possible to send it as an > iovector to avoid the extra copy? > If not, go ahead and merge, but the memcpy of event buffer data is somewhat > detrimental to performance. > > Regards > -steve > > On Thu, Apr 30, 2009 at 4:08 AM, Jan Friesse <jfrie...@redhat.com> wrote: > >> Sorry, bad patch included in last mail. >> >> >> Jan Friesse wrote: >> >>> This patch fixes evt.c, so now no warnings are there. >>> >>> Regards, >>> Honza >>> >>> >> _______________________________________________ >> Openais mailing list >> Openais@lists.linux-foundation.org >> https://lists.linux-foundation.org/mailman/listinfo/openais >> >
Index: services/evt.c =================================================================== --- services/evt.c (revision 1878) +++ services/evt.c (working copy) @@ -109,7 +109,7 @@ static void lib_evt_unlink_channel(void *conn, const void *message); static void lib_evt_event_subscribe(void *conn, const void *message); static void lib_evt_event_unsubscribe(void *conn, const void *message); -static void lib_evt_event_publish(void *conn, void *message); +static void lib_evt_event_publish(void *conn, const void *message); static void lib_evt_event_clear_retentiontime(void *conn, const void *message); static void lib_evt_event_data_get(void *conn, const void *message); @@ -182,8 +182,8 @@ }; -static void evt_remote_evt(void *msg, unsigned int nodeid); -static void evt_remote_recovery_evt(void *msg, unsigned int nodeid); +static void evt_remote_evt(const void *msg, unsigned int nodeid); +static void evt_remote_recovery_evt(const void *msg, unsigned int nodeid); static void evt_remote_chan_op(const void *msg, unsigned int nodeid); static struct corosync_exec_handler evt_exec_engine[] = { @@ -2691,16 +2691,17 @@ /* * saEvtEventPublish Handler */ -static void lib_evt_event_publish(void *conn, void *message) +static void lib_evt_event_publish(void *conn, const void *message) { - struct lib_event_data *req = message; + struct lib_event_data *req; + const struct lib_event_data *req_ro = message; struct res_evt_event_publish res; struct event_svr_channel_open *eco; struct event_svr_channel_instance *eci; mar_evteventid_t event_id = 0; uint64_t msg_id = 0; SaAisErrorT error = SA_AIS_OK; - struct iovec pub_iovec; + struct iovec pub_iovec[2]; void *ptr; int result; unsigned int ret; @@ -2713,6 +2714,12 @@ /* + * Allocate new req and copy there message + */ + req = alloca (sizeof (*req)); + memcpy (req, message, sizeof (*req)); + + /* * look up and validate open channel info */ ret = hdb_handle_get(&esip->esi_hdb, @@ -2741,9 +2748,11 @@ * The multicasted event will be picked up and delivered * locally by the local network event receiver. */ - pub_iovec.iov_base = (char *)req; - pub_iovec.iov_len = req->led_head.size; - result = api->totem_mcast (&pub_iovec, 1, TOTEM_AGREED); + pub_iovec[0].iov_base = (char *)req; + pub_iovec[0].iov_len = sizeof (*req); + pub_iovec[1].iov_base = (char *)&req_ro->led_body; + pub_iovec[1].iov_len = req->led_user_data_offset + req->led_user_data_size; + result = api->totem_mcast (pub_iovec, 2, TOTEM_AGREED); if (result != 0) { error = SA_AIS_ERR_LIBRARY; } @@ -2903,7 +2912,7 @@ { log_printf(RECOVERY_DEBUG, "Evt conf change %d\n", configuration_type); - log_printf(RECOVERY_DEBUG, "m %"PRIu64", j %"PRIu64" l %"PRIu64, + log_printf(RECOVERY_DEBUG, "m %u, j %u l %u", member_list_entries, joined_list_entries, left_list_entries); @@ -3207,7 +3216,7 @@ /* * Receive the network event message and distribute it to local subscribers */ -static void evt_remote_evt(void *msg, unsigned int nodeid) +static void evt_remote_evt(const void *msg, unsigned int nodeid) { /* * - retain events that have a retention time @@ -3216,10 +3225,11 @@ * - Apply filters * - Deliver events that pass the filter test */ - struct lib_event_data *evtpkt = msg; + const struct lib_event_data *evtpkt = msg; struct event_svr_channel_instance *eci; struct event_data *evt; SaClmClusterNodeT *cn; + mar_time_t evtpkt_recieve_time; log_printf(LOGSYS_LEVEL_DEBUG, "Remote event data received from nodeid %s\n", api->totem_ifaces_print (nodeid)); @@ -3241,9 +3251,7 @@ log_printf(LOGSYS_LEVEL_DEBUG, "Cluster node ID %s name %s\n", api->totem_ifaces_print (cn->nodeId), cn->nodeName.value); - evtpkt->led_publisher_node_id = nodeid; - evtpkt->led_nodeid = nodeid; - evtpkt->led_receive_time = clust_time_now(); + evtpkt_recieve_time = clust_time_now(); if (evtpkt->led_chan_unlink_id != EVT_CHAN_ACTIVE) { log_printf(CHAN_UNLINK_DEBUG, @@ -3288,6 +3296,10 @@ return; } + evt->ed_event.led_publisher_node_id = nodeid; + evt->ed_event.led_nodeid = nodeid; + evt->ed_event.led_receive_time = evtpkt_recieve_time; + if (evt->ed_event.led_retention_time) { retain_event(evt); } @@ -3312,7 +3324,7 @@ /* * Receive a recovery network event message and save it in the retained list */ -static void evt_remote_recovery_evt(void *msg, unsigned int nodeid) +static void evt_remote_recovery_evt(const void *msg, unsigned int nodeid) { /* * - calculate remaining retention time @@ -3321,12 +3333,13 @@ * - Apply filters * - Deliver events that pass the filter test */ - struct lib_event_data *evtpkt = msg; + const struct lib_event_data *evtpkt = msg; struct event_svr_channel_instance *eci; struct event_data *evt; struct member_node_data *md; int num_delivered; mar_time_t now; + mar_time_t evtpkt_retention_time; now = clust_time_now(); @@ -3351,7 +3364,7 @@ /* * Calculate remaining retention time */ - evtpkt->led_retention_time = calc_retention_time( + evtpkt_retention_time = calc_retention_time( evtpkt->led_retention_time, evtpkt->led_receive_time, now); @@ -3410,6 +3423,8 @@ return; } + evt->ed_event.led_retention_time = evtpkt_retention_time; + retain_event(evt); num_delivered = try_deliver_event(evt, eci); log_printf(RECOVERY_EVENT_DEBUG, "Delivered to %d subscribers\n",
_______________________________________________ Openais mailing list Openais@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/openais