/****************************************************************************** * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; If not, see . */ #include "xc_private.h" /* Optionally flush file to disk and discard page cache */ void discard_file_cache(xc_interface *xch, int fd, int flush) { off_t cur = 0; int saved_errno = errno; if ( flush && (fsync(fd) < 0) ) { /*PERROR("Failed to flush file: %s", strerror(errno));*/ goto out; } /* * Calculate last page boundary of amount written so far * unless we are flushing in which case entire cache * is discarded. */ if ( !flush ) { if ( (cur = lseek(fd, 0, SEEK_CUR)) == (off_t)-1 ) cur = 0; cur &= ~(XC_PAGE_SIZE-1); } /* Discard from the buffer cache. */ if ( posix_fadvise64(fd, 0, cur, POSIX_FADV_DONTNEED) < 0 ) { /*PERROR("Failed to discard cache: %s", strerror(errno));*/ goto out; } out: errno = saved_errno; } void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) { int ret; void *ptr; ret = posix_memalign(&ptr, alignment, size); if (ret != 0 || !ptr) return NULL; return ptr; } int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) { int ret; privcmd_pcidev_get_gsi_t dev_gsi = { .sbdf = sbdf, .gsi = 0, }; ret = ioctl(xencall_fd(xch->xcall), IOCTL_PRIVCMD_PCIDEV_GET_GSI, &dev_gsi); if ( ret < 0 ) { if ( errno != ENOENT ) PERROR("Failed to get gsi for dev %04x:%02x:%02x.%u", sbdf >> 16, (sbdf >> 8) & 0xff, sbdf >> 3 & 0x1f, sbdf & 0x7); } else { ret = dev_gsi.gsi; } return ret; } /* * Local variables: * mode: C * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil * End: */